コード例 #1
0
ファイル: components.class.php プロジェクト: noikiy/qdpm
 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];
     }
 }
コード例 #2
0
/**
 * 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
}
コード例 #3
0
/**
 * 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
}
コード例 #4
0
ファイル: actions.class.php プロジェクト: noikiy/qdpm
 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());
 }
コード例 #5
0
ファイル: components.class.php プロジェクト: noikiy/qdpm
 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()))));
 }
コード例 #7
0
 /**
  * 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;
 }
コード例 #8
0
 /**
  * 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;
 }
コード例 #9
0
 /**
  * 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);
 }
コード例 #10
0
ファイル: actions.class.php プロジェクト: noikiy/qdpm
 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'));
     }
 }
コード例 #11
0
 /**
  * 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'));
 }
コード例 #12
0
ファイル: app.class.php プロジェクト: noikiy/qdpm
 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;
 }
コード例 #13
0
/**
 * 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);
}
コード例 #14
0
ファイル: Users.class.php プロジェクト: noikiy/qdpm
 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;
     }
 }