Merge lp:~bhavesh-goyal093/postorius/feature-added-search-postorius-lists into lp:postorius

Proposed by Bhavesh Goyal
Status: Needs review
Proposed branch: lp:~bhavesh-goyal093/postorius/feature-added-search-postorius-lists
Merge into: lp:postorius
Diff against target: 158 lines (+64/-3)
6 files modified
src/postorius/forms.py (+9/-0)
src/postorius/static/postorius/css/style.css (+3/-0)
src/postorius/templates/postorius/lists/confirm_removeall_subscribers.html (+5/-0)
src/postorius/templates/postorius/lists/mass_removal.html (+5/-0)
src/postorius/templates/postorius/lists/members.html (+10/-1)
src/postorius/views/list.py (+32/-2)
To merge this branch: bzr merge lp:~bhavesh-goyal093/postorius/feature-added-search-postorius-lists
Reviewer Review Type Date Requested Status
Terri Needs Fixing
Review via email: mp+252274@code.launchpad.net

Description of the change

Search is regarded as an important function for any list. The postorius lists earlier had no such function in members list page. Thus for large lists, it was difficult for list maintainer to search for a particular member in such lists. Even with Find In Page Browser function, it doesn't allow to search among whole lists across different pages and just highlights the results merely reducing the effort of going through the whole list.

Now The Members list can be filtered based on email address and certain functions such as getting all addresses starting with certain keywords and getting addresses containing some specific keywords can also be performed using the search box implemented in members list page.

To post a comment you must log in.
Revision history for this message
Terri (terriko) wrote :

This looks like a useful feature, but I believe this needs some more careful validation of the search string. Could you double-check that you're following best practices since the search string is being displayed in the page?

review: Needs Fixing
209. By Bhavesh Goyal

Improved Indentations

210. By Bhavesh Goyal

Merged Updations

211. By Bhavesh Goyal

pep8 minor fixes

212. By Bhavesh Goyal

Added Page Titles for Mass Removal

213. By Bhavesh Goyal

Sanitization for form input data

214. By Bhavesh Goyal

Merged Updations

Unmerged revisions

214. By Bhavesh Goyal

Merged Updations

213. By Bhavesh Goyal

Sanitization for form input data

212. By Bhavesh Goyal

Added Page Titles for Mass Removal

211. By Bhavesh Goyal

pep8 minor fixes

210. By Bhavesh Goyal

Merged Updations

209. By Bhavesh Goyal

Improved Indentations

208. By Bhavesh Goyal

Feature Implemented: Added Search Functionality in postorius Members List

207. By Bhavesh Goyal

Fixed Bug #1428646 (Updated Subscription Settings Forms UI)

206. By Bhavesh Goyal

Fixed Bug #1428966 which fixes postorius UI

205. By Bhavesh Goyal

