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:
parent
045fe0ee9d
commit
6483b37060
@ -20,6 +20,9 @@ email_debug_mode = true
|
|||||||
# Set to false to disable registrations
|
# Set to false to disable registrations
|
||||||
allow_registration = true
|
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
|
## Uncomment this to put some user-overriding templates here
|
||||||
# local_templates = %(here)s/user_dev/templates/
|
# local_templates = %(here)s/user_dev/templates/
|
||||||
|
|
||||||
|
@ -42,6 +42,9 @@ allow_comments = boolean(default=True)
|
|||||||
# Whether comments are ascending or descending
|
# Whether comments are ascending or descending
|
||||||
comments_ascending = boolean(default=True)
|
comments_ascending = boolean(default=True)
|
||||||
|
|
||||||
|
# Enable/disable reporting
|
||||||
|
allow_reporting = boolean(default=True)
|
||||||
|
|
||||||
# By default not set, but you might want something like:
|
# By default not set, but you might want something like:
|
||||||
# "%(here)s/user_dev/templates/"
|
# "%(here)s/user_dev/templates/"
|
||||||
local_templates = string()
|
local_templates = string()
|
||||||
|
@ -494,7 +494,7 @@ class CommentReport_v0(ReportBase_v0):
|
|||||||
|
|
||||||
id = Column('id',Integer, ForeignKey('core__reports.id'),
|
id = Column('id',Integer, ForeignKey('core__reports.id'),
|
||||||
primary_key=True)
|
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'}
|
__mapper_args__ = {'polymorphic_identity': 'media_report'}
|
||||||
|
|
||||||
id = Column('id',Integer, ForeignKey('core__reports.id'), primary_key=True)
|
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()):
|
class UserBan_v0(declarative_base()):
|
||||||
__tablename__ = 'core__user_bans'
|
__tablename__ = 'core__user_bans'
|
||||||
|
@ -764,8 +764,7 @@ class CommentReport(ReportBase):
|
|||||||
comment_id = Column(Integer, ForeignKey(MediaComment.id), nullable=True)
|
comment_id = Column(Integer, ForeignKey(MediaComment.id), nullable=True)
|
||||||
comment = relationship(
|
comment = relationship(
|
||||||
MediaComment, backref=backref("reports_filed_on",
|
MediaComment, backref=backref("reports_filed_on",
|
||||||
lazy="dynamic",
|
lazy="dynamic"))
|
||||||
cascade="all, delete-orphan"))
|
|
||||||
|
|
||||||
|
|
||||||
class MediaReport(ReportBase):
|
class MediaReport(ReportBase):
|
||||||
@ -782,9 +781,8 @@ class MediaReport(ReportBase):
|
|||||||
media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=True)
|
media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=True)
|
||||||
media_entry = relationship(
|
media_entry = relationship(
|
||||||
MediaEntry,
|
MediaEntry,
|
||||||
backref=backref("reports_filed_onmod/reports/1/",
|
backref=backref("reports_filed_on",
|
||||||
lazy="dynamic",
|
lazy="dynamic"))
|
||||||
cascade="all, delete-orphan"))
|
|
||||||
|
|
||||||
class UserBan(Base):
|
class UserBan(Base):
|
||||||
"""
|
"""
|
||||||
|
@ -304,6 +304,21 @@ def allow_registration(controller):
|
|||||||
|
|
||||||
return wrapper
|
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):
|
def get_optional_media_comment_by_id(controller):
|
||||||
"""
|
"""
|
||||||
Pass in a MediaComment based off of a url component. Because of this decor-
|
Pass in a MediaComment based off of a url component. Because of this decor-
|
||||||
|
@ -139,3 +139,10 @@ class ReportPanelSortingForm(wtforms.Form):
|
|||||||
validators=[wtforms.validators.optional()])
|
validators=[wtforms.validators.optional()])
|
||||||
reporter = wtforms.IntegerField(
|
reporter = wtforms.IntegerField(
|
||||||
validators=[wtforms.validators.optional()])
|
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):
|
def take_punitive_actions(request, form, report, user):
|
||||||
message_body =''
|
message_body =''
|
||||||
try:
|
|
||||||
|
|
||||||
# The bulk of this action is running through all of the different
|
# The bulk of this action is running through all of the different
|
||||||
# punitive actions that a moderator could take.
|
# punitive actions that a moderator could take.
|
||||||
if u'takeaway' in form.action_to_resolve.data:
|
if u'takeaway' in form.action_to_resolve.data:
|
||||||
for privilege_name in form.take_away_privileges.data:
|
for privilege_name in form.take_away_privileges.data:
|
||||||
take_away_privileges(user.username, privilege_name)
|
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)
|
|
||||||
form.resolution_content.data += \
|
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,
|
mod=request.user.username,
|
||||||
user=user.username,
|
user=user.username,
|
||||||
expiration_date = (
|
privilege=privilege_name)
|
||||||
"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
|
# If the moderator elects to ban the user, a new instance of user_ban
|
||||||
# sent to the email address given at sign up
|
# will be created.
|
||||||
if u'sendmessage' in form.action_to_resolve.data:
|
if u'userban' in form.action_to_resolve.data:
|
||||||
message_body = form.message_to_user.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 += \
|
form.resolution_content.data += \
|
||||||
u"\n{mod} sent a warning email to the {user}.".format(
|
u"\n{mod} deleted the comment.".format(
|
||||||
mod=request.user.username,
|
mod=request.user.username)
|
||||||
user=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 \
|
Session.add(report)
|
||||||
report.is_comment_report():
|
Session.commit()
|
||||||
deleted_comment = report.comment
|
if message_body:
|
||||||
Session.delete(deleted_comment)
|
send_email(
|
||||||
form.resolution_content.data += \
|
mg_globals.app_config['email_sender_address'],
|
||||||
u"\n{mod} deleted the comment.".format(
|
[user.email],
|
||||||
mod=request.user.username)
|
_('Warning from')+ '- {moderator} '.format(
|
||||||
elif u'delete' in form.action_to_resolve.data and \
|
moderator=request.user.username),
|
||||||
report.is_media_entry_report():
|
message_body)
|
||||||
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)
|
return redirect(
|
||||||
Session.commit()
|
request,
|
||||||
if message_body:
|
'mediagoblin.moderation.users_detail',
|
||||||
send_email(
|
user=user.username)
|
||||||
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)
|
|
||||||
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):
|
def take_away_privileges(user,*privileges):
|
||||||
"""
|
"""
|
||||||
|
@ -19,8 +19,9 @@ from werkzeug.exceptions import Forbidden
|
|||||||
from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
|
from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
|
||||||
CommentReport, ReportBase, Privilege, \
|
CommentReport, ReportBase, Privilege, \
|
||||||
UserBan)
|
UserBan)
|
||||||
from mediagoblin.decorators import (require_admin_or_moderator_login, \
|
from mediagoblin.decorators import (require_admin_or_moderator_login,
|
||||||
active_user_from_url, user_has_privilege)
|
active_user_from_url, user_has_privilege,
|
||||||
|
allow_reporting)
|
||||||
from mediagoblin.tools.response import render_to_response, redirect
|
from mediagoblin.tools.response import render_to_response, redirect
|
||||||
from mediagoblin.moderation import forms as moderation_forms
|
from mediagoblin.moderation import forms as moderation_forms
|
||||||
from mediagoblin.moderation.tools import (take_punitive_actions, \
|
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
|
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(
|
return render_to_response(
|
||||||
request,
|
request,
|
||||||
'mediagoblin/moderation/user_panel.html',
|
'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
|
@require_admin_or_moderator_login
|
||||||
def moderation_users_detail(request):
|
def moderation_users_detail(request):
|
||||||
@ -89,6 +102,7 @@ def moderation_users_detail(request):
|
|||||||
'ban_form':ban_form})
|
'ban_form':ban_form})
|
||||||
|
|
||||||
@require_admin_or_moderator_login
|
@require_admin_or_moderator_login
|
||||||
|
@allow_reporting
|
||||||
def moderation_reports_panel(request):
|
def moderation_reports_panel(request):
|
||||||
'''
|
'''
|
||||||
Show the global panel for monitoring reports filed against comments or
|
Show the global panel for monitoring reports filed against comments or
|
||||||
@ -135,6 +149,7 @@ def moderation_reports_panel(request):
|
|||||||
'closed_settings':closed_settings})
|
'closed_settings':closed_settings})
|
||||||
|
|
||||||
@require_admin_or_moderator_login
|
@require_admin_or_moderator_login
|
||||||
|
@allow_reporting
|
||||||
def moderation_reports_detail(request):
|
def moderation_reports_detail(request):
|
||||||
"""
|
"""
|
||||||
This is the page an admin or moderator goes to see the details of a report.
|
This is the page an admin or moderator goes to see the details of a report.
|
||||||
|
@ -92,11 +92,10 @@
|
|||||||
"javascript:;"
|
"javascript:;"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
>{% trans %}log out{% endtrans %}</a>
|
>{% trans %}log out{% endtrans %}</a>
|
||||||
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.collection') }}">
|
|
||||||
{%- trans %}Create new collection{% endtrans -%}
|
|
||||||
</a>
|
|
||||||
<p class="fine_print">
|
<p class="fine_print">
|
||||||
<a href="{{ request.urlgen('terms_of_service') }}">Terms of Service</a>
|
<a href="{{ request.urlgen('terms_of_service') }}">
|
||||||
|
{%- trans %}Terms of Service{%- endtrans %}
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- elif auth %}
|
{%- elif auth %}
|
||||||
@ -141,6 +140,9 @@
|
|||||||
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.start') }}">
|
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.start') }}">
|
||||||
{%- trans %}Add media{% endtrans -%}
|
{%- trans %}Add media{% endtrans -%}
|
||||||
</a>
|
</a>
|
||||||
|
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.collection') }}">
|
||||||
|
{%- trans %}Create new collection{% endtrans -%}
|
||||||
|
</a>
|
||||||
{% if request.user.has_privilege('admin','moderator') %}
|
{% if request.user.has_privilege('admin','moderator') %}
|
||||||
<p>
|
<p>
|
||||||
<span class="dropdown_title">Moderation powers:</span>
|
<span class="dropdown_title">Moderation powers:</span>
|
||||||
@ -157,9 +159,6 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a class="button_action" href="{{ request.urlgen('mediagoblin.submit.collection') }}">
|
|
||||||
{%- trans %}Create new collection{% endtrans -%}
|
|
||||||
</a>
|
|
||||||
<p class="fine_print">
|
<p class="fine_print">
|
||||||
<a href="{{ request.urlgen('terms_of_service') }}">Terms of Service</a>
|
<a href="{{ request.urlgen('terms_of_service') }}">Terms of Service</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
title="Return to Reports Panel">
|
title="Return to Reports Panel">
|
||||||
{% trans %}Return to Reports Panel{% endtrans %}</a>
|
{% trans %}Return to Reports Panel{% endtrans %}</a>
|
||||||
<h2>{% trans %}Report{% endtrans %} #{{ report.id }}</h2>
|
<h2>{% trans %}Report{% endtrans %} #{{ report.id }}</h2>
|
||||||
{% if report.comment %}
|
{% if report.is_comment_report() and report.comment %}
|
||||||
|
|
||||||
{% trans %}Reported comment{% endtrans %}:
|
{% trans %}Reported comment{% endtrans %}:
|
||||||
{% set comment = report.comment %}
|
{% set comment = report.comment %}
|
||||||
@ -62,7 +62,7 @@
|
|||||||
{% endautoescape %}
|
{% endautoescape %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% elif report.media_entry %}
|
{% elif report.is_media_entry_report() and report.media_entry %}
|
||||||
|
|
||||||
{% set media_entry = report.media_entry %}
|
{% set media_entry = report.media_entry %}
|
||||||
<div class="media_thumbnail">
|
<div class="media_thumbnail">
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>{% trans %}Active Reports Filed{% endtrans %}</h2>
|
<h2>{% trans %}Active Reports Filed{% endtrans %}</h2>
|
||||||
|
{% if report_list.count() %}
|
||||||
{% if not active_settings.last_page == 1 %}
|
{% if not active_settings.last_page == 1 %}
|
||||||
{% if 'active_p='~active_settings.current_page in request.query_string %}
|
{% if 'active_p='~active_settings.current_page in request.query_string %}
|
||||||
{% set query_string = request.query_string %}{% else %}
|
{% set query_string = request.query_string %}{% else %}
|
||||||
@ -70,7 +71,6 @@ curr_page !=p %}
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if report_list.count() %}
|
|
||||||
<table class="admin_panel processing">
|
<table class="admin_panel processing">
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
@ -121,6 +121,7 @@ curr_page !=p %}
|
|||||||
<p><em>{% trans %}No open reports found.{% endtrans %}</em></p>
|
<p><em>{% trans %}No open reports found.{% endtrans %}</em></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<h2>{% trans %}Closed Reports{% endtrans %}</h2>
|
<h2>{% trans %}Closed Reports{% endtrans %}</h2>
|
||||||
|
{% if closed_report_list.count() %}
|
||||||
{% if not closed_settings.last_page == 1 %}
|
{% if not closed_settings.last_page == 1 %}
|
||||||
{% if 'closed_p='~closed_settings.current_page in request.query_string %}
|
{% if 'closed_p='~closed_settings.current_page in request.query_string %}
|
||||||
{% set query_string = request.query_string %}{% else %}
|
{% set query_string = request.query_string %}{% else %}
|
||||||
@ -161,7 +162,6 @@ curr_page !=p %}
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if closed_report_list.count() %}
|
|
||||||
<table class="media_panel processing">
|
<table class="media_panel processing">
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
|
@ -34,6 +34,42 @@
|
|||||||
<h2>{% trans %}Active Users{% endtrans %}</h2>
|
<h2>{% trans %}Active Users{% endtrans %}</h2>
|
||||||
|
|
||||||
{% if user_list.count() %}
|
{% if user_list.count() %}
|
||||||
|
{% if not last_page == 1 %}
|
||||||
|
{% if 'p='~current_page in request.query_string %}
|
||||||
|
{% set query_string = request.query_string %}{% else %}
|
||||||
|
{% set query_string =
|
||||||
|
'p='~current_page~"&"+request.query_string %}
|
||||||
|
{% endif %}
|
||||||
|
<div class="right_align">
|
||||||
|
{% set first_vis = current_page-3 %}
|
||||||
|
{% set last_vis = current_page+3 %}
|
||||||
|
{% if 1 == current_page %}<b>1</b>{% else %}
|
||||||
|
<a href ="?{{ query_string.replace(
|
||||||
|
'p='~current_page,
|
||||||
|
'p='~1) }}">
|
||||||
|
1</a>{% endif %}
|
||||||
|
{% if first_vis > 1 %}...{% endif %}
|
||||||
|
{% for p in range(first_vis,last_vis+1) %}
|
||||||
|
{% if p > 1 and p < last_page and
|
||||||
|
current_page !=p %}
|
||||||
|
<a href="?{{ query_string.replace(
|
||||||
|
'p='~current_page,
|
||||||
|
'p='~p) }}">
|
||||||
|
{{ p }}</a>
|
||||||
|
{% elif p > 1 and p < last_page %}
|
||||||
|
<b>{{ p }}</b>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if last_vis < last_page %}...{% endif %}
|
||||||
|
{% if last_page != current_page %}
|
||||||
|
<a href ="?{{ query_string.replace(
|
||||||
|
'p='~current_page,
|
||||||
|
'p='~last_page) }}">
|
||||||
|
{{ last_page }}</a>
|
||||||
|
{% else %}<b>{{ last_page }}</b>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<table class="admin_panel processing">
|
<table class="admin_panel processing">
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans %}ID{% endtrans %}</th>
|
<th>{% trans %}ID{% endtrans %}</th>
|
||||||
|
@ -147,15 +147,13 @@
|
|||||||
{%- endautoescape %}
|
{%- endautoescape %}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a {% if not request.user -%}
|
{% if app_config.allow_reporting %}
|
||||||
href="{{ request.urlgen('mediagoblin.auth.login') }}"
|
<a href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_comment',
|
||||||
{%- else %}
|
|
||||||
href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_comment',
|
|
||||||
user=media.get_uploader.username,
|
user=media.get_uploader.username,
|
||||||
media=media.slug_or_id,
|
media=media.slug_or_id,
|
||||||
comment=comment.id) }}"
|
comment=comment.id) }}">
|
||||||
{%- endif %}>
|
{% trans %}Report{% endtrans %}</a>
|
||||||
{% trans %} Report {% endtrans %}</a>
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -181,7 +179,9 @@
|
|||||||
|
|
||||||
{% include "mediagoblin/utils/collections.html" %}
|
{% include "mediagoblin/utils/collections.html" %}
|
||||||
|
|
||||||
{% include "mediagoblin/utils/report.html" %}
|
{% if app_config.allow_reporting %}
|
||||||
|
{% include "mediagoblin/utils/report.html" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% include "mediagoblin/utils/license.html" %}
|
{% include "mediagoblin/utils/license.html" %}
|
||||||
|
|
||||||
|
@ -18,14 +18,9 @@
|
|||||||
|
|
||||||
{% block report_content -%}
|
{% block report_content -%}
|
||||||
<p>
|
<p>
|
||||||
<a
|
<a href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_media',
|
||||||
{% if not request.user -%}
|
|
||||||
href="{{ request.urlgen('mediagoblin.auth.login') }}"
|
|
||||||
{% else %}
|
|
||||||
href="{{ request.urlgen('mediagoblin.user_pages.media_home.report_media',
|
|
||||||
user=media.get_uploader.username,
|
user=media.get_uploader.username,
|
||||||
media=media.slug_or_id) }}"
|
media=media.slug_or_id) }}"
|
||||||
{% endif %}
|
|
||||||
class="button_action" id="button_reportmedia" title="Report media">
|
class="button_action" id="button_reportmedia" title="Report media">
|
||||||
{% trans %}Report media{% endtrans %}
|
{% trans %}Report media{% endtrans %}
|
||||||
</a>
|
</a>
|
||||||
|
@ -157,7 +157,8 @@ otherperson@example.com\n\nSGkgb3RoZXJwZXJzb24sCmNocmlzIGNvbW1lbnRlZCBvbiB5b3VyI
|
|||||||
def test_mark_all_comment_notifications_seen(self):
|
def test_mark_all_comment_notifications_seen(self):
|
||||||
""" Test that mark_all_comments_seen works"""
|
""" Test that mark_all_comments_seen works"""
|
||||||
|
|
||||||
user = fixture_add_user('otherperson', password='nosreprehto')
|
user = fixture_add_user('otherperson', password='nosreprehto',
|
||||||
|
privileges=[u'active'])
|
||||||
|
|
||||||
media_entry = fixture_media_entry(uploader=user.id, state=u'processed')
|
media_entry = fixture_media_entry(uploader=user.id, state=u'processed')
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ class TestOpenIDPlugin(object):
|
|||||||
def test_add_delete(self, openid_plugin_app):
|
def test_add_delete(self, openid_plugin_app):
|
||||||
"""Test adding and deleting openids"""
|
"""Test adding and deleting openids"""
|
||||||
# Add user
|
# Add user
|
||||||
test_user = fixture_add_user(password='')
|
test_user = fixture_add_user(password='', privileges=[u'active'])
|
||||||
openid = OpenIDUserURL()
|
openid = OpenIDUserURL()
|
||||||
openid.openid_url = 'http://real.myopenid.com'
|
openid.openid_url = 'http://real.myopenid.com'
|
||||||
openid.user_id = test_user.id
|
openid.user_id = test_user.id
|
||||||
|
@ -22,6 +22,7 @@ pytest.importorskip("requests")
|
|||||||
|
|
||||||
from mediagoblin import mg_globals
|
from mediagoblin import mg_globals
|
||||||
from mediagoblin.db.base import Session
|
from mediagoblin.db.base import Session
|
||||||
|
from mediagoblin.db.models import Privilege
|
||||||
from mediagoblin.tests.tools import get_app
|
from mediagoblin.tests.tools import get_app
|
||||||
from mediagoblin.tools import template
|
from mediagoblin.tools import template
|
||||||
|
|
||||||
@ -112,6 +113,9 @@ class TestPersonaPlugin(object):
|
|||||||
# Get user and detach from session
|
# Get user and detach from session
|
||||||
test_user = mg_globals.database.User.query.filter_by(
|
test_user = mg_globals.database.User.query.filter_by(
|
||||||
username=u'chris').first()
|
username=u'chris').first()
|
||||||
|
active_privilege = Privilege.query.filter(
|
||||||
|
Privilege.privilege_name==u'active').first()
|
||||||
|
test_user.all_privileges.append(active_privilege)
|
||||||
test_user.save()
|
test_user.save()
|
||||||
test_user = mg_globals.database.User.query.filter_by(
|
test_user = mg_globals.database.User.query.filter_by(
|
||||||
username=u'chris').first()
|
username=u'chris').first()
|
||||||
|
@ -160,7 +160,8 @@ class TestReportFiling:
|
|||||||
assert archived_report.reported_user_id == allie_id
|
assert archived_report.reported_user_id == allie_id
|
||||||
assert archived_report.created is not None
|
assert archived_report.created is not None
|
||||||
assert archived_report.resolved is not None
|
assert archived_report.resolved is not None
|
||||||
assert archived_report.result == u'This is a test of archiving reports\
|
assert archived_report.result == u'''This is a test of archiving reports.
|
||||||
.<br>natalie banned user allie indefinitely.<br>natalie deleted the comment.'
|
natalie banned user allie indefinitely.
|
||||||
|
natalie deleted the comment.'''
|
||||||
assert archived_report.discriminator == 'comment_report'
|
assert archived_report.discriminator == 'comment_report'
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
|
|||||||
get_media_entry_by_id, user_has_privilege, user_not_banned,
|
get_media_entry_by_id, user_has_privilege, user_not_banned,
|
||||||
require_active_login, user_may_delete_media, user_may_alter_collection,
|
require_active_login, user_may_delete_media, user_may_alter_collection,
|
||||||
get_user_collection, get_user_collection_item, active_user_from_url,
|
get_user_collection, get_user_collection_item, active_user_from_url,
|
||||||
get_optional_media_comment_by_id)
|
get_optional_media_comment_by_id, allow_reporting)
|
||||||
|
|
||||||
from werkzeug.contrib.atom import AtomFeed
|
from werkzeug.contrib.atom import AtomFeed
|
||||||
from werkzeug.exceptions import MethodNotAllowed
|
from werkzeug.exceptions import MethodNotAllowed
|
||||||
@ -643,6 +643,7 @@ def processing_panel(request):
|
|||||||
'failed_entries': failed_entries,
|
'failed_entries': failed_entries,
|
||||||
'processed_entries': processed_entries})
|
'processed_entries': processed_entries})
|
||||||
|
|
||||||
|
@allow_reporting
|
||||||
@get_user_media_entry
|
@get_user_media_entry
|
||||||
@user_has_privilege(u'reporter')
|
@user_has_privilege(u'reporter')
|
||||||
@get_optional_media_comment_by_id
|
@get_optional_media_comment_by_id
|
||||||
@ -682,4 +683,3 @@ def file_a_report(request, media, comment):
|
|||||||
request,
|
request,
|
||||||
'mediagoblin/user_pages/report.html',
|
'mediagoblin/user_pages/report.html',
|
||||||
context)
|
context)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user