Implemented reports for conversation messages
authorAlexander Ebert <ebert@woltlab.com>
Thu, 27 Sep 2012 16:57:58 +0000 (18:57 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Thu, 27 Sep 2012 16:58:49 +0000 (18:58 +0200)
files/lib/system/moderation/queue/report/ConversationMessageModerationQueueReportHandler.class.php [new file with mode: 0644]
objectType.xml
templates/conversation.tpl
templates/conversationMessageList.tpl
templates/moderationConversationMessage.tpl [new file with mode: 0644]
userGroupOption.xml

diff --git a/files/lib/system/moderation/queue/report/ConversationMessageModerationQueueReportHandler.class.php b/files/lib/system/moderation/queue/report/ConversationMessageModerationQueueReportHandler.class.php
new file mode 100644 (file)
index 0000000..e0b8b79
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+namespace wbb\system\moderation\queue;
+use wcf\data\conversation\Conversation;
+use wcf\data\conversation\ConversationList;
+use wcf\data\conversation\message\ConversationMessage;
+use wcf\data\conversation\message\ConversationMessageList;
+use wcf\data\conversation\message\ViewableConversationMessage;
+use wcf\data\moderation\queue\ModerationQueue;
+use wcf\system\exception\SystemException;
+use wcf\system\moderation\queue\report\IModerationQueueReportHandler;
+use wcf\system\moderation\queue\ModerationQueueManager;
+use wcf\system\WCF;
+
+/**
+ * An implementation of IModerationQueueReportHandler for conversation messages.
+ * 
+ * @author     Alexander Ebert
+ * @copyright  2001-2012 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    com.woltlab.wcf.conversation
+ * @subpackage system.moderation.queue
+ * @category   Community Framework
+ */
+class ConversationMessageModerationQueueReportHandler implements IModerationQueueReportHandler {
+       /**
+        * list of conversation message
+        * @var array<wcf\data\conversation\message\ConversationMessage>
+        */
+       protected static $messages = array();
+       
+       /**
+        * @see wcf\system\moderation\queue\IModerationQueueHandler::assignQueues()
+        */
+       public function assignQueues(array $queues) {
+               $assignments = array();
+               foreach ($queues as $queue) {
+                       $assignUser = false;
+                       if (WCF::getSession()->getPermission('mod.conversation.canModerateConversation')) {
+                               $assignUser = true;
+                       }
+                               
+                       $assignments[$queue->queueID] = $assignUser;
+               }
+       
+               ModerationQueueManager::getInstance()->setAssignment($assignments);
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\report\IModerationQueueReportHandler::canReport()
+        */
+       public function canReport($objectID) {
+               if (!$this->isValid($objectID)) {
+                       return false;
+               }
+               
+               if (!Conversation::isParticipant(array($this->getMessage($objectID)->conversationID))) {
+                       return false;
+               }
+               
+               return true;
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\IModerationQueueHandler::getContainerID()
+        */
+       public function getContainerID($objectID) {
+               return 0;
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\report\IModerationQueueReportHandler::getReportedContent()
+        */
+       public function getReportedContent(ViewableModerationQueue $queue) {
+               throw new SystemException("getReportedContent()");
+               WCF::getTPL()->assign(array(
+                       'message' => new ViewableConversationMessage($queue->getAffectedObject())
+               ));
+       
+               return WCF::getTPL()->fetch('moderationConversationMessage');
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\report\IModerationQueueReportHandler::getReportedObject()
+        */
+       public function getReportedObject($objectID) {
+               if ($this->isValid($objectID)) {
+                       return $this->getMessage($objectID);
+               }
+       
+               return null;
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\IModerationQueueHandler::isValid()
+        */
+       public function isValid($objectID) {
+               if ($this->getMessage($objectID) === null) {
+                       return false;
+               }
+               
+               return true;
+       }
+       
+       /**
+        * Returns a conversation message object by message id or null if message id is invalid.
+        * 
+        * @param       integer         $objectID
+        * @return      wcf\data\conversation\message\ConversationMessage
+        */
+       protected function getMessage($objectID) {
+               if (!array_key_exists($objectID, self::$messages)) {
+                       self::$messages[$objectID] = new ConversationMessage($objectID);
+                       if (!self::$messages[$objectID]->messageID) {
+                               self::$messages[$objectID] = null;
+                       }
+               }
+               
+               return self::$messages[$objectID];
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\IModerationQueueHandler::populate()
+        */
+       public function populate(array $queues) {
+               $objectIDs = array();
+               foreach ($queues as $object) {
+                       $objectIDs[] = $object->objectID;
+               }
+               
+               // fetch messages
+               $messageList = new ConversationMessageList();
+               $messageList->getConditionBuilder()->add("conversation_message.messageID IN (?)", array($objectIDs));
+               $messageList->sqlLimit = 0;
+               $messageList->readObjects();
+               $messages = $messageList->getObjects();
+               
+               // fetch conversations
+               $conversationIDs = array();
+               foreach ($messages as $message) {
+                       $conversationIDs[] = $message->conversationID;
+               }
+               
+               $conversationList = new ConversationList();
+               $conversationList->getConditionBuilder()->add("conversation.conversationID IN (?)", array($conversationIDs));
+               $conversationList->sqlLimit = 0;
+               $conversationList->readObjects();
+               $conversations = $conversationList->getObjects();
+               
+               foreach ($queues as $object) {
+                       if (isset($messages[$object->objectID])) {
+                               $message = $messages[$object->objectID];
+                               $message->setConversation($conversations[$message->conversationID]);
+                               
+                               $object->setAffectedObject($message);
+                       }
+               }
+       }
+       
+       /**
+        * @see wcf\system\moderation\queue\IModerationQueueHandler::removeContent()
+        */
+       public function removeContent(ModerationQueue $queue, $message) {
+               throw new SystemException("Conversation message cannot be deleted");
+       }
+}
index 7fb9b9a25b05f8f830fa8c264903005f09878ed7..bcb2627450dd153acfa57d85a46cc94fd2be3395 100644 (file)
                        <classname>wcf\system\message\quote\ConversationMessageQuoteHandler</classname>
                </type>
                
+               <type>
+                       <name>com.woltlab.wcf.conversation.message</name>
+                       <definitionname>com.woltlab.wcf.moderation.report</definitionname>
+                       <classname>wcf\system\moderation\queue\report\ConversationMessageModerationQueueReportHandler</classname>
+               </type>
                
                <!-- user online locations -->
                <type>
index 36cfe54ef060256af3dd6952bc69fcc86b493267..26c18229cd760acc496b01307c614811400da3a4 100644 (file)
@@ -6,6 +6,7 @@
        {include file='headInclude'}
        
        <script type="text/javascript" src="{@$__wcf->getPath()}js/WCF.Conversation.js"></script>
+       <script type="text/javascript" src="{@$__wcf->getPath()}js/WCF.Moderation.js"></script>
        <script type="text/javascript">
                //<![CDATA[
                $(function() {
@@ -31,6 +32,8 @@
                        {include file='__messageQuoteManager' wysiwygSelector='text' supportPaste=true}
                        new WCF.Conversation.Message.QuoteHandler($quoteManager);
                        {if !$conversation->isClosed}new WCF.Conversation.QuickReply($quoteManager);{/if}
+                       
+                       new WCF.Moderation.Report.Content('com.woltlab.wcf.conversation.message', '.jsReportConversationMessage');
                });
                //]]>
        </script>
 
 {include file='userNotice'}
 
-<div class="container containerPadding marginTop shadow">
-       <fieldset>
-               <legend>{lang}wcf.conversation.participants{/lang}</legend>
-
-               <ul class="conversationParticipantList">
-                       {foreach from=$participants item=participant}
-                               <li class="box24">
-                                       <a href="{link controller='User' object=$participant}{/link}" class="framed">{@$participant->getAvatar()->getImageTag(24)}</a>
-                                       <hgroup>
-                                               <h1><a href="{link controller='User' object=$participant}{/link}" class="userLink{if $participant->hideConversation == 2} conversationLeft{/if}" data-user-id="{@$participant->userID}">{$participant->username}</a></h1>
-                                               <h2><dl class="inlineDataList">
-                                                       <dt>{lang}wcf.conversation.lastVisitTime{/lang}</dt>
-                                                       <dd>{if $participant->lastVisitTime}{@$participant->lastVisitTime|time}{else}-{/if}</dd>
-                                               </dl></h2>
-                                       </hgroup>
-                               </li>
-                       {/foreach}
-               </ul>
-       </fieldset>
-</div>
+{if !$conversation->isDraft}
+       <div class="container containerPadding marginTop shadow">
+               <fieldset>
+                       <legend>{lang}wcf.conversation.participants{/lang}</legend>
+       
+                       <ul class="conversationParticipantList">
+                               {foreach from=$participants item=participant}
+                                       <li class="box24">
+                                               <a href="{link controller='User' object=$participant}{/link}" class="framed">{@$participant->getAvatar()->getImageTag(24)}</a>
+                                               <hgroup>
+                                                       <h1><a href="{link controller='User' object=$participant}{/link}" class="userLink{if $participant->hideConversation == 2} conversationLeft{/if}" data-user-id="{@$participant->userID}">{$participant->username}</a></h1>
+                                                       <h2><dl class="inlineDataList">
+                                                               <dt>{lang}wcf.conversation.lastVisitTime{/lang}</dt>
+                                                               <dd>{if $participant->lastVisitTime}{@$participant->lastVisitTime|time}{else}-{/if}</dd>
+                                                       </dl></h2>
+                                               </hgroup>
+                                       </li>
+                               {/foreach}
+                       </ul>
+               </fieldset>
+       </div>
+{/if}
 
 <div class="contentNavigation">
        {pages print=true assign=pagesLinks controller='Conversation' object=$conversation link="pageNo=%d"}
index d108a868f4219f2b4a76dcf011205838e8328f34..2e53735ceee3b91703ccc6d6aee5a7aea9099b56 100644 (file)
@@ -48,6 +48,7 @@
                                                                        <ul class="smallButtons">
                                                                                {if $message->canEdit()}<li><a href="{link controller='ConversationMessageEdit' id=$message->messageID}{/link}" title="{lang}wcf.conversation.message.edit{/lang}" class="button jsMessageEditButton"><img src="{icon}edit{/icon}" alt="" class="icon16" /> <span>{lang}wcf.global.button.edit{/lang}</span></a></li>{/if}
                                                                                <li class="jsQuoteMessage" data-object-id="{@$message->messageID}" data-is-quoted="{if $__quoteFullQuote|isset && $message->messageID|in_array:$__quoteFullQuote}1{else}0{/if}"><a href="{link controller='ConversationMessageAdd' id=$conversation->conversationID quoteMessageID=$message->messageID}{/link}" title="{lang}wcf.message.quote.quoteMessage{/lang}" class="button jsTooltip{if $__quoteFullQuote|isset && $message->messageID|in_array:$__quoteFullQuote} active{/if}"><img src="{icon}comment{/icon}" alt="" class="icon16" /> <span class="invisible">{lang}wbb.message.quote.quoteMessage{/lang}</span></a></li>
+                                                                               {if $conversation->userID != $__wcf->getUser()->userID}<li class="jsReportConverstionMessage" data-object-id="{@$message->messageID}"><a title="{lang}wcf.conversation.message.report{/lang}" class="button jsTooltip"><img src="{icon}warning{/icon}" alt="" class="icon16" /></a></li>{/if}
                                                                                <li class="toTopLink"><a href="{@$__wcf->getAnchor('top')}" title="{lang}wcf.global.scrollUp{/lang}" class="button jsTooltip"><img src="{icon}circleArrowUp{/icon}" alt="" class="icon16" /> <span class="invisible">{lang}wcf.global.scrollUp{/lang}</span></a></li>
                                                                        </ul>
                                                                </nav>
diff --git a/templates/moderationConversationMessage.tpl b/templates/moderationConversationMessage.tpl
new file mode 100644 (file)
index 0000000..09f1b00
--- /dev/null
@@ -0,0 +1,28 @@
+<article class="message messageReduced">
+       <div>
+               <section class="messageContent">
+                       <div>
+                               <header class="messageHeader">
+                                       <div class="messageCredits box32">
+                                               <a href="{link controller='User' object=$message->getUserProfile()->getDecoratedObject()}{/link}" class="framed">{@$message->getUserProfile()->getAvatar()->getImageTag(32)}</a>
+                                               <div>
+                                                       <p><a href="{link controller='User' object=$message->getUserProfile()->getDecoratedObject()}{/link}">{$message->getUsername()}</a><p>
+                                                       
+                                                       {@$message->getTime()|time}
+                                               </div>
+                                       </div>
+                                       
+                                       <h1 class="messageTitle"><a href="{@$message->getLink()}">{$message->getTitle()}</a></h1>
+                               </header>
+                               
+                               <div class="messageBody">
+                                       <div>
+                                               <div class="messageText">
+                                                       {@$message->getFormattedMessage()}
+                                               </div>
+                                       </div>
+                               </div>
+                       </div>
+               </section>
+       </div>
+</article>
\ No newline at end of file
index 19aae648245d7a523e24769779403f9524f76d9a..808d9d02c36a720ff7848d1053d78b4c754c9bd7 100644 (file)
@@ -2,6 +2,11 @@
 <data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/userGroupOption.xsd">
        <import>
                <categories>
+                       <category name="mod.general.conversation">
+                               <parent>mod.general</parent>
+                               <options>module_conversation</options>
+                       </category>
+                       
                        <category name="user.conversation">
                                <parent>user</parent>
                                <options>module_conversation</options>
@@ -9,6 +14,16 @@
                </categories>
                
                <options>
+                       <!-- mod -->
+                       <option name="mod.conversation.canModerateConversation">
+                               <categoryname>mod.general.conversation</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>0</defaultvalue>
+                               <admindefaultvalue>1</admindefaultvalue>
+                       </option>
+                       <!-- /mod -->
+                       
+                       <!-- general -->
                        <option name="user.conversation.canUseConversation">
                                <categoryname>user.conversation</categoryname>
                                <optiontype>boolean</optiontype>
@@ -68,6 +83,7 @@ pdf]]></defaultvalue>
                                <defaultvalue>5</defaultvalue>
                                <options>module_attachment</options>
                        </option>
+                       <!-- /user -->
                </options>
        </import>
 </data>