Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,21 @@ def test_order(self):
self._config.set_order(None)
self.assertRaises(KeyError, self._config.get_order)

def test_refreshrate(self):
self.assertRaises(KeyError, self._config.get_refreshrate)
self._config.set_refreshrate("PT1H")
self.assertEqual("PT1H", self._config.get_refreshrate())
self._config.set_refreshrate(None)
self.assertRaises(KeyError, self._config.get_refreshrate)

def test_timezone(self):
self.assertRaises(KeyError, self._config.get_timezone)
tz_data = "BEGIN:VTIMEZONE\r\nTZID:America/New_York\r\nEND:VTIMEZONE"
self._config.set_timezone(tz_data)
self.assertEqual(tz_data, self._config.get_timezone())
self._config.set_timezone(None)
self.assertRaises(KeyError, self._config.get_timezone)


class FileMetadataTests(TestCase, MetadataTests):
def setUp(self):
Expand Down
53 changes: 53 additions & 0 deletions xandikos/store/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,38 @@ def get_order(self) -> str:
def set_order(self, order: str) -> None:
raise NotImplementedError(self.set_order)

def get_refreshrate(self) -> str:
"""Get the recommended refresh rate for this collection.

Returns: Refresh rate in ISO 8601 duration format
Raises: KeyError if not set
"""
raise NotImplementedError(self.get_refreshrate)

def set_refreshrate(self, refreshrate: str | None) -> None:
"""Set the recommended refresh rate for this collection.

Args:
refreshrate: Refresh rate in ISO 8601 duration format, or None to unset
"""
raise NotImplementedError(self.set_refreshrate)

def get_timezone(self) -> str:
"""Get the calendar timezone.

Returns: iCalendar VTIMEZONE component as a string
Raises: KeyError if not set
"""
raise NotImplementedError(self.get_timezone)

def set_timezone(self, timezone: str | None) -> None:
"""Set the calendar timezone.

Args:
timezone: iCalendar VTIMEZONE component as a string, or None to unset
"""
raise NotImplementedError(self.set_timezone)


class FileBasedCollectionMetadata(CollectionMetadata):
"""Metadata for a configuration."""
Expand Down Expand Up @@ -172,3 +204,24 @@ def set_order(self, order):
del self._configparser["calendar"]["order"]
else:
self._configparser["calendar"]["order"] = order
self._save("Set calendar order.")

def get_refreshrate(self):
return self._configparser["DEFAULT"]["refreshrate"]

def set_refreshrate(self, refreshrate):
if refreshrate is not None:
self._configparser["DEFAULT"]["refreshrate"] = refreshrate
else:
del self._configparser["DEFAULT"]["refreshrate"]
self._save("Set refresh rate.")

def get_timezone(self):
return self._configparser["DEFAULT"]["timezone"]

def set_timezone(self, timezone):
if timezone is not None:
self._configparser["DEFAULT"]["timezone"] = timezone
else:
del self._configparser["DEFAULT"]["timezone"]
self._save("Set timezone.")
30 changes: 30 additions & 0 deletions xandikos/store/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,36 @@ def set_order(self, order):
config.set(b"xandikos", b"calendar-order", order.encode("utf-8"))
self._write_config(config)

def get_refreshrate(self):
config = self._repo.get_config()
refreshrate = config.get(b"xandikos", b"refreshrate")
if refreshrate == b"":
raise KeyError
return refreshrate.decode(DEFAULT_ENCODING)

def set_refreshrate(self, refreshrate):
config = self._repo.get_config()
if refreshrate is not None:
config.set(b"xandikos", b"refreshrate", refreshrate.encode(DEFAULT_ENCODING))
else:
config.set(b"xandikos", b"refreshrate", b"")
self._write_config(config)

def get_timezone(self):
config = self._repo.get_config()
timezone = config.get(b"xandikos", b"timezone")
if timezone == b"":
raise KeyError
return timezone.decode(DEFAULT_ENCODING)

def set_timezone(self, timezone):
config = self._repo.get_config()
if timezone is not None:
config.set(b"xandikos", b"timezone", timezone.encode(DEFAULT_ENCODING))
else:
config.set(b"xandikos", b"timezone", b"")
self._write_config(config)


class GitStore(Store):
"""A Store backed by a Git Repository."""
Expand Down
11 changes: 4 additions & 7 deletions xandikos/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,12 +528,10 @@ def get_quota_available_bytes(self):
raise KeyError

def get_refreshrate(self):
# TODO(jelmer): Support setting refreshrate
raise KeyError
return self.store.config.get_refreshrate()

def set_refreshrate(self, value):
# TODO(jelmer): Store refreshrate
raise NotImplementedError(self.set_refreshrate)
self.store.config.set_refreshrate(value)


class Collection(StoreBasedCollection, webdav.Collection):
Expand Down Expand Up @@ -604,11 +602,10 @@ def set_calendar_order(self, order):
self.store.config.set_order(order)

def get_calendar_timezone(self):
# TODO(jelmer): Read from config
raise KeyError
return self.store.config.get_timezone()

def set_calendar_timezone(self, content):
raise NotImplementedError(self.set_calendar_timezone)
self.store.config.set_timezone(content)

def _ensure_metadata_directory(self):
"""Ensure .xandikos/ metadata directory exists, migrating from old .xandikos config file if needed."""
Expand Down
Loading