Просмотр исходного кода

Little cleanup in admin widgets

Ralfp 12 лет назад
Родитель
Сommit
215dd998ad

+ 71 - 65
misago/admin/widgets.py

@@ -48,17 +48,17 @@ class BaseWidget(object):
     def get_id(self):
         return 'admin_%s' % self.id
          
-    def get_template(self, template):
-        return ('%s/%s.html' % (self.admin.id, template),
-                'admin/%s.html' % template)
+    def get_template(self):
+        return ('%s/%s.html' % (self.admin.id, self.template),
+                'admin/%s.html' % self.template)
     
     def add_template_variables(self, variables):
         return variables
             
-    def get_fallback_url(self, request):
+    def get_fallback_url(self):
         return reverse(self.fallback)
         
-    def get_target(self, request, model):
+    def get_target(self, model):
         pass
     
     def get_target_name(self, model):
@@ -69,15 +69,15 @@ class BaseWidget(object):
         except AttributeError:
             return None
         
-    def get_and_validate_target(self, request, target):
+    def get_and_validate_target(self, target):
         try:
             model = self.admin.model.objects.select_related().get(pk=target)
-            self.get_target(request, model)
+            self.get_target(model)
             return model
         except self.admin.model.DoesNotExist:
-            request.messages.set_flash(Message(self.notfound_message), 'error', self.admin.id)
+            self.request.messages.set_flash(Message(self.notfound_message), 'error', self.admin.id)
         except ValueError as e:
-            request.messages.set_flash(Message(e.args[0]), 'error', self.admin.id)
+            self.request.messages.set_flash(Message(e.args[0]), 'error', self.admin.id)
         return None
 
 
@@ -100,7 +100,7 @@ class ListWidget(BaseWidget):
     nothing_checked_message = _('You have to select at least one item.')
     prompt_select = False
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         """
         Provides request and item, should return list of tuples with item actions in following format:
         (id, name, help, icon, link)
@@ -121,7 +121,7 @@ class ListWidget(BaseWidget):
                 'prompt': prompt,
                 }
         
-    def get_search_form(self, request):
+    def get_search_form(self):
         """
         Build a form object with items search
         """
@@ -133,13 +133,13 @@ class ListWidget(BaseWidget):
         """
         return None
     
-    def get_table_form(self, request, page_items):
+    def get_table_form(self, page_items):
         """
         Build a form object with list of all items fields
         """
         return None
     
-    def table_action(self, request, page_items, cleaned_data):
+    def table_action(self, page_items, cleaned_data):
         """
         Handle table form submission, return tuple containing message and redirect link/false
         """
@@ -162,7 +162,7 @@ class ListWidget(BaseWidget):
         form_fields['list_items'] = forms.MultipleChoiceField(choices=list_choices,widget=forms.CheckboxSelectMultiple)
         return type('AdminListForm', (Form,), form_fields)
         
-    def get_sorting(self, request):
+    def get_sorting(self):
         """
         Return list sorting method.
         A list with three values:
@@ -171,18 +171,18 @@ class ListWidget(BaseWidget):
         - order_by() argument
         """
         sorting_method = None
-        if request.session.get(self.get_token('sort')) and request.session.get(self.get_token('sort'))[0] in self.sortables:
-            sorting_method = request.session.get(self.get_token('sort'))
+        if self.request.session.get(self.get_token('sort')) and self.request.session.get(self.get_token('sort'))[0] in self.sortables:
+            sorting_method = self.request.session.get(self.get_token('sort'))
             
-        if request.GET.get('sort') and request.GET.get('sort') in self.sortables:
-            new_sorting = request.GET.get('sort')
-            sorting_dir = int(request.GET.get('dir')) == 1
+        if self.request.GET.get('sort') and self.request.GET.get('sort') in self.sortables:
+            new_sorting = self.request.GET.get('sort')
+            sorting_dir = int(self.request.GET.get('dir')) == 1
             sorting_method = [
                     new_sorting,
                     sorting_dir,
                     new_sorting if sorting_dir else '-%s' % new_sorting
                    ]
-            request.session[self.get_token('sort')] = sorting_method
+            self.request.session[self.get_token('sort')] = sorting_method
             
         if not sorting_method:
             if self.sortables:
@@ -202,13 +202,13 @@ class ListWidget(BaseWidget):
                        ]
         return sorting_method
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by(sorting_method[2])
     
     def get_pagination_url(self, page):
         return reverse(self.admin.get_action_attr(self.id, 'route'), kwargs={'page': page})
     
