Skip to content

Commit

Permalink
show partstat status and read email addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
geier committed Jun 15, 2023
1 parent fabce96 commit 25c07ea
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ not released yet
* NEW event format option `status-symbol` which represents the status of an
event with a symbol (e.g. `` for confirmed, `` for cancelled, `?` for
tentative)
* NEW event format option `partstat-symbol` which represents the participation
status of an event with a symbol (e.g. `` for accepted, `` for declined,
`?` for tentative); partication status is shown for the email address
configured for the event's calendar

0.11.2
======
Expand Down
3 changes: 3 additions & 0 deletions doc/source/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@ Several options are common to almost all of :program:`khal`'s commands
status-symbol
The status of the event as a symbol, `` or `` or `?`.

partstat-symbol
The participation status of the event as a symbol, `` or `` or `?`.

cancelled
The string `CANCELLED` (plus one blank) if the event's status is
cancelled, otherwise nothing.
Expand Down
1 change: 1 addition & 0 deletions khal/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ def build_collection(conf, selection):
'color': cal['color'],
'priority': cal['priority'],
'ctype': cal['type'],
'address': cal['address'],
}
collection = khalendar.CalendarCollection(
calendars=props,
Expand Down
28 changes: 28 additions & 0 deletions khal/khalendar/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ def __init__(self,
color: Optional[str] = None,
start: Optional[dt.datetime] = None,
end: Optional[dt.datetime] = None,
address: Optional[str] = None,
):
"""
:param start: start datetime of this event instance
Expand All @@ -88,6 +89,7 @@ def __init__(self,
self.color = color
self._start: dt.datetime
self._end: dt.datetime
self.address = address

if start is None:
self._start = self._vevents[self.ref]['DTSTART'].dt
Expand Down Expand Up @@ -291,6 +293,8 @@ def symbol_strings(self) -> Dict[str, str]:
'cancelled': '\N{Cross mark}',
'confirmed': '\N{Heavy check mark}',
'tentative': '\N{White question mark ornament}',
'declined': '\N{Cross mark}',
'accepted': '\N{Heavy check mark}',
}
else:
return {
Expand All @@ -303,6 +307,8 @@ def symbol_strings(self) -> Dict[str, str]:
'cancelled': 'X',
'confirmed': 'V',
'tentative': '?',
'declined': 'X',
'accepted': 'V',
}

@property
Expand Down Expand Up @@ -574,6 +580,20 @@ def _status_str(self) -> str:
statusstr = ''
return statusstr

@property
def _partstat_str(self) -> str:
partstat = self.partstat
if partstat == 'ACCEPTED':
partstatstr = ' ' + self.symbol_strings['accepted']
elif partstat == 'TENTATIVE':
partstatstr = ' ' + self.symbol_strings['tentative']
elif partstat == 'DECLINED':
partstatstr = ' ' + self.symbol_strings['declined']
else:
partstatstr = ''
return partstatstr



def format(self, format_string: str, relative_to, env=None, colors: bool=True):
"""
Expand Down Expand Up @@ -702,6 +722,7 @@ def format(self, format_string: str, relative_to, env=None, colors: bool=True):
attributes["repeat-pattern"] = self.recurpattern
attributes["alarm-symbol"] = self._alarm_str
attributes["status-symbol"] = self._status_str
attributes["partstat-symbol"] = self._partstat_str
attributes["title"] = self.summary
attributes["organizer"] = self.organizer.strip()
attributes["description"] = self.description.strip()
Expand Down Expand Up @@ -781,6 +802,13 @@ def delete_instance(self, instance: dt.datetime) -> None:
def status(self) -> str:
return self._vevents[self.ref].get('STATUS', '')

@property
def partstat(self) -> Optional[str]:
for attendee in self._vevents[self.ref].get('ATTENDEE', []):
print(attendee)
if attendee == 'mailto:' + self.address:
return attendee.params.get('PARTSTAT', '')


class DatetimeEvent(Event):
pass
Expand Down
1 change: 1 addition & 0 deletions khal/khalendar/khalendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ def _construct_event(self,
ref=ref,
color=self._calendars[calendar]['color'],
readonly=self._calendars[calendar]['readonly'],
address=self._calendars[calendar]['address'],
)
return event

Expand Down
25 changes: 25 additions & 0 deletions tests/event_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -673,3 +673,28 @@ def test_timezone_creation_with_arbitrary_dates(freeze_ts, event_time):
assert len(vtimezone) > 14
assert 'BEGIN:STANDARD' in vtimezone
assert 'BEGIN:DAYLIGHT' in vtimezone


def test_partstat():
FORMAT_CALENDAR = ('{calendar-color}{partstat-symbol}{status-symbol}{start-end-time-style} ({calendar}) '
'{title} [{location}]{repeat-symbol}')

event = Event.fromString(_get_text('event_dt_partstat'), address='[email protected]', **EVENT_KWARGS)
assert event.partstat == 'ACCEPTED'
assert event.format(FORMAT_CALENDAR, dt.date(2014, 4, 9)) == ' ✔09:30-10:30 (foobar) An Event []\x1b[0m'

event = Event.fromString(_get_text('event_dt_partstat'), address='[email protected]', **EVENT_KWARGS)
assert event.partstat == 'DECLINED'
assert event.format(FORMAT_CALENDAR, dt.date(2014, 4, 9)) == ' ❌09:30-10:30 (foobar) An Event []\x1b[0m'

event = Event.fromString(_get_text('event_dt_partstat'), address='[email protected]', **EVENT_KWARGS)
assert event.partstat == 'ACCEPTED'
assert event.format(FORMAT_CALENDAR, dt.date(2014, 4, 9)) == ' ✔09:30-10:30 (foobar) An Event []\x1b[0m'

@pytest.mark.xfail
def test_partstat_deligated():
event = Event.fromString(_get_text('event_dt_partstat'), address='[email protected]', **EVENT_KWARGS)
assert event.partstat == 'ACCEPTED'

event = Event.fromString(_get_text('event_dt_partstat'), address='[email protected]', **EVENT_KWARGS)
assert event.partstat == 'ACCEPTED'

0 comments on commit 25c07ea

Please sign in to comment.