Planning¶
These functions are dedicated to the planning of events or todos across one or more calendars,
based on a planner config to determine how to plan. This config is
written to a planners.yaml file:
- name: appointments
  title: Appointments
  write:
    type: event
  find:
    type: freebusy
    default_duration: 30
  calendars:
    - booking
  constraints:
    - holidays
It can also be edited in the Studio under the "Calendars" tab.
The planners.yaml must adhere to the following schema:
items:
  additionalProperties: false
  properties:
    calendars:
      items:
        pattern: ^[a-z][a-zA-Z0-9_]*$
        title: Identifier
        type: string
      maxItems: 20
      type: array
    constraints:
      items:
        pattern: ^[a-z][a-zA-Z0-9_]*$
        title: Identifier
        type: string
      type: array
    find:
      additionalProperties: false
      properties:
        default_duration:
          minimum: 5
          type: number
        max_days:
          minimum: 1
          type: number
        offset_from_now_in_m:
          minimum: 0
          type: number
        type:
          enum:
            - slot
            - freebusy
          type: string
      required:
        - type
      type: object
    name:
      type: string
    title:
      type: string
    write:
      additionalProperties: false
      properties:
        type:
          enum:
            - event
            - todo
          type: string
      required:
        - type
      type: object
  required:
    - name
    - title
    - write
    - find
    - calendars
  type: object
type: array
To make it easier to work with in tests, you can provide in-memory calendars wherever needed. Database and in-memory calendars can be freely mixed.
_temp_cal = Calendaring.new_in_memory_calendar()
# Add event, slot, etc..
_planner = @my_planner
_planner.calendars = [_temp_cal]
_planner.constraints = [_temp_cal]
# To overwrite where the slots should come from:
_planner.slot_calendar = _temp_cal
Planning.delete(config, object)¶
Delete the given object.
Returns a boolean indicating if the deletion succeeded. If the write calendar
from the config doesn't match the given object, true will be returned, but
no object will be deleted.
Examples:
object = Planning.get(config, id)
Planning.delete(config, object)
Planning.find(config, opts \\ [])¶
Find an available slot in which to plan an event/todo.
Depending on the configuration, this will call Calendaring.suggest_events or
Calendaring.available_slots with the given options. The options that were
passed in through the second argument will overwrite defaults derived from the
config.
Options:
:amount: The maximum amount of slots to return.:skip: The number of slots to skip. Defaults to 0.:until: Until when to generate the slots. Defaults tonow + max_days, wheremax_daysis the planner setting.:from: From when to start fetching the slots. Defaults tonow + offset_from_now_in_mwhereoffset_from_now_in_mis the planner setting.:now: The current datetime to use as "now". Useful for testing.:constraints: Additional calendars to consider. The resulting slots won't overlap with events on any of the given calendars.:duration: The duration of the slot. Example:[minutes: 30]. Defaults to thedefault_durationon the planner config.
Planning.get(config, id)¶
Get an event/todo by it's ID.
Examples:
_item = Planning.plan(my_config, %{title: "Lunch", ...})
Planning.get(my_config, _item.id)
Planning.get_slot(config, id)¶
Get a slot by its ID.
Examples:
_slot = Planning.find(_config, ...) |> first()
assert Planning.get_slot(_config, _slot.id) == _slot
Planning.list(config, opts \\ [])¶
List the events/todos based on the config and opts.
Options:
:from: a datetime from where to start searching. Defaults to now.:until: an end datetime until where to search. Defaults to[weeks: 2].:amount: The maximum amount of events to return. Defaults tonil.:skip: The number of events to skip. Defaults to 0.:user_id: The user to look for.
Planning.plan(config, slot)¶
Plan an event or todo based on the given config.
Returns nil when planning failed.
Options:
:title: A required title.:description: An optional markdown text field.:from: A required datetime string from when the event/todo starts.:until: A required datetime string from when the event/todo ends.:location: An optional string indicating where the event/todo takes place.:metadata: An optional map with arbitrary data about the event/todo.:attendees: A list of attendees. Refer toCalendaring.add_eventandCalendaring.add_todofor more information.
Planning.plan(config, slot, opts)¶
Same as plan/2, except the from and until are derived from the slot.
If slot is nil then this function behaves the same as plan/2 and from
and until must be supplied as an option.