public static function getAll() { if (self::$_clients === null) { self::$_clients = TBGClientsTable::getTable()->getAll(); } return self::$_clients; }
public static function getAll() { if (self::$_clients === null) { self::$_clients = array(); if ($res = B2DB::getTable('TBGClientsTable')->getAll()) { while ($row = $res->getNextRow()) { self::$_clients[$row->get(TBGClientsTable::ID)] = TBGContext::factory()->TBGClient($row->get(TBGClientsTable::ID), $row); } } } return self::$_clients; }
public function runDoImportCSV(TBGRequest $request) { try { if ($request->getParameter('csv_data') == '') { throw new Exception(TBGContext::getI18n()->__('No data supplied to import')); } // Split data into individual lines $data = str_replace("\r\n", "\n", $request->getParameter('csv_data')); $data = explode("\n", $data); if (count($data) <= 1) { throw new Exception(TBGContext::getI18n()->__('Insufficient data to import')); } $headerrow = $data[0]; $headerrow = html_entity_decode($headerrow, ENT_QUOTES); $headerrow = explode(',', $headerrow); $headerrow2 = array(); for ($i = 0; $i != count($headerrow); $i++) { $headerrow2[$i] = trim($headerrow[$i], '" '); } $errors = array(); // inspect for correct rows switch ($request->getParameter('type')) { case 'clients': $namecol = null; $emailcol = null; $telephonecol = null; $faxcol = null; $websitecol = null; for ($i = 0; $i != count($headerrow2); $i++) { if ($headerrow2[$i] == 'name') { $namecol = $i; } elseif ($headerrow2[$i] == 'email') { $emailcol = $i; } elseif ($headerrow2[$i] == 'telephone') { $telephonecol = $i; } elseif ($headerrow2[$i] == 'fax') { $faxcol = $i; } elseif ($headerrow2[$i] == 'website') { $websitecol = $i; } } $rowlength = count($headerrow2); if ($namecol === null) { $errors[] = TBGContext::getI18n()->__('Required column \'%col%\' not found in header row', array('%col%' => 'name')); } break; case 'projects': $namecol = null; $prefix = null; $scrum = null; $owner = null; $owner_type = null; $lead = null; $lead_type = null; $qa = null; $qa_type = null; $descr = null; $doc_url = null; $freelance = null; $en_builds = null; $en_comps = null; $en_editions = null; $workflow_id = null; $client = null; $show_summary = null; $summary_type = null; $issuetype_scheme = null; $allow_reporting = null; $autoassign = null; for ($i = 0; $i != count($headerrow2); $i++) { if ($headerrow2[$i] == 'name') { $namecol = $i; } elseif ($headerrow2[$i] == 'prefix') { $prefix = $i; } elseif ($headerrow2[$i] == 'scrum') { $scrum = $i; } elseif ($headerrow2[$i] == 'owner') { $owner = $i; } elseif ($headerrow2[$i] == 'owner_type') { $owner_type = $i; } elseif ($headerrow2[$i] == 'lead') { $lead = $i; } elseif ($headerrow2[$i] == 'lead_type') { $lead_type = $i; } elseif ($headerrow2[$i] == 'qa') { $qa = $i; } elseif ($headerrow2[$i] == 'qa_type') { $qa_type = $i; } elseif ($headerrow2[$i] == 'descr') { $descr = $i; } elseif ($headerrow2[$i] == 'doc_url') { $doc_url = $i; } elseif ($headerrow2[$i] == 'freelance') { $freelance = $i; } elseif ($headerrow2[$i] == 'en_builds') { $en_builds = $i; } elseif ($headerrow2[$i] == 'en_comps') { $en_comps = $i; } elseif ($headerrow2[$i] == 'en_editions') { $en_editions = $i; } elseif ($headerrow2[$i] == 'workflow_id') { $workflow_id = $i; } elseif ($headerrow2[$i] == 'client') { $client = $i; } elseif ($headerrow2[$i] == 'show_summary') { $show_summary = $i; } elseif ($headerrow2[$i] == 'summary_type') { $summary_type = $i; } elseif ($headerrow2[$i] == 'issuetype_scheme') { $issuetype_scheme = $i; } elseif ($headerrow2[$i] == 'allow_reporting') { $allow_reporting = $i; } elseif ($headerrow2[$i] == 'autoassign') { $autoassign = $i; } } $rowlength = count($headerrow2); if ($namecol === null) { $errors[] = TBGContext::getI18n()->__('Required column \'%col%\' not found in header row', array('%col%' => 'name')); } break; case 'issues': $title = null; $project = null; $descr = null; $repro = null; $state = null; $status = null; $posted_by = null; $owner = null; $owner_type = null; $assigned = null; $assigned_type = null; $resolution = null; $issue_type = null; $priority = null; $category = null; $severity = null; $reproducability = null; $votes = null; $percentage = null; $blocking = null; $milestone = null; for ($i = 0; $i != count($headerrow2); $i++) { if ($headerrow2[$i] == 'title') { $title = $i; } elseif ($headerrow2[$i] == 'project') { $project = $i; } elseif ($headerrow2[$i] == 'assigned') { $assigned = $i; } elseif ($headerrow2[$i] == 'repro') { $repro = $i; } elseif ($headerrow2[$i] == 'state') { $state = $i; } elseif ($headerrow2[$i] == 'status') { $status = $i; } elseif ($headerrow2[$i] == 'posted_by') { $posted_by = $i; } elseif ($headerrow2[$i] == 'owner') { $owner = $i; } elseif ($headerrow2[$i] == 'owner_type') { $owner_type = $i; } elseif ($headerrow2[$i] == 'assigned') { $assigned = $i; } elseif ($headerrow2[$i] == 'assigned_type') { $assigned_type = $i; } elseif ($headerrow2[$i] == 'resolution') { $resolution = $i; } elseif ($headerrow2[$i] == 'issue_type') { $issue_type = $i; } elseif ($headerrow2[$i] == 'priority') { $priority = $i; } elseif ($headerrow2[$i] == 'category') { $category = $i; } elseif ($headerrow2[$i] == 'severity') { $severity = $i; } elseif ($headerrow2[$i] == 'reproducability') { $reproducability = $i; } elseif ($headerrow2[$i] == 'votes') { $votes = $i; } elseif ($headerrow2[$i] == 'percentage') { $percentage = $i; } elseif ($headerrow2[$i] == 'blocking') { $blocking = $i; } elseif ($headerrow2[$i] == 'type') { $issue_type = $i; } elseif ($headerrow2[$i] == 'milestone') { $milestone = $i; } } $rowlength = count($headerrow2); if ($title === null) { $errors[] = TBGContext::getI18n()->__('Required column \'%col%\' not found in header row', array('%col%' => 'title')); } if ($project === null) { $errors[] = TBGContext::getI18n()->__('Required column \'%col%\' not found in header row', array('%col%' => 'project')); } if ($issue_type === null) { $errors[] = TBGContext::getI18n()->__('Required column \'%col%\' not found in header row', array('%col%' => 'issue_type')); } break; default: throw new Exception('Sorry, this type is unimplemented'); break; } // Check if rows are long enough for ($i = 1; $i != count($data); $i++) { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); if (count($activerow) != $rowlength) { $errors[] = TBGContext::getI18n()->__('Row %row% does not have the same number of elements as the header row', array('%row%' => $i + 1)); } } reset($data); // Check if fields are empty for ($i = 1; $i != count($data); $i++) { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); for ($j = 0; $j != count($activerow); $j++) { if ($activerow[$j] == '' || $activerow[$j] == '""') { $errors[] = TBGContext::getI18n()->__('Row %row% column %col% has no value', array('%col%' => $j + 1, '%row%' => $i + 1)); } } } if (count($errors) == 0) { // Check if fields are valid switch ($request->getParameter('type')) { case 'projects': for ($i = 1; $i != count($data); $i++) { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); // Check if project exists $key = trim($activerow[$namecol], '" '); $key = str_replace(' ', '', $key); $key = strtolower($key); $tmp = TBGProject::getByKey($key); if ($tmp !== null) { $errors[] = TBGContext::getI18n()->__('Row %row%: A project with this name already exists', array('%row%' => $i + 1)); } // First off are booleans $boolitems = array($scrum, $allow_reporting, $autoassign, $freelance, $en_builds, $en_comps, $en_editions, $show_summary); foreach ($boolitems as $boolitem) { if ($boolitem !== null && trim($activerow[$boolitem], '"') != 0 && trim($activerow[$boolitem], '"') != 1) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be 1/0)', array('%col%' => $boolitem + 1, '%row%' => $i + 1)); } } // Now identifiables $identifiableitems = array(array($qa, $qa_type), array($lead, $lead_type), array($owner, $owner_type)); foreach ($identifiableitems as $identifiableitem) { if (($identifiableitem[0] === null || $identifiableitem[1] === null) && !($identifiableitem[0] === null && $identifiableitem[1] === null)) { $errors[] = TBGContext::getI18n()->__('Row %row%: Both the type and item ID must be supplied for owner/lead/qa fields', array('%row%' => $i + 1)); continue; } if ($identifiableitem[1] !== null && trim($activerow[$identifiableitem[1]], '"') != 1 && trim($activerow[$identifiableitem[1]], '"') != 2) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be 1 for a user or 2 for a team)', array('%col%' => $identifiableitem[1] + 1, '%row%' => $i + 1)); } if ($identifiableitem[0] !== null && !is_numeric(trim($activerow[$identifiableitem[0]], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } elseif ($identifiableitem[0] !== null && is_numeric(trim($activerow[$identifiableitem[0]], '"'))) { // check if they exist switch (trim($activerow[$identifiableitem[1]], '"')) { case 1: try { TBGContext::factory()->TBGUser(trim($activerow[$identifiableitem[0]], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: user does not exist', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } break; case 2: try { TBGContext::factory()->TBGTeam(trim($activerow[$identifiableitem[0]], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: team does not exist', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } break; } } } // Now check client exists if ($client !== null) { if (!is_numeric(trim($activerow[$client], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $client + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGClient(trim($activerow[$client], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: client does not exist', array('%col%' => $client + 1, '%row%' => $i + 1)); } } } // Now check if workflow exists if ($workflow_id !== null) { if (!is_numeric(trim($activerow[$workflow_id], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $workflow_id + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGWorkflowScheme(trim($activerow[$workflow_id], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: workflow scheme does not exist', array('%col%' => $workflow_id + 1, '%row%' => $i + 1)); } } } // Now check if issuetype scheme if ($issuetype_scheme !== null) { if (!is_numeric(trim($activerow[$issuetype_scheme], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $issuetype_scheme + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGIssuetypeScheme(trim($activerow[$issuetype_scheme], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: issuetype scheme does not exist', array('%col%' => $issuetype_scheme + 1, '%row%' => $i + 1)); } } } // Finally check if the summary type is valid. At this point, your error list has probably become so big it has eaten up all your available RAM... if ($summary_type !== null) { if (trim($activerow[$summary_type], '"') != 'issuetypes' && trim($activerow[$summary_type], '"') != 'milestones') { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be \'issuetypes\' or \'milestones\')', array('%col%' => $summary_type + 1, '%row%' => $i + 1)); } } } break; case 'issues': for ($i = 1; $i != count($data); $i++) { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); // Check if project exists try { $prjtmp = TBGContext::factory()->TBGProject($activerow[$project]); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: Project does not exist', array('%col%' => $project + 1, '%row%' => $i + 1)); break; } // First off are booleans $boolitems = array($state, $blocking); foreach ($boolitems as $boolitem) { if ($boolitem !== null && trim($activerow[$boolitem], '"') != 0 && trim($activerow[$boolitem], '"') != 1) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be 1/0)', array('%col%' => $boolitem + 1, '%row%' => $i + 1)); } } // Now numerics $numericitems = array($votes, $percentage); foreach ($numericitems as $numericitem) { if ($numericitem !== null && !is_numeric(trim($activerow[$numericitem], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $numericitem + 1, '%row%' => $i + 1)); } } // Percentage must be 0-100 if ($numericitem !== null && (trim($activerow[$percentage], '"') < 0 || trim($activerow[$percentage], '"') > 100)) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: Percentage must be from 0 to 100 inclusive', array('%col%' => $percentage + 1, '%row%' => $i + 1)); } // Now identifiables $identifiableitems = array(array($owner, $owner_type), array($assigned, $assigned_type)); foreach ($identifiableitems as $identifiableitem) { if (($identifiableitem[0] === null || $identifiableitem[1] === null) && !($identifiableitem[0] === null && $identifiableitem[1] === null)) { $errors[] = TBGContext::getI18n()->__('Row %row%: Both the type and item ID must be supplied for owner/lead/qa fields', array('%row%' => $i + 1)); continue; } if ($identifiableitem[1] !== null && trim($activerow[$identifiableitem[1]], '"') != 1 && trim($activerow[$identifiableitem[1]], '"') != 2) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be 1 for a user or 2 for a team)', array('%col%' => $identifiableitem[1] + 1, '%row%' => $i + 1)); } if ($identifiableitem[0] !== null && !is_numeric(trim($activerow[$identifiableitem[0]], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } elseif ($identifiableitem[0] !== null && is_numeric(trim($activerow[$identifiableitem[0]], '"'))) { // check if they exist switch (trim($activerow[$identifiableitem[1]], '"')) { case 1: try { TBGContext::factory()->TBGUser(trim($activerow[$identifiableitem[0]], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: user does not exist', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } break; case 2: try { TBGContext::factory()->TBGTeam(trim($activerow[$identifiableitem[0]], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: team does not exist', array('%col%' => $identifiableitem[0] + 1, '%row%' => $i + 1)); } break; } } } // Now check user exists for postedby if ($posted_by !== null) { if (!is_numeric(trim($activerow[$posted_by], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $posted_by + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGUser(trim($activerow[$posted_by], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: user does not exist', array('%col%' => $posted_by + 1, '%row%' => $i + 1)); } } } // Now check milestone exists and is valid if ($milestone !== null) { if (!is_numeric(trim($activerow[$milestone], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $milestone + 1, '%row%' => $i + 1)); } else { try { $milestonetmp = TBGContext::factory()->TBGMilestone(trim($activerow[$milestone], '" ')); if ($milestonetmp->getProject()->getID() != $activerow[$project]) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: milestone does not apply to the specified project', array('%col%' => $milestone + 1, '%row%' => $i + 1)); } } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: milestone does not exist', array('%col%' => $milestone + 1, '%row%' => $i + 1)); } } } // status if ($status !== null) { if (!is_numeric(trim($activerow[$status], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $status + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGStatus(trim($activerow[$status], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: status does not exist', array('%col%' => $status + 1, '%row%' => $i + 1)); } } } // resolution if ($resolution !== null) { if (!is_numeric(trim($activerow[$resolution], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $resolution + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGResolution(trim($activerow[$resolution], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: resolution does not exist', array('%col%' => $resolution + 1, '%row%' => $i + 1)); } } } // priority if ($priority !== null) { if (!is_numeric(trim($activerow[$priority], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $priority + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGPriority(trim($activerow[$priority], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: priority does not exist', array('%col%' => $priority + 1, '%row%' => $i + 1)); } } } // category if ($category !== null) { if (!is_numeric(trim($activerow[$category], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $category + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGCategory(trim($activerow[$category], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: category does not exist', array('%col%' => $category + 1, '%row%' => $i + 1)); } } } // severity if ($severity !== null) { if (!is_numeric(trim($activerow[$severity], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $severity + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGSeverity(trim($activerow[$severity], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: severity does not exist', array('%col%' => $severity + 1, '%row%' => $i + 1)); } } } // reproducability if ($reproducability !== null) { if (!is_numeric(trim($activerow[$reproducability], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $reproducability + 1, '%row%' => $i + 1)); } else { try { TBGContext::factory()->TBGReproducability(trim($activerow[$reproducability], '" ')); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: reproducability does not exist', array('%col%' => $reproducability + 1, '%row%' => $i + 1)); } } } // type if ($issue_type !== null) { if (!is_numeric(trim($activerow[$issue_type], '"'))) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: invalid value (must be a number)', array('%col%' => $issue_type + 1, '%row%' => $i + 1)); } else { try { $typetmp = TBGContext::factory()->TBGIssuetype(trim($activerow[$issue_type], '" ')); if (!$prjtmp->getIssuetypeScheme()->isSchemeAssociatedWithIssuetype($typetmp)) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: this project does not support issues of this type (%type%)', array('%type%' => $typetmp->getName(), '%col%' => $issue_type + 1, '%row%' => $i + 1)); } } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% column %col%: issue type does not exist', array('%col%' => $issue_type + 1, '%row%' => $i + 1)); } } } } break; } } // Handle errors if (count($errors) != 0) { $errordiv = '<ul>'; foreach ($errors as $error) { $errordiv .= '<li>' . $error . '</li>'; } $errordiv .= '</ul>'; $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('failed' => true, 'errordetail' => $errordiv, 'error' => TBGContext::getI18n()->__('Errors occured while importing, see the error list in the import screen for further details'))); } } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('failed' => true, 'errordetail' => $e->getMessage(), 'error' => $e->getMessage())); } if ($request->getParameter('csv_dry_run')) { return $this->renderJSON(array('failed' => false, 'message' => TBGContext::getI18n()->__('Dry-run successful, you can now uncheck the dry-run box and import your data.'))); } else { switch ($request->getParameter('type')) { case 'clients': for ($i = 1; $i != count($data); $i++) { try { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); $client = new TBGClient(); $client->setName(trim($activerow[$namecol], '" ')); if ($emailcol !== null) { $client->setEmail(trim($activerow[$emailcol], '" ')); } if ($websitecol !== null) { $client->setWebsite(trim($activerow[$websitecol], '" ')); } if ($faxcol !== null) { $client->setFax(trim($activerow[$faxcol], '" ')); } if ($telephonecol !== null) { $client->setTelephone(trim($activerow[$telephonecol], '" ')); } $client->save(); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% failed: %err%', array('%row%' => $i + 1, '%err%' => $e->getMessage())); } } break; case 'projects': for ($i = 1; $i != count($data); $i++) { try { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); $project = new TBGProject(); $project->setName(trim($activerow[$namecol], '" ')); if ($prefix !== null) { $project->setPrefix(trim($activerow[$prefix], '" ')); $project->setUsePrefix(true); } if ($scrum !== null) { if (trim($activerow[$websitecol], '"') == '1') { $project->setUseScrum(true); } } if ($owner !== null && $owner_type !== null) { switch (trim($activerow[$owner_type], '"')) { case TBGIdentifiableClass::TYPE_USER: $user = new TBGUser(trim($activerow[$owner], '" ')); $project->setOwner($user); break; case TBGIdentifiableClass::TYPE_TEAM: $team = new TBGTeam(trim($activerow[$owner], '" ')); $project->setOwner($team); break; } } if ($lead !== null && $lead_type !== null) { switch (trim($activerow[$lead_type], '"')) { case TBGIdentifiableClass::TYPE_USER: $user = new TBGUser(trim($activerow[$lead], '" ')); $project->setLeader($user); break; case TBGIdentifiableClass::TYPE_TEAM: $team = new TBGTeam(trim($activerow[$lead], '" ')); $project->setLeader($team); break; } } if ($qa !== null && $qa_type !== null) { switch (trim($activerow[$qa_type], '"')) { case TBGIdentifiableClass::TYPE_USER: $user = new TBGUser(trim($activerow[$qa], '" ')); $project->setQaResponsible($user); break; case TBGIdentifiableClass::TYPE_TEAM: $team = new TBGTeam(trim($activerow[$qa], '" ')); $project->setQaResponsible($team); break; } } if ($descr !== null) { $project->setDescription(trim($activerow[$descr], '" ')); } if ($doc_url !== null) { $project->setDocumentationUrl(trim($activerow[$doc_url], '" ')); } if ($freelance !== null) { if (trim($activerow[$freelance], '"') == '1') { $project->setChangeIssuesWithoutWorkingOnThem(true); } } if ($en_builds !== null) { if (trim($activerow[$en_builds], '"') == '1') { $project->setBuildsEnabled(true); } } if ($en_comps !== null) { if (trim($activerow[$en_comps], '"') == '1') { $project->setComponentsEnabled(true); } } if ($en_editions !== null) { if (trim($activerow[$en_editions], '"') == '1') { $project->setEditionsEnabled(true); } } if ($workflow_id !== null) { $workflow = TBGContext::factory()->TBGWorkflowScheme(trim($activerow[$workflow_id], '" ')); $project->setWorkflowScheme($workflow); } if ($client !== null) { $client_object = TBGContext::factory()->TBGWorkflowScheme(trim($activerow[$client], '" ')); $project->setClient($client_object); } if ($show_summary !== null) { if (trim($activerow[$show_summary], '"') == '1') { $project->setFrontpageSummaryVisibility(true); } } if ($summary_type !== null) { $project->setFrontpageSummaryType(trim($activerow[$summary_type], '" ')); } if ($issuetype_scheme !== null) { $project->setIssuetypeScheme(TBGContext::factory()->TBGIssuetypeScheme(trim($activerow[$issuetype_scheme], '"'))); } if ($allow_reporting !== null) { $project->setLocked(trim($activerow[$allow_reporting], '" ')); } if ($autoassign !== null) { $project->setAutoassign(trim($activerow[$autoassign], '" ')); } $project->save(); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% failed: %err%', array('%row%' => $i + 1, '%err%' => $e->getMessage())); } } break; case 'issues': for ($i = 1; $i != count($data); $i++) { try { $activerow = $data[$i]; $activerow = html_entity_decode($activerow, ENT_QUOTES); $activerow = explode(',', $activerow); $issue = new TBGIssue(); $issue->setTitle(trim($activerow[$title], '" ')); $issue->setProject(trim($activerow[$project], '" ')); $issue->setIssuetype(trim($activerow[$issue_type], '" ')); if ($issue_type !== null) { $issue->setIssuetype(trim($activerow[$issue_type], '" ')); } if ($descr !== null) { $issue->setDescription(trim($activerow[$descr], '" ')); } if ($repro !== null) { $issue->setReproduction(trim($activerow[$repro], '" ')); } if ($state !== null) { $issue->setState(trim($activerow[$state], '" ')); } if ($status !== null) { $issue->setStatus(trim($activerow[$status], '" ')); } if ($posted_by !== null) { $issue->setPostedBy(TBGContext::factory()->TBGUser(trim($activerow[$posted_by], '"'))); } if ($owner !== null && $owner_type !== null) { switch (trim($activerow[$owner_type], '"')) { case TBGIdentifiableClass::TYPE_USER: $user = new TBGUser(trim($activerow[$owner], '" ')); $issue->setOwner($user); break; case TBGIdentifiableClass::TYPE_TEAM: $team = new TBGTeam(trim($activerow[$owner], '" ')); $issue->setOwner($team); break; } } if ($assigned !== null && $assigned_type !== null) { switch (trim($activerow[$assigned_type], '"')) { case TBGIdentifiableClass::TYPE_USER: $user = new TBGUser(trim($activerow[$assigned], '" ')); $issue->setAssignee($user); break; case TBGIdentifiableClass::TYPE_TEAM: $team = new TBGTeam(trim($activerow[$assigned], '" ')); $issue->setAssignee($team); break; } } if ($resolution !== null) { $issue->setResolution(trim($activerow[$resolution], '" ')); } if ($priority !== null) { $issue->setPriority(trim($activerow[$priority], '" ')); } if ($category !== null) { $issue->setCategory(trim($activerow[$category], '" ')); } if ($blocking !== null) { $issue->setBlocking(trim($activerow[$blocking], '" ')); } if ($severity !== null) { $issue->setSeverity(trim($activerow[$severity], '" ')); } if ($reproducability !== null) { $issue->setReproducability(trim($activerow[$reproducability], '" ')); } if ($votes !== null) { $issue->setVotes(trim($activerow[$votes], '" ')); } if ($percentage !== null) { $issue->setPercentage(trim($activerow[$percentage], '" ')); } if ($milestone !== null) { $issue->setMilestone(trim($activerow[$milestone], '" ')); } $issue->save(); } catch (Exception $e) { $errors[] = TBGContext::getI18n()->__('Row %row% failed: %err%', array('%row%' => $i + 1, '%err%' => $e->getMessage())); } } break; } // Handle errors if (count($errors) != 0) { $errordiv = '<ul>'; foreach ($errors as $error) { $errordiv .= '<li>' . $error . '</li>'; } $errordiv .= '</ul>'; $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('failed' => true, 'errordetail' => $errordiv, 'error' => TBGContext::getI18n()->__('Errors occured while importing, see the error list in the import screen for further details'))); } else { return $this->renderJSON(array('failed' => false, 'message' => TBGContext::getI18n()->__('Successfully imported %num% rows!', array('%num%' => count($data) - 1)))); } } }
?> class="selected"<?php } ?> > <div> <?php echo link_tag('javascript:void(0)', image_tag('tab_clients.png') . __('Clients'), array('class' => 'not_clickable')); ?> <?php echo javascript_link_tag(image_tag('tabmenu_dropdown.png', array('class' => 'menu_dropdown')), array('onmouseover' => "")); ?> </div> <div id="client_menu" class="tab_menu_dropdown shadowed"> <?php foreach (TBGClient::getAll() as $client) { ?> <?php if (!$client->hasAccess()) { continue; } ?> <?php echo link_tag(make_url('client_dashboard', array('client_id' => $client->getID())), image_tag('tab_clients.png') . $client->getName()); ?> <?php } ?> </div> </li> <?php
public function getPredefinedBreadcrumbLinks($type, $project = null) { $i18n = TBGContext::getI18n(); $links = array(); switch ($type) { case 'main_links': $links[] = array('url' => TBGContext::getRouting()->generate('home'), 'title' => $i18n->__('Frontpage')); $links[] = array('url' => TBGContext::getRouting()->generate('dashboard'), 'title' => $i18n->__('Personal dashboard')); $links[] = array('title' => $i18n->__('Issues')); $links[] = array('title' => $i18n->__('Teams')); $links[] = array('title' => $i18n->__('Clients')); $links = TBGEvent::createNew('core', 'breadcrumb_main_links', null, array(), $links)->trigger()->getReturnList(); if (TBGContext::getUser()->canAccessConfigurationPage()) { $links[] = array('url' => make_url('configure'), 'title' => $i18n->__('Configure The Bug Genie')); } $links[] = array('url' => TBGContext::getRouting()->generate('about'), 'title' => $i18n->__('About %sitename%', array('%sitename%' => TBGSettings::getTBGname()))); $links[] = array('url' => TBGContext::getRouting()->generate('account'), 'title' => $i18n->__('Account details')); break; case 'project_summary': $links[] = array('url' => TBGContext::getRouting()->generate('project_dashboard', array('project_key' => $project->getKey())), 'title' => $i18n->__('Dashboard')); $links[] = array('url' => TBGContext::getRouting()->generate('project_scrum', array('project_key' => $project->getKey())), 'title' => $i18n->__('Sprint planning')); $links[] = array('url' => TBGContext::getRouting()->generate('project_roadmap', array('project_key' => $project->getKey())), 'title' => $i18n->__('Roadmap')); $links[] = array('url' => TBGContext::getRouting()->generate('project_team', array('project_key' => $project->getKey())), 'title' => $i18n->__('Team overview')); $links[] = array('url' => TBGContext::getRouting()->generate('project_statistics', array('project_key' => $project->getKey())), 'title' => $i18n->__('Statistics')); $links[] = array('url' => TBGContext::getRouting()->generate('project_timeline', array('project_key' => $project->getKey())), 'title' => $i18n->__('Timeline')); $links[] = array('url' => TBGContext::getRouting()->generate('project_reportissue', array('project_key' => $project->getKey())), 'title' => $i18n->__('Report an issue')); $links[] = array('url' => TBGContext::getRouting()->generate('project_issues', array('project_key' => $project->getKey())), 'title' => $i18n->__('Issues')); $links = TBGEvent::createNew('core', 'breadcrumb_project_links', null, array(), $links)->trigger()->getReturnList(); break; case 'client_list': foreach (TBGClient::getAll() as $client) { if ($client->hasAccess()) { $links[] = array('url' => TBGContext::getRouting()->generate('client_dashboard', array('client_id' => $client->getID())), 'title' => $client->getName()); } } break; case 'team_list': foreach (TBGTeam::getAll() as $team) { if ($team->hasAccess()) { $links[] = array('url' => TBGContext::getRouting()->generate('team_dashboard', array('team_id' => $team->getID())), 'title' => $team->getName()); } } break; } return $links; }
<label for="client_<?php echo $user->getID(); ?> _<?php echo $client->getID(); ?> " style="font-weight: normal;"><?php echo $client->getName(); ?> </label> </div> <?php } ?> <?php if (count(TBGClient::getAll()) == 0) { ?> <?php echo __('No clients exist'); ?> <?php } ?> </td> </tr> <tr> <td colspan="4" style="text-align: right; font-size: 13px; padding-top: 10px;"> <div style="padding: 10px 0 10px 0; display: none;" id="edit_user_<?php echo $user->getID(); ?> _indicator"><span style="float: left;"><?php
public function runDoImportCSV(TBGRequest $request) { try { if ($request['csv_data'] == '') { throw new Exception($this->getI18n()->__('No data supplied to import')); } $csv = str_replace("\r\n", "\n", $request['csv_data']); $csv = html_entity_decode($csv); $headerrow = null; $data = array(); $errors = array(); // Parse CSV $handle = fopen("php://memory", 'r+'); fputs($handle, $csv); rewind($handle); $i = 0; while (($row = fgetcsv($handle, 1000)) !== false) { if (!$headerrow) { $headerrow = $row; } else { if (count($headerrow) == count($row)) { $data[] = array_combine($headerrow, $row); } else { $errors[] = $this->getI18n()->__('Row %row does not have the same number of elements as the header row', array('%row' => $i)); } } $i++; } fclose($handle); if (empty($data)) { throw new Exception($this->getI18n()->__('Insufficient data to import')); } // Verify required columns are present based on type $requiredcols = array(self::CSV_TYPE_CLIENTS => array(self::CSV_CLIENT_NAME), self::CSV_TYPE_PROJECTS => array(self::CSV_PROJECT_NAME), self::CSV_TYPE_ISSUES => array(self::CSV_ISSUE_TITLE, self::CSV_ISSUE_PROJECT, self::CSV_ISSUE_ISSUE_TYPE)); if (!isset($requiredcols[$request['type']])) { throw new Exception('Sorry, this type is unimplemented'); } foreach ($requiredcols[$request['type']] as $col) { if (!in_array($col, $headerrow)) { $errors[] = $this->getI18n()->__('Required column \'%col\' not found in header row', array('%col' => $col)); } } // Check if rows are long enough and fields are not empty for ($i = 0; $i != count($data); $i++) { $activerow = $data[$i]; // Check if fields are empty foreach ($activerow as $col => $val) { if (strlen($val) == 0) { $errors[] = $this->getI18n()->__('Row %row column %col has no value', array('%col' => $col, '%row' => $i + 1)); } } } if (count($errors) == 0) { // Check if fields are valid switch ($request['type']) { case self::CSV_TYPE_PROJECTS: for ($i = 0; $i != count($data); $i++) { $activerow = $data[$i]; // Check if project exists $key = str_replace(' ', '', $activerow[self::CSV_PROJECT_NAME]); $key = mb_strtolower($key); $tmp = TBGProject::getByKey($key); if ($tmp !== null) { $errors[] = $this->getI18n()->__('Row %row: A project with this name already exists', array('%row' => $i + 1)); } // First off are booleans $boolitems = array(self::CSV_PROJECT_SCRUM, self::CSV_PROJECT_ALLOW_REPORTING, self::CSV_PROJECT_AUTOASSIGN, self::CSV_PROJECT_FREELANCE, self::CSV_PROJECT_EN_BUILDS, self::CSV_PROJECT_EN_COMPS, self::CSV_PROJECT_EN_EDITIONS, self::CSV_PROJECT_SHOW_SUMMARY); foreach ($boolitems as $boolitem) { if (array_key_exists($boolitem, $activerow) && isset($activerow[$boolitem]) && $activerow[$boolitem] != 1 && $activerow[$boolitem] != 0) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be 1/0)', array('%col' => $boolitem, '%row' => $i + 1)); } } // Now identifiables $identifiableitems = array(array(self::CSV_PROJECT_QA, self::CSV_PROJECT_QA_TYPE), array(self::CSV_PROJECT_LEAD, self::CSV_PROJECT_LEAD_TYPE), array(self::CSV_PROJECT_OWNER, self::CSV_PROJECT_OWNER_TYPE)); foreach ($identifiableitems as $identifiableitem) { if (!array_key_exists($identifiableitem[1], $activerow) && array_key_exists($identifiableitem[0], $activerow) || array_key_exists($identifiableitem[1], $activerow) && !array_key_exists($identifiableitem[0], $activerow)) { $errors[] = $this->getI18n()->__('Row %row: Both the type and item ID must be supplied for owner/lead/qa fields', array('%row' => $i + 1)); continue; } if (array_key_exists($identifiableitem[1], $activerow) && isset($activerow[$identifiableitem[1]]) !== null && $activerow[$identifiableitem[1]] != self::CSV_IDENTIFIER_TYPE_USER && $activerow[$identifiableitem[1]] != self::CSV_IDENTIFIER_TYPE_TEAM) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be 1 for a user or 2 for a team)', array('%col' => $identifiableitem[1], '%row' => $i + 1)); } if (array_key_exists($identifiableitem[0], $activerow) && isset($activerow[$identifiableitem[0]]) && !is_numeric($activerow[$identifiableitem[0]])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } elseif (array_key_exists($identifiableitem[0], $activerow) && isset($activerow[$identifiableitem[0]]) && is_numeric($activerow[$identifiableitem[0]])) { // check if they exist switch ($activerow[$identifiableitem[1]]) { case self::CSV_IDENTIFIER_TYPE_USER: try { TBGContext::factory()->TBGUser($activerow[$identifiableitem[0]]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: user does not exist', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } break; case self::CSV_IDENTIFIER_TYPE_TEAM: try { TBGContext::factory()->TBGTeam($activerow[$identifiableitem[0]]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: team does not exist', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } break; } } } // Now check client exists if (array_key_exists(self::CSV_PROJECT_CLIENT, $activerow) && isset($activerow[self::CSV_PROJECT_CLIENT])) { if (!is_numeric($activerow[self::CSV_PROJECT_CLIENT])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_PROJECT_CLIENT, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGClient($activerow[self::CSV_PROJECT_CLIENT]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: client does not exist', array('%col' => self::CSV_PROJECT_CLIENT, '%row' => $i + 1)); } } } // Now check if workflow exists if (array_key_exists(self::CSV_PROJECT_WORKFLOW_ID, $activerow) && isset($activerow[self::CSV_PROJECT_WORKFLOW_ID])) { if (!is_numeric($activerow[self::CSV_PROJECT_WORKFLOW_ID])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_PROJECT_WORKFLOW_ID, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGWorkflowScheme($activerow[self::CSV_PROJECT_WORKFLOW_ID]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: workflow scheme does not exist', array('%col' => self::CSV_PROJECT_WORKFLOW_ID, '%row' => $i + 1)); } } } // Now check if issuetype scheme if (array_key_exists(self::CSV_PROJECT_ISSUETYPE_SCHEME, $activerow) && isset($activerow[self::CSV_PROJECT_ISSUETYPE_SCHEME])) { if (!is_numeric($activerow[self::CSV_PROJECT_ISSUETYPE_SCHEME])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_PROJECT_ISSUETYPE_SCHEME, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGIssuetypeScheme($activerow[self::CSV_PROJECT_ISSUETYPE_SCHEME]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: issuetype scheme does not exist', array('%col' => self::CSV_PROJECT_ISSUETYPE_SCHEME, '%row' => $i + 1)); } } } // Finally check if the summary type is valid. At this point, your error list has probably become so big it has eaten up all your available RAM... if (array_key_exists(self::CSV_PROJECT_SUMMARY_TYPE, $activerow) && isset($activerow[self::CSV_PROJECT_SUMMARY_TYPE])) { if ($activerow[self::CSV_PROJECT_SUMMARY_TYPE] != 'issuetypes' && $activerow[self::CSV_PROJECT_SHOW_SUMMARY] != 'milestones') { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be \'issuetypes\' or \'milestones\')', array('%col' => self::CSV_PROJECT_SUMMARY_TYPE, '%row' => $i + 1)); } } } break; case self::CSV_TYPE_ISSUES: for ($i = 0; $i != count($data); $i++) { $activerow = $data[$i]; // Check if project exists try { $prjtmp = TBGContext::factory()->TBGProject($activerow[self::CSV_ISSUE_PROJECT]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: Project does not exist', array('%col' => self::CSV_ISSUE_PROJECT, '%row' => $i + 1)); break; } // First off are booleans $boolitems = array(self::CSV_ISSUE_STATE, self::CSV_ISSUE_BLOCKING); foreach ($boolitems as $boolitem) { if (array_key_exists($boolitem, $activerow) && isset($activerow[$boolitem]) && $activerow[$boolitem] != 1 && $activerow[$boolitem] != 0) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be 1/0)', array('%col' => $boolitem, '%row' => $i + 1)); } } // Now numerics $numericitems = array(self::CSV_ISSUE_VOTES, self::CSV_ISSUE_PERCENTAGE, self::CSV_ISSUE_ISSUENO); foreach ($numericitems as $numericitem) { if (array_key_exists($numericitem, $activerow) && isset($activerow[$numericitem]) && !is_numeric($activerow[$numericitem])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => $numericitem, '%row' => $i + 1)); } } // Percentage must be 0-100 if (array_key_exists(self::CSV_ISSUE_PERCENTAGE, $activerow) && isset($activerow[self::CSV_ISSUE_PERCENTAGE]) && ($activerow[self::CSV_ISSUE_PERCENTAGE] < 0 || $activerow[self::CSV_ISSUE_PERCENTAGE] > 100)) { $errors[] = $this->getI18n()->__('Row %row column %col: Percentage must be from 0 to 100 inclusive', array('%col' => self::CSV_ISSUE_PERCENTAGE, '%row' => $i + 1)); } // Now identifiables $identifiableitems = array(array(self::CSV_ISSUE_OWNER, self::CSV_ISSUE_OWNER_TYPE), array(self::CSV_ISSUE_ASSIGNED, self::CSV_ISSUE_ASSIGNED_TYPE)); foreach ($identifiableitems as $identifiableitem) { if (!array_key_exists($identifiableitem[1], $activerow) && array_key_exists($identifiableitem[0], $activerow) || array_key_exists($identifiableitem[1], $activerow) && !array_key_exists($identifiableitem[0], $activerow)) { $errors[] = $this->getI18n()->__('Row %row: Both the type and item ID must be supplied for owner/lead/qa fields', array('%row' => $i + 1)); continue; } if (array_key_exists($identifiableitem[1], $activerow) && isset($activerow[$identifiableitem[1]]) && $activerow[$identifiableitem[1]] != self::CSV_IDENTIFIER_TYPE_USER && $activerow[$identifiableitem[1]] != self::CSV_IDENTIFIER_TYPE_TEAM) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be 1 for a user or 2 for a team)', array('%col' => $identifiableitem[1], '%row' => $i + 1)); } if (array_key_exists($identifiableitem[0], $activerow) && isset($activerow[$identifiableitem[0]]) && !is_numeric($activerow[$identifiableitem[0]])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } elseif (array_key_exists($identifiableitem[0], $activerow) && isset($activerow[$identifiableitem[0]]) && is_numeric($activerow[$identifiableitem[0]])) { // check if they exist switch ($activerow[$identifiableitem[1]]) { case self::CSV_IDENTIFIER_TYPE_USER: try { TBGContext::factory()->TBGUser($activerow[$identifiableitem[0]]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: user does not exist', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } break; case self::CSV_IDENTIFIER_TYPE_TEAM: try { TBGContext::factory()->TBGTeam($activerow[$identifiableitem[0]]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: team does not exist', array('%col' => $identifiableitem[0], '%row' => $i + 1)); } break; } } } // Now timestamps if (array_key_exists(self::CSV_ISSUE_POSTED, $activerow) && isset($activerow[self::CSV_ISSUE_POSTED]) && (string) (int) $activerow[self::CSV_ISSUE_POSTED] !== $activerow[self::CSV_ISSUE_POSTED] && $activerow[self::CSV_ISSUE_POSTED] >= PHP_INT_MAX && $activerow[self::CSV_ISSUE_POSTED] <= ~PHP_INT_MAX) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a Unix timestamp)', array('%col' => self::CSV_ISSUE_POSTED, '%row' => $i + 1)); } // Now check user exists for postedby if (array_key_exists(self::CSV_ISSUE_POSTED_BY, $activerow) && isset($activerow[self::CSV_ISSUE_POSTED_BY])) { if (!is_numeric($activerow[self::CSV_ISSUE_POSTED_BY])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_POSTED_BY, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGUser($activerow[self::CSV_ISSUE_POSTED_BY]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: user does not exist', array('%col' => self::CSV_ISSUE_POSTED_BY, '%row' => $i + 1)); } } } // Now check milestone exists and is valid if (array_key_exists(self::CSV_ISSUE_MILESTONE, $activerow) && isset($activerow[self::CSV_ISSUE_MILESTONE])) { if (!is_numeric($activerow[self::CSV_ISSUE_MILESTONE])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_MILESTONE, '%row' => $i + 1)); } else { try { $milestonetmp = TBGContext::factory()->TBGMilestone($activerow[self::CSV_ISSUE_MILESTONE]); if ($milestonetmp->getProject()->getID() != $activerow[self::CSV_ISSUE_PROJECT]) { $errors[] = $this->getI18n()->__('Row %row column %col: milestone does not apply to the specified project', array('%col' => self::CSV_ISSUE_MILESTONE, '%row' => $i + 1)); } } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: milestone does not exist', array('%col' => self::CSV_ISSUE_MILESTONE, '%row' => $i + 1)); } } } // status if (array_key_exists(self::CSV_ISSUE_STATUS, $activerow) && isset($activerow[self::CSV_ISSUE_STATUS])) { if (!is_numeric($activerow[self::CSV_ISSUE_STATUS])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_STATUS, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGStatus($activerow[self::CSV_ISSUE_STATUS]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: status does not exist', array('%col' => self::CSV_ISSUE_STATUS, '%row' => $i + 1)); } } } // resolution if (array_key_exists(self::CSV_ISSUE_RESOLUTION, $activerow) && isset($activerow[self::CSV_ISSUE_RESOLUTION])) { if (!is_numeric($activerow[self::CSV_ISSUE_RESOLUTION])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_RESOLUTION, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGResolution($activerow[self::CSV_ISSUE_RESOLUTION]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: resolution does not exist', array('%col' => self::CSV_ISSUE_RESOLUTION, '%row' => $i + 1)); } } } // priority if (array_key_exists(self::CSV_ISSUE_PRIORITY, $activerow) && isset($activerow[self::CSV_ISSUE_PRIORITY])) { if (!is_numeric($activerow[self::CSV_ISSUE_PRIORITY])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_PRIORITY, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGPriority($activerow[self::CSV_ISSUE_PRIORITY]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: priority does not exist', array('%col' => self::CSV_ISSUE_PRIORITY, '%row' => $i + 1)); } } } // category if (array_key_exists(self::CSV_ISSUE_CATEGORY, $activerow) && isset($activerow[self::CSV_ISSUE_CATEGORY])) { if (!is_numeric($activerow[self::CSV_ISSUE_CATEGORY])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_CATEGORY, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGCategory($activerow[self::CSV_ISSUE_CATEGORY]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: category does not exist', array('%col' => self::CSV_ISSUE_CATEGORY, '%row' => $i + 1)); } } } // severity if (array_key_exists(self::CSV_ISSUE_SEVERITY, $activerow) && isset($activerow[self::CSV_ISSUE_SEVERITY])) { if (!is_numeric($activerow[self::CSV_ISSUE_SEVERITY])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_SEVERITY, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGSeverity($activerow[self::CSV_ISSUE_SEVERITY]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: severity does not exist', array('%col' => self::CSV_ISSUE_SEVERITY, '%row' => $i + 1)); } } } // reproducability if (array_key_exists(self::CSV_ISSUE_REPRODUCIBILITY, $activerow) && isset($activerow[self::CSV_ISSUE_REPRODUCIBILITY])) { if (!is_numeric($activerow[self::CSV_ISSUE_REPRODUCIBILITY])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_REPRODUCIBILITY, '%row' => $i + 1)); } else { try { TBGContext::factory()->TBGReproducability($activerow[self::CSV_ISSUE_REPRODUCIBILITY]); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: reproducability does not exist', array('%col' => self::CSV_ISSUE_REPRODUCIBILITY, '%row' => $i + 1)); } } } // type if (array_key_exists(self::CSV_ISSUE_ISSUE_TYPE, $activerow) && isset($activerow[self::CSV_ISSUE_ISSUE_TYPE])) { if (!is_numeric($activerow[self::CSV_ISSUE_ISSUE_TYPE])) { $errors[] = $this->getI18n()->__('Row %row column %col: invalid value (must be a number)', array('%col' => self::CSV_ISSUE_ISSUE_TYPE, '%row' => $i + 1)); } else { try { $typetmp = TBGContext::factory()->TBGIssuetype($activerow[self::CSV_ISSUE_ISSUE_TYPE]); if (!$prjtmp->getIssuetypeScheme()->isSchemeAssociatedWithIssuetype($typetmp)) { $errors[] = $this->getI18n()->__('Row %row column %col: this project does not support issues of this type (%type)', array('%type' => $typetmp->getName(), '%col' => self::CSV_ISSUE_ISSUE_TYPE, '%row' => $i + 1)); } } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row column %col: issue type does not exist', array('%col' => self::CSV_ISSUE_ISSUE_TYPE, '%row' => $i + 1)); } } } } break; } } // Handle errors if (count($errors) != 0) { $errordiv = '<ul>'; foreach ($errors as $error) { $errordiv .= '<li>' . $error . '</li>'; } $errordiv .= '</ul>'; $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('errordetail' => $errordiv, 'error' => $this->getI18n()->__('Errors occured while importing, see the error list in the import screen for further details'))); } } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('errordetail' => $e->getMessage(), 'error' => $e->getMessage())); } if ($request['csv_dry_run']) { return $this->renderJSON(array('message' => $this->getI18n()->__('Dry-run successful, you can now uncheck the dry-run box and import your data.'))); } else { switch ($request['type']) { case self::CSV_TYPE_CLIENTS: for ($i = 0; $i != count($data); $i++) { try { $activerow = $data[$i]; $client = new TBGClient(); $client->setName($activerow[self::CSV_CLIENT_NAME]); if (isset($activerow[self::CSV_CLIENT_EMAIL])) { $client->setEmail($activerow[self::CSV_CLIENT_EMAIL]); } if (isset($activerow[self::CSV_CLIENT_WEBSITE])) { $client->setWebsite($activerow[self::CSV_CLIENT_WEBSITE]); } if (isset($activerow[self::CSV_CLIENT_FAX])) { $client->setFax($activerow[self::CSV_CLIENT_FAX]); } if (isset($activerow[self::CSV_CLIENT_TELEPHONE])) { $client->setTelephone($activerow[self::CSV_CLIENT_TELEPHONE]); } $client->save(); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row failed: %err', array('%row' => $i + 1, '%err' => $e->getMessage())); } } break; case self::CSV_TYPE_PROJECTS: for ($i = 0; $i != count($data); $i++) { try { $activerow = $data[$i]; $project = new TBGProject(); $project->setName($activerow[self::CSV_PROJECT_NAME]); $project->save(); if (isset($activerow[self::CSV_PROJECT_PREFIX])) { $project->setPrefix($activerow[self::CSV_PROJECT_PREFIX]); $project->setUsePrefix(true); } if (isset($activerow[self::CSV_PROJECT_SCRUM])) { if ($activerow[self::CSV_PROJECT_SCRUM] == '1') { $project->setUsesScrum(true); } } if (isset($activerow[self::CSV_PROJECT_OWNER]) && isset($activerow[self::CSV_PROJECT_OWNER_TYPE])) { switch ($activerow[self::CSV_PROJECT_OWNER_TYPE]) { case self::CSV_IDENTIFIER_TYPE_USER: $user = new TBGUser($activerow[self::CSV_PROJECT_OWNER]); $project->setOwner($user); break; case self::CSV_IDENTIFIER_TYPE_TEAM: $team = new TBGTeam($activerow[self::CSV_PROJECT_OWNER]); $project->setOwner($team); break; } } if (isset($activerow[self::CSV_PROJECT_LEAD]) && isset($activerow[self::CSV_PROJECT_LEAD_TYPE])) { switch ($activerow[self::CSV_PROJECT_LEAD_TYPE]) { case self::CSV_IDENTIFIER_TYPE_USER: $user = new TBGUser($activerow[self::CSV_PROJECT_LEAD]); $project->setLeader($user); break; case self::CSV_IDENTIFIER_TYPE_TEAM: $team = new TBGTeam($activerow[self::CSV_PROJECT_LEAD]); $project->setLeader($team); break; } } if (isset($activerow[self::CSV_PROJECT_QA]) && isset($activerow[self::CSV_PROJECT_QA_TYPE])) { switch ($activerow[self::CSV_PROJECT_QA_TYPE]) { case self::CSV_IDENTIFIER_TYPE_USER: $user = new TBGUser($activerow[self::CSV_PROJECT_QA]); $project->setQaResponsible($user); break; case self::CSV_IDENTIFIER_TYPE_TEAM: $team = new TBGTeam($activerow[self::CSV_PROJECT_QA]); $project->setQaResponsible($team); break; } } if (isset($activerow[self::CSV_PROJECT_DESCR])) { $project->setDescription($activerow[self::CSV_PROJECT_DESCR]); } if (isset($activerow[self::CSV_PROJECT_DOC_URL])) { $project->setDocumentationUrl($activerow[self::CSV_PROJECT_DOC_URL]); } if (isset($activerow[self::CSV_PROJECT_WIKI_URL])) { $project->setWikiUrl($activerow[self::CSV_PROJECT_WIKI_URL]); } if (isset($activerow[self::CSV_PROJECT_FREELANCE])) { if ($activerow[self::CSV_PROJECT_FREELANCE] == '1') { $project->setChangeIssuesWithoutWorkingOnThem(true); } } if (isset($activerow[self::CSV_PROJECT_EN_BUILDS])) { if ($activerow[self::CSV_PROJECT_EN_BUILDS] == '1') { $project->setBuildsEnabled(true); } } if (isset($activerow[self::CSV_PROJECT_EN_COMPS])) { if ($activerow[self::CSV_PROJECT_EN_COMPS] == '1') { $project->setComponentsEnabled(true); } } if (isset($activerow[self::CSV_PROJECT_EN_EDITIONS])) { if ($activerow[self::CSV_PROJECT_EN_EDITIONS] == '1') { $project->setEditionsEnabled(true); } } if (isset($activerow[self::CSV_PROJECT_CLIENT])) { $project->setClient(TBGContext::factory()->TBGClient($activerow[self::CSV_PROJECT_CLIENT])); } if (isset($activerow[self::CSV_PROJECT_SHOW_SUMMARY])) { if ($activerow[self::CSV_PROJECT_SHOW_SUMMARY] == '1') { $project->setFrontpageSummaryVisibility(true); } } if (isset($activerow[self::CSV_PROJECT_SUMMARY_TYPE])) { $project->setFrontpageSummaryType($activerow[self::CSV_PROJECT_SUMMARY_TYPE]); } if (isset($activerow[self::CSV_PROJECT_ALLOW_REPORTING])) { $project->setLocked($activerow[self::CSV_PROJECT_ALLOW_REPORTING]); } if (isset($activerow[self::CSV_PROJECT_AUTOASSIGN])) { $project->setAutoassign($activerow[self::CSV_PROJECT_AUTOASSIGN]); } if (isset($activerow[self::CSV_PROJECT_ISSUETYPE_SCHEME])) { $project->setIssuetypeScheme(TBGContext::factory()->TBGIssuetypeScheme($activerow[self::CSV_PROJECT_ISSUETYPE_SCHEME])); } if (isset($activerow[self::CSV_PROJECT_WORKFLOW_ID])) { } $project->setWorkflowScheme(TBGContext::factory()->TBGWorkflowScheme($activerow[self::CSV_PROJECT_WORKFLOW_ID])); $project->save(); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row failed: %err', array('%row' => $i + 1, '%err' => $e->getMessage())); } } break; case self::CSV_TYPE_ISSUES: for ($i = 0; $i != count($data); $i++) { try { $activerow = $data[$i]; $issue = new TBGIssue(); $issue->setTitle($activerow[self::CSV_ISSUE_TITLE]); $issue->setProject($activerow[self::CSV_ISSUE_PROJECT]); $issue->setIssuetype($activerow[self::CSV_ISSUE_ISSUE_TYPE]); $issue->save(); if (isset($activerow[self::CSV_ISSUE_DESCR])) { $issue->setDescription($activerow[self::CSV_ISSUE_DESCR]); } if (isset($activerow[self::CSV_ISSUE_REPRO])) { $issue->setReproductionSteps($activerow[self::CSV_ISSUE_REPRO]); } if (isset($activerow[self::CSV_ISSUE_STATE])) { $issue->setState($activerow[self::CSV_ISSUE_STATE]); } if (isset($activerow[self::CSV_ISSUE_STATUS])) { $issue->setStatus($activerow[self::CSV_ISSUE_STATUS]); } if (isset($activerow[self::CSV_ISSUE_POSTED_BY])) { $issue->setPostedBy(TBGContext::factory()->TBGUser($activerow[self::CSV_ISSUE_POSTED_BY])); } if (isset($activerow[self::CSV_ISSUE_OWNER]) && isset($activerow[self::CSV_ISSUE_OWNER_TYPE])) { switch ($activerow[self::CSV_ISSUE_OWNER_TYPE]) { case self::CSV_IDENTIFIER_TYPE_USER: $user = new TBGUser($activerow[self::CSV_ISSUE_OWNER]); $issue->setOwner($user); break; case self::CSV_IDENTIFIER_TYPE_TEAM: $team = new TBGTeam($activerow[self::CSV_ISSUE_OWNER]); $issue->setOwner($team); break; } } if (isset($activerow[self::CSV_ISSUE_ASSIGNED]) && isset($activerow[self::CSV_ISSUE_ASSIGNED_TYPE])) { switch ($activerow[self::CSV_ISSUE_ASSIGNED_TYPE]) { case self::CSV_IDENTIFIER_TYPE_USER: $user = new TBGUser($activerow[self::CSV_ISSUE_ASSIGNED]); $issue->setAssignee($user); break; case self::CSV_IDENTIFIER_TYPE_TEAM: $team = new TBGTeam($activerow[self::CSV_ISSUE_ASSIGNED]); $issue->setAssignee($team); break; } } if (isset($activerow[self::CSV_ISSUE_RESOLUTION])) { $issue->setResolution($activerow[self::CSV_ISSUE_RESOLUTION]); } if (isset($activerow[self::CSV_ISSUE_PRIORITY])) { $issue->setPriority($activerow[self::CSV_ISSUE_PRIORITY]); } if (isset($activerow[self::CSV_ISSUE_CATEGORY])) { $issue->setCategory($activerow[self::CSV_ISSUE_CATEGORY]); } if (isset($activerow[self::CSV_ISSUE_BLOCKING])) { $issue->setBlocking($activerow[self::CSV_ISSUE_BLOCKING]); } if (isset($activerow[self::CSV_ISSUE_SEVERITY])) { $issue->setSeverity($activerow[self::CSV_ISSUE_SEVERITY]); } if (isset($activerow[self::CSV_ISSUE_REPRODUCIBILITY])) { $issue->setReproducability($activerow[self::CSV_ISSUE_REPRODUCIBILITY]); } if (isset($activerow[self::CSV_ISSUE_VOTES])) { $issue->setVotes($activerow[self::CSV_ISSUE_VOTES]); } if (isset($activerow[self::CSV_ISSUE_PERCENTAGE])) { $issue->setPercentCompleted($activerow[self::CSV_ISSUE_PERCENTAGE]); } if (isset($activerow[self::CSV_ISSUE_ISSUENO])) { $issue->setIssueNo((int) $activerow[self::CSV_ISSUE_ISSUENO]); } if (isset($activerow[self::CSV_ISSUE_MILESTONE])) { $issue->setMilestone($activerow[self::CSV_ISSUE_MILESTONE]); } if (isset($activerow[self::CSV_ISSUE_POSTED])) { $issue->setPosted((int) $activerow[self::CSV_ISSUE_POSTED]); } $issue->save(); } catch (Exception $e) { $errors[] = $this->getI18n()->__('Row %row failed: %err', array('%row' => $i + 1, '%err' => $e->getMessage())); } } break; } // Handle errors if (count($errors) != 0) { $errordiv = '<ul>'; foreach ($errors as $error) { $errordiv .= '<li>' . $error . '</li>'; } $errordiv .= '</ul>'; $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('errordetail' => $errordiv, 'error' => $this->getI18n()->__('Errors occured while importing, see the error list in the import screen for further details'))); } else { return $this->renderJSON(array('message' => $this->getI18n()->__('Successfully imported %num rows!', array('%num' => count($data))))); } } }
/** * Add this user to a client * * @param TBGClient $client */ public function addToClient(TBGClient $client) { $client->addMember($this); $this->clients = null; }
/** * Set the currently selected project * * @param TBGProject $project The project, or null if none */ public static function setCurrentProject($project) { self::getResponse()->setBreadcrumb(null); self::$_selected_project = $project; if ($project instanceof TBGProject) { $projectsubmenulinks = null; $clientsubmenulinks = null; if (count(TBGProject::getAll()) > 1) { $projectsubmenulinks = array(); foreach (TBGProject::getAll() as $existing_project) { if (!$project->hasClient() || $existing_project->hasClient() && $project->getClient()->getID() == $existing_project->getClient()->getID()) { $projectsubmenulinks[] = array('url' => self::getRouting()->generate('project_dashboard', array('project_key' => $existing_project->getKey())), 'title' => $existing_project->getName()); } } } if (self::$_selected_project->hasClient()) { $clientsubmenulinks = array(); foreach (TBGClient::getAll() as $client) { if ($client->hasAccess()) { $clientsubmenulinks[] = array('url' => self::getRouting()->generate('client_dashboard', array('client_id' => $client->getID())), 'title' => $client->getName()); } } self::setCurrentClient(self::$_selected_project->getClient()); } if (strtolower(TBGSettings::getTBGname()) != strtolower($project->getName()) || self::isClientContext()) { self::getResponse()->addBreadcrumb(TBGSettings::getTBGName(), self::getRouting()->generate('home')); if (self::isClientContext()) { self::getResponse()->addBreadcrumb(self::getCurrentClient()->getName(), self::getRouting()->generate('client_dashboard', array('client_id' => self::getCurrentClient()->getID())), $clientsubmenulinks); } } self::getResponse()->addBreadcrumb($project->getName(), self::getRouting()->generate('project_dashboard', array('project_key' => TBGContext::getCurrentProject()->getKey())), $projectsubmenulinks, 'selected_project'); } else { self::getResponse()->addBreadcrumb(TBGSettings::getTBGName(), self::getRouting()->generate('home')); } }
public static function populateBreadcrumbs() { $childbreadcrumbs = array(); if (self::$_selected_project instanceof TBGProject) { $t = self::$_selected_project; $hierarchy_breadcrumbs = array(); $projects_processed = array(); while ($t instanceof TBGProject) { if (array_key_exists($t->getKey(), $projects_processed)) { // We have a cyclic dependency! Oh no! // If this happens, throw an exception throw new Exception(TBGContext::geti18n()->__('A loop has been found in the project heirarchy. Go to project configuration, and alter the subproject setting for this project so that this project is not a subproject of one which is a subproject of this one.')); continue; } else { $all_projects = array_merge(TBGProject::getAllRootProjects(true), TBGProject::getAllRootProjects(false)); // If this is a root project, display a list of other root projects, then t is null if (!$t->hasParent() && count($all_projects) > 1) { $itemsubmenulinks = array(); foreach ($all_projects as $child) { if (!$child->hasAccess()) { continue; } $itemsubmenulinks[] = array('url' => self::getRouting()->generate('project_dashboard', array('project_key' => $child->getKey())), 'title' => $child->getName()); } $hierarchy_breadcrumbs[] = array($t, $itemsubmenulinks); $projects_processed[$t->getKey()] = $t; $t = null; continue; } elseif (!$t->hasParent()) { $hierarchy_breadcrumbs[] = array($t, null); $projects_processed[$t->getKey()] = $t; $t = null; continue; } else { // What we want to do here is to build a list of the children of the parent unless we are the only one $parent = $t->getParent(); $children = $parent->getChildren(); $itemsubmenulinks = null; if ($parent->hasChildren() && count($children) > 1) { $itemsubmenulinks = array(); foreach ($children as $child) { if (!$child->hasAccess()) { continue; } $itemsubmenulinks[] = array('url' => self::getRouting()->generate('project_dashboard', array('project_key' => $child->getKey())), 'title' => $child->getName()); } } $hierarchy_breadcrumbs[] = array($t, $itemsubmenulinks); $projects_processed[$t->getKey()] = $t; $t = $parent; continue; } } } $clientsubmenulinks = null; if (self::$_selected_project->hasClient()) { $clientsubmenulinks = array(); foreach (TBGClient::getAll() as $client) { if ($client->hasAccess()) { $clientsubmenulinks[] = array('url' => self::getRouting()->generate('client_dashboard', array('client_id' => $client->getID())), 'title' => $client->getName()); } } self::setCurrentClient(self::$_selected_project->getClient()); } if (mb_strtolower(TBGSettings::getTBGname()) != mb_strtolower(self::$_selected_project->getName()) || self::isClientContext()) { self::getResponse()->addBreadcrumb(TBGSettings::getTBGName(), self::getRouting()->generate('home')); if (self::isClientContext()) { self::getResponse()->addBreadcrumb(self::getCurrentClient()->getName(), self::getRouting()->generate('client_dashboard', array('client_id' => self::getCurrentClient()->getID())), $clientsubmenulinks); } } // Add root breadcrumb first, so reverse order $hierarchy_breadcrumbs = array_reverse($hierarchy_breadcrumbs); foreach ($hierarchy_breadcrumbs as $breadcrumb) { $class = null; if ($breadcrumb[0]->getKey() == self::getCurrentProject()->getKey()) { $class = 'selected_project'; } self::getResponse()->addBreadcrumb($breadcrumb[0]->getName(), self::getRouting()->generate('project_dashboard', array('project_key' => $breadcrumb[0]->getKey())), $breadcrumb[1], $class); } } else { self::getResponse()->addBreadcrumb(TBGSettings::getTBGName(), self::getRouting()->generate('home')); } }