Example #1
0
 public function edit($worklist_id = 0)
 {
     if (isset($_POST['api_key'])) {
         Utils::validateAPIKey();
         $user = User::find($_POST['creator']);
         $userId = $user->getId();
     } else {
         Utils::checkLogin();
         $userId = Session::uid();
         $user = User::find($userId);
     }
     if (!$userId) {
         header('HTTP/1.1 401 Unauthorized', true, 401);
         echo json_encode(array('error' => "Invalid parameters !"));
         return;
     }
     $this->view = null;
     $worklist_id = isset($_REQUEST['worklist_id']) ? $_REQUEST['worklist_id'] : $worklist_id;
     $notifyEmpty = true;
     $workitem = new WorkItem();
     try {
         $workitem->loadById($worklist_id);
     } catch (Exception $e) {
         $error = $e->getMessage();
         die($error);
     }
     if ($_SERVER['REQUEST_METHOD'] != 'POST') {
         if ($workitem->isInternal() && !$user->isInternal() || !$this->canEdit($workitem, $user)) {
             $this->write('msg', 'You don\'t have permissions to edit this job.');
             $this->write('link', WORKLIST_URL);
             $this->view = new ErrorView();
             parent::run();
             exit;
         }
         $this->view = null;
         $this->write('jobId', $worklist_id);
         $this->write('user', $user);
         $this->write('workitem', $workitem);
         $this->view = new AddJobView();
         parent::run();
         return;
     }
     $journal_message = null;
     $status_change = '';
     $status = $user->getIs_runner() ? $_REQUEST['status'] : 'Suggestion';
     $fileUpload = isset($_REQUEST['fileUpload']) ? $_REQUEST['fileUpload'] : array();
     $statusList = $this->getStatusList($workitem, $user);
     $args = array('summary', 'notes', 'status', 'project_id', 'sandbox', 'budget_id', 'assigned', 'is_internal', 'runner_id');
     foreach ($args as $arg) {
         if (!empty($_REQUEST[$arg])) {
             ${$arg} = $_REQUEST[$arg];
         } else {
             ${$arg} = '';
         }
     }
     // code to add specifics to journal update messages
     $new_update_message = '';
     $budget_id = !empty($_REQUEST['budget_id']) ? (int) $_REQUEST['budget_id'] : 0;
     $project_id = !empty($_REQUEST['project_id']) ? (int) $_REQUEST['project_id'] : 0;
     $runner_id = !empty($_REQUEST['runner_id']) ? (int) $_REQUEST['runner_id'] : 0;
     $sandbox = isset($_REQUEST['sandbox']) ? $_REQUEST['sandbox'] : '';
     $old_budget_id = -1;
     if (isset($_REQUEST['budget_id']) && $workitem->getBudget_id() != $budget_id) {
         $new_update_message .= 'Budget changed. ';
         $old_budget_id = (int) $workitem->getBudget_id();
         $workitem->setBudget_id($budget_id);
         $job_changes[] = '-budget';
     }
     if (isset($_REQUEST['is_internal']) && $user->isInternal() && $workitem->isInternal() != (int) $_REQUEST['is_internal']) {
         $is_internal = !empty($_REQUEST['is_internal']) ? (int) $_REQUEST['is_internal'] : 0;
         $workitem->setIs_internal($is_internal);
         $workitem->save();
     }
     // summary
     if (isset($_REQUEST['summary']) && $workitem->getSummary() != $_REQUEST['summary']) {
         $summary = $_REQUEST['summary'];
         $workitem->setSummary($summary);
         $new_update_message .= "Summary changed. ";
         if ($workitem->getStatus() != 'Draft') {
             $job_changes[] = '-summary';
         }
     }
     if (isset($_REQUEST['labels']) && !empty($_REQUEST['labels'])) {
         $labelsArr = explode(',', $_REQUEST['labels']);
         // remove empty values
         foreach ($labelsArr as $key => $value) {
             $labelsArr[$key] = trim($value);
             if (empty($value)) {
                 unset($labelsArr[$key]);
             }
         }
         // get current labels
         $labelsCur = $workitem->getWorkItemLabels();
         // have labels been updated?
         $labelsDiff = array_diff($labelsArr, $labelsCur);
         if (is_array($labelsDiff) && !empty($labelsDiff)) {
             if ($workitem->getStatus() != 'Draft') {
                 $new_update_message .= 'Labels updated: ' . implode(', ', $labelsArr);
             }
             // remove nasty end comma
             $new_update_message = rtrim($new_update_message, ', ') . '. ';
             $job_changes[] = '-labels';
         }
         $workitem->setWorkitemLabels($labelsArr);
         $workitem->save();
     }
     if ($workitem->getIsRelRunner() || $userId == $workitem->getRunnerId() || in_array($status, $statusList)) {
         if ($workitem->getStatus() != $status && !empty($status) && $status != 'Draft') {
             if ($this->changeStatus($workitem, $status, $user)) {
                 if (!empty($new_update_message)) {
                     // add commas where appropriate
                     $new_update_message .= ", ";
                 }
                 $status_change = '-' . ucfirst(strtolower($status));
                 if ($status == 'Bidding' && Project::isAllowedRunnerForProject($user->getId(), $workitem->getProjectId())) {
                     $workitem->setRunnerId($user->getId());
                 }
                 $new_update_message .= "Status set to *{$status}*. ";
             }
         }
     }
     $related = "";
     $notes = trim($_REQUEST['notes']);
     if (!empty($notes) && $workitem->getNotes() != $notes) {
         $workitem->setNotes($notes);
         $new_update_message .= "Notes changed. ";
         $job_changes[] = '-notes';
         $related = $this->getRelated($notes);
     }
     // project
     if ($project_id && $workitem->getProjectId() != $project_id) {
         $workitem->setProjectId($project_id);
         if ($workitem->getStatus() != 'Draft') {
             $new_update_message .= "Project changed. ";
             $job_changes[] = '-project';
         }
     }
     // Sandbox
     if (isset($_REQUEST['sandbox']) && $workitem->getSandbox() != $sandbox) {
         $workitem->setSandbox($sandbox);
         $new_update_message .= "Branch changed. ";
         $job_changes[] = '-branch';
     }
     // Designer
     if (isset($_REQUEST['runner_id']) && $runner_id && $workitem->getRunnerId() != $runner_id) {
         $older_runner = $workitem->getRunner();
         $workitem->setRunnerId($runner_id);
         $workitem->save();
         if (!empty($older_runner)) {
             $runner = User::find($runner_id);
             $message = '\\#' . $workitem->getId() . ' updated by @' . $_SESSION['nickname'] . ' Designer reassigned to @' . $runner->getNickname();
             Utils::systemNotification($message);
             $emails = !empty($older_runner) ? array($older_runner->getUsername()) : array();
             array_push($emails, $runner->getUsername());
             if ($workitem->getCreator()) {
                 array_push($emails, $workitem->getCreator()->getUsername());
             }
             if ($workitem->getMechanic()) {
                 array_push($emails, $workitem->getMechanic()->getUsername());
             }
             if ($user->getSelf_notif()) {
                 array_push($emails, $user->getUsername());
             }
             $options = array('type' => 'change-designer', 'workitem' => $workitem, 'emails' => $emails);
             $data = array('runner_nickname' => $runner->getNickname());
             Notification::workitemNotify($options, $data);
         }
     }
     // Assignee
     $assigned = !empty($_REQUEST['assigned']) ? (int) $_REQUEST['assigned'] : 0;
     $assigneeChanged = false;
     if ($user->isInternal() && isset($_REQUEST['assigned']) && $workitem->getAssigned_id() != $assigned) {
         if ((int) $assigned == 0) {
             $workitem->setAssigned_id(0);
             $new_update_message .= "Assignee removed. ";
             $job_changes[] = '-assignee';
         } else {
             $assignedUser = User::find($assigned);
             if ($assignedUser->isInternal()) {
                 $assigneeChanged = true;
                 $workitem->setAssigned_id($assignedUser->getId());
                 $currentStatus = $workitem->getStatus();
                 $new_update_message .= "Assignee changed. ";
                 if ($currentStatus == 'Draft' || $currentStatus == 'Suggestion') {
                     $workitem->setStatus('Bidding');
                     $new_update_message .= "Status set to *Bidding*. ";
                 }
                 $job_changes[] = '-assignee';
             }
         }
     }
     if (empty($new_update_message)) {
         $new_update_message = " No changes.";
     } else {
         $workitem->save();
         if ($old_budget_id > 0) {
             $budget = new Budget();
             if ($budget->loadById($old_budget_id)) {
                 $budget->recalculateBudgetRemaining();
             } else {
                 error_log("Old budget id not found: " . $old_budget_id);
             }
             if ($budget->loadById($workitem->getBudget_id())) {
                 $budget->recalculateBudgetRemaining();
             } else {
                 error_log("New budget id not found: " . $workitem->getBudget_id());
             }
         }
         $new_update_message = " Changes: {$new_update_message}";
         $notifyEmpty = false;
     }
     if ($workitem->getStatus() != 'Draft' && !$notifyEmpty) {
         $journal_message .= '\\#' . $worklist_id . ' updated by @' . $_SESSION['nickname'] . $new_update_message . $related;
         $options = array('type' => 'workitem-update', 'workitem' => $workitem);
         $data = array('nick' => $_SESSION['nickname'], 'new_update_message' => $new_update_message, 'related' => $related);
         Notification::workitemNotify($options, $data, false);
         Notification::workitemNotifyHipchat($options, $data);
         Utils::systemNotification($journal_message);
     }
     if ($assigneeChanged) {
         $emailTemplate = 'job-assigned';
         $data = array('job_id' => $workitem->getId(), 'summary' => $workitem->getSummary(), 'assigner' => $user->getNickname(), 'assigned' => $assignedUser->getNickname());
         $senderEmail = 'Worklist - ' . $user->getNickname() . ' <*****@*****.**> ';
         Utils::sendTemplateEmail($assignedUser->getUsername(), $emailTemplate, $data, $senderEmail);
     }
     // if files were uploaded, update their workitem id
     $file = new File();
     // update images first
     if (isset($fileUpload['uploads'])) {
         foreach ($fileUpload['uploads'] as $image) {
             $file->findFileById($image);
             $file->setWorkitem($workitem->getId());
             $file->save();
         }
     }
     if (!$notifyEmpty) {
         $options = array('type' => 'modified', 'workitem' => $workitem, 'status_change' => $status_change, 'job_changes' => $job_changes, 'recipients' => array('runner', 'creator', 'mechanic', 'followers'));
         $data = array('changes' => $new_update_message);
         Notification::workitemNotify($options, $data);
     }
     echo json_encode(array('return' => "Done!", 'workitem' => $workitem->getId(), 'success' => true));
 }