Page MenuHomePhabricator

D16727.diff
No OneTemporary

D16727.diff

diff --git a/src/applications/calendar/controller/PhabricatorCalendarController.php b/src/applications/calendar/controller/PhabricatorCalendarController.php
--- a/src/applications/calendar/controller/PhabricatorCalendarController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarController.php
@@ -18,4 +18,23 @@
->setContent($ics_data);
}
+ protected function newImportedEventResponse(PhabricatorCalendarEvent $event) {
+ if (!$event->isImportedEvent()) {
+ return null;
+ }
+
+ // Give the user a specific, detailed message if they try to edit an
+ // imported event via common web paths. Other edits (including those via
+ // the API) are blocked by the normal policy system, but this makes it more
+ // clear exactly why the event can't be edited.
+
+ return $this->newDialog()
+ ->setTitle(pht('Can Not Edit Imported Event'))
+ ->appendParagraph(
+ pht(
+ 'This event has been imported from an external source and '.
+ 'can not be edited.'))
+ ->addCancelButton($event->getURI(), pht('Done'));
+ }
+
}
diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventCancelController.php b/src/applications/calendar/controller/PhabricatorCalendarEventCancelController.php
--- a/src/applications/calendar/controller/PhabricatorCalendarEventCancelController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarEventCancelController.php
@@ -7,19 +7,27 @@
$viewer = $request->getViewer();
$id = $request->getURIData('id');
+ // Just check CAN_VIEW first. Then we'll check if this is an import so
+ // we can raise a better error.
$event = id(new PhabricatorCalendarEventQuery())
->setViewer($viewer)
->withIDs(array($id))
- ->requireCapabilities(
- array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
->executeOne();
if (!$event) {
return new Aphront404Response();
}
+ $response = $this->newImportedEventResponse($event);
+ if ($response) {
+ return $response;
+ }
+
+ // Now that we've done the import check, check for CAN_EDIT.
+ PhabricatorPolicyFilter::requireCapability(
+ $viewer,
+ $event,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
$cancel_uri = $event->getURI();
$is_parent = $event->isParentEvent();
diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
--- a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
@@ -4,6 +4,20 @@
extends PhabricatorCalendarController {
public function handleRequest(AphrontRequest $request) {
+ $viewer = $this->getViewer();
+
+ $id = $request->getURIData('id');
+ if ($id) {
+ $event = id(new PhabricatorCalendarEventQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->executeOne();
+ $response = $this->newImportedEventResponse($event);
+ if ($response) {
+ return $response;
+ }
+ }
+
return id(new PhabricatorCalendarEventEditEngine())
->setController($this)
->buildResponse();
diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php b/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php
--- a/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarEventJoinController.php
@@ -15,6 +15,11 @@
return new Aphront404Response();
}
+ $response = $this->newImportedEventResponse($event);
+ if ($response) {
+ return $response;
+ }
+
$cancel_uri = $event->getURI();
$action = $request->getURIData('action');
diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventViewController.php b/src/applications/calendar/controller/PhabricatorCalendarEventViewController.php
--- a/src/applications/calendar/controller/PhabricatorCalendarEventViewController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarEventViewController.php
@@ -63,6 +63,19 @@
->setHeader(pht('Details'));
$recurring_header = $this->buildRecurringHeader($event);
+ // NOTE: This is a bit hacky: for imported events, we're just hiding the
+ // comment form without actually preventing comments. Users could still
+ // submit a request to add comments to these events. This isn't really a
+ // major problem since they can't do anything truly bad and there isn't an
+ // easy way to selectively disable this or some other similar behaviors
+ // today, but it would probably be nice to fully disable these
+ // "pseudo-edits" (like commenting and probably subscribing and awarding
+ // tokens) at some point.
+ if ($event->isImportedEvent()) {
+ $comment_view = null;
+ $timeline->setShouldTerminate(true);
+ }
+
$view = id(new PHUITwoColumnView())
->setHeader($header)
->setSubheader($subheader)
@@ -105,6 +118,16 @@
->setPolicyObject($event)
->setHeaderIcon($event->getIcon());
+ if ($event->isImportedEvent()) {
+ $header->addTag(
+ id(new PHUITagView())
+ ->setType(PHUITagView::TYPE_SHADE)
+ ->setName(pht('Imported'))
+ ->setIcon('fa-download')
+ ->setHref($event->getImportSource()->getURI())
+ ->setShade('orange'));
+ }
+
foreach ($this->buildRSVPActions($event) as $action) {
$header->addActionLink($action);
}
@@ -141,12 +164,15 @@
->setWorkflow(!$can_edit));
}
+ $can_attend = !$event->isImportedEvent();
+
if ($is_attending) {
$curtain->addAction(
id(new PhabricatorActionView())
->setName(pht('Decline Event'))
->setIcon('fa-user-times')
->setHref($this->getApplicationURI("event/join/{$id}/"))
+ ->setDisabled(!$can_attend)
->setWorkflow(true));
} else {
$curtain->addAction(
@@ -154,6 +180,7 @@
->setName(pht('Join Event'))
->setIcon('fa-user-plus')
->setHref($this->getApplicationURI("event/join/{$id}/"))
+ ->setDisabled(!$can_attend)
->setWorkflow(true));
}
@@ -261,6 +288,15 @@
pht('None'));
}
+ if ($event->isImportedEvent()) {
+ $properties->addProperty(
+ pht('Imported By'),
+ pht(
+ '%s from %s',
+ $viewer->renderHandle($event->getImportAuthorPHID()),
+ $viewer->renderHandle($event->getImportSourcePHID())));
+ }
+
$properties->addProperty(
pht('Invitees'),
$invitee_list);
diff --git a/src/applications/calendar/phid/PhabricatorCalendarImportPHIDType.php b/src/applications/calendar/phid/PhabricatorCalendarImportPHIDType.php
--- a/src/applications/calendar/phid/PhabricatorCalendarImportPHIDType.php
+++ b/src/applications/calendar/phid/PhabricatorCalendarImportPHIDType.php
@@ -33,7 +33,7 @@
$import = $objects[$phid];
$id = $import->getID();
- $name = $import->getName();
+ $name = $import->getDisplayName();
$uri = $import->getURI();
$handle
diff --git a/src/applications/calendar/storage/PhabricatorCalendarEvent.php b/src/applications/calendar/storage/PhabricatorCalendarEvent.php
--- a/src/applications/calendar/storage/PhabricatorCalendarEvent.php
+++ b/src/applications/calendar/storage/PhabricatorCalendarEvent.php
@@ -576,6 +576,10 @@
}
}
+ if ($this->isImportedEvent()) {
+ return 'fa-download';
+ }
+
return $this->getIcon();
}
@@ -584,6 +588,10 @@
return 'red';
}
+ if ($this->isImportedEvent()) {
+ return 'orange';
+ }
+
if ($viewer->isLoggedIn()) {
$status = $this->getUserInviteStatus($viewer->getPHID());
switch ($status) {

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 2, 10:45 AM (2 w, 2 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6724316
Default Alt Text
D16727.diff (7 KB)

Event Timeline