You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.5 KiB
211 lines
5.5 KiB
<?php
|
|
/*********************************************************************
|
|
class.collaborator.php
|
|
|
|
Ticket collaborator
|
|
|
|
Peter Rotich <peter@osticket.com>
|
|
Copyright (c) 2006-2013 osTicket
|
|
http://www.osticket.com
|
|
|
|
Released under the GNU General Public License WITHOUT ANY WARRANTY.
|
|
See LICENSE.TXT for details.
|
|
|
|
vim: expandtab sw=4 ts=4 sts=4:
|
|
**********************************************************************/
|
|
require_once(INCLUDE_DIR . 'class.user.php');
|
|
require_once(INCLUDE_DIR . 'class.client.php');
|
|
|
|
class Collaborator
|
|
extends VerySimpleModel
|
|
implements EmailContact, ITicketUser {
|
|
|
|
static $meta = array(
|
|
'table' => THREAD_COLLABORATOR_TABLE,
|
|
'pk' => array('id'),
|
|
'select_related' => array('user'),
|
|
'joins' => array(
|
|
'thread' => array(
|
|
'constraint' => array('thread_id' => 'Thread.id'),
|
|
),
|
|
'user' => array(
|
|
'constraint' => array('user_id' => 'User.id'),
|
|
),
|
|
),
|
|
);
|
|
|
|
const FLAG_ACTIVE = 0x0001;
|
|
const FLAG_CC = 0x0002;
|
|
|
|
var $active;
|
|
|
|
function __toString() {
|
|
return Format::htmlchars($this->toString());
|
|
}
|
|
function toString() {
|
|
return sprintf('"%s" <%s>', $this->getName(), $this->getEmail());
|
|
}
|
|
|
|
function getId() {
|
|
return $this->id;
|
|
}
|
|
|
|
function isActive() {
|
|
return !!($this->flags & self::FLAG_ACTIVE);
|
|
}
|
|
|
|
function getCreateDate() {
|
|
return $this->created;
|
|
}
|
|
|
|
function getThreadId() {
|
|
return $this->thread_id;
|
|
}
|
|
|
|
function getTicketId() {
|
|
if ($this->thread && $this->thread->object_type == ObjectModel::OBJECT_TYPE_TICKET)
|
|
return $this->thread->object_id;
|
|
}
|
|
|
|
function getTicket() {
|
|
// TODO: Change to $this->thread->ticket when Ticket goes to ORM
|
|
if ($id = $this->getTicketId())
|
|
return Ticket::lookup($id);
|
|
}
|
|
|
|
function getUser() {
|
|
return $this->user;
|
|
}
|
|
|
|
// EmailContact interface
|
|
function getEmail() {
|
|
return $this->user->getEmail();
|
|
}
|
|
function getName() {
|
|
return $this->user->getName();
|
|
}
|
|
|
|
static function getIdByUserId($userId, $threadId) {
|
|
$row = Collaborator::objects()
|
|
->filter(array('user_id'=>$userId, 'thread_id'=>$threadId))
|
|
->values_flat('id')
|
|
->first();
|
|
|
|
return $row ? $row[0] : 0;
|
|
}
|
|
|
|
// VariableReplacer interface
|
|
function getVar($what) {
|
|
global $cfg;
|
|
|
|
switch (strtolower($what)) {
|
|
case 'ticket_link':
|
|
$qstr = array();
|
|
if ($this->getTicket()->getAuthToken($this)
|
|
&& ($ticket=$this->getTicket())
|
|
&& !$ticket->getThread()->getNumCollaborators()) {
|
|
$qstr['auth'] = $ticket->getAuthToken($this);
|
|
return sprintf('%s/view.php?%s',
|
|
$cfg->getBaseUrl(),
|
|
Http::build_query($qstr, false)
|
|
);
|
|
}
|
|
else {
|
|
return sprintf('%s/tickets.php?id=%s',
|
|
$cfg->getBaseUrl(),
|
|
$ticket->getId()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ITicketUser interface
|
|
var $_isguest;
|
|
|
|
function isOwner() {
|
|
return false;
|
|
}
|
|
function flagGuest() {
|
|
$this->_isguest = true;
|
|
}
|
|
function isGuest() {
|
|
return $this->_isguest;
|
|
}
|
|
function getUserId() {
|
|
return $this->user_id;
|
|
}
|
|
|
|
function hasFlag($flag) {
|
|
return ($this->get('flags', 0) & $flag) != 0;
|
|
}
|
|
|
|
public function setFlag($flag, $val) {
|
|
if ($val)
|
|
$this->flags |= $flag;
|
|
else
|
|
$this->flags &= ~$flag;
|
|
}
|
|
|
|
public function setCc($active=true) {
|
|
$this->setFlag(Collaborator::FLAG_ACTIVE, $active);
|
|
$this->setFlag(Collaborator::FLAG_CC, true);
|
|
$this->save();
|
|
}
|
|
|
|
function isCc() {
|
|
return !!($this->flags & self::FLAG_CC);
|
|
}
|
|
|
|
function getCollabList($collabs) {
|
|
$collabList = array();
|
|
foreach ($collabs as $c) {
|
|
$u = User::lookup($c);
|
|
if ($u) {
|
|
$email = $u->getEmail()->address;
|
|
$collabList[$c] = $email;
|
|
}
|
|
}
|
|
return $collabList;
|
|
}
|
|
|
|
static function create($vars=false) {
|
|
$inst = new static($vars);
|
|
$inst->setFlag(Collaborator::FLAG_ACTIVE, true);
|
|
$inst->setFlag(Collaborator::FLAG_CC, true);
|
|
$inst->created = SqlFunction::NOW();
|
|
return $inst;
|
|
}
|
|
|
|
function save($refetch=false) {
|
|
if ($this->dirty)
|
|
$this->updated = SqlFunction::NOW();
|
|
return parent::save($refetch || $this->dirty);
|
|
}
|
|
|
|
static function add($info, &$errors) {
|
|
if (!$info || !$info['threadId'] || !$info['userId'])
|
|
$errors['err'] = __('Invalid or missing information');
|
|
elseif ($c = Collaborator::lookup(array(
|
|
'thread_id' => $info['threadId'],
|
|
'user_id' => $info['userId'],
|
|
)))
|
|
$errors['err'] = sprintf(__('%s is already a collaborator'),
|
|
$c->getName());
|
|
|
|
if ($errors) return false;
|
|
|
|
$collab = static::create(array(
|
|
'thread_id' => $info['threadId'],
|
|
'user_id' => $info['userId'],
|
|
));
|
|
if ($collab->save(true))
|
|
return $collab;
|
|
|
|
$errors['err'] = __('Unable to add collaborator.')
|
|
.' '.__('Internal error occurred');
|
|
|
|
return false;
|
|
}
|
|
|
|
}
|
|
?>
|