In this commit, I'm deleting the ArchivedReports object, at paroneyea's recom-
authortilly-Q <nattilypigeonfowl@gmail.com>
Wed, 11 Sep 2013 21:09:21 +0000 (17:09 -0400)
committertilly-Q <nattilypigeonfowl@gmail.com>
Wed, 11 Sep 2013 21:09:21 +0000 (17:09 -0400)
-mendation. Instead, all of its functionality will be in the ReportBase object.

mediagoblin/db/migrations.py
mediagoblin/db/models.py
mediagoblin/moderation/tools.py
mediagoblin/moderation/views.py
mediagoblin/tests/test_moderation.py
mediagoblin/tests/test_reporting.py

index 984ef06067b1d03b192db904b864c937d34ce728..eb3f98801d67bd916b209fad6ffc2271eae98b9c 100644 (file)
@@ -470,6 +470,9 @@ class ReportBase_v0(declarative_base()):
     reported_user_id = Column(Integer, ForeignKey(User.id), nullable=False)
     created = Column(DateTime, nullable=False, default=datetime.datetime.now)
     discriminator = Column('type', Unicode(50))
+    resolver_id = Column(Integer, ForeignKey(User.id))
+    resolved = Column(DateTime)
+    result = Column(UnicodeText)
     __mapper_args__ = {'polymorphic_on': discriminator}
 
 class CommentReport_v0(ReportBase_v0):
@@ -487,17 +490,6 @@ class MediaReport_v0(ReportBase_v0):
     id = Column('id',Integer, ForeignKey('core__reports.id'), primary_key=True)
     media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=False)
 
-class ArchivedReport_v0(ReportBase_v0):
-    __tablename__ = 'core__reports_archived'
-    __mapper_args__ = {'polymorphic_identity': 'archived_report'}
-
-    id = Column('id',Integer, ForeignKey('core__reports.id'), primary_key=True)
-    media_entry_id = Column(Integer, ForeignKey(MediaEntry.id))
-    comment_id = Column(Integer, ForeignKey(MediaComment.id))
-    resolver_id = Column(Integer, ForeignKey(User.id), nullable=False)
-    resolved_time = Column(DateTime)
-    result = Column(UnicodeText)
-
 class UserBan_v0(declarative_base()):
     __tablename__ = 'core__user_bans'
     user_id = Column('id',Integer, ForeignKey(User.id), nullable=False,
@@ -528,7 +520,6 @@ def create_moderation_tables(db):
     ReportBase_v0.__table__.create(db.bind)
     CommentReport_v0.__table__.create(db.bind)
     MediaReport_v0.__table__.create(db.bind)
-    ArchivedReport_v0.__table__.create(db.bind)
     UserBan_v0.__table__.create(db.bind)
     Privilege_v0.__table__.create(db.bind)
     PrivilegeUserAssociation_v0.__table__.create(db.bind)
index ce1de36b1f5500c1c3937d9a6381bbe5747f552d..3f9fde3a596c3f9c889d5a0e72e8aadf3750b4cc 100644 (file)
@@ -694,6 +694,14 @@ class ReportBase(Base):
                                             -port was filed.
         :keyword    discriminator       This column distinguishes between the
                                             different types of reports.
+        :keyword    resolver_id         Holds the id of the moderator/admin who
+                                            resolved the report.
+        :keyword    resolved            Holds the DateTime object which descri-
+                                            -bes when this report was resolved
+        :keyword    result              Holds the UnicodeText column of the
+                                            resolver's reasons for resolving
+                                            the report this way. Some of this
+                                            is auto-generated
     """
     __tablename__ = 'core__reports'
     id = Column(Integer, primary_key=True)
@@ -714,6 +722,16 @@ class ReportBase(Base):
         primaryjoin="User.id==ReportBase.reported_user_id")
     created = Column(DateTime, nullable=False, default=datetime.datetime.now())
     discriminator = Column('type', Unicode(50))
+    resolver_id = Column(Integer, ForeignKey(User.id))
+    resolver = relationship(
+        User,
+        backref=backref("reports_resolved_by",
+            lazy="dynamic",
+            cascade="all, delete-orphan"),
+        primaryjoin="User.id==ReportBase.resolver_id")
+
+    resolved = Column(DateTime)
+    result = Column(UnicodeText)
     __mapper_args__ = {'polymorphic_on': discriminator}
 
     def is_comment_report(self):
@@ -723,7 +741,12 @@ class ReportBase(Base):
         return self.discriminator=='media_report'
 
     def is_archived_report(self):
-        return self.discriminator=='archived_report'
+        return self.resolved is not None
+
+    def archive(self,resolver_id, resolved, result):
+        self.resolver_id   = resolver_id
+        self.resolved   = resolved
+        self.result     = result
 
 
 class CommentReport(ReportBase):
@@ -737,12 +760,13 @@ class CommentReport(ReportBase):
 
     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)
     comment = relationship(
         MediaComment, backref=backref("reports_filed_on",
             lazy="dynamic",
             cascade="all, delete-orphan"))
 
+
 class MediaReport(ReportBase):
     """
     Reports that have been filed on media entries
@@ -754,59 +778,13 @@ class MediaReport(ReportBase):
 
     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)
     media_entry = relationship(
         MediaEntry,
         backref=backref("reports_filed_onmod/reports/1/",
             lazy="dynamic",
             cascade="all, delete-orphan"))
 
