Merge lp:~stylistica/postorius/user_preferences into lp:postorius

Proposed by Sneha Priscilla
Status: Merged
Merged at revision: 150
Proposed branch: lp:~stylistica/postorius/user_preferences
Merge into: lp:postorius
Diff against target: 239 lines (+73/-98)
3 files modified
src/postorius/forms.py (+11/-17)
src/postorius/templates/postorius/user_mailmansettings.html (+44/-78)
src/postorius/views/user.py (+18/-3)
To merge this branch: bzr merge lp:~stylistica/postorius/user_preferences
Reviewer Review Type Date Requested Status
Terri Approve
Florian Fuchs Pending
Review via email: mp+179274@code.launchpad.net

Description of the change

I've added a form for the user to view/update their mailing list preferences on a global level.

For these changes to work, the following branches need to be merged into Mailman and Mailman.client respectively:

https://code.launchpad.net/~stylistica/mailman/user_preferences
https://code.launchpad.net/~stylistica/mailman.client/user_preferences

To post a comment you must log in.
Revision history for this message
Florian Fuchs (flo-fuchs) wrote :

Hi Sneha,

thanks for the merge request!

The new form, as well as the template and view code look pretty good!

The only thing left to do in my view is some style-related cleanup. So if you want to make it perfect I'd check for PEP8 inconsistencies (long lines, missing/unnecessary spaces etc.). Also, there seem to be some lines containing tabs instead of spaces.

Other than that the changes are good!
Thanks again.

Florian

Revision history for this message
Terri (terriko) wrote :