Fixed postorius Bug #1428646 which updates the UI of Mailing list forms

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 2015-04-15 21:48:46 +0000
3+++ src/postorius/forms.py 2015-04-15 23:31:33 +0000
4@@ -91,6 +91,15 @@
5 'required': _('Please enter an email adddress.'),
6 'invalid': _('Please enter a valid email adddress.')})
7
8+class NewMemberSearchForm(forms.Form):
9+
10+ """Search Among the list Members."""
11+ search_name = forms.CharField(
12+ label=_('Search Member Name'),
13+ required=True,
14+ error_messages={
15+ 'required': _('Please enter a name for the member to be searched'),
16+ 'invalid': _('Please enter a valid name')})
17
18 class ListNew(FieldsetForm):
19
20
21=== modified file 'src/postorius/static/postorius/css/style.css'
22--- src/postorius/static/postorius/css/style.css 2015-04-15 14:32:15 +0000
23+++ src/postorius/static/postorius/css/style.css 2015-04-15 23:31:33 +0000
24@@ -192,6 +192,9 @@
25 .btn {
26 border-radius: 2px;
27 }
28+.clear {
29+ margin-left: 0.2em;
30+}
31
32 /* tables */
33 .table .mm_action {
34
35=== modified file 'src/postorius/templates/postorius/lists/confirm_removeall_subscribers.html'
36--- src/postorius/templates/postorius/lists/confirm_removeall_subscribers.html 2015-03-22 21:57:28 +0000
37+++ src/postorius/templates/postorius/lists/confirm_removeall_subscribers.html 2015-04-15 23:31:33 +0000
38@@ -1,6 +1,11 @@
39 {% extends "postorius/base.html" %}
40 {% load url from future %}
41 {% load i18n %}
42+
43+{% block subtitle %}
44+{% trans "Confirm Unsubscribe All | " as page_title %}{{ page_title|add:address}}
45+{% endblock %}
46+
47 {% load nav_helpers %}
48
49 {% block main %}
50
51=== modified file 'src/postorius/templates/postorius/lists/mass_removal.html'
52--- src/postorius/templates/postorius/lists/mass_removal.html 2015-04-13 22:57:55 +0000
53+++ src/postorius/templates/postorius/lists/mass_removal.html 2015-04-15 23:31:33 +0000
54@@ -1,6 +1,11 @@
55 {% extends postorius_base_template %}
56 {% load url from future %}
57 {% load i18n %}
58+
59+{% block subtitle %}
60+{% trans "Mass Removal | "%}{{ page_title|add:list.fqdn_listname}}
61+{% endblock %}
62+
63 {% load nav_helpers %}
64
65 {% block main %}
66
67=== modified file 'src/postorius/templates/postorius/lists/members.html'
68--- src/postorius/templates/postorius/lists/members.html 2015-04-15 21:48:46 +0000
69+++ src/postorius/templates/postorius/lists/members.html 2015-04-15 23:31:33 +0000
70@@ -65,6 +65,15 @@
71 </table>
72
73 <h2>{% trans "Members" %}</h2>
74+
75+ <form style="float:left" action="{% url 'list_members' list.fqdn_listname %}" method="POST" class="form-inline" >{% csrf_token %}
76+ {{ search_form.search_name }}
77+ <button type="submit" class="btn">{% trans 'Search' %}</button>
78+ </form>
79+ <form action="{% url 'list_members' list.fqdn_listname %}" method="POST" class="form-inline">{% csrf_token %}
80+ <button type="submit" class="btn clear">{% trans 'Clear Filter' %}</button>
81+ </form>
82+
83 <table class="table table-bordered table-striped">
84 <thead>
85 <tr>
86@@ -74,7 +83,7 @@
87 </tr>
88 </thead>
89 <tbody>
90- {% for member in list.member_page %}
91+ {% for member in search_res %}
92 <tr>
93 <td> <a href="{% url 'list_member_options' list.fqdn_listname member.email %}">
94 {{ member.email }}</a></td>
95
96=== modified file 'src/postorius/views/list.py'
97--- src/postorius/views/list.py 2015-04-15 22:34:24 +0000
98+++ src/postorius/views/list.py 2015-04-15 23:31:33 +0000
99@@ -26,6 +26,7 @@
100 from django.core.validators import validate_email
101 from django.core.exceptions import ValidationError
102 from django.utils.decorators import method_decorator
103+from django.utils.html import strip_tags, escape
104 from django.utils.translation import gettext as _
105 from urllib2 import HTTPError
106
107@@ -77,22 +78,51 @@
108 % request.POST['moderator_email']))
109 except HTTPError as e:
110 messages.error(request, _(e.msg))
111+ if 'search_name' in request.POST:
112+ search_form = NewMemberSearchForm(request.POST)
113+ if search_form.is_valid():
114+ res = []
115+ mlist = self._get_list(list_id, page)
116+ for names in mlist.member_page:
117+ query = strip_tags(escape(request.POST['search_name']))
118+ if names.email.find(query) != -1:
119+ res.append(names)
120+ try:
121+ if len(res) == 0:
122+ messages.success(
123+ request, _('No Result Found for string \' %s \'.' % query))
124+ else:
125+ messages.success(
126+ request, _('Found %s member(s) containing string \' %s \'.' % (len(res), query)))
127+ except HTTPError as e:
128+ messages.error(request, _(e.msg))
129+ try:
130+ res
131+ except UnboundLocalError as e:
132+ res = self._get_list(list_id, page).member_page
133 owner_form = NewOwnerForm()
134 moderator_form = NewModeratorForm()
135+ search_form = NewMemberSearchForm()
136 return render_to_response('postorius/lists/members.html',
137 {'list': self.mailing_list,
138 'owner_form': owner_form,
139- 'moderator_form': moderator_form},
140+ 'moderator_form': moderator_form,
141+ 'search_form': search_form,
142+ 'search_res': res},
143 context_instance=RequestContext(request))
144
145 @method_decorator(list_owner_required)
146 def get(self, request, list_id, page=1):
147 owner_form = NewOwnerForm()
148 moderator_form = NewModeratorForm()
149+ search_form = NewMemberSearchForm()
150+ res = self._get_list(list_id, page).member_page
151 return render_to_response('postorius/lists/members.html',
152 {'list': self.mailing_list,
153 'owner_form': owner_form,
154- 'moderator_form': moderator_form},
155+ 'moderator_form': moderator_form,
156+ 'search_form': search_form,
157+ 'search_res': res},
158 context_instance=RequestContext(request))
159
160

Subscribers

People subscribed via source and target branches