diff --git a/mediagoblin.ini b/mediagoblin.ini index 30dacadf..874ebcbd 100644 --- a/mediagoblin.ini +++ b/mediagoblin.ini @@ -20,6 +20,9 @@ email_debug_mode = true # Set to false to disable registrations allow_registration = true +# Set to false to disable the ability for users to report offensive content +allow_reporting = true + ## Uncomment this to put some user-overriding templates here # local_templates = %(here)s/user_dev/templates/ diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index 43e1898c..0e224503 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -42,6 +42,9 @@ allow_comments = boolean(default=True) # Whether comments are ascending or descending comments_ascending = boolean(default=True) +# Enable/disable reporting +allow_reporting = boolean(default=True) + # By default not set, but you might want something like: # "%(here)s/user_dev/templates/" local_templates = string() diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 2e05bf2a..ff74aa30 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -494,7 +494,7 @@ class CommentReport_v0(ReportBase_v0): id = Column('id',Integer, ForeignKey('core__reports.id'), primary_key=True) - comment_id = Column(Integer, ForeignKey(MediaComment.id), nullable=False) + comment_id = Column(Integer, ForeignKey(MediaComment.id), nullable=True) @@ -503,7 +503,7 @@ class MediaReport_v0(ReportBase_v0): __mapper_args__ = {'polymorphic_identity': 'media_report'} id = Column('id',Integer, ForeignKey('core__reports.id'), primary_key=True) - media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=False) + media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=True) class UserBan_v0(declarative_base()): __tablename__ = 'core__user_bans' diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index cec311f2..466f31b8 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -764,8 +764,7 @@ class CommentReport(ReportBase): comment_id = Column(Integer, ForeignKey(MediaComment.id), nullable=True) comment = relationship( MediaComment, backref=backref("reports_filed_on", - lazy="dynamic", - cascade="all, delete-orphan")) + lazy="dynamic")) class MediaReport(ReportBase): @@ -782,9 +781,8 @@ class MediaReport(ReportBase): media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=True) media_entry = relationship( MediaEntry, - backref=backref("reports_filed_onmod/reports/1/", - lazy="dynamic", - cascade="all, delete-orphan")) + backref=backref("reports_filed_on", + lazy="dynamic")) class UserBan(Base): """ diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index d5a10db1..d0b5ad33 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -304,6 +304,21 @@ def allow_registration(controller): return wrapper +def allow_reporting(controller): + """ Decorator for if reporting is enabled""" + @wraps(controller) + def wrapper(request, *args, **kwargs): + if not mgg.app_config["allow_reporting"]: + messages.add_message( + request, + messages.WARNING, + _('Sorry, reporting is disabled on this instance.')) + return redirect(request, 'index') + + return controller(request, *args, **kwargs) + + return wrapper + def get_optional_media_comment_by_id(controller): """ Pass in a MediaComment based off of a url component. Because of this decor- diff --git a/mediagoblin/moderation/forms.py b/mediagoblin/moderation/forms.py index 78e9fcdc..5582abdd 100644 --- a/mediagoblin/moderation/forms.py +++ b/mediagoblin/moderation/forms.py @@ -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()]) diff --git a/mediagoblin/moderation/tools.py b/mediagoblin/moderation/tools.py index 109f3d8f..224a0c73 100644 --- a/mediagoblin/moderation/tools.py +++ b/mediagoblin/moderation/tools.py @@ -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): """ diff --git a/mediagoblin/moderation/views.py b/mediagoblin/moderation/views.py index 45edff1d..4721834a 100644 --- a/mediagoblin/moderation/views.py +++ b/mediagoblin/moderation/views.py @@ -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. diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 945d5ee3..94ca7aa5 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -92,11 +92,10 @@ "javascript:;" {% endif %} >{% trans %}log out{% endtrans %} - - {%- trans %}Create new collection{% endtrans -%} -
- Terms of Service + + {%- trans %}Terms of Service{%- endtrans %} +
{% endif %} {%- elif auth %} @@ -141,6 +140,9 @@ {%- trans %}Add media{% endtrans -%} + + {%- trans %}Create new collection{% endtrans -%} + {% if request.user.has_privilege('admin','moderator') %}Moderation powers: @@ -157,9 +159,6 @@
{% endif %} - - {%- trans %}Create new collection{% endtrans -%} - diff --git a/mediagoblin/templates/mediagoblin/moderation/report.html b/mediagoblin/templates/mediagoblin/moderation/report.html index 062ec24a..cb717cde 100644 --- a/mediagoblin/templates/mediagoblin/moderation/report.html +++ b/mediagoblin/templates/mediagoblin/moderation/report.html @@ -30,7 +30,7 @@ title="Return to Reports Panel"> {% trans %}Return to Reports Panel{% endtrans %}@@ -121,6 +121,7 @@ curr_page !=p %} |
---|
diff --git a/mediagoblin/templates/mediagoblin/moderation/user_panel.html b/mediagoblin/templates/mediagoblin/moderation/user_panel.html index 54ef7c11..4949960e 100644 --- a/mediagoblin/templates/mediagoblin/moderation/user_panel.html +++ b/mediagoblin/templates/mediagoblin/moderation/user_panel.html @@ -34,6 +34,42 @@ |
---|
{% trans %}ID{% endtrans %} | diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 62c2a48c..81e5013e 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -147,15 +147,13 @@ {%- endautoescape %}
---|