We're looking for some "easy" bugs to fix at the GHC Open Source Day, so I'm actually going to merge this as-is and then let our new contributors find the style problems as simple first commits. (I know, I know, this isn't how it's supposed to be done, but it'll be fun!)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/postorius/forms.py'
--- src/postorius/forms.py 2013-03-21 18:43:28 +0000
+++ src/postorius/forms.py 2013-08-08 20:50:48 +0000
@@ -587,10 +587,13 @@
587 layout = [["Mass subscription", "emails"]]587 layout = [["Mass subscription", "emails"]]
588588
589589
590class MembershipSettings(FieldsetForm):590class UserPreferences(FieldsetForm):
591 """Form handling the membership settings.591 """Form handling the user's global preferences.
592 """592 """
593 choices = ((True, _('Yes')), (False, _('No')))593 choices = ((True, _('Yes')), (False, _('No')))
594
595 delivery_mode_choices = (("regular", _('Regular')), ("plaintext_digests",_('Plain Text Digests')),("mime_digests",_('Mime Digests')),("summary_digests", _('Summary Digests')))
596 delivery_status_choices = (("enabled", _('Enabled')),("by_user",_('Disabled')))
594 acknowledge_posts = forms.BooleanField(597 acknowledge_posts = forms.BooleanField(
595 widget=forms.RadioSelect(choices=choices),598 widget=forms.RadioSelect(choices=choices),
596 required=False,599 required=False,
@@ -608,22 +611,14 @@
608 required=False,611 required=False,
609 label=_('Receive own postings'))612 label=_('Receive own postings'))
610 delivery_mode = forms.ChoiceField(613 delivery_mode = forms.ChoiceField(
611 widget=forms.Select(),614 widget = forms.Select(),
612 error_messages={615 choices = delivery_mode_choices,
613 'required': _("Please choose a mode.")},616 required = False,
614 required=False,617 label = _('Delivery mode'))
615 choices=(
616 ("", _("Please choose")),
617 ("delivery_mode", "some mode...")),
618 label=_('Delivery mode'))
619 delivery_status = forms.ChoiceField(618 delivery_status = forms.ChoiceField(
620 widget=forms.Select(),619 widget = forms.Select(),
621 error_messages={
622 'required': _("Please choose a status.")},
623 required=False,620 required=False,
624 choices=(621 choices= delivery_status_choices,
625 ("", _("Please choose")),
626 ("delivery_status", "some status...")),
627 label=_('Delivery status'))622 label=_('Delivery status'))
628623
629 class Meta:624 class Meta:
@@ -635,7 +630,6 @@
635 "receive_list_copy", "receive_own_postings",630 "receive_list_copy", "receive_own_postings",
636 "delivery_mode", "delivery_status"]]631 "delivery_mode", "delivery_status"]]
637632
638
639class UserNew(FieldsetForm):633class UserNew(FieldsetForm):
640 """634 """
641 Form field to add a new user635 Form field to add a new user
642636
=== modified file 'src/postorius/templates/postorius/user_mailmansettings.html'
--- src/postorius/templates/postorius/user_mailmansettings.html 2013-06-30 22:39:39 +0000
+++ src/postorius/templates/postorius/user_mailmansettings.html 2013-08-08 20:50:48 +0000
@@ -12,90 +12,56 @@
12 {% else %}12 {% else %}
1313
14 <div class="mm_subHeader">14 <div class="mm_subHeader">
15 <h1>{% trans "Subscription Settings" %} <span>- {{ user }}</span></h1>15 <h2>{% trans "Subscription Settings" %} <span>- {{ user }}</span></h2>
16 </div>16 </div>
1717
18 <p><strong>Mailman display name:</strong> {{ mm_user.display_name}}</p>18
19 <p><strong>Django email:</strong> {{ user.email }}</p>19
20 <p><strong>Mailman primary email:</strong> {{ mm_user.email }}</p>20<h2> Global Preferences Overview </h2>
21 <h2>Valid email addresses for this account:</h2>21<!-- Table displaying the user's global Mailman preferencesc, may be removed-->
22 <ul>22<table class="table table-bordered table-striped mm_userData">
23<!-- ADDRESSES/EMAIL@/MEMBERSHIPS -->23 <tbody>
24 {% for address in mm_user.addresses %}24 <tr>
25 <li>{{ address }}</li>25 <td>{% trans 'Receive List Copy' %}</td>
26 {% endfor %}26 <td>{{ mm_user.preferences.receive_list_copy }}</td>
27 </ul>27 </tr>
2828 <tr>
29 <h2 style="color: red">WARNING: This page is currently a mockup and29 <td>{% trans 'Hide Address' %}</td>
30anything below this line may not work</h2>30 <td>{{ mm_user.preferences.hide_address }}</td>
3131 </tr>
32 <h2>Preferences:</h2>32 <tr>
33 <p>preferences: {{ mm_user.preferences }}33 <td>{% trans 'Preferred Language' %}</td>
34 <p>user: {{ mm_user }}34 <td>{{ mm_user.preferences.preferred_language }}</td>
35 <p>tko35 </tr>
36 <p>memberships: {{ membership_lists }}36 <tr>
37 {% for pref in mm_user.preferences %}37 <td>{% trans 'Acknowledge Posts' %}</td>
38 <li>{{ pref }}</li>38 <td>{{ mm_user.preferences.acknowledge_posts }}</td>
39 {% endfor %}39 </tr>
40 40 <tr>
41 <p><em class="errorlist">Sample output: not real</em></p>41 <td>{% trans 'Delivery Mode' %}</td>
42 <ul>42 <td>{{ mm_user.preferences.delivery_mode }}</td>
43 <li>list1@example.com [<a href="#">listinfo</a>] 43 </tr>
44 [<a href="#">settings</a>]</li>44 <tr>
45 <li>kumquat@example.com [<a href="#">listinfo</a>] 45 <td>{% trans 'Receive Own Postings' %}</td>
46 [<a href="#">settings</a>]</li>46 <td>{{ mm_user.preferences.receive_own_postings }}</td>
47 <li>starfruit@example.com [<a href="#">listinfo</a>] 47 </tr>
48 [<a href="#">settings</a>]</li>48 <tr>
49 </ul>49 <td>{% trans 'Delivery Status' %}</td>
5050 <td>{{ mm_user.preferences.delivery_status }}</td>
51 <h2>Prefs form</h2>51 </tr>
52
53 </tbody>
54 </table>
55
56
57 <h2>Global Preferences Form</h2>
58 <!-- Form to modify the user's global Mailman preferences -->
52 <form action="{% url 'user_mailmansettings' %}" method="post" class="well"> {% csrf_token %}59 <form action="{% url 'user_mailmansettings' %}" method="post" class="well"> {% csrf_token %}
53 {{ settingsform.as_p }}60 {{ settingsform.as_p }}
54 <button class="btn btn-success" type="submit">{% trans "Save" %}</button>61 <button class="btn btn-success" type="submit">{% trans "Save" %}</button>
55 </form>62 </form>
5663
57 <h2>List Preferences Overview</h2>64
58 <p><em class="errorlist">Sample output: not real</em></p>
59 <input id="btnHide" type="button" value="{% trans "Hide Descriptions" %}"/>
60 <form action="#"> {% csrf_token %}
61 <table class="table table-bordered table-striped">
62 <tr>
63 <th>{% trans "Setting" %}</th>
64 <th>{% trans "Description" %}</th>
65 <th>{% trans "Set all" %}</th>
66 <th class="rotate">list1@example.com</th>
67 <th class="rotate">kumquat@example.com</th>
68 <th class="rotate">starfruit@example.com</th>
69 </tr>
70 <tr>
71 <th>{% trans "Mail delivery" %} ({{ preference }})</th>
72 <td>Set this option to <em>Enabled</em> to receive
73messages posted
74 to this mailing list. Set it to <em>Disabled</em> if you want
75 to stay subscribed, but don't want mail delivered to you for a
76 while (e.g. you're going on vacation). If you disable mail
77 delivery, don't forget to re-enable it when you come back; it
78 will not be automatically re-enabled." </td>
79 <td><input type="checkbox" /></td>
80 <td><input type="checkbox" /></td>
81 <td><input type="checkbox" /></td>
82 <td><input type="checkbox" /></td>
83 </tr>
84 {% for preference in mm_user.preferences %}
85 {% endfor %}
86 <tr>
87 <th colspan="6">{% trans "Per-Email subscriptions" %}</th>
88 </tr>
89 <tr>
90 <th colspan="2">anna@example.com</th>
91 <td><input type="checkbox" /></td>
92 <td><input type="checkbox" /></td>
93 <td><input type="checkbox" /></td>
94 <td><input type="checkbox" /></td>
95 <tr>
96 </tr>
97 </table>
98 </form>
99 {% endif %}65 {% endif %}
100{% endblock main %}66{% endblock main %}
101~ 67~
10268
=== modified file 'src/postorius/views/user.py'
--- src/postorius/views/user.py 2013-07-11 14:35:41 +0000
+++ src/postorius/views/user.py 2013-08-08 20:50:48 +0000
@@ -53,7 +53,23 @@
5353
54 @method_decorator(login_required)54 @method_decorator(login_required)
55 def post(self, request):55 def post(self, request):
56 raise NotImplementedError56 try:
57 mm_user = MailmanUser.objects.get(address=request.user.email)
58 userprefs_form = UserPreferences(request.POST)
59 if userprefs_form.is_valid():
60 user_preferences = mm_user.preferences
61 for key in userprefs_form.fields.keys():
62 user_preferences[key] = userprefs_form.cleaned_data[key]
63 user_preferences.save()
64 messages.success(request, 'Your preferences have been updated.')
65 else:
66 messages.error(request, 'Something went wrong.')
67 except MailmanApiError:
68 return utils.render_api_error(request)
69 except HTTPError, e:
70 messages.error(request, e.msg)
71 return redirect("user_mailmansettings")
72
5773
58 @method_decorator(login_required)74 @method_decorator(login_required)
59 def get(self, request):75 def get(self, request):
@@ -69,13 +85,12 @@
69 'postorius/user_mailmansettings.html',85 'postorius/user_mailmansettings.html',
70 {'nolists': 'true'},86 {'nolists': 'true'},
71 context_instance=RequestContext(request))87 context_instance=RequestContext(request))
72 settingsform = MembershipSettings()88 settingsform = UserPreferences(initial = mm_user.preferences)
73 return render_to_response('postorius/user_mailmansettings.html',89 return render_to_response('postorius/user_mailmansettings.html',
74 {'mm_user': mm_user,90 {'mm_user': mm_user,
75 'settingsform': settingsform},91 'settingsform': settingsform},
76 context_instance=RequestContext(request))92 context_instance=RequestContext(request))
7793
78
79class UserSummaryView(MailmanUserView):94class UserSummaryView(MailmanUserView):
80 """Shows a summary of a user.95 """Shows a summary of a user.
81 """96 """

Subscribers

People subscribed via source and target branches