Merge lp:~rajeevs1992/postorius/postorius into lp:postorius

Proposed by Rajeev S
Status: Needs review
Proposed branch: lp:~rajeevs1992/postorius/postorius
Merge into: lp:postorius
Diff against target: 109 lines (+36/-22)
3 files modified
src/postorius/forms.py (+5/-0)
src/postorius/templates/postorius/lists/mass_subscribe.html (+1/-1)
src/postorius/views/list.py (+30/-21)
To merge this branch: bzr merge lp:~rajeevs1992/postorius/postorius
Reviewer Review Type Date Requested Status
Florian Fuchs Pending
Review via email: mp+207826@code.launchpad.net

Description of the change

Added a file upload feature to add Mass subscriptions.Also changed email validator to django builtin validator.(DRY)

To post a comment you must log in.
Revision history for this message
Sumana Harihareswara (sumanah) :
Revision history for this message
Rajeev S (rajeevs1992) wrote :
Download full text (4.3 KiB)

Looks fine to me.

Sent from my BlackBerry 10 smartphone.
  Original Message
From: Sumana Harihareswara
Sent: Saturday 10 January 2015 03:13
To: Rajeev S
Reply To: <email address hidden>
Subject: Re: [Merge] lp:~rajeevs1992/postorius/postorius into lp:postorius

Diff comments:

> === modified file 'src/postorius/forms.py'
> --- src/postorius/forms.py 2013-10-22 18:52:15 +0000
> +++ src/postorius/forms.py 2014-02-23 14:49:03 +0000
> @@ -706,6 +706,11 @@
> widget=forms.Textarea,
> )
>
> + upload = forms.FileField(
> + label = ('Or Upload a file,with one email per line'),

I'm sorry that I don't have a more substantive comment on the code to offer, but I can suggest that the label be:

'Or upload a file, with one email address per line'

> + required = False,
> + )
> +
> verify_with_email = forms.BooleanField(required=False)
>
> class Meta:
>
> === modified file 'src/postorius/templates/postorius/lists/mass_subscribe.html'
> --- src/postorius/templates/postorius/lists/mass_subscribe.html 2013-05-31 02:21:03 +0000
> +++ src/postorius/templates/postorius/lists/mass_subscribe.html 2014-02-23 14:49:03 +0000
> @@ -6,7 +6,7 @@
> {% block main %}
> {% list_nav 'mass_subscribe' 'Mass Subscription' %}
>
> - <form action="{% url 'mass_subscribe' list.fqdn_listname %}" method="post" class="well"> {% csrf_token %}
> + <form action="{% url 'mass_subscribe' list.fqdn_listname %}" method="post" class="well" enctype="multipart/form-data"> {% csrf_token %}
> {{ form.as_p }}
> <button class="btn btn-primary" type="submit">{% trans "Subscribe users" %}</button>
> </form>
>
> === modified file 'src/postorius/views/list.py'
> --- src/postorius/views/list.py 2013-10-22 20:01:21 +0000
> +++ src/postorius/views/list.py 2014-02-23 14:49:03 +0000
> @@ -21,13 +21,15 @@
> from django.contrib import messages
> from django.contrib.auth.decorators import (login_required,
> user_passes_test)
> +from django.core.validators import validate_email
> +from django.core.exceptions import ValidationError
> from django.core.urlresolvers import reverse
> from django.shortcuts import render_to_response, redirect
> from django.template import RequestContext
> from django.utils.decorators import method_decorator
> from django.utils.translation import gettext as _
> from urllib2 import HTTPError
> -
> +import csv
> from postorius import utils
> from postorius.models import (Domain, List, MailmanUser,
> MailmanApiError)
> @@ -170,6 +172,12 @@
> class ListMassSubsribeView(MailingListView):
>
> """Mass subscription."""
> + def verify_email(self,email):
> + try:
> + validate_email( email )
> + return True
> + except ValidationError:
> + return False
>
> @method_decorator(list_owner_required)
> def get(self, request, *args, **kwargs):
> @@ -180,27 +188,28 @@
>
> def post(self, request, *args, **kwargs):
> form = ListMassSubscription(request.POST)
> - if not form.is_valid():
> + emails = request.POST["emails"].splitlines()
> + if 'upload' in request.FILES:
> + for i in request.FILES["upload"].readlines():
> + emails.append(i.strip())
> + if emails == []:
> messages.error(request, 'Please fill out the form correctly.')
> - else:
> - emails = request.POST["emails"].splitlines()
> ...

Read more...

