[CalendarServer-changes] [15132] CalendarServer/branches/users/cdaboo/rscale

source_changes at macosforge.org source_changes at macosforge.org
Thu Sep 17 11:15:38 PDT 2015


Revision: 15132
          http://trac.calendarserver.org//changeset/15132
Author:   cdaboo at apple.com
Date:     2015-09-17 11:15:38 -0700 (Thu, 17 Sep 2015)
Log Message:
-----------
RSCALE support.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/rscale/requirements-dev.txt
    CalendarServer/branches/users/cdaboo/rscale/requirements-stable.txt
    CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/caldavxml.py
    CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/ical.py
    CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/resource.py
    CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/stdconfig.py
    CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/storebridge.py

Modified: CalendarServer/branches/users/cdaboo/rscale/requirements-dev.txt
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/requirements-dev.txt	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/requirements-dev.txt	2015-09-17 18:15:38 UTC (rev 15132)
@@ -8,4 +8,4 @@
 q
 tl.eggdeps
 --editable svn+http://svn.calendarserver.org/repository/calendarserver/CalDAVClientLibrary/trunk@14856#egg=CalDAVClientLibrary
---editable svn+http://svn.calendarserver.org/repository/calendarserver/CalDAVTester/trunk@15066#egg=CalDAVTester
+--editable svn+http://svn.calendarserver.org/repository/calendarserver/CalDAVTester/trunk@15130#egg=CalDAVTester

Modified: CalendarServer/branches/users/cdaboo/rscale/requirements-stable.txt
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/requirements-stable.txt	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/requirements-stable.txt	2015-09-17 18:15:38 UTC (rev 15132)
@@ -36,7 +36,7 @@
             #pyOpenSSL
         pycrypto==2.6.1
 
-    --editable svn+http://svn.calendarserver.org/repository/calendarserver/twext/trunk@15118#egg=twextpy
+    --editable svn+http://svn.calendarserver.org/repository/calendarserver/twext/trunk@15129#egg=twextpy
         cffi==1.1.0
             pycparser==2.13
         #twisted
@@ -70,7 +70,7 @@
 
     --editable svn+http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk@13420#egg=kerberos
 
-    --editable svn+http://svn.calendarserver.org/repository/calendarserver/PyCalendar/trunk@15020#egg=pycalendar
+    --editable svn+http://svn.calendarserver.org/repository/calendarserver/PyCalendar/branches/rscale@15020#egg=pycalendar
     python-dateutil==1.5  # Note: v2.0+ is for Python 3
     pytz==2015.4
 

Modified: CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/caldavxml.py
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/caldavxml.py	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/caldavxml.py	2015-09-17 18:15:38 UTC (rev 15132)
@@ -1467,6 +1467,33 @@
 
 
 #
+# RFC7529 (RSCALE)
+#
+
+ at registerElement
+class SupportedRscaleSet (CalDAVElement):
+    """
+    List of supported RSCALE values.
+    """
+    name = "supported-rscale-set"
+
+    allowed_children = {(dav_namespace, "supported-rscale"): (0, None)}
+
+    hidden = True
+    protected = True
+
+
+
+ at registerElement
+class SupportedRscale (CalDAVTextElement):
+    """
+    A supported RSCALE value.
+    """
+    name = "supported-rscale"
+
+
+
+#
 # Extensions to ResourceType
 #
 

Modified: CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/ical.py
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/ical.py	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/ical.py	2015-09-17 18:15:38 UTC (rev 15132)
@@ -57,8 +57,10 @@
 from pycalendar.componentbase import ComponentBase
 from pycalendar.datetime import DateTime
 from pycalendar.duration import Duration
-from pycalendar.exceptions import ErrorBase
+from pycalendar.exceptions import ErrorBase, InvalidProperty
 from pycalendar.period import Period
+from pycalendar.icalendar.icudatetime import ICUDateTime
+from pycalendar.icalendar.exceptions import InvalidRscaleError
 from pycalendar.icalendar.property import Property as PyProperty
 from pycalendar.timezone import Timezone
 from pycalendar.utcoffsetvalue import UTCOffsetValue
@@ -418,6 +420,11 @@
 
 
     @classmethod