-    def get_pagination(self, request, total, page):
+    def get_pagination(self, total, page):
         """
         Return list pagination.
         A list with three values:
@@ -225,8 +225,8 @@ class ListWidget(BaseWidget):
         
         # Set basic pagination, use either Session cache or new page value
         pagination = {'start': 0, 'stop': 0, 'prev': -1, 'next': -1}
-        if request.session.get(self.get_token('pagination')):
-            pagination['start'] = request.session.get(self.get_token('pagination'))
+        if self.request.session.get(self.get_token('pagination')):
+            pagination['start'] = self.request.session.get(self.get_token('pagination'))
         page = int(page)
         if page > 0:
             pagination['start'] = (page - 1) * self.pagination
@@ -250,18 +250,20 @@ class ListWidget(BaseWidget):
         pagination['stop'] = pagination['start'] + self.pagination
         return pagination
     
-    def get_items(self, request):
-        if request.session.get(self.get_token('filter')):
+    def get_items(self):
+        if self.request.session.get(self.get_token('filter')):
             self.is_filtering = True
-            return self.set_filters(self.admin.model.objects, request.session.get(self.get_token('filter')))
+            return self.set_filters(self.admin.model.objects, self.request.session.get(self.get_token('filter')))
         return self.admin.model.objects
             
     def __call__(self, request, page=0):
         """
         Use widget as view
         """
+        self.request = request
+        
         # Get basic list items
-        items_total = self.get_items(request)
+        items_total = self.get_items()
             
         # Set extra filters?
         try:
@@ -270,11 +272,11 @@ class ListWidget(BaseWidget):
             items_total = items_total.count()
             
         # Set sorting and paginating
-        sorting_method = self.get_sorting(request)
-        paginating_method = self.get_pagination(request, items_total, page)
+        sorting_method = self.get_sorting()
+        paginating_method = self.get_pagination(items_total, page)
         
         # List items
-        items = self.get_items(request)
+        items = self.get_items()
         if not request.session.get(self.get_token('filter')):
             items = items.all()
          
@@ -285,7 +287,7 @@ class ListWidget(BaseWidget):
             pass
                   
         # Sort them
-        items = self.sort_items(request, items, sorting_method);
+        items = self.sort_items(items, sorting_method);
         
         # Set pagination
         if self.pagination:
@@ -302,7 +304,7 @@ class ListWidget(BaseWidget):
         
         # See if we should make and handle search form
         search_form = None
-        SearchForm = self.get_search_form(request)
+        SearchForm = self.get_search_form()
         if SearchForm:
             if request.method == 'POST':
                 # New search
@@ -337,12 +339,12 @@ class ListWidget(BaseWidget):
         
         # See if we sould make and handle tab form
         table_form = None
-        TableForm = self.get_table_form(request, items)
+        TableForm = self.get_table_form(items)
         if TableForm:
             if request.method == 'POST' and request.POST.get('origin') == 'table':
                 table_form = TableForm(request.POST, request=request)
                 if table_form.is_valid():
-                    message, redirect_url = self.table_action(request, items, table_form.cleaned_data)
+                    message, redirect_url = self.table_action(items, table_form.cleaned_data)
                     if redirect_url:
                         request.messages.set_flash(message, message.type, self.admin.id)
                         return redirect(redirect_url)
@@ -360,7 +362,7 @@ class ListWidget(BaseWidget):
                 if list_form.is_valid():
                     try:
                         form_action = getattr(self, 'action_' + list_form.cleaned_data['list_action'])
-                        message, redirect_url = form_action(request, items, list_form.cleaned_data['list_items'])
+                        message, redirect_url = form_action(items, list_form.cleaned_data['list_items'])
                         if redirect_url:
                             request.messages.set_flash(message, message.type, self.admin.id)
                             return redirect(redirect_url)
@@ -378,7 +380,7 @@ class ListWidget(BaseWidget):
                 list_form = ListForm(request=request)
                 
         # Render list
-        return request.theme.render_to_response(self.get_template(self.template),
+        return request.theme.render_to_response(self.get_template(),
                                                 self.add_template_variables({
                                                  'admin': self.admin,
                                                  'action': self,
@@ -411,91 +413,93 @@ class FormWidget(BaseWidget):
     original_name = None
     submit_fallback = False
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse(self.admin.get_action_attr(self.id, 'route'))
     
-    def get_form(self, request, target):
+    def get_form(self, target):
         return self.form
     
-    def get_form_instance(self, form, request, target, initial, post=False):
+    def get_form_instance(self, form, target, initial, post=False):
         if post:
-            return form(request.POST, request=request, initial=self.get_initial_data(request, target))
-        return form(request=request, initial=self.get_initial_data(request, target))
+            return form(self.request.POST, request=self.request, initial=self.get_initial_data(target))
+        return form(request=self.request, initial=self.get_initial_data(target))
     
-    def get_layout(self, request, form, model):
+    def get_layout(self, form, model):
         if self.layout:
             return self.layout
         return form.layout
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {}
     
-    def submit_form(self, request, form, model):
+    def submit_form(self, form, model):
         """
         Handle form submission, ALWAYS return tuple with model and message
         """
         pass
     
     def __call__(self, request, target=None, slug=None):
+        self.request = request
+        
         # Fetch target?
         model = None
         if target:
-            model = self.get_and_validate_target(request, target)
+            model = self.get_and_validate_target(target)
             self.original_name = self.get_target_name(model)
             if not model:
-                return redirect(self.get_fallback_url(request))
+                return redirect(self.get_fallback_url())
         original_model = model
         
         # Get form type to instantiate
-        FormType = self.get_form(request, model)
+        FormType = self.get_form(model)
         
         #Submit form
         message = None
         if request.method == 'POST':
-            form = self.get_form_instance(FormType, request, model, self.get_initial_data(request, model), True)
+            form = self.get_form_instance(FormType, model, self.get_initial_data(model), True)
             if form.is_valid():
                 try:
-                    model, message = self.submit_form(request, form, model)
+                    model, message = self.submit_form(form, model)
                     if message.type != 'error':
                         request.messages.set_flash(message, message.type, self.admin.id)
                         # Redirect back to right page
                         try:
                             if 'save_new' in request.POST and self.get_new_url:
-                                return redirect(self.get_new_url(request, model))
+                                return redirect(self.get_new_url(model))
                         except AttributeError:
                             pass
                         try:
                             if 'save_edit' in request.POST and self.get_edit_url:
-                                return redirect(self.get_edit_url(request, model))
+                                return redirect(self.get_edit_url(model))
                         except AttributeError:
                             pass
                         try:
                             if self.get_submit_url:
-                                return redirect(self.get_submit_url(request, model))
+                                return redirect(self.get_submit_url(model))
                         except AttributeError:
                             pass
-                        return redirect(self.get_fallback_url(request))
+                        return redirect(self.get_fallback_url())
                 except ValidationError as e:
                     message = Message(e.messages[0], 'error')
             else:
                 message = Message(form.non_field_errors()[0], 'error')
         else:
-            form = self.get_form_instance(FormType, request, model, self.get_initial_data(request, model))
+            form = self.get_form_instance(FormType, model, self.get_initial_data(model))
             
         # Render form
-        return request.theme.render_to_response(self.get_template(self.template),
+        return request.theme.render_to_response(self.get_template(),
                                                 self.add_template_variables({
                                                  'admin': self.admin,
                                                  'action': self,
                                                  'request': request,
-                                                 'url': self.get_url(request, model),
-                                                 'fallback': self.get_fallback_url(request),
+                                                 'url': self.get_url(model),
+                                                 'fallback': self.get_fallback_url(),
                                                  'messages_log': request.messages.get_messages(self.admin.id),
                                                  'message': message,
                                                  'tabbed': self.tabbed,
                                                  'target': self.get_target_name(original_model),
                                                  'target_model': original_model,
-                                                 'form': FormLayout(form, self.get_layout(request, form, target)),
+                                                 'form': FormLayout(form, self.get_layout(form, target)),
                                                 }),
                                                 context_instance=RequestContext(request));
 
@@ -510,27 +514,29 @@ class ButtonWidget(BaseWidget):
     - Widget does action and redirects us back to fallback url
     """
     def __call__(self, request, target=None, slug=None):
