diff --git a/NEWS.rst b/NEWS.rst index f8e6e61..2488135 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -8,6 +8,8 @@ * Clean rights manager based on regular expressions (by Sweil) * Support of contacts for Apple's clients +* Support colors (by Jochen Sprickerhof) +* Decode URLs in XML (by Jean-Marc Martins) 0.8 - Rainbow diff --git a/radicale/ical.py b/radicale/ical.py index 94a42df..6da00a1 100644 --- a/radicale/ical.py +++ b/radicale/ical.py @@ -27,7 +27,8 @@ Define the main classes of a collection as seen from the server. import os import posixpath -import uuid +from uuid import uuid4 +from random import randint from contextlib import contextmanager @@ -102,7 +103,7 @@ class Item(object): self.text = self.text.replace( "\nEND:", "\nX-RADICALE-NAME:%s\nEND:" % self._name) else: - self._name = str(uuid.uuid4()) + self._name = str(uuid4()) self.text = self.text.replace( "\nEND:", "\nX-RADICALE-NAME:%s\nEND:" % self._name) @@ -437,6 +438,14 @@ class Collection(object): with self.props as props: return props.get("D:displayname", self.path.split(os.path.sep)[-1]) + @property + def color(self): + """Collection color.""" + with self.props as props: + if "A:calendar-color" not in props: + props["A:calendar-color"] = "#%x" % randint(0, 255 ** 3 - 1) + return props["A:calendar-color"] + @property def headers(self): """Find headers items in collection.""" diff --git a/radicale/rights.py b/radicale/rights.py index d8e3228..232fec2 100644 --- a/radicale/rights.py +++ b/radicale/rights.py @@ -55,7 +55,7 @@ TYPE = config.get("rights", "type").lower() DEFINED_RIGHTS = { "owner_write": "[r]\nuser:.*\ncollection:.*\npermission:r\n" "[w]\nuser:.*\ncollection:^%(login)s/.+$\npermission:w", - "owner_only": "[rw]\nuser:.\ncollection: ^%(login)s/.+$\npermission:rw"} + "owner_only": "[rw]\nuser:.*\ncollection:^%(login)s/.+$\npermission:rw"} def _read_from_sections(user, collection, permission): diff --git a/radicale/xmlutils.py b/radicale/xmlutils.py index 8402765..72c193c 100644 --- a/radicale/xmlutils.py +++ b/radicale/xmlutils.py @@ -48,6 +48,7 @@ from . import client, config, ical NAMESPACES = { + "A": "http://apple.com/ns/ical/", "C": "urn:ietf:params:xml:ns:caldav", "CR": "urn:ietf:params:xml:ns:carddav", "D": "DAV:", @@ -226,6 +227,7 @@ def propfind(path, xml_request, collections, user=None): _tag("D", "displayname"), _tag("D", "owner"), _tag("D", "getetag"), + _tag("A", "calendar-color"), _tag("CS", "getctag")] # Writing answer @@ -340,6 +342,8 @@ def _propfind_response(path, item, props, user): item.tag, item.headers, item.timezones) elif tag == _tag("D", "displayname"): element.text = item.name + elif tag == _tag("A", "calendar-color"): + element.text = item.color else: human_tag = _tag_from_clark(tag) if human_tag in collection_props: