X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/03460135dbc5d86b366424da72053a853db4ce34..c76406e46e71cb86cfb440667bfbbe21b36e709e:/forum/views/admin.py diff --git a/forum/views/admin.py b/forum/views/admin.py index a6a30c0..b131d8f 100644 --- a/forum/views/admin.py +++ b/forum/views/admin.py @@ -10,13 +10,13 @@ from django.utils.translation import ugettext as _ from django.utils import simplejson from django.db import models from forum.settings.base import Setting -from forum.forms import MaintenanceModeForm, PageForm, NodeManFilterForm +from forum.forms import MaintenanceModeForm, PageForm, NodeManFilterForm, CreateUserForm from forum.settings.forms import SettingsSetForm -from forum.utils import pagination +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 +from forum.actions import NewPageAction, EditPageAction, PublishAction, DeleteAction, UserJoinsAction, CloseAction from forum import settings TOOLS = {} @@ -34,29 +34,30 @@ def admin_page(fn): @super_user_required def wrapper(request, *args, **kwargs): res = fn(request, *args, **kwargs) - if isinstance(res, tuple): - template, context = res - context['basetemplate'] = settings.DJSTYLE_ADMIN_INTERFACE and "osqaadmin/djstyle_base.html" or "osqaadmin/base.html" - context['allsets'] = Setting.sets - context['othersets'] = sorted( - [s for s in Setting.sets.values() if not s.name in - ('basic', 'users', 'email', 'paths', 'extkeys', 'repgain', 'minrep', 'voting', 'accept', 'badges', 'about', 'faq', 'sidebar', - 'form', 'moderation', 'css', 'headandfoot', 'head', 'view', 'urls')] - , lambda s1, s2: s1.weight - s2.weight) - - context['tools'] = TOOLS - - unsaved = request.session.get('previewing_settings', {}) - context['unsaved'] = set([getattr(settings, s).set.name for s in unsaved.keys() if hasattr(settings, s)]) - - return render_to_response(template, context, context_instance=RequestContext(request)) - else: + if isinstance(res, HttpResponse): return res + template, context = res + context['basetemplate'] = settings.DJSTYLE_ADMIN_INTERFACE and "osqaadmin/djstyle_base.html" or "osqaadmin/base.html" + context['allsets'] = Setting.sets + context['othersets'] = sorted( + [s for s in Setting.sets.values() if not s.name in + ('basic', 'users', 'email', 'paths', 'extkeys', 'repgain', 'minrep', 'voting', 'accept', 'badges', 'about', 'faq', 'sidebar', + 'form', 'moderation', 'css', 'headandfoot', 'head', 'view', 'urls')] + , lambda s1, s2: s1.weight - s2.weight) + + context['tools'] = TOOLS + + unsaved = request.session.get('previewing_settings', {}) + context['unsaved'] = set([getattr(settings, s).set.name for s in unsaved.keys() if hasattr(settings, s)]) + + return render_to_response(template, context, context_instance=RequestContext(request)) + return wrapper def admin_tools_page(name, label): def decorator(fn): + fn = admin_page(fn) fn.label = label TOOLS[name] = fn @@ -380,10 +381,82 @@ def edit_page(request, id=None): 'published': published }) +@admin_tools_page(_('createuser'), _("Create new user")) +def create_user(request): + if request.POST: + form = CreateUserForm(request.POST) + + if form.is_valid(): + user_ = User(username=form.cleaned_data['username'], email=form.cleaned_data['email']) + user_.set_password(form.cleaned_data['password1']) + + if not form.cleaned_data.get('validate_email', False): + user_.email_isvalid = True + + user_.save() + UserJoinsAction(user=user_).save() + + request.user.message_set.create(message=_("New user created sucessfully. %s.") % html.hyperlink( + user_.get_profile_url(), _("See %s profile") % user_.username, target="_blank")) + + return HttpResponseRedirect(reverse("admin_tools", kwargs={'name': 'createuser'})) + else: + form = CreateUserForm() + + return ('osqaadmin/createuser.html', { + 'form': form, + }) +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', "")), + (_('score'), pagination.SimpleSort(_('score'), '-score', "")), + (_('act_at'), pagination.SimpleSort(_('act_at'), '-last_activity_at', "")), + ), pagesizes=(default_pagesize,), default_pagesize=default_pagesize, prefix=prefix) @admin_tools_page(_("nodeman"), _("Node management")) def node_management(request): + if request.POST: + selected_nodes = request.POST.getlist('_selected_node') + + if selected_nodes and request.POST.get('action', None): + action = request.POST['action'] + selected_nodes = Node.objects.filter(id__in=selected_nodes) + + message = _("No action performed") + + if action == 'delete_selected': + for node in selected_nodes: + if node.node_type in ('question', 'answer', 'comment') and (not node.nis.deleted): + DeleteAction(user=request.user, node=node, ip=request.META['REMOTE_ADDR']).save() + + 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'})) + + nodes = Node.objects.all() if (request.GET): @@ -391,6 +464,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 @@ -400,6 +476,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 @@ -416,15 +500,16 @@ def node_management(request): if filter: nodes = nodes.filter(filter) - 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') - return ('osqaadmin/nodeman.html', pagination.paginated(request, ("nodes", ActivityPaginatorContext()), { + return ('osqaadmin/nodeman.html', pagination.paginated(request, ("nodes", NodeManagementPaginatorContext()), { 'nodes': nodes, 'node_types': node_types, 'state_types': state_types, 'filter_form': filter_form, + 'authors': authors, + 'tags': tags, 'hide_menu': True }))