mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-18 21:02:41 +01:00
Remove mailing lists application
Summary: Ref T8387. This is now completely obsoleted by mailing list users. Test Plan: Grepped for `mailinglist` and related symbols. Reviewers: btrahan Reviewed By: btrahan Subscribers: eadler, epriestley Maniphest Tasks: T8387 Differential Revision: https://secure.phabricator.com/D13129
This commit is contained in:
parent
249ee9f104
commit
ba6cb62b49
19 changed files with 1 additions and 714 deletions
|
@ -2020,15 +2020,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php',
|
'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php',
|
||||||
'PhabricatorMailSetupCheck' => 'applications/config/check/PhabricatorMailSetupCheck.php',
|
'PhabricatorMailSetupCheck' => 'applications/config/check/PhabricatorMailSetupCheck.php',
|
||||||
'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php',
|
'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php',
|
||||||
'PhabricatorMailingListDatasource' => 'applications/mailinglists/typeahead/PhabricatorMailingListDatasource.php',
|
|
||||||
'PhabricatorMailingListListPHIDType' => 'applications/mailinglists/phid/PhabricatorMailingListListPHIDType.php',
|
|
||||||
'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php',
|
|
||||||
'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php',
|
|
||||||
'PhabricatorMailingListsApplication' => 'applications/mailinglists/application/PhabricatorMailingListsApplication.php',
|
|
||||||
'PhabricatorMailingListsController' => 'applications/mailinglists/controller/PhabricatorMailingListsController.php',
|
|
||||||
'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php',
|
|
||||||
'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php',
|
|
||||||
'PhabricatorMailingListsManageCapability' => 'applications/mailinglists/capability/PhabricatorMailingListsManageCapability.php',
|
|
||||||
'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php',
|
'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php',
|
||||||
'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php',
|
'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php',
|
||||||
'PhabricatorManagementWorkflow' => 'infrastructure/management/PhabricatorManagementWorkflow.php',
|
'PhabricatorManagementWorkflow' => 'infrastructure/management/PhabricatorManagementWorkflow.php',
|
||||||
|
@ -2067,7 +2058,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php',
|
'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php',
|
||||||
'PhabricatorMetaMTAMailableFunctionDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableFunctionDatasource.php',
|
'PhabricatorMetaMTAMailableFunctionDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableFunctionDatasource.php',
|
||||||
'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php',
|
'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php',
|
||||||
'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php',
|
|
||||||
'PhabricatorMetaMTAMemberQuery' => 'applications/metamta/query/PhabricatorMetaMTAMemberQuery.php',
|
'PhabricatorMetaMTAMemberQuery' => 'applications/metamta/query/PhabricatorMetaMTAMemberQuery.php',
|
||||||
'PhabricatorMetaMTAPermanentFailureException' => 'applications/metamta/exception/PhabricatorMetaMTAPermanentFailureException.php',
|
'PhabricatorMetaMTAPermanentFailureException' => 'applications/metamta/exception/PhabricatorMetaMTAPermanentFailureException.php',
|
||||||
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
|
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
|
||||||
|
@ -5435,15 +5425,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase',
|
'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase',
|
||||||
'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck',
|
'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
'PhabricatorMailingListDatasource' => 'PhabricatorTypeaheadDatasource',
|
|
||||||
'PhabricatorMailingListListPHIDType' => 'PhabricatorPHIDType',
|
|
||||||
'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
|
||||||
'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
|
||||||
'PhabricatorMailingListsApplication' => 'PhabricatorApplication',
|
|
||||||
'PhabricatorMailingListsController' => 'PhabricatorController',
|
|
||||||
'PhabricatorMailingListsEditController' => 'PhabricatorMailingListsController',
|
|
||||||
'PhabricatorMailingListsListController' => 'PhabricatorMailingListsController',
|
|
||||||
'PhabricatorMailingListsManageCapability' => 'PhabricatorPolicyCapability',
|
|
||||||
'PhabricatorMainMenuSearchView' => 'AphrontView',
|
'PhabricatorMainMenuSearchView' => 'AphrontView',
|
||||||
'PhabricatorMainMenuView' => 'AphrontView',
|
'PhabricatorMainMenuView' => 'AphrontView',
|
||||||
'PhabricatorManagementWorkflow' => 'PhutilArgumentWorkflow',
|
'PhabricatorManagementWorkflow' => 'PhutilArgumentWorkflow',
|
||||||
|
@ -5477,11 +5458,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
||||||
'PhabricatorMetaMTAMailableFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
'PhabricatorMetaMTAMailableFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
||||||
'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController',
|
'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController',
|
||||||
'PhabricatorMetaMTAMailingList' => array(
|
|
||||||
'PhabricatorMetaMTADAO',
|
|
||||||
'PhabricatorPolicyInterface',
|
|
||||||
'PhabricatorDestructibleInterface',
|
|
||||||
),
|
|
||||||
'PhabricatorMetaMTAMemberQuery' => 'PhabricatorQuery',
|
'PhabricatorMetaMTAMemberQuery' => 'PhabricatorQuery',
|
||||||
'PhabricatorMetaMTAPermanentFailureException' => 'Exception',
|
'PhabricatorMetaMTAPermanentFailureException' => 'Exception',
|
||||||
'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
|
'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
|
||||||
|
|
|
@ -78,7 +78,6 @@ final class DifferentialSubscribersField
|
||||||
array(
|
array(
|
||||||
PhabricatorPeopleUserPHIDType::TYPECONST,
|
PhabricatorPeopleUserPHIDType::TYPECONST,
|
||||||
PhabricatorProjectProjectPHIDType::TYPECONST,
|
PhabricatorProjectProjectPHIDType::TYPECONST,
|
||||||
PhabricatorMailingListListPHIDType::TYPECONST,
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListsApplication extends PhabricatorApplication {
|
|
||||||
|
|
||||||
public function getName() {
|
|
||||||
return pht('Mailing Lists');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getBaseURI() {
|
|
||||||
return '/mailinglists/';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getShortDescription() {
|
|
||||||
return pht('Manage External Lists');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFontIcon() {
|
|
||||||
return 'fa-mail-reply-all';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getApplicationGroup() {
|
|
||||||
return self::GROUP_ADMIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRoutes() {
|
|
||||||
return array(
|
|
||||||
'/mailinglists/' => array(
|
|
||||||
'(?:query/(?P<queryKey>[^/]+)/)?'
|
|
||||||
=> 'PhabricatorMailingListsListController',
|
|
||||||
'edit/(?:(?P<id>[1-9]\d*)/)?'
|
|
||||||
=> 'PhabricatorMailingListsEditController',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitleGlyph() {
|
|
||||||
return '@';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getCustomCapabilities() {
|
|
||||||
return array(
|
|
||||||
PhabricatorMailingListsManageCapability::CAPABILITY => array(
|
|
||||||
'default' => PhabricatorPolicies::POLICY_ADMIN,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListsManageCapability
|
|
||||||
extends PhabricatorPolicyCapability {
|
|
||||||
|
|
||||||
const CAPABILITY = 'mailinglists.manage';
|
|
||||||
|
|
||||||
public function getCapabilityName() {
|
|
||||||
return pht('Can Manage Lists');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeCapabilityRejection() {
|
|
||||||
return pht('You do not have permission to manage mailing lists.');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
abstract class PhabricatorMailingListsController extends PhabricatorController {
|
|
||||||
|
|
||||||
public function buildSideNavView($for_app = false) {
|
|
||||||
$user = $this->getRequest()->getUser();
|
|
||||||
|
|
||||||
$nav = new AphrontSideNavFilterView();
|
|
||||||
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
|
|
||||||
|
|
||||||
if ($for_app) {
|
|
||||||
$nav->addFilter('edit', pht('Create List'));
|
|
||||||
}
|
|
||||||
|
|
||||||
id(new PhabricatorMailingListSearchEngine())
|
|
||||||
->setViewer($user)
|
|
||||||
->addNavigationItems($nav->getMenu());
|
|
||||||
|
|
||||||
$nav->selectFilter(null);
|
|
||||||
|
|
||||||
return $nav;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildApplicationMenu() {
|
|
||||||
return $this->buildSideNavView(true)->getMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function buildApplicationCrumbs() {
|
|
||||||
$crumbs = parent::buildApplicationCrumbs();
|
|
||||||
|
|
||||||
$can_manage = $this->hasApplicationCapability(
|
|
||||||
PhabricatorMailingListsManageCapability::CAPABILITY);
|
|
||||||
|
|
||||||
$crumbs->addAction(
|
|
||||||
id(new PHUIListItemView())
|
|
||||||
->setName(pht('Create List'))
|
|
||||||
->setHref($this->getApplicationURI('edit/'))
|
|
||||||
->setIcon('fa-plus-square')
|
|
||||||
->setDisabled(!$can_manage)
|
|
||||||
->setWorkflow(!$can_manage));
|
|
||||||
|
|
||||||
return $crumbs;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListsEditController
|
|
||||||
extends PhabricatorMailingListsController {
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
|
||||||
$request = $this->getRequest();
|
|
||||||
$viewer = $request->getUser();
|
|
||||||
|
|
||||||
$this->requireApplicationCapability(
|
|
||||||
PhabricatorMailingListsManageCapability::CAPABILITY);
|
|
||||||
|
|
||||||
$list_id = $request->getURIData('id');
|
|
||||||
if ($list_id) {
|
|
||||||
$page_title = pht('Edit Mailing List');
|
|
||||||
$list = id(new PhabricatorMailingListQuery())
|
|
||||||
->setViewer($viewer)
|
|
||||||
->withIDs(array($list_id))
|
|
||||||
->executeOne();
|
|
||||||
if (!$list) {
|
|
||||||
return new Aphront404Response();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$page_title = pht('Create Mailing List');
|
|
||||||
$list = new PhabricatorMetaMTAMailingList();
|
|
||||||
}
|
|
||||||
|
|
||||||
$e_email = true;
|
|
||||||
$e_uri = null;
|
|
||||||
$e_name = true;
|
|
||||||
$errors = array();
|
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
|
||||||
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
$list->setName($request->getStr('name'));
|
|
||||||
$list->setEmail($request->getStr('email'));
|
|
||||||
$list->setURI($request->getStr('uri'));
|
|
||||||
|
|
||||||
$e_email = null;
|
|
||||||
$e_name = null;
|
|
||||||
|
|
||||||
if (!strlen($list->getEmail())) {
|
|
||||||
$e_email = pht('Required');
|
|
||||||
$errors[] = pht('Email is required.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strlen($list->getName())) {
|
|
||||||
$e_name = pht('Required');
|
|
||||||
$errors[] = pht('Name is required.');
|
|
||||||
} else if (preg_match('/[ ,]/', $list->getName())) {
|
|
||||||
$e_name = pht('Invalid');
|
|
||||||
$errors[] = pht('Name must not contain spaces or commas.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($list->getURI()) {
|
|
||||||
if (!PhabricatorEnv::isValidRemoteURIForLink($list->getURI())) {
|
|
||||||
$e_uri = pht('Invalid');
|
|
||||||
$errors[] = pht('Mailing list URI must point to a valid web page.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$errors) {
|
|
||||||
try {
|
|
||||||
$list->save();
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI($this->getApplicationURI());
|
|
||||||
} catch (AphrontDuplicateKeyQueryException $ex) {
|
|
||||||
$e_email = pht('Duplicate');
|
|
||||||
$errors[] = pht('Another mailing list already uses that address.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$form = new AphrontFormView();
|
|
||||||
$form->setUser($request->getUser());
|
|
||||||
if ($list->getID()) {
|
|
||||||
$form->setAction($this->getApplicationURI('/edit/'.$list->getID().'/'));
|
|
||||||
} else {
|
|
||||||
$form->setAction($this->getApplicationURI('/edit/'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$form
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Email'))
|
|
||||||
->setName('email')
|
|
||||||
->setValue($list->getEmail())
|
|
||||||
->setCaption(pht('Email will be delivered to this address.'))
|
|
||||||
->setError($e_email))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Name'))
|
|
||||||
->setName('name')
|
|
||||||
->setError($e_name)
|
|
||||||
->setCaption(pht('Human-readable display and autocomplete name.'))
|
|
||||||
->setValue($list->getName()))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('URI'))
|
|
||||||
->setName('uri')
|
|
||||||
->setError($e_uri)
|
|
||||||
->setCaption(pht('Optional link to mailing list archives or info.'))
|
|
||||||
->setValue($list->getURI()))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormSubmitControl())
|
|
||||||
->setValue(pht('Save'))
|
|
||||||
->addCancelButton($this->getApplicationURI()));
|
|
||||||
|
|
||||||
if ($list->getID()) {
|
|
||||||
$crumbs->addTextCrumb(pht('Edit Mailing List'));
|
|
||||||
} else {
|
|
||||||
$crumbs->addTextCrumb(pht('Create Mailing List'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$form_box = id(new PHUIObjectBoxView())
|
|
||||||
->setHeaderText($page_title)
|
|
||||||
->setFormErrors($errors)
|
|
||||||
->setForm($form);
|
|
||||||
|
|
||||||
return $this->buildApplicationPage(
|
|
||||||
array(
|
|
||||||
$crumbs,
|
|
||||||
$form_box,
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'title' => $page_title,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListsListController
|
|
||||||
extends PhabricatorMailingListsController {
|
|
||||||
|
|
||||||
private $queryKey;
|
|
||||||
|
|
||||||
public function shouldAllowPublic() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function willProcessRequest(array $data) {
|
|
||||||
$this->queryKey = idx($data, 'queryKey');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function processRequest() {
|
|
||||||
$controller = id(new PhabricatorApplicationSearchController())
|
|
||||||
->setQueryKey($this->queryKey)
|
|
||||||
->setSearchEngine(new PhabricatorMailingListSearchEngine())
|
|
||||||
->setNavigation($this->buildSideNavView());
|
|
||||||
|
|
||||||
return $this->delegateToController($controller);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListListPHIDType extends PhabricatorPHIDType {
|
|
||||||
|
|
||||||
const TYPECONST = 'MLST';
|
|
||||||
|
|
||||||
public function getTypeName() {
|
|
||||||
return pht('Mailing List');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTypeIcon() {
|
|
||||||
return 'fa-envelope-o';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function newObject() {
|
|
||||||
return new PhabricatorMetaMTAMailingList();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function buildQueryForObjects(
|
|
||||||
PhabricatorObjectQuery $query,
|
|
||||||
array $phids) {
|
|
||||||
|
|
||||||
return id(new PhabricatorMailingListQuery())
|
|
||||||
->withPHIDs($phids);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadHandles(
|
|
||||||
PhabricatorHandleQuery $query,
|
|
||||||
array $handles,
|
|
||||||
array $objects) {
|
|
||||||
|
|
||||||
foreach ($handles as $phid => $handle) {
|
|
||||||
$list = $objects[$phid];
|
|
||||||
|
|
||||||
$handle->setName($list->getName());
|
|
||||||
$handle->setURI($list->getURI());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function canLoadNamedObject($name) {
|
|
||||||
return preg_match('/^.+@.+/', $name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadNamedObjects(
|
|
||||||
PhabricatorObjectQuery $query,
|
|
||||||
array $names) {
|
|
||||||
|
|
||||||
$id_map = array();
|
|
||||||
foreach ($names as $name) {
|
|
||||||
// Maybe normalize these some day?
|
|
||||||
$id = $name;
|
|
||||||
$id_map[$id][] = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
$objects = id(new PhabricatorMailingListQuery())
|
|
||||||
->setViewer($query->getViewer())
|
|
||||||
->withEmails(array_keys($id_map))
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
$results = array();
|
|
||||||
foreach ($objects as $id => $object) {
|
|
||||||
$email = $object->getEmail();
|
|
||||||
foreach (idx($id_map, $email, array()) as $name) {
|
|
||||||
$results[$name] = $object;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListQuery
|
|
||||||
extends PhabricatorCursorPagedPolicyAwareQuery {
|
|
||||||
|
|
||||||
private $phids;
|
|
||||||
private $ids;
|
|
||||||
private $emails;
|
|
||||||
private $names;
|
|
||||||
|
|
||||||
public function withIDs($ids) {
|
|
||||||
$this->ids = $ids;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withPHIDs($phids) {
|
|
||||||
$this->phids = $phids;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withEmails(array $emails) {
|
|
||||||
$this->emails = $emails;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withNames(array $names) {
|
|
||||||
$this->names = $names;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function loadPage() {
|
|
||||||
$table = new PhabricatorMetaMTAMailingList();
|
|
||||||
$conn_r = $table->establishConnection('r');
|
|
||||||
|
|
||||||
$data = queryfx_all(
|
|
||||||
$conn_r,
|
|
||||||
'SELECT * FROM %T %Q %Q %Q',
|
|
||||||
$table->getTableName(),
|
|
||||||
$this->buildWhereClause($conn_r),
|
|
||||||
$this->buildOrderClause($conn_r),
|
|
||||||
$this->buildLimitClause($conn_r));
|
|
||||||
|
|
||||||
return $table->loadAllFromArray($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
|
|
||||||
$where = array();
|
|
||||||
|
|
||||||
if ($this->ids) {
|
|
||||||
$where[] = qsprintf(
|
|
||||||
$conn_r,
|
|
||||||
'id IN (%Ld)',
|
|
||||||
$this->ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->phids) {
|
|
||||||
$where[] = qsprintf(
|
|
||||||
$conn_r,
|
|
||||||
'phid IN (%Ls)',
|
|
||||||
$this->phids);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->names) {
|
|
||||||
$where[] = qsprintf(
|
|
||||||
$conn_r,
|
|
||||||
'name IN (%Ls)',
|
|
||||||
$this->names);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->emails) {
|
|
||||||
$where[] = qsprintf(
|
|
||||||
$conn_r,
|
|
||||||
'email IN (%Ls)',
|
|
||||||
$this->emails);
|
|
||||||
}
|
|
||||||
|
|
||||||
$where[] = $this->buildPagingClause($conn_r);
|
|
||||||
|
|
||||||
return $this->formatWhereClause($where);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getQueryApplicationClass() {
|
|
||||||
return 'PhabricatorMailingListsApplication';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,91 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListSearchEngine
|
|
||||||
extends PhabricatorApplicationSearchEngine {
|
|
||||||
|
|
||||||
public function getResultTypeDescription() {
|
|
||||||
return pht('Mailing Lists');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getApplicationClassName() {
|
|
||||||
return 'PhabricatorMailingListsApplication';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildSavedQueryFromRequest(AphrontRequest $request) {
|
|
||||||
$saved = new PhabricatorSavedQuery();
|
|
||||||
|
|
||||||
return $saved;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
|
|
||||||
$query = id(new PhabricatorMailingListQuery());
|
|
||||||
|
|
||||||
return $query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildSearchForm(
|
|
||||||
AphrontFormView $form,
|
|
||||||
PhabricatorSavedQuery $saved_query) {
|
|
||||||
|
|
||||||
// This just makes it clear to the user that the lack of filters is
|
|
||||||
// intentional, not a bug.
|
|
||||||
$form->appendChild(
|
|
||||||
id(new AphrontFormMarkupControl())
|
|
||||||
->setValue(pht('No query filters are available for mailing lists.')));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getURI($path) {
|
|
||||||
return '/mailinglists/'.$path;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getBuiltinQueryNames() {
|
|
||||||
return array(
|
|
||||||
'all' => pht('All Lists'),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function buildSavedQueryFromBuiltin($query_key) {
|
|
||||||
$query = $this->newSavedQuery();
|
|
||||||
$query->setQueryKey($query_key);
|
|
||||||
|
|
||||||
switch ($query_key) {
|
|
||||||
case 'all':
|
|
||||||
return $query;
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent::buildSavedQueryFromBuiltin($query_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function renderResultList(
|
|
||||||
array $lists,
|
|
||||||
PhabricatorSavedQuery $query,
|
|
||||||
array $handles) {
|
|
||||||
assert_instances_of($lists, 'PhabricatorMetaMTAMailingList');
|
|
||||||
|
|
||||||
$view = id(new PHUIObjectItemListView());
|
|
||||||
|
|
||||||
$can_manage = PhabricatorPolicyFilter::hasCapability(
|
|
||||||
$this->requireViewer(),
|
|
||||||
$this->getApplication(),
|
|
||||||
PhabricatorMailingListsManageCapability::CAPABILITY);
|
|
||||||
|
|
||||||
foreach ($lists as $list) {
|
|
||||||
$item = new PHUIObjectItemView();
|
|
||||||
|
|
||||||
$item->setHeader($list->getName());
|
|
||||||
$item->setHref($list->getURI());
|
|
||||||
$item->addAttribute($list->getEmail());
|
|
||||||
$item->addAction(
|
|
||||||
id(new PHUIListItemView())
|
|
||||||
->setIcon('fa-pencil')
|
|
||||||
->setHref($this->getApplicationURI('/edit/'.$list->getID().'/'))
|
|
||||||
->setDisabled(!$can_manage)
|
|
||||||
->setWorkflow(!$can_manage));
|
|
||||||
|
|
||||||
$view->addItem($item);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $view;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMetaMTAMailingList extends PhabricatorMetaMTADAO
|
|
||||||
implements
|
|
||||||
PhabricatorPolicyInterface,
|
|
||||||
PhabricatorDestructibleInterface {
|
|
||||||
|
|
||||||
protected $name;
|
|
||||||
protected $email;
|
|
||||||
protected $uri;
|
|
||||||
|
|
||||||
public function generatePHID() {
|
|
||||||
return PhabricatorPHID::generateNewPHID(
|
|
||||||
PhabricatorMailingListListPHIDType::TYPECONST);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getConfiguration() {
|
|
||||||
return array(
|
|
||||||
self::CONFIG_AUX_PHID => true,
|
|
||||||
self::CONFIG_COLUMN_SCHEMA => array(
|
|
||||||
'name' => 'text128',
|
|
||||||
'email' => 'text128',
|
|
||||||
'uri' => 'text255?',
|
|
||||||
),
|
|
||||||
self::CONFIG_KEY_SCHEMA => array(
|
|
||||||
'key_phid' => null,
|
|
||||||
'phid' => array(
|
|
||||||
'columns' => array('phid'),
|
|
||||||
'unique' => true,
|
|
||||||
),
|
|
||||||
'email' => array(
|
|
||||||
'columns' => array('email'),
|
|
||||||
'unique' => true,
|
|
||||||
),
|
|
||||||
'name' => array(
|
|
||||||
'columns' => array('name'),
|
|
||||||
'unique' => true,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
) + parent::getConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
public function getCapabilities() {
|
|
||||||
return array(
|
|
||||||
PhabricatorPolicyCapability::CAN_VIEW,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPolicy($capability) {
|
|
||||||
return PhabricatorPolicies::getMostOpenPolicy();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function describeAutomaticCapability($capability) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorDestructibleInterface )----------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
public function destroyObjectPermanently(
|
|
||||||
PhabricatorDestructionEngine $engine) {
|
|
||||||
|
|
||||||
$this->openTransaction();
|
|
||||||
$this->delete();
|
|
||||||
$this->saveTransaction();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMailingListDatasource
|
|
||||||
extends PhabricatorTypeaheadDatasource {
|
|
||||||
|
|
||||||
public function getBrowseTitle() {
|
|
||||||
return pht('Browse Mailing Lists');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPlaceholderText() {
|
|
||||||
return pht('Type a mailing list name...');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDatasourceApplicationClass() {
|
|
||||||
return 'PhabricatorMailingListsApplication';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadResults() {
|
|
||||||
$viewer = $this->getViewer();
|
|
||||||
$raw_query = $this->getRawQuery();
|
|
||||||
|
|
||||||
$query = id(new PhabricatorMailingListQuery());
|
|
||||||
$lists = $this->executeQuery($query);
|
|
||||||
|
|
||||||
$results = array();
|
|
||||||
foreach ($lists as $list) {
|
|
||||||
$results[] = id(new PhabricatorTypeaheadResult())
|
|
||||||
->setName($list->getName())
|
|
||||||
->setURI($list->getURI())
|
|
||||||
->setPHID($list->getPHID());
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: It would be slightly preferable to do this as part of the query,
|
|
||||||
// this is just simpler for the moment.
|
|
||||||
|
|
||||||
return $this->filterResultsAgainstTokens($results);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -39,9 +39,6 @@ final class PhabricatorMetaMTAActorQuery extends PhabricatorQuery {
|
||||||
case PhabricatorPeopleExternalPHIDType::TYPECONST:
|
case PhabricatorPeopleExternalPHIDType::TYPECONST:
|
||||||
$this->loadExternalUserActors($actors, $phids);
|
$this->loadExternalUserActors($actors, $phids);
|
||||||
break;
|
break;
|
||||||
case PhabricatorMailingListListPHIDType::TYPECONST:
|
|
||||||
$this->loadMailingListActors($actors, $phids);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
$this->loadUnknownActors($actors, $phids);
|
$this->loadUnknownActors($actors, $phids);
|
||||||
break;
|
break;
|
||||||
|
@ -124,28 +121,6 @@ final class PhabricatorMetaMTAActorQuery extends PhabricatorQuery {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function loadMailingListActors(array $actors, array $phids) {
|
|
||||||
assert_instances_of($actors, 'PhabricatorMetaMTAActor');
|
|
||||||
|
|
||||||
$lists = id(new PhabricatorMailingListQuery())
|
|
||||||
->setViewer($this->getViewer())
|
|
||||||
->withPHIDs($phids)
|
|
||||||
->execute();
|
|
||||||
$lists = mpull($lists, null, 'getPHID');
|
|
||||||
|
|
||||||
foreach ($phids as $phid) {
|
|
||||||
$actor = $actors[$phid];
|
|
||||||
|
|
||||||
$list = idx($lists, $phid);
|
|
||||||
if (!$list) {
|
|
||||||
$actor->setUndeliverable(PhabricatorMetaMTAActor::REASON_UNLOADABLE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$actor->setName($list->getName());
|
|
||||||
$actor->setEmailAddress($list->getEmail());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function loadUnknownActors(array $actors, array $phids) {
|
private function loadUnknownActors(array $actors, array $phids) {
|
||||||
foreach ($phids as $phid) {
|
foreach ($phids as $phid) {
|
||||||
|
|
|
@ -100,13 +100,7 @@ final class PhabricatorMetaMTAReceivedMail extends PhabricatorMetaMTADAO {
|
||||||
}
|
}
|
||||||
$users = id(new PhabricatorUserEmail())
|
$users = id(new PhabricatorUserEmail())
|
||||||
->loadAllWhere('address IN (%Ls)', $addresses);
|
->loadAllWhere('address IN (%Ls)', $addresses);
|
||||||
$user_phids = mpull($users, 'getUserPHID');
|
return mpull($users, 'getUserPHID');
|
||||||
|
|
||||||
$mailing_lists = id(new PhabricatorMetaMTAMailingList())
|
|
||||||
->loadAllWhere('email in (%Ls)', $addresses);
|
|
||||||
$mailing_list_phids = mpull($mailing_lists, 'getPHID');
|
|
||||||
|
|
||||||
return array_merge($user_phids, $mailing_list_phids);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processReceivedMail() {
|
public function processReceivedMail() {
|
||||||
|
|
|
@ -19,7 +19,6 @@ final class PhabricatorMetaMTAMailableDatasource
|
||||||
return array(
|
return array(
|
||||||
new PhabricatorPeopleDatasource(),
|
new PhabricatorPeopleDatasource(),
|
||||||
new PhabricatorProjectDatasource(),
|
new PhabricatorProjectDatasource(),
|
||||||
new PhabricatorMailingListDatasource(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ final class PhabricatorMetaMTAMailableFunctionDatasource
|
||||||
new PhabricatorPeopleDatasource(),
|
new PhabricatorPeopleDatasource(),
|
||||||
new PhabricatorProjectMembersDatasource(),
|
new PhabricatorProjectMembersDatasource(),
|
||||||
new PhabricatorProjectDatasource(),
|
new PhabricatorProjectDatasource(),
|
||||||
new PhabricatorMailingListDatasource(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,27 +143,6 @@ final class PhabricatorObjectListQuery {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$mailing_list_app = PhabricatorApplication::getByClass(
|
|
||||||
'PhabricatorMailingListsApplication');
|
|
||||||
if ($mailing_list_app->isInstalled()) {
|
|
||||||
if ($names) {
|
|
||||||
// We still haven't been able to resolve everything; try mailing lists
|
|
||||||
// by name as a last resort.
|
|
||||||
$lists = id(new PhabricatorMailingListQuery())
|
|
||||||
->setViewer($this->getViewer())
|
|
||||||
->withNames($names)
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
$lists = mpull($lists, null, 'getName');
|
|
||||||
foreach ($names as $key => $name) {
|
|
||||||
if (isset($lists[$name])) {
|
|
||||||
$results[$name] = $lists[$name];
|
|
||||||
unset($names[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -484,7 +484,6 @@ abstract class PhabricatorApplicationSearchEngine {
|
||||||
$key,
|
$key,
|
||||||
array(
|
array(
|
||||||
PhabricatorProjectProjectPHIDType::TYPECONST,
|
PhabricatorProjectProjectPHIDType::TYPECONST,
|
||||||
PhabricatorMailingListListPHIDType::TYPECONST,
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,10 +137,6 @@
|
||||||
"name": "Macro",
|
"name": "Macro",
|
||||||
"include": "(^src/applications/macro/)"
|
"include": "(^src/applications/macro/)"
|
||||||
},
|
},
|
||||||
"mailinglists": {
|
|
||||||
"name": "Mailing Lists",
|
|
||||||
"include": "(^src/applications/mailinglists/)"
|
|
||||||
},
|
|
||||||
"maniphest": {
|
"maniphest": {
|
||||||
"name": "Maniphest",
|
"name": "Maniphest",
|
||||||
"include": "(^src/applications/maniphest/)"
|
"include": "(^src/applications/maniphest/)"
|
||||||
|
|
Loading…
Reference in a new issue