X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/1876ec0c8caf982704410cee305d0cde218421d4..786e1bae7fc276a0c49c4aeb98646a9ba8935c77:/forum/views/admin.py?ds=sidebyside diff --git a/forum/views/admin.py b/forum/views/admin.py index dd1f3f5..fe27825 100644 --- a/forum/views/admin.py +++ b/forum/views/admin.py @@ -1,18 +1,19 @@ from datetime import datetime, timedelta import time -from django.shortcuts import render_to_response +from django.shortcuts import render_to_response, get_object_or_404 from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404 from django.template import RequestContext from django.utils.translation import ugettext as _ from django.utils import simplejson from django.db.models import Sum - from forum.settings.base import Setting +from forum.forms import MaintenanceModeForm, PageForm from forum.settings.forms import SettingsSetForm -from forum.models import Question, Answer, User, Node, Action +from forum.models import Question, Answer, User, Node, Action, Page +from forum.actions import NewPageAction, EditPageAction, PublishAction from forum import settings def super_user_required(fn): @@ -35,8 +36,12 @@ def admin_page(fn): context['othersets'] = sorted( [s for s in Setting.sets.values() if not s.name in ('basic', 'users', 'email', 'paths', 'extkeys', 'repgain', 'minrep', 'voting', 'badges', 'about', 'faq', 'sidebar', - 'form', 'moderation')] + 'form', 'moderation', 'css', 'headandfoot', 'head')] , lambda s1, s2: s1.weight - s2.weight) + + 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: return res @@ -46,9 +51,10 @@ def admin_page(fn): @admin_page def dashboard(request): return ('osqaadmin/dashboard.html', { - 'settings_pack': unicode(settings.SETTINGS_PACK), - 'statistics': get_statistics(), - 'recent_activity': get_recent_activity(), + 'settings_pack': unicode(settings.SETTINGS_PACK), + 'statistics': get_statistics(), + 'recent_activity': get_recent_activity(), + 'flagged_posts': get_flagged_posts(), }) @super_user_required @@ -63,43 +69,45 @@ def statistics(request): today = datetime.now() last_month = today - timedelta(days=30) - last_month_questions = Question.objects.filter(deleted=None, added_at__gt=last_month - ).order_by('added_at').values_list('added_at', flat=True) + last_month_questions = Question.objects.filter_state(deleted=False).filter(added_at__gt=last_month + ).order_by('added_at').values_list( + 'added_at', flat=True) - last_month_n_questions = Question.objects.filter(deleted=None, added_at__lt=last_month).count() + last_month_n_questions = Question.objects.filter_state(deleted=False).filter(added_at__lt=last_month).count() qgraph_data = simplejson.dumps([ - (time.mktime(d.timetuple()) * 1000, i + last_month_n_questions) - for i, d in enumerate(last_month_questions) + (time.mktime(d.timetuple()) * 1000, i + last_month_n_questions) + for i, d in enumerate(last_month_questions) ]) last_month_users = User.objects.filter(date_joined__gt=last_month - ).order_by('date_joined').values_list('date_joined', flat=True) + ).order_by('date_joined').values_list('date_joined', flat=True) last_month_n_users = User.objects.filter(date_joined__lt=last_month).count() ugraph_data = simplejson.dumps([ - (time.mktime(d.timetuple()) * 1000, i + last_month_n_users) - for i, d in enumerate(last_month_users) + (time.mktime(d.timetuple()) * 1000, i + last_month_n_users) + for i, d in enumerate(last_month_users) ]) return 'osqaadmin/statistics.html', { - 'graphs': [ + 'graphs': [ { - 'id': 'questions_graph', - 'caption': _("Questions Graph"), - 'data': qgraph_data - },{ - 'id': 'userss_graph', - 'caption': _("Users Graph"), - 'data': ugraph_data + 'id': 'questions_graph', + 'caption': _("Questions Graph"), + 'data': qgraph_data + }, { + 'id': 'userss_graph', + 'caption': _("Users Graph"), + 'data': ugraph_data } - ] + ] } @admin_page def settings_set(request, set_name): - set = Setting.sets.get(set_name, None) + set = Setting.sets.get(set_name, {}) + current_preview = request.session.get('previewing_settings', {}) if set is None: raise Http404 @@ -108,38 +116,70 @@ def settings_set(request, set_name): form = SettingsSetForm(set, data=request.POST, files=request.FILES) if form.is_valid(): - form.save() - request.user.message_set.create(message=_("'%s' settings saved succesfully") % set_name) + if 'preview' in request.POST: + current_preview.update(form.cleaned_data) + request.session['previewing_settings'] = current_preview + + return HttpResponseRedirect(reverse('index')) + else: + for s in set: + current_preview.pop(s.name, None) + + request.session['previewing_settings'] = current_preview - if set_name in ('minrep', 'badges', 'repgain'): - settings.SETTINGS_PACK.set_value("custom") + if not 'reset' in request.POST: + form.save() + request.user.message_set.create(message=_("'%s' settings saved succesfully") % set_name) - return HttpResponseRedirect(reverse('admin_set', args=[set_name])) + if set_name in ('minrep', 'badges', 'repgain'): + settings.SETTINGS_PACK.set_value("custom") + + return HttpResponseRedirect(reverse('admin_set', args=[set_name])) else: - form = SettingsSetForm(set) + form = SettingsSetForm(set, unsaved=current_preview) return 'osqaadmin/set.html', { - 'form': form, - 'markdown': set.markdown, + 'form': form, + 'markdown': set.markdown, } +@super_user_required +def get_default(request, set_name, var_name): + set = Setting.sets.get(set_name, None) + if set is None: raise Http404 + + setting = dict([(s.name, s) for s in set]).get(var_name, None) + if setting is None: raise Http404 + + setting.to_default() + + if request.is_ajax(): + return HttpResponse(setting.default) + else: + return HttpResponseRedirect(reverse('admin_set', kwargs={'set_name': set_name})) + def get_recent_activity(): return Action.objects.order_by('-action_date')[0:30] +def get_flagged_posts(): + return Action.objects.filter(canceled=False, action_type="flag").order_by('-action_date')[0:30] + def get_statistics(): return { - 'total_users': User.objects.all().count(), - 'users_last_24': User.objects.filter(date_joined__gt=(datetime.now() - timedelta(days=1))).count(), - 'total_questions': Question.objects.filter(deleted=None).count(), - 'questions_last_24': Question.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(), - 'total_answers': Answer.objects.filter(deleted=None).count(), - 'answers_last_24': Answer.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(), + 'total_users': User.objects.all().count(), + 'users_last_24': User.objects.filter(date_joined__gt=(datetime.now() - timedelta(days=1))).count(), + 'total_questions': Question.objects.filter_state(deleted=False).count(), + 'questions_last_24': Question.objects.filter_state(deleted=False).filter( + added_at__gt=(datetime.now() - timedelta(days=1))).count(), + 'total_answers': Answer.objects.filter_state(deleted=False).count(), + 'answers_last_24': Answer.objects.filter_state(deleted=False).filter( + added_at__gt=(datetime.now() - timedelta(days=1))).count(), } @super_user_required def go_bootstrap(request): - #todo: this is the quick and dirty way of implementing a bootstrap mode +#todo: this is the quick and dirty way of implementing a bootstrap mode try: from forum_modules.default_badges import settings as dbsets dbsets.POPULAR_QUESTION_VIEWS.set_value(100) @@ -173,6 +213,7 @@ def go_bootstrap(request): settings.REP_TO_COMMENT.set_value(0) settings.REP_TO_LIKE_COMMENT.set_value(0) settings.REP_TO_UPLOAD.set_value(0) + settings.REP_TO_CREATE_TAGS.set_value(0) settings.REP_TO_CLOSE_OWN.set_value(60) settings.REP_TO_REOPEN_OWN.set_value(120) settings.REP_TO_RETAG.set_value(150) @@ -185,15 +226,10 @@ def go_bootstrap(request): settings.INITIAL_REP.set_value(1) settings.MAX_REP_BY_UPVOTE_DAY.set_value(300) settings.REP_GAIN_BY_UPVOTED.set_value(15) - settings.REP_LOST_BY_UPVOTE_CANCELED.set_value(15) settings.REP_LOST_BY_DOWNVOTED.set_value(1) settings.REP_LOST_BY_DOWNVOTING.set_value(0) - settings.REP_GAIN_BY_DOWNVOTE_CANCELED.set_value(1) - settings.REP_GAIN_BY_CANCELING_DOWNVOTE.set_value(0) settings.REP_GAIN_BY_ACCEPTED.set_value(25) - settings.REP_LOST_BY_ACCEPTED_CANCELED.set_value(25) settings.REP_GAIN_BY_ACCEPTING.set_value(5) - settings.REP_LOST_BY_CANCELING_ACCEPTED.set_value(5) settings.REP_LOST_BY_FLAGGED.set_value(2) settings.REP_LOST_BY_FLAGGED_3_TIMES.set_value(30) settings.REP_LOST_BY_FLAGGED_5_TIMES.set_value(100) @@ -233,3 +269,90 @@ def recalculate_denormalized(request): request.user.message_set.create(message=_('All values recalculated')) return HttpResponseRedirect(reverse('admin_index')) +@admin_page +def maintenance(request): + if request.POST: + if 'close' in request.POST or 'adjust' in request.POST: + form = MaintenanceModeForm(request.POST) + + if form.is_valid(): + settings.MAINTAINANCE_MODE.set_value({ + 'allow_ips': form.cleaned_data['ips'], + 'message': form.cleaned_data['message']}) + + if 'close' in request.POST: + message = _('Maintenance mode enabled') + else: + message = _('Settings adjusted') + + request.user.message_set.create(message=message) + + return HttpResponseRedirect(reverse('admin_maintenance')) + elif 'open' in request.POST: + settings.MAINTAINANCE_MODE.set_value(None) + request.user.message_set.create(message=_("Your site is now running normally")) + return HttpResponseRedirect(reverse('admin_maintenance')) + else: + form = MaintenanceModeForm(initial={'ips': request.META['REMOTE_ADDR'], + 'message': _('Currently down for maintenance. We\'ll be back soon')}) + + return ('osqaadmin/maintenance.html', {'form': form, 'in_maintenance': settings.MAINTAINANCE_MODE.value is not None + }) + + +@admin_page +def flagged_posts(request): + return ('osqaadmin/flagged_posts.html', { + 'flagged_posts': get_flagged_posts(), + }) + +@admin_page +def static_pages(request): + pages = Page.objects.all() + + return ('osqaadmin/static_pages.html', { + 'pages': pages, + }) + +@admin_page +def edit_page(request, id=None): + if id: + page = get_object_or_404(Page, id=id) + else: + page = None + + if request.POST: + form = PageForm(page, request.POST) + + if form.is_valid(): + if form.has_changed(): + if not page: + page = NewPageAction(user=request.user, ip=request.META['REMOTE_ADDR']).save(data=form.cleaned_data + ).node + else: + EditPageAction(user=request.user, node=page, ip=request.META['REMOTE_ADDR']).save( + data=form.cleaned_data) + + if ('publish' in request.POST) and (not page.published): + PublishAction(user=request.user, node=page, ip=request.META['REMOTE_ADDR']).save() + elif ('unpublish' in request.POST) and page.published: + page.nstate.published.cancel(ip=request.META['REMOTE_ADDR']) + + return HttpResponseRedirect(reverse('admin_edit_page', kwargs={'id': page.id})) + + else: + form = PageForm(page) + + if page: + published = page.published + else: + published = False + + return ('osqaadmin/edit_page.html', { + 'page': page, + 'form': form, + 'published': published + }) + + +