Kaynağa Gözat

Merge pull request #466 from Unrud/fixpath

Set correct path for child collections
Guillaume Ayoub 9 yıl önce
ebeveyn
işleme
9f2cbb81a3
3 değiştirilmiş dosya ile 20 ekleme ve 2 silme
  1. 2 1
      radicale/storage.py
  2. 16 0
      radicale/tests/test_base.py
  3. 2 1
      radicale/xmlutils.py

+ 2 - 1
radicale/storage.py

@@ -497,8 +497,9 @@ class Collection(BaseCollection):
                 continue
             child_filesystem_path = path_to_filesystem(filesystem_path, href)
             if os.path.isdir(child_filesystem_path):
+                child_path = posixpath.join(path, href)
                 child_principal = len(attributes) == 0
-                yield cls(child_filesystem_path, child_principal)
+                yield cls(child_path, child_principal)
 
     @classmethod
     def create_collection(cls, href, collection=None, props=None):

+ 16 - 0
radicale/tests/test_base.py

@@ -20,6 +20,7 @@ Radicale tests with simple requests.
 """
 
 import logging
+import posixpath
 import shutil
 import tempfile
 
@@ -188,6 +189,21 @@ class BaseRequests:
         status, headers, answer = self.request("GET", "/event1.ics")
         assert status == 404
 
+    def test_propfind(self):
+        calendar_path = "/calendar.ics/"
+        self.request("MKCALENDAR", calendar_path)
+        event = get_file_content("event1.ics")
+        event_path = posixpath.join(calendar_path, "event.ics")
+        self.request("PUT", event_path, event)
+        status, headers, answer = self.request("PROPFIND", "/", HTTP_DEPTH="1")
+        assert status == 207
+        assert "href>/</" in answer
+        assert "href>%s</" % calendar_path in answer
+        status, headers, answer = self.request("PROPFIND", calendar_path, HTTP_DEPTH="1")
+        assert status == 207
+        assert "href>%s</" % calendar_path in answer
+        assert "href>%s</" % event_path in answer
+
     def test_multiple_events_with_same_uid(self):
         """Add two events with the same UID."""
         self.request("MKCOL", "/calendar.ics/")

+ 2 - 1
radicale/xmlutils.py

@@ -541,7 +541,8 @@ def _propfind_response(path, item, props, user, write=False):
 
     href = ET.Element(_tag("D", "href"))
     if is_collection:
-        uri = item.path
+        # Some clients expect collections to end with /
+        uri = item.path + "/"
     else:
         # TODO: fix this
         if path.split("/")[-1] == item.href: