function add() { if ($this->RequestHandler->isPost() && !empty($this->data['Watcher']['user_id'])) { $Model =& ClassRegistry::init($this->params['named']['object_type']); if ($Model->read(null, $this->params['named']['object_id']) && $this->Watcher->User->read(null, $this->data['Watcher']['user_id'])) { $Model->add_watcher($this->Watcher->User->data); } } Configure::write('debug', 0); extract($this->params['named']); $Model =& ClassRegistry::init(Inflector::camelize($object_type)); $data = $Model->read(null, $object_id); $project_id = $Model->get_watched_project_id(); $project = $this->Project->read('identifier', $project_id); $this->params['project_id'] = $project['Project']['identifier']; parent::_findProject(); $members = $this->Project->members($project_id); if (!empty($data['Watcher'])) { foreach ($data['Watcher'] as $value) { if (array_key_exists($value['user_id'], $members)) { unset($members[$value['user_id']]); } } } $this->set(array_merge(compact('members', 'object_type', 'object_id', 'data'))); if ($this->RequestHandler->isAjax()) { $this->render('_watchers'); $this->layout = 'ajax'; } else { $this->redirect(env('HTTP_REFERER')); } }
function _findProject() { $this->version = $this->Version->find('first', array('conditions' => array('Version.id' => $this->params['pass'][0]))); $this->params['project_id'] = $this->version['Project']['identifier']; return parent::_findProject(); # @version = Version.find(params[:id]) # @project = @version.project # rescue ActiveRecord::RecordNotFound # render_404 # end }
function _find_project() { $this->Attachment->read(null, $this->params['id']); $this->set('attachment', $this->Attachment->data[$this->Attachment->alias]); $this->set('author', $this->Attachment->data['Author']); # Show 404 if the filename in the url is wrong if (!empty($this->params['filename']) && $this->params['filename'] != $this->Attachment->data[$this->Attachment->name]['filename']) { $this->cakeError('error404'); } $project = $this->Attachment->project(); if (!empty($project['Project']['identifier'])) { $this->params['project_id'] = $project['Project']['identifier']; parent::_findProject(); } else { $this->cakeError('error404'); } }
function _find_optional_project() { if ($this->_get_param('issue_id')) { $issue_id = $this->_get_param('issue_id'); $this->Issue->read(null, $issue_id); $this->params['project_id'] = $this->Issue->data['Project']['identifier']; } elseif (!empty($this->params['project_id'])) { // parent::beforeFilter } parent::_findProject(); parent::user_setup(); if (!$this->TimeEntry->User->is_allowed_to($this->current_user, 'view_time_entries', $this->_project, array('global' => true))) { return parent::deny_access(); } }
/** * Find a project * * @return void * @access private */ function _find_project() { $attachment = $this->Attachment->read(null, $this->request->params['id']); $this->set('attachment', $attachment[$this->Attachment->alias]); $this->set('author', $attachment[$this->Attachment->Author->alias]); // Show 404 if the filename in the url is wrong if (!empty($this->request->params['filename']) && $this->request->params['filename'] != $attachment[$this->Attachment->alias]['filename']) { throw new NotFoundException(); } $project = $this->Attachment->project(); if (!empty($project['Project']['identifier'])) { $this->request->params['project_id'] = $project['Project']['identifier']; parent::_findProject(); } else { throw new NotFoundException(); } }
/** * Edit action * * Attributes that can be updated on workflow transition (without :edit permission) * * /projects/test/issues/edit/25?backto=url&issue[status_id]=3 * Array * ( * [url] => projects/test/issues/edit/25 * [backto] => url * [issue] => Array * ( * [status_id] => 3 * ) * ) * * @return void * @todo Make it configurable (at least per role) */ public function edit() { static $UPDATABLE_ATTRS_ON_TRANSITION = array('status_id', 'assigned_to_id', 'fixed_version_id', 'done_ratio'); if (empty($this->request->params['issue_id'])) { return $this->cakeError('error', array('message' => "Not exists issue.")); } $issue = $this->_find_issue($this->request->params['issue_id']); if (empty($this->_project)) { $this->request->params['project_id'] = $issue['Project']['identifier']; parent::_findProject(); } $statuses = $this->Issue->findStatusList($this->User->role_for_project($this->current_user, $this->_project)); if (empty($statuses)) { $this->Session->setFlash(__('No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'), 'default', array('class' => 'flash flash_error')); $this->redirect('index'); } $this->request->data['Issue']['tracker_id'] = $issue['Issue']['tracker_id']; $this->set(compact('statuses')); $this->_set_edit_form_values(); $notes = ""; if ($this->_get_param('notes')) { $notes = $this->_get_param('notes'); } unset($this->request->data['Issue']['notes']); $journal = $this->Issue->init_journal($issue, $this->current_user, $notes); $this->Issue->Journal->available_custom_fields = $this->Issue->cached_available_custom_fields(); # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed $edit_allowed = $this->User->is_allowed_to($this->current_user, ':edit_issues', $this->_project); if ($edit_allowed || !empty($statuses) && (!empty($this->request->params['url']['issue']) || !empty($this->request->data['Issue']))) { $attrs = empty($this->request->params['url']['issue']) ? $this->request->data['Issue'] : $this->request->params['url']['issue']; if (!$edit_allowed) { foreach ($attrs as $k => $v) { if (!in_array($k, $UPDATABLE_ATTRS_ON_TRANSITION)) { unset($attrs[$k]); } } } if (!empty($attrs['status_id'])) { if (!array_key_exists($attrs['status_id'], $statuses)) { unset($attrs['status_id']); } } $issue['Issue'] = array_merge($issue['Issue'], $attrs); } if (($this->RequestHandler->isPost() || $this->RequestHandler->isPut()) && !empty($this->request->data)) { $this->Issue->TimeEntry->create(); $time_entry = array('project_id' => $this->_project['Project']['id'], 'issue_id' => $issue['Issue']['id'], 'user_id' => $this->current_user['id'], 'spent_on' => date('Y-m-d')); if (isset($this->request->data['TimeEntry'])) { $time_entry = array_merge($time_entry, $this->request->data['TimeEntry']); } $this->Issue->TimeEntry->set($time_entry); if (!empty($this->request->data['custom_field_values'])) { $this->Issue->TimeEntry->data['TimeEntry']['custom_field_values'] = $this->Issue->TimeEntry->filterCustomFieldValue($this->request->data['custom_field_values']); } $save_data = array(); $save_data['Issue'] = $this->request->data['Issue']; $save_data['Issue']['id'] = $issue['Issue']['id']; $save_data['Issue']['project_id'] = $this->_project['Project']['id']; $save_data['Issue']['tracker_id'] = $issue['Issue']['tracker_id']; if (!empty($this->request->data['custom_field_values'])) { $save_data['Issue']['custom_field_values'] = $this->Issue->filterCustomFieldValue($this->request->data['custom_field_values']); } if ($this->User->is_allowed_to($this->current_user, ':log_time', $this->_project) && !empty($this->Issue->TimeEntry->data['TimeEntry']['hours']) && $this->Issue->TimeEntry->validates()) { # Log spend time $save_data['TimeEntry'] = array($this->Issue->TimeEntry->data['TimeEntry']); } if (!empty($this->request->params['form'])) { $attachments = $this->Issue->attach_files($this->request->params['form'], $this->current_user); if (!empty($attachments['unsaved'])) { $this->Session->setFlash(sprintf(__("%d file(s) could not be saved."), count($attachments['unsaved'])), 'default', array('class' => 'flash flash_warning')); } foreach ($attachments['attached'] as $a) { $this->Issue->attachJournalDetails[] = array('property' => 'attachment', 'prop_key' => $a['id'], 'value' => $a['filename']); } } $event = new CakeEvent('Controller.Candy.issuesEditBeforeSave', $this, array('issue' => $this->Issue, 'journal' => $journal)); $this->getEventManager()->dispatch($event); if ($this->Issue->saveAll($save_data)) { if ($this->Issue->actually_changed) { $event = new CakeEvent('Controller.Candy.issuesEditAfterSave', $this, array('project' => $this->_project, 'issue' => $this->Issue, 'save_data' => $save_data, 'journal' => $journal, 'notes' => $notes)); $this->getEventManager()->dispatch($event); # Only send notification if something was actually changed $this->Session->setFlash(__('Successful update.'), 'default', array('class' => 'flash flash_notice')); $this->Mailer->deliver_issue_edit($journal, $this->Issue); } if (!empty($this->request->params['url']['back_to'])) { $this->redirect($this->request->params['url']['back_to']); } $this->redirect(array('action' => 'show', $issue['Issue']['id'])); } $this->request->data['Issue']['notes'] = $notes; } else { $this->request->data = $issue; } if ($this->RequestHandler->isAjax()) { $this->layout = 'ajax'; } # rescue ActiveRecord::StaleObjectError # # Optimistic locking exception # flash.now[:error] = l(:notice_locking_conflict) # end }