diff --git a/bt/models.py b/bt/models.py index fb410bcd333cb160ced05ed41139c8075f15ccc0..35b09e4ad1acebccddce6cd79821bf61b52d8130 100644 --- a/bt/models.py +++ b/bt/models.py @@ -63,6 +63,9 @@ class Violation(models.Model): loophole = models.BooleanField() activationid= models.CharField(max_length=128) + def confirmations(self): + return self.confirmation_set.filter(key='').count() + class Comment(models.Model): submitter_email = models.EmailField() submitter_name = models.CharField(max_length=20) @@ -75,6 +78,11 @@ class Attachment(models.Model): name= models.CharField(max_length=512) comment = models.ForeignKey(Comment) +class Confirmation(models.Model): + key=models.CharField(max_length=64) + email=models.EmailField() + violation = models.ForeignKey(Violation) + class ViolationModerator(CommentModerator): email_notification = True moderate_after = 0 diff --git a/bt/views.py b/bt/views.py index b07a7dc3b57911c1f25752870aa0f847d084607a..17b12a34bb0f23dffdc9e157135f9251e1ce6223 100644 --- a/bt/views.py +++ b/bt/views.py @@ -7,7 +7,8 @@ from django.conf import settings from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.exceptions import ObjectDoesNotExist from django.contrib import messages -from models import Violation, Attachment, Comment +from django.utils.translation import ugettext_lazy as _ +from models import Violation, Attachment, Comment, Confirmation from tempfile import mkstemp from datetime import datetime import hashlib, os, re, json, smtplib @@ -48,18 +49,35 @@ def activate(request): messages.add_message(request, messages.INFO, _('Thank you for verifying your submission.')) return HttpResponseRedirect('/') # Redirect after POST +def confirm(request, id, name=None): + if name: + if Confirmation.objects.filter(email=name, violation=id).count()==0: + actid=sendverifymail('confirm/',name) + c=Confirmation(key=actid, email=name, violation=Violation.objects.get(pk=id)) + c.save() + return HttpResponse('
Thank you for your confirmation
') + c=Confirmation.objects.get(key=id) + if c: + c.key='' + c.save() + return HttpResponse('
Thank you for verifying your confirmation
') + +def sendverifymail(service,to): + actid = hashlib.sha1(''.join([chr(randint(32, 122)) for x in range(12)])).hexdigest() + msg = MIMEText(_("Your verification key is %s/%s%s\n") % (settings.ROOT_URL or 'http://localhost:8001/', service, actid)) + msg['Subject'] = _('NNMon submission verification') + msg['From'] = 'nnmon@nnmon.lqdn.fr' + msg['To'] = to + s = smtplib.SMTP('localhost') + s.sendmail('nnmon@nnmon.lqdn.fr', [to], msg.as_string()) + s.quit() + return actid + def add(request): if request.method == 'POST': form = AddViolation(request.POST) if form.is_valid(): - actid = hashlib.sha1(''.join([chr(randint(32, 122)) for x in range(12)])).hexdigest() - msg = MIMEText(_("Your verification key is %s/activate?key=%s\n") % (settings.ROOT_URL or 'http://localhost:8001/',actid)) - msg['Subject'] = _('NNMon submission verification') - msg['From'] = 'nnmon@nnmon.lqdn.fr' - msg['To'] = form.cleaned_data['email'] - s = smtplib.SMTP('localhost') - s.sendmail('nnmon@nnmon.lqdn.fr', [form.cleaned_data['email']], msg.as_string()) - s.quit() + actid=sendverifymail('activate?key=',form.cleaned_data['email']) v=Violation( country = form.cleaned_data['country'], operator = form.cleaned_data['operator'], diff --git a/media/css/style.css b/media/css/style.css index 80518b6b8dfd50e84de23d832197325cf6368c23..b762648b4ade8494a38a40a352f6e8cef778f360 100644 --- a/media/css/style.css +++ b/media/css/style.css @@ -21,6 +21,11 @@ li { list-style: none; } #report dd { display: inline; } #auth { float: right; clear: both; } +.confirm { display: inline; position: relative; } +.confirm:hover > div { display: block; } +.confirm_popup { display: none; position: absolute; right: 0; border: 2px solid #454545; padding: 10px; background: #F7F7F7; z-index: 20; } +.confirm_thanks { width: 17.2em; height: 6.7em; } + table.listing, .pagination { width: 90%; margin: auto; } table.listing thead td { font-weight: bold; border-bottom: 1px solid black; } diff --git a/templates/list.html b/templates/list.html index 07d7babf9c4e69037aec2bffbb56bbb8e1d1ac4f..bd0ee843858b06a875821b735489718b9307de9e 100644 --- a/templates/list.html +++ b/templates/list.html @@ -9,7 +9,12 @@ {% endblock %} @@ -35,6 +40,7 @@ {% trans "contractual" %} {% trans "contractual_excerpt" %} {% trans "loophole" %} + {% trans "confirmations" %} @@ -51,6 +57,20 @@ {{ violation.contractual }} {{ violation.contractual_excerpt }} {{ violation.loophole }} + {{ violation.confirmations }}
Confirm this violation + +
+ {% endfor %} diff --git a/urls.py b/urls.py index f22440c7b5197996b1ed90d7b9074ae862197119..c28b6ea0b12f9abd4ab3f4a0e27436ff39afec5d 100644 --- a/urls.py +++ b/urls.py @@ -11,6 +11,8 @@ urlpatterns = patterns('', (r'^add/$', bt.add), (r'^view/(?P[0-9]*)$', bt.view), (r'^activate/$', bt.activate), + (r'^confirm/(?P[0-9a-z]*)$', bt.confirm), + (r'^confirm/(?P[0-9]*)/(?P.*)$', bt.confirm), (r'^accounts/logout$', 'django.contrib.auth.views.logout', {'next_page' : '/'}), (r'^accounts/', include('registration.urls')), (r'^comments/', include('django.contrib.comments.urls')),