2012-12-11 22:59:20 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
abstract class PhabricatorApplicationTransaction
|
|
|
|
extends PhabricatorLiskDAO
|
|
|
|
implements PhabricatorPolicyInterface{
|
|
|
|
|
|
|
|
const MARKUP_FIELD_COMMENT = 'markup:comment';
|
|
|
|
|
|
|
|
protected $phid;
|
|
|
|
protected $objectPHID;
|
|
|
|
protected $authorPHID;
|
|
|
|
protected $viewPolicy;
|
|
|
|
protected $editPolicy;
|
|
|
|
|
|
|
|
protected $commentPHID;
|
|
|
|
protected $commentVersion = 0;
|
|
|
|
|
|
|
|
protected $transactionType;
|
|
|
|
protected $oldValue;
|
|
|
|
protected $newValue;
|
|
|
|
|
|
|
|
protected $contentSource;
|
|
|
|
|
|
|
|
private $comment;
|
|
|
|
private $commentNotLoaded;
|
|
|
|
|
|
|
|
private $handles;
|
|
|
|
|
|
|
|
abstract public function getApplicationTransactionType();
|
|
|
|
abstract public function getApplicationTransactionCommentObject();
|
|
|
|
abstract public function getApplicationObjectTypeName();
|
|
|
|
|
|
|
|
public function generatePHID() {
|
|
|
|
$type = PhabricatorPHIDConstants::PHID_TYPE_XACT;
|
|
|
|
$subtype = $this->getApplicationTransactionType();
|
|
|
|
|
|
|
|
return PhabricatorPHID::generateNewPHID($type, $subtype);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getConfiguration() {
|
|
|
|
return array(
|
|
|
|
self::CONFIG_AUX_PHID => true,
|
|
|
|
self::CONFIG_SERIALIZATION => array(
|
|
|
|
'oldValue' => self::SERIALIZATION_JSON,
|
|
|
|
'newValue' => self::SERIALIZATION_JSON,
|
|
|
|
),
|
|
|
|
) + parent::getConfiguration();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setContentSource(PhabricatorContentSource $content_source) {
|
|
|
|
$this->contentSource = $content_source->serialize();
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getContentSource() {
|
|
|
|
return PhabricatorContentSource::newFromSerialized($this->contentSource);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getComment() {
|
|
|
|
if ($this->commentNotLoaded) {
|
|
|
|
throw new Exception("Comment for this transaction was not loaded.");
|
|
|
|
}
|
|
|
|
return $this->comment;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function attachComment(
|
|
|
|
PhabricatorApplicationTransactionComment $comment) {
|
|
|
|
$this->comment = $comment;
|
|
|
|
$this->commentNotLoaded = false;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setCommentNotLoaded($not_loaded) {
|
|
|
|
$this->commentNotLoaded = $not_loaded;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -( Rendering )---------------------------------------------------------- */
|
|
|
|
|
|
|
|
public function getRequiredHandlePHIDs() {
|
|
|
|
$phids = array();
|
|
|
|
|
|
|
|
$old = $this->getOldValue();
|
|
|
|
$new = $this->getNewValue();
|
|
|
|
|
|
|
|
$phids[] = array($this->getAuthorPHID());
|
|
|
|
switch ($this->getTransactionType()) {
|
|
|
|
case PhabricatorTransactions::TYPE_SUBSCRIBERS:
|
|
|
|
$phids[] = $old;
|
|
|
|
$phids[] = $new;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return array_mergev($phids);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setHandles(array $handles) {
|
|
|
|
$this->handles = $handles;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getHandle($phid) {
|
|
|
|
if (empty($this->handles[$phid])) {
|
|
|
|
throw new Exception(
|
|
|
|
"Transaction requires a handle ('{$phid}') it did not load.");
|
|
|
|
}
|
|
|
|
return $this->handles[$phid];
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function renderHandleLink($phid) {
|
|
|
|
return $this->getHandle($phid)->renderLink();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function renderHandleList(array $phids) {
|
|
|
|
$links = array();
|
|
|
|
foreach ($phids as $phid) {
|
|
|
|
$links[] = $this->renderHandleLink($phid);
|
|
|
|
}
|
|
|
|
return implode(', ', $links);
|
|
|
|
}
|
|
|
|
|
2012-12-11 22:59:35 +01:00
|
|
|
public function getIcon() {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getColor() {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2012-12-11 22:59:20 +01:00
|
|
|
public function shouldHide() {
|
|
|
|
switch ($this->getTransactionType()) {
|
|
|
|
case PhabricatorTransactions::TYPE_VIEW_POLICY:
|
|
|
|
case PhabricatorTransactions::TYPE_EDIT_POLICY:
|
|
|
|
if ($this->getOldValue() === null) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getTitle() {
|
|
|
|
$author_phid = $this->getAuthorPHID();
|
|
|
|
|
|
|
|
$old = $this->getOldValue();
|
|
|
|
$new = $this->getNewValue();
|
|
|
|
|
|
|
|
switch ($this->getTransactionType()) {
|
|
|
|
case PhabricatorTransactions::TYPE_COMMENT:
|
|
|
|
return pht(
|
|
|
|
'%s added a comment.',
|
|
|
|
$this->renderHandleLink($author_phid));
|
|
|
|
case PhabricatorTransactions::TYPE_VIEW_POLICY:
|
|
|
|
// TODO: Render human-readable.
|
|
|
|
return pht(
|
|
|
|
'%s changed the visibility of this %s from "%s" to "%s".',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
$this->getApplicationObjectTypeName(),
|
|
|
|
phutil_escape_html($old),
|
|
|
|
phutil_escape_html($new));
|
|
|
|
case PhabricatorTransactions::TYPE_EDIT_POLICY:
|
|
|
|
// TODO: Render human-readable.
|
|
|
|
return pht(
|
|
|
|
'%s changed the edit policy of this %s from "%s" to "%s".',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
$this->getApplicationObjectTypeName(),
|
|
|
|
phutil_escape_html($old),
|
|
|
|
phutil_escape_html($new));
|
|
|
|
case PhabricatorTransactions::TYPE_SUBSCRIBERS:
|
|
|
|
$add = array_diff($new, $old);
|
|
|
|
$rem = array_diff($old, $new);
|
|
|
|
|
|
|
|
if ($add && $rem) {
|
|
|
|
return pht(
|
|
|
|
'%s edited subscriber(s), added %d: %s; removed %d: %s.',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
count($add),
|
|
|
|
$this->renderHandleList($add),
|
|
|
|
count($rem),
|
|
|
|
$this->renderHandleList($rem));
|
|
|
|
} else if ($add) {
|
|
|
|
return pht(
|
|
|
|
'%s added %d subscriber(s): %s.',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
count($add),
|
|
|
|
$this->renderHandleList($add));
|
|
|
|
} else {
|
|
|
|
return pht(
|
|
|
|
'%s removed %d subscribers: %s.',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
count($rem),
|
|
|
|
$this->renderHandleList($rem));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return pht(
|
|
|
|
'%s edited this %s.',
|
|
|
|
$this->renderHandleLink($author_phid),
|
|
|
|
$this->getApplicationObjectTypeName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* -( PhabricatorPolicyInterface Implementation )-------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
public function getCapabilities() {
|
|
|
|
return array(
|
|
|
|
PhabricatorPolicyCapability::CAN_VIEW,
|
|
|
|
PhabricatorPolicyCapability::CAN_EDIT,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPolicy($capability) {
|
|
|
|
switch ($capability) {
|
|
|
|
case PhabricatorPolicyCapability::CAN_VIEW:
|
|
|
|
return $this->getViewPolicy();
|
|
|
|
case PhabricatorPolicyCapability::CAN_EDIT:
|
|
|
|
return $this->getEditPolicy();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
|
|
|
|
return ($viewer->getPHID() == $this->getAuthorPHID());
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|