-class ArchivedReport(ReportBase):
-    """
-    Reports that have been resolved. The media_entry and comment columns must
-    be optional so that if the media entry/comment is deleted, the archive can
-    still exist.
-        :keyword    comment_id          Holds the Integer value of the reported
-                                            comment's ID. This column is optio-
-                                            -nal.
-        :keyword    media_entry_id      Holds the Integer value of the reported
-                                            media entry's ID. This column is
-                                            optional.
-        :keyword    resolver_id         Holds the id of the moderator/admin who
-                                            resolved the report.
-        :keyword    resolved            Holds the DateTime object which descri-
-                                            -bes when this report was resolved
-        :keyword    result              Holds the UnicodeText column of the
-                                            resolver's reasons for resolving
-                                            the report this way. Some of this
-                                            is auto-generated
-    """
-    __tablename__ = 'core__reports_archived'
-    __mapper_args__ = {'polymorphic_identity': 'archived_report'}
-    id = Column('id',Integer, ForeignKey('core__reports.id'),
-                primary_key=True)
-
-    media_entry_id = Column(Integer, ForeignKey(MediaEntry.id))
-    media_entry = relationship(
-        MediaEntry,
-        backref=backref("past_reports_filed_on",
-            lazy="dynamic"))
-    comment_id = Column(Integer, ForeignKey(MediaComment.id))
-    comment = relationship(
-        MediaComment, backref=backref("past_reports_filed_on",
-            lazy="dynamic"))
-
-    resolver_id = Column(Integer, ForeignKey(User.id), nullable=False)
-    resolver = relationship(
-        User,
-        backref=backref("reports_resolved_by",
-            lazy="dynamic",
-            cascade="all, delete-orphan"),
-        primaryjoin="User.id==ArchivedReport.resolver_id")
-
-    resolved = Column(DateTime)
-    result = Column(UnicodeText)
-
 class UserBan(Base):
     """
     Holds the information on a specific user's ban-state. As long as one of
@@ -887,7 +865,7 @@ MODELS = [
     MediaFile, FileKeynames, MediaAttachmentFile, ProcessingMetaData,
     Notification, CommentNotification, ProcessingNotification, Client,
     CommentSubscription, ReportBase, CommentReport, MediaReport, UserBan,
-       Privilege, PrivilegeUserAssociation, ArchivedReport,
+       Privilege, PrivilegeUserAssociation,
     RequestToken, AccessToken, NonceTimestamp]
 
 """