+    def allowedRscales(cls):
+        return tuple(map(str.upper, sorted(ICUDateTime.allRSCALEs())))
+
+
+    @classmethod
     def allFromString(clazz, string, format=None):
         """
         Just default to reading a single VCALENDAR
@@ -481,9 +488,14 @@
         errmsg = "Unknown"
         try:
             result = Calendar.parseData(data, format)
-        except ErrorBase, e:
+        except InvalidProperty as e:
+            if isinstance(e.mCause, InvalidRscaleError):
+                raise e.mCause
             errmsg = "{0}: {1}".format(e.mReason, e.mData,)
             result = None
+        except ErrorBase as e:
+            errmsg = "{0}: {1}".format(e.mReason, e.mData,)
+            result = None
         if not result:
             if isstream:
                 data.seek(0)

Modified: CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/resource.py	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/resource.py	2015-09-17 18:15:38 UTC (rev 15132)
@@ -470,6 +470,10 @@
                 caldavxml.SupportedCalendarData.qname(),
                 customxml.GETCTag.qname(),
             )
+            if config.EnableRSCALE:
+                baseProperties += (
+                    caldavxml.SupportedRscaleSet.qname(),
+                )
             if config.MaxResourceSize:
                 baseProperties += (
                     caldavxml.MaxResourceSize.qname(),
@@ -653,6 +657,13 @@
         elif qname == caldavxml.ScheduleCalendarTransp.qname() and self.isCalendarCollection():
             returnValue(caldavxml.ScheduleCalendarTransp(caldavxml.Opaque() if self._newStoreObject.isUsedForFreeBusy() else caldavxml.Transparent()))
 
+        elif qname == caldavxml.SupportedRscaleSet.qname() and self.isPseudoCalendarCollection():
+            if config.EnableRSCALE:
+                returnValue(caldavxml.SupportedRscaleSet(*[
+                    caldavxml.SupportedRscale.fromString(name)
+                    for name in Component.allowedRscales()
+                ]))
+
         elif qname == carddavxml.SupportedAddressData.qname() and self.isAddressBookCollection():
             # CardDAV, section 6.2.2
             dataTypes = []
@@ -2479,6 +2490,11 @@
                 caldavxml.TimezoneServiceSet.qname(),
             )
 
+        if config.EnableRSCALE:
+            existing += (
+                caldavxml.SupportedRscaleSet.qname(),
+            )
+
         return existing
 
 
@@ -2537,6 +2553,13 @@
             else:
                 returnValue(None)
 
+        elif qname == caldavxml.SupportedRscaleSet.qname():
+            if config.EnableRSCALE:
+                returnValue(caldavxml.SupportedRscaleSet(*[
+                    caldavxml.SupportedRscale.fromString(name)
+                    for name in Component.allowedRscales()
+                ]))
+
         elif qname in DefaultAlarmPropertyMixin.ALARM_PROPERTIES:
             returnValue(self.getDefaultAlarmProperty(qname))
 

Modified: CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/stdconfig.py
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/stdconfig.py	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/stdconfig.py	2015-09-17 18:15:38 UTC (rev 15132)
@@ -547,6 +547,8 @@
     "EnableTimezonesByReference" : True, # Strip out VTIMEZONES that are known
     "UsePackageTimezones"        : False, # Use timezone data from twistedcaldav.zoneinfo - don't copy to Data directory
 
+    "EnableRSCALE"               : False, # Turn on support for non-Gregorian recurrences (RSCALE)
+
     "EnableBatchUpload"       : True, # POST batch uploads
     "MaxResourcesBatchUpload" : 100, # Maximum number of resources in a batch POST
     "MaxBytesBatchUpload"     : 10485760, # Maximum size of a batch POST (10 MB)

Modified: CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/storebridge.py
===================================================================
--- CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/storebridge.py	2015-09-17 18:12:16 UTC (rev 15131)
+++ CalendarServer/branches/users/cdaboo/rscale/twistedcaldav/storebridge.py	2015-09-17 18:15:38 UTC (rev 15132)
@@ -98,6 +98,7 @@
 )
 from txweb2.stream import ProducerStream, readStream, MemoryStream
 from twistedcaldav.timezones import TimezoneException
+from pycalendar.icalendar.exceptions import InvalidRscaleError
 
 
 """
@@ -2848,12 +2849,21 @@
 
             try:
                 component = Component.fromString(calendardata, format)
-            except ValueError, e:
-                log.error(str(e))
+            except InvalidRscaleError as e:
+                msg = "Invalid RSCALE value: {ex}\n{ical}".format(ex=e.mReason, ical=calendardata)
+                log.error(msg)
                 raise HTTPError(ErrorResponse(
                     responsecode.FORBIDDEN,
+                    (caldav_namespace, "supported-rscale"),
+                    "Can't parse calendar data: {msg}".format(msg=msg),
+                ))
+            except ValueError as e:
+                msg = str(e)
+                log.error(msg)
+                raise HTTPError(ErrorResponse(
+                    responsecode.FORBIDDEN,
                     (caldav_namespace, "valid-calendar-data"),
-                    "Can't parse calendar data: %s" % (str(e),)
+                    "Can't parse calendar data: {msg}".format(msg=msg),
                 ))
 
             # Look for client fixes
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20150917/0b2fddb2/attachment-0001.html>


More information about the calendarserver-changes mailing list