1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
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.
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.
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/>.
17 from werkzeug.exceptions import Forbidden
19 from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
20 CommentReport, ReportBase, Privilege, \
22 from mediagoblin.decorators import (require_admin_or_moderator_login,
23 active_user_from_url, user_has_privilege,
25 from mediagoblin.tools.response import render_to_response, redirect
26 from mediagoblin.moderation import forms as moderation_forms
27 from mediagoblin.moderation.tools import (take_punitive_actions, \
28 take_away_privileges, give_privileges, ban_user, unban_user, \
29 parse_report_panel_settings)
30 from werkzeug.datastructures import ImmutableMultiDict
31 from datetime import datetime
34 @require_admin_or_moderator_login
35 def moderation_media_processing_panel(request):
37 Show the global media processing panel for this instance
39 processing_entries = MediaEntry.query.filter_by(state = u'processing').\
40 order_by(MediaEntry.created.desc())
42 # Get media entries which have failed to process
43 failed_entries = MediaEntry.query.filter_by(state = u'failed').\
44 order_by(MediaEntry.created.desc())
46 processed_entries = MediaEntry.query.filter_by(state = u'processed').\
47 order_by(MediaEntry.created.desc()).limit(10)
50 return render_to_response(
52 'mediagoblin/moderation/media_panel.html',
53 {'processing_entries': processing_entries,
54 'failed_entries': failed_entries,
55 'processed_entries': processed_entries})
57 @require_admin_or_moderator_login
58 def moderation_users_panel(request):
60 Show the global panel for monitoring users in this instance
63 if len(request.args) > 0:
64 form = moderation_forms.UserPanelSortingForm(request.args)
66 current_page = form.p.data or 1
68 all_user_list = User.query
69 user_list = all_user_list.order_by(
70 User.created.desc()).offset(
71 (current_page-1)*10).limit(10)
72 last_page = int(ceil(all_user_list.count()/10.))
74 return render_to_response(
76 'mediagoblin/moderation/user_panel.html',
77 {'user_list': user_list,
78 'current_page':current_page,
79 'last_page':last_page})
81 @require_admin_or_moderator_login
82 def moderation_users_detail(request):
84 Shows details about a particular user.
86 user = User.query.filter_by(username=request.matchdict['user']).first()
87 active_reports = user.reports_filed_on.filter(
88 ReportBase.resolved==None).limit(5)
89 closed_reports = user.reports_filed_on.filter(
90 ReportBase.resolved!=None).all()
91 privileges = Privilege.query
92 user_banned = UserBan.query.get(user.id)
93 ban_form = moderation_forms.BanForm()
95 return render_to_response(
97 'mediagoblin/moderation/user.html',
99 'privileges': privileges,
100 'reports':active_reports,
101 'user_banned':user_banned,
102 'ban_form':ban_form})
104 @require_admin_or_moderator_login
106 def moderation_reports_panel(request):
108 Show the global panel for monitoring reports filed against comments or
109 media entries for this instance.
112 active_settings, closed_settings = {'current_page':1}, {'current_page':1}
114 if len(request.args) > 0:
115 form = moderation_forms.ReportPanelSortingForm(request.args)
117 filters = parse_report_panel_settings(form)
118 active_settings['current_page'] = form.active_p.data or 1
119 closed_settings['current_page'] = form.closed_p.data or 1
121 getattr(ReportBase,key)==val
122 for key,val in filters.viewitems()]
124 all_active = ReportBase.query.filter(
125 ReportBase.resolved==None).filter(
127 all_closed = ReportBase.query.filter(
128 ReportBase.resolved!=None).filter(
131 # report_list and closed_report_list are the two lists of up to 10
132 # items which are actually passed to the user in this request
133 report_list = all_active.order_by(
134 ReportBase.created.desc()).offset(
135 (active_settings['current_page']-1)*10).limit(10)
136 closed_report_list = all_closed.order_by(
137 ReportBase.created.desc()).offset(
138 (closed_settings['current_page']-1)*10).limit(10)
140 active_settings['last_page'] = int(ceil(all_active.count()/10.))
141 closed_settings['last_page'] = int(ceil(all_closed.count()/10.))
143 return render_to_response(
145 'mediagoblin/moderation/report_panel.html',
146 {'report_list':report_list,
147 'closed_report_list':closed_report_list,
148 'active_settings':active_settings,
149 'closed_settings':closed_settings})
151 @require_admin_or_moderator_login
153 def moderation_reports_detail(request):
155 This is the page an admin or moderator goes to see the details of a report.
156 The report can be resolved or unresolved. This is also the page that a mod-
157 erator would go to to take an action to resolve a report.
159 form = moderation_forms.ReportResolutionForm(request.form)
160 report = ReportBase.query.get(request.matchdict['report_id'])
162 form.take_away_privileges.choices = [
163 (s.privilege_name,s.privilege_name.title()) \
164 for s in report.reported_user.all_privileges
167 if request.method == "POST" and form.validate() and not (
168 not request.user.has_privilege(u'admin') and
169 report.reported_user.has_privilege(u'admin')):
171 user = User.query.get(form.targeted_user.data)
172 return take_punitive_actions(request, form, report, user)
175 form.targeted_user.data = report.reported_user_id
177 return render_to_response(
179 'mediagoblin/moderation/report.html',
183 @user_has_privilege(u'admin')
184 @active_user_from_url
185 def give_or_take_away_privilege(request, url_user):
187 A form action to give or take away a particular privilege from a user.
188 Can only be used by an admin.
190 form = moderation_forms.PrivilegeAddRemoveForm(request.form)
191 if request.method == "POST" and form.validate():
192 privilege = Privilege.query.filter(
193 Privilege.privilege_name==form.privilege_name.data).one()
194 if not take_away_privileges(
195 url_user.username, form.privilege_name.data):
197 give_privileges(url_user.username, form.privilege_name.data)
202 'mediagoblin.moderation.users_detail',
203 user=url_user.username)
205 @user_has_privilege(u'admin')
206 @active_user_from_url
207 def ban_or_unban(request, url_user):
209 A page to ban or unban a user. Only can be used by an admin.
211 form = moderation_forms.BanForm(request.form)
212 if request.method == "POST" and form.validate():
213 already_banned = unban_user(url_user.id)
214 same_as_requesting_user = (request.user.id == url_user.id)
215 if not already_banned and not same_as_requesting_user:
216 user_ban = ban_user(url_user.id,
217 expiration_date = form.user_banned_until.data,
218 reason = form.why_user_was_banned.data)
222 'mediagoblin.moderation.users_detail',
223 user=url_user.username)