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 | |
17 | from werkzeug.exceptions import Forbidden |
18 | |
19 | from mediagoblin.db.models import (MediaEntry, User, MediaComment, \ |
20 | CommentReport, ReportBase, Privilege, \ |
3aa3871b |
21 | UserBan, ArchivedReport) |
6bba33d7 |
22 | from mediagoblin.decorators import (require_admin_or_moderator_login, \ |
dfd66b78 |
23 | active_user_from_url, user_has_privilege) |
6bba33d7 |
24 | from mediagoblin.tools.response import render_to_response, redirect |
25 | from mediagoblin.moderation import forms as moderation_forms |
dfd66b78 |
26 | from mediagoblin.moderation.tools import (take_punitive_actions, \ |
1bb367f6 |
27 | take_away_privileges, give_privileges, ban_user, unban_user) |
6bba33d7 |
28 | from datetime import datetime |
29 | |
30 | @require_admin_or_moderator_login |
31 | def 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 |
54 | def 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 |
66 | def 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 |
89 | def 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 |
109 | def 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 |
141 | def 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 |
162 | def 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) |