public function executeGoto(sfWebRequest $request) { $q = Doctrine_Core::getTable('Discussions')->createQuery('d')->leftJoin('d.DiscussionsStatus ds')->leftJoin('d.Projects p')->leftJoin('d.Users'); $q->addWhere('projects_id=?', $request->getParameter('projects_id')); if (Users::hasAccess('view_own', 'discussions', $this->getUser(), $request->getParameter('projects_id'))) { $q->addWhere("find_in_set('" . $this->getUser()->getAttribute('id') . "',d.assigned_to) or d.users_id='" . $this->getUser()->getAttribute('id') . "'"); } $q = Discussions::addFiltersToQuery($q, $this->getUser()->getAttribute('discussions_filter' . ((int) $request->getParameter('projects_id') > 0 ? $request->getParameter('projects_id') : ''))); $q = app::addListingOrder($q, 'discussions', $this->getUser(), (int) $request->getParameter('projects_id')); $this->menu = array(); $ids = array(); foreach ($q->fetchArray() as $v) { if (strlen($sn = app::getArrayName($v, 'DiscussionsStatus')) > 0) { $sn = $sn . ': '; } else { $sn = ''; } if ($request->getParameter('discussions_id') == $v['id']) { $v['name'] = '<b>' . $v['name'] . '</b>'; } $this->menu[] = array('title' => $sn . $v['name'], 'url' => 'discussionsComments/index?projects_id=' . $request->getParameter('projects_id') . '&discussions_id=' . $v['id']); $ids[] = $v['id']; } $current_key = array_search($request->getParameter('discussions_id'), $ids); $this->previous_item_id = false; $this->next_item_id = false; if (isset($ids[$current_key - 1])) { $this->previous_item_id = $ids[$current_key - 1]; } if (isset($ids[$current_key + 1])) { $this->next_item_id = $ids[$current_key + 1]; } }
/** * Populate $objects with objects that $user can see * * @param Milestone $milestone * @param array $objects * @param User $user * @return null */ function discussions_handle_on_milestone_objects(&$milestone, &$objects, &$user) { if ($user->getProjectPermission('discussion', $milestone->getProject()) >= PROJECT_PERMISSION_ACCESS) { $objects[lang('Discussions')] = Discussions::findByMilestone($milestone, STATE_VISIBLE, $user->getVisibility()); } // if }
/** * Populate $portal_objects with objects which aren't private * * @param Milestone $milestone * @param array $portal_objects * @param Portal $portal * @return null */ function discussions_handle_on_portal_milestone_objects(&$milestone, &$portal_objects, &$portal) { if ($portal->getProjectPermissionValue('discussion') >= PROJECT_PERMISSION_ACCESS) { $portal_objects[lang('Discussions')] = Discussions::findByMilestone($milestone, STATE_VISIBLE, VISIBILITY_NORMAL); // used existing find method } // if }
public function executeIndex(sfWebRequest $request) { $this->forward404Unless($this->projects = Doctrine_Core::getTable('Projects')->createQuery()->addWhere('id=?', $request->getParameter('projects_id'))->fetchOne(), sprintf('Object projects does not exist (%s).', $request->getParameter('projects_id'))); $this->forward404Unless($this->discussions = Doctrine_Core::getTable('Discussions')->createQuery()->addWhere('id=?', $request->getParameter('discussions_id'))->addWhere('projects_id=?', $request->getParameter('projects_id'))->fetchOne(), sprintf('Object discussions does not exist (%s).', $request->getParameter('discussions_id'))); $this->checkProjectsAccess($this->projects); $this->checkDiscussionsAccess('view', $this->discussions, $this->projects); if (!$this->getUser()->hasAttribute('discussions_filter' . $request->getParameter('projects_id'))) { $this->getUser()->setAttribute('discussions_filter' . $request->getParameter('projects_id'), Discussions::getDefaultFilter($request, $this->getUser())); } $this->discussions_comments = Doctrine_Core::getTable('DiscussionsComments')->createQuery('dc')->leftJoin('dc.Users u')->addWhere('discussions_id=?', $request->getParameter('discussions_id'))->orderBy('created_at desc')->fetchArray(); $this->more_actions = $this->getMoreActions($request); app::setPageTitle(t::__('Discussion') . ' | ' . $this->discussions->getName(), $this->getResponse()); }
public function executeListing(sfWebRequest $request) { if (!isset($this->reports_id)) { $this->reports_id = false; } $q = Doctrine_Core::getTable('Discussions')->createQuery('d')->leftJoin('d.DiscussionsStatus ds')->leftJoin('d.Projects p')->leftJoin('d.Users'); if ($request->hasParameter('projects_id')) { $q->addWhere('projects_id=?', $request->getParameter('projects_id')); if (Users::hasAccess('view_own', 'discussions', $this->getUser(), $request->getParameter('projects_id'))) { $q->addWhere("find_in_set('" . $this->getUser()->getAttribute('id') . "',d.assigned_to) or d.users_id='" . $this->getUser()->getAttribute('id') . "'"); } } else { if (Users::hasAccess('view_own', 'projects', $this->getUser())) { $q->addWhere("find_in_set('" . $this->getUser()->getAttribute('id') . "',team) or p.created_by='" . $this->getUser()->getAttribute('id') . "'"); } if (Users::hasAccess('view_own', 'discussions', $this->getUser())) { $q->addWhere("find_in_set('" . $this->getUser()->getAttribute('id') . "',d.assigned_to) or d.users_id='" . $this->getUser()->getAttribute('id') . "'"); } } if ($this->reports_id > 0) { $q = DiscussionsReports::addFiltersToQuery($q, $this->reports_id, $this->getUser()); } elseif ($request->hasParameter('search')) { $q = app::addSearchQuery($q, $request->getParameter('search'), 'DiscussionsComments', 'd', $request->getParameter('search_by_extrafields')); $q = app::addListingOrder($q, 'discussions', $this->getUser()); } else { $q = Discussions::addFiltersToQuery($q, $this->getUser()->getAttribute('discussions_filter' . ((int) $request->getParameter('projects_id') > 0 ? $request->getParameter('projects_id') : ''))); $q = app::addListingOrder($q, 'discussions', $this->getUser(), (int) $request->getParameter('projects_id')); } if (sfConfig::get('app_rows_limit') > 0) { $this->pager = new sfDoctrinePager('Discussions', sfConfig::get('app_rows_limit')); $this->pager->setQuery($q); $this->pager->setPage($request->getParameter('page', 1)); $this->pager->init(); } $this->discussions_list = $q->fetchArray(); if (isset($this->is_dashboard)) { $this->url_params = 'redirect_to=dashboard'; $this->display_insert_button = true; } elseif ($this->reports_id > 0) { $this->url_params = 'redirect_to=discussionsReports' . $this->reports_id; $this->display_insert_button = true; } else { $this->url_params = ''; if ($request->hasParameter('projects_id')) { $this->url_params = 'projects_id=' . $request->getParameter('projects_id'); } $this->display_insert_button = true; } $this->tlId = rand(1111111, 9999999); }
/** * List of discussions * */ function index() { $this->addBreadcrumb(lang('List')); $page = $this->getPaginationPage(); $per_page = 30; // discussions per page if (!$this->active_category->isNew()) { list($discussions, $pagination) = Discussions::paginateByCategory($this->active_category, $page, $per_page, STATE_VISIBLE, $this->logged_user->getVisibility()); } else { list($discussions, $pagination) = Discussions::paginateByProject($this->active_project, $page, $per_page, STATE_VISIBLE, $this->logged_user->getVisibility()); } // if $this->smarty->assign(array('discussions' => $discussions, 'pagination' => $pagination, 'categories' => Categories::findByModuleSection($this->active_project, 'discussions', 'discussions'), 'pagination_url' => assemble_url('mobile_access_view_discussions', array('project_id' => $this->active_project->getId())), 'page_back_url' => assemble_url('mobile_access_view_project', array('project_id' => $this->active_project->getId())))); }
/** * Find project objects in commit message, make them links and * save the relations to database * * @param string $commit_message * @param string $commit_author * @param integer $revision * @param Repository $repository * @param Project $project * @return string */ function analyze_message($commit_message, $commit_author, $revision, $repository, $project) { if (define('PURIFY_HTML') && PURIFY_HTML) { $commit_message = purify_html($commit_message); // Clean! } // if $pattern = '/((complete[d]*)[\\s]+)?(ticket|milestone|discussion|task)[s]*[\\s]+[#]*\\d+/i'; if (preg_match_all($pattern, $commit_message, $matches)) { $i = 0; $search = array(); $replace = array(); $matches_unique = array_unique($matches['0']); foreach ($matches_unique as $key => $match) { $match_data = preg_split('/[\\s,]+/', $match, null, PREG_SPLIT_NO_EMPTY); // check if the object got completed by this commit $object_completed = false; if (strpos(strtolower($match_data['0']), 'complete') !== false) { $object_completed = true; unset($match_data['0']); $match_data = array_values($match_data); } // if $object_class_name = $match_data['0']; $module_name = Inflector::pluralize($object_class_name); $object_id = trim($match_data['1'], '#'); $search[$i] = $match; if (class_exists($module_name) && class_exists($object_class_name)) { $object = null; switch (strtolower($module_name)) { case 'tickets': $object = Tickets::findByTicketId($project, $object_id); break; case 'discussions': $object = Discussions::findById($object_id); break; case 'milestones': $object = Milestones::findById($object_id); break; case 'tasks': $object = Tasks::findById($object_id); break; } // switch if (instance_of($object, $object_class_name)) { $link_already_created = CommitProjectObjects::count("object_id = '" . $object->getId() . "' AND revision = '{$revision}'") > 0; if (!$link_already_created) { $comit_project_object = new CommitProjectObject(); $comit_project_object->setProjectId($object->getProjectId()); $comit_project_object->setObjectId($object->getId()); $comit_project_object->setObjectType(ucfirst($object_class_name)); $comit_project_object->setRepositoryId($repository->getId()); $comit_project_object->setRevision($revision); db_begin_work(); $save = $comit_project_object->save(); if ($save && !is_error($save)) { db_commit(); } else { db_rollback(); } // if save } // if $replace[$i] = ($object_completed ? 'Completed ' : '') . '<a href="' . $object->getViewUrl() . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>'; // set the object as completed if ($object_completed && !instance_of($object, 'Discussion')) { $completed_by = $repository->getMappedUser($commit_author); $object->complete($completed_by); } // if } else { $replace[$i] = ($object_completed ? 'Completed ' : '') . '<a href="#" class="project_object_missing" title="' . lang('Project object does not exist in this project') . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>'; } // if instance_of $i++; } // if module loaded } // foreach return str_ireplace($search, $replace, htmlspecialchars($commit_message)); // linkify } // if preg_match return $commit_message; }
/** * Add AC object links to commit messages * * @param string * @return string **/ private function analyzeCommitMessage($commit_message) { $pattern = '/(ticket|milestone|discussion|task)[s]*[\\s]+[#]*(\\d+)/i'; if (preg_match_all($pattern, $commit_message, $matches)) { $i = 0; $search = array(); $replace = array(); $matches_unique = array_unique($matches['0']); foreach ($matches_unique as $key => $match) { $match_data = preg_split('/[\\s,]+/', $match, null, PREG_SPLIT_NO_EMPTY); $object_class_name = $match_data['0']; $module_name = Inflector::pluralize($object_class_name); $object_id = trim($match_data['1'], '#'); $search[$i] = $match; if (class_exists($module_name) && class_exists($object_class_name)) { $object = null; switch (strtolower($module_name)) { case 'tickets': $object = Tickets::findByTicketId($this->active_project, $object_id); break; case 'discussions': $object = Discussions::findById($object_id); break; case 'milestones': $object = Milestones::findById($object_id); break; case 'tasks': $object = Tasks::findById($object_id); break; } // switch if (instance_of($object, $object_class_name)) { $replace[$i] = '<a href="' . $object->getViewUrl() . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>'; } else { $replace[$i] = '<a href="#" class="project_object_missing" title="' . lang('Project object does not exist in this project') . '">' . $match_data['0'] . ' ' . $match_data['1'] . '</a>'; } // if instance_of $i++; } // if module loaded } // foreach return str_ireplace($search, $replace, htmlspecialchars($commit_message)); // linkify } // if preg_match return $commit_message; }
/** * Export discussions * * @param void * @return null */ function export() { $object_visibility = array_var($_GET, 'visibility', VISIBILITY_NORMAL); $exportable_modules = explode(',', array_var($_GET, 'modules', null)); if (!is_foreachable($exportable_modules)) { $exportable_modules = null; } // if require_once PROJECT_EXPORTER_MODULE_PATH . '/models/ProjectExporterOutputBuilder.class.php'; $output_builder = new ProjectExporterOutputBuilder($this->active_project, $this->smarty, $this->active_module, $exportable_modules); if (!$output_builder->createOutputFolder()) { $this->serveData($output_builder->execution_log, 'execution_log', null, FORMAT_JSON); } // if $output_builder->createAttachmentsFolder(); $module_objects = Discussions::findByProject($this->active_project, STATE_VISIBLE, $object_visibility); $module_categories = Categories::findByModuleSection($this->active_project, $this->active_module, $this->active_module); $output_builder->setFileTemplate($this->active_module, $this->controller_name, 'index'); $output_builder->smarty->assign('categories', $module_categories); $output_builder->smarty->assign('objects', $module_objects); $output_builder->outputToFile('index'); // export files by categories if (is_foreachable($module_categories)) { foreach ($module_categories as $module_category) { if (instance_of($module_category, 'Category')) { $objects = ProjectObjects::find(array('conditions' => array('parent_id = ? AND project_id = ? AND type = ? AND state >= ? AND visibility >= ?', $module_category->getId(), $this->active_project->getId(), 'Discussion', STATE_VISIBLE, $object_visibility), 'order' => 'boolean_field_1, datetime_field_1 DESC')); $output_builder->smarty->assign(array('current_category' => $module_category, 'objects' => $objects)); $output_builder->outputToFile('category_' . $module_category->getId()); } // if } // foreach } // if // export discussions if (is_foreachable($module_objects)) { $output_builder->setFileTemplate($this->active_module, $this->controller_name, 'object'); foreach ($module_objects as $module_object) { if (instance_of($module_object, 'Discussion')) { $comments = $module_object->getComments($object_visibility); $output_builder->smarty->assign(array('object' => $module_object)); $output_builder->smarty->assign('comments', $comments); $output_builder->outputToFile('discussion_' . $module_object->getId()); $output_builder->outputObjectsAttachments($comments); $output_builder->outputAttachments($module_object->getAttachments()); } // if } // foreach } // if $this->serveData($output_builder->execution_log, 'execution_log', null, FORMAT_JSON); }
public function executeMultipleEdit(sfWebRequest $request) { if ($request->getParameter('projects_id') > 0) { $this->forward404Unless($this->projects = Doctrine_Core::getTable('Projects')->createQuery()->addWhere('id=?', $request->getParameter('projects_id'))->fetchOne(), sprintf('Object projects does not exist (%s).', $request->getParameter('projects_id'))); $this->checkProjectsAccess($this->projects); $this->checkDiscussionsAccess('edit', false, $this->projects); } else { $this->checkDiscussionsAccess('edit'); } $this->fields = array(); $choices = app::getItemsChoicesByTable('DiscussionsStatus', true); if (count($choices) > 1) { $this->fields['discussions_status_id'] = array('title' => t::__('Status'), 'choices' => $choices); } if ($request->getParameter('fields')) { if (strlen($request->getParameter('selected_items') == 0)) { exit; } foreach ($request->getParameter('fields') as $key => $value) { if (strlen($value) == 0 and !is_array($value)) { continue; } if ($key == 'discussions_status_id') { foreach (explode(',', $request->getParameter('selected_items')) as $pid) { if ($p = Doctrine_Core::getTable('Discussions')->find($pid)) { if ($p->getDiscussionsStatusId() != $value) { $p->setDiscussionsStatusId($value); $p->save(); if (strlen($p->getAssignedTo()) > 0) { Discussions::sendNotification($this, $p, array('status' => explode(',', $p->getAssignedTo())), $this->getUser()); } $c = new DiscussionsComments(); $c->setDiscussionsStatusId($value); $c->setDiscussionsId($pid); $c->setCreatedAt(date('Y-m-d H:i:s')); $c->setUsersId($this->getUser()->getAttribute('id')); $c->save(); } } } } else { Doctrine_Query::create()->update('Discussions')->set($key, $value)->whereIn('id', explode(',', $request->getParameter('selected_items')))->execute(); } } $this->redirect_to($request->getParameter('redirect_to'), $request->getParameter('projects_id'), $request->getParameter('discussions_id')); } }
/** * Return discussions by milestone * * @param Milestone $milestone * @param integer $min_state * @param integer $min_visibility * @return array */ function findByMilestone($milestone, $min_state = STATE_VISIBLE, $min_visibility = VISIBILITY_NORMAL) { return Discussions::find(array('conditions' => array('milestone_id = ? AND type = ? AND state >= ? AND visibility >= ?', $milestone->getId(), 'Discussion', $min_state, $min_visibility), 'order' => 'boolean_field_1 DESC, datetime_field_1 DESC')); }
public static function addListingOrder($q, $module, $sf_user, $projects_id = '') { if ($projects_id == 0) { $projects_id = ''; } switch ($module) { case 'projects': if ($sf_user->hasAttribute('projects_listing_order')) { $q = Projects::getListingOrderByType($q, $sf_user->getAttribute('projects_listing_order')); } else { $q->orderBy('ps.sort_order,p.projects_status_id, p.name'); } break; case 'tasks': if ($sf_user->hasAttribute('tasks_listing_order' . $projects_id)) { $q = Tasks::getListingOrderByType($q, $sf_user->getAttribute('tasks_listing_order' . $projects_id)); } else { $q->orderBy('ts.group desc, ts.sort_order,LTRIM(ts.name), LTRIM(p.name), LTRIM(t.name)'); } break; case 'tickets': if ($sf_user->hasAttribute('tickets_listing_order' . $projects_id)) { $q = Tickets::getListingOrderByType($q, $sf_user->getAttribute('tickets_listing_order' . $projects_id)); } else { $q->orderBy(' ts.sort_order,LTRIM(ts.name), LTRIM(p.name), LTRIM(t.name)'); } break; case 'discussions': if ($sf_user->hasAttribute('discussions_listing_order' . $projects_id)) { $q = Discussions::getListingOrderByType($q, $sf_user->getAttribute('discussions_listing_order' . $projects_id)); } else { $q->orderBy('ds.sort_order,LTRIM(ds.name), LTRIM(p.name), LTRIM(d.name)'); } break; } return $q; }
/** * Populate $objects with objects that are in $visibility domain * * @param Milestone $milestone * @param array $objects * @param integer $visibility * @return null */ function discussions_handle_on_milestone_objects_by_visibility(&$milestone, &$objects, $visibility) { $objects[lang('Discussions')] = Discussions::findByMilestone($milestone, STATE_VISIBLE, $visibility); }
public static function hasDiscussionsAccess($access, $sf_user, $discussions, $projects) { if (Users::hasAccess($access, 'discussions', $sf_user, $projects->getId()) and Discussions::hasViewOwnAccess($sf_user, $discussions, $projects)) { return true; } else { return false; } }