def given_event_with(self, start="4 Aug 2010", end="10 Aug 2010", text="Text", description=None, pos=(0, 0), size=(0, 0)): event = Event(self.db.get_time_type(), human_time_to_py(start), human_time_to_py(end), text) if description is not None: event.set_data("description", description) self.db.save_event(event) self.mock_drawer.events_and_rects.append((event, wx.Rect(pos[0], pos[1], size[0], size[1]))) return event
def copy_db(from_db, to_db): """ Copy all content from one db to another. to_db is assumed to have no categories (conflicting category names are not handled). """ if isinstance(to_db, MemoryDB): to_db.disable_save() # Copy categories (parent attribute fixed later) cat_map = {} for cat in from_db.get_categories(): # name, color, and visible all immutable so safe to copy new_cat = Category(cat.name, cat.color, None, cat.visible) cat_map[cat.name] = new_cat to_db.save_category(new_cat) # Fix parent attribute for cat in from_db.get_categories(): if cat.parent is not None: cat_map[cat.name].parent = cat_map[cat.parent.name] # Copy events for event in from_db.get_all_events(): cat = None if event.category is not None: cat = cat_map[event.category.name] # start_time, end_time, and text all immutable so safe to copy new_event = Event(to_db.get_time_type(), event.time_period.start_time, event.time_period.end_time, event.text, cat) # description immutable so safe to copy if event.get_data("description") is not None: new_event.set_data("description", event.get_data("description")) # icon immutable in practice (since never modified) so safe to copy if event.get_data("icon") is not None: new_event.set_data("icon", event.get_data("icon")) to_db.save_event(new_event) # Copy view properties (ViewProperties is specific to db so we need to copy # like this instead of just using load/save_view_properties in db). from_vp = ViewProperties() from_db.load_view_properties(from_vp) to_vp = ViewProperties() for from_cat in from_db.get_categories(): cat = cat_map[from_cat.name] visible = from_vp.is_category_visible(from_cat) to_vp.set_category_visible(cat, visible) if from_vp.displayed_period is not None: # start_time and end_time immutable so safe to copy start = from_vp.displayed_period.start_time end = from_vp.displayed_period.end_time to_vp.displayed_period = TimePeriod(to_db.get_time_type(), start, end) to_db.save_view_properties(to_vp) # Save if isinstance(to_db, MemoryDB): to_db.enable_save()
def setUp(self): self.db = MemoryDB() self.db._save = Mock() self.db_listener = Mock() self.c1 = Category("work", (255, 0, 0), None, True) self.c2 = Category("private", (0, 255, 0), None, True) self.e1 = Event(self.db.get_time_type(), datetime(2010, 2, 13), datetime(2010, 2, 13), "holiday") self.e2 = Event(self.db.get_time_type(), datetime(2010, 2, 14), datetime(2010, 2, 14), "work starts") self.e3 = Event(self.db.get_time_type(), datetime(2010, 2, 15), datetime(2010, 2, 16), "period") self.db.register(self.db_listener)
def given_event_with(self, start="4 Aug 2010", end="10 Aug 2010", text="Text", description=None, pos=(0, 0), size=(0, 0)): event = Event(self.db.get_time_type(), human_time_to_py(start), human_time_to_py(end), text) if description is not None: event.set_data("description", description) self.db.save_event(event) self.mock_drawer.events_and_rects.append( (event, wx.Rect(pos[0], pos[1], size[0], size[1]))) return event
def _create_event(self): self.event = Event(self.db.get_time_type(), datetime.datetime(2010, 1, 1), datetime.datetime(2010, 1, 1), "foo", category=None) return self.event
def testDisplayedPeriodTagNotWrittenIfNotSet(self): # Create a new db and add one event db = db_open(self.tmp_path) db.save_event( Event(db.get_time_type(), datetime(2010, 8, 31, 0, 0, 0), datetime(2010, 8, 31, 0, 0, 0), "test")) # Read the file content from disk f = codecs.open(self.tmp_path, "r", "utf-8") content = f.read() f.close() # Assert that displayed_period tag is not written self.assertEquals( content, """<?xml version="1.0" encoding="utf-8"?> <timeline> <version>%s</version> <categories> </categories> <events> <event> <start>2010-8-31 0:0:0</start> <end>2010-8-31 0:0:0</end> <text>test</text> <fuzzy>False</fuzzy> <locked>False</locked> <ends_today>False</ends_today> </event> </events> <view> <hidden_categories> </hidden_categories> </view> </timeline> """ % get_version())
def given_event_at(self, start_time, end_time=None, visible=True): category = Category("category", (0, 0, 0), None, visible) if end_time is None: end_time = start_time event = Event(self.db.get_time_type(), human_time_to_py(start_time), human_time_to_py(end_time), "event-text", category) self.db.save_category(category) self.db.save_event(event) self.view_properties.set_category_visible(category, visible)
def _get_events(self, decider_fn=None): self.events = [] for cal in self.cals: for event in cal.walk("VEVENT"): start, end = extract_start_end(event) txt = "" if event.has_key("summary"): txt = event["summary"] elif event.has_key("description"): txt = event["description"] else: txt == "Unknown" e = Event(self.get_time_type(), start, end, txt) e.set_id(event["timeline_id"]) if event.has_key("description"): e.set_data("description", event["description"]) if decider_fn is None or decider_fn(e): self.events.append(e) return self.events
def _parse_event(self, text, tmp_dict): start = self._parse_time(tmp_dict.pop("tmp_start")) end = self._parse_time(tmp_dict.pop("tmp_end")) text = tmp_dict.pop("tmp_text") progress = self._parse_optional_int(tmp_dict, "tmp_progress") fuzzy = self._parse_optional_bool(tmp_dict, "tmp_fuzzy") locked = self._parse_optional_bool(tmp_dict, "tmp_locked") ends_today = self._parse_optional_bool(tmp_dict, "tmp_ends_today") category_text = tmp_dict.pop("tmp_category", None) if category_text is None: category = None else: category = tmp_dict["category_map"].get(category_text, None) if category is None: raise ParseException("Category '%s' not found." % category_text) description = tmp_dict.pop("tmp_description", None) alert_string = tmp_dict.pop("tmp_alert", None) alert = self._parse_alert_string(alert_string) icon_text = tmp_dict.pop("tmp_icon", None) if icon_text is None: icon = None else: icon = parse_icon(icon_text) hyperlink = tmp_dict.pop("tmp_hyperlink", None) if self._is_container_event(text): cid, text = self._extract_container_id(text) event = Container(self.get_time_type(), start, end, text, category, cid=cid) elif self._is_subevent(text): cid, text = self._extract_subid(text) event = Subevent(self.get_time_type(), start, end, text, category, cid=cid) else: if self._text_starts_with_added_space(text): text = self._remove_added_space(text) event = Event(self.get_time_type(), start, end, text, category, fuzzy, locked, ends_today) event.set_data("description", description) event.set_data("icon", icon) event.set_data("alert", alert) event.set_data("hyperlink", hyperlink) event.set_data("progress", int(progress)) self.save_event(event)
def _create_db(self): db = XmlTimeline(self.tmp_path) # Create categories cat1 = Category("Category 1", (255, 0, 0), (0, 0, 255), True) db.save_category(cat1) cat2 = Category("Category 2", (0, 255, 0), None, True, parent=cat1) db.save_category(cat2) cat3 = Category("Category 3", (0, 0, 255), None, True, parent=cat2) db.save_category(cat3) # Create events ev1 = Event(db.get_time_type(), datetime(2010, 3, 3), datetime(2010, 3, 6), "Event 1", cat1) ev1.set_data("description", u"The <b>first</b> event åäö.") ev1.set_data("alert", (datetime(2012, 12, 31), "Time to go")) db.save_event(ev1) # Create view properties vp = ViewProperties() start = datetime(2010, 3, 1) end = datetime(2010, 4, 1) vp.displayed_period = TimePeriod(db.get_time_type(), start, end) vp.set_category_visible(cat3, False) db.save_view_properties(vp)
def _event_from_path(self, file_path): stat = os.stat(file_path) # st_atime (time of most recent access), # st_mtime (time of most recent content modification), # st_ctime (platform dependent; time of most recent metadata change on # Unix, or the time of creation on Windows): dt = datetime.fromtimestamp(int(stat.st_mtime)) start_time = Gregorian(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second).to_time() end_time = start_time if start_time > end_time: start_time, end_time = end_time, start_time text = os.path.basename(file_path) category = self._category_from_path(file_path) evt = Event(self.get_time_type(), start_time, end_time, text, category) return evt
def an_event_with(start=None, end=None, time=ANY_TIME, text="foo", fuzzy=False, locked=False, ends_today=False): if start and end: start = human_time_to_py(start) end = human_time_to_py(end) else: start = human_time_to_py(time) end = human_time_to_py(time) return Event(PyTimeType(), start, end, text, Category("bar", None, None, True), fuzzy=fuzzy, locked=locked, ends_today=ends_today)
def given_point_event_wich_ends_today(self): self.event = Event(self.db.get_time_type(), self.now, self.now, "evt", ends_today=True)
def given_default_point_event(self): self.event = Event(self.db.get_time_type(), self.now, self.now, "evt")
def given_point_event(self): self.event = Event(self.db.get_time_type(), self.time("2000-01-01 10:01:01"), self.time("2000-01-01 10:01:01"), "evt")
def given_locked_point_event(self): self.event = Event(self.db.get_time_type(), self.now, self.now, "evt", locked=True)
def given_fuzzy_point_event(self): self.event = Event(self.db.get_time_type(), self.now, self.now, "evt", fuzzy=True)
def given_event(self, name, start, end): event = Event(self.timeline.get_time_type(), start, end, name) self.timeline.save_event(event)
def add_event(self, text, description, start_add, end_add=None): start, end = self.calc_start_end(start_add, end_add) evt = Event(self.db.get_time_type(), start, end, text, self.last_cat) if description: evt.set_data("description", description) self.db.save_event(evt)