public function applyInternalEffects($object, $value)
 {
     $actor = $this->getActor();
     $editor = $this->getEditor();
     $datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($value);
     $datetime->setIsAllDay($editor->getNewIsAllDay());
     $object->setEndDateTime($datetime);
 }
 public function applyInternalEffects($object, $value)
 {
     $object->setIsAllDay($value);
     // Adjust the flags on any other dates the event has.
     $keys = array('startDateTime', 'endDateTime', 'untilDateTime');
     foreach ($keys as $key) {
         $dict = $object->getParameter($key);
         if (!$dict) {
             continue;
         }
         $datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($dict);
         $datetime->setIsAllDay($value);
         $object->setParameter($key, $datetime->toDictionary());
     }
 }
コード例 #3
0
 public function testCalendarRecurrenceLists()
 {
     $set = id(new PhutilCalendarRecurrenceSet());
     $result = $set->getEventsBetween(null, null, 0xffff);
     $this->assertEqual(array(), $result, pht('Set with no sources.'));
     $set = id(new PhutilCalendarRecurrenceSet())->addSource(new PhutilCalendarRecurrenceList());
     $result = $set->getEventsBetween(null, null, 0xffff);
     $this->assertEqual(array(), $result, pht('Set with empty list source.'));
     $list = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'));
     $source = id(new PhutilCalendarRecurrenceList())->setDates($list);
     $set = id(new PhutilCalendarRecurrenceSet())->addSource($source);
     $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'));
     $result = $set->getEventsBetween(null, null, 0xffff);
     $this->assertEqual(mpull($expect, 'getISO8601'), mpull($result, 'getISO8601'), pht('Simple date list.'));
     $list_a = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'));
     $list_b = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'));
     $source_a = id(new PhutilCalendarRecurrenceList())->setDates($list_a);
     $source_b = id(new PhutilCalendarRecurrenceList())->setDates($list_b);
     $set = id(new PhutilCalendarRecurrenceSet())->addSource($source_a)->addSource($source_b);
     $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'));
     $result = $set->getEventsBetween(null, null, 0xffff);
     $this->assertEqual(mpull($expect, 'getISO8601'), mpull($result, 'getISO8601'), pht('Multiple date lists.'));
     $list_a = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'));
     $list_b = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'));
     $list_c = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160109T120000Z'));
     $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'));
     $list_a = id(new PhutilCalendarRecurrenceList())->setDates($list_a);
     $list_b = id(new PhutilCalendarRecurrenceList())->setDates($list_b);
     $list_c = id(new PhutilCalendarRecurrenceList())->setDates($list_c)->setIsExceptionSource(true);
     $date_set = id(new PhutilCalendarRecurrenceSet())->addSource($list_b)->addSource($list_c)->addSource($list_a);
     $date_set->setViewerTimezone('UTC');
     $result = $date_set->getEventsBetween(null, null, 0xffff);
     $this->assertEqual(mpull($expect, 'getISO8601'), mpull($result, 'getISO8601'), pht('Set of all results in multiple lists with exclusions.'));
     $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'));
     $result = $date_set->getEventsBetween(null, null, 1);
     $this->assertEqual(mpull($expect, 'getISO8601'), mpull($result, 'getISO8601'), pht('Multiple lists, one result.'));
     $expect = array(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'));
     $result = $date_set->getEventsBetween(PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'));
     $this->assertEqual(mpull($expect, 'getISO8601'), mpull($result, 'getISO8601'), pht('Multiple lists, time window.'));
 }
コード例 #4
0
 private function newDateTimeFromProperty(array $parameters, array $value)
 {
     $value = $value['value'];
     if (!$value) {
         $this->raiseParseFailure(self::PARSE_EMPTY_DATETIME, pht('Expected DATE-TIME to have exactly one value, found none.'));
     }
     if (count($value) > 1) {
         $this->raiseParseFailure(self::PARSE_MANY_DATETIME, pht('Expected DATE-TIME to have exactly one value, found more than ' . 'one.'));
     }
     $value = head($value);
     $tzid = $this->getScalarParameterValue($parameters, 'TZID');
     if (preg_match('/Z\\z/', $value)) {
         if ($tzid) {
             $this->raiseWarning(self::WARN_TZID_UTC, pht('DATE-TIME "%s" uses "Z" to specify UTC, but also has a TZID ' . 'parameter with value "%s". This violates RFC5545. The TZID ' . 'will be ignored, and the value will be interpreted as UTC.', $value, $tzid));
         }
         $tzid = 'UTC';
     } else {
         if ($tzid !== null) {
             $map = DateTimeZone::listIdentifiers();
             $map = array_fuse($map);
             if (empty($map[$tzid])) {
                 $this->raiseParseFailure(self::PARSE_BAD_TZID, pht('Timezone "%s" is not a recognized timezone.', $tzid));
             }
         }
     }
     try {
         $datetime = PhutilCalendarAbsoluteDateTime::newFromISO8601($value, $tzid);
     } catch (Exception $ex) {
         $this->raiseParseFailure(self::PARSE_BAD_DATETIME, pht('Error parsing DATE-TIME: %s', $ex->getMessage()));
     }
     return $datetime;
 }
コード例 #5
0
        } else {
            $utc_min = $row['dateFrom'];
            $utc_max = $row['dateTo'];
        }
    }
    $utc_until = $row['recurrenceEndDate'];
    $start_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_min);
    if ($is_all_day) {
        $start_datetime->setIsAllDay(true);
    }
    $end_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_max);
    if ($is_all_day) {
        $end_datetime->setIsAllDay(true);
    }
    if ($utc_until) {
        $until_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_until);
    } else {
        $until_datetime = null;
    }
    $parameters['startDateTime'] = $start_datetime->toDictionary();
    $parameters['endDateTime'] = $end_datetime->toDictionary();
    if ($until_datetime) {
        $parameters['untilDateTime'] = $until_datetime->toDictionary();
    }
    queryfx($conn, 'UPDATE %T SET parameters = %s WHERE id = %d', $table_name, phutil_json_encode($parameters), $row['id']);
}
// Generate UTC epochs for all events. We can't readily do this one at a
// time because instance UTC epochs rely on having the parent event.
$viewer = PhabricatorUser::getOmnipotentUser();
$all_events = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->execute();
foreach ($all_events as $event) {
コード例 #6
0
 private function newDateTimeFromDictionary(array $dict)
 {
     $datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($dict);
     return $this->newDateTimeFromDateTime($datetime);
 }
コード例 #7
0
 protected final function renderDate($epoch)
 {
     $viewer = $this->getViewer();
     // We accept either epoch timestamps or dictionaries describing a
     // PhutilCalendarDateTime.
     if (is_array($epoch)) {
         $datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($epoch)->setViewerTimezone($viewer->getTimezoneIdentifier());
         $all_day = $datetime->getIsAllDay();
         $epoch = $datetime->getEpoch();
     } else {
         $all_day = false;
     }
     if ($all_day) {
         $display = phabricator_date($epoch, $viewer);
     } else {
         $display = phabricator_datetime($epoch, $viewer);
         // When rendering to text, we explicitly render the offset from UTC to
         // provide context to the date: the mail may be generating with the
         // server's settings, or the user may later refer back to it after
         // changing timezones.
         if ($this->isTextMode()) {
             $offset = $viewer->getTimeZoneOffsetInHours();
             if ($offset >= 0) {
                 $display = pht('%s (UTC+%d)', $display, $offset);
             } else {
                 $display = pht('%s (UTC-%d)', $display, abs($offset));
             }
         }
     }
     return $this->renderValue($display);
 }
コード例 #8
0
 private function getRecurrenceWindowEnd(PhabricatorCalendarEvent $event, $generate_until)
 {
     $end_epochs = array();
     if ($generate_until) {
         $end_epochs[] = $generate_until;
     }
     $until_epoch = $event->getUntilDateTimeEpoch();
     if ($until_epoch) {
         $end_epochs[] = $until_epoch;
     }
     if (!$end_epochs) {
         return null;
     }
     return PhutilCalendarAbsoluteDateTime::newFromEpoch(min($end_epochs));
 }
コード例 #9
0
 private function getNodeInstanceEpoch(PhutilCalendarEventNode $node)
 {
     $instance_iso = $node->getRecurrenceID();
     if (strlen($instance_iso)) {
         $instance_datetime = PhutilCalendarAbsoluteDateTime::newFromISO8601($instance_iso);
         $instance_epoch = $instance_datetime->getEpoch();
     } else {
         $instance_epoch = null;
     }
     return $instance_epoch;
 }
コード例 #10
0
 public function newIntermediateEventNode(PhabricatorUser $viewer)
 {
     $base_uri = new PhutilURI(PhabricatorEnv::getProductionURI('/'));
     $domain = $base_uri->getDomain();
     $uid = $this->getPHID() . '@' . $domain;
     $created = $this->getDateCreated();
     $created = PhutilCalendarAbsoluteDateTime::newFromEpoch($created);
     $modified = $this->getDateModified();
     $modified = PhutilCalendarAbsoluteDateTime::newFromEpoch($modified);
     $date_start = $this->getDateFrom();
     $date_start = PhutilCalendarAbsoluteDateTime::newFromEpoch($date_start);
     $date_end = $this->getDateTo();
     $date_end = PhutilCalendarAbsoluteDateTime::newFromEpoch($date_end);
     if ($this->getIsAllDay()) {
         $date_start->setIsAllDay(true);
         $date_end->setIsAllDay(true);
     }
     $host_phid = $this->getHostPHID();
     $invitees = $this->getInvitees();
     foreach ($invitees as $key => $invitee) {
         if ($invitee->isUninvited()) {
             unset($invitees[$key]);
         }
     }
     $phids = array();
     $phids[] = $host_phid;
     foreach ($invitees as $invitee) {
         $phids[] = $invitee->getInviteePHID();
     }
     $handles = $viewer->loadHandles($phids);
     $host_handle = $handles[$host_phid];
     $host_name = $host_handle->getFullName();
     $host_uri = $host_handle->getURI();
     $host_uri = PhabricatorEnv::getURI($host_uri);
     $organizer = id(new PhutilCalendarUserNode())->setName($host_name)->setURI($host_uri);
     $attendees = array();
     foreach ($invitees as $invitee) {
         $invitee_phid = $invitee->getInviteePHID();
         $invitee_handle = $handles[$invitee_phid];
         $invitee_name = $invitee_handle->getFullName();
         $invitee_uri = $invitee_handle->getURI();
         $invitee_uri = PhabricatorEnv::getURI($invitee_uri);
         switch ($invitee->getStatus()) {
             case PhabricatorCalendarEventInvitee::STATUS_ATTENDING:
                 $status = PhutilCalendarUserNode::STATUS_ACCEPTED;
                 break;
             case PhabricatorCalendarEventInvitee::STATUS_DECLINED:
                 $status = PhutilCalendarUserNode::STATUS_DECLINED;
                 break;
             case PhabricatorCalendarEventInvitee::STATUS_INVITED:
             default:
                 $status = PhutilCalendarUserNode::STATUS_INVITED;
                 break;
         }
         $attendees[] = id(new PhutilCalendarUserNode())->setName($invitee_name)->setURI($invitee_uri)->setStatus($status);
     }
     $node = id(new PhutilCalendarEventNode())->setUID($uid)->setName($this->getName())->setDescription($this->getDescription())->setCreatedDateTime($created)->setModifiedDateTime($modified)->setStartDateTime($date_start)->setEndDateTime($date_end)->setOrganizer($organizer)->setAttendees($attendees);
     return $node;
 }
コード例 #11
0
 public function testICSWriterUsers()
 {
     $event = id(new PhutilCalendarEventNode())->setUID('office-party')->setName('Office Party')->setCreatedDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z'))->setModifiedDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z'))->setStartDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T200000Z'))->setEndDateTime(PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T230000Z'))->setOrganizer(id(new PhutilCalendarUserNode())->setName('Big Boss')->setURI('mailto:big.boss@example.com'))->addAttendee(id(new PhutilCalendarUserNode())->setName('Milton')->setStatus(PhutilCalendarUserNode::STATUS_INVITED)->setURI('mailto:milton@example.com'))->addAttendee(id(new PhutilCalendarUserNode())->setName('Nancy')->setStatus(PhutilCalendarUserNode::STATUS_ACCEPTED)->setURI('mailto:nancy@example.com'));
     $ics_data = $this->writeICSSingleEvent($event);
     $this->assertICS('writer-office-party.ics', $ics_data);
 }