1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """
20 Implementation of timeline database that stores all data in memory.
21
22 MemoryDB can be used as a base class for other timeline databases that wish to
23 store all data in memory and also want to save the data to persistent storage
24 whenever it changes in memory. Initially data can be read from persistent
25 storage into memory.
26
27 MemoryDB is not suitable as a base class for timeline databases that need to
28 query persistent storage to retrieve data.
29 """
30
31
32 from timelinelib.db.exceptions import TimelineIOError
33 from timelinelib.db.objects import Category
34 from timelinelib.db.objects import Container
35 from timelinelib.db.objects import Event
36 from timelinelib.db.observer import Observable
37 from timelinelib.db.observer import STATE_CHANGE_ANY
38 from timelinelib.db.observer import STATE_CHANGE_CATEGORY
39 from timelinelib.db.search import generic_event_search
40 from timelinelib.db.utils import IdCounter
41
42
44
57
60
63
65 return ["description", "icon", "alert", "hyperlink"]
66
67 - def search(self, search_string):
69
71 def include_event(event):
72 if not event.inside_period(time_period):
73 return False
74 return True
75 return [e for e in self.events if include_event(e)]
76
78 return list(self.events)
79
81 if len(self.events) == 0:
82 return None
83 e = min(self.events, key=lambda e: e.time_period.start_time)
84 return e
85
87 if len(self.events) == 0:
88 return None
89 e = max(self.events, key=lambda e: e.time_period.end_time)
90 return e
91
106
129
131 id = 0
132 for event in container_events:
133 if id < event.cid():
134 id = event.cid()
135 return id
136
150
168
170 return list(self.categories)
171
176
190
213
215 view_properties.displayed_period = self.displayed_period
216 for cat in self.categories:
217 visible = cat not in self.hidden_categories
218 view_properties.set_category_visible(cat, visible)
219
221 if view_properties.displayed_period is not None:
222 if not view_properties.displayed_period.is_period():
223 raise TimelineIOError(_("Displayed period must be > 0."))
224 self.displayed_period = view_properties.displayed_period
225 self.hidden_categories = []
226 for cat in self.categories:
227 if not view_properties.category_visible(cat):
228 self.hidden_categories.append(cat)
229 self._save_if_not_disabled()
230
232 self.save_disabled = True
233
235 if self.save_disabled == True:
236 self.save_disabled = False
237 if call_save == True:
238 self._save_if_not_disabled()
239
241 if (event_to_place == target_event):
242 return
243 self.events.remove(event_to_place)
244 new_index = self.events.index(target_event) + 1
245 self.events.insert(new_index, event_to_place)
246
248 if (event_to_place == target_event):
249 return
250 self.events.remove(event_to_place)
251 new_index = self.events.index(target_event)
252 self.events.insert(new_index, event_to_place)
253
255 parent = cat.parent
256 while parent is not None:
257 if parent == cat:
258 raise TimelineIOError("Circular category parent.")
259 else:
260 parent = parent.parent
261
263 for e in self.events:
264 if e.id == id:
265 return e
266 return None
267
269 for c in self.categories:
270 if c.id == id:
271 return c
272 return None
273
275 if self.save_disabled == False:
276 self._save()
277
279 """
280 Inheritors can call this method to get the displayed period used in
281 load_view_properties and save_view_properties.
282 """
283 return self.displayed_period
284
286 """
287 Inheritors can call this method to set the displayed period used in
288 load_view_properties and save_view_properties.
289 """
290 self.displayed_period = period
291
293 """
294 Inheritors can call this method to get the hidden categories used in
295 load_view_properties and save_view_properties.
296 """
297 return self.hidden_categories
298
300 """
301 Inheritors can call this method to set the hidden categories used in
302 load_view_properties and save_view_properties.
303 """
304 self.hidden_categories = []
305 for cat in hidden_categories:
306 if cat not in self.categories:
307 raise ValueError("Category '%s' not in db." % cat.name)
308 self.hidden_categories.append(cat)
309
311 """
312 Inheritors can override this method to save this db to persistent
313 storage.
314
315 Called whenever this db changes.
316 """
317 pass
318