class Config: def __init__(self): self.model = Model() self.params = Params() self.screen = Screen() self.fzf = FzfPrompt() self.info = '' def manage(self): active = 'off' if self.params.get('active'): active = 'on' self.info = 'Show current tasks: [' + active + ']\n' done = 'off' if self.params.get('done'): done = 'on' self.info += 'Show done tasks: [' + done + ']\n' self.manage_menu() def manage_menu(self): about = ''' Short instruction ----------------- ? - help (this dialog) ! - toggle active tasks v - toggle done tasks t - manage time slots # - backup/restore < - back q - exit ''' self.screen.change_path('~config', '?!vt#<q', about, 'Managing configs', self.info) menu = self.screen.print() if menu == 'q': self.screen.bye() elif menu == '?': self.screen.activate_about() self.manage_menu() elif menu == '!': self.toggle_active() self.manage() elif menu == 'v': self.toggle_done() self.manage() elif menu == 't': self.manage_time_slot_menu() self.manage_menu() elif menu == '<': return else: self.screen.add_fail('This is not implemented...') self.manage_menu() def toggle_active(self): active = self.params.get('active') self.params.update('active', not active) self.screen.add_message('parameter "active" has been toggled') def toggle_done(self): done = self.params.get('done') self.params.update('done', not done) self.screen.add_message('parameter "done" has been toggled') def manage_time_slot_menu(self): tsData = self.model.get_all_time_slots() if tsData: self.info = ' | '.join( ['%s:%s' % (t['name'], t['description']) for t in tsData]) + '\n' else: self.info = None about = ''' Short instruction ----------------- ? - help (this dialog) + - add time slot - - remove time slot < - back q - exit ''' self.screen.change_path('~config/time_slot', '?+-<q', about, 'Managing time slots', self.info) menu = self.screen.print() if menu == 'q': self.screen.bye() elif menu == '?': self.screen.activate_about() self.manage_time_slot_menu() elif menu == '+': self.add_time_slot() elif menu == '-': self.remove_time_slot() elif menu == '<': return else: self.screen.add_fail('This is not implemented...') self.manage_time_slot_menu() def add_time_slot(self): self.screen.print_init('Adding time slot') name = input('Name (short): ') description = input('Description: ') self.model.create_time_slot(name, description) self.screen.add_message('time slot has been created') self.manage_time_slot_menu() def remove_time_slot(self): ts_id = self.select_time_slot() if ts_id is not None: self.model.remove_time_slot(ts_id) self.screen.add_message('time_slot has been deleted') else: self.screen.add_fail('Time slot was not selected...') self.manage_time_slot_menu() def select_time_slot(self): tsData = self.model.get_all_time_slots() if not tsData: self.screen.add_fail('Where is no time slots...') return ts_ids = {} ts = [] for t in tsData: ts.append('%s:%s' % (t['name'], t['description'])) ts_ids['%s:%s' % (t['name'], t['description'])] = t['id'] selected = self.fzf.prompt(ts) if selected: return ts_ids[selected[0]]
class Tag: def __init__(self): self.model = Model() self.fzf = FzfPrompt() self.screen = Screen() self.config = Config() self.header = '' self.info = None def manage_tag(self, tid=None): if tid: tag = self.model.get_tag(tid) self.header = 'Managing tag: ' + tag['name'] else: self.header = 'Managing tags' tagsData = self.model.get_all_tags() if not tagsData: self.add_tag() tagsData = self.model.get_all_tags() self.info = ' '.join([t['name'] for t in tagsData]) + '\n' self.manage_tag_menu(tid) def manage_tag_menu(self, tid=None): about = ''' Short instruction ----------------- ? - help (this dialog) / - search tag + - add tag - - remove tag @ - append to time slot 0 - list tags without time_slot & - search linked tasks < - back q - exit ''' self.screen.change_path('~tag', '?/+-&@0<q', about, self.header, self.info) menu = self.screen.print() if menu == 'q': self.screen.bye() elif menu == '/': self.search_tag(tid) self.manage_tag_menu(tid) elif menu == '?': self.screen.activate_about() self.manage_tag(tid) elif menu == '+': self.add_tag() elif menu == '-': self.remove_tag(tid) elif menu == '@': self.add_to_time_slot(tid) self.manage_tag(tid) elif menu == '<': return else: self.screen.add_fail('This is not implemented...') self.manage_tag_menu(tid) def add_tag(self): self.screen.print_init('Adding tag') name = input('Name: ') tid = self.model.create_tag(name) self.screen.add_message('tag has been created') self.manage_tag(tid) def search_tag(self, tid=None): tagsData = self.model.get_all_tags() if not tagsData: self.add_tag() tagsData = self.model.get_all_tags() tags = [] for t in tagsData: tags.append(t['name']) selected = self.fzf.prompt(tags) if selected: tag = self.model.get_tag_by_name(selected[0]) self.manage_tag(tag['id']) else: self.screen.add_fail('Tag was not selected...') def remove_tag(self, tid=None): tagsData = self.model.get_all_tags() if not tagsData: self.screen.add_fail('Where is no tags...') self.manage_tag_menu() tags = [] for t in tagsData: tags.append(t['name']) selected = self.fzf.prompt(tags) if selected: self.model.remove_tag_by_name(selected[0]) self.screen.add_message('tag has been deleted') self.manage_tag() else: self.screen.add_fail('Tag was not selected...') def add_to_time_slot(self, tid): if tid is None: self.screen.add_fail('Tag is not selected...') return ts_id = self.config.select_time_slot() if ts_id is None: self.screen.add_fail('Time slot was not selected...') return self.model.add_tag_to_time_slot(tid, ts_id)
class Main: def __init__(self): self.model = Model() self.task = Task() self.tag = Tag() self.config = Config() self.params = Params() self.screen = Screen() self.fzf = FzfPrompt() self.parser = argparse.ArgumentParser('ztm') self.parser.add_argument('-c', '--current', dest='active', action='store_true') self.parser.set_defaults(active=False) def run(self): n = self.parser.parse_args() if n.active: self.params.update('active', True) self.menu() def menu(self): about = ''' Short instruction ----------------- ? - help (this dialog) + - add / - search t - tag manager c - configuration q - exit ''' self.screen.change_path('~', '?+/tcq', about) menu = self.screen.print() if menu == '?': self.screen.activate_about() self.menu() elif menu == '+': self.task.add() self.menu() elif menu == '/': self.task.search() self.menu() elif menu == 't': self.tag.manage_tag() self.menu() elif menu == 'c': self.config.manage() self.menu() elif menu == 'q': self.screen.bye() else: self.screen.add_fail('This is not implemented...') self.menu()
class Task: def __init__(self): self.model = Model() self.fzf = FzfPrompt() self.screen = Screen() self.header = '' self.info = '' def search(self): tasks = [] tasksData = self.model.get_all_tasks() if not tasksData: self.add() tasksData = self.model.get_all_tasks() for t in tasksData: tasks.append('%s: %s [ %s ]' % (t['aid'], t['description'], t['tag_names'])) selected = self.fzf.prompt(tasks) if selected: m = re.search(r'^(.+):', selected[0]) aid = m.group(1) if aid: self.edit_task(aid) else: self.screen.add_fail('Task was not selected...') def add(self): self.screen.print_init('Adding task') description = input('Description: ') aid = self.model.create_task_draft(description) self.screen.add_message('task has been created') self.manage_task(aid) def manage_task(self, aid): task = self.model.get_task(aid) self.header = 'Managing task: [' + task['aid'] + '] ' + task[ 'description'] long_term = ' ' if task['long_term'] and task['long_term'] != 'FALSE': long_term = 'x' tags = '' if task['tags']: tags = ' '.join([t['name'] for t in task['tags']]) self.info = '''%s Description: %s Tags: [%s] Long Term: [%s] Created: %s ''' % (task['aid'], task['description'], tags, long_term, task['created_at']) if task['done'] and task['done'] != 'FALSE': self.info += bcolors.ENDC + bcolors.OKGREEN + '\nFinished: ' + task[ 'finished_at'] if task['active'] and task['active'] != 'FALSE': self.info += bcolors.ENDC + bcolors.WARNING + '\nACTIVE' self.manage_task_menu(aid) def manage_task_menu(self, aid): about = ''' Short instruction ----------------- ? - help (this dialog) e - edit content * - toggle long term + - add tag - - remove tag ! - toggle active v - toggle done x - delete task & - add child task > - go to child < - back q - exit ''' self.screen.change_path('~task', '?e*+-!v&><q', about, self.header, self.info) menu = self.screen.print() if menu == 'q': self.screen.bye() elif menu == '?': self.screen.activate_about() self.manage_task_menu(aid) elif menu == 'e': self.edit_task(aid) elif menu == '*': self.toggle_long_term(aid) elif menu == '+': self.add_tags(aid) elif menu == '-': self.remove_tags(aid) elif menu == '!': self.toggle_active(aid) elif menu == 'v': self.toggle_done(aid) elif menu == '<': return else: self.screen.add_fail('This is not implemented...') self.manage_task_menu(aid) def edit_task(self, aid): task = self.model.get_task(aid) long_term = ' ' if task['long_term'] and task['long_term'] != 'FALSE': long_term = 'x' tags = '' if task['tags']: tags = ' '.join([t['name'] for t in task['tags']]) content = '''%s Tags: [%s] Long Term: [%s] Created: %s ''' % (task['aid'], tags, long_term, task['created_at']) if task['done'] and task['done'] != 'FALSE': content += '\nFinished: ' + task['finished_at'] if task['active'] and task['active'] != 'FALSE': content += '\n**ACTIVE**' content += '\n\n# ' + task['description'] if task['content']: content += task['content'] with tempfile.NamedTemporaryFile(suffix='.md', mode='r+') as temp: f = open(temp.name, 'r+') f.write(content) f.close() subprocess.call(['nvim', temp.name]) f = open(temp.name, 'r') new_content = f.read() f.close() temp.close() found = False content = '' for row in new_content.splitlines(): if found: content += '\n' + row continue if row == '# ' + task['description']: found = True self.model.save_content(aid, content) self.screen.add_message('content has been saved') self.manage_task(aid) def toggle_long_term(self, aid): self.model.toggle_long_term(aid) self.screen.add_message('task has been updated') self.manage_task(aid) def toggle_active(self, aid): self.model.toggle_active(aid) self.screen.add_message('task has been activated') self.manage_task(aid) def toggle_done(self, aid): self.model.toggle_done(aid) self.screen.add_message('task has been updated') self.manage_task(aid) def add_tags(self, aid): task = self.model.get_task(aid) unlinked_tags = self.model.get_tags_not_in_task(task['id']) if type(unlinked_tags ) is sqlite3.Cursor and unlinked_tags.rowcount == 0: self.screen.add_fail('Where is no more unlinked tags left...') self.manage_task(aid) tags = [t['name'] for t in unlinked_tags] selected = self.fzf.prompt(tags, '--multi --cycle') if selected: self.model.link_tags_to_task(task['id'], selected) self.screen.add_message('tags have been linked') self.manage_task(aid) else: self.screen.add_fail('Tag was not selected...') def remove_tags(self, aid): task = self.model.get_task(aid) if not task['tags']: self.screen.add_fail('Where is no tags linked...') self.manage_task(aid) tags = [t['name'] for t in task['tags']] selected = self.fzf.prompt(tags, '--multi --cycle') if selected: self.model.unlink_tags_from_task(task['id'], selected) self.screen.add_message('tags have been unlinked') self.manage_task(aid) else: self.screen.add_fail('Tag was not selected...')