ability to log spent time on an issue

This commit is contained in:
Romain Bignon 2011-07-19 13:11:18 +02:00
commit b9bba5924a
4 changed files with 26 additions and 4 deletions

View file

@ -234,7 +234,10 @@ class RedmineBackend(BaseBackend, ICapContent, ICapBugTracker, ICapCollection):
issue = issue.id issue = issue.id
with self.browser: 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): def remove_issue(self, issue):
""" """

View file

@ -26,7 +26,8 @@ from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword
from .pages.index import LoginPage, IndexPage, MyPage, ProjectsPage from .pages.index import LoginPage, IndexPage, MyPage, ProjectsPage
from .pages.wiki import WikiPage, WikiEditPage from .pages.wiki import WikiPage, WikiEditPage
from .pages.issues import IssuesPage, IssuePage, NewIssuePage from .pages.issues import IssuesPage, IssuePage, NewIssuePage, IssueLogTimePage, \
IssueTimeEntriesPage
__all__ = ['RedmineBrowser'] __all__ = ['RedmineBrowser']
@ -47,6 +48,8 @@ class RedmineBrowser(BaseBrowser):
'https?://[^/]+/projects/[\w-]+/issues': IssuesPage, 'https?://[^/]+/projects/[\w-]+/issues': IssuesPage,
'https?://[^/]+/issues(|/?\?.*)': IssuesPage, 'https?://[^/]+/issues(|/?\?.*)': IssuesPage,
'https?://[^/]+/issues/(\d+)': IssuePage, 'https?://[^/]+/issues/(\d+)': IssuePage,
'https?://[^/]+/issues/(\d+)/time_entries/new': IssueLogTimePage,
'https?://[^/]+/projects/[\w-]+/time_entries': IssueTimeEntriesPage,
} }
def __init__(self, url, *args, **kwargs): def __init__(self, url, *args, **kwargs):
@ -146,7 +149,13 @@ class RedmineBrowser(BaseBrowser):
assert self.is_on_page(IssuePage) assert self.is_on_page(IssuePage)
return self.page.get_params() 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) self.location('/issues/%s' % id)
assert self.is_on_page(IssuePage) assert self.is_on_page(IssuePage)

View file

@ -262,4 +262,13 @@ class IssuePage(NewIssuePage):
return params 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

View file

@ -15,7 +15,7 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # 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 from .base import IBaseCap, CapBaseObject
@ -106,6 +106,7 @@ class Update(CapBaseObject):
CapBaseObject.__init__(self, id) CapBaseObject.__init__(self, id)
self.add_field('author', User) self.add_field('author', User)
self.add_field('date', datetime) self.add_field('date', datetime)
self.add_field('hours', timedelta)
self.add_field('message', unicode) self.add_field('message', unicode)
self.add_field('attachments', (list,tuple)) self.add_field('attachments', (list,tuple))
self.add_field('changes', (list,tuple)) self.add_field('changes', (list,tuple))