Mercurial > hg > bts-webui
changeset 144:c93c594f1f98 draft
toolbox: convert the toolbox into a template tag
This is a *huge* improvement to how the code is organized right now.
Specifically this gives us complete control over how stuff is loaded from the
sidebar and makes more evident which are the paths taken by the code to
actually do stuff. A concrete example is how loading of links happen.
amancay_interface.js has been disabled to implement/move its functionality to
other places.
author | diegoe-guest |
---|---|
date | Mon, 10 Aug 2009 23:42:03 +0000 |
parents | 88a3485999d4 |
children | ddeb2ac3d828 |
files | bts_webui/amancay/static/amancay_interface.js bts_webui/amancay/templates/base.html bts_webui/amancay/templates/toolbox.html bts_webui/amancay/templatetags/bug_tags.py bts_webui/amancay/templatetags/toolbox.py bts_webui/amancay/toolbox.py |
diffstat | 6 files changed, 141 insertions(+), 268 deletions(-) [+] |
line wrap: on
line diff
--- a/bts_webui/amancay/static/amancay_interface.js +++ b/bts_webui/amancay/static/amancay_interface.js @@ -1,7 +1,6 @@ - function reload_current_view(evt) { var view = document.getElementById("current_view").value; - load_bugs(evt,"/"+view+"_table/"); + load_bugs(evt,"/" + view + "_table/"); } var items_changed = function(request) { @@ -37,33 +36,6 @@ reload_current_view(); } -var item_remove_failed = function (err) { - alert("The item/s could not be removed"); - alert(err); -}; - -var item_add_failed = function (err) { - alert("The item could not be added"); - alert(err); -}; - -var send_item_add = function (ev) { - ev.preventDefault(); - var content = queryString([document.getElementById("item").name], - [document.getElementById("item").value]); - var d = doXHR("/index/?xhr=1", {"method": "post", "sendContent": content}); - d.addCallbacks(items_changed, item_add_failed); - document.getElementById("item").value = ""; -} - -var send_item_selected = function (ev) { - ev.preventDefault(); - item_name = document.getElementById("item").name+"_select"; - table = document.getElementById("item_list"); - var content = queryString(table); - var d = doXHR("/index/?xhr=1", {"method": "post", "sendContent": content}); - d.addCallbacks(items_changed, item_remove_failed); -} function loading_bugs() { new_span = SPAN({'class': 'loading'}, "Loading..."); @@ -107,23 +79,6 @@ replaceChildNodes(document.getElementById("search_results"), new_span); loading_finished(); } -var got_toolbox = function(request) { - place = document.getElementById("toolbox"); - if (strip(request.responseText) != "") { - new_div = DIV(); - new_div.innerHTML = request.responseText; - replaceChildNodes(place, new_div); - toolboxConnect(); - } - else { - new_span = SPAN({'class': 'error'}, "No toolbox"); - replaceChildNodes(place, new_span); - } -} -var failed_toolbox = function(request) { - new_span = SPAN({'class': 'error'}, "ERROR: Unable to load toolbox"); - replaceChildNodes(document.getElementById("toolbox"), new_span); -} function load_bugs(evt, url) { loading_bugs(); @@ -138,44 +93,6 @@ d.addCallbacks(got_search_results, failed_search_results); evt.preventDefault(); } -function load_toolbox(url) { - var d = doXHR(url); - d.addCallbacks(got_toolbox, failed_toolbox); -} - -function get_submitted_bugs(evt) { - load_toolbox("/submitted_bugs_toolbox/"); - load_bugs(evt,"/submitted_bugs_table/"); -} -function get_received_bugs(evt) { - load_toolbox("/received_bugs_toolbox/"); - load_bugs(evt,"/received_bugs_table/"); -} -function get_package_bugs(evt) { - load_toolbox("/package_bugs_toolbox/"); - load_bugs(evt,"/package_bugs_table/"); -} -function get_selected_bugs(evt) { - load_toolbox("/selected_bugs_toolbox/"); - load_bugs(evt,"/selected_bugs_table/"); -} -function get_tagged_bugs(evt) { - load_toolbox("/tagged_bugs_toolbox/"); - load_bugs(evt,"/tagged_bugs_table/"); -} -/*function get_search_form(evt) { - load_toolbox("/search_form_toolbox/"); - load_bugs(evt,"/search_form/"); -}*/ - -function toolboxConnect() { - var item_add = document.getElementById("add_item"); - if (item_add) - MochiKit.Signal.connect( item_add, 'onsubmit', send_item_add ); - var item_selection = document.getElementById("item_selection"); - if (item_selection) - MochiKit.Signal.connect( item_selection, 'onsubmit', send_item_selected ); -} function send_page(evt) { url = (evt.src() + "").replace(/search/, "search_table"); @@ -195,7 +112,6 @@ function myLoadFunction() { - toolboxConnect(); pagerConnect(); if (buglogConnect) @@ -224,4 +140,4 @@ } /*connect our event handlers right off*/ -MochiKit.Signal.connect(window, "onload", myLoadFunction); +MochiKit.DOM.addLoadEvent(myLoadFunction);
--- a/bts_webui/amancay/templates/base.html +++ b/bts_webui/amancay/templates/base.html @@ -1,3 +1,4 @@ +{% comment %} vim: set sw=4 ts=4 sts=4 noet: {% endcomment %} <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -7,7 +8,6 @@ <link rel="icon" type="image/png" href="/static/icon.png"/> <link rel="stylesheet" type="text/css" href="/static/amancay.css"/> <script type="text/javascript" src="/static/MochiKit/MochiKit.js"></script> - <script type="text/javascript" src="/static/amancay_interface.js"></script> {% block extrajs %} {% endblock %} <script type="text/javascript" language="javascript" charset="utf-8"> function dismiss_notification() { @@ -63,7 +63,10 @@ {% block sidebar %} {% endblock %} <div id="toolbox" class="toolbox"> - {% block toolbox %}{% endblock %} + {% block toolbox %} + {% load toolbox %} + {% toolbox_widget %} + {% endblock %} </div> <!-- Column 2 end --> </div>
--- a/bts_webui/amancay/templates/toolbox.html +++ b/bts_webui/amancay/templates/toolbox.html @@ -1,34 +1,56 @@ +{% comment %} vim: set sw=4 ts=4 sts=4 noet: {% endcomment %} +<script type="text/javascript" language="javascript" charset="utf-8"> +function toolbox_add_form_failed_cb(error) { + /* toolbox_add_form_failed_cb: + * Catches failure of the AJAX request made in toolbox_add_form_cb(). + */ + alert('The item could not be added'); + alert(error); +}; + +var toolbox_add_form_cb = function (event) { + /* toolbox_add_form_cb: + * Prevents form post and instead create an AJAX request to add items to the + * toolbar. + */ + var url = '/ajax/{{ toolbox.item_type }}/add/'; + + event.preventDefault(); + + var item_name = MochiKit.DOM.getElement('toolbox_add_item').value; + var res = MochiKit.Async.doSimpleXMLHttpRequest(url, {'id': item_name}); + res.addErrback(toolbox_add_form_failed_cb); +} + +function toolbox_connect() { + /* toolbox_connect: + * Connect the onsubmit event of the toolbox form to our custom callback + */ + var form = MochiKit.DOM.getElement('toolbox_add_form'); + if (form) + MochiKit.Signal.connect(form, 'onsubmit', toolbox_add_form_cb); +} + +MochiKit.DOM.addLoadEvent(toolbox_connect); +</script> + <h3 class="toolbox_title">{{ toolbox.title }}</h3> + <div class="toolbox_itemlist"> -<form id="item_selection" method="post" action="."> -{% if toolbox.item_list %} -<table id="item_list"> - {% for item in toolbox.item_list %} - <tr> - <td class="item_select"> - <input type="checkbox" name="{{ toolbox.item_type }}_select" - id="item_select" value="{{ item }}" /> - </td> - <td class="item_name">{{ item }}</td> - </tr> - {% endfor %} -</table> -<div class="toolbox_remove"> - <input class="toolbox_remove" type="submit" value="Remove" /> + {% if toolbox.item_list %} + {% for item in toolbox.item_list %} + <span class="toolbox_item"> + {{ item }} <a href="/ajax/{{ toolbox.item_type }}/remove/?id={{ item }}">[x] remove</a> + </span><br/> + {% endfor %} + {% else %} + <div class="toolbox_message">No items selected</div> + {% endif %} </div> -{% else %} - <div class="toolbox_message">No items selected</div> -{% endif %} -</form> + +<div> + <form id="toolbox_add_form" method="GET" action="."> + <input class="toolbox_txt" id="toolbox_add_item" type="text" /> + <input class="toolbox_add" id="toolbox_add_submit" type="submit" value="Add" /> + </form> </div> -<div class="toolbox_add_item"> -<form id="add_item" method="post" action="."> - <div class="toolbox_txt"> - <input class="toolbox_txt" type="text" name="{{ toolbox.item_type }}" - id="item" value="" /> - </div> - <div class="toolbox_add"> - <input class="toolbox_add" id="toolbox_add" type="submit" value="Add" /> - </div> -</form> -</div>
--- a/bts_webui/amancay/templatetags/bug_tags.py +++ b/bts_webui/amancay/templatetags/bug_tags.py @@ -11,7 +11,6 @@ """ Render tags checkboxes for the current bug. """ - bug = context.get('bug_status') if bug is None: return None
new file mode 100644 --- /dev/null +++ b/bts_webui/amancay/templatetags/toolbox.py @@ -0,0 +1,79 @@ +# vim: set sw=4 ts=4 sts=4 noet: +from django import template + +register = template.Library() + +def toolbox_widget(context): + """ + Render the toolbox widget. + """ + toolbox = {} + title = item_type = item_list = None + + request = context.get('request', None) + + # Fill the info according to the type of toolbox needed + if request.path.find('submitted_bugs') != -1: + title = 'Submitter emails' + item_type = 'submitter' + + if request.user.is_authenticated(): + email_list = request.user.submitteremail_set.all() + item_list = [e.address for e in email_list] + else: + item_list = request.session.get('submitteremail_set') + + # Received bugs + elif request.path.find('received_bugs') != -1: + title = 'Maintainer emails' + item_type = 'maintainer' + + if request.user.is_authenticated(): + email_list = request.user.maintaineremail_set.all() + item_list = [e.address for e in email_list] + else: + item_list = request.session.get('maintaineremail_set') + + # Selected Packages + elif request.path.find('package_bugs') != -1: + title = 'Selected Packages' + item_type = 'package' + + if request.user.is_authenticated(): + package_list = request.user.package_set.all() + item_list = [p.package_name for p in package_list] + else: + item_list = request.session.get('package_set') + + # Selected bugs + elif request.path.find('selected_bugs') != -1: + title = 'Selected Bugs' + item_type = 'bug' + + if request.user.is_authenticated(): + bug_list = request.user.bug_set.all() + item_list = [b.number for b in bug_list] + else: + item_list = request.session.get('bug_set') + + # Tagged bugs + elif request.path.find('tagged_bugs') != -1: + title = 'User emails' + item_type = 'user' + + if request.user.is_authenticated(): + email_list = request.user.useremail_set.all() + item_list = [e.address for e in email_list] + else: + item_list = request.session.get('useremail_set') + + toolbox['title'] = title + toolbox['item_type'] = item_type + toolbox['item_list'] = item_list + + return { + 'toolbox': toolbox, + } + +register.inclusion_tag('toolbox.html', + takes_context=True)(toolbox_widget)
--- a/bts_webui/amancay/toolbox.py +++ b/bts_webui/amancay/toolbox.py @@ -3,152 +3,6 @@ from django.shortcuts import render_to_response from django.utils import simplejson -def render_toolbox(request): - toolbox = get_toolbox(request) - return render_to_response('toolbox.html', {'toolbox': toolbox}) - -# FIXME: -# FIXME: -# FIXME: room for improvement. -def get_toolbox(request): - # Initialization - user = request.user - toolbox = {} - - # Fill the info according to the type of toolbox needed - if request.path.find('submitted_bugs') != -1: - toolbox['title'] = 'Submitter emails' - toolbox['item_type'] = 'submitter_email' - - if user.is_authenticated(): - email_list = request.user.submitteremail_set.all() - toolbox['item_list'] = [e.address for e in email_list] - else: - toolbox['item_list'] = request.session.get('submitter_emails') - - # Received bugs - elif request.path.find('received_bugs') != -1: - toolbox['title'] = 'Maintainer emails' - toolbox['item_type'] = 'maintainer_email' - if user.is_authenticated(): - email_list = request.user.maintaineremail_set.all() - toolbox['item_list'] = [e.address for e in email_list] - else: - toolbox['item_list'] = request.session.get('maintainer_emails') - - # Selected Packages - elif request.path.find('package_bugs') != -1: - toolbox['title'] = 'Selected Packages' - toolbox['item_type'] = 'package' - - if user.is_authenticated(): - package_list = request.user.package_set.all() - toolbox['item_list'] = [p.package_name for p in package_list] - else: - toolbox['item_list'] = request.session.get('packages') - - # Selected bugs - elif request.path.find('selected_bugs') != -1: - toolbox['title'] = 'Selected Bugs' - toolbox['item_type'] = 'bug' - - if user.is_authenticated(): - bug_list = request.user.bug_set.all() - toolbox['item_list'] = [b.number for b in bug_list] - else: - toolbox['item_list'] = request.session.get('bugs') - - # Tagged bugs - elif request.path.find('tagged_bugs') != -1: - toolbox['title'] = 'User emails' - toolbox['item_type'] = 'user_email' - - if user.is_authenticated(): - email_list = request.user.useremail_set.all() - toolbox['item_list'] = [e.address for e in email_list] - else: - toolbox['item_list'] = request.session.get('user_emails') - - # Done - return toolbox - -# FIXME: -# FIXME: -# FIXME: -# FIXME: -# FIXME: -# All this functions perhaps could be abstracted as a "Queue" class or -# something. -def add_package(request): - """ - Add a package to our session watched list. - """ - user = request.user - package_name = request.POST['package_name'] - if user.is_authenticated(): - packages = user.package_set.filter(package_name=package_name) - if not packages: - user.package_set.create(package_name=package_name) - else: - packages = request.session.get('packages', []) - for package in packages: - if package == package_name: - return - request.session['packages'].append(package_name) - -def remove_packages(request): - """ - Remove a package from the watched list. - """ - user = request.user - package_selected = request.POST.getlist('package_select') - if user.is_authenticated(): - for package_name in package_selected: - packages = user.package_set.filter(package_name=package_name) - if packages: - packages[0].delete() - else: - packages = request.session.get('packages', []) - for package_name in package_selected: - for package in packages: - if (package == package_name): - request.session['packages'].remove(package_name) - -def add_bug(request): - """ - Add a bug to the session watched bugs. - """ - user = request.user - bug_number = request.POST['bug_number'] - if user.is_authenticated(): - bugs = user.bug_set.filter(number=bug_number) - if bugs: - user.bug_set.create(number=bug_number) - else: - bugs = request.session.get('bugs', []) - for bug in bugs: - if bug == bug_number: - return - request.session['bugs'].append(bug_number) - -def remove_bugs(request): - """ - Remove the selected bugs from the session bug list. - """ - user = request.user - bug_selected = request.POST.getlist('bug_select') - if user.is_authenticated(): - for number in bug_selected: - bugs = user.bug_set.filter(number=number) - if bugs: - bugs[0].delete() - else: - bugs = request.session.get('bugs', []) - for bug_number in bug_selected: - for bug in bugs: - if bug == bug_number: - request.session['bugs'].remove(bug_number) - # Package page def package(request, package_name): """ @@ -165,11 +19,11 @@ if request.GET.has_key('xhr'): return HttpResponse(simplejson.dumps({'package': package_name, 'bug_list': bug_list}), - mimetype='application/javascript' ) + mimetype='application/javascript') else: return render_to_response('package.html', {'package': package_name, 'bug_list': bug_list, - 'current_user': user} - ) + 'current_user': user}, + context_instance=RequestContext(request))