George Chatzisofroniou has proposed merging lp:~sophron/postorius/create_users
into lp:postorius.
Requested reviews:
Florian Fuchs (flo-fuchs)
For more details, see:
https://code.launchpad.net/~sophron/postorius/create_users/+merge/129567
I worked on this bug: https://bugs.launchpad.net/postorius/+bug/1058445
I added the feature to create a mailman user account, but in order to edit the
basic user data via the web interface, some additions to mailman client are
required. See, https://bugs.launchpad.net/mailman.client/+bug/1066352 and
https://bugs.launchpad.net/mailman.client/+bug/1066343.
We also need an icon for the new entry on the menu:
https://bugs.launchpad.net/postorius/+bug/1066340
I think it's better to divide the whole 'edit user' feature into smaller ones
(delete user, register addresses to a user, basic data edit, etc).
--
https://code.launchpad.net/~sophron/postorius/create_users/+merge/129567
Your team Mailman Coders is subscribed to branch lp:postorius.
=== modified file 'src/postorius/forms.py'
--- src/postorius/forms.py 2012-09-23 02:35:28 +0000
+++ src/postorius/forms.py 2012-10-13 18:17:22 +0000
@@ -534,6 +534,41 @@
"delivery_mode", "delivery_status"]]
+class UserNew(FieldsetForm):
+ """
+ Form field to add a new user
+ """
+ display_name = forms.CharField(
+ label=_('User Name'),
+ required=True,
+ error_messages={'required': _('Please enter a display name.'),
+ 'invalid': _('Please enter a valid display name.')})
+ email = forms.EmailField(
+ label=_("User's email address"),
+ error_messages={
+ 'required': _("Please enter the user's email address.")},
+ required=True)
+ password = forms.CharField(
+ label=_('Password'),
+ required=True,
+ error_messages={'required': _('Please enter a password.')},
+ widget=forms.PasswordInput(render_value=False))
+ password_repeat = forms.CharField(
+ label=_('Repeat password'),
+ required=True,
+ error_messages={'required': _('Please repeat the password.')},
+ widget=forms.PasswordInput(render_value=False))
+
+ def clean(self):
+ cleaned_data = self.cleaned_data
+ password = cleaned_data.get("password")
+ password_repeat = cleaned_data.get("password_repeat")
+ if password != password_repeat:
+ raise forms.ValidationError("Passwords must be identical.")
+
+ return cleaned_data
+
+
class UserSettings(FieldsetForm):
"""Form handling the user settings.
"""
=== modified file 'src/postorius/templates/postorius/base.html'
--- src/postorius/templates/postorius/base.html 2012-08-29 15:03:37 +0000
+++ src/postorius/templates/postorius/base.html 2012-10-13 18:17:22 +0000
@@ -24,6 +24,7 @@
<ul class="mm_metaNav">
<li><a class="mm_lists" href="{% url list_index %}">Lists</a></li>
{% if user.is_authenticated %}
+ <li><a class="mm_users" href="{% url user_index %}">Users</a></li>
<li><a class="mm_todos" href="{% url user_todos %}">Todos</a></li>
{% endif %}
{% if user.is_superuser %}
=== modified file 'src/postorius/urls.py'
--- src/postorius/urls.py 2012-09-23 12:10:25 +0000
+++ src/postorius/urls.py 2012-10-13 18:17:22 +0000
@@ -26,7 +26,7 @@
urlpatterns = patterns(
'postorius.views',
- (r'^$', 'list_index'),
+ (r'^$', 'list_index'),
# /account/
url(r'^accounts/login/$', 'user_login', name='user_login'),
url(r'^accounts/logout/$', 'user_logout', name='user_logout'),
@@ -76,4 +76,9 @@
url(r'^lists/(?P<fqdn_listname>[^/]+)/settings/(?P<visible_section>[^/]+)?'
'(?:/(?P<visible_option>.*))?$', 'list_settings',
name='list_settings'),
+ # /users/
+ url(r'^users/$', 'user_index', name='user_index'),
+ url(r'^users/new/$', 'user_new', name='user_new'),
+ url(r'^users/(?P<user_id>[^/]+)/$',
+ UserSummaryView.as_view(), name='user_summary'),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
=== modified file 'src/postorius/views/generic.py'
--- src/postorius/views/generic.py 2012-09-26 21:13:41 +0000
+++ src/postorius/views/generic.py 2012-10-13 18:17:22 +0000
@@ -47,3 +47,25 @@
if 'template' in kwargs:
self.template = kwargs['template']
return super(MailingListView, self).dispatch(request, *args, **kwargs)
+
+class MailmanUserView(TemplateView):
+ """A generic view for everything based on a mailman.client
+ list object.
+
+ Sets self.mailing_list to list object if fqdn_listname in **kwargs.
+ """
+
+ def _get_user(self, user_id):
+ return MailmanUser.objects.get_or_404(address=user_id)
+
+ def dispatch(self, request, *args, **kwargs):
+ # get the list object.
+ if 'user_id' in kwargs:
+ try:
+ self.mm_user = self._get_user(kwargs['user_id'])
+ except MailmanApiError:
+ return utils.render_api_error(request)
+ # set the template
+ if 'template' in kwargs:
+ self.template = kwargs['template']
+ return super(MailmanUserView, self).dispatch(request, *args, **kwargs)
=== modified file 'src/postorius/views/views.py'
--- src/postorius/views/views.py 2012-09-26 21:07:54 +0000
+++ src/postorius/views/views.py 2012-10-13 18:17:22 +0000
@@ -44,7 +44,7 @@
MailmanApiError, Mailman404Error)
from postorius.forms import *
from postorius.auth.decorators import list_owner_required
-from postorius.views.generic import MailingListView
+from postorius.views.generic import MailingListView, MailmanUserView
logger = logging.getLogger(__name__)
@@ -697,6 +697,59 @@
context_instance=RequestContext(request))
+class UserSummaryView(MailmanUserView):
+ """Shows a summary of a user.
+ """
+
+ def get(self, request, user_id):
+ settingsform = MembershipSettings()
+ return render_to_response('postorius/users/summary.html',
+ {'mm_user': self.mm_user,
+ 'settingsform': settingsform},
+ context_instance=RequestContext(request))
+
+
+@login_required
+def user_index(request, template='postorius/users/index.html'):
+ """Show a table of all users.
+ """
+ error = None
+ try:
+ mm_users = MailmanUser.objects.all()
+ except MailmanApiError:
+ return utils.render_api_error(request)
+ return render_to_response(template,
+ {'error': error,
+ 'mm_users': mm_users},
+ context_instance=RequestContext(request))
+
+
+@login_required
+@user_passes_test(lambda u: u.is_superuser)
+def user_new(request):
+ message = None
+ if request.method == 'POST':
+ form = UserNew(request.POST)
+ if form.is_valid():
+ user = MailmanUser(display_name=form.cleaned_data['display_name'],
+ email=form.cleaned_data['email'],
+ password=form.cleaned_data['password'])
+ try:
+ user.save()
+ except MailmanApiError:
+ return utils.render_api_error(request)
+ except HTTPError, e:
+ messages.error(request, e)
+ else:
+ messages.success(request, _("New User registered"))
+ return redirect("user_index")
+ else:
+ form = UserNew()
+ return render_to_response('postorius/users/new.html',
+ {'form': form, 'message': message},
+ context_instance=RequestContext(request))
+
+
def user_logout(request):
logout(request)
return redirect('user_login')
_______________________________________________
Mailman-coders mailing list
[email protected]
http://mail.python.org/mailman/listinfo/mailman-coders