예제 #1
0
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]]
예제 #2
0
파일: tag.py 프로젝트: zordsdavini/ztm
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)
예제 #3
0
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()
예제 #4
0
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...')