index 2d680c15769c9e6dece676321f6c51e256312bba..3ba79b384b69d3e001cc35f063633e749a7069e8 100644 (file)
@@ -15,7 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from mediagoblin import mg_globals
-from mediagoblin.db.models import User, Privilege, ArchivedReport, UserBan
+from mediagoblin.db.models import User, Privilege, UserBan
 from mediagoblin.db.base import Session
 from mediagoblin.tools.mail import send_email
 from mediagoblin.tools.response import redirect
@@ -68,15 +68,6 @@ def take_punitive_actions(request, form, report, user):
                 u"<br>%s sent a warning email to the offender." % (
                     request.user.username)
 
-        archive = ArchivedReport(
-            reporter_id=report.reporter_id,
-            report_content=report.report_content,
-            reported_user_id=report.reported_user_id,
-            created=report.created,
-            resolved=datetime.now(),
-            resolver_id=request.user.id
-            )
-
         if u'delete' in form.action_to_resolve.data and \
             report.is_comment_report():
                 deleted_comment = report.comment
@@ -91,20 +82,12 @@ def take_punitive_actions(request, form, report, user):
                 form.resolution_content.data += \
                     u"<br>%s deleted the media entry." % (
                         request.user.username)
-
-        # If the moderator didn't delete the content we then attach the
-        # content to the archived report. We also have to actively delete the
-        # old report, since it won't be deleted by cascading.
-        elif report.is_comment_report():
-            archive.comment_id = report.comment_id
-            Session.delete(report)
-        elif report.is_media_entry_report():
-            archive.media_entry_id = report.media_entry.id
-            Session.delete(report)
-
-
-        archive.result=form.resolution_content.data
-        Session.add(archive)
+        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(
index 6a23ddd65a573c353edf1eb62a6c09de0ab61541..45edff1dc3f7ae7add65feb7aebcaa7ef463c028 100644 (file)
@@ -18,7 +18,7 @@ from werkzeug.exceptions import Forbidden
 
 from mediagoblin.db.models import (MediaEntry, User, MediaComment, \
                                    CommentReport, ReportBase, Privilege, \
-                                   UserBan, ArchivedReport)
+                                   UserBan)
 from mediagoblin.decorators import (require_admin_or_moderator_login, \
                                     active_user_from_url, user_has_privilege)
 from mediagoblin.tools.response import render_to_response, redirect
