Răsfoiți Sursa

Merge branch 'master' of github.com:Kozea/radicale

Guillaume Ayoub 9 ani în urmă
părinte
comite
52d67a906b

+ 1 - 1
pytest.ini

@@ -1,3 +1,3 @@
 [pytest]
-addopts = --flake8 --isort --cov radicale/ tests
+addopts = --flake8 --isort --cov radicale/ radicale/tests
 norecursedirs = dist .cache .git build *.egg-info .eggs venv

+ 26 - 15
radicale/storage.py

@@ -35,7 +35,8 @@ import time
 from contextlib import contextmanager
 from hashlib import md5
 from importlib import import_module
-from uuid import uuid4
+from itertools import groupby
+from random import getrandbits
 
 import vobject
 
@@ -231,6 +232,15 @@ class BaseCollection:
         for href in set(hrefs):
             yield self.get(href)
 
+    def pre_filtered_list(self, filters):
+        """List collection items with optional pre filtering.
+
+        This could largely improve performance of reports depending on
+        the filters and this implementation.
+        This returns all event by default
+        """
+        return [self.get(href) for href, _ in self.list()]
+
     def has(self, href):
         """Check if an item exists by its href.
 
@@ -372,25 +382,26 @@ class Collection(BaseCollection):
                 items = []
                 for content in ("vevent", "vtodo", "vjournal"):
                     items.extend(getattr(collection, "%s_list" % content, []))
-                processed_uids = []
-                for i, item in enumerate(items):
-                    uid = getattr(item, "uid", None)
-                    if uid in processed_uids:
-                        continue
+
+                def get_uid(item):
+                    return hasattr(item, 'uid') and item.uid.value
+
+                items_by_uid = groupby(
+                    sorted(items, key=get_uid), get_uid)
+
+                for uid, items in items_by_uid:
                     new_collection = vobject.iCalendar()
-                    new_collection.add(item)
-                    if uid:
-                        processed_uids.append(uid)
-                        # search for items with same UID
-                        for oitem in items[i+1:]:
-                            if getattr(oitem, "uid", None) == uid:
-                                new_collection.add(oitem)
-                    self.upload(uuid4().hex, new_collection)
+                    for item in items:
+                        new_collection.add(item)
+                    file_name = hex(getrandbits(32))[2:]
+                    self.upload(file_name, new_collection)
+
         elif tag == "VCARD":
             self.set_meta("tag", "VADDRESSBOOK")
             if collection:
                 for card in collection:
-                    self.upload(uuid4().hex, card)
+                    file_name = hex(getrandbits(32))[2:]
+                    self.upload(file_name, card)
         return self
 
     def list(self):

+ 0 - 0
tests/__init__.py → radicale/tests/__init__.py


+ 0 - 0
tests/custom/__init__.py → radicale/tests/custom/__init__.py


+ 0 - 0
tests/custom/auth.py → radicale/tests/custom/auth.py


+ 0 - 0
tests/custom/storage.py → radicale/tests/custom/storage.py


+ 0 - 0
tests/helpers.py → radicale/tests/helpers.py


+ 0 - 0
tests/static/event1.ics → radicale/tests/static/event1.ics


+ 0 - 0
tests/static/event2.ics → radicale/tests/static/event2.ics


+ 0 - 0
tests/static/event3.ics → radicale/tests/static/event3.ics


+ 0 - 0
tests/static/event4.ics → radicale/tests/static/event4.ics


+ 0 - 0
tests/static/event5.ics → radicale/tests/static/event5.ics


+ 0 - 0
tests/static/journal1.ics → radicale/tests/static/journal1.ics


+ 0 - 0
tests/static/journal2.ics → radicale/tests/static/journal2.ics


+ 0 - 0
tests/static/journal3.ics → radicale/tests/static/journal3.ics


+ 0 - 0
tests/static/journal4.ics → radicale/tests/static/journal4.ics


+ 0 - 0
tests/static/journal5.ics → radicale/tests/static/journal5.ics


+ 0 - 0
tests/static/todo1.ics → radicale/tests/static/todo1.ics


+ 0 - 0
tests/static/todo2.ics → radicale/tests/static/todo2.ics


+ 0 - 0
tests/static/todo3.ics → radicale/tests/static/todo3.ics


+ 0 - 0
tests/static/todo4.ics → radicale/tests/static/todo4.ics


+ 0 - 0
tests/static/todo5.ics → radicale/tests/static/todo5.ics


+ 0 - 0
tests/static/todo6.ics → radicale/tests/static/todo6.ics


+ 0 - 0
tests/static/todo7.ics → radicale/tests/static/todo7.ics


+ 0 - 0
tests/static/todo8.ics → radicale/tests/static/todo8.ics


+ 0 - 0
tests/test_auth.py → radicale/tests/test_auth.py


+ 0 - 0
tests/test_base.py → radicale/tests/test_base.py


+ 1 - 1
radicale/xmlutils.py

@@ -837,7 +837,7 @@ def report(path, xml_request, collection):
         else:
             # Reference is a collection
             path = hreference
-            items = [collection.get(href) for href, etag in collection.list()]
+            items = collection.pre_filtered_list(filters)
 
         for item in items:
             if filters: