def on_clipboard_text(self, clipboard, text, data): # first check that we have a date selected selection = self.fact_tree.get_selection() (model, iter) = selection.get_selected() selected_date = self.view_date if iter: selected_date = model[iter][3].split("-") selected_date = dt.date(int(selected_date[0]), int(selected_date[1]), int(selected_date[2])) if not selected_date: return res = stuff.parse_activity_input(text) if res.start_time is None or res.end_time is None: return start_time = res.start_time.replace(year = selected_date.year, month = selected_date.month, day = selected_date.day) end_time = res.end_time.replace(year = selected_date.year, month = selected_date.month, day = selected_date.day) activity_name = res.activity_name if res.category_name: activity_name += "@%s" % res.category_name if res.description: activity_name += ", %s" % res.description activity_name = activity_name.decode("utf-8") # TODO - set cursor to the pasted entry when done # TODO - revisit parsing of selected date added_fact = runtime.storage.add_fact(activity_name, start_time, end_time)
def __add_fact(self, activity_name, start_time = None, end_time = None, category_name = None, description = None): activity = stuff.parse_activity_input(activity_name) if category_name: activity.category_name = category_name if description: activity.description = description start_time = activity.start_time or start_time or datetime.datetime.now() if start_time > datetime.datetime.now(): return None #no facts in future, please start_time = start_time.replace(microsecond = 0) end_time = activity.end_time or end_time if end_time: end_time = end_time.replace(microsecond = 0) # now check if maybe there is also a category category_id = None if activity.category_name: category_id = self.__get_category_by_name(activity.category_name) if not category_id: category_id = self.__add_category(activity.category_name) # try to find activity activity_id = self.__get_activity_by_name(activity.activity_name, category_id) if not activity_id: activity_id = self.__add_activity(activity.activity_name, category_id) # if we are working on +/- current day - check the last_activity if (dt.datetime.now() - start_time <= dt.timedelta(days=1)): last_activity = self.__get_last_activity() if last_activity and last_activity['start_time'] < start_time: #if this is the same, ongoing activity, then there is no need to create another one if not activity.description \ and last_activity['activity_id'] == activity_id: return last_activity #if duration is less than a minute - it must have been a mistake if not activity.description \ and not last_activity["description"] \ and 60 >= (start_time - last_activity['start_time']).seconds >= 0: self.__remove_fact(last_activity['id']) start_time = last_activity['start_time'] else: #otherwise stop update = """ UPDATE facts SET end_time = ? WHERE id = ? """ self.execute(update, (start_time, last_activity["id"])) # done with the current activity, now we can solve overlaps if not end_time: end_time = self.__squeeze_in(start_time) else: self.__solve_overlaps(start_time, end_time) # finally add the new entry insert = """ INSERT INTO facts (activity_id, start_time, end_time, description) VALUES (?, ?, ?, ?) """ self.execute(insert, (activity_id, start_time, end_time, activity.description)) fact_id = self.fetchone("select max(id) as max_id from facts")['max_id'] return self.__get_fact(fact_id)