+        self.request = request
+        
         # Fetch target?
         model = None
         if target:
-            model = self.get_and_validate_target(request, target)
+            model = self.get_and_validate_target(target)
             if not model:
-                return redirect(self.get_fallback_url(request))
+                return redirect(self.get_fallback_url())
         original_model = model
             
         # Crash if this is invalid request
         if not request.csrf.request_secure(request):
             request.messages.set_flash(Message(_("Action authorization is invalid.")), 'error', self.admin.id)
-            return redirect(self.get_fallback_url(request))
+            return redirect(self.get_fallback_url())
         
         # Do something
-        message, url = self.action(request, model)
+        message, url = self.action(model)
         request.messages.set_flash(message, message.type, self.admin.id)
         if url:
             return redirect(url)
-        return redirect(self.get_fallback_url(request))
+        return redirect(self.get_fallback_url())
         
-    def action(self, request, target):
+    def action(self, target):
         """
         Action to be executed when button is pressed
         Define custom one in your Admin action.

+ 15 - 15
misago/banning/views.py

@@ -67,15 +67,15 @@ class List(ListWidget):
             model = model.filter(type__in=filters['type'])
         return model
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('pencil', _("Edit Ban"), reverse('admin_bans_edit', item)),
                 self.action('remove', _("Lift Ban"), reverse('admin_bans_delete', item), post=True, prompt=_("Are you sure you want to lift this ban?")),
                 )
 
-    def action_delete(self, request, items, checked):
+    def action_delete(self, items, checked):
         Ban.objects.filter(id__in=checked).delete()
-        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
         return Message(_('Selected bans have been lifted successfully.'), 'success'), reverse('admin_bans')
     
 
@@ -89,13 +89,13 @@ class New(FormWidget):
     form = BanForm
     submit_button = _("Set Ban")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_bans_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_bans_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_ban = Ban(
                       type = form.cleaned_data['type'],
                       ban = form.cleaned_data['ban'],
@@ -104,7 +104,7 @@ class New(FormWidget):
                       expires = form.cleaned_data['expires']
                      )
         new_ban.save(force_insert=True)
-        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
         return new_ban, Message(_('New Ban has been set.'), 'success')
     
    
@@ -121,13 +121,13 @@ class Edit(FormWidget):
     notfound_message = _('Requested Ban could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_bans_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'type': model.type,
                 'ban': model.ban,
@@ -136,14 +136,14 @@ class Edit(FormWidget):
                 'expires': model.expires,
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.type = form.cleaned_data['type']
         target.ban = form.cleaned_data['ban']
         target.reason_user = form.cleaned_data['reason_user']
         target.reason_admin = form.cleaned_data['reason_admin']
         target.expires = form.cleaned_data['expires']
         target.save(force_update=True)
-        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
         return target, Message(_('Changes in ban have been saved.'), 'success')
 
 
@@ -156,9 +156,9 @@ class Delete(ButtonWidget):
     fallback = 'admin_bans'
     notfound_message = _('Requested Ban could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         target.delete()
-        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
         if target.type == 0:
             return Message(_('E-mail and username Ban "%(ban)s" has been lifted.') % {'ban': target.ban}, 'success'), False
         if target.type == 1:

+ 22 - 22
misago/forumroles/views.py

@@ -28,18 +28,18 @@ class List(ListWidget):
              ('delete', _("Delete selected forum roles"), _("Are you sure you want to delete selected roles?")),
              )
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('name')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('adjust', _("Role Permissions"), reverse('admin_roles_forums_acl', item)),
                 self.action('pencil', _("Edit Role"), reverse('admin_roles_forums_edit', item)),
                 self.action('remove', _("Delete Role"), reverse('admin_roles_forums_delete', item), post=True, prompt=_("Are you sure you want to delete this role?")),
                 )
 
-    def action_delete(self, request, items, checked):
-        request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+    def action_delete(self, items, checked):
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         Role.objects.filter(id__in=checked).delete()
         return Message(_('Selected forum roles have been deleted successfully.'), 'success'), reverse('admin_roles_forums')
 
@@ -51,13 +51,13 @@ class New(FormWidget):
     form = ForumRoleForm
     submit_button = _("Save Role")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_roles_forums_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_roles_forums_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_role = ForumRole(
                       name = form.cleaned_data['name'],
                      )
@@ -75,18 +75,18 @@ class Edit(FormWidget):
     notfound_message = _('Requested Forum Role could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_roles_forums_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'name': model.name,
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
         target.save(force_update=True)
         return target, Message(_('Changes in forum role "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
@@ -102,17 +102,17 @@ class ACL(FormWidget):
     submit_fallback = True
     template = 'acl_form'
     
-    def get_form(self, request, target):
-        self.form = build_forum_form(request, target)
+    def get_form(self, target):
+        self.form = build_forum_form(target)
         return self.form
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_roles_forums_acl', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         raw_acl = model.get_permissions()
         initial = {}
         for field in self.form.base_fields:
@@ -120,13 +120,13 @@ class ACL(FormWidget):
                 initial[field] = raw_acl[field]
         return initial
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         raw_acl = target.get_permissions()
         for perm in form.cleaned_data:
             raw_acl[perm] = form.cleaned_data[perm]
         target.set_permissions(raw_acl)
         target.save(force_update=True)
-        request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         
         return target, Message(_('Forum Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, 'success')
 
@@ -137,7 +137,7 @@ class Delete(ButtonWidget):
     fallback = 'admin_roles_forums'
     notfound_message = _('Requested Forum Role could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         target.delete()
-        request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         return Message(_('Forum Role "%(name)s" has been deleted.') % {'name': _(target.name)}, 'success'), False

+ 32 - 32
misago/forums/views.py

@@ -29,13 +29,13 @@ class List(ListWidget):
              )
     empty_message = _('No forums are currently defined.')
     
-    def get_items(self, request):
+    def get_items(self):
         return self.admin.model.objects.get(token='root').get_descendants()
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('lft')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         if item.type == 'category':
             return (
                     self.action('chevron-up', _("Move Category Up"), reverse('admin_forums_up', item), post=True),
@@ -59,10 +59,10 @@ class List(ListWidget):
                 self.action('remove', _("Delete Redirect"), reverse('admin_forums_delete', item)),
                 )
 
-    def action_resync(self, request, items, checked):
+    def action_resync(self, items, checked):
         return Message(_('Selected forums have been resynchronised successfully.'), 'success'), reverse('admin_forums')
 
-    def action_prune(self, request, items, checked):
+    def action_prune(self, items, checked):
         return Message(_('Selected forums have been pruned successfully.'), 'success'), reverse('admin_forums')
 
 
@@ -73,13 +73,13 @@ class NewCategory(FormWidget):
     form = CategoryForm
     submit_button = _("Save Category")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_forums_new_category')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_forums_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_forum = Forum(
                      name=form.cleaned_data['name'],
                      slug=slugify(form.cleaned_data['name']),
@@ -92,7 +92,7 @@ class NewCategory(FormWidget):
         
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
-            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             
         return new_forum, Message(_('New Category has been created.'), 'success')
 
@@ -104,13 +104,13 @@ class NewForum(FormWidget):
     form = ForumForm
     submit_button = _("Save Forum")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_forums_new_forum')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_forums_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_forum = Forum(
                      name=form.cleaned_data['name'],
                      slug=slugify(form.cleaned_data['name']),
@@ -125,14 +125,14 @@ class NewForum(FormWidget):
         
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
-            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             
         return new_forum, Message(_('New Forum has been created.'), 'success')
 
     def __call__(self, request):
         if self.admin.model.objects.get(token='root').get_descendants().count() == 0:
             request.messages.set_flash(Message(_("You have to create at least one category before you will be able to create forums.")), 'error', self.admin.id)
-            return redirect(self.get_fallback_url(request))
+            return redirect(self.get_fallback_url())
         return super(NewForum, self).__call__(request)
 
 
@@ -143,13 +143,13 @@ class NewRedirect(FormWidget):
     form = RedirectForm
     submit_button = _("Save Forum")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_forums_new_redirect')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_forums_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_forum = Forum(
                      name=form.cleaned_data['name'],
                      slug=slugify(form.cleaned_data['name']),
@@ -162,14 +162,14 @@ class NewRedirect(FormWidget):
         
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
-            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             
         return new_forum, Message(_('New Redirect has been created.'), 'success')
     
     def __call__(self, request):
         if self.admin.model.objects.get(token='root').get_descendants().count() == 0:
             request.messages.set_flash(Message(_("You have to create at least one category before you will be able to create redirects.")), 'error', self.admin.id)
-            return redirect(self.get_fallback_url(request))
+            return redirect(self.get_fallback_url())
         return super(NewRedirect, self).__call__(request)
 
 
@@ -179,7 +179,7 @@ class Up(ButtonWidget):
     fallback = 'admin_forums'
     notfound_message = _('Requested Forum could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         previous_sibling = target.get_previous_sibling()
         if previous_sibling:
             target.move_to(previous_sibling, 'left')
@@ -193,7 +193,7 @@ class Down(ButtonWidget):
     fallback = 'admin_forums'
     notfound_message = _('Requested Forum could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         next_sibling = target.get_next_sibling()
         if next_sibling:
             target.move_to(next_sibling, 'right')
@@ -211,13 +211,13 @@ class Edit(FormWidget):
     notfound_message = _('Requested Forum could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_forums_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_form(self, request, target):
+    def get_form(self, target):
         if target.type == 'category':
             self.name= _("Edit Category")
             self.form = CategoryForm
@@ -231,7 +231,7 @@ class Edit(FormWidget):
         
         return self.form
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         initial = {
                    'parent': model.parent,
                    'name': model.name,
@@ -250,7 +250,7 @@ class Edit(FormWidget):
         
         return initial
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
         target.set_description(form.cleaned_data['description'])
         if target.type == 'redirect':
@@ -265,7 +265,7 @@ class Edit(FormWidget):
             
         if form.cleaned_data['parent'].pk != target.parent.pk:
             target.move_to(form.cleaned_data['parent'], 'last-child')
-            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             
         target.save(force_update=True)
             
@@ -273,7 +273,7 @@ class Edit(FormWidget):
             target.copy_permissions(form.cleaned_data['perms'])
         
         if form.cleaned_data['parent'].pk != target.parent.pk or form.cleaned_data['perms']:
-            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         
         return target, Message(_('Changes in forum "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
 
@@ -289,10 +289,10 @@ class Delete(FormWidget):
     notfound_message = _('Requested Forum could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_forums_delete', model)
    
-    def get_form(self, request, target):
+    def get_form(self, target):
         if target.type == 'category':
             self.name= _("Delete Category")
         if target.type == 'redirect':
@@ -304,7 +304,7 @@ class Delete(FormWidget):
         
         return self.form
         
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_parent = form.cleaned_data['parent']
         if new_parent:
             target.move_content(new_parent)

+ 12 - 12
misago/newsletters/views.py

@@ -33,7 +33,7 @@ class List(ListWidget):
     pagination = 20
     search_form = SearchNewslettersForm
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('-id')
     
     def set_filters(self, model, filters):
@@ -47,14 +47,14 @@ class List(ListWidget):
             model = model.filter(Q(content_html__icontains=filters['content']) | Q(content_plain__icontains=filters['content']))
         return model
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('envelope', _("Send Newsletter"), reverse('admin_newsletters_send', item)),
                 self.action('pencil', _("Edit Newsletter"), reverse('admin_newsletters_edit', item)),
                 self.action('remove', _("Delete Newsletter"), reverse('admin_newsletters_delete', item), post=True, prompt=_("Are you sure you want to delete this newsletter?")),
                 )
 
-    def action_delete(self, request, items, checked):
+    def action_delete(self, items, checked):
         Newsletter.objects.filter(id__in=checked).delete()
         return Message(_('Selected newsletters have been deleted successfully.'), 'success'), reverse('admin_newsletters')
 
@@ -67,13 +67,13 @@ class New(FormWidget):
     submit_button = _("Save Newsletter")
     tabbed = True
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_newsletters_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_newsletters_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_newsletter = Newsletter(
                       name = form.cleaned_data['name'],
                       step_size = form.cleaned_data['step_size'],
@@ -102,13 +102,13 @@ class Edit(FormWidget):
     submit_fallback = True
     tabbed = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_newsletters_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'name': model.name,
                 'step_size': model.step_size,
@@ -118,7 +118,7 @@ class Edit(FormWidget):
                 'ranks': model.ranks.all(),
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
         target.step_size = form.cleaned_data['step_size']
         target.ignore_subscriptions = form.cleaned_data['ignore_subscriptions']
@@ -140,7 +140,7 @@ class Delete(ButtonWidget):
     fallback = 'admin_newsletters'
     notfound_message = _('Requested newsletter could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         target.delete()
         return Message(_('Newsletter "%(name)s"" has been deleted.') % {'name': target.name}, 'success'), False
     

+ 22 - 20
misago/prune/views.py

@@ -27,18 +27,18 @@ class List(ListWidget):
              ('delete', _("Delete selected policies"), _("Are you sure you want to delete selected policies?")),
              )
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('name')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('filter', _("Apply Policy"), reverse('admin_prune_users_apply', item)),
                 self.action('pencil', _("Edit Policy"), reverse('admin_prune_users_edit', item)),
                 self.action('remove', _("Delete Policy"), reverse('admin_prune_users_delete', item), post=True, prompt=_("Are you sure you want to delete this policy?")),
                 )
 
-    def action_delete(self, request, items, checked):
-        if not request.user.is_god():
+    def action_delete(self, items, checked):
+        if not self.request.user.is_god():
             return Message(_('Only system administrators can delete pruning policies.'), 'error'), reverse('admin_prune_users')
         
         Policy.objects.filter(id__in=checked).delete()
@@ -52,13 +52,13 @@ class New(FormWidget):
     form = PolicyForm
     submit_button = _("Save Policy")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_prune_users_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_prune_users_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_policy = Policy(
                       name = form.cleaned_data['name'],
                       email = form.cleaned_data['email'],
@@ -89,13 +89,13 @@ class Edit(FormWidget):
     notfound_message = _('Requested pruning policy could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_prune_users_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'name': model.name,
                 'email': model.email,
@@ -104,7 +104,7 @@ class Edit(FormWidget):
                 'last_visit': model.last_visit,
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
         target.email = form.cleaned_data['email']
         target.posts = form.cleaned_data['posts']
@@ -129,8 +129,8 @@ class Delete(ButtonWidget):
     fallback = 'admin_prune_users'
     notfound_message = _('Requested pruning policy could not be found.')
     
-    def action(self, request, target):
-        if not request.user.is_god():
+    def action(self, target):
+        if not self.request.user.is_god():
             return Message(_('Only system administrators can delete pruning policies.'), 'error'), False
         
         target.delete()
@@ -148,17 +148,19 @@ class Apply(FormWidget):
     submit_fallback = True
     template = 'apply'
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_prune_users_apply', model)
     
     def __call__(self, request, target=None, slug=None):
+        self.request = request
+        
         # Fetch target
         model = None
         if target:
-            model = self.get_and_validate_target(request, target)
+            model = self.get_and_validate_target(target)
             self.original_name = self.get_target_name(model)
             if not model:
-                return redirect(self.get_fallback_url(request))
+                return redirect(self.get_fallback_url())
         original_model = model
                 
         # Set filter
@@ -193,13 +195,13 @@ class Apply(FormWidget):
             else:
                 message = Message(_("Request authorization is invalid. Please resubmit your form."), 'error')
         
-        return request.theme.render_to_response(self.get_template(self.template),
+        return request.theme.render_to_response(self.get_template(),
                                                 {
                                                  'admin': self.admin,
                                                  'action': self,
                                                  'request': request,
-                                                 'url': self.get_url(request, model),
-                                                 'fallback': self.get_fallback_url(request),
+                                                 'url': self.get_url(model),
+                                                 'fallback': self.get_fallback_url(),
                                                  'messages': request.messages.get_messages(self.admin.id),
                                                  'message': message,
                                                  'tabbed': self.tabbed,

+ 14 - 14
misago/ranks/views.py

@@ -28,7 +28,7 @@ class List(ListWidget):
              ('delete', _("Delete selected ranks"), _("Are you sure you want to delete selected ranks?")),
              )
     
-    def get_table_form(self, request, page_items):
+    def get_table_form(self, page_items):
         order_form = {}
         
         # Build choices list
@@ -45,22 +45,22 @@ class List(ListWidget):
         # Turn dict into object
         return type('OrderRanksForm', (Form,), order_form)
     
-    def table_action(self, request, page_items, cleaned_data):
+    def table_action(self, page_items, cleaned_data):
         for item in page_items:
             item.order = cleaned_data['pos_' + str(item.pk)]
             item.save(force_update=True)
         return Message(_('Ranks order has been changed'), 'success'), reverse('admin_ranks')
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('order')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('pencil', _("Edit Rank"), reverse('admin_ranks_edit', item)),
                 self.action('remove', _("Delete Rank"), reverse('admin_ranks_delete', item), post=True, prompt=_("Are you sure you want to delete this rank?")),
                 )
 
-    def action_delete(self, request, items, checked):
+    def action_delete(self, items, checked):
         Rank.objects.filter(id__in=checked).delete()
         return Message(_('Selected ranks have been deleted successfully.'), 'success'), reverse('admin_ranks')
 
@@ -72,13 +72,13 @@ class New(FormWidget):
     form = RankForm
     submit_button = _("Save Rank")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_ranks_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_ranks_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         position = 0
         last_rank = Rank.objects.latest('order')
         new_rank = Rank(
@@ -106,13 +106,13 @@ class Edit(FormWidget):
     notfound_message = _('Requested Rank could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_ranks_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'name': model.name,
                 'description': model.description,
@@ -123,7 +123,7 @@ class Edit(FormWidget):
                 'criteria': model.criteria
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
         target.name_slug = slugify(form.cleaned_data['name'])
         target.description = form.cleaned_data['description']
@@ -142,6 +142,6 @@ class Delete(ButtonWidget):
     fallback = 'admin_ranks'
     notfound_message = _('Requested Rank could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         target.delete()
         return Message(_('Rank "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False

+ 39 - 37
misago/roles/views.py

@@ -31,10 +31,10 @@ class List(ListWidget):
              ('delete', _("Delete selected roles"), _("Are you sure you want to delete selected roles?")),
              )
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('name')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('list', _("Forums Permissions"), reverse('admin_roles_masks', item)),
                 self.action('adjust', _("Role Permissions"), reverse('admin_roles_acl', item)),
@@ -42,12 +42,12 @@ class List(ListWidget):
                 self.action('remove', _("Delete Role"), reverse('admin_roles_delete', item), post=True, prompt=_("Are you sure you want to delete this role?")),
                 )
 
-    def action_delete(self, request, items, checked):
+    def action_delete(self, items, checked):
         for item in items:
             if unicode(item.pk) in checked:
                 if item.token:
                     return Message(_('You cannot delete system roles.'), 'error'), reverse('admin_roles')
-                if item.protected and not request.user.is_god():
+                if item.protected and not self.request.user.is_god():
                     return Message(_('You cannot delete protected roles.'), 'error'), reverse('admin_roles')
                 if item.user_set.count() > 0:
                     return Message(_('You cannot delete roles that are assigned to users.'), 'error'), reverse('admin_roles')
@@ -63,13 +63,13 @@ class New(FormWidget):
     form = RoleForm
     submit_button = _("Save Role")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_roles_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_roles_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_role = Role(
                       name = form.cleaned_data['name'],
                      )
@@ -88,30 +88,30 @@ class Edit(FormWidget):
     notfound_message = _('Requested Role could not be found.')
     submit_fallback = True
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_roles_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
-        if request.user.is_god():
+    def get_initial_data(self, model):
+        if self.request.user.is_god():
             return {'name': model.name, 'protected': model.protected}
         return {'name': model.name}
     
-    def get_and_validate_target(self, request, target):
-        result = super(Edit, self).get_and_validate_target(request, target)
-        if result and result.protected and not request.user.is_god():
-            request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
+    def get_and_validate_target(self, target):
+        result = super(Edit, self).get_and_validate_target(target)
+        if result and result.protected and not self.request.user.is_god():
+            self.request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
             return None
         return result
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.name = form.cleaned_data['name']
-        if request.user.is_god():
+        if self.request.user.is_god():
             target.protected = form.cleaned_data['protected']
         target.save(force_update=True)
-        request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         return target, Message(_('Changes in role "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
 
 
@@ -127,17 +127,17 @@ class Forums(ListWidget):
     def get_url(self):
         return reverse('admin_roles_masks', self.role) 
     
-    def get_items(self, request):
+    def get_items(self):
         return Forum.objects.get(token='root').get_descendants()
     
-    def sort_items(self, request, page_items, sorting_method):
+    def sort_items(self, page_items, sorting_method):
         return page_items.order_by('lft')
 
     def add_template_variables(self, variables):
         variables['target'] = _(self.role.name)
         return variables
     
-    def get_table_form(self, request, page_items):
+    def get_table_form(self, page_items):
         perms = {}
         try:
             forums = self.role.get_permissions()['forums']
@@ -157,7 +157,7 @@ class Forums(ListWidget):
         # Turn dict into object
         return type('ChangeForumRolesForm', (Form,), perms_form)
     
-    def table_action(self, request, page_items, cleaned_data):
+    def table_action(self, page_items, cleaned_data):
         perms = {}
         for item in page_items:
             if cleaned_data['forum_' + str(item.pk)] != "0":
@@ -170,6 +170,7 @@ class Forums(ListWidget):
         return Message(_('Forum permissions have been saved.'), 'success'), self.get_url()
         
     def __call__(self, request, slug, target):
+        self.request = request
         try:
             self.role = Role.objects.get(id=target)
             if self.role and self.role.protected and not request.user.is_god():
@@ -184,6 +185,7 @@ class Forums(ListWidget):
             return redirect(reverse('admin_roles'))
         return super(Forums, self).__call__(request)
 
+
 class ACL(FormWidget):
     admin = site.get_action('roles')
     id = 'acl'
@@ -195,17 +197,17 @@ class ACL(FormWidget):
     submit_fallback = True
     template = 'acl_form'
     
-    def get_form(self, request, target):
-        self.form = build_form(request, target)
+    def get_form(self, target):
+        self.form = build_form(target)
         return self.form
     
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_roles_acl', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         raw_acl = model.get_permissions()
         initial = {}
         for field in self.form.base_fields:
@@ -213,20 +215,20 @@ class ACL(FormWidget):
                 initial[field] = raw_acl[field]
         return initial
     
-    def get_and_validate_target(self, request, target):
-        result = super(ACL, self).get_and_validate_target(request, target)
-        if result and result.protected and not request.user.is_god():
-            request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
+    def get_and_validate_target(self, target):
+        result = super(ACL, self).get_and_validate_target(target)
+        if result and result.protected and not self.request.user.is_god():
+            self.request.messages.set_flash(Message(_('Role "%(name)s" is protected, you cannot edit it.') % {'name': _(result.name)}), 'error', self.admin.id)
             return None
         return result
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         raw_acl = target.get_permissions()
         for perm in form.cleaned_data:
             raw_acl[perm] = form.cleaned_data[perm]
         target.set_permissions(raw_acl)
         target.save(force_update=True)
-        request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         
         return target, Message(_('Role "%(name)s" permissions have been changed.') % {'name': self.original_name}, 'success')
 
@@ -237,10 +239,10 @@ class Delete(ButtonWidget):
     fallback = 'admin_roles'
     notfound_message = _('Requested Role could not be found.')
     
-    def action(self, request, target):
+    def action(self, target):
         if target.token:
             return Message(_('You cannot delete system roles.'), 'error'), reverse('admin_roles')
-        if target.protected and not request.user.is_god():
+        if target.protected and not self.request.user.is_god():
             return Message(_('This role is protected.'), 'error'), reverse('admin_roles')
         if target.user_set.count() > 0:
             return Message(_('This role is assigned to one or more users.'), 'error'), reverse('admin_roles')

+ 5 - 5
misago/threads/urls.py

@@ -1,9 +1,9 @@
 from django.conf.urls import patterns, url
 
 urlpatterns = patterns('misago.threads.views',
-    url(r'^forum/(?P<slug>(\w|-)+)-(?P<forum>\d+)/$', 'threads', name="forum"),
-    url(r'^forum/(?P<slug>(\w|-)+)-(?P<forum>\d+)/(?P<page>\d+)/$', 'threads', name="forum"),
-    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/$', 'thread', name="thread"),
-    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<page>\d+)/$', 'thread', name="topic"),
-    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/reply/$', 'thread', name="topic_reply"),
+    url(r'^forum/(?P<slug>(\w|-)+)-(?P<forum>\d+)/$', 'List', name="forum"),
+    url(r'^forum/(?P<slug>(\w|-)+)-(?P<forum>\d+)/(?P<page>\d+)/$', 'List', name="forum"),
+    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/$', 'Thread', name="thread"),
+    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<page>\d+)/$', 'Thread', name="topic"),
+    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/reply/$', 'Posting', name="topic_reply"),
 )

+ 0 - 25
misago/threads/views.py

@@ -1,25 +0,0 @@
-from django.core.urlresolvers import reverse
-from django.shortcuts import redirect
-from django.template import RequestContext
-from django.utils.translation import ugettext as _
-from misago.acl.utils import acl_errors
-from misago.forums.models import Forum
-from misago.threads.models import Thread, Post
-
-@acl_errors
-def threads(request, slug=None, forum=None, page=0):
-    request.acl.forums.check_forum(forum)
-    return request.theme.render_to_response('threads/list.html',
-                                            context_instance=RequestContext(request));
-    
-
-@acl_errors
-def thread(request, slug=None, thread=None, page=0):
-    return request.theme.render_to_response('threads/thread.html',
-                                            context_instance=RequestContext(request));
-    
-
-@acl_errors
-def reply(request, slug=None, thread=None):
-    return request.theme.render_to_response('threads/reply.html',
-                                            context_instance=RequestContext(request));

+ 3 - 0
misago/threads/views/__init__.py

@@ -0,0 +1,3 @@
+from misago.threads.views.list import *
+from misago.threads.views.thread import *
+from misago.threads.views.posting import *

+ 20 - 0
misago/threads/views/list.py

@@ -0,0 +1,20 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from django.utils.translation import ugettext as _
+from misago.forums.models import Forum
+from misago.threads.models import Thread, Post
+
+class List(object):
+    def fetch_forum(self, forum):
+        pass
+    
+    def __call__(self, request, slug=None, forum=None, page=0):
+        self.request = request
+        try:
+            self.fetch_forum(forum)
+            self.fetch_threads(forum, page)
+        except MehEception as e:
+            pass
+        return request.theme.render_to_response('threads/list.html',
+                                        context_instance=RequestContext(request));

+ 11 - 0
misago/threads/views/posting.py

@@ -0,0 +1,11 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from django.utils.translation import ugettext as _
+from misago.forums.models import Forum
+from misago.threads.models import Thread, Post
+
+class Posting(object):
+    def __call__(self, request):
+        return request.theme.render_to_response('threads/posting.html',
+                                            context_instance=RequestContext(request));

+ 11 - 0
misago/threads/views/thread.py

@@ -0,0 +1,11 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from django.utils.translation import ugettext as _
+from misago.forums.models import Forum
+from misago.threads.models import Thread, Post
+
+class Thread(object):
+    def __call__(self, request, slug=None, forum=None, page=0):
+        return request.theme.render_to_response('threads/thread.html',
+                                        context_instance=RequestContext(request));

+ 39 - 39
misago/users/views.py

@@ -81,31 +81,31 @@ class List(ListWidget):
     def prefetch_related(self, items):
         return items.prefetch_related('roles')
     
-    def get_item_actions(self, request, item):
+    def get_item_actions(self, item):
         return (
                 self.action('pencil', _("Edit User Details"), reverse('admin_users_edit', item)),
                 self.action('remove', _("Delete User"), reverse('admin_users_delete', item), post=True, prompt=_("Are you sure you want to delete this user account?")),
                 )
     
-    def action_activate(self, request, items, checked):
+    def action_activate(self, items, checked):
         for user in items:
             if unicode(user.pk) in checked and user.activation > 0:
-                request.monitor['users_inactive'] = int(request.monitor['users_inactive']) - 1
+                self.request.monitor['users_inactive'] = int(self.request.monitor['users_inactive']) - 1
                 user.activation = user.ACTIVATION_NONE
                 user.save(force_update=True)
                 user.email_user(
-                                request,
+                                self.request,
                                 'users/activation/admin_done',
                                 _("Your Account has been activated"),
                                 )
                 
         return Message(_('Selected users accounts have been activated.'), 'success'), reverse('admin_users')
     
-    def action_deactivate(self, request, items, checked):
+    def action_deactivate(self, items, checked):
         # First loop - check for errors
         for user in items:
             if unicode(user.pk) in checked:
-                if user.is_protected() and not request.user.is_god():
+                if user.is_protected() and not self.request.user.is_god():
                     return Message(_('You cannot force validation of protected members e-mails.'), 'error'), reverse('admin_users')
                 
         # Second loop - reset passwords
@@ -115,18 +115,18 @@ class List(ListWidget):
                 user.token = token = get_random_string(12)
                 user.save(force_update=True)
                 user.email_user(
-                                request,
+                                self.request,
                                 'users/activation/invalidated',
                                 _("Account Activation"),
                                 )
                 
         return Message(_('Selected users accounts have been deactivated and new activation links have been sent to them.'), 'success'), reverse('admin_users')
 
-    def action_remove_av(self, request, items, checked):
+    def action_remove_av(self, items, checked):
         # First loop - check for errors
         for user in items:
             if unicode(user.pk) in checked:
-                if user.is_protected() and not request.user.is_god():
+                if user.is_protected() and not self.request.user.is_god():
                     return Message(_('You cannot remove and block protected members avatars.'), 'error'), reverse('admin_users')
                 
         # Second loop - reset passwords
@@ -137,11 +137,11 @@ class List(ListWidget):
                 
         return Message(_('Selected users avatars were deleted and locked.'), 'success'), reverse('admin_users')
 
-    def action_remove_sig(self, request, items, checked):
+    def action_remove_sig(self, items, checked):
         # First loop - check for errors
         for user in items:
             if unicode(user.pk) in checked:
-                if user.is_protected() and not request.user.is_god():
+                if user.is_protected() and not self.request.user.is_god():
                     return Message(_('You cannot remove and block protected members signatures.'), 'error'), reverse('admin_users')
                 
         # Second loop - reset passwords
@@ -154,21 +154,21 @@ class List(ListWidget):
                 
         return Message(_('Selected users signatures were deleted and locked.'), 'success'), reverse('admin_users')
    
-    def action_remove_locks(self, request, items, checked):
+    def action_remove_locks(self, items, checked):
         for user in items:
             if unicode(user.pk) in checked:
-                user.default_avatar(request.settings)
+                user.default_avatar(self.request.settings)
                 user.avatar_ban = False
                 user.signature_ban = False
                 user.save(force_update=True)
                 
         return Message(_('Selected users can now edit their avatars and signatures.'), 'success'), reverse('admin_users')
     
-    def action_reset(self, request, items, checked):
+    def action_reset(self, items, checked):
         # First loop - check for errors
         for user in items:
             if unicode(user.pk) in checked:
-                if user.is_protected() and not request.user.is_god():
+                if user.is_protected() and not self.request.user.is_god():
                     return Message(_('You cannot reset protected members passwords.'), 'error'), reverse('admin_users')
                 
         # Second loop - reset passwords
@@ -178,7 +178,7 @@ class List(ListWidget):
                 user.set_password(new_password)
                 user.save(force_update=True)
                 user.email_user(
-                                request,
+                                self.request,
                                 'users/password/new_admin',
                                 _("Your New Password"),
                                 {
@@ -188,10 +188,10 @@ class List(ListWidget):
                 
         return Message(_('Selected users passwords have been reset successfully.'), 'success'), reverse('admin_users')
 
-    def action_delete(self, request, items, checked):
+    def action_delete(self, items, checked):
         for user in items:
             if unicode(user.pk) in checked:
-                if user.pk == request.user.id:
+                if user.pk == self.request.user.id:
                     return Message(_('You cannot delete yourself.'), 'error'), reverse('admin_users')
                 if user.is_protected():
                     return Message(_('You cannot delete protected members.'), 'error'), reverse('admin_users')
@@ -200,7 +200,7 @@ class List(ListWidget):
             if unicode(user.pk) in checked:
                 user.delete()
                 
-        User.objects.resync_monitor(request.monitor)
+        User.objects.resync_monitor(self.request.monitor)
         return Message(_('Selected users have been deleted successfully.'), 'success'), reverse('admin_users')
     
 
@@ -211,21 +211,21 @@ class New(FormWidget):
     form = NewUserForm
     submit_button = _("Save User")
         
-    def get_new_url(self, request, model):
+    def get_new_url(self, model):
         return reverse('admin_users_new')
     
-    def get_edit_url(self, request, model):
+    def get_edit_url(self, model):
         return reverse('admin_users_edit', model)
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         new_user = User.objects.create_user(
                                             form.cleaned_data['username'],
                                             form.cleaned_data['email'],
                                             form.cleaned_data['password'],
-                                            request.settings['default_timezone'],
-                                            request.META['REMOTE_ADDR'],
+                                            self.request.settings['default_timezone'],
+                                            self.request.META['REMOTE_ADDR'],
                                             no_roles=True,
-                                            request=request,
+                                            request=self.request,
                                             )
         new_user.title = form.cleaned_data['title']
         new_user.rank = form.cleaned_data['rank']
@@ -249,18 +249,18 @@ class Edit(FormWidget):
     notfound_message = _('Requested User could not be found.')
     submit_fallback = True
     
-    def get_form_instance(self, form, request, model, initial, post=False):
+    def get_form_instance(self, form, model, initial, post=False):
         if post:
-            return form(model, request.POST, request=request, initial=self.get_initial_data(request, model))
-        return form(model, request=request, initial=self.get_initial_data(request, model))
+            return form(model, self.request.POST, request=self.request, initial=self.get_initial_data(model))
+        return form(model, request=self.request, initial=self.get_initial_data(model))
         
-    def get_url(self, request, model):
+    def get_url(self, model):
         return reverse('admin_users_edit', model)
     
-    def get_edit_url(self, request, model):
-        return self.get_url(request, model)
+    def get_edit_url(self, model):
+        return self.get_url(model)
     
-    def get_initial_data(self, request, model):
+    def get_initial_data(self, model):
         return {
                 'username': model.username,
                 'title': model.title,
@@ -276,7 +276,7 @@ class Edit(FormWidget):
                 'signature_ban_reason_admin': model.signature_ban_reason_admin,
                 }
     
-    def submit_form(self, request, form, target):
+    def submit_form(self, form, target):
         target.title = form.cleaned_data['title']
         target.rank = form.cleaned_data['rank']
         target.avatar_ban_reason_user = form.cleaned_data['avatar_ban_reason_user']
@@ -288,7 +288,7 @@ class Edit(FormWidget):
         # Do signature mumbo-jumbo
         if form.cleaned_data['signature']:
             target.signature = form.cleaned_data['signature']
-            target.signature_preparsed = signature_markdown(target.get_acl(request),
+            target.signature_preparsed = signature_markdown(target.get_acl(self.request),
                                                             form.cleaned_data['signature'])
         else:
             target.signature = None
@@ -299,7 +299,7 @@ class Edit(FormWidget):
             if form.cleaned_data['avatar_ban']:
                 target.lock_avatar()
             else:
-                target.default_avatar(request.settings)
+                target.default_avatar(self.request.settings)
         target.avatar_ban = form.cleaned_data['avatar_ban']
                
         # Set custom avatar
@@ -309,7 +309,7 @@ class Edit(FormWidget):
             target.avatar_type = 'gallery'
         
         # Update user roles
-        if request.user.is_god():
+        if self.request.user.is_god():
             target.roles.clear()
             for role in form.cleaned_data['roles']:
                 target.roles.add(role)
@@ -331,13 +331,13 @@ class Delete(ButtonWidget):
     fallback = 'admin_users'
     notfound_message = _('Requested User account could not be found.')
     
-    def action(self, request, target):
-        if target.pk == request.user.id:
+    def action(self, target):
+        if target.pk == self.request.user.id:
             return Message(_('You cannot delete yourself.'), 'error'), False
         if target.is_protected():
             return Message(_('You cannot delete protected member.'), 'error'), False
         target.delete()
-        User.objects.resync_monitor(request.monitor)
+        User.objects.resync_monitor(self.request.monitor)
         return Message(_('User "%(name)s" has been deleted.') % {'name': target.username}, 'success'), False
     
 

+ 1 - 1
templates/admin/admin/list.html

@@ -28,7 +28,7 @@
       <td{% if loop.first %} class="lead-cell{% if column[3] is defined %} span{{ widthratio(column[3], 100, 12) }}{% endif %}"{% elif column[3] is defined %} class="span{{ widthratio(column[3], 100, 12) }}"{% endif %}>{{ item[column[0]] }}</td>{% endfor %}{% endblock %}
       {%- if not action.hide_actions%}
       <td class="span2">
-      	{%- set item_actions = action.get_item_actions(request, item) -%}
+      	{%- set item_actions = action.get_item_actions(item) -%}
       	{% if item_actions -%}
       	<ul class="list-actions">
       	  {% for action in item_actions %}