From 72c200d42e977a83fe71914cb07d1bce9f7ffe87 Mon Sep 17 00:00:00 2001 From: Sergio Oliveira Date: Tue, 8 Oct 2013 17:37:32 -0300 Subject: [PATCH] multiple emails for each user --- src/accounts/templates/accounts/user_update_form.html | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- src/super_archives/admin.py | 12 +++++++++++- src/super_archives/models.py | 6 ++++++ src/super_archives/urls.py | 7 ++++++- src/super_archives/views.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 255 insertions(+), 20 deletions(-) diff --git a/src/accounts/templates/accounts/user_update_form.html b/src/accounts/templates/accounts/user_update_form.html index 337fe01..98c26f1 100644 --- a/src/accounts/templates/accounts/user_update_form.html +++ b/src/accounts/templates/accounts/user_update_form.html @@ -1,6 +1,69 @@ {% extends "base.html" %} {% load i18n gravatar %} +{% block head_js %} + +{% endblock %} + + {% block main-content %}
{% csrf_token %} @@ -14,19 +77,61 @@
- {% for field in form %} -
-
- - {{ field }} - {{ field.errors }} +
+ {% for field in form %} +
+
+ + {{ field }} + {{ field.errors }} +
+ {% endfor %}
- {% endfor %} -
+
+
+
+

{% trans "Emails" %}

+
+
+ +
+ + +
+ +
+
+
+
diff --git a/src/super_archives/admin.py b/src/super_archives/admin.py index 98f5d29..bdc09a7 100644 --- a/src/super_archives/admin.py +++ b/src/super_archives/admin.py @@ -1,6 +1,15 @@ from django.contrib import admin -from .models import Message, Thread +from .models import Message, Thread, EmailAddress + + +class EmailAddressAdmin(admin.ModelAdmin): + search_fields = ( + 'address', + 'user__username', + 'user__first_name', + 'user__last_name', + ) class MessageAdmin(admin.ModelAdmin): list_filter = ('spam', 'thread__mailinglist', 'received_time', ) @@ -50,4 +59,5 @@ class ThreadAdmin(admin.ModelAdmin): admin.site.register(Thread, ThreadAdmin) admin.site.register(Message, MessageAdmin) +admin.site.register(EmailAddress, EmailAddressAdmin) diff --git a/src/super_archives/models.py b/src/super_archives/models.py index 4aa0520..5d0fb94 100644 --- a/src/super_archives/models.py +++ b/src/super_archives/models.py @@ -45,6 +45,12 @@ class EmailAddress(models.Model): self.md5 = md5(self.address).hexdigest() super(EmailAddress, self).save(*args, **kwargs) + def get_full_name(self): + if self.user and self.user.get_full_name(): + return self.user.get_full_name() + else: + return self.real_name + def get_full_name_or_anonymous(self): return self.get_full_name() or _('Anonymous') diff --git a/src/super_archives/urls.py b/src/super_archives/urls.py index 5371acf..c233613 100644 --- a/src/super_archives/urls.py +++ b/src/super_archives/urls.py @@ -1,8 +1,13 @@ from django.conf.urls import patterns, include, url +from .views import EmailView + + urlpatterns = patterns('super_archives.views', # url(r'thread/(?P\d+)/$', 'thread', name='thread'), url(r'thread/(?P[-\w]+)/(?P[-\w]+)$', 'thread', name="thread_view"), - url(r'thread/$', 'list_messages', name='thread_list') + url(r'thread/$', 'list_messages', name='thread_list'), + url(r'manage/email/(?P[0-9a-z]{32})?', EmailView.as_view(), + name="archive_email_view"), ) diff --git a/src/super_archives/views.py b/src/super_archives/views.py index 311bc46..9ccfde6 100644 --- a/src/super_archives/views.py +++ b/src/super_archives/views.py @@ -1,25 +1,29 @@ # -*- coding: utf-8 -*- -import queries - -from django.http import Http404 -from django.template import RequestContext +from django import http +from django.contrib import messages +from django.db import IntegrityError +from django.views.generic import View from django.core.paginator import Paginator +from django.utils.translation import ugettext as _ from django.core.exceptions import ObjectDoesNotExist -from django.shortcuts import render, get_list_or_404 +from django.utils.decorators import method_decorator +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect -from .models import MailingList, Thread +from . import queries from .decorators import count_hit +from .models import MailingList, Thread, EmailAddress, EmailAddressValidation @count_hit def thread(request, mailinglist, thread_token): try: - first_message = queries.get_first_message_in_thread(mailinglist, + first_message = queries.get_first_message_in_thread(mailinglist, thread_token) except ObjectDoesNotExist: - raise Http404 + raise http.Http404 order_by = request.GET.get('order') if order_by == 'voted': msgs_query = queries.get_messages_by_voted() @@ -80,3 +84,108 @@ def list_messages(request): 'order_by': order_by, } return render(request, 'message-list.html', template_data) + + +class EmailView(View): + + http_method_names = [u'head', u'get', u'post', u'delete', u'update'] + + def get(self, request, key): + """Validate an email with the given key""" + + try: + email_val = EmailAddressValidation.objects.get(validation_key=key, + user=request.user) + except EmailAddressValidation.DoesNotExist: + messages.error(request, _('The email address you are trying to ' + 'verify either has already been verified ' + 'or does not exist.')) + return redirect('/') + + try: + email = EmailAddress.objects.get(address=email_val.address) + except EmailAddress.DoesNotExist: + email = EmailAddress(address=email_val.address) + + if email.user: + messages.error(request, _('The email address you are trying to ' + 'verify is already an active email ' + 'address.')) + email_val.delete() + return redirect('/') + + email.user = email_val.user + email.save() + email_val.delete() + + messages.success(request, _('Email address verified!')) + return redirect('user_profile', username=email_val.user.username) + + + @method_decorator(login_required) + def post(self, request, key): + """Create new email address that will wait for validation""" + + email = request.POST.get('email') + if not email: + return http.HttpResponseBadRequest() + + try: + EmailAddressValidation.objects.create(address=email, + user=request.user) + except IntegrityError: + # 409 Conflict + # duplicated entries + # email exist and it's waiting for validation + return http.HttpResponse(status=409) + + return http.HttpResponse(status=201) + + @method_decorator(login_required) + def delete(self, request, key): + """Remove an email address, validated or not.""" + + request.DELETE = http.QueryDict(request.body) + email_addr = request.DELETE.get('email') + + if not email_addr: + return http.HttpResponseBadRequest() + + try: + email = EmailAddressValidation.objects.get(address=email_addr, + user=request.user) + except EmailAddressValidation.DoesNotExist: + pass + else: + email.delete() + return http.HttpResponse(status=204) + + try: + email = EmailAddress.objects.get(address=email_addr, + user=request.user) + except EmailAddress.DoesNotExist: + raise http.Http404 + + email.user = None + email.save() + return http.HttpResponse(status=204) + + @method_decorator(login_required) + def update(self, request, key): + """Set an email address as primary address.""" + + request.UPDATE = http.QueryDict(request.body) + + email_addr = request.UPDATE.get('email') + if not email_addr: + return http.HttpResponseBadRequest() + + try: + email = EmailAddress.objects.get(address=email_addr, + user=request.user) + except EmailAddress.DoesNotExist: + raise http.Http404 + + request.user.email = email_addr + request.user.save() + return http.HttpResponse(status=204) -- libgit2 0.21.2