@@ -72,9 +72,9 @@ def moderation_users_detail(request):
     '''
     user = User.query.filter_by(username=request.matchdict['user']).first()
     active_reports = user.reports_filed_on.filter(
-        ReportBase.discriminator!='archived_report').limit(5)
+        ReportBase.resolved==None).limit(5)
     closed_reports = user.reports_filed_on.filter(
-        ReportBase.discriminator=='archived_report').all()
+        ReportBase.resolved!=None).all()
     privileges = Privilege.query
     user_banned = UserBan.query.get(user.id)
     ban_form = moderation_forms.BanForm()
@@ -108,10 +108,10 @@ def moderation_reports_panel(request):
                for key,val in filters.viewitems()]
 
     all_active = ReportBase.query.filter(
-        ReportBase.discriminator!="archived_report").filter(
+        ReportBase.resolved==None).filter(
         *filters)
     all_closed = ReportBase.query.filter(
-        ReportBase.discriminator=="archived_report").filter(
+        ReportBase.resolved!=None).filter(
         *filters)
 
     # report_list and closed_report_list are the two lists of up to 10
index 12bf5153db2634686072c9cb3a70fd757318d045..8de76e446b35510e2a460a7617314ce408116e90 100644 (file)
@@ -120,13 +120,17 @@ class TestModerationViews:
             'targeted_user':self.user.id},
             url='/mod/reports/{0}/'.format(comment_report.id))
 
+        self.query_for_users()
+        comment_report = CommentReport.query.filter(
+            CommentReport.reported_user==self.user).first()
         assert response.status == '302 FOUND'
+        assert not self.user.has_privilege(u'commenter')
+        assert comment_report.is_archived_report() is True
+
         fixture_add_comment_report(reported_user=self.user)
         comment_report = CommentReport.query.filter(
             CommentReport.reported_user==self.user).first()
 
-        assert not self.user.has_privilege(u'commenter')
-
         # Then, test a moderator sending an email to a user in response to a
         # reported comment
         #----------------------------------------------------------------------
@@ -137,6 +141,9 @@ class TestModerationViews:
             'targeted_user':self.user.id},
             url='/mod/reports/{0}/'.format(comment_report.id))
 
+        self.query_for_users()
+        comment_report = CommentReport.query.filter(
+            CommentReport.reported_user==self.user).first()
         assert response.status == '302 FOUND'
         assert mail.EMAIL_TEST_MBOX_INBOX ==  [{'to': [u'regular@example.com'],
             'message': 'Content-Type: text/plain; charset="utf-8"\n\
@@ -144,6 +151,7 @@ MIME-Version: 1.0\nContent-Transfer-Encoding: base64\nSubject: Warning from- \
 moderator \nFrom: notice@mediagoblin.example.org\nTo: regular@example.com\n\n\
 VGhpcyBpcyB5b3VyIGxhc3Qgd2FybmluZywgcmVndWxhci4uLi4=\n',
             'from': 'notice@mediagoblin.example.org'}]
+        assert comment_report.is_archived_report() is True
 
         # Then test a moderator banning a user AND a moderator deleting the
         # offending comment. This also serves as a test for taking multiple
@@ -157,7 +165,8 @@ VGhpcyBpcyB5b3VyIGxhc3Qgd2FybmluZywgcmVndWxhci4uLi4=\n',
         fixture_add_comment_report(comment=test_comment,
             reported_user=self.user)
         comment_report = CommentReport.query.filter(
-            CommentReport.reported_user==self.user).first()
+            CommentReport.comment==test_comment).filter(
+            CommentReport.resolved==None).first()
 
         response, context = self.do_post(
             {'action_to_resolve':[u'userban', u'delete'],
@@ -179,7 +188,8 @@ VGhpcyBpcyB5b3VyIGxhc3Qgd2FybmluZywgcmVndWxhci4uLi4=\n',
         #----------------------------------------------------------------------
         fixture_add_comment_report(reported_user=self.admin_user)
         comment_report = CommentReport.query.filter(
-            CommentReport.reported_user==self.admin_user).first()
+            CommentReport.reported_user==self.admin_user).filter(
+            CommentReport.resolved==None).first()
 
         response, context = self.do_post({'action_to_resolve':[u'takeaway'],
             'take_away_privileges':[u'active'],
index 1bc7df268859efa229d6b012dc511b84bdad2382..b414a5802dfa9cd24011e85bc9e33e05d49adc50 100644 (file)
@@ -20,7 +20,7 @@ from mediagoblin.tools import template
 from mediagoblin.tests.tools import (fixture_add_user, fixture_media_entry,
         fixture_add_comment, fixture_add_comment_report)
 from mediagoblin.db.models import (MediaReport, CommentReport, User,
-    MediaComment,ArchivedReport)
+    MediaComment)
 
 
 class TestReportFiling:
@@ -148,11 +148,12 @@ class TestReportFiling:
             url='/mod/reports/{0}/'.format(comment_report.id))
 
         assert response.status == "302 FOUND"
-        self.query_for_users()
+        allie_user, natalie_user = self.query_for_users()
 
-        archived_report = ArchivedReport.query.first()
+        archived_report = CommentReport.query.filter(
+            CommentReport.reported_user==allie_user).first()
 
-        assert CommentReport.query.count() == 0
+        assert CommentReport.query.count() != 0
         assert archived_report is not None
         assert archived_report.report_content == u'Testing Archived Reports #1'
         assert archived_report.reporter_id == natalie_id
@@ -161,5 +162,5 @@ class TestReportFiling:
         assert archived_report.resolved is not None
         assert archived_report.result == u'This is a test of archiving reports\
 .<br>natalie banned user allie indefinitely.<br>natalie deleted the comment.'
-        assert archived_report.discriminator == 'archived_report'
+        assert archived_report.discriminator == 'comment_report'