public function _migrateData(\b2db\Table $old_table) { $sqls = array(); $tn = $this->_getTableNameSQL(); switch ($old_table->getVersion()) { case 1: $crit = $this->getCriteria(); $crit->addWhere(self::EDITION, 0, Criteria::DB_NOT_EQUALS); $res = $this->doSelect($crit); $editions = array(); if ($res) { while ($row = $res->getNextRow()) { $editions[$row->get(self::EDITION)] = 0; } } $edition_projects = TBGEditionsTable::getTable()->getProjectIDsByEditionIDs(array_keys($editions)); foreach ($edition_projects as $edition => $project) { $crit = $this->getCriteria(); $crit->addUpdate(self::PROJECT, $project); $crit->addWhere(self::EDITION, $edition); $res = $this->doUpdate($crit); } break; } }
protected function _initialize() { parent::_setup(self::B2DBNAME, self::ID); parent::_addForeignKeyColumn(self::EDITION_ID, TBGEditionsTable::getTable()); parent::_addForeignKeyColumn(self::TEAM_ID, TBGTeamsTable::getTable()); parent::_addForeignKeyColumn(self::ROLE_ID, TBGListTypesTable::getTable()); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable()); }
protected function _initialize() { parent::_setup(self::B2DBNAME, self::ID); parent::_addVarchar(self::NAME, 100); parent::_addInteger(self::VERSION_MAJOR, 3); parent::_addInteger(self::VERSION_MINOR, 3); parent::_addInteger(self::VERSION_REVISION, 5); parent::_addInteger(self::RELEASE_DATE, 10); parent::_addBoolean(self::RELEASED); parent::_addBoolean(self::LOCKED); parent::_addForeignKeyColumn(self::EDITION, TBGEditionsTable::getTable(), TBGEditionsTable::ID); parent::_addForeignKeyColumn(self::PROJECT, TBGProjectsTable::getTable(), TBGProjectsTable::ID); parent::_addForeignKeyColumn(self::SCOPE, TBGScopesTable::getTable(), TBGScopesTable::ID); }
<?php echo __('Not determined'); ?> </span> <?php break; case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: $object = null; $value = null; try { switch ($info['type']) { case TBGCustomDatatype::EDITIONS_CHOICE: $object = TBGEditionsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $object = TBGComponentsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::RELEASES_CHOICE: $object = TBGBuildsTable::getTable()->selectById($info['name']); break; case TBGCustomDatatype::MILESTONE_CHOICE: $object = TBGMilestonesTable::getTable()->selectById($info['name']); break; } $value = is_object($object) ? $object->getName() : null; } catch (Exception $e) { } ?>
public function findIssues($filters = array(), $results_per_page = 30, $offset = 0, $groupby = null, $grouporder = null, $sortfields = array(self::LAST_UPDATED => 'asc')) { $crit = $this->getCriteria(); $crit->addWhere(self::DELETED, false); $crit->addWhere(self::SCOPE, TBGContext::getScope()->getID()); if (count($filters) > 0) { $crit->addJoin(TBGIssueCustomFieldsTable::getTable(), TBGIssueCustomFieldsTable::ISSUE_ID, TBGIssuesTable::ID); $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $filter_keys = array_keys($filters); foreach ($filters as $filter) { self::parseFilter($crit, $filter, $filter_keys); } } $crit->addSelectionColumn(self::ID); $crit->setDistinct(); if ($offset != 0) { $crit->setOffset($offset); } $crit2 = clone $crit; $count = $this->doCount($crit2); if ($count > 0) { $crit3 = $this->getCriteria(); if ($results_per_page != 0) { $crit->setLimit($results_per_page); } if ($offset != 0) { $crit->setOffset($offset); } if ($groupby !== null) { $grouporder = $grouporder !== null ? $grouporder == 'asc' ? Criteria::SORT_ASC : Criteria::SORT_DESC : Criteria::SORT_ASC; switch ($groupby) { case 'category': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::CATEGORY); $crit->addSelectionColumn(TBGListTypesTable::NAME); $crit->addOrderBy(TBGListTypesTable::NAME, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::CATEGORY); $crit3->addOrderBy(TBGListTypesTable::NAME, $grouporder); break; case 'status': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::STATUS); $crit->addSelectionColumn(self::STATUS); $crit->addOrderBy(TBGListTypesTable::ORDER, Criteria::SORT_DESC); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::STATUS); $crit3->addOrderBy(TBGListTypesTable::ORDER, Criteria::SORT_DESC); break; case 'milestone': $crit->addSelectionColumn(self::MILESTONE); $crit->addSelectionColumn(self::PERCENT_COMPLETE); $crit->addOrderBy(self::MILESTONE, $grouporder); $crit->addOrderBy(self::PERCENT_COMPLETE, 'desc'); $crit3->addOrderBy(self::MILESTONE, $grouporder); $crit3->addOrderBy(self::PERCENT_COMPLETE, 'desc'); break; case 'assignee': $crit->addSelectionColumn(self::ASSIGNEE_TEAM); $crit->addSelectionColumn(self::ASSIGNEE_USER); $crit->addOrderBy(self::ASSIGNEE_TEAM); $crit->addOrderBy(self::ASSIGNEE_USER, $grouporder); $crit3->addOrderBy(self::ASSIGNEE_TEAM); $crit3->addOrderBy(self::ASSIGNEE_USER, $grouporder); break; case 'state': $crit->addSelectionColumn(self::STATE); $crit->addOrderBy(self::STATE, $grouporder); $crit3->addOrderBy(self::STATE, $grouporder); break; case 'severity': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::SEVERITY); $crit->addSelectionColumn(self::SEVERITY); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::SEVERITY); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'user_pain': $crit->addSelectionColumn(self::USER_PAIN); $crit->addOrderBy(self::USER_PAIN, $grouporder); $crit3->addOrderBy(self::USER_PAIN, $grouporder); break; case 'votes': $crit->addSelectionColumn(self::VOTES_TOTAL); $crit->addOrderBy(self::VOTES_TOTAL, $grouporder); $crit3->addOrderBy(self::VOTES_TOTAL, $grouporder); break; case 'resolution': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::RESOLUTION); $crit->addSelectionColumn(self::RESOLUTION); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::RESOLUTION); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'priority': $crit->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::PRIORITY); $crit->addSelectionColumn(self::PRIORITY); $crit->addOrderBy(TBGListTypesTable::ORDER, $grouporder); $crit3->addJoin(TBGListTypesTable::getTable(), TBGListTypesTable::ID, self::PRIORITY); $crit3->addOrderBy(TBGListTypesTable::ORDER, $grouporder); break; case 'issuetype': $crit->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit->addSelectionColumn(TBGIssueTypesTable::NAME); $crit->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); $crit3->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit3->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); break; case 'edition': $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit->addSelectionColumn(TBGEditionsTable::NAME); $crit->addOrderBy(TBGEditionsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit3->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit3->addOrderBy(TBGEditionsTable::NAME, $grouporder); break; case 'build': $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit->addSelectionColumn(TBGBuildsTable::NAME); $crit->addOrderBy(TBGBuildsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit3->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit3->addOrderBy(TBGBuildsTable::NAME, $grouporder); break; case 'component': $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit->addSelectionColumn(TBGComponentsTable::NAME); $crit->addOrderBy(TBGComponentsTable::NAME, $grouporder); $crit3->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit3->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), Criteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit3->addOrderBy(TBGComponentsTable::NAME, $grouporder); break; } } foreach ($sortfields as $field => $sortorder) { $crit->addSelectionColumn($field); $crit->addOrderBy($field, $sortorder); } $res = $this->doSelect($crit, 'none'); $ids = array(); if ($res) { while ($row = $res->getNextRow()) { $ids[] = $row->get(self::ID); } $ids = array_reverse($ids); $crit3->addWhere(self::ID, $ids, Criteria::DB_IN); foreach ($sortfields as $field => $sortorder) { $crit3->addOrderBy($field, $sortorder); } $res = $this->doSelect($crit3); $rows = $res->getAllRows(); } else { $rows = array(); } unset($res); return array($rows, $count, $ids); } else { return array(null, 0, array()); } }
public function runFilterGetDynamicChoices(TBGRequest $request) { $subproject_ids = explode(',', $request['subprojects']); $existing_ids = $request['existing_ids']; $results = array(); $projects = $request['project_id'] != '' ? TBGProject::getAllByIDs(explode(',', $request['project_id'])) : TBGProject::getAll(); $items = array('build' => array(), 'edition' => array(), 'component' => array(), 'milestone' => array()); foreach ($projects as $project) { foreach ($project->getBuilds() as $build) { $items['build'][$build->getID()] = $build; } foreach ($project->getEditions() as $edition) { $items['edition'][$edition->getID()] = $edition; } foreach ($project->getComponents() as $component) { $items['component'][$component->getID()] = $component; } foreach ($project->getMilestones() as $milestone) { $items['milestone'][$milestone->getID()] = $milestone; } } $filters = array(); $filters['build'] = TBGSearchFilter::createFilter('build'); $filters['edition'] = TBGSearchFilter::createFilter('edition'); $filters['component'] = TBGSearchFilter::createFilter('component'); $filters['milestone'] = TBGSearchFilter::createFilter('milestone'); if (isset($existing_ids['build'])) { foreach (TBGBuildsTable::getTable()->getByIDs($existing_ids['build']) as $build) { $items['build'][$build->getID()] = $build; } $filters['build']->setValue(join(',', $existing_ids['build'])); } if (isset($existing_ids['edition'])) { foreach (TBGEditionsTable::getTable()->getByIDs($existing_ids['edition']) as $edition) { $items['edition'][$edition->getID()] = $edition; } $filters['edition']->setValue(join(',', $existing_ids['edition'])); } if (isset($existing_ids['component'])) { foreach (TBGComponentsTable::getTable()->getByIDs($existing_ids['component']) as $component) { $items['component'][$component->getID()] = $component; } $filters['component']->setValue(join(',', $existing_ids['component'])); } if (isset($existing_ids['milestone'])) { foreach (TBGMilestonesTable::getTable()->getByIDs($existing_ids['milestone']) as $milestone) { $items['milestone'][$milestone->getID()] = $milestone; } $filters['milestone']->setValue(join(',', $existing_ids['milestone'])); } foreach (array('build', 'edition', 'component', 'milestone') as $k) { $results[$k] = $this->getTemplateHTML('search/interactivefilterdynamicchoicelist', array('filter' => $filters[$k], 'items' => $items[$k])); } return $this->renderJSON(compact('results')); }
/** * Sets an issue field to a specified value * * @param TBGRequest $request */ public function runIssueSetField(TBGRequest $request) { if ($issue_id = $request['issue_id']) { try { $issue = TBGIssuesTable::getTable()->selectById($issue_id); } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderText('fail'); } } else { $this->getResponse()->setHttpStatus(400); return $this->renderText('no issue'); } TBGContext::loadLibrary('common'); if (!$issue instanceof TBGIssue) { return false; } switch ($request['field']) { case 'description': if (!$issue->canEditDescription()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setDescription($request->getRawParameter('value')); $issue->setDescriptionSyntax($request->getParameter('value_syntax')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isDescriptionChanged(), 'field' => array('id' => (int) ($issue->getDescription() != ''), 'name' => $issue->getParsedDescription(array('issue' => $issue))), 'description' => $issue->getParsedDescription(array('issue' => $issue)))); break; case 'reproduction_steps': if (!$issue->canEditReproductionSteps()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setReproductionSteps($request->getRawParameter('value')); $issue->setReproductionStepsSyntax($request->getParameter('value_syntax')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isReproductionStepsChanged(), 'field' => array('id' => (int) ($issue->getReproductionSteps() != ''), 'name' => $issue->getParsedReproductionSteps(array('issue' => $issue))), 'reproduction_steps' => $issue->getParsedReproductionSteps(array('issue' => $issue)))); break; case 'title': if (!$issue->canEditTitle()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request['value'] == '') { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You have to provide a title'))); } else { $issue->setTitle($request->getRawParameter('value')); return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isTitleChanged(), 'field' => array('id' => 1, 'name' => strip_tags($issue->getTitle())))); } break; case 'percent_complete': if (!$issue->canEditPercentage()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setPercentCompleted($request['percent']); return $this->renderJSON(array('issue_id' => $issue->getID(), 'field' => 'percent_complete', 'changed' => $issue->isPercentCompletedChanged(), 'percent' => $issue->getPercentCompleted())); break; case 'estimated_time': if (!$issue->canEditEstimatedTime()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if (!$issue->isUpdateable()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('This issue cannot be updated'))); } if ($request['estimated_time']) { $issue->setEstimatedTime($request['estimated_time']); } elseif ($request->hasParameter('value')) { $issue->setEstimatedTime($request['value']); } else { $issue->setEstimatedMonths($request['months']); $issue->setEstimatedWeeks($request['weeks']); $issue->setEstimatedDays($request['days']); $issue->setEstimatedHours($request['hours']); $issue->setEstimatedPoints($request['points']); } if ($request['do_save']) { $issue->save(); } return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isEstimatedTimeChanged(), 'field' => $issue->hasEstimatedTime() ? array('id' => 1, 'name' => TBGIssue::getFormattedTime($issue->getEstimatedTime())) : array('id' => 0), 'values' => $issue->getEstimatedTime())); break; case 'posted_by': case 'owned_by': case 'assigned_to': if ($request['field'] == 'posted_by' && !$issue->canEditPostedBy()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'owned_by' && !$issue->canEditOwner()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'assigned_to' && !$issue->canEditAssignee()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->hasParameter('value')) { if ($request->hasParameter('identifiable_type')) { if (in_array($request['identifiable_type'], array('team', 'user')) && $request['value'] != 0) { switch ($request['identifiable_type']) { case 'user': $identified = TBGContext::factory()->TBGUser($request['value']); break; case 'team': $identified = TBGContext::factory()->TBGTeam($request['value']); break; } if ($identified instanceof TBGUser || $identified instanceof TBGTeam) { if ((bool) $request->getParameter('teamup', false)) { $team = new TBGTeam(); $team->setName($identified->getBuddyname() . ' & ' . $this->getUser()->getBuddyname()); $team->setOndemand(true); $team->save(); $team->addMember($identified); $team->addMember($this->getUser()); $identified = $team; } if ($request['field'] == 'owned_by') { $issue->setOwner($identified); } elseif ($request['field'] == 'assigned_to') { $issue->setAssignee($identified); } } } else { if ($request['field'] == 'owned_by') { $issue->clearOwner(); } elseif ($request['field'] == 'assigned_to') { $issue->clearAssignee(); } } } elseif ($request['field'] == 'posted_by') { $identified = TBGContext::factory()->TBGUser($request['value']); if ($identified instanceof TBGUser) { $issue->setPostedBy($identified); } } if ($request['field'] == 'posted_by') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isPostedByChanged(), 'field' => array('id' => $issue->getPostedByID(), 'name' => $this->getComponentHTML('main/userdropdown', array('user' => $issue->getPostedBy()))))); } if ($request['field'] == 'owned_by') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isOwnerChanged(), 'field' => $issue->isOwned() ? array('id' => $issue->getOwner()->getID(), 'name' => $issue->getOwner() instanceof TBGUser ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getOwner())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getOwner()))) : array('id' => 0))); } if ($request['field'] == 'assigned_to') { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isAssigneeChanged(), 'field' => $issue->isAssigned() ? array('id' => $issue->getAssignee()->getID(), 'name' => $issue->getAssignee() instanceof TBGUser ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getAssignee())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getAssignee()))) : array('id' => 0))); } } break; case 'spent_time': if (!$issue->canEditSpentTime()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request['spent_time'] != TBGContext::getI18n()->__('Enter time spent here') && $request['spent_time']) { $issue->addSpentTime($request['spent_time']); } elseif ($request->hasParameter('value')) { $issue->addSpentTime($request['value']); } else { $issue->addSpentMonths($request['months']); $issue->addSpentWeeks($request['weeks']); $issue->addSpentDays($request['days']); $issue->addSpentHours($request['hours']); $issue->addSpentPoints($request['points']); } return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => $issue->isSpentTimeChanged(), 'field' => $issue->hasSpentTime() ? array('id' => 1, 'name' => TBGIssue::getFormattedTime($issue->getSpentTime())) : array('id' => 0), 'values' => $issue->getSpentTime())); break; case 'category': case 'resolution': case 'severity': case 'reproducability': case 'priority': case 'milestone': case 'issuetype': case 'status': case 'pain_bug_type': case 'pain_likelihood': case 'pain_effect': if ($request['field'] == 'category' && !$issue->canEditCategory()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'resolution' && !$issue->canEditResolution()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'severity' && !$issue->canEditSeverity()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'reproducability' && !$issue->canEditReproducability()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'priority' && !$issue->canEditPriority()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'milestone' && !$issue->canEditMilestone()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'issuetype' && !$issue->canEditIssuetype()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request['field'] == 'status' && !$issue->canEditStatus()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif (in_array($request['field'], array('pain_bug_type', 'pain_likelihood', 'pain_effect')) && !$issue->canEditUserPain()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } try { $classname = null; $parameter_name = mb_strtolower($request['field']); $parameter_id_name = "{$parameter_name}_id"; $is_pain = in_array($parameter_name, array('pain_bug_type', 'pain_likelihood', 'pain_effect')); if ($is_pain) { switch ($parameter_name) { case 'pain_bug_type': $set_function_name = 'setPainBugType'; $is_changed_function_name = 'isPainBugTypeChanged'; $get_pain_type_label_function = 'getPainBugTypeLabel'; break; case 'pain_likelihood': $set_function_name = 'setPainLikelihood'; $is_changed_function_name = 'isPainLikelihoodChanged'; $get_pain_type_label_function = 'getPainLikelihoodLabel'; break; case 'pain_effect': $set_function_name = 'setPainEffect'; $is_changed_function_name = 'isPainEffectChanged'; $get_pain_type_label_function = 'getPainEffectLabel'; break; } } else { $classname = 'TBG' . ucfirst($parameter_name); $lab_function_name = $classname; $set_function_name = 'set' . ucfirst($parameter_name); $is_changed_function_name = 'is' . ucfirst($parameter_name) . 'Changed'; } if ($request->hasParameter($parameter_id_name)) { $parameter_id = $request->getParameter($parameter_id_name); if ($parameter_id !== 0) { $is_valid = $is_pain ? in_array($parameter_id, array_keys(TBGIssue::getPainTypesOrLabel($parameter_name))) : $parameter_id == 0 || ($parameter = TBGContext::factory()->{$lab_function_name}($parameter_id)) instanceof $classname; } if ($parameter_id == 0 || $parameter_id !== 0 && $is_valid) { if ($classname == 'TBGIssuetype') { $visible_fields = $issue->getIssuetype() instanceof TBGIssuetype ? $issue->getProject()->getVisibleFieldsArray($issue->getIssuetype()->getID()) : array(); } else { $visible_fields = null; } $issue->{$set_function_name}($parameter_id); if ($is_pain) { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } return $parameter_id == 0 ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => $parameter_id, 'name' => $issue->{$get_pain_type_label_function}()), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } else { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } if (isset($parameter)) { $name = $parameter->getName(); } else { $name = null; } $field = array('id' => $parameter_id, 'name' => $name); if ($classname == 'TBGIssuetype') { TBGContext::loadLibrary('ui'); $field['src'] = htmlspecialchars(TBGContext::getTBGPath() . 'iconsets/' . TBGSettings::getThemeName() . '/' . $issue->getIssuetype()->getIcon() . '_small.png'); } if ($parameter_id == 0) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))); } else { $options = array('issue_id' => $issue->getID(), 'changed' => true, 'visible_fields' => $visible_fields, 'field' => $field); if ($request['field'] == 'milestone') { $options['field']['url'] = $this->getRouting()->generate('project_milestone_details', array('project_key' => $issue->getProject()->getKey(), 'milestone_id' => $issue->getMilestone()->getID())); } if ($request['field'] == 'status') { $options['field']['color'] = $issue->getStatus()->getItemdata(); } return $this->renderJSON($options); } } } } } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => $e->getMessage())); } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field value specified'))); break; default: if ($customdatatype = TBGCustomDatatype::getByKey($request['field'])) { $key = $customdatatype->getKey(); $customdatatypeoption_value = $request->getParameter("{$key}_value"); if (!$customdatatype->hasCustomOptions()) { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::STATUS_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: case TBGCustomDatatype::USER_CHOICE: case TBGCustomDatatype::TEAM_CHOICE: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: $temp = TBGEditionsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $temp = TBGComponentsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::RELEASES_CHOICE: $temp = TBGBuildsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::MILESTONE_CHOICE: $temp = TBGMilestonesTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::STATUS_CHOICE: $temp = TBGStatus::getB2DBTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::USER_CHOICE: $temp = TBGUsersTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; case TBGCustomDatatype::TEAM_CHOICE: $temp = TBGTeamsTable::getTable()->selectById($request->getRawParameter("{$key}_value")); break; } $finalvalue = $temp->getName(); $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } if ($customdatatype->getType() == TBGCustomDatatype::STATUS_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = '<div class="status_badge" style="background-color: ' . $temp->getColor() . ';"><span>' . $finalvalue . '</span></div>'; } elseif ($customdatatype->getType() == TBGCustomDatatype::USER_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = $this->getComponentHTML('main/userdropdown', array('user' => $temp)); } elseif ($customdatatype->getType() == TBGCustomDatatype::TEAM_CHOICE && isset($temp) && is_object($temp)) { $finalvalue = $this->getComponentHTML('main/teamdropdown', array('team' => $temp)); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => $finalvalue))); break; case TBGCustomDatatype::INPUT_TEXTAREA_MAIN: case TBGCustomDatatype::INPUT_TEXTAREA_SMALL: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => tbg_parse_text($request->getRawParameter("{$key}_value"))))); break; case TBGCustomDatatype::DATE_PICKER: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => date('Y-m-d', (int) $request->getRawParameter("{$key}_value"))))); break; default: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $key, 'name' => filter_var($customdatatypeoption_value, FILTER_VALIDATE_URL) !== false ? "<a href=\"{$customdatatypeoption_value}\">{$customdatatypeoption_value}</a>" : $customdatatypeoption_value))); break; } } $customdatatypeoption = $customdatatypeoption_value ? TBGCustomDatatypeOption::getB2DBTable()->selectById($customdatatypeoption_value) : null; if ($customdatatypeoption instanceof TBGCustomDatatypeOption) { $issue->setCustomField($key, $customdatatypeoption->getID()); } else { $issue->setCustomField($key, null); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => false)); } return !$customdatatypeoption instanceof TBGCustomDatatypeOption ? $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('issue_id' => $issue->getID(), 'changed' => true, 'field' => array('value' => $customdatatypeoption->getID(), 'name' => $customdatatypeoption->getName()))); } break; } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field specified (%field)', array('%field' => $request['field'])))); }
private function _fixTimestamps() { // Unlimited execution time set_time_limit(0); foreach (TBGScope::getAll() as $scope) { TBGContext::setScope($scope); // The first job is to work out the offsets that need applying $offsets = array('system', 'users'); $offsets['users'] = array(); $offsets['system'] = (int) TBGSettings::getGMToffset() * 3600; $settingstable = TBGSettingsTable::getTable(); $crit = $settingstable->getCriteria(); $crit->addWhere(TBGSettingsTable::NAME, 'timezone'); $crit->addWhere(TBGSettingsTable::MODULE, 'core'); $crit->addWhere(TBGSettingsTable::UID, 0, \b2db\Criteria::DB_NOT_EQUALS); $crit->addWhere(TBGSettingsTable::VALUE, 0, \b2db\Criteria::DB_NOT_EQUALS); $crit->addWhere(TBGSettingsTable::VALUE, 'sys', \b2db\Criteria::DB_NOT_EQUALS); $crit->addWhere(TBGSettingsTable::SCOPE, $scope->getID()); $res = $settingstable->doSelect($crit); if ($res instanceof \b2db\Resultset) { while ($user = $res->getNextRow()) { $offsets['users']['uid_' . $user->get(TBGSettingsTable::UID)] = (int) $user->get(TBGSettingsTable::VALUE) * 3600; } } // Now go through every thing which requires updating TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'publish' . DS . 'classes' . DS . 'B2DB'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'publish' . DS . 'classes'); // ARTICLE HISTORY $this->_fixUserDependentTimezone($offsets, TBGArticleHistoryTable::getTable(), TBGArticleHistoryTable::AUTHOR, TBGArticleHistoryTable::DATE, $scope); // ARTICLES $this->_fixUserDependentTimezone($offsets, TBGArticlesTable::getTable(), TBGArticlesTable::AUTHOR, TBGArticlesTable::DATE, $scope); // BUILDS $this->_fixNonUserDependentTimezone($offsets, TBGBuildsTable::getTable(), TBGBuildsTable::RELEASE_DATE, $scope, TBGBuildsTable::RELEASED); // COMMENTS $this->_fixUserDependentTimezone($offsets, TBGCommentsTable::getTable(), array('a' => TBGCommentsTable::POSTED_BY, 'b' => TBGCommentsTable::UPDATED_BY), array('a' => TBGCommentsTable::POSTED, 'b' => TBGCommentsTable::UPDATED), $scope); // EDITIONS $this->_fixNonUserDependentTimezone($offsets, TBGEditionsTable::getTable(), TBGEditionsTable::RELEASE_DATE, $scope, TBGEditionsTable::RELEASED); // ISSUES // This is a bit more complex so do this manually - we have to poke around with the issue log $table = TBGIssuesTable::getTable(); $crit = $table->getCriteria(); $crit->addWhere(TBGIssuesTable::SCOPE, $scope->getID()); $crit->addWhere(TBGIssuesTable::DELETED, false); $res = $table->doSelect($crit); if ($res) { while ($row = $res->getNextRow()) { $crit = TBGLogTable::getTable()->getCriteria(); $crit->addSelectionColumn(TBGLogTable::UID); $crit->addWhere(TBGLogTable::CHANGE_TYPE, TBGLogTable::LOG_ISSUE_ASSIGNED); $crit->addWhere(TBGLogTable::TARGET, $row->get(TBGIssuesTable::ID)); $crit->addWhere(TBGLogTable::TARGET_TYPE, TBGLogTable::TYPE_ISSUE); $crit->addOrderBy(TBGLogTable::TIME, b2db\Criteria::SORT_DESC); $crit->addOrderBy(TBGLogTable::ID, b2db\Criteria::SORT_DESC); if ($row2 = TBGLogTable::getTable()->doSelectOne($crit)) { $assigned_by = $row2->get(TBGLogTable::UID); } $crit = TBGLogTable::getTable()->getCriteria(); $crit->addSelectionColumn(TBGLogTable::UID); $crit->addWhere(TBGLogTable::TARGET, $row->get(TBGIssuesTable::ID)); $crit->addWhere(TBGLogTable::TARGET_TYPE, TBGLogTable::TYPE_ISSUE); $crit->addOrderBy(TBGLogTable::TIME, b2db\Criteria::SORT_DESC); $crit->addOrderBy(TBGLogTable::ID, b2db\Criteria::SORT_DESC); if ($row2 = TBGLogTable::getTable()->doSelectOne($crit)) { $updated_by = $row2->get(TBGLogTable::UID); } unset($crit); unset($row2); if (array_key_exists('uid_' . $row->get(TBGIssuesTable::POSTED_BY), $offsets['users'])) { $offset = $offsets['users']['uid_' . $row->get(TBGIssuesTable::POSTED_BY)]; } else { $offset = $offsets['system']; } if (isset($updated_by) && array_key_exists('uid_' . $updated_by, $offsets['users'])) { $offset2 = $offsets['users']['uid_' . $updated_by]; } elseif (isset($updated_by)) { $offset2 = $offsets['system']; } if (isset($assigned_by) && array_key_exists('uid_' . $assigned_by, $offsets['users'])) { $offset3 = $offsets['users']['uid_' . $assigned_by]; } elseif (isset($assigned_by)) { $offset3 = $offsets['system']; } $crit2 = $table->getCriteria(); $crit2->addUpdate(TBGIssuesTable::POSTED, (int) $row->get(TBGIssuesTable::POSTED) + $offset); if (isset($offset2)) { $crit2->addUpdate(TBGIssuesTable::LAST_UPDATED, (int) $row->get(TBGIssuesTable::LAST_UPDATED) + $offset2); unset($offset2); } if (isset($offset3)) { $crit2->addUpdate(TBGIssuesTable::BEING_WORKED_ON_BY_USER_SINCE, (int) $row->get(TBGIssuesTable::BEING_WORKED_ON_BY_USER_SINCE) + $offset3); unset($offset3); } $crit2->addWhere(TBGIssuesTable::ID, $row->get(TBGIssuesTable::ID)); $table->doUpdate($crit2); } } // LOG $this->_fixUserDependentTimezone($offsets, TBGLogTable::getTable(), TBGLogTable::UID, TBGLogTable::TIME, $scope); // MILESTONES // The conditions are a bit different here so do it manually $table = TBGMilestonesTable::getTable(); $crit = $table->getCriteria(); $crit->addWhere(TBGMilestonesTable::SCOPE, $scope->getID()); $res = $table->doSelect($crit); if ($res) { while ($row = $res->getNextRow()) { $offset = $offsets['system']; $crit2 = $table->getCriteria(); $added = 0; if ($row->get(TBGMilestonesTable::REACHED) > 0) { $crit2->addUpdate(TBGMilestonesTable::REACHED, (int) $row->get(TBGMilestonesTable::REACHED) + $offset); $added = 1; } if ($row->get(TBGMilestonesTable::SCHEDULED) > 0) { $crit2->addUpdate(TBGMilestonesTable::SCHEDULED, (int) $row->get(TBGMilestonesTable::SCHEDULED) + $offset); $added = 1; } if ($row->get(TBGMilestonesTable::STARTING) > 0) { $crit2->addUpdate(TBGMilestonesTable::STARTING, (int) $row->get(TBGMilestonesTable::STARTING) + $offset); $added = 1; } // Only do something if at least one call to addUpdate is done if ($added == 1) { $crit2->addWhere(TBGMilestonesTable::ID, $row->get(TBGMilestonesTable::ID)); $table->doUpdate($crit2); } } } // PROJECTS $this->_fixNonUserDependentTimezone($offsets, TBGProjectsTable::getTable(), TBGProjectsTable::RELEASE_DATE, $scope, TBGProjectsTable::RELEASED); // VCS INTEGRATION // check if module is loaded $modules = TBGModulesTable::getTable()->getModulesForScope($scope->getID()); if ($modules['vcs_integration'] == true) { TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'vcs_integration' . DS . 'classes' . DS . 'B2DB'); TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'vcs_integration' . DS . 'classes'); $this->_fixUserDependentTimezone($offsets, TBGVCSIntegrationTable::getTable(), TBGVCSIntegrationTable::AUTHOR, TBGVCSIntegrationTable::DATE, $scope); } } }
protected function _saveCustomFieldValues() { foreach (TBGCustomDatatype::getAll() as $key => $customdatatype) { switch ($customdatatype->getType()) { case TBGCustomDatatype::INPUT_TEXT: case TBGCustomDatatype::INPUT_TEXTAREA_SMALL: case TBGCustomDatatype::INPUT_TEXTAREA_MAIN: case TBGCustomDatatype::DATE_PICKER: $option_id = $this->getCustomField($key); TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldValue($option_id, $customdatatype->getID(), $this->getID()); break; case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::MILESTONE_CHOICE: case TBGCustomDatatype::STATUS_CHOICE: case TBGCustomDatatype::USER_CHOICE: case TBGCustomDatatype::TEAM_CHOICE: $option_object = null; try { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: $option_object = TBGEditionsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $option_object = TBGComponentsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::RELEASES_CHOICE: $option_object = TBGBuildsTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::MILESTONE_CHOICE: $option_object = TBGMilestonesTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::STATUS_CHOICE: $option_object = TBGListTypesTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::USER_CHOICE: $option_object = TBGUsersTable::getTable()->selectById($this->getCustomField($key)); break; case TBGCustomDatatype::TEAM_CHOICE: $option_object = TBGTeamsTable::getTable()->selectById($this->getCustomField($key)); break; } } catch (Exception $e) { } $option_id = is_object($option_object) ? $option_object->getID() : null; TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldOption($option_id, $customdatatype->getID(), $this->getID()); break; default: $option_id = $this->getCustomField($key) instanceof TBGCustomDatatypeOption ? $this->getCustomField($key)->getID() : null; TBGIssueCustomFieldsTable::getTable()->saveIssueCustomFieldOption($option_id, $customdatatype->getID(), $this->getID()); break; } } }
public function findIssues($filters = array(), $results_per_page = 30, $offset = 0, $groupby = null, $grouporder = null) { $crit = $this->getCriteria(); $crit->addWhere(self::DELETED, false); if (count($filters) > 0) { $crit->addJoin(TBGIssueCustomFieldsTable::getTable(), TBGIssueCustomFieldsTable::ISSUE_ID, TBGIssuesTable::ID); foreach ($filters as $filter => $filter_info) { if (array_key_exists('value', $filter_info) && in_array($filter_info['operator'], array('=', '!=', '<=', '>=', '<', '>'))) { if ($filter == 'text') { if ($filter_info['value'] != '') { $searchterm = strpos($filter_info['value'], '%') !== false ? $filter_info['value'] : "%{$filter_info['value']}%"; if ($filter_info['operator'] == '=') { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $searchterm, B2DBCriteria::DB_LIKE); } else { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $searchterm, B2DBCriteria::DB_NOT_LIKE); } $crit->addWhere($ctn); } } elseif (in_array($filter, self::getValidSearchFilters())) { $crit->addWhere($this->getB2DBName() . '.' . $filter, $filter_info['value'], $filter_info['operator']); } elseif (TBGCustomDatatype::doesKeyExist($filter)) { $customdatatype = TBGCustomDatatype::getByKey($filter); $ctn = $crit->returnCriterion(TBGIssueCustomFieldsTable::CUSTOMFIELDS_ID, $customdatatype->getID()); $ctn->addWhere(TBGIssueCustomFieldsTable::OPTION_VALUE, $filter_info['value'], $filter_info['operator']); $crit->addWhere($ctn); } } else { if (in_array($filter, self::getValidSearchFilters())) { $first_val = array_shift($filter_info); if ($filter == 'text') { $filter_info = $first_val; if ($filter_info['value'] != '') { $searchterm = strpos($filter_info['value'], '%') !== false ? $filter_info['value'] : "%{$filter_info['value']}%"; if ($filter_info['operator'] == '=') { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_LIKE); $ctn->addOr(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_LIKE); } else { $ctn = $crit->returnCriterion(self::TITLE, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::DESCRIPTION, $searchterm, B2DBCriteria::DB_NOT_LIKE); $ctn->addWhere(self::REPRODUCTION_STEPS, $searchterm, B2DBCriteria::DB_NOT_LIKE); } $crit->addWhere($ctn); } } else { $ctn = $crit->returnCriterion($this->getB2DBName() . '.' . $filter, $first_val['value'], $first_val['operator']); if (count($filter_info) > 0) { foreach ($filter_info as $single_filter) { if (in_array($single_filter['operator'], array('=', '<=', '>=', '<', '>'))) { $ctn->addOr($this->getB2DBName() . '.' . $filter, $single_filter['value'], $single_filter['operator']); } elseif ($single_filter['operator'] == '!=') { $ctn->addWhere($this->getB2DBName() . '.' . $filter, $single_filter['value'], $single_filter['operator']); } } } $crit->addWhere($ctn); } } elseif (TBGCustomDatatype::doesKeyExist($filter)) { $customdatatype = TBGCustomDatatype::getByKey($filter); $first_val = array_shift($filter_info); $ctn = $crit->returnCriterion(TBGIssueCustomFieldsTable::CUSTOMFIELDS_ID, $customdatatype->getID()); $ctn->addWhere(TBGIssueCustomFieldsTable::OPTION_VALUE, $first_val['value'], $first_val['operator']); if (count($filter_info) > 0) { foreach ($filter_info as $single_filter) { if (in_array($single_filter['operator'], array('=', '!=', '<=', '>=', '<', '>'))) { $ctn->addOr(TBGIssueCustomFieldsTable::OPTION_VALUE, $single_filter['value'], $single_filter['operator']); } } } $crit->addWhere($ctn); } } } } $crit->addSelectionColumn(self::ID); $crit->setDistinct(); if ($offset != 0) { $crit->setOffset($offset); } $crit2 = clone $crit; $count = $this->doCount($crit2); if ($count > 0) { if ($results_per_page != 0) { $crit->setLimit($results_per_page); } if ($offset != 0) { $crit->setOffset($offset); } if ($groupby !== null) { $grouporder = $grouporder !== null ? $grouporder == 'asc' ? B2DBCriteria::SORT_ASC : B2DBCriteria::SORT_DESC : B2DBCriteria::SORT_ASC; switch ($groupby) { case 'category': $crit->addSelectionColumn(TBGListTypesTable::NAME); $crit->addOrderBy(TBGListTypesTable::NAME, $grouporder); break; case 'status': $crit->addSelectionColumn(self::STATUS); $crit->addOrderBy(self::STATUS, $grouporder); break; case 'milestone': $crit->addSelectionColumn(self::MILESTONE); $crit->addSelectionColumn(self::PERCENT_COMPLETE); $crit->addOrderBy(self::MILESTONE, $grouporder); $crit->addOrderBy(self::PERCENT_COMPLETE, 'desc'); break; case 'assignee': $crit->addSelectionColumn(self::ASSIGNED_TYPE); $crit->addSelectionColumn(self::ASSIGNED_TO); $crit->addOrderBy(self::ASSIGNED_TYPE); $crit->addOrderBy(self::ASSIGNED_TO, $grouporder); break; case 'state': $crit->addSelectionColumn(self::STATE); $crit->addOrderBy(self::STATE, $grouporder); break; case 'severity': $crit->addSelectionColumn(self::SEVERITY); $crit->addOrderBy(self::SEVERITY, $grouporder); break; case 'user_pain': $crit->addSelectionColumn(self::USER_PAIN); $crit->addOrderBy(self::USER_PAIN, $grouporder); break; case 'votes': $crit->addSelectionColumn(self::VOTES_TOTAL); $crit->addOrderBy(self::VOTES_TOTAL, $grouporder); break; case 'resolution': $crit->addSelectionColumn(self::RESOLUTION); $crit->addOrderBy(self::RESOLUTION, $grouporder); break; case 'priority': $crit->addSelectionColumn(self::PRIORITY); $crit->addOrderBy(self::PRIORITY, $grouporder); break; case 'issuetype': $crit->addJoin(TBGIssueTypesTable::getTable(), TBGIssueTypesTable::ID, self::ISSUE_TYPE); $crit->addSelectionColumn(TBGIssueTypesTable::NAME); $crit->addOrderBy(TBGIssueTypesTable::NAME, $grouporder); break; case 'edition': $crit->addJoin(TBGIssueAffectsEditionTable::getTable(), TBGIssueAffectsEditionTable::ISSUE, self::ID); $crit->addJoin(TBGEditionsTable::getTable(), TBGEditionsTable::ID, TBGIssueAffectsEditionTable::EDITION, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsEditionTable::getTable()); $crit->addSelectionColumn(TBGEditionsTable::NAME); $crit->addOrderBy(TBGEditionsTable::NAME, $grouporder); break; case 'build': $crit->addJoin(TBGIssueAffectsBuildTable::getTable(), TBGIssueAffectsBuildTable::ISSUE, self::ID); $crit->addJoin(TBGBuildsTable::getTable(), TBGBuildsTable::ID, TBGIssueAffectsBuildTable::BUILD, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsBuildTable::getTable()); $crit->addSelectionColumn(TBGBuildsTable::NAME); $crit->addOrderBy(TBGBuildsTable::NAME, $grouporder); break; case 'component': $crit->addJoin(TBGIssueAffectsComponentTable::getTable(), TBGIssueAffectsComponentTable::ISSUE, self::ID); $crit->addJoin(TBGComponentsTable::getTable(), TBGComponentsTable::ID, TBGIssueAffectsComponentTable::COMPONENT, array(), B2DBCriteria::DB_LEFT_JOIN, TBGIssueAffectsComponentTable::getTable()); $crit->addSelectionColumn(TBGComponentsTable::NAME); $crit->addOrderBy(TBGComponentsTable::NAME, $grouporder); break; } } $crit->addSelectionColumn(self::LAST_UPDATED); $crit->addOrderBy(self::LAST_UPDATED, 'asc'); $res = $this->doSelect($crit, 'none'); $ids = array(); while ($row = $res->getNextRow()) { $ids[] = $row->get(self::ID); } $ids = array_reverse($ids); $crit2 = $this->getCriteria(); $crit2->addWhere(self::ID, $ids, B2DBCriteria::DB_IN); $crit2->addOrderBy(self::ID, $ids); $res = $this->doSelect($crit2); return array($res, $count); } else { return array(null, 0); } }