Просмотр исходного кода

indexed items storage

Conflicts:
	radicale/storage/filesystem.py
deronnax 11 лет назад
Родитель
Сommit
fbbbaae646
2 измененных файлов с 23 добавлено и 13 удалено
  1. 21 13
      radicale/ical.py
  2. 2 0
      radicale/storage/filesystem.py

+ 21 - 13
radicale/ical.py

@@ -193,6 +193,7 @@ class Collection(object):
         else:
             self.owner = None
         self.is_principal = principal
+        self._items = self._parse(self.text, (Event, Todo, Journal, Card, Timezone))
 
     @classmethod
     def from_path(cls, path, depth="1", include_container=True):
@@ -341,13 +342,11 @@ class Collection(object):
                     else:
                         items[item.name] = item
 
-        return list(items.values())
+        return items
 
     def get_item(self, name):
         """Get collection item called ``name``."""
-        for item in self.items:
-            if item.name == name:
-                return item
+        raise NotImplementedError
 
     def append(self, name, text):
         """Append items from ``text`` to collection.
@@ -355,7 +354,7 @@ class Collection(object):
         If ``name`` is given, give this name to new items in ``text``.
 
         """
-        items = self.items
+        items = self.items.values()
 
         for new_item in self._parse(
                 text, (Timezone, Event, Todo, Journal, Card), name):
@@ -383,7 +382,7 @@ class Collection(object):
         headers = headers or self.headers or (
             Header("PRODID:-//Radicale//NONSGML Radicale Server//EN"),
             Header("VERSION:%s" % self.version))
-        items = items if items is not None else self.items
+        items = items if items is not None else self.items.values()
 
         text = serialize(self.tag, headers, items)
         self.save(text)
@@ -466,40 +465,49 @@ class Collection(object):
 
         return header_lines
 
+    @staticmethod
+    def _filter_items(items, item_type):
+        return [item for item in items if item.tag == item_type.tag]
+
+    @staticmethod
+    def _filter_items_many(items, item_types):
+        tags = [item_type.tag for item_type in item_types]
+        return [item for item in items if item.tag in tags]
+
     @property
     def items(self):
         """Get list of all items in collection."""
-        return self._parse(self.text, (Event, Todo, Journal, Card, Timezone))
+        return self._items.values()
 
     @property
     def components(self):
         """Get list of all components in collection."""
-        return self._parse(self.text, (Event, Todo, Journal, Card))
+        return self._filter_items_many(self.items, (Event, Todo, Journal, Card))
 
     @property
     def events(self):
         """Get list of ``Event`` items in calendar."""
-        return self._parse(self.text, (Event,))
+        return self._filter_items(self.items, Event)
 
     @property
     def todos(self):
         """Get list of ``Todo`` items in calendar."""
-        return self._parse(self.text, (Todo,))
+        return self._filter_items(self.items, Todo)
 
     @property
     def journals(self):
         """Get list of ``Journal`` items in calendar."""
-        return self._parse(self.text, (Journal,))
+        return self._filter_items(self.items, Journal)
 
     @property
     def timezones(self):
         """Get list of ``Timezone`` items in calendar."""
-        return self._parse(self.text, (Timezone,))
+        return self._filter_items(self.items, Timezone)
 
     @property
     def cards(self):
         """Get list of ``Card`` items in address book."""
-        return self._parse(self.text, (Card,))
+        return self._filter_items(self.items, Card)
 
     @property
     def owner_url(self):

+ 2 - 0
radicale/storage/filesystem.py

@@ -117,6 +117,8 @@ class Collection(ical.Collection):
         modification_time = time.gmtime(os.path.getmtime(self._path))
         return time.strftime("%a, %d %b %Y %H:%M:%S +0000", modification_time)
 
+    def get_item(self, name):
+        return self._items.get(name)
     @property
     @contextmanager
     def props(self):