Mercurial > hg > bts-webui
changeset 143:88a3485999d4 draft
ajax: refactor add/remove code for different items
We have moved/refactored a huge ammount of code from tables.py and ajax.py into
ajax.py. The benefit has been much clearer code and less entry points for
actions.
This goes with the new toolbox code to land in the next commit.
author | diegoe-guest |
---|---|
date | Mon, 10 Aug 2009 23:41:54 +0000 |
parents | 62b1646f0ab8 |
children | c93c594f1f98 |
files | bts_webui/amancay/ajax.py bts_webui/amancay/tables.py bts_webui/amancay/templates/table.html bts_webui/amancay/urls.py |
diffstat | 4 files changed, 263 insertions(+), 325 deletions(-) [+] |
line wrap: on
line diff
--- a/bts_webui/amancay/ajax.py +++ b/bts_webui/amancay/ajax.py @@ -3,99 +3,173 @@ from amancay.bugs import handle_email +def _add_item(request, item_type, new_item): + """ + Add the given item to either the session or user set. + """ + item_set = '%s_set' % item_type + + if request.user.is_authenticated(): + item_set = getattr(request.user, item_set) + items = item_set.filter(**new_item) + + if items: + return False + else: + item_set.create(**new_item) + return True + else: + items = request.session.get(item_set, []) + new_item = item_record.values() + + if new_item in items: + return False + else: + items.append(item_value) + return True + +def _remove_item(request, item_type, remove_item): + """ + Remove the given item from either the session or user set. + """ + item_set = '%s_set' % item_type + + if request.user.is_authenticated(): + item_set = getattr(request.user, item_set) + items = item_set.filter(**remove_item) + + if items: + items[0].delete() + else: + items = request.session.get(item_set, []) + remove_values = remove_item.values() + + for item in items: + if item in remove_values: + items.remove(item) + +def _get_post_or_get(request, item): + item = request.GET.get(item, None) + + if not item: + item = request.POST.get(item, None) + + return item + def package_add(request): """ - Add a package to our session watched list. + Add a package to our watched list. """ - user = request.user - package_name = request.GET['id'] + item = _get_post_or_get(request, 'id') - if user.is_authenticated(): - packages = user.package_set.filter(package_name=package_name)[:1] - if not packages: - user.package_set.create(package_name=package_name) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + if _add_item(request, 'package', {'package_name': item}): + return HttpResponse(status=200) else: - packages = request.session.get('packages', []) - if package_name not in packages: - request.session.get('packages', []).append(package_name) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + return HttpResponse(status=500) def package_remove(request): """ Remove a package from the watched list. """ - user = request.user - package_name = request.GET['id'] + item = _get_post_or_get(request, 'id') - if user.is_authenticated(): - packages = user.package_set.filter(package_name=package_name)[:1] - if packages: - packages[0].delete() - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + if _remove_item(request, 'package', {'package_name': item}): + return HttpResponse(status=200) else: - packages = request.session.get('packages', []) - if package_name in packages: - request.session.get('packages', []).remove(package_name) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + return HttpResponse(status=500) def bug_add(request): """ - Add a bug to the session watched bugs. + Add a bug to our watched list. """ - user = request.user - bug_number = request.GET['id'] + item = _get_post_or_get(request, 'id') - if user.is_authenticated(): - bugs = user.bug_set.filter(number=bug_number)[:1] - if not bugs: - user.bug_set.create(number=bug_number) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + if _add_item(request, 'bug', {'number': item}): + return HttpResponse(status=200) else: - bugs = request.session.get('bugs', []) - if bug_number not in bugs: - request.session['bugs'].append(bug_number) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + return HttpResponse(status=500) def bug_remove(request): """ Remove a bug from the watched list. """ - user = request.user - bug_number = request.GET['id'] + item = _get_post_or_get(request, 'id') + + if _remove_item(request, 'bug', {'number': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) + +def maintainer_add(request): + """ + Add a maintainer to our watched list. + """ + item = _get_post_or_get(request, 'id') + + if _add_item(request, 'maintaineremail', {'address': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) + +def maintainer_remove(request): + """ + Remove a maintainer from our watched list. + """ + item = _get_post_or_get(request, 'id') + + if _remove_item(request, 'maintaineremail', {'address': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) + +def submitter_add(request): + """ + Add a submitter/user to our watched list. + """ + item = _get_post_or_get(request, 'id') - if user.is_authenticated(): - bugs = user.bug_set.filter(number=bug_number)[:1] - if bugs: - bugs[0].delete() - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + if _add_item(request, 'submitteremail', {'address': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) + +def submitter_remove(request): + """ + Remove a submitter/user from our watched list. + """ + item = _get_post_or_get(request, 'id') + + if _remove_item(request, 'submitteremail', {'address': item}): + return HttpResponse(status=200) else: - bugs = request.session.get('bugs', []) - if bug_number in bugs: - request.session['bugs'].remove(bug_number) - return HttpResponse(status=200) - else: - return HttpResponse(status=500) + return HttpResponse(status=500) + +def user_add(request): + """ + Add a submitter/user to our watched list. + """ + item = _get_post_or_get(request, 'id') + + if _add_item(request, 'useremail', {'address': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) + +def user_remove(request): + """ + Remove a submitter/user from our watched list. + """ + item = _get_post_or_get(request, 'id') + + if _remove_item(request, 'useremail', {'address': item}): + return HttpResponse(status=200) + else: + return HttpResponse(status=500) def _bug_toggle_subscribe(request, subscribe=True): """ - Toggle subscription to a specific bug report + Toggle subscription to a specific bug report. """ - user = request.user bug_number = request.GET['id'] if subscribe: @@ -103,7 +177,7 @@ else: action = 'unsubscribe' - if user.is_authenticated(): + if request.user.is_authenticated(): to_address = ['%s-%s@bugs.debian.org' % (bug_number, action)] # FIXME: this never tells us if the email left the building @@ -114,12 +188,12 @@ def bug_subscribe(request): """ - Subscribe to a specific bug report + Subscribe to a specific bug report. """ return _bug_toggle_subscribe(request, subscribe=True) def bug_unsubscribe(request): """ - Unsubscribe to a specific bug report + Unsubscribe to a specific bug report. """ return _bug_toggle_subscribe(request, subscribe=False)
--- a/bts_webui/amancay/tables.py +++ b/bts_webui/amancay/tables.py @@ -5,266 +5,123 @@ from django.utils import simplejson from amancay.btsqueries import SoapQueries -queries = SoapQueries() + +def _get_bug_list(request, view): + """ + Process the requested bug list corresponding to a given view. + """ + queries = SoapQueries() + bugs = bug_list = [] -# Bug renderer. -def render_bug_table(request, queries, title, bugs, amount, current_view): - if bugs: - bug_list = queries.get_bugs_status(bugs[:amount]) - bug_list.sort(key=lambda x: x.package) - else: - bug_list = None + if view == 'received_bugs': + if request.user.is_authenticated(): + user_emails = [e.address for e in request.user.useremail_set.all()] + else: + user_emails = request.session.get('maintaineremail_set') + + bugs = queries.get_tagged_bugs(user_emails) - if request.user.is_authenticated(): - fav_packages = [p.package_name for p in request.user.package_set.all()] + elif view == 'submitted_bugs': + if request.user.is_authenticated(): + submitter_emails = [e.address for e in request.user.submitteremail_set.all()] + else: + submitter_emails = request.session.get('submitteremail_set') - for bug in bug_list: - if bug.package in fav_packages: - bug.pkg_fav = True - else: - bug.pkg_fav = False + bugs = queries.get_submitters_bugs(submitter_emails) - if request.GET.has_key('xhr'): - # We only need to list the data. - return HttpResponse(simplejson.dumps(bug_list), - mimetype='application/javascript') - elif request.path.find("table") != -1: - # We only need to render the table - return render_to_response('table.html', - {'bug_list': bug_list, - 'table_title': title, - 'current_view': current_view}, - context_instance=RequestContext(request)) - else: - return render_to_response('index.html', - {'bug_list': bug_list, - 'table_title': title, - 'current_view': current_view}, - context_instance=RequestContext(request)) + elif view == 'selected_bugs': + if request.user.is_authenticated(): + bugs = [b.number for b in request.user.bug_set.all()] + else: + bugs = request.session.get('bug_set') + + elif view == 'package_bugs': + if request.user.is_authenticated(): + package_list = [p.package_name for p in request.user.package_set.all()] + else: + package_list = request.session.get('package_set') + + bugs = queries.get_packages_bugs(package_list) -# Bug views -def submitted_bugs(request): - process_post(request) - user = request.user - bugs = [] - if (user.is_authenticated()): - emails = user.submitteremail_set.all() - submitter_emails = [ str(e) for e in emails] - else: - submitter_emails = request.session.get('submitter_emails') - if (submitter_emails): - bugs = queries.get_submitters_bugs(submitter_emails) - bugs.sort(reverse=True) - return render_bug_table(request, queries, "Latest submitted bugs", - bugs, 15, "submitted_bugs") + elif view == 'tagged_bugs': + if request.user.is_authenticated(): + user_emails = [e.address for e in request.user.useremail_set.all()] + else: + user_emails = request.session.get('useremail_set') + + bugs = queries.get_tagged_bugs(user_emails) + + if bugs: + bug_list = queries.get_bugs_status(bugs[:15]) + bug_list.sort(key=lambda x: x.package) + + return bug_list def received_bugs(request): - process_post(request) - user = request.user - bugs = [] - if (user.is_authenticated()): - emails = user.maintaineremail_set.all() - maintainer_emails = [str(e) for e in emails] - else: - maintainer_emails = request.session.get('maintainer_emails') - if (maintainer_emails): - bugs = queries.get_maintainers_bugs(maintainer_emails) - bugs.sort(reverse=True) - return render_bug_table(request, queries, "Latest received bugs", bugs, - 15, "received_bugs") - -def package_bugs(request): - process_post(request) - user = request.user - bugs = [] + """ + Render a table view for bugs we have received as maintainers. + """ + bug_list = _get_bug_list(request, 'received_bugs') + + return render_to_response('table.html', + {'title': 'Latest received bugs', + 'bug_list': bug_list, + 'current_view': 'received_bugs'}, + context_instance=RequestContext(request)) - if user.is_authenticated(): - package_list = request.user.package_set.all() - package_list = [p.package_name for p in package_list] - else: - package_list = request.session.get('packages') +def submitted_bugs(request): + """ + Render a table view for bugs we have submitted ourselves. + """ + bug_list = _get_bug_list(request, 'submitted_bugs') - if package_list: - bugs = queries.get_packages_bugs(package_list) - bugs.sort(reverse=True) - return render_bug_table(request, queries, "Latest bugs on selected packages", bugs, 15, "package_bugs") + return render_to_response('table.html', + {'title': 'Latest submitted bugs', + 'bug_list': bug_list, + 'current_view': 'submitted_bugs'}, + context_instance=RequestContext(request)) def selected_bugs(request): - process_post(request) - user = request.user - if (user.is_authenticated()): - bugs = [b.number for b in request.user.bug_set.all()] - else: - bugs = request.session.get('bugs') - if (bugs != None): - bugs.sort(reverse=True) - return render_bug_table(request, queries, "Latest selected bugs", bugs, - 15, "selected_bugs") + """ + Render a table view for bugs we are watching. + """ + bug_list = _get_bug_list(request, 'selected_bugs') + + return render_to_response('table.html', + {'title': 'Latest selected bugs', + 'bug_list': bug_list, + 'current_view': 'selected_bugs'}, + context_instance=RequestContext(request)) + +def package_bugs(request): + """ + Render a table view for our watched packages. + """ + package_list = [p.package_name for p in request.user.package_set.all()] + bug_list = _get_bug_list(request, 'package_bugs') + + for bug in bug_list: + if bug.package in package_list: + bug.pkg_fav = True + else: + bug.pkg_fav = False + + return render_to_response('table.html', + {'title': 'Latest bugs on selected packages', + 'bug_list': bug_list, + 'current_view': 'package_bugs'}, + context_instance=RequestContext(request)) def tagged_bugs(request): - process_post(request) - user = request.user - if (user.is_authenticated()): - emails = user.useremail_set.all() - user_emails = [ str(e) for e in emails] - else: - user_emails = request.session.get('user_emails') - bugs = {} - if (user_emails): - bugs = queries.get_tagged_bugs(user_emails) - print bugs - # bugs.sort(reverse=True) + """ + Render a table view for bugs we have tagged. + """ + bug_list = _get_bug_list(request, 'tagged_bugs') + # TODO: fix this, bugs is a dict where every value is a dict of tags and # bugs associated to one mail - bugs = [] - return render_bug_table(request, queries, "Latest received bugs", bugs, - 15, "received_bugs") - - -# Simple method that just calls the appropiate function. -def process_post(request): - if request.POST: - # Packages - if (request.POST.has_key('package')): - return add_package(request) - elif (request.POST.has_key('package_select')): - return remove_packages(request) - # Bugs - elif (request.POST.has_key('bug')): - return add_bug(request) - elif (request.POST.has_key('bug_select')): - return remove_bugs(request) - # Submitter Emails - elif (request.POST.has_key('submitter_email')): - return add_submitter_email(request) - elif (request.POST.has_key('submitter_email_select')): - return remove_submitter_emails(request) - # Maintainer Emails - elif (request.POST.has_key('maintainer_email')): - return add_maintainer_email(request) - elif (request.POST.has_key('maintainer_email_select')): - return remove_maintainer_emails(request) - # User Emails - elif (request.POST.has_key('user_email')): - return add_user_email(request) - elif (request.POST.has_key('user_email_select')): - return remove_user_emails(request) - return [] - -# Data processing -def add_item(request, item_set, item_record, session_name): - if (item_set != None): - items = item_set.filter(**item_record) - if (len(items) == 0): - item_set.create(**item_record) - return [ str(i) for i in item_set.all() ] - else: - items = request.session.get(session_name) - if (items == None): - items = request.session[session_name] = [] - item_value = item_record.values()[0] - for item in items: - if (item == item_value): - return items - items.append(item_value) - return items - -def add_package(request): - user = request.user - package_name = request.POST['package'] - item_set = None - if (user.is_authenticated()): - item_set = user.package_set - return add_item(request, item_set, {"package_name":package_name},"packages") - -def add_bug(request): - user = request.user - bug_number = request.POST['bug'] - item_set = None - if (user.is_authenticated()): - item_set = user.bug_set - return add_item(request, item_set, {"number":bug_number}, "bugs") - -def add_submitter_email(request): - user = request.user - email = request.POST['submitter_email'] - item_set = None - if (user.is_authenticated()): - item_set = user.submitteremail_set - return add_item(request, item_set, {"address":email}, "submitter_emails") - -def add_maintainer_email(request): - user = request.user - email = request.POST['maintainer_email'] - item_set = None - if (user.is_authenticated()): - item_set = user.maintaineremail_set - return add_item(request, item_set, {"address":email}, "maintainer_emails") - -def add_user_email(request): - user = request.user - email = request.POST['user_email'] - item_set = None - if (user.is_authenticated()): - item_set = user.useremail_set - return add_item(request, item_set, {"address":email}, "user_emails") - -def remove_items(request, selected_items, item_set, item_field, session_name): - if (item_set != None): - for item in selected_items: - items = item_set.filter(**{item_field:item}) - if (len(items) != 0): - items[0].delete() - return [ str(i) for i in item_set.all()] - else: - items = request.session.get(session_name) - if (items == None): - items = request.session[session_name] = [] - else: - for sel_item in selected_items: - for item in items: - if (item == sel_item): - items.remove(sel_item) - return items - - -def remove_packages(request): - user = request.user - selected = request.POST.getlist("package_select") - item_set = None - if (user.is_authenticated()): - item_set = user.package_set - return remove_items(request, selected, item_set, "package_name","packages") - -def remove_bugs(request): - user = request.user - selected = request.POST.getlist("bug_select") - item_set = None - if (user.is_authenticated()): - item_set = user.bug_set - return remove_items(request, selected, item_set, "number","bugs") - -def remove_submitter_emails(request): - user = request.user - selected = request.POST.getlist("submitter_email_select") - item_set = None - if (user.is_authenticated()): - item_set = user.submitteremail_set - return remove_items(request, selected, item_set, "address","submitter_emails") - -def remove_maintainer_emails(request): - user = request.user - selected = request.POST.getlist("maintainer_email_select") - item_set = None - if (user.is_authenticated()): - item_set = user.maintaineremail_set - return remove_items(request, selected, item_set, "address","maintainer_emails") - -def remove_user_emails(request): - user = request.user - selected = request.POST.getlist("user_email_select") - item_set = None - if (user.is_authenticated()): - item_set = user.useremail_set - return remove_items(request, selected, item_set, "address","user_emails") - + return render_to_response('table.html', + {'title': 'Latest received bugs', + 'bug_list': bug_list, + 'current_view': 'tagged_bugs'}, + context_instance=RequestContext(request))
--- a/bts_webui/amancay/templates/table.html +++ b/bts_webui/amancay/templates/table.html @@ -1,5 +1,8 @@ +{% extends "base.html" %} {% comment %} vim: set sw=4 ts=4 sts=4 noet: {% endcomment %} -{% block extrajs %} +{% load template_filters %} + +{% block main_content %} <script type="text/javascript" language="javascript" charset="utf-8"> function toggle_star_cb(img, newimg, xml) { img.src = newimg; @@ -20,15 +23,13 @@ url += 'add/'; } - res = MochiKit.Async.doSimpleXMLHttpRequest(url, {'id': id}); + var res = MochiKit.Async.doSimpleXMLHttpRequest(url, {'id': id}); res.addCallback(toggle_star_cb, img, newimg); } </script> -{% endblock %} -{% load template_filters %} <input id="current_view" type="hidden" value="{{ current_view }}" /> {% if bug_list %} -<span class="table_title">{{ table_title }}</span> +<span class="table_title">{{ title }}</span> <div class="pager"> {% if pages %} <span class="page_numbers">Pages: @@ -96,3 +97,4 @@ {% endfor %} </table> {% endif %} +{% endblock %}
--- a/bts_webui/amancay/urls.py +++ b/bts_webui/amancay/urls.py @@ -5,9 +5,6 @@ (r'^$', 'amancay.views.index',), (r'^index', 'amancay.views.index',), - # Toolboxes - (r'toolbox', 'amancay.toolbox.render_toolbox',), - # Bug pages (r'^package_bugs', 'amancay.tables.package_bugs',), (r'^received_bugs', 'amancay.tables.received_bugs',), @@ -23,11 +20,19 @@ # Small pieces (r'^ajax/package/add/', 'amancay.ajax.package_add',), + (r'^ajax/bug/add/', 'amancay.ajax.bug_add',), + (r'^ajax/maintainer/add/', 'amancay.ajax.maintainer_add',), + (r'^ajax/submitter/add/', 'amancay.ajax.submitter_add',), + (r'^ajax/user/add/', 'amancay.ajax.user_add',), + (r'^ajax/package/remove/', 'amancay.ajax.package_remove',), + (r'^ajax/bug/remove/', 'amancay.ajax.bug_remove',), + (r'^ajax/maintainer/remove/', 'amancay.ajax.maintainer_remove',), + (r'^ajax/submitter/remove/', 'amancay.ajax.submitter_remove',), + (r'^ajax/user/remove/', 'amancay.ajax.user_remove',), + (r'^ajax/bug/subscribe/', 'amancay.ajax.bug_subscribe',), (r'^ajax/bug/unsubscribe/', 'amancay.ajax.bug_unsubscribe',), - (r'^ajax/bug/add/', 'amancay.ajax.bug_add',), - (r'^ajax/bug/remove/', 'amancay.ajax.bug_remove',), # Account Settings # (r'^account_settings', 'amancay.views.account_settings',),