Procházet zdrojové kódy

Enhance collection discovering

When the request path leads to a non-existing item, try to create the
Collection object according to an existing collection at request path's
parent.

This change means that the requests whose path leads to a collection
that doesn't exist (at least MKCOL, MKCALENDAR and PUT) need to rely on
the request path more than on the Collection path. It was already done
for PUT, it's been fixed for MKCOL and MKCALENDAR.

Fix #378.
Guillaume Ayoub před 10 roky
rodič
revize
6adc7f5fed
2 změnil soubory, kde provedl 11 přidání a 4 odebrání
  1. 2 2
      radicale/__init__.py
  2. 9 2
      radicale/storage.py

+ 2 - 2
radicale/__init__.py

@@ -430,7 +430,7 @@ class Application(object):
         # TODO: use this?
         # timezone = props.get("C:calendar-timezone")
         collection = storage.Collection.create_collection(
-            collection.path, tag="VCALENDAR")
+            environ["PATH_INFO"], tag="VCALENDAR")
         for key, value in props.items():
             collection.set_meta(key, value)
         return client.CREATED, {}, None
@@ -444,7 +444,7 @@ class Application(object):
         collection = write_collections[0]
 
         props = xmlutils.props_from_request(content)
-        collection = storage.Collection.create_collection(collection.path)
+        collection = storage.Collection.create_collection(environ["PATH_INFO"])
         for key, value in props.items():
             collection.set_meta(key, value)
         return client.CREATED, {}, None

+ 9 - 2
radicale/storage.py

@@ -175,8 +175,15 @@ class Collection:
             return
 
         # Try to guess if the path leads to a collection or an item
-        if os.path.isfile(path_to_filesystem(FOLDER, sane_path)):
-            attributes.pop()
+        if not os.path.isdir(path_to_filesystem(FOLDER, sane_path)):
+            # path is not a collection
+            if os.path.isfile(path_to_filesystem(FOLDER, sane_path)):
+                # path is an item
+                attributes.pop()
+            elif os.path.isdir(path_to_filesystem(FOLDER, *attributes[:-1])):
+                # path parent is a collection
+                attributes.pop()
+            # TODO: else: return?
 
         path = "/".join(attributes)