Add possibility to report contents again
authorMatthias Schmidt <gravatronics@live.com>
Sun, 13 Apr 2014 17:59:54 +0000 (19:59 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Sun, 13 Apr 2014 17:59:54 +0000 (19:59 +0200)
If a moderation queue report entry is marked as done, the reported content can be reported again.

wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueReportAction.class.php
wcfsetup/install/files/lib/system/moderation/queue/ModerationQueueReportManager.class.php
wcfsetup/setup/db/install.sql

index 1b3cc570ada0a47e350a6a85cba013de58562625..ad887837fb632319f83e3e977d561411a47b15f1 100644 (file)
@@ -91,7 +91,7 @@ class ModerationQueueReportAction extends ModerationQueueAction {
         */
        public function prepareReport() {
                // content was already reported
-               $alreadyReported = (ModerationQueueReportManager::getInstance()->isAlreadyReported($this->parameters['objectType'], $this->parameters['objectID'])) ? 1 : 0;
+               $alreadyReported = (ModerationQueueReportManager::getInstance()->hasPendingReport($this->parameters['objectType'], $this->parameters['objectID'])) ? 1 : 0;
                
                WCF::getTPL()->assign(array(
                        'alreadyReported' => $alreadyReported,
@@ -119,7 +119,7 @@ class ModerationQueueReportAction extends ModerationQueueAction {
        public function report() {
                // if the specified content was already reported, e.g. a different user reported this
                // item meanwhile, silently ignore it. Just display a success and the user is happy :)
-               if (!ModerationQueueReportManager::getInstance()->isAlreadyReported($this->parameters['objectType'], $this->parameters['objectID'])) {
+               if (!ModerationQueueReportManager::getInstance()->hasPendingReport($this->parameters['objectType'], $this->parameters['objectID'])) {
                        ModerationQueueReportManager::getInstance()->addReport(
                                $this->parameters['objectType'],
                                $this->parameters['objectID'],
index 3ca563ed2b13e9ccce37526f0fd93f4ed0953708..e213adb0d07074da2343a51c0bad945fee4ef977 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 namespace wcf\system\moderation\queue;
+use wcf\data\moderation\queue\ModerationQueue;
+use wcf\data\moderation\queue\ModerationQueueAction;
 use wcf\data\moderation\queue\ViewableModerationQueue;
 use wcf\system\exception\SystemException;
 use wcf\system\request\LinkHandler;
@@ -37,14 +39,39 @@ class ModerationQueueReportManager extends AbstractModerationQueueManager {
                                AND objectID = ?";
                $statement = WCF::getDB()->prepareStatement($sql);
                $statement->execute(array(
-                               $objectTypeID,
-                               $objectID
+                       $objectTypeID,
+                       $objectID
                ));
                $row = $statement->fetchArray();
                
                return ($row['count'] == 0 ? false : true);
        }
        
+       /**
+        * Returns true if the object with the given data has a pending report.
+        * A pending report has a status other than done.
+        * 
+        * @param       string          $objectType
+        * @param       integer         $objectID
+        * @return      boolean
+        */
+       public function hasPendingReport($objectType, $objectID) {
+               $objectTypeID = $this->getObjectTypeID($objectType);
+               
+               $sql = "SELECT  status
+                       FROM    wcf".WCF_N."_moderation_queue
+                       WHERE   objectTypeID = ?
+                               AND objectID = ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array(
+                       $objectTypeID,
+                       $objectID
+               ));
+               $status = $statement->fetchColumn();
+               
+               return $status !== false && $status != ModerationQueue::STATUS_DONE;
+       }
+       
        /**
         * Returns true if current user can report given content.
         * 
@@ -105,4 +132,50 @@ class ModerationQueueReportManager extends AbstractModerationQueueManager {
                        $additionalData
                );
        }
+       
+       /**
+        * @see \wcf\system\moderation\queue\AbstractModerationQueueManager::addEntry()
+        */
+       protected function addEntry($objectTypeID, $objectID, $containerID = 0, array $additionalData = array()) {
+               $sql = "SELECT  queueID
+                       FROM    wcf".WCF_N."_moderation_queue
+                       WHERE   objectTypeID = ?
+                               AND objectID = ?
+                               AND status <> ?";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute(array(
+                       $objectTypeID,
+                       $objectID,
+                       ModerationQueue::STATUS_DONE
+               ));
+               $row = $statement->fetchArray();
+               
+               if ($row === false) {
+                       $objectAction = new ModerationQueueAction(array(), 'create', array(
+                               'data' => array(
+                                       'objectTypeID' => $objectTypeID,
+                                       'objectID' => $objectID,
+                                       'containerID' => $containerID,
+                                       'userID' => (WCF::getUser()->userID ?: null),
+                                       'time' => TIME_NOW,
+                                       'additionalData' => serialize($additionalData)
+                               )
+                       ));
+                       $objectAction->executeAction();
+               }
+               else {
+                       $objectAction = new ModerationQueueAction(array($row['queueID']), 'update', array(
+                               'data' => array(
+                                       'status' => ModerationQueue::STATUS_OUTSTANDING,
+                                       'containerID' => $containerID,
+                                       'userID' => (WCF::getUser()->userID ?: null),
+                                       'time' => TIME_NOW,
+                                       'additionalData' => serialize($additionalData)
+                               )
+                       ));
+                       $objectAction->executeAction();
+               }
+               
+               ModerationQueueManager::getInstance()->resetModerationCount();
+       }
 }
index fe09ea57c43310982be9e9b4300de874d1fe99cc..e1d3822ad9884a2cb7b7a8336fe86861dc0f70e0 100644 (file)
@@ -458,9 +458,7 @@ CREATE TABLE wcf1_moderation_queue (
        lastChangeTime INT(10) NOT NULL DEFAULT 0,
        
        -- additional data, e.g. message if reporting content
-       additionalData TEXT,
-       
-       UNIQUE KEY affectedObject (objectTypeID, objectID)
+       additionalData TEXT
 );
 
 DROP TABLE IF EXISTS wcf1_moderation_queue_to_user;