From b9bba5924a731eee362d2b5761733f9e391ad62a Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Tue, 19 Jul 2011 13:11:18 +0200 Subject: [PATCH] ability to log spent time on an issue --- weboob/backends/redmine/backend.py | 5 ++++- weboob/backends/redmine/browser.py | 13 +++++++++++-- weboob/backends/redmine/pages/issues.py | 9 +++++++++ weboob/capabilities/bugtracker.py | 3 ++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/weboob/backends/redmine/backend.py b/weboob/backends/redmine/backend.py index c1f0788e..1d0c91dc 100644 --- a/weboob/backends/redmine/backend.py +++ b/weboob/backends/redmine/backend.py @@ -234,7 +234,10 @@ class RedmineBackend(BaseBackend, ICapContent, ICapBugTracker, ICapCollection): issue = issue.id with self.browser: - return self.browser.update_issue(issue, update.message) + if update.hours: + return self.browser.logtime_issue(issue, update.hours, update.message) + else: + return self.browser.comment_issue(issue, update.message) def remove_issue(self, issue): """ diff --git a/weboob/backends/redmine/browser.py b/weboob/backends/redmine/browser.py index 3ceda52b..8dbee317 100644 --- a/weboob/backends/redmine/browser.py +++ b/weboob/backends/redmine/browser.py @@ -26,7 +26,8 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword from .pages.index import LoginPage, IndexPage, MyPage, ProjectsPage from .pages.wiki import WikiPage, WikiEditPage -from .pages.issues import IssuesPage, IssuePage, NewIssuePage +from .pages.issues import IssuesPage, IssuePage, NewIssuePage, IssueLogTimePage, \ + IssueTimeEntriesPage __all__ = ['RedmineBrowser'] @@ -47,6 +48,8 @@ class RedmineBrowser(BaseBrowser): 'https?://[^/]+/projects/[\w-]+/issues': IssuesPage, 'https?://[^/]+/issues(|/?\?.*)': IssuesPage, 'https?://[^/]+/issues/(\d+)': IssuePage, + 'https?://[^/]+/issues/(\d+)/time_entries/new': IssueLogTimePage, + 'https?://[^/]+/projects/[\w-]+/time_entries': IssueTimeEntriesPage, } def __init__(self, url, *args, **kwargs): @@ -146,7 +149,13 @@ class RedmineBrowser(BaseBrowser): assert self.is_on_page(IssuePage) return self.page.get_params() - def update_issue(self, id, message): + def logtime_issue(self, id, hours, message): + self.location('/issues/%s/time_entries/new' % id) + + assert self.is_on_page(IssueLogTimePage) + self.page.logtime(hours.seconds/3600, message) + + def comment_issue(self, id, message): self.location('/issues/%s' % id) assert self.is_on_page(IssuePage) diff --git a/weboob/backends/redmine/pages/issues.py b/weboob/backends/redmine/pages/issues.py index 7030fe94..229bf42f 100644 --- a/weboob/backends/redmine/pages/issues.py +++ b/weboob/backends/redmine/pages/issues.py @@ -262,4 +262,13 @@ class IssuePage(NewIssuePage): return params +class IssueLogTimePage(BasePage): + def logtime(self, hours, message): + self.browser.select_form(predicate=lambda form: form.attrs.get('action', '').endswith('/edit')) + self.browser['time_entry[hours]'] = '%.2f' % hours + self.browser['time_entry[comments]'] = message.encode('utf-8') + self.browser['time_entry[activity_id]'] = ['8'] + self.browser.submit() +class IssueTimeEntriesPage(BasePage): + pass diff --git a/weboob/capabilities/bugtracker.py b/weboob/capabilities/bugtracker.py index f21893c9..0152759a 100644 --- a/weboob/capabilities/bugtracker.py +++ b/weboob/capabilities/bugtracker.py @@ -15,7 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from datetime import datetime +from datetime import datetime, timedelta from .base import IBaseCap, CapBaseObject @@ -106,6 +106,7 @@ class Update(CapBaseObject): CapBaseObject.__init__(self, id) self.add_field('author', User) self.add_field('date', datetime) + self.add_field('hours', timedelta) self.add_field('message', unicode) self.add_field('attachments', (list,tuple)) self.add_field('changes', (list,tuple))