project_id) { return $p; } $p->get($this->project_id); return $p; } function checkPerm($perm, $au) { $pr = $this->project(); if ($perm == 'S') { // apply filter should sort this out.. if (!$pr || !$au) { return true; } // admins can list anything.. if ($pr->code == '*PUBLIC') { return true; } return $pr->checkPerm($perm, $au); } if (!$pr || !$au) { return false; } return $pr->checkPerm($perm, $au); // admins with all project rights. } function applyFilters($q, $au, $roo) { $this->setFrom($q); $pr = $this->project(); if (!$au) { // can only list milestones on projects.. if (!$pr) { $roo->jerr("invalid project"); } if ($pr->code != '*PUBLIC') { $roo->jerr("permission denied"); } // project set, they can list it.. } else { // aut if (!$pr || !$pr->checkPerm('S', $au)) { $roo->jerr("permission denied"); } } if (!empty($q['_with_active_tickets'])) { $this->selectAddActiveTickets(); $this->ensureProjectMilestones(); } if (!empty($q['_viewtype'])) { switch($q['_viewtype']) { case 'ALL': break; case 'ACTIVE_WITH_TICKETS': if (!empty($q['_with_active_tickets'])) { $this->having('active_tickets > 0'); } // no break.. case 'ACTIVE': $this->whereAdd('mtrack_milestone.duedate IS NOT NULL'); $this->whereAdd('mtrack_milestone.duedate > NOW()'); break; case 'HEAD': // needs a //DB_DataObject::DebugLevel(1); // find all the first ID's that match this..... $this->whereAddIn('mtrack_milestone.id', $this->headMilestones() , 'int'); break; } } } /** * add active_tickets to query. * opts: * project_ids: * user_id: */ function selectAddActiveTickets($q = array()) { $query = ' SELECT count(id) FROM mtrack_ticket WHERE mtrack_ticket.milestone_id = mtrack_milestone.id AND resolution_id = 0 ' ; if (!empty($q['project_ids'])) { $query .= ' AND project_id IN ('. implode(',', $q['project_ids']) .')'; } if (!empty($q['user_id'])) { $query .= 'AND owner_id= '. (int)$q['user_id']; } $this->selectAdd("($query) as active_tickets"); } /** * list only head milestones. * opts : * project_ids.... * user: .... */ function headMilestones($q = array()) { $x = clone($this); $x->selectAddActiveTickets($q); $x->whereAdd('mtrack_milestone.duedate IS NOT NULL'); $x->having('active_tickets > 0'); $ar=$x->fetchAll(); $par= array(); foreach($ar as $l) { if (isset($par[$l->project_id ])) { continue; } $par[$l->project_id ] = $l->id; } return array_values($par); } function ensureProjectMilestones() { /// create milestones for projects that do not have one.. // then assign tickets that do not have milestones to them. $t = DB_DataObject::Factory('mtrack_ticket'); $t->whereAdd('milestone_id = 0'); if (!$t->count()) { return; } // find all the milestones project_ids.. $m = DB_DataObject::Factory('mtrack_milestone'); $m->selectAdd(); $m->selectAdd('distinct(project_id) as project_id'); $mpids = $m->fetchAll('project_id'); // find all project_id's from the tickets $t = DB_DataObject::Factory('mtrack_ticket'); //$t->whereAddIN('!project_id', $mpids, 'int'); $t->whereAdd('milestone_id = 0'); $t->selectAdd(); $t->selectAdd('distinct(project_id) as project_id'); $pids = $t->fetchAll('project_id'); $npids = array(); foreach($pids as $pid) { $m = DB_DataObject::Factory('mtrack_milestone'); $m->project_id = $pid; $m->name = "No Milestone"; $m->limit(1); $m->orderBy('id desc'); if (!$m->find(true)) { $m->description = "No Milestone selected"; // should we create a 'created'??? - nope.?? $m->insert(); } $npids[$pid] = clone($m); $t = DB_DataObject::Factory('mtrack_ticket'); $t->query("UPDATE mtrack_ticket SET milestone_id = {$m->id} WHERE project_id = $pid AND milestone_id = 0"); } } function toRooSingleArray($authUser, $request) { $ret = $this->toArray(); if (empty($this->depends_on)) { return $ret; } $ar = explode(',', $this->depends_on); $m = DB_DataObject::Factory('mtrack_milestone'); $m->whereAddIn('id', explode(',', $this->depends_on), 'int' ); $ret['depends_on_vals'] = array(); foreach($m->fetchAll() as $k) { $ret['depends_on_vals'][]= $k->toArray(); } return $ret; } function beforeUpdate($old, $req, $roo) { if (empty($req['_merge_id'])) { return; } $m = DB_DataObject::Factory('mtrack_milestone'); if (!$m->get($req['_merge_id'])) { $roo->jerr("invalid merge id"); } if ($m->project_id != $this->project_id) { $roo->jerr("not the same project"); } $this->query("UPDATE mtrack_ticket SET milestone_id = " . $m->id . " WHERE milestone_id = " . $this->id); $roo->jok("merged - can be deleted now?"); } }