Mercurial > getan
diff getan.py @ 23:9c4e8ba3c4fa
Added a new implementation of 'getan' based on urwid, a python console user interface library.
author | Ingo Weinzierl <ingo_weinzierl@web.de> |
---|---|
date | Sat, 28 Aug 2010 20:16:58 +0200 |
parents | |
children | 155b23da504b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/getan.py Sat Aug 28 20:16:58 2010 +0200 @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# (c) 2010 by Ingo Weinzierl <ingo.weinzierl@intevation.de> +# +# A python worklog-alike to log what you have 'getan' (done). +# +# This is Free Software licensed under the terms of GPLv3 or later. +# For details see LICENSE coming with the source of 'getan'. +# + +import logging +import sys +from datetime import datetime + +import getan.config as config +from getan.backend import * +from getan.view import * +from getan.utils import format_time + +logger = logging.getLogger() + +class GetanController: + def __init__(self, backend, pv_class, ev_class): + self.ev_class = ev_class + self.pv_class = pv_class + + self.projects = backend.load_projects() + entries = backend.load_entries(self.projects[0].id) + self.running = [] + + self.backend = backend + self.project_view = pv_class(self, self.projects) + self.entries_view = ev_class(entries) + + self.view = GetanView(self, self.project_view, self.entries_view) + self.state = PausedProjectsState(self, self.project_view) + + def main(self): + self.view.run() + + def unhandled_keypress(self, key): + self.state = self.state.keypress(key) + + def input_filter(self, input, raw_input): + self.state = self.state.keypress(input) + + def update_entries(self, project): + logger.debug("GetanController: update entries.") + self.entries_view.set_rows(self.backend.load_entries(project.id)) + self.view.update_view() + + def move_selected_entries(self, project): + old_project = None + entries = [] + try: + while True: + node = self.entries_view.selection.pop() + if node.selected: node.select() + entries.append(node.entry) + logger.info("GetanController: move entry '%s' (id = %d, "\ + "project id = %d) to project '%s'" + % (node.entry.desc, node.entry.id, + node.entry.project_id, project.desc)) + + if not old_project: + old_project = self.project_by_id(node.entry.project_id) + except IndexError, err: + pass + finally: + self.backend.move_entries(entries, project.id) + if not old_project: return + project.entries = self.backend.load_entries(project.id) + old_project.entries = self.backend.load_entries(old_project.id) + self.update_entries(old_project) + self.project_view.update_all() + + def delete_entries(self, entry_nodes): + if not entry_nodes: return + proj = None + entries = [] + try: + while True: + node = self.entries_view.selection.pop() + if node.selected: node.select() + entries.append(node.entry) + logger.info("GetanController: delete entry '%s' (id = %d, "\ + "project id = %d)" + % (node.entry.desc, node.entry.id, + node.entry.project_id)) + + if proj is None: + proj = self.project_by_id(node.entry.project_id) + except IndexError, err: + pass + finally: + self.backend.delete_entries(entries) + proj.entries = self.backend.load_entries(proj.id) + self.update_entries(proj) + self.project_view.update() + + def update_project_list(self): + self.project_view.update() + self.view.update_view() + + def exit(self): + self.view.exit() + + def project_by_key(self, key): + for proj in self.projects: + if proj.key == key: + return proj + return None + + def project_by_id(self, id): + for proj in self.projects: + if proj.id == id: + return proj + return None + + def start_project(self, project): + self.running.append(project) + project.start = datetime.now() + logger.info("Start project '%s' at %s." + % (project.desc, format_time(datetime.now()))) + self.view.set_footer_text(" Running on '%s'" % project.desc, 'running') + logger.debug('All running projects: %r' % self.running) + + def stop_project(self): + project = self.running.pop() + desc = self.view.get_frame().get_footer().get_edit_text() + logger.info("Stop project '%s' at %s." + % (project.desc, format_time(datetime.now()))) + project.stop = datetime.now() + self.backend.insert_project_entry(project, datetime.now(), desc) + self.update_entries(project) + self.update_project_list() + logger.debug('Still running projects: %r' % self.running) + + +def main(): + config.initialize() + global logger + + if len(sys.argv) > 1: + backend = Backend(sys.argv[1]) + logging.info("Use database '%s'." % sys.argv[1]) + else: + backend = Backend() + logging.info("Use database '%s'." % DEFAULT_DATABASE) + + controller = GetanController(backend, ProjectList, EntryList) + controller.main() + + +if __name__ == '__main__': + main()