public function moveArtifactAfterWithHistoryChangeLogging($artifact_id, $predecessor_id, $context_id, $project_id)
 {
     $old_global_rank = $this->getGlobalRank($artifact_id);
     $this->priority_dao->moveArtifactAfter($artifact_id, $predecessor_id);
     $new_global_rank = $this->getGlobalRank($artifact_id);
     if ($old_global_rank !== $new_global_rank) {
         $this->logPriorityChange($artifact_id, $predecessor_id, $artifact_id, $context_id, $project_id, $old_global_rank);
     }
 }
 /**
  * Process the artifact functions
  *
  * @param Tracker_IDisplayTrackerLayout  $layout          Displays the page header and footer
  * @param Codendi_Request                $request         The data from the user
  * @param User                           $current_user    The current user
  *
  * @return void
  */
 public function process(Tracker_IDisplayTrackerLayout $layout, $request, $current_user)
 {
     switch ($request->get('func')) {
         case 'update-comment':
             if ((int) $request->get('changeset_id') && $request->get('content')) {
                 if ($changeset = $this->getChangeset($request->get('changeset_id'))) {
                     $comment_format = $this->validateCommentFormat($request, 'comment_format');
                     $changeset->updateComment($request->get('content'), $current_user, $comment_format);
                     if ($request->isAjax()) {
                         //We assume that we can only change a comment from a followUp
                         echo $changeset->getComment()->fetchFollowUp();
                     }
                 }
             }
             break;
         case 'preview-attachment':
         case 'show-attachment':
             if ((int) $request->get('field') && (int) $request->get('attachment')) {
                 $ff = Tracker_FormElementFactory::instance();
                 //TODO: check that the user can read the field
                 if ($field = $ff->getFormElementByid($request->get('field'))) {
                     $method = explode('-', $request->get('func'));
                     $method = $method[0];
                     $method .= 'Attachment';
                     if (method_exists($field, $method)) {
                         $field->{$method}($request->get('attachment'));
                     }
                 }
             }
             break;
         case 'artifact-delete-changeset':
             // @see comment in Tracker_Artifact_Changeset::fetchFollowUp()
             //if ($changeset = $this->getChangeset($request->get('changeset'))) {
             //    $changeset->delete($current_user);
             //}
             $GLOBALS['Response']->redirect('?aid=' . $this->id);
             break;
         case 'artifact-update':
             //TODO : check permissions on this action?
             $fields_data = $request->get('artifact');
             $comment_format = $this->validateCommentFormat($request, 'comment_formatnew');
             $this->setUseArtifactPermissions($request->get('use_artifact_permissions') ? 1 : 0);
             $this->getTracker()->augmentDataFromRequest($fields_data);
             if ($this->createNewChangeset($fields_data, $request->get('artifact_followup_comment'), $current_user, $request->get('email'), true, $comment_format)) {
                 $art_link = $this->fetchDirectLinkToArtifact();
                 $GLOBALS['Response']->addFeedback('info', $GLOBALS['Language']->getText('plugin_tracker_index', 'update_success', array($art_link)), CODENDI_PURIFIER_LIGHT);
                 $redirect = $this->getRedirectUrlAfterArtifactUpdate($request, $this->tracker_id, $this->getId());
                 $this->summonArtifactRedirectors($request, $redirect);
                 $GLOBALS['Response']->redirect($redirect->toUrl());
                 //die();
             } else {
                 $this->display($layout, $request, $current_user);
             }
             break;
         case 'unassociate-artifact-to':
             $artlink_fields = $this->getFormElementFactory()->getUsedArtifactLinkFields($this->getTracker());
             $linked_artifact_id = $request->get('linked-artifact-id');
             if (count($artlink_fields)) {
                 $this->unlinkArtifact($artlink_fields, $linked_artifact_id, $current_user);
                 $this->summonArtifactAssociators($request, $current_user, $linked_artifact_id);
             } else {
                 $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker', 'must_have_artifact_link_field'));
                 $GLOBALS['Response']->sendStatusCode(400);
             }
             break;
         case 'associate-artifact-to':
             $linked_artifact_id = $request->get('linked-artifact-id');
             if (!$this->linkArtifact($linked_artifact_id, $current_user)) {
                 $GLOBALS['Response']->sendStatusCode(400);
             } else {
                 $this->summonArtifactAssociators($request, $current_user, $linked_artifact_id);
             }
             break;
         case 'higher-priority-than':
             $dao = new Tracker_Artifact_PriorityDao();
             $dao->moveArtifactBefore($this->getId(), (int) $request->get('target-id'));
             break;
         case 'lesser-priority-than':
             $dao = new Tracker_Artifact_PriorityDao();
             $dao->moveArtifactAfter($this->getId(), (int) $request->get('target-id'));
             break;
         default:
             if ($request->isAjax()) {
                 echo $this->fetchTooltip($current_user);
             } else {
                 $this->display($layout, $request, $current_user);
             }
             break;
     }
 }