changeset 134:c6bf9f23af62 draft

starring: implement bug add/remove works exactly like package add/remove, needs polishing to reuse javascript functions that packages are also using.
author diegoe-guest
date Mon, 10 Aug 2009 23:40:27 +0000
parents a187a0e79003
children 537aa92d7179
files bts_webui/amancay/TODO bts_webui/amancay/ajax.py bts_webui/amancay/bugs.py bts_webui/amancay/static/amancay.css bts_webui/amancay/templates/bug.html bts_webui/amancay/urls.py
diffstat 6 files changed, 89 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/bts_webui/amancay/TODO
+++ b/bts_webui/amancay/TODO
@@ -44,11 +44,3 @@
 - Clone
 - Change submitter
 - Forwarded / Unforwarded
-+ Change owner
-+ Subscribe
-- ReportSpam
-
-Interface Actions
------------------
-- Add bug to selected bugs
-- Add package to selected packages
--- a/bts_webui/amancay/ajax.py
+++ b/bts_webui/amancay/ajax.py
@@ -2,7 +2,7 @@
 from django.http import HttpResponse
 from amancay.bugs import handle_email
 
-def add_package(request):
+def package_add(request):
 	"""
 	Add a package to our session watched list.
 	"""
@@ -24,7 +24,7 @@
 			request.session['packages'].append(package_name)
 			return HttpResponse(status=200)
 
-def remove_package(request):
+def package_remove(request):
 	"""
 	Remove a package from the watched list.
 	"""
@@ -46,6 +46,50 @@
 		else:
 			return HttpResponse(status=500)
 
+def bug_add(request):
+	"""
+	Add a bug to the session watched bugs.
+	"""
+	user = request.user
+	bug_number = request.GET['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)
+	else:
+		bugs = request.session.get('bugs', [])
+		if bug_number in bugs:
+			return HttpResponse(status=500)
+		else:
+			request.session['bugs'].append(bug_number)
+			return HttpResponse(status=200)
+
+def bug_remove(request):
+	"""
+	Remove a bug from the watched list.
+	"""
+	user = request.user
+	bug_number = request.GET['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)
+	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)
+
 def _bug_toggle_subscribe(request, subscribe=True):
 	"""
 	Toggle subscription to a specific bug report
--- a/bts_webui/amancay/bugs.py
+++ b/bts_webui/amancay/bugs.py
@@ -44,6 +44,8 @@
 	bug_status = queries.get_bugs_status(bug_number)[0]
 	bug_originator = email.Utils.parseaddr(bug_status['originator'])
 	bug_log = queries.get_bug_log(bug_number)
+	# having as a selected bug is not the same as subscribing
+	bug_is_fav = bool(user.bug_set.filter(number=bug_number)[:1])
 
 	# Regular expressions to parse the mails
 	from_re = re.compile('^From: ?(.+)$', re.MULTILINE)
@@ -100,6 +102,7 @@
 							   'bug_originator': bug_originator,
 							   'bug_status': bug_status,
 							   'bug_messages': bug_messages,
+							   'bug_is_fav': bug_is_fav,
 							   'current_user': user}
 							 )
 
--- a/bts_webui/amancay/static/amancay.css
+++ b/bts_webui/amancay/static/amancay.css
@@ -193,7 +193,7 @@
 	float: left;
 }
 .bug .bug_number a {
-	font-size: smaller;
+	font-size: small;
 	text-decoration: none;
 	border-bottom: 1px dotted blue;
 }
@@ -418,8 +418,13 @@
 	border-bottom: 1px dotted white;
 	text-decoration: none;
 }
+.favorite_icon {
+	text-decoration: none;
+	border: 0 !important;
+}
 .favorite_icon img {
     border: 0;
+    vertical-align: middle;
 }
 .action img {
 	border: 0;
--- a/bts_webui/amancay/templates/bug.html
+++ b/bts_webui/amancay/templates/bug.html
@@ -31,13 +31,42 @@
 	res = MochiKit.Async.doSimpleXMLHttpRequest(url, {'id': id});
 	res.addCallback(toggle_subscribe_cb, img, newimg, txt, newtxt);
 }
+function toggle_star_cb(img, newimg, xml) {
+	img.src = newimg;
+}
+function toggle_star(id) {
+	var url = '/ajax/bug/';
+	var img = document.getElementById(id + '_star');
+	var newimg = '';
+
+	if (MochiKit.Text.endsWith('star_on.png', img.src))
+	{
+		newimg = '/static/icons/star_off.png';
+		url += 'remove/';
+	}
+	else
+	{
+		newimg = '/static/icons/star_on.png';
+		url += 'add/';
+	}
+
+	res = MochiKit.Async.doSimpleXMLHttpRequest(url, {'id': id});
+	res.addCallback(toggle_star_cb, img, newimg);
+}
 </script>
 {% endblock %}
 
 {% block main_content %}
 <div class="bug">
 	<div class="bug_information">
-		<span class="bug_number"><a href="/bug/{{ bug_number }}">bug #{{ bug_number }}</a></span>
+		<span class="bug_number">
+		<a href="javascript:toggle_star('{{ bug_number }}')" class="favorite_icon">
+		{% if bug_is_fav %}
+			<img id="{{ bug_number }}_star" src="/static/icons/star_on.png" />
+		{% else %}
+			<img id="{{ bug_number }}_star" src="/static/icons/star_off.png" />
+		{% endif %}
+		</a> <a href="/bug/{{ bug_number }}">bug #{{ bug_number }}</a></span>
 		<span class="bug_modified">Last modified <span class="modified">{{ bug_status.log_modified|tstodatetime|timesince }}</span> ago ({{ bug_status.log_modified|tstodate }})
 	</div>
 	<div class="bug_title">{{ bug_status.subject|escape }} <span class="bug_severity">((icon){{ bug_status.severity }})</span></div>
--- a/bts_webui/amancay/urls.py
+++ b/bts_webui/amancay/urls.py
@@ -22,10 +22,12 @@
 	(r'^package/(?P<package_name>\w+)', 'bts_webui.amancay.views.package',),
 
 	# Small pieces
-	(r'^ajax/package/add/', 'bts_webui.amancay.ajax.add_package',),
-	(r'^ajax/package/remove/', 'bts_webui.amancay.ajax.remove_package',),
+	(r'^ajax/package/add/', 'bts_webui.amancay.ajax.package_add',),
+	(r'^ajax/package/remove/', 'bts_webui.amancay.ajax.package_remove',),
 	(r'^ajax/bug/subscribe/', 'bts_webui.amancay.ajax.bug_subscribe',),
 	(r'^ajax/bug/unsubscribe/', 'bts_webui.amancay.ajax.bug_unsubscribe',),
+	(r'^ajax/bug/add/', 'bts_webui.amancay.ajax.bug_add',),
+	(r'^ajax/bug/remove/', 'bts_webui.amancay.ajax.bug_remove',),
 
 	# Account Settings
 	#   (r'^account_settings', 'bts_webui.amancay.views.account_settings',),