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()); } }
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.')); }
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; }
} 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) {
private function newDateTimeFromDictionary(array $dict) { $datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($dict); return $this->newDateTimeFromDateTime($datetime); }
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); }
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)); }
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; }
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; }
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); }