This is a quick commit. I gave admins the ability to ban or unban users
[mediagoblin.git] / mediagoblin / moderation / views.py
CommitLineData
6bba33d7 1# GNU MediaGoblin -- federated, autonomous media hosting
2# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU Affero General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17from werkzeug.exceptions import Forbidden
18
19from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
20 CommentReport, ReportBase, Privilege, \
3aa3871b 21 UserBan, ArchivedReport)
6bba33d7 22from mediagoblin.decorators import (require_admin_or_moderator_login, \
dfd66b78 23 active_user_from_url, user_has_privilege)
6bba33d7 24from mediagoblin.tools.response import render_to_response, redirect
25from mediagoblin.moderation import forms as moderation_forms
dfd66b78 26from mediagoblin.moderation.tools import (take_punitive_actions, \
1bb367f6 27 take_away_privileges, give_privileges, ban_user, unban_user)
6bba33d7 28from datetime import datetime
29
30@require_admin_or_moderator_login
31def moderation_media_processing_panel(request):
32 '''
33 Show the global media processing panel for this instance
34 '''
35 processing_entries = MediaEntry.query.filter_by(state = u'processing').\
36 order_by(MediaEntry.created.desc())
37
38 # Get media entries which have failed to process
39 failed_entries = MediaEntry.query.filter_by(state = u'failed').\
40 order_by(MediaEntry.created.desc())
41
42 processed_entries = MediaEntry.query.filter_by(state = u'processed').\
43 order_by(MediaEntry.created.desc()).limit(10)
44
45 # Render to response
46 return render_to_response(
47 request,
48 'mediagoblin/moderation/media_panel.html',
49 {'processing_entries': processing_entries,
50 'failed_entries': failed_entries,
51 'processed_entries': processed_entries})
52
53@require_admin_or_moderator_login
54def moderation_users_panel(request):
55 '''
56 Show the global panel for monitoring users in this instance
57 '''
58 user_list = User.query
59
60 return render_to_response(
61 request,
62 'mediagoblin/moderation/user_panel.html',
63 {'user_list': user_list})
64
65@require_admin_or_moderator_login
66def moderation_users_detail(request):
67 '''
68 Shows details about a particular user.
69 '''
70 user = User.query.filter_by(username=request.matchdict['user']).first()
71 active_reports = user.reports_filed_on.filter(
3aa3871b 72 ReportBase.discriminator!='archived_report').limit(5)
6bba33d7 73 closed_reports = user.reports_filed_on.filter(
3aa3871b 74 ReportBase.discriminator=='archived_report').all()
6bba33d7 75 privileges = Privilege.query
3aa3871b 76 user_banned = UserBan.query.get(user.id)
1bb367f6 77 ban_form = moderation_forms.BanForm()
6bba33d7 78
79 return render_to_response(
80 request,
81 'mediagoblin/moderation/user.html',
82 {'user':user,
3aa3871b 83 'privileges': privileges,
3aa3871b 84 'reports':active_reports,
1bb367f6 85 'user_banned':user_banned,
86 'ban_form':ban_form})
6bba33d7 87
88@require_admin_or_moderator_login
89def moderation_reports_panel(request):
90 '''
dfd66b78 91 Show the global panel for monitoring reports filed against comments or
6bba33d7 92 media entries for this instance.
93 '''
94 report_list = ReportBase.query.filter(
3aa3871b 95 ReportBase.discriminator!="archived_report").order_by(
6bba33d7 96 ReportBase.created.desc()).limit(10)
97 closed_report_list = ReportBase.query.filter(
3aa3871b 98 ReportBase.discriminator=="archived_report").order_by(
6bba33d7 99 ReportBase.created.desc()).limit(10)
100
101 # Render to response
102 return render_to_response(
103 request,
104 'mediagoblin/moderation/report_panel.html',
105 {'report_list':report_list,
106 'closed_report_list':closed_report_list})
107
108@require_admin_or_moderator_login
109def moderation_reports_detail(request):
110 """
111 This is the page an admin or moderator goes to see the details of a report.
112 The report can be resolved or unresolved. This is also the page that a mod-
113 erator would go to to take an action to resolve a report.
114 """
115 form = moderation_forms.ReportResolutionForm(request.form)
116 report = ReportBase.query.get(request.matchdict['report_id'])
117
9d6e453f 118 form.take_away_privileges.choices = [
119 (s.privilege_name,s.privilege_name.title()) \
dfd66b78 120 for s in report.reported_user.all_privileges
9d6e453f 121 ]
3aa3871b 122
8394febb 123 if request.method == "POST" and form.validate() and not (
124 not request.user.has_privilege(u'admin') and
125 report.reported_user.has_privilege(u'admin')):
126
6bba33d7 127 user = User.query.get(form.targeted_user.data)
3aa3871b 128 return take_punitive_actions(request, form, report, user)
6bba33d7 129
6bba33d7 130
131 form.targeted_user.data = report.reported_user_id
132
133 return render_to_response(
134 request,
135 'mediagoblin/moderation/report.html',
136 {'report':report,
6bba33d7 137 'form':form})
138
dfd66b78 139@user_has_privilege(u'admin')
6bba33d7 140@active_user_from_url
141def give_or_take_away_privilege(request, url_user):
142 '''
143 A form action to give or take away a particular privilege from a user
144 '''
145 form = moderation_forms.PrivilegeAddRemoveForm(request.form)
146 if request.method == "POST" and form.validate():
9d6e453f 147 privilege = Privilege.query.filter(
148 Privilege.privilege_name==form.privilege_name.data).one()
dfd66b78 149 if not take_away_privileges(
150 url_user.username, form.privilege_name.data):
151
152 give_privileges(url_user.username, form.privilege_name.data)
6bba33d7 153 url_user.save()
dfd66b78 154
155 return redirect(
156 request,
157 'mediagoblin.moderation.users_detail',
158 user=url_user.username)
1bb367f6 159
160@user_has_privilege(u'admin')
161@active_user_from_url
162def ban_or_unban(request, url_user):
163 """
164 A page to ban or unban a user. Only can be used by an admin.
165 """
166 form = moderation_forms.BanForm(request.form)
167 print "accessed page"
168 if request.method == "POST" and form.validate():
169 already_banned = unban_user(url_user.id)
170 if not already_banned:
171 user_ban = ban_user(url_user.id,
172 expiration_date = form.user_banned_until.data,
173 reason = form.why_user_was_banned.data)
174 user_ban.save()
175 return redirect(
176 request,
177 'mediagoblin.moderation.users_detail',
178 user=url_user.username)