summaryrefslogtreecommitdiff
path: root/pgcommitfest/commitfest/views.py
diff options
context:
space:
mode:
authorMagnus Hagander2016-02-12 17:03:26 +0000
committerMagnus Hagander2016-02-12 17:03:26 +0000
commit986048a270afd56ef4f504d8e417d81f28970362 (patch)
treeddd42a69157676e6caf311f1ed133ac30ae3011e /pgcommitfest/commitfest/views.py
parent6dec4d85a2eb96a5cbf502f282e9087c9f9081a5 (diff)
Implement notifications
This makes it possible to receive notifications (via email) when a patch has been updated. It's possible to subscribe to notifications on a specific patch. It is also possible to set the user profile up so that one receives notifications for all patches where one is author, reviewer or committer on. Notifications are, of course, only sent when other people make modifications to the entry.
Diffstat (limited to 'pgcommitfest/commitfest/views.py')
-rw-r--r--pgcommitfest/commitfest/views.py42
1 files changed, 33 insertions, 9 deletions
diff --git a/pgcommitfest/commitfest/views.py b/pgcommitfest/commitfest/views.py
index b4f19b2..ddd62c9 100644
--- a/pgcommitfest/commitfest/views.py
+++ b/pgcommitfest/commitfest/views.py
@@ -209,10 +209,12 @@ def patch(request, cfid, patchid):
is_committer = is_this_committer = False
is_reviewer = request.user in patch.reviewers.all()
+ is_subscribed = patch.subscribers.filter(id=request.user.id).exists()
else:
is_committer = False
is_this_committer = False
is_reviewer = False
+ is_subscribed = False
return render_to_response('patch.html', {
'cf': cf,
@@ -221,6 +223,7 @@ def patch(request, cfid, patchid):
'is_committer': is_committer,
'is_this_committer': is_this_committer,
'is_reviewer': is_reviewer,
+ 'is_subscribed': is_subscribed,
'committers': committers,
'attachnow': request.GET.has_key('attachthreadnow'),
'title': patch.name,
@@ -233,6 +236,10 @@ def patchform(request, cfid, patchid):
cf = get_object_or_404(CommitFest, pk=cfid)
patch = get_object_or_404(Patch, pk=patchid, commitfests=cf)
+ prevreviewers = list(patch.reviewers.all())
+ prevauthors = list(patch.authors.all())
+ prevcommitter = patch.committer
+
if request.method == 'POST':
form = PatchForm(data=request.POST, instance=patch)
if form.is_valid():
@@ -244,7 +251,7 @@ def patchform(request, cfid, patchid):
# Track all changes
for field, values in r.diff.items():
- PatchHistory(patch=patch, by=request.user, what='Changed %s to %s' % (field, values[1])).save()
+ PatchHistory(patch=patch, by=request.user, what='Changed %s to %s' % (field, values[1])).save_and_notify(prevcommitter=prevcommitter, prevreviewers=prevreviewers, prevauthors=prevauthors)
r.set_modified()
r.save()
return HttpResponseRedirect('../../%s/' % r.pk)
@@ -347,7 +354,7 @@ def comment(request, cfid, patchid, what):
if int(form.cleaned_data['newstatus']) != poc.status:
poc.status = int(form.cleaned_data['newstatus'])
poc.save()
- PatchHistory(patch=poc.patch, by=request.user, what='New status: %s' % poc.statusstring).save()
+ PatchHistory(patch=poc.patch, by=request.user, what='New status: %s' % poc.statusstring).save_and_notify()
txt += "\n\nThe new status of this patch is: %s\n" % poc.statusstring
msg = MIMEText(txt, _charset='utf-8')
@@ -425,7 +432,7 @@ def status(request, cfid, patchid, status):
poc.patch.save()
poc.save()
- PatchHistory(patch=poc.patch, by=request.user, what='New status: %s' % poc.statusstring).save()
+ PatchHistory(patch=poc.patch, by=request.user, what='New status: %s' % poc.statusstring).save_and_notify()
return HttpResponseRedirect('/%s/%s/' % (poc.commitfest.id, poc.patch.id))
@@ -489,8 +496,9 @@ def close(request, cfid, patchid, status):
committer = get_object_or_404(Committer, user__username=request.GET['c'])
if committer != poc.patch.committer:
# Committer changed!
+ prevcommitter = poc.patch.committer
poc.patch.committer = committer
- PatchHistory(patch=poc.patch, by=request.user, what='Changed committer to %s' % committer).save()
+ PatchHistory(patch=poc.patch, by=request.user, what='Changed committer to %s' % committer).save_and_notify(prevcommitter=prevcommitter)
poc.status = PatchOnCommitFest.STATUS_COMMITTED
else:
raise Exception("Can't happen")
@@ -499,7 +507,7 @@ def close(request, cfid, patchid, status):
poc.patch.save()
poc.save()
- PatchHistory(patch=poc.patch, by=request.user, what='Closed in commitfest %s with status: %s' % (poc.commitfest, poc.statusstring)).save()
+ PatchHistory(patch=poc.patch, by=request.user, what='Closed in commitfest %s with status: %s' % (poc.commitfest, poc.statusstring)).save_and_notify()
return HttpResponseRedirect('/%s/%s/' % (poc.commitfest.id, poc.patch.id))
@@ -514,11 +522,11 @@ def reviewer(request, cfid, patchid, status):
if status=='become' and not is_reviewer:
patch.reviewers.add(request.user)
patch.set_modified()
- PatchHistory(patch=patch, by=request.user, what='Added %s as reviewer' % request.user.username).save()
+ PatchHistory(patch=patch, by=request.user, what='Added %s as reviewer' % request.user.username).save_and_notify()
elif status=='remove' and is_reviewer:
patch.reviewers.remove(request.user)
patch.set_modified()
- PatchHistory(patch=patch, by=request.user, what='Removed %s from reviewers' % request.user.username).save()
+ PatchHistory(patch=patch, by=request.user, what='Removed %s from reviewers' % request.user.username).save_and_notify()
return HttpResponseRedirect('../../')
@login_required
@@ -534,19 +542,35 @@ def committer(request, cfid, patchid, status):
is_committer = committer == patch.committer
+ prevcommitter = patch.committer
if status=='become' and not is_committer:
patch.committer = committer
patch.set_modified()
- PatchHistory(patch=patch, by=request.user, what='Added %s as committer' % request.user.username).save()
+ PatchHistory(patch=patch, by=request.user, what='Added %s as committer' % request.user.username).save_and_notify(prevcommitter=prevcommitter)
elif status=='remove' and is_committer:
patch.committer = None
patch.set_modified()
- PatchHistory(patch=patch, by=request.user, what='Removed %s from committers' % request.user.username).save()
+ PatchHistory(patch=patch, by=request.user, what='Removed %s from committers' % request.user.username).save_and_notify(prevcommitter=prevcommitter)
patch.save()
return HttpResponseRedirect('../../')
@login_required
@transaction.atomic
+def subscribe(request, cfid, patchid, sub):
+ get_object_or_404(CommitFest, pk=cfid)
+ patch = get_object_or_404(Patch, pk=patchid)
+
+ if sub == 'un':
+ patch.subscribers.remove(request.user)
+ messages.info(request, "You have been unsubscribed from updates on this patch")
+ else:
+ patch.subscribers.add(request.user)
+ messages.info(request, "You have been subscribed to updates on this patch")
+ patch.save()
+ return HttpResponseRedirect("../")
+
+@login_required
+@transaction.atomic
def send_email(request, cfid):
cf = get_object_or_404(CommitFest, pk=cfid)
if not request.user.is_staff: