]> git.openstreetmap.org Git - osqa.git/blob - forum/views/admin.py
Make sure an action is a real action before using is as the trigger of a badge.
[osqa.git] / forum / views / admin.py
1 from datetime import datetime, timedelta
2
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
9
10 from forum.settings.base import Setting
11 from forum.settings.forms import SettingsSetForm
12
13 from forum.models import Question, Answer, User, Node, Action
14 from forum import settings
15
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)
20         else:
21             raise Http404
22
23     return wrapper
24
25 @super_user_required
26 def index(request):
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))
33
34 @super_user_required    
35 def settings_set(request, set_name):
36     set = Setting.sets.get(set_name, None)
37
38     if set is None:
39         raise Http404
40
41     if request.POST:
42         form = SettingsSetForm(set, data=request.POST, files=request.FILES)
43
44         if form.is_valid():
45             form.save()
46             request.user.message_set.create(message=_("'%s' settings saved succesfully") % set_name)
47
48             if set_name in ('minrep', 'badges', 'repgain'):
49                 settings.SETTINGS_PACK.set_value("custom")
50     else:
51         form = SettingsSetForm(set)
52
53     return render_to_response('osqaadmin/set.html', {
54         'form': form,
55         'markdown': set.markdown,
56         'sets': get_all_sets(),
57     }, context_instance=RequestContext(request))
58
59 def get_all_sets():
60     return sorted(Setting.sets.values(), lambda s1, s2: s1.weight - s2.weight)
61
62 def get_recent_activity():
63     return Action.objects.order_by('-action_date')[0:30]
64
65 def get_statistics():
66     return {
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(),
73     }
74
75 @super_user_required      
76 def go_bootstrap(request):
77     #todo: this is the quick and dirty way of implementing a bootstrap mode
78     try:
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)
102     except:
103         pass
104
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)
119
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)
135
136     settings.SETTINGS_PACK.set_value("bootstrap")
137
138     request.user.message_set.create(message=_('Bootstrap mode enabled'))
139     return HttpResponseRedirect(reverse('admin_index'))
140
141 @super_user_required
142 def go_defaults(request):
143     for setting in Setting.sets['badges']:
144         setting.to_default()
145     for setting in Setting.sets['minrep']:
146         setting.to_default()
147     for setting in Setting.sets['repgain']:
148         setting.to_default()
149
150     settings.SETTINGS_PACK.set_value("default")
151
152     request.user.message_set.create(message=_('All values reverted to defaults'))
153     return HttpResponseRedirect(reverse('admin_index'))
154
155
156 @super_user_required
157 def recalculate_denormalized(request):
158     for n in Node.objects.all():
159         n = n.leaf
160         n.score = n.votes.aggregate(score=Sum('value'))['score']
161         if not n.score: n.score = 0
162         n.save()
163
164     for u in User.objects.all():
165         u.reputation = u.reputes.aggregate(reputation=Sum('value'))['reputation']
166         u.save()
167
168     request.user.message_set.create(message=_('All values recalculated'))
169     return HttpResponseRedirect(reverse('admin_index'))
170