Unmerged revisions

160. By Rajeev S

Added an upload file feature to the Mass Subscribe.
Also used the django inbuilt email verifier to verify
the emails, in views/list.py.(DRY).

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/postorius/forms.py'
2--- src/postorius/forms.py 2013-10-22 18:52:15 +0000
3+++ src/postorius/forms.py 2014-02-23 14:49:03 +0000
4@@ -706,6 +706,11 @@
5 widget=forms.Textarea,
6 )
7
8+ upload = forms.FileField(
9+ label = ('Or Upload a file,with one email per line'),
10+ required = False,
11+ )
12+
13 verify_with_email = forms.BooleanField(required=False)
14
15 class Meta:
16
17=== modified file 'src/postorius/templates/postorius/lists/mass_subscribe.html'
18--- src/postorius/templates/postorius/lists/mass_subscribe.html 2013-05-31 02:21:03 +0000
19+++ src/postorius/templates/postorius/lists/mass_subscribe.html 2014-02-23 14:49:03 +0000
20@@ -6,7 +6,7 @@
21 {% block main %}
22 {% list_nav 'mass_subscribe' 'Mass Subscription' %}
23
24- <form action="{% url 'mass_subscribe' list.fqdn_listname %}" method="post" class="well"> {% csrf_token %}
25+ <form action="{% url 'mass_subscribe' list.fqdn_listname %}" method="post" class="well" enctype="multipart/form-data"> {% csrf_token %}
26 {{ form.as_p }}
27 <button class="btn btn-primary" type="submit">{% trans "Subscribe users" %}</button>
28 </form>
29
30=== modified file 'src/postorius/views/list.py'
31--- src/postorius/views/list.py 2013-10-22 20:01:21 +0000
32+++ src/postorius/views/list.py 2014-02-23 14:49:03 +0000
33@@ -21,13 +21,15 @@
34 from django.contrib import messages
35 from django.contrib.auth.decorators import (login_required,
36 user_passes_test)
37+from django.core.validators import validate_email
38+from django.core.exceptions import ValidationError
39 from django.core.urlresolvers import reverse
40 from django.shortcuts import render_to_response, redirect
41 from django.template import RequestContext
42 from django.utils.decorators import method_decorator
43 from django.utils.translation import gettext as _
44 from urllib2 import HTTPError
45-
46+import csv
47 from postorius import utils
48 from postorius.models import (Domain, List, MailmanUser,
49 MailmanApiError)
50@@ -170,6 +172,12 @@
51 class ListMassSubsribeView(MailingListView):
52
53 """Mass subscription."""
54+ def verify_email(self,email):
55+ try:
56+ validate_email( email )
57+ return True
58+ except ValidationError:
59+ return False
60
61 @method_decorator(list_owner_required)
62 def get(self, request, *args, **kwargs):
63@@ -180,27 +188,28 @@
64
65 def post(self, request, *args, **kwargs):
66 form = ListMassSubscription(request.POST)
67- if not form.is_valid():
68+ emails = request.POST["emails"].splitlines()
69+ if 'upload' in request.FILES:
70+ for i in request.FILES["upload"].readlines():
71+ emails.append(i.strip())
72+ if emails == []:
73 messages.error(request, 'Please fill out the form correctly.')
74- else:
75- emails = request.POST["emails"].splitlines()
76- for email in emails:
77- parts = email.split('@')
78- if len(parts) != 2 or '.' not in parts[1]:
79- messages.error(request,
80- 'The email address %s is not valid.' %
81- email)
82- else:
83- try:
84- self.mailing_list.subscribe(address=email)
85- messages.success(
86- request,
87- 'The address %s has been subscribed to %s.' %
88- (email, self.mailing_list.fqdn_listname))
89- except MailmanApiError:
90- return utils.render_api_error(request)
91- except HTTPError, e:
92- messages.error(request, e)
93+ for email in emails:
94+ if not self.verify_email(email):
95+ messages.error(request,
96+ 'The email address %s is not valid.' %
97+ email)
98+ else:
99+ try:
100+ self.mailing_list.subscribe(address=email)
101+ messages.success(
102+ request,
103+ 'The address %s has been subscribed to %s.' %
104+ (email, self.mailing_list.fqdn_listname))
105+ except MailmanApiError:
106+ return utils.render_api_error(request)
107+ except HTTPError, e:
108+ messages.error(request, e)
109 return redirect('mass_subscribe', self.mailing_list.fqdn_listname)
110
111

Subscribers

People subscribed via source and target branches