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 }}
+ |
{% 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')),