Changeset 55 for trunk

Show
Ignore:
Timestamp:
12/20/05 11:44:03 (3 years ago)
Author:
fabien
Message:

day 20 modifications

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/config/schema.xml

    r44 r55  
    1212     <column name="html_body" type="longvarchar" /> 
    1313     <column name="interested_users" type="integer" default="0" /> 
     14     <column name="reports" type="integer" default="0" /> 
    1415     <column name="created_at" type="timestamp" /> 
    1516     <column name="updated_at" type="timestamp" /> 
     
    1920     <column name="id" type="integer" required="true" primaryKey="true" autoincrement="true" /> 
    2021     <column name="question_id" type="integer" /> 
    21      <foreign-key foreignTable="ask_question"
     22     <foreign-key foreignTable="ask_question" onDelete="cascade"
    2223       <reference local="question_id" foreign="id"/> 
    2324     </foreign-key> 
     
    3031     <column name="relevancy_up" type="integer" default="0" /> 
    3132     <column name="relevancy_down" type="integer" default="0" /> 
     33     <column name="reports" type="integer" default="0" /> 
    3234     <column name="created_at" type="timestamp" /> 
    3335   </table> 
     
    4244     <column name="salt" type="varchar" size="32" /> 
    4345     <column name="has_paypal" type="boolean" default="0" /> 
     46     <column name="want_to_be_moderator" type="boolean" default="0" /> 
     47     <column name="is_moderator" type="boolean" default="0" /> 
     48     <column name="is_administrator" type="boolean" default="0" /> 
     49     <column name="deletions" type="integer" default="0" /> 
    4450     <column name="created_at" type="timestamp" /> 
    4551   </table> 
     
    4753   <table name="ask_interest" phpName="Interest"> 
    4854     <column name="question_id" type="integer" primaryKey="true" /> 
    49      <foreign-key foreignTable="ask_question"
     55     <foreign-key foreignTable="ask_question" onDelete="cascade"
    5056       <reference local="question_id" foreign="id"/> 
    5157     </foreign-key> 
     
    5965   <table name="ask_relevancy" phpName="Relevancy"> 
    6066     <column name="answer_id" type="integer" primaryKey="true" /> 
    61      <foreign-key foreignTable="ask_answer"
     67     <foreign-key foreignTable="ask_answer" onDelete="cascade"
    6268       <reference local="answer_id" foreign="id"/> 
    6369     </foreign-key> 
     
    7177 
    7278   <table name="ask_question_tag" phpName="QuestionTag"> 
    73      <column name="question_id" type="integer" /> 
    74      <foreign-key foreignTable="ask_question"
     79     <column name="question_id" type="integer" primaryKey="true" /> 
     80     <foreign-key foreignTable="ask_question" onDelete="cascade"
    7581       <reference local="question_id" foreign="id" /> 
    7682     </foreign-key> 
    77      <column name="user_id" type="integer" /> 
     83     <column name="user_id" type="integer" primaryKey="true" /> 
    7884     <foreign-key foreignTable="ask_user"> 
    7985       <reference local="user_id" foreign="id" /> 
     
    8187     <column name="created_at" type="timestamp" /> 
    8288     <column name="tag" type="varchar" size="100" /> 
    83      <column name="normalized_tag" type="varchar" size="100" /> 
     89     <column name="normalized_tag" type="varchar" size="100" primaryKey="true" /> 
    8490     <index name="normalized_tag_index"> 
    8591       <index-column name="normalized_tag" /> 
    8692     </index> 
    87      <unique name="pk"> 
    88        <unique-column name="question_id" /> 
    89        <unique-column name="user_id" /> 
    90        <unique-column name="normalized_tag" /> 
    91      </unique> 
     93   </table> 
     94 
     95   <table name="ask_report_question" phpName="ReportQuestion"> 
     96     <column name="question_id" type="integer" primaryKey="true" /> 
     97     <foreign-key foreignTable="ask_question" onDelete="cascade"> 
     98       <reference local="question_id" foreign="id" /> 
     99     </foreign-key> 
     100     <column name="user_id" type="integer" primaryKey="true" /> 
     101     <foreign-key foreignTable="ask_user"> 
     102       <reference local="user_id" foreign="id" /> 
     103     </foreign-key> 
     104     <column name="created_at" type="timestamp" /> 
     105   </table> 
     106 
     107   <table name="ask_report_answer" phpName="ReportAnswer"> 
     108     <column name="answer_id" type="integer" primaryKey="true" /> 
     109     <foreign-key foreignTable="ask_answer" onDelete="cascade"> 
     110       <reference local="answer_id" foreign="id" /> 
     111     </foreign-key> 
     112     <column name="user_id" type="integer" primaryKey="true" /> 
     113     <foreign-key foreignTable="ask_user"> 
     114       <reference local="user_id" foreign="id" /> 
     115     </foreign-key> 
     116     <column name="created_at" type="timestamp" /> 
    92117   </table> 
    93118 
  • trunk/data/fixtures/test_data.yml

    r38 r55  
    1111    password:   symfony 
    1212    email:      fp@example.com 
     13    is_administrator: on 
    1314 
    1415  francois: 
  • trunk/data/sql/schema.sql

    r44 r55  
    1616    `html_body` TEXT ,  
    1717    `interested_users` INTEGER default 0 ,  
     18    `reports` INTEGER default 0 ,  
    1819    `created_at` DATETIME ,  
    1920    `updated_at` DATETIME ,   
     
    3839    `relevancy_up` INTEGER default 0 ,  
    3940    `relevancy_down` INTEGER default 0 ,  
     41    `reports` INTEGER default 0 ,  
    4042    `created_at` DATETIME ,   
    4143    PRIMARY KEY(`id`),   
     
    4446      FOREIGN KEY (`question_id`) 
    4547      REFERENCES `ask_question` (`id`) 
    46 ,  
     48      ON DELETE CASCADE,  
    4749    INDEX `ask_answer_FI_2` (`user_id`),  
    4850    CONSTRAINT `ask_answer_FK_2`  
     
    6567    `salt` VARCHAR(32) ,  
    6668    `has_paypal` INTEGER default 0 ,  
     69    `want_to_be_moderator` INTEGER default 0 ,  
     70    `is_moderator` INTEGER default 0 ,  
     71    `is_administrator` INTEGER default 0 ,  
     72    `deletions` INTEGER default 0 ,  
    6773    `created_at` DATETIME ,   
    6874    PRIMARY KEY(`id`)) 
     
    8187      FOREIGN KEY (`question_id`) 
    8288      REFERENCES `ask_question` (`id`) 
    83 ,  
     89      ON DELETE CASCADE,  
    8490    INDEX `ask_interest_FI_2` (`user_id`),  
    8591    CONSTRAINT `ask_interest_FK_2`  
     
    102108      FOREIGN KEY (`answer_id`) 
    103109      REFERENCES `ask_answer` (`id`) 
    104 ,  
     110      ON DELETE CASCADE,  
    105111    INDEX `ask_relevancy_FI_2` (`user_id`),  
    106112    CONSTRAINT `ask_relevancy_FK_2`  
     
    115121 
    116122CREATE TABLE `ask_question_tag`( 
    117     `question_id` INTEGER ,  
    118     `user_id` INTEGER ,  
     123    `question_id` INTEGER NOT NULL ,  
     124    `user_id` INTEGER NOT NULL ,  
    119125    `created_at` DATETIME ,  
    120126    `tag` VARCHAR(100) ,  
    121     `normalized_tag` VARCHAR(100) ,   
    122     UNIQUE KEY `pk` (`question_id`,`user_id`,`normalized_tag`),   
     127    `normalized_tag` VARCHAR(100) NOT NULL ,   
     128    PRIMARY KEY(`question_id`,`user_id`,`normalized_tag`),   
    123129    KEY `normalized_tag_index` (`normalized_tag`),   
    124130    CONSTRAINT `ask_question_tag_FK_1`  
    125131      FOREIGN KEY (`question_id`) 
    126132      REFERENCES `ask_question` (`id`) 
    127 ,  
     133      ON DELETE CASCADE,  
    128134    INDEX `ask_question_tag_FI_2` (`user_id`),  
    129135    CONSTRAINT `ask_question_tag_FK_2`  
     
    132138) 
    133139Type=InnoDB; 
     140# ----------------------------------------------------------------------- 
     141# ask_report_question  
     142# ----------------------------------------------------------------------- 
     143DROP TABLE IF EXISTS `ask_report_question`; 
     144 
     145CREATE TABLE `ask_report_question`( 
     146    `question_id` INTEGER NOT NULL ,  
     147    `user_id` INTEGER NOT NULL ,  
     148    `created_at` DATETIME ,   
     149    PRIMARY KEY(`question_id`,`user_id`),   
     150    CONSTRAINT `ask_report_question_FK_1`  
     151      FOREIGN KEY (`question_id`) 
     152      REFERENCES `ask_question` (`id`) 
     153      ON DELETE CASCADE,  
     154    INDEX `ask_report_question_FI_2` (`user_id`),  
     155    CONSTRAINT `ask_report_question_FK_2`  
     156      FOREIGN KEY (`user_id`) 
     157      REFERENCES `ask_user` (`id`) 
     158) 
     159Type=InnoDB; 
     160# ----------------------------------------------------------------------- 
     161# ask_report_answer  
     162# ----------------------------------------------------------------------- 
     163DROP TABLE IF EXISTS `ask_report_answer`; 
     164 
     165CREATE TABLE `ask_report_answer`( 
     166    `answer_id` INTEGER NOT NULL ,  
     167    `user_id` INTEGER NOT NULL ,  
     168    `created_at` DATETIME ,   
     169    PRIMARY KEY(`answer_id`,`user_id`),   
     170    CONSTRAINT `ask_report_answer_FK_1`  
     171      FOREIGN KEY (`answer_id`) 
     172      REFERENCES `ask_answer` (`id`) 
     173      ON DELETE CASCADE,  
     174    INDEX `ask_report_answer_FI_2` (`user_id`),  
     175    CONSTRAINT `ask_report_answer_FK_2`  
     176      FOREIGN KEY (`user_id`) 
     177      REFERENCES `ask_user` (`id`) 
     178) 
     179Type=InnoDB; 
     180   
     181   
    134182   
    135183   
  • trunk/frontend/config/logging.yml

    r2 r55  
    11prod: 
    2   level:  err 
     2  level:  warning 
    33 
    44dev: 
  • trunk/frontend/config/routing.yml

    r44 r55  
    5353  url:   /password_request 
    5454  param: { module: user, action: passwordRequest } 
     55 
     56user_report_question: 
     57  url:   /report_question/:id 
     58  param: { module: user, action: reportQuestion } 
     59 
     60user_report_answer: 
     61  url:   /report_answer/:id 
     62  param: { module: user, action: reportAnswer } 
    5563 
    5664# login 
  • trunk/frontend/config/view.yml

    r20 r55  
    1919  slots: 
    2020    sidebar:      [sidebar, default] 
     21 
     22  use_default_slots: on 
     23 
  • trunk/frontend/lib/helper/AnswerHelper.php

    r39 r55  
    4949} 
    5050 
     51function link_to_report_answer($answer, $user) 
     52{ 
     53  use_helper('Javascript'); 
     54 
     55  $text = '[report to moderator]'; 
     56  if ($user->isAuthenticated()) 
     57  { 
     58    $has_already_reported_answer = ReportAnswerPeer::retrieveByPk($answer->getId(), $user->getSubscriberId()); 
     59    if ($has_already_reported_answer) 
     60    { 
     61      // already spam for this user 
     62      return '[reported as spam]'; 
     63    } 
     64    else 
     65    { 
     66      return link_to_remote($text, array( 
     67        'url'      => '@user_report_answer?id='.$answer->getId(), 
     68        'update'   => array('success' => 'report_answer_'.$answer->getId()), 
     69        'loading'  => "Element.show('indicator')", 
     70        'complete' => "Element.hide('indicator');".visual_effect('highlight', 'report_answer_'.$answer->getId()), 
     71      )); 
     72    } 
     73  } 
     74  else 
     75  { 
     76    return link_to_login($text); 
     77  } 
     78} 
     79 
    5180?> 
  • trunk/frontend/lib/helper/QuestionHelper.php

    r38 r55  
    1818} 
    1919 
     20function link_to_report_question($question, $user) 
     21{ 
     22  use_helper('Javascript'); 
     23 
     24  $text = '[report to moderator]'; 
     25  if ($user->isAuthenticated()) 
     26  { 
     27    $has_already_reported_question = ReportQuestionPeer::retrieveByPk($question->getId(), $user->getSubscriberId()); 
     28    if ($has_already_reported_question) 
     29    { 
     30      // already spam for this user 
     31      return '[reported as spam]'; 
     32    } 
     33    else 
     34    { 
     35      return link_to_remote($text, array( 
     36        'url'      => '@user_report_question?id='.$question->getId(), 
     37        'update'   => array('success' => 'report_question_'.$question->getId()), 
     38        'loading'  => "Element.show('indicator')", 
     39        'complete' => "Element.hide('indicator');".visual_effect('highlight', 'report_question_'.$question->getId()), 
     40      )); 
     41    } 
     42  } 
     43  else 
     44  { 
     45    return link_to_login($text); 
     46  } 
     47} 
     48 
    2049?> 
  • trunk/frontend/lib/myUser.class.php

    r44 r55  
    99 
    1010    $this->addCredential('subscriber'); 
     11 
     12    if ($user->getIsModerator()) 
     13    { 
     14      $this->addCredential('moderator'); 
     15    } 
     16 
     17    if ($user->getIsAdministrator()) 
     18    { 
     19      $this->addCredential('administrator'); 
     20    } 
     21 
    1122    $this->setAttribute('nickname', $user->getNickname(), 'subscriber'); 
    1223  } 
  • trunk/frontend/modules/answer/templates/_answer.php

    r40 r55  
    88  <?php echo $answer->getHtmlBody() ?> 
    99  <div class="subtitle" style="margin-top: -8px">answered by <?php echo link_to_profile($answer->getUser()) ?> on <?php echo format_date($answer->getCreatedAt(), 'f') ?></div> 
     10  <div class="options" id="report_answer_<?php echo $answer->getId() ?>"> 
     11    <?php echo link_to_report_answer($answer, $user) ?> 
     12    <?php echo include_partial('moderator/answer_options', array('answer' => $answer)) ?> 
     13  </div> 
    1014</div> 
    1115 
  • trunk/frontend/modules/question/templates/_question_list.php

    r38 r55  
    1414    <?php echo truncate_text(strip_tags($question->getHtmlBody()), 200) ?> 
    1515 
    16     <div class="tags"> 
     16    <div class="options"> 
    1717 
    1818    <?php if ($question->getAnswers()): ?> 
     
    3030    </div> 
    3131 
     32    <div class="options" id="report_question_<?php echo $question->getId() ?>"> 
     33      <?php echo link_to_report_question($question, $user) ?> 
     34      <?php include_partial('moderator/question_options', array('question' => $question)) ?> 
     35    </div> 
     36 
    3237  </div> 
    3338</div> 
  • trunk/frontend/modules/question/templates/showSuccess.php

    r48 r55  
    1 <?php use_helpers('Date', 'Answer') ?> 
     1<?php use_helpers('Date', 'Answer', 'Question') ?> 
    22 
    33<h1></h1> 
     
    1414  <div class="question_body"> 
    1515    <?php echo $question->getHtmlBody() ?> 
     16    <div class="options" id="report_question_<?php echo $question->getId() ?>"> 
     17      <?php echo link_to_report_question($question, $user) ?> 
     18      <?php include_partial('moderator/question_options', array('question' => $question)) ?> 
     19    </div> 
    1620  </div> 
    1721</div> 
  • trunk/frontend/modules/sidebar/templates/defaultSuccess.php

    r38 r55  
    1111<h2>browse askeet</h2> 
    1212<?php echo include_partial('rss_links') ?> 
     13 
     14<?php echo include_partial('sidebar/moderation') ?> 
     15 
     16<?php echo include_partial('sidebar/administration') ?> 
  • trunk/frontend/modules/sidebar/templates/questionSuccess.php

    r38 r55  
    2828  </div> 
    2929<?php endif ?> 
     30 
     31<?php echo include_partial('sidebar/moderation') ?> 
     32 
     33<?php echo include_partial('sidebar/administration') ?> 
  • trunk/frontend/modules/tag/actions/actions.class.php

    r53 r55  
    4141 
    4242    // clear the question tag list fragment in cache 
    43     $this->getContext()->getViewCacheManager()->remove('@question?stripped_title='.$this->question->getStrippedTitle(), 'fragment_question_tags'); 
     43    if (SF_CACHE) 
     44    { 
     45      $this->getContext()->getViewCacheManager()->remove('@question?stripped_title='.$this->question->getStrippedTitle(), 'fragment_question_tags'); 
     46    } 
    4447  } 
    4548 
     
    6164 
    6265    // clear the question tag list fragment in cache 
    63     $this->getContext()->getViewCacheManager()->remove('@question?stripped_title='.$this->question->getStrippedTitle(), 'fragment_question_tags'); 
     66    if (SF_CACHE) 
     67    { 
     68      $this->getContext()->getViewCacheManager()->remove('@question?stripped_title='.$this->question->getStrippedTitle(), 'fragment_question_tags'); 
     69    } 
    6470  } 
    6571 
  • trunk/frontend/modules/tag/templates/_question_tags.php

    r53 r55  
    1717        <?php echo link_to($tag, '@tag?tag='.$tag, 'rel=tag') ?> 
    1818      <?php endif ?> 
     19 
     20      <?php if ($user->hasCredential('moderator')): ?> 
     21        &nbsp;<?php echo link_to('[remove tag]', 'moderator/deleteTagForQuestion?tag='.$tag.'&question_id='.$question->getId(), 'confirm=Are you sure you want to delete this tag for this question?') ?> 
     22      <?php endif ?> 
    1923    </li> 
    2024  <?php endforeach ?> 
  • trunk/frontend/modules/user/actions/actions.class.php

    r48 r55  
    166166  } 
    167167 
     168  public function executeReportQuestion() 
     169  { 
     170    $this->question = QuestionPeer::retrieveByPk($this->getRequestParameter('id')); 
     171    $this->forward404Unless($this->question); 
     172 
     173    $spam = new ReportQuestion(); 
     174    $spam->setQuestionId($this->question->getId()); 
     175    $spam->setUserId($this->getUser()->getSubscriberId()); 
     176    $spam->save(); 
     177  } 
     178 
     179  public function executeReportAnswer() 
     180  { 
     181    $this->answer = AnswerPeer::retrieveByPk($this->getRequestParameter('id')); 
     182    $this->forward404Unless($this->answer); 
     183 
     184    $spam = new ReportAnswer(); 
     185    $spam->setAnswerId($this->answer->getId()); 
     186    $spam->setUserId($this->getUser()->getSubscriberId()); 
     187    $spam->save(); 
     188  } 
     189 
    168190  public function handleErrorLogin() 
    169191  { 
     
    200222    $this->subscriber->setEmail($this->getRequestParameter('email')); 
    201223    $this->subscriber->setHasPaypal($this->getRequestParameter('has_paypal'), 0); 
     224    $this->subscriber->setWantToBeModerator($this->getRequestParameter('want_to_be_moderator')); 
    202225  } 
    203226 
  • trunk/frontend/modules/user/config/view.yml

    r20 r55  
    44interestedSuccess: 
    55  has_layout: off 
     6 
     7reportQuestionSuccess: 
     8  has_layout: off 
     9 
     10reportAnswerSuccess: 
     11  has_layout: off 
  • trunk/frontend/modules/user/templates/showSuccess.php

    r46 r55  
    11<?php use_helpers('Date', 'Question', 'Text', 'Object') ?> 
    22 
    3 <h1><?php echo $subscriber ?>'s profile</h1> 
     3<h1><?php echo $subscriber ?>'s profile 
     4<?php if ($subscriber->getIsModerator()): ?> [moderator]<?php endif ?> 
     5<?php if ($subscriber->getIsAdministrator()): ?> [administrator]<?php endif ?> 
     6</h1> 
     7 
     8<?php echo include_partial('administrator/user_options', array('subscriber' => $subscriber)) ?> 
    49 
    510<?php if ($subscriber->getId() == $user->getSubscriberId()): ?> 
     
    2631    <br class="clearleft" /> 
    2732 
    28     <?php echo form_error('has_paypal') ?> 
    2933    <label for="has_paypal">paypal account?</label> 
    3034    <?php echo object_checkbox_tag($subscriber, 'getHasPaypal') ?> 
     
    4044    <?php echo input_password_tag('password_bis', '', 'size=30') ?> 
    4145    <br class="clearleft" /> 
     46 
     47    <?php if (!$subscriber->getIsModerator()): ?> 
     48      <label for="want_to_be_moderator">do you want to be a moderator?</label> 
     49      <?php echo object_checkbox_tag($subscriber, 'getWantToBeModerator') ?> 
     50      <br class="clearleft" /> 
     51    <?php endif ?> 
    4252 
    4353    </fieldset> 
  • trunk/frontend/templates/layout.php

    r40 r55  
    2727    <ul> 
    2828      <?php if ($user->isAuthenticated()): ?> 
     29        <li><?php echo link_to($user->getAttribute('nickname', '', 'subscriber').' profile', '@current_user_profile') ?></li> 
    2930        <li><?php echo link_to('sign out', '@logout') ?></li> 
    30         <li><?php echo link_to($user->getAttribute('nickname', '', 'subscriber').' profile', '@current_user_profile') ?></li> 
    3131      <?php else: ?> 
    3232        <li><?php echo link_to('sign in/register', '@login') ?></li> 
  • trunk/lib/model/Answer.php

    r23 r55  
    3939    $this->setHtmlBody(markdown($v)); 
    4040  } 
     41 
     42  public function deleteReports() 
     43  { 
     44    $reports = $this->getReportQuestions(); 
     45    foreach ($reports as $report) 
     46    { 
     47      $report->delete(); 
     48    } 
     49 
     50    $this->setReports(0); 
     51  } 
     52 
     53  public function deleteSpam($moderator) 
     54  { 
     55    $con = Propel::getConnection(); 
     56    try 
     57    { 
     58      $con->begin(); 
     59 
     60      $user = $this->getUser(); 
     61      if ($user->getNickname() != 'anonymous') 
     62      { 
     63        $user->setDeletions($user->getDeletions() + 1); 
     64        $user->save(); 
     65      } 
     66 
     67      $this->delete(); 
     68 
     69      $con->commit(); 
     70 
     71      $log = 'moderator "%s" deleted answer "%s" for question "%s" (%s)'; 
     72      $log = sprintf($log, $moderator->getNickname(), $this->getId(), $this->getQuestion()->getTitle(), substr($this->getBody(), 0, 50)); 
     73      sfContext::getInstance()->getLogger()->warning($log); 
     74    } 
     75    catch (PropelException $e) 
     76    { 
     77      $con->rollback(); 
     78      throw $e; 
     79    } 
     80  } 
    4181} 
    4282 
  • trunk/lib/model/AnswerPeer.php

    r40 r55  
    5050  } 
    5151 
    52   public function getRecent($max = 10) 
     52  public static function getRecent($max = 10) 
    5353  { 
    5454    $c = new Criteria(); 
     
    5858 
    5959    return self::doSelectJoinUser($c); 
     60  } 
     61 
     62  public static function getReportedSpamPager($page) 
     63  { 
     64    $pager = new sfPager('Answer', APP_PAGER_HOMEPAGE_MAX); 
     65    $c = new Criteria(); 
     66    $c->add(self::REPORTS, 0, Criteria::GREATER_THAN); 
     67    $c->setLimit(20); 
     68    $c->addDescendingOrderByColumn(self::REPORTS); 
     69    $c->addAscendingOrderByColumn(self::CREATED_AT); 
     70    $c = self::addPermanentTagToCriteria($c); 
     71    $pager->setCriteria($c); 
     72    $pager->setPage($page); 
     73    $pager->setPeerMethod('doSelectJoinUser'); 
     74    $pager->init(); 
     75 
     76    return $pager; 
     77  } 
     78 
     79  public static function getReportCount() 
     80  { 
     81    $c = new Criteria(); 
     82    $c->add(self::REPORTS, 0, Criteria::GREATER_THAN); 
     83    $c = self::addPermanentTagToCriteria($c); 
     84 
     85    return self::doCount($c); 
    6086  } 
    6187 
  • trunk/lib/model/Question.php

    r42 r55  
    145145    $c->addAsColumn('relevancy', AnswerPeer::RELEVANCY_UP.' / ('.AnswerPeer::RELEVANCY_UP.' + '.AnswerPeer::RELEVANCY_DOWN.')'); 
    146146    $c->addDescendingOrderByColumn('relevancy'); 
     147    $c->addDescendingOrderByColumn(AnswerPeer::RELEVANCY_UP); 
    147148 
    148149    return AnswerPeer::doSelect($c); 
     150  } 
     151 
     152  public function deleteReports() 
     153  { 
     154    $reports = $this->getReportQuestions(); 
     155    foreach ($reports as $report) 
     156    { 
     157      $report->delete(); 
     158    } 
     159 
     160    $this->setReports(0); 
     161  } 
     162 
     163  public function deleteSpam($moderator) 
     164  { 
     165    $con = Propel::getConnection(); 
     166    try 
     167    { 
     168      $con->begin(); 
     169 
     170      $user = $this->getUser(); 
     171      $user->setDeletions($user->getDeletions() + 1); 
     172      $user->save(); 
     173 
     174      $this->delete(); 
     175 
     176      $con->commit(); 
     177 
     178      $log = 'moderator "%s" deleted question "%s"'; 
     179      $log = sprintf($log, $moderator->getNickname(), $this->getTitle()); 
     180      sfContext::getInstance()->getLogger()->warning($log); 
     181    } 
     182    catch (PropelException $e) 
     183    { 
     184      $con->rollback(); 
     185      throw $e; 
     186    } 
    149187  } 
    150188} 
  • trunk/lib/model/QuestionPeer.php

    r42 r55  
    103103  } 
    104104 
     105  public static function getReportedSpamPager($page) 
     106  { 
     107    $pager = new sfPager('Question', APP_PAGER_HOMEPAGE_MAX); 
     108    $c = new Criteria(); 
     109    $c->add(self::REPORTS, 0, Criteria::GREATER_THAN); 
     110    $c->setLimit(20); 
     111    $c->addDescendingOrderByColumn(self::REPORTS); 
     112    $c->addAscendingOrderByColumn(self::CREATED_AT); 
     113    $c = self::addPermanentTagToCriteria($c); 
     114    $pager->setCriteria($c); 
     115    $pager->setPage($page); 
     116    $pager->setPeerMethod('doSelectJoinUser'); 
     117    $pager->init(); 
     118 
     119    return $pager; 
     120  } 
     121 
     122  public static function getReportCount() 
     123  { 
     124    $c = new Criteria(); 
     125    $c->add(self::REPORTS, 0, Criteria::GREATER_THAN); 
     126    $c = self::addPermanentTagToCriteria($c); 
     127 
     128    return self::doCount($c); 
     129  } 
     130 
    105131  private static function addPermanentTagToCriteria($criteria) 
    106132  { 
  • trunk/lib/model/QuestionTagPeer.php

    r40 r55  
    147147    return $tags; 
    148148  } 
     149 
     150  public static function getUnpopularTags() 
     151  { 
     152    $tags = array(); 
     153 
     154    $con = Propel::getConnection(); 
     155    $query = ' 
     156      SELECT t1.normalized_tag AS tag, 
     157      COUNT(t1.normalized_tag) AS count 
     158      FROM '.QuestionTagPeer::TABLE_NAME.' AS t1'; 
     159 
     160    if (defined('APP_PERMANENT_TAG')) 
     161    { 
     162      $query .= ' 
     163        INNER JOIN '.QuestionTagPeer::TABLE_NAME.' AS t2 ON t1.question_id = t2.question_id 
     164        WHERE t2.normalized_tag = ? AND t1.normalized_tag != ? 
     165        AND count < 5 
     166      '; 
     167    } 
     168 
     169    $query .= ' 
     170      GROUP BY t1.normalized_tag 
     171      ORDER BY count ASC 
     172    '; 
     173 
     174    $stmt = $con->prepareStatement($query); 
     175    if (defined('APP_PERMANENT_TAG')) 
     176    { 
     177      $stmt->setString(1, APP_PERMANENT_TAG); 
     178      $stmt->setString(2, APP_PERMANENT_TAG); 
     179    } 
     180    $rs = $stmt->executeQuery(); 
     181    while ($rs->next()) 
     182    { 
     183      $tags[$rs->getString('tag')] = $rs->getInt('count'); 
     184    } 
     185 
     186    return $tags; 
     187  } 
     188 
     189  public static function getByNormalizedTag($tag) 
     190  { 
     191    $c = new Criteria(); 
     192    $c->add(self::NORMALIZED_TAG, Tag::normalize($tag)); 
     193 
     194    return self::doSelect($c); 
     195  } 
     196 
     197  public static function deleteSpam($moderator, $tag, $question_id = null) 
     198  { 
     199    if ($question_id === null) 
     200    { 
     201      $tags = self::getByNormalizedTag($tag); 
     202    } 
     203    else 
     204    { 
     205      $c = new Criteria(); 
     206      $c->add(self::NORMALIZED_TAG, Tag::normalize($tag)); 
     207      $c->add(self::QUESTION_ID, $question_id); 
     208 
     209      $tags = self::doSelect($c); 
     210    } 
     211 
     212    $con = Propel::getConnection(); 
     213    try 
     214    { 
     215      $con->begin(); 
     216 
     217      foreach ($tags as $tag) 
     218      { 
     219        $user = $tag->getUser(); 
     220        $user->setDeletions($user->getDeletions() + 1); 
     221        $user->save(); 
     222 
     223        $tag->delete(); 
     224      } 
     225 
     226      $con->commit(); 
     227 
     228      $log = 'moderator "%s" deleted tag "%s"'; 
     229      $log = sprintf($log, $moderator->getNickname(), $tag->getNormalizedTag()); 
     230      sfContext::getInstance()->getLogger()->warning($log); 
     231    } 
     232    catch (PropelException $e) 
     233    { 
     234      $con->rollback(); 
     235      throw $e; 
     236    } 
     237