From 0291c71e9fd1fea84f2bfce3055e555bf8ff58d5 2016-09-15 14:06:46 From: Marcin Lulek Date: 2016-09-15 14:06:46 Subject: [PATCH] jira: fix jira and allow to pick issue types --- diff --git a/backend/src/appenlight/models/integrations/jira.py b/backend/src/appenlight/models/integrations/jira.py index a0f3c20..f8c2380 100644 --- a/backend/src/appenlight/models/integrations/jira.py +++ b/backend/src/appenlight/models/integrations/jira.py @@ -60,64 +60,72 @@ class JiraClient(object): projects = self.client.projects() return projects - def get_assignees(self): + def get_assignees(self, request): """Gets list of possible assignees""" - users = self.client.search_assignable_users_for_issues( - None, project=self.project) - results = [] - for user in users: - results.append({"id": user.name, "name": user.displayName}) - return results - - def get_metadata(self): + cache_region = request.registry.cache_regions.redis_sec_30 + @cache_region.cache_on_arguments('JiraClient.get_assignees') def cached(project_name): - metadata = self.client.createmeta( - projectKeys=project_name, expand='projects.issuetypes.fields') - assignees = self.get_assignees() - parsed_metadata = [] - for entry in metadata['projects'][0]['issuetypes']: - issue = {"name": entry['name'], - "id": entry['id'], - "fields": []} - for i_id, field_i in entry['fields'].items(): - field = { - "name": field_i['name'], - "id": i_id, - "required": field_i['required'], - "values": [], - "type": field_i['schema'].get('type') - } - if field_i.get('allowedValues'): - field['values'] = [] - for i in field_i['allowedValues']: - field['values'].append( - {'id': i['id'], - 'name': i.get('name', i.get('value', '')) - }) - if field['id'] == 'assignee': - field['values'] = assignees + users = self.client.search_assignable_users_for_issues( + None, project=project_name) + results = [] + for user in users: + results.append({"id": user.name, "name": user.displayName}) + return results + return cached(self.project) - issue['fields'].append(field) - parsed_metadata.append(issue) - return parsed_metadata + def get_issue_types(self, request): + metadata = self.get_metadata(request) + assignees = self.get_assignees(request) + parsed_metadata = [] + for entry in metadata['projects'][0]['issuetypes']: + issue = {"name": entry['name'], + "id": entry['id'], + "fields": []} + for i_id, field_i in entry['fields'].items(): + field = { + "name": field_i['name'], + "id": i_id, + "required": field_i['required'], + "values": [], + "type": field_i['schema'].get('type') + } + if field_i.get('allowedValues'): + field['values'] = [] + for i in field_i['allowedValues']: + field['values'].append( + {'id': i['id'], + 'name': i.get('name', i.get('value', '')) + }) + if field['id'] == 'assignee': + field['values'] = assignees + issue['fields'].append(field) + parsed_metadata.append(issue) + return parsed_metadata + def get_metadata(self, request): + # cache_region = request.registry.cache_regions.redis_sec_30 + # @cache_region.cache_on_arguments('JiraClient.get_metadata') + def cached(project_name): + return self.client.createmeta( + projectKeys=project_name, expand='projects.issuetypes.fields') return cached(self.project) - def create_issue(self, form_data): - metadata = self.get_metadata() + def create_issue(self, form_data, request): + issue_types = self.get_issue_types(request) payload = { 'project': {'key': form_data['project']}, 'summary': form_data['title'], 'description': form_data['content'], - 'issuetype': {'id': '1'}, + 'issuetype': {'id': form_data['issue_type']}, "priority": {'id': form_data['priority']}, "assignee": {'name': form_data['responsible']}, } - for issue_type in metadata: - if issue_type['id'] == '1': + for issue_type in issue_types: + if issue_type['id'] == form_data['issue_type']: for field in issue_type['fields']: + # set some defaults for other required fields if field == 'reporter': - payload["reporter"] = {'id': self.user_name}, + payload["reporter"] = {'id': self.user_name} if field['required'] and field['id'] not in payload: if field['type'] == 'array': payload[field['id']] = [field['values'][0], ] diff --git a/backend/src/appenlight/static/js/appenlight.js b/backend/src/appenlight/static/js/appenlight.js index 1fa25c9..20d06d9 100644 --- a/backend/src/appenlight/static/js/appenlight.js +++ b/backend/src/appenlight/static/js/appenlight.js @@ -4613,6 +4613,11 @@ function kickstartAE() { "
\n" + " \n" + " \n" + + "\n" + + "

\n" + + " https://servername.atlassian.net\n" + + "

\n" + + "\n" + "
\n" + " \n" + "
\n" + @@ -4624,6 +4629,11 @@ function kickstartAE() { "\n" + " \n" + " \n" + + "\n" + + "

\n" + + " user@email.com\n" + + "

