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

Reply via email to