1 from datetime import datetime, timedelta
3 from django.shortcuts import render_to_response
4 from django.core.urlresolvers import reverse
5 from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404
6 from django.template import RequestContext
7 from django.utils.translation import ugettext as _
8 from django.db.models import Sum
10 from forum.settings.base import Setting
11 from forum.settings.forms import SettingsSetForm
13 from forum.models import Question, Answer, User, Node, Action
14 from forum import settings
16 def super_user_required(fn):
17 def wrapper(request, *args, **kwargs):
18 if request.user.is_authenticated() and request.user.is_superuser:
19 return fn(request, *args, **kwargs)
27 return render_to_response('osqaadmin/index.html', {
28 'sets': get_all_sets(),
29 'settings_pack': unicode(settings.SETTINGS_PACK),
30 'statistics': get_statistics(),
31 'recent_activity': get_recent_activity(),
32 }, context_instance=RequestContext(request))
35 def settings_set(request, set_name):
36 set = Setting.sets.get(set_name, None)
42 form = SettingsSetForm(set, data=request.POST, files=request.FILES)
46 request.user.message_set.create(message=_("'%s' settings saved succesfully") % set_name)
48 if set_name in ('minrep', 'badges', 'repgain'):
49 settings.SETTINGS_PACK.set_value("custom")
51 form = SettingsSetForm(set)
53 return render_to_response('osqaadmin/set.html', {
55 'markdown': set.markdown,
56 'sets': get_all_sets(),
57 }, context_instance=RequestContext(request))
60 return sorted(Setting.sets.values(), lambda s1, s2: s1.weight - s2.weight)
62 def get_recent_activity():
63 return Action.objects.order_by('-action_date')[0:30]
67 'total_users': User.objects.all().count(),
68 'users_last_24': User.objects.filter(date_joined__gt=(datetime.now() - timedelta(days=1))).count(),
69 'total_questions': Question.objects.filter(deleted=None).count(),
70 'questions_last_24': Question.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(),
71 'total_answers': Answer.objects.filter(deleted=None).count(),
72 'answers_last_24': Answer.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(),
76 def go_bootstrap(request):
77 #todo: this is the quick and dirty way of implementing a bootstrap mode
79 from forum_modules.default_badges import settings as dbsets
80 dbsets.POPULAR_QUESTION_VIEWS.set_value(100)
81 dbsets.NOTABLE_QUESTION_VIEWS.set_value(200)
82 dbsets.FAMOUS_QUESTION_VIEWS.set_value(300)
83 dbsets.NICE_ANSWER_VOTES_UP.set_value(2)
84 dbsets.NICE_QUESTION_VOTES_UP.set_value(2)
85 dbsets.GOOD_ANSWER_VOTES_UP.set_value(4)
86 dbsets.GOOD_QUESTION_VOTES_UP.set_value(4)
87 dbsets.GREAT_ANSWER_VOTES_UP.set_value(8)
88 dbsets.GREAT_QUESTION_VOTES_UP.set_value(8)
89 dbsets.FAVORITE_QUESTION_FAVS.set_value(1)
90 dbsets.STELLAR_QUESTION_FAVS.set_value(3)
91 dbsets.DISCIPLINED_MIN_SCORE.set_value(3)
92 dbsets.PEER_PRESSURE_MAX_SCORE.set_value(-3)
93 dbsets.CIVIC_DUTY_VOTES.set_value(15)
94 dbsets.PUNDIT_COMMENT_COUNT.set_value(10)
95 dbsets.SELF_LEARNER_UP_VOTES.set_value(2)
96 dbsets.STRUNK_AND_WHITE_EDITS.set_value(10)
97 dbsets.ENLIGHTENED_UP_VOTES.set_value(2)
98 dbsets.GURU_UP_VOTES.set_value(4)
99 dbsets.NECROMANCER_UP_VOTES.set_value(2)
100 dbsets.NECROMANCER_DIF_DAYS.set_value(30)
101 dbsets.TAXONOMIST_USE_COUNT.set_value(5)
105 settings.REP_TO_VOTE_UP.set_value(0)
106 settings.REP_TO_VOTE_DOWN.set_value(15)
107 settings.REP_TO_FLAG.set_value(15)
108 settings.REP_TO_COMMENT.set_value(0)
109 settings.REP_TO_LIKE_COMMENT.set_value(0)
110 settings.REP_TO_UPLOAD.set_value(0)
111 settings.REP_TO_CLOSE_OWN.set_value(60)
112 settings.REP_TO_REOPEN_OWN.set_value(120)
113 settings.REP_TO_RETAG.set_value(150)
114 settings.REP_TO_EDIT_WIKI.set_value(200)
115 settings.REP_TO_EDIT_OTHERS.set_value(400)
116 settings.REP_TO_CLOSE_OTHERS.set_value(600)
117 settings.REP_TO_DELETE_COMMENTS.set_value(400)
118 settings.REP_TO_VIEW_FLAGS.set_value(30)
120 settings.INITIAL_REP.set_value(1)
121 settings.MAX_REP_BY_UPVOTE_DAY.set_value(300)
122 settings.REP_GAIN_BY_UPVOTED.set_value(15)
123 settings.REP_LOST_BY_UPVOTE_CANCELED.set_value(15)
124 settings.REP_LOST_BY_DOWNVOTED.set_value(1)
125 settings.REP_LOST_BY_DOWNVOTING.set_value(0)
126 settings.REP_GAIN_BY_DOWNVOTE_CANCELED.set_value(1)
127 settings.REP_GAIN_BY_CANCELING_DOWNVOTE.set_value(0)
128 settings.REP_GAIN_BY_ACCEPTED.set_value(25)
129 settings.REP_LOST_BY_ACCEPTED_CANCELED.set_value(25)
130 settings.REP_GAIN_BY_ACCEPTING.set_value(5)
131 settings.REP_LOST_BY_CANCELING_ACCEPTED.set_value(5)
132 settings.REP_LOST_BY_FLAGGED.set_value(2)
133 settings.REP_LOST_BY_FLAGGED_3_TIMES.set_value(30)
134 settings.REP_LOST_BY_FLAGGED_5_TIMES.set_value(100)
136 settings.SETTINGS_PACK.set_value("bootstrap")
138 request.user.message_set.create(message=_('Bootstrap mode enabled'))
139 return HttpResponseRedirect(reverse('admin_index'))
142 def go_defaults(request):
143 for setting in Setting.sets['badges']:
145 for setting in Setting.sets['minrep']:
147 for setting in Setting.sets['repgain']:
150 settings.SETTINGS_PACK.set_value("default")
152 request.user.message_set.create(message=_('All values reverted to defaults'))
153 return HttpResponseRedirect(reverse('admin_index'))
157 def recalculate_denormalized(request):
158 for n in Node.objects.all():
160 n.score = n.votes.aggregate(score=Sum('value'))['score']
161 if not n.score: n.score = 0
164 for u in User.objects.all():
165 u.reputation = u.reputes.aggregate(reputation=Sum('value'))['reputation']
168 request.user.message_set.create(message=_('All values recalculated'))
169 return HttpResponseRedirect(reverse('admin_index'))