]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/admin.py
Adds the hability to hard delete nodes in the bulk manager, and renames the tool.
[osqa.git] / forum / views / admin.py
index 7f83f9aa21f4ad45820a6dab84188969f8eeb4b4..0fa533366c13d83d3c5157bd73d6015558170a68 100644 (file)
@@ -14,9 +14,9 @@ from forum.forms import MaintenanceModeForm, PageForm, NodeManFilterForm, Create
 from forum.settings.forms import SettingsSetForm
 from forum.utils import pagination, html
 
-from forum.models import Question, Answer, User, Node, Action, Page, NodeState
+from forum.models import Question, Answer, User, Node, Action, Page, NodeState, Tag
 from forum.models.node import NodeMetaClass
-from forum.actions import NewPageAction, EditPageAction, PublishAction, DeleteAction, UserJoinsAction
+from forum.actions import NewPageAction, EditPageAction, PublishAction, DeleteAction, UserJoinsAction, CloseAction
 from forum import settings
 
 TOOLS = {}
@@ -410,15 +410,24 @@ def create_user(request):
 class NodeManagementPaginatorContext(pagination.PaginatorContext):
     def __init__(self, id='QUESTIONS_LIST', prefix='', default_pagesize=100):
         super (NodeManagementPaginatorContext, self).__init__(id, sort_methods=(
-            (_('title'), pagination.SimpleSort(_('title'), '-title', "")),
             (_('added_at'), pagination.SimpleSort(_('added_at'), '-added_at', "")),
+            (_('added_at_asc'), pagination.SimpleSort(_('added_at_asc'), 'added_at', "")),
             (_('score'), pagination.SimpleSort(_('score'), '-score', "")),
+            (_('score_asc'), pagination.SimpleSort(_('score_asc'), 'score', "")),
             (_('act_at'), pagination.SimpleSort(_('act_at'), '-last_activity_at', "")),
-        ), pagesizes=(default_pagesize,), default_pagesize=default_pagesize, prefix=prefix)
+            (_('act_at_asc'), pagination.SimpleSort(_('act_at_asc'), 'last_activity_at', "")),
+        ), pagesizes=(default_pagesize,), force_sort='added_at', default_pagesize=default_pagesize, prefix=prefix)
 
-@admin_tools_page(_("nodeman"), _("Node management"))
+@admin_tools_page(_("nodeman"), _("Bulk management"))
 def node_management(request):
-    if request.POST:
+    if request.POST and "save_filter" in request.POST:
+        filter_name = request.POST.get('filter_name', _('filter'))
+        params = pagination.generate_uri(request.GET, ('page',))
+        current_filters = settings.NODE_MAN_FILTERS.value
+        current_filters.append((filter_name, params))
+        settings.NODE_MAN_FILTERS.set_value(current_filters)
+
+    if request.POST and "execute" in request.POST:
         selected_nodes = request.POST.getlist('_selected_node')
 
         if selected_nodes and request.POST.get('action', None):
@@ -434,8 +443,29 @@ def node_management(request):
                         
                 message = _("All selected nodes marked as deleted")
 
+            if action == "close_selected":
+                for node in selected_nodes:
+                    if node.node_type == "question" and (not node.nis.closed):
+                        CloseAction(node=node.leaf, user=request.user, extra=_("bulk close"), ip=request.META['REMOTE_ADDR']).save()
+
+                message = _("Selected questions were closed")
+
+            if action == "hard_delete_selected":
+                ids = [n.id for n in selected_nodes]
+
+                for id in ids:
+                    try:
+                        node = Node.objects.get(id=id)
+                        node.delete()
+                    except:
+                        pass                        
+
+                message = _("All selected nodes deleted")
+
             request.user.message_set.create(message=message)
-            return HttpResponseRedirect(reverse("admin_tools", kwargs={'name': 'nodeman'}))
+
+            params = pagination.generate_uri(request.GET, ('page',))
+            return HttpResponseRedirect(reverse("admin_tools", kwargs={'name': 'nodeman'}) + "?" + params)
 
 
     nodes = Node.objects.all()
@@ -445,6 +475,9 @@ def node_management(request):
     else:
         filter_form = NodeManFilterForm({'node_type': 'all', 'state_type': 'any'})
 
+    authors = request.GET.getlist('authors')
+    tags = request.GET.getlist('tags')
+
     if filter_form.is_valid():
         data = filter_form.cleaned_data
 
@@ -454,6 +487,14 @@ def node_management(request):
         if (data['state_type'] != 'any'):
             nodes = nodes.filter_state(**{str(data['state_type']): True})
 
+        if (authors):
+            nodes = nodes.filter(author__id__in=authors)
+            authors = User.objects.filter(id__in=authors)
+
+        if (tags):
+            nodes = nodes.filter(tags__id__in=tags)
+            tags = Tag.objects.filter(id__in=tags)
+
         if data['text']:
             filter = None
 
@@ -469,9 +510,6 @@ def node_management(request):
 
             if filter:
                 nodes = nodes.filter(filter)
-    else:
-        print filter_form.errors
-
 
     node_types = [('all', _("all"))] + [(k, n.friendly_name) for k, n in NodeMetaClass.types.items()]
     state_types = NodeState.objects.filter(node__in=nodes).values_list('state_type', flat=True).distinct('state_type')
@@ -481,6 +519,8 @@ def node_management(request):
     'node_types': node_types,
     'state_types': state_types,
     'filter_form': filter_form,
+    'authors': authors,
+    'tags': tags,
     'hide_menu': True
     }))
 
@@ -488,5 +528,3 @@ def node_management(request):
 
 
 
-
-