# HG changeset patch # User Björn Ricks # Date 1323678064 -3600 # Node ID d85b2a25797c12ffb1b995d281de7e1f50391609 # Parent dcccc2059b05772a3e5af155b3f84d5d7a440808 Move GetanController to it's own module diff -r dcccc2059b05 -r d85b2a25797c getan.py --- a/getan.py Mon Dec 12 09:18:41 2011 +0100 +++ b/getan.py Mon Dec 12 09:21:04 2011 +0100 @@ -20,147 +20,10 @@ from getan.view import GetanView, ProjectList, EntryList from getan.utils import format_time from getan.states import PausedProjectsState +from getan.controller import GetanController logger = logging.getLogger() -class GetanController: - def __init__(self, backend, pv_class, ev_class): - self.ev_class = ev_class - self.pv_class = pv_class - - self.backend = backend - projects, entries = self.load_projects() - self.projects = projects - self.running = [] - - 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): - if 'window resize' in input: - self.view.loop.screen_size = None - self.view.loop.draw_screen() - else: - self.state = self.state.keypress(input) - - def load_projects(self): - projects = self.backend.load_projects() - if projects: - entries = self.backend.load_entries(projects[0].id) - else: - entries = [] - return (projects, entries) - - def update_entries(self, project): - logger.debug("GetanController: update entries.") - if project: entries = self.backend.load_entries(project.id) - else: entries = [] - self.entries_view.set_rows(entries) - self.view.update_view() - - def move_selected_entries(self, project): - old_project = None - entries = [] - try: - while self.entries_view.selection: - node = self.entries_view.selection.pop() - if node.selected: node.select() - entries.append(node.item) - logger.info("GetanController: move entry '%s' (id = %d, "\ - "project id = %d) to project '%s'" - % (node.item.desc, node.item.id, - node.item.project_id, project.desc)) - - if not old_project: - old_project = self.project_by_id(node.item.project_id) - 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 = self.project_by_id(entry_nodes[0].project_id) - entries = entry_nodes - 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): - if not project: return - 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, desc='-no description-', display=True): - if not self.running: return - project = self.running.pop() - if not project: return - 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) - if display: - self.update_entries(project) - self.update_project_list() - logger.debug('Still running projects: %r' % self.running) - - def add_project(self, key, description): - if not key or not description: - return - self.backend.insert_project(key, description) - self.update_projects() - self.update_project_list() - - def update_entry(self, entry): - self.backend.update_entry(entry) - - def shutdown(self): - for project in self.running: - self.stop_project(display=False) - - def update_projects(self): - projects, entries = self.load_projects() - self.projects = projects - self.project_view.load_rows(projects) - - def main(): usage = "usage: %prog [options] [databasefile (default: " + \ diff -r dcccc2059b05 -r d85b2a25797c getan/controller.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/getan/controller.py Mon Dec 12 09:21:04 2011 +0100 @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +# +# (c) 2010 by Ingo Weinzierl +# (c) 2011 by Björn Ricks +# +# 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 +from datetime import datetime + +from getan.view import GetanView +from getan.states import PausedProjectsState +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.backend = backend + projects, entries = self.load_projects() + self.projects = projects + self.running = [] + + 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): + if 'window resize' in input: + self.view.loop.screen_size = None + self.view.loop.draw_screen() + else: + self.state = self.state.keypress(input) + + def load_projects(self): + projects = self.backend.load_projects() + if projects: + entries = self.backend.load_entries(projects[0].id) + else: + entries = [] + return (projects, entries) + + def update_entries(self, project): + logger.debug("GetanController: update entries.") + if project: entries = self.backend.load_entries(project.id) + else: entries = [] + self.entries_view.set_rows(entries) + self.view.update_view() + + def move_selected_entries(self, project): + old_project = None + entries = [] + try: + while self.entries_view.selection: + node = self.entries_view.selection.pop() + if node.selected: node.select() + entries.append(node.item) + logger.info("GetanController: move entry '%s' (id = %d, "\ + "project id = %d) to project '%s'" + % (node.item.desc, node.item.id, + node.item.project_id, project.desc)) + + if not old_project: + old_project = self.project_by_id(node.item.project_id) + 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 = self.project_by_id(entry_nodes[0].project_id) + entries = entry_nodes + 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): + if not project: return + 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, desc='-no description-', display=True): + if not self.running: return + project = self.running.pop() + if not project: return + 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) + if display: + self.update_entries(project) + self.update_project_list() + logger.debug('Still running projects: %r' % self.running) + + def add_project(self, key, description): + if not key or not description: + return + self.backend.insert_project(key, description) + self.update_projects() + self.update_project_list() + + def update_entry(self, entry): + self.backend.update_entry(entry) + + def shutdown(self): + for project in self.running: + self.stop_project(display=False) + + def update_projects(self): + projects, entries = self.load_projects() + self.projects = projects + self.project_view.load_rows(projects)