\n" + + "\n" + "
\n" + " \n" + "
\n" + @@ -5609,6 +5619,11 @@ function kickstartAE() { " \n" + " \n" + "
\n" + + "\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "
\n" + "
\n" + " \n" + @@ -9091,6 +9106,7 @@ function JiraIntegrationCtrl($uibModalInstance, $state, report, integrationName, vm.integrationName = integrationName; vm.statuses = []; vm.priorities = []; + vm.issue_types = []; vm.error_messages = []; vm.form = { content: '\n' + @@ -9111,6 +9127,8 @@ function JiraIntegrationCtrl($uibModalInstance, $state, report, integrationName, } vm.assignees = data.assignees; vm.priorities = data.priorities; + vm.issue_types = data.issue_types; + vm.form.issue_type = vm.issue_types[0]; vm.form.responsible = vm.assignees[0]; vm.form.priority = vm.priorities[0]; }, function (error_data) { diff --git a/backend/src/appenlight/views/integrations/bitbucket.py b/backend/src/appenlight/views/integrations/bitbucket.py index b087556..64ffbd1 100644 --- a/backend/src/appenlight/views/integrations/bitbucket.py +++ b/backend/src/appenlight/views/integrations/bitbucket.py @@ -86,7 +86,7 @@ class BitbucketView(IntegrationView): return {'error_messages': [str(e)]} comment_body = 'Bitbucket issue created: %s ' % issue['web_url'] - comment = ReportComment(user_name=self.request.user.user_name, + comment = ReportComment(owner_id=self.request.user.id, report_time=report.first_timestamp, body=comment_body) report.comments.append(comment) diff --git a/backend/src/appenlight/views/integrations/github.py b/backend/src/appenlight/views/integrations/github.py index 664c007..6bc05e7 100644 --- a/backend/src/appenlight/views/integrations/github.py +++ b/backend/src/appenlight/views/integrations/github.py @@ -88,7 +88,7 @@ class GithubView(IntegrationView): return {'error_messages': [str(e)]} comment_body = 'Github issue created: %s ' % issue['web_url'] - comment = ReportComment(user_name=self.request.user.user_name, + comment = ReportComment(owner_id=self.request.user.id, report_time=report.first_timestamp, body=comment_body) report.comments.append(comment) diff --git a/backend/src/appenlight/views/integrations/jira.py b/backend/src/appenlight/views/integrations/jira.py index f10e4b3..d315f2b 100644 --- a/backend/src/appenlight/views/integrations/jira.py +++ b/backend/src/appenlight/views/integrations/jira.py @@ -68,15 +68,19 @@ class JiraView(IntegrationView): return {'error_messages': [str(e)]} assignees = [] priorities = [] - metadata = client.get_metadata() - for issue_type in metadata: + issue_types = [] + possible_issue_types = client.get_issue_types(self.request) + for issue_type in possible_issue_types: for field in issue_type['fields']: if field['id'] == 'assignee': assignees = field['values'] if field['id'] == 'priority': priorities = field['values'] + issue_types.append({'name':issue_type['name'], + 'id':issue_type['id']}) return {'assignees': assignees, - 'priorities': priorities} + 'priorities': priorities, + 'issue_types': issue_types} @view_config(route_name='integrations_id', match_param=['action=create-issue', @@ -92,20 +96,20 @@ class JiraView(IntegrationView): 'title': self.request.unsafe_json_body.get('title', 'Unknown Title'), 'content': self.request.unsafe_json_body.get('content', ''), - 'kind': 'bug', + 'issue_type': self.request.unsafe_json_body['issue_type']['id'], 'priority': self.request.unsafe_json_body['priority']['id'], 'responsible': self.request.unsafe_json_body['responsible']['id'], 'project': self.integration.config['project'] } try: client = self.create_client() - issue = client.create_issue(form_data) + issue = client.create_issue(form_data, request=self.request) except IntegrationException as e: self.request.response.status_code = 503 return {'error_messages': [str(e)]} comment_body = 'Jira issue created: %s ' % issue['web_url'] - comment = ReportComment(user_name=self.request.user.user_name, + comment = ReportComment(owner_id=self.request.user.id, report_time=report.first_timestamp, body=comment_body) report.comments.append(comment) diff --git a/frontend/src/controllers/integrations/jira.js b/frontend/src/controllers/integrations/jira.js index 94950de..1834f6e 100644 --- a/frontend/src/controllers/integrations/jira.js +++ b/frontend/src/controllers/integrations/jira.js @@ -30,6 +30,7 @@ function JiraIntegrationCtrl($uibModalInstance, $state, report, integrationName, vm.integrationName = integrationName; vm.statuses = []; vm.priorities = []; + vm.issue_types = []; vm.error_messages = []; vm.form = { content: '\n' + @@ -50,6 +51,8 @@ function JiraIntegrationCtrl($uibModalInstance, $state, report, integrationName, } vm.assignees = data.assignees; vm.priorities = data.priorities; + vm.issue_types = data.issue_types; + vm.form.issue_type = vm.issue_types[0]; vm.form.responsible = vm.assignees[0]; vm.form.priority = vm.priorities[0]; }, function (error_data) { diff --git a/frontend/src/templates/applications/integrations/jira.html b/frontend/src/templates/applications/integrations/jira.html index 17b9e3a..4dabf2c 100644 --- a/frontend/src/templates/applications/integrations/jira.html +++ b/frontend/src/templates/applications/integrations/jira.html @@ -16,6 +16,11 @@
+ +

+ https://servername.atlassian.net +

+
@@ -27,6 +32,11 @@ + +

+ user@email.com +

+
diff --git a/frontend/src/templates/integrations/jira.html b/frontend/src/templates/integrations/jira.html index 35aaf99..136725e 100644 --- a/frontend/src/templates/integrations/jira.html +++ b/frontend/src/templates/integrations/jira.html @@ -12,6 +12,11 @@
+ +
+ + +