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, \
24 from mediagoblin.tools.response import render_to_response, redirect
25 from mediagoblin.moderation import forms as moderation_forms
26 from datetime import datetime
28 @require_admin_or_moderator_login
29 def moderation_media_processing_panel(request):
31 Show the global media processing panel for this instance
33 processing_entries = MediaEntry.query.filter_by(state = u'processing').\
34 order_by(MediaEntry.created.desc())
36 # Get media entries which have failed to process
37 failed_entries = MediaEntry.query.filter_by(state = u'failed').\
38 order_by(MediaEntry.created.desc())
40 processed_entries = MediaEntry.query.filter_by(state = u'processed').\
41 order_by(MediaEntry.created.desc()).limit(10)
44 return render_to_response(
46 'mediagoblin/moderation/media_panel.html',
47 {'processing_entries': processing_entries,
48 'failed_entries': failed_entries,
49 'processed_entries': processed_entries})
51 @require_admin_or_moderator_login
52 def moderation_users_panel(request):
54 Show the global panel for monitoring users in this instance
56 user_list = User.query
58 return render_to_response(
60 'mediagoblin/moderation/user_panel.html',
61 {'user_list': user_list})
63 @require_admin_or_moderator_login
64 def moderation_users_detail(request):
66 Shows details about a particular user.
68 user = User.query.filter_by(username=request.matchdict['user']).first()
69 active_reports = user.reports_filed_on.filter(
70 ReportBase.resolved==None).limit(5)
71 closed_reports = user.reports_filed_on.filter(
72 ReportBase.resolved!=None).all()
73 privileges = Privilege.query
75 return render_to_response(
77 'mediagoblin/moderation/user.html',
79 'privileges':privileges,
80 'reports':active_reports})
82 @require_admin_or_moderator_login
83 def moderation_reports_panel(request):
85 Show the global panel for monitoring reports filed against comments or
86 media entries for this instance.
88 report_list = ReportBase.query.filter(
89 ReportBase.resolved==None).order_by(
90 ReportBase.created.desc()).limit(10)
91 closed_report_list = ReportBase.query.filter(
92 ReportBase.resolved!=None).order_by(
93 ReportBase.created.desc()).limit(10)
96 return render_to_response(
98 'mediagoblin/moderation/report_panel.html',
99 {'report_list':report_list,
100 'closed_report_list':closed_report_list})
102 @require_admin_or_moderator_login
103 def moderation_reports_detail(request):
105 This is the page an admin or moderator goes to see the details of a report.
106 The report can be resolved or unresolved. This is also the page that a mod-
107 erator would go to to take an action to resolve a report.
109 form = moderation_forms.ReportResolutionForm(request.form)
110 report = ReportBase.query.get(request.matchdict['report_id'])
112 if request.method == "POST" and form.validate():
113 user = User.query.get(form.targeted_user.data)
114 if form.action_to_resolve.data == u'takeaway':
115 if report.discriminator == u'comment_report':
116 privilege = Privilege.one({'privilege_name':u'commenter'})
117 form.resolution_content.data += \
118 u"<br>%s took away %s\'s commenting privileges" % (
119 request.user.username,
122 privilege = Privilege.one({'privilege_name':u'uploader'})
123 form.resolution_content.data += \
124 u"<br>%s took away %s\'s media uploading privileges" % (
125 request.user.username,
127 user.all_privileges.remove(privilege)
129 report.result = form.resolution_content.data
130 report.resolved = datetime.now()
133 elif form.action_to_resolve.data == u'userban':
134 reason = form.resolution_content.data + \
135 "<br>"+request.user.username
137 user_id=form.targeted_user.data,
138 expiration_date=form.user_banned_until.data,
139 reason= form.resolution_content.data)
141 if not form.user_banned_until == "":
142 form.resolution_content.data += \
143 u"<br>%s banned user %s until %s." % (
144 request.user.username,
146 form.user_banned_until.data)
148 form.resolution_content.data += \
149 u"<br>%s banned user %s indefinitely." % (
150 request.user.username,
152 form.user_banned_until.data)
154 report.result = form.resolution_content.data
155 report.resolved = datetime.now()
163 'mediagoblin.moderation.users_detail',
166 if report.discriminator == 'comment_report':
167 comment = MediaComment.query.get(report.comment_id)
169 elif report.discriminator == 'media_report':
170 media_entry = MediaEntry.query.get(report.media_entry_id)
173 form.targeted_user.data = report.reported_user_id
175 return render_to_response(
177 'mediagoblin/moderation/report.html',
179 'media_entry':media_entry,
183 @require_admin_or_moderator_login
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
189 form = moderation_forms.PrivilegeAddRemoveForm(request.form)
190 if request.method == "POST" and form.validate():
191 privilege = Privilege.one({'privilege_name':form.privilege_name.data})
192 if privilege in url_user.all_privileges is True:
193 url_user.all_privileges.remove(privilege)
195 url_user.all_privileges.append(privilege)
199 'mediagoblin.moderation.users_detail',
200 user=url_user.username)