support new versions of redmine

This commit is contained in:
Romain Bignon 2014-01-31 17:11:32 +01:00
commit ec0cd3aa66
3 changed files with 52 additions and 27 deletions

View file

@ -115,33 +115,52 @@ class RedmineBrowser(BaseBrowser):
preview_html.find("legend").drop_tree()
return lxml.html.tostring(preview_html)
METHODS = {'POST': {'project_id': 'project_id',
'column': 'query[column_names][]',
'value': 'values[%s][]',
'field': 'fields[]',
'operator': 'operators[%s]',
},
'GET': {'project_id': 'project_id',
'column': 'c[]',
'value': 'v[%s][]',
'field': 'f[]',
'operator': 'op[%s]',
}
}
def query_issues(self, project_name, **kwargs):
self.location('/projects/%s/issues' % project_name)
token = self.page.get_authenticity_token()
data = (('project_id', project_name),
('query[column_names][]', 'tracker'),
method = self.page.get_query_method()
data = ((self.METHODS[method]['project_id'], project_name),
(self.METHODS[method]['column'], 'tracker'),
('authenticity_token', token),
('query[column_names][]', 'status'),
('query[column_names][]', 'priority'),
('query[column_names][]', 'subject'),
('query[column_names][]', 'assigned_to'),
('query[column_names][]', 'updated_on'),
('query[column_names][]', 'category'),
('query[column_names][]', 'fixed_version'),
('query[column_names][]', 'done_ratio'),
('query[column_names][]', 'author'),
('query[column_names][]', 'start_date'),
('query[column_names][]', 'due_date'),
('query[column_names][]', 'estimated_hours'),
('query[column_names][]', 'created_on'),
(self.METHODS[method]['column'], 'status'),
(self.METHODS[method]['column'], 'priority'),
(self.METHODS[method]['column'], 'subject'),
(self.METHODS[method]['column'], 'assigned_to'),
(self.METHODS[method]['column'], 'updated_on'),
(self.METHODS[method]['column'], 'category'),
(self.METHODS[method]['column'], 'fixed_version'),
(self.METHODS[method]['column'], 'done_ratio'),
(self.METHODS[method]['column'], 'author'),
(self.METHODS[method]['column'], 'start_date'),
(self.METHODS[method]['column'], 'due_date'),
(self.METHODS[method]['column'], 'estimated_hours'),
(self.METHODS[method]['column'], 'created_on'),
)
for key, value in kwargs.iteritems():
if value:
data += (('values[%s][]' % key, value),)
data += (('fields[]', key),)
data += (('operators[%s]' % key, '~'),)
data += ((self.METHODS[method]['value'] % key, value),)
data += ((self.METHODS[method]['field'], key),)
data += ((self.METHODS[method]['operator'] % key, '~'),)
self.location('/issues?set_filter=1&per_page=100', urllib.urlencode(data))
if method == 'POST':
self.location('/issues?set_filter=1&per_page=100', urllib.urlencode(data))
else:
data += (('set_filter', '1'), ('per_page', '100'))
self.location(self.buildurl('/issues', *data))
assert self.is_on_page(IssuesPage)
return {'project': self.page.get_project(project_name),

View file

@ -23,9 +23,9 @@ from weboob.tools.browser import BasePage
class LoginPage(BasePage):
def login(self, username, password):
self.browser.select_form(nr=1)
self.browser['username'] = username
self.browser['password'] = password
self.browser.select_form(predicate=lambda f: f.attrs.get('method', '') == 'post')
self.browser['username'] = username.encode(self.browser.ENCODING)
self.browser['password'] = password.encode(self.browser.ENCODING)
self.browser.submit()

View file

@ -61,7 +61,10 @@ class BaseIssuePage(BasePage):
try:
select = self.parser.select(self.document.getroot(), 'select#%s' % name, 1)
except BrokenPageError:
return
try:
select = self.parser.select(self.document.getroot(), 'select#%s_1' % name, 1)
except BrokenPageError:
return
for option in select.findall('option'):
if option.attrib['value'].isdigit():
yield (option.attrib['value'], option.text)
@ -95,6 +98,9 @@ class IssuesPage(BaseIssuePage):
'statuses': 'values_status_id',
}
def get_query_method(self):
return self.document.xpath('//form[@id="query_form"]')[0].attrib['method'].upper()
def iter_issues(self):
try:
issues = self.parser.select(self.document.getroot(), 'table.issues', 1)
@ -268,9 +274,9 @@ class IssuePage(NewIssuePage):
params['updates'] = []
for div in self.parser.select(content, 'div.journal'):
update = {}
update['id'] = div.find('h4').find('div').find('a').text[1:]
alist = div.find('h4').findall('a')
if len(alist) == 3:
alist = div.find('h4').xpath('.//a')
update['id'] = alist[0].text[1:]
if len(alist) == 4:
update['author'] = (int(alist[-2].attrib['href'].split('/')[-1]),
to_unicode(alist[-2].text))
else: