At this point, I am very close to done with this code! I made one big change at
paroneayea's request, which was to make to possible to turn off user's ability
to file reports through a mediagoblin.ini setting. Aside from this, I had to
make it possible for the Moderation User Panel to display more than 10 users.
And aside from that, I just had to fix some errors which cropped up with my
most recent additions. I also fixed some tests that were broken because I had
changed the checks for whether or not a user is active. Nearing the end!
===============================================================================
Made it possible to turn off reports through a mediagoblin.ini setting
===============================================================================
--\ mediagoblin.ini
--\ mediagoblin/config_spec.ini
--\ mediagoblin/decorators.py
--\ mediagoblin/moderation/views.py
--\ mediagoblin/templates/mediagoblin/user_pages/media.html
--\ mediagoblin/user_pages/views.py
===============================================================================
Made User Panel capable of showing more than 1 page of users
===============================================================================
--\ mediagoblin/moderation/forms.py
--\ mediagoblin/moderation/views.py
--\ mediagoblin/templates/mediagoblin/moderation/user_panel.html
===============================================================================
Fixed Broken Tests
===============================================================================
--\ mediagoblin/tests/test_notifications.py
--\ mediagoblin/tests/test_openid.py
--\ mediagoblin/tests/test_persona.py
--\ mediagoblin/tests/test_reporting.py
===============================================================================
Fixed errors in code
===============================================================================
--\ mediagoblin/db/migrations.py
--| Set nullable to True for MediaReports' and CommentReports' content foreign
|keys
--\ mediagoblin/db/models.py
--| Got rid of cascading rules for MediaReports' and CommentReports' content
|foreign keys. This makes it possible for the Reports to continue to exist
|after the content is deleted.
--\ mediagoblin/moderation/tools.py
--| Fixed formatting of Report Resolution Methods
--| Took out pieces of code used in debugging
--\ mediagoblin/templates/mediagoblin/base.html
--\ mediagoblin/templates/mediagoblin/moderation/report.html
--| Made reports details page able to tell what is a deleted archived report.
--\ mediagoblin/templates/mediagoblin/moderation/report_panel.html
--\ mediagoblin/templates/mediagoblin/utils/report.html
This commit is contained in:
@@ -139,3 +139,10 @@ class ReportPanelSortingForm(wtforms.Form):
|
||||
validators=[wtforms.validators.optional()])
|
||||
reporter = wtforms.IntegerField(
|
||||
validators=[wtforms.validators.optional()])
|
||||
|
||||
class UserPanelSortingForm(wtforms.Form):
|
||||
"""
|
||||
This form is used for sorting different reports.
|
||||
"""
|
||||
p = wtforms.IntegerField(
|
||||
validators=[wtforms.validators.optional()])
|
||||
|
||||
@@ -25,90 +25,79 @@ import sys, traceback
|
||||
|
||||
def take_punitive_actions(request, form, report, user):
|
||||
message_body =''
|
||||
try:
|
||||
|
||||
# The bulk of this action is running through all of the different
|
||||
# punitive actions that a moderator could take.
|
||||
if u'takeaway' in form.action_to_resolve.data:
|
||||
for privilege_name in form.take_away_privileges.data:
|
||||
take_away_privileges(user.username, privilege_name)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} took away {user}\'{privilege} privileges.".format(
|
||||
mod=request.user.username,
|
||||
user=user.username,
|
||||
privilege=privilege_name)
|
||||
|
||||
# If the moderator elects to ban the user, a new instance of user_ban
|
||||
# will be created.
|
||||
if u'userban' in form.action_to_resolve.data:
|
||||
user_ban = ban_user(form.targeted_user.data,
|
||||
expiration_date=form.user_banned_until.data,
|
||||
reason=form.why_user_was_banned.data)
|
||||
Session.add(user_ban)
|
||||
# The bulk of this action is running through all of the different
|
||||
# punitive actions that a moderator could take.
|
||||
if u'takeaway' in form.action_to_resolve.data:
|
||||
for privilege_name in form.take_away_privileges.data:
|
||||
take_away_privileges(user.username, privilege_name)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} banned user {user} until {expiration_date}.".format(
|
||||
u"\n{mod} took away {user}\'{privilege} privileges.".format(
|
||||
mod=request.user.username,
|
||||
user=user.username,
|
||||
expiration_date = (
|
||||
"until {date}".format(date=form.user_banned_until.data)
|
||||
if form.user_banned_until.data
|
||||
else "indefinitely"
|
||||
)
|
||||
)
|
||||
privilege=privilege_name)
|
||||
|
||||
# If the moderator elects to send a warning message. An email will be
|
||||
# sent to the email address given at sign up
|
||||
if u'sendmessage' in form.action_to_resolve.data:
|
||||
message_body = form.message_to_user.data
|
||||
# If the moderator elects to ban the user, a new instance of user_ban
|
||||
# will be created.
|
||||
if u'userban' in form.action_to_resolve.data:
|
||||
user_ban = ban_user(form.targeted_user.data,
|
||||
expiration_date=form.user_banned_until.data,
|
||||
reason=form.why_user_was_banned.data)
|
||||
Session.add(user_ban)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} banned user {user} {expiration_date}.".format(
|
||||
mod=request.user.username,
|
||||
user=user.username,
|
||||
expiration_date = (
|
||||
"until {date}".format(date=form.user_banned_until.data)
|
||||
if form.user_banned_until.data
|
||||
else "indefinitely"
|
||||
)
|
||||
)
|
||||
|
||||
# If the moderator elects to send a warning message. An email will be
|
||||
# sent to the email address given at sign up
|
||||
if u'sendmessage' in form.action_to_resolve.data:
|
||||
message_body = form.message_to_user.data
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} sent a warning email to the {user}.".format(
|
||||
mod=request.user.username,
|
||||
user=user.username)
|
||||
|
||||
if u'delete' in form.action_to_resolve.data and \
|
||||
report.is_comment_report():
|
||||
deleted_comment = report.comment
|
||||
Session.delete(deleted_comment)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} sent a warning email to the {user}.".format(
|
||||
mod=request.user.username,
|
||||
user=user.username)
|
||||
u"\n{mod} deleted the comment.".format(
|
||||
mod=request.user.username)
|
||||
elif u'delete' in form.action_to_resolve.data and \
|
||||
report.is_media_entry_report():
|
||||
deleted_media = report.media_entry
|
||||
Session.delete(deleted_media)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} deleted the media entry.".format(
|
||||
mod=request.user.username)
|
||||
report.archive(
|
||||
resolver_id=request.user.id,
|
||||
resolved=datetime.now(),
|
||||
result=form.resolution_content.data)
|
||||
|
||||
if u'delete' in form.action_to_resolve.data and \
|
||||
report.is_comment_report():
|
||||
deleted_comment = report.comment
|
||||
Session.delete(deleted_comment)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} deleted the comment.".format(
|
||||
mod=request.user.username)
|
||||
elif u'delete' in form.action_to_resolve.data and \
|
||||
report.is_media_entry_report():
|
||||
deleted_media = report.media_entry
|
||||
Session.delete(deleted_media)
|
||||
form.resolution_content.data += \
|
||||
u"\n{mod} deleted the media entry.".format(
|
||||
mod=request.user.username)
|
||||
report.archive(
|
||||
resolver_id=request.user.id,
|
||||
resolved=datetime.now(),
|
||||
result=form.resolution_content.data)
|
||||
Session.add(report)
|
||||
Session.commit()
|
||||
if message_body:
|
||||
send_email(
|
||||
mg_globals.app_config['email_sender_address'],
|
||||
[user.email],
|
||||
_('Warning from')+ '- {moderator} '.format(
|
||||
moderator=request.user.username),
|
||||
message_body)
|
||||
|
||||
Session.add(report)
|
||||
Session.commit()
|
||||
if message_body:
|
||||
send_email(
|
||||
mg_globals.app_config['email_sender_address'],
|
||||
[user.email],
|
||||
_('Warning from')+ '- {moderator} '.format(
|
||||
moderator=request.user.username),
|
||||
message_body)
|
||||
return redirect(
|
||||
request,
|
||||
'mediagoblin.moderation.users_detail',
|
||||
user=user.username)
|
||||
|
||||
return redirect(
|
||||
request,
|
||||
'mediagoblin.moderation.users_detail',
|
||||
user=user.username)
|
||||
except:
|
||||
#TODO make a more effective and specific try except statement. To account for
|
||||
# incorrect value addition my moderators
|
||||
print sys.exc_info()[0]
|
||||
print sys.exc_info()[1]
|
||||
traceback.print_tb(sys.exc_info()[2])
|
||||
Session.rollback()
|
||||
return redirect(
|
||||
request,
|
||||
'mediagoblin.moderation.reports_detail',
|
||||
report_id=report.id)
|
||||
|
||||
def take_away_privileges(user,*privileges):
|
||||
"""
|
||||
|
||||
@@ -19,8 +19,9 @@ from werkzeug.exceptions import Forbidden
|
||||
from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
|
||||
CommentReport, ReportBase, Privilege, \
|
||||
UserBan)
|
||||
from mediagoblin.decorators import (require_admin_or_moderator_login, \
|
||||
active_user_from_url, user_has_privilege)
|
||||
from mediagoblin.decorators import (require_admin_or_moderator_login,
|
||||
active_user_from_url, user_has_privilege,
|
||||
allow_reporting)
|
||||
from mediagoblin.tools.response import render_to_response, redirect
|
||||
from mediagoblin.moderation import forms as moderation_forms
|
||||
from mediagoblin.moderation.tools import (take_punitive_actions, \
|
||||
@@ -58,12 +59,24 @@ def moderation_users_panel(request):
|
||||
'''
|
||||
Show the global panel for monitoring users in this instance
|
||||
'''
|
||||
user_list = User.query
|
||||
current_page = 1
|
||||
if len(request.args) > 0:
|
||||
form = moderation_forms.UserPanelSortingForm(request.args)
|
||||
if form.validate():
|
||||
current_page = form.p.data or 1
|
||||
|
||||
all_user_list = User.query
|
||||
user_list = all_user_list.order_by(
|
||||
User.created.desc()).offset(
|
||||
(current_page-1)*10).limit(10)
|
||||
last_page = int(ceil(all_user_list.count()/10.))
|
||||
|
||||
return render_to_response(
|
||||
request,
|
||||
'mediagoblin/moderation/user_panel.html',
|
||||
{'user_list': user_list})
|
||||
{'user_list': user_list,
|
||||
'current_page':current_page,
|
||||
'last_page':last_page})
|
||||
|
||||
@require_admin_or_moderator_login
|
||||
def moderation_users_detail(request):
|
||||
@@ -89,6 +102,7 @@ def moderation_users_detail(request):
|
||||
'ban_form':ban_form})
|
||||
|
||||
@require_admin_or_moderator_login
|
||||
@allow_reporting
|
||||
def moderation_reports_panel(request):
|
||||
'''
|
||||
Show the global panel for monitoring reports filed against comments or
|
||||
@@ -135,6 +149,7 @@ def moderation_reports_panel(request):
|
||||
'closed_settings':closed_settings})
|
||||
|
||||
@require_admin_or_moderator_login
|
||||
@allow_reporting
|
||||
def moderation_reports_detail(request):
|
||||
"""
|
||||
This is the page an admin or moderator goes to see the details of a report.
|
||||
|
||||
Reference in New Issue
Block a user