diff --git a/pagure/api/__init__.py b/pagure/api/__init__.py index f2699e7..4c5f595 100644 --- a/pagure/api/__init__.py +++ b/pagure/api/__init__.py @@ -89,7 +89,6 @@ class APIERROR(enum.Enum): ENOTMAINADMIN = 'Only the main admin can set the main admin of a project' EMODIFYPROJECTNOTALLOWED = 'You are not allowed to modify this project' EINVALIDPERPAGEVALUE = 'The per_page value must be between 1 and 100' - EINVALIDCUSTOMFIELDS = 'This request format is invalid' def get_authorized_api_project(SESSION, repo, user=None, namespace=None): diff --git a/pagure/api/issue.py b/pagure/api/issue.py index 3333e4e..577ccef 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -125,17 +125,17 @@ def _check_ticket_access(issue): def _check_link_custom_field(field, links): """Check if the value provided in the link custom field is a link. - ::param field (pagure.lib.model.IssueKeys) : The issue custom field key object. - ::param links (str): Value of the custom field. - ::raises pagure.exceptions.APIERROR.EINVALIDISSUEFIELD_LINK when invalid. + :param field : The issue custom field key object. + :param links : Value of the custom field. + :raises pagure.exceptions.APIERROR when invalid. """ if field.key_type == 'link': - links = links.split(',') - for link in links: - link = link.replace(' ', '') - if not urlpattern.match(link): - raise pagure.exceptions.APIError( - 400, error_code=APIERROR.EINVALIDISSUEFIELD_LINK) + links = links.split(',') + for link in links: + link = link.replace(' ', '') + if not urlpattern.match(link): + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDISSUEFIELD_LINK) @API.route('//new_issue', methods=['POST']) @@ -1250,28 +1250,42 @@ def api_update_custom_fields( +------------------+---------+--------------+-----------------------------+ | Key | Type | Optionality | Description | +==================+=========+==============+=============================+ - | ``fields`` | dict | Mandatory | A dictionary with the field | + | ``myfields`` | dict | Mandatory | A dictionary with the fields| | | | | name as key and the value | +------------------+---------+--------------+-----------------------------+ + Sample payload + ^^^^^^^^^^^^^^ + + :: + + { + "myField": "to do", + "myField_1": "test", + "myField_2": "done", + } + Sample response ^^^^^^^^^^^^^^^ :: { - "fields": [ + "messages": [ + { + "myField" : "Custom field myField adjusted to to do" + }, { - "myField" : "Custom field myField adjusted to test (was: to do)" + "myField_1": "Custom field myField_1 adjusted test (was: to do)" }, { - "myField_1": "Custom field myField_1 adjusted to done (was: test)" + "myField_2": "Custom field myField_1 adjusted to done (was: test)" } ] } """ # noqa - output = {'fields': []} + output = {'messages': []} repo = _get_repo(repo, username, namespace) _check_issue_tracker(repo) _check_token(repo) @@ -1279,13 +1293,11 @@ def api_update_custom_fields( issue = _get_issue(repo, issueid) _check_ticket_access(issue) - fields = flask.request.get_json(force=True, silent=True) + fields = flask.request.form - if fields is None or fields.get('fields') is None: + if not fields: raise pagure.exceptions.APIError( - 400, error_code=APIERROR.EINVALIDCUSTOMFIELDS) - - fields = fields.get('fields') + 400, error_code=APIERROR.EINVALIDREQ) repo_fields = {k.name: k for k in repo.issue_keys} @@ -1304,7 +1316,7 @@ def api_update_custom_fields( SESSION.commit() if message: - output['fields'].append({key.name: message}) + output['messages'].append({key.name: message}) pagure.lib.add_metadata_update_notif( session=SESSION, issue=issue, @@ -1313,7 +1325,7 @@ def api_update_custom_fields( ticketfolder=APP.config['TICKETS_FOLDER'] ) else: - output['fields'].append({key.name: 'No changes'}) + output['messages'].append({key.name: 'No changes'}) except pagure.exceptions.PagureException as err: raise pagure.exceptions.APIError( 400, error_code=APIERROR.ENOCODE, error=str(err)) diff --git a/tests/test_pagure_flask_api_issue_custom_fields.py b/tests/test_pagure_flask_api_issue_custom_fields.py index 7abbc4e..e0f1e02 100644 --- a/tests/test_pagure_flask_api_issue_custom_fields.py +++ b/tests/test_pagure_flask_api_issue_custom_fields.py @@ -6,7 +6,6 @@ """ - import unittest import sys import os @@ -61,9 +60,8 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} - # Request is not formated correctly - payload = json.dumps({'field': - {'foo': 'bar'}}) + # Request is not formated correctly (EMPTY) + payload = {} output = self.app.post( '/api/0/test/issue/1/custom', headers=headers, data=payload) self.assertEqual(output.status_code, 400) @@ -71,8 +69,8 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.assertDictEqual( data, { - "error": "This request format is invalid", - "error_code": "EINVALIDCUSTOMFIELDS", + "error": "Invalid or incomplete input submited", + "error_code": "EINVALIDREQ", } ) @@ -83,8 +81,7 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} # Project does not have this custom field - payload = json.dumps({'fields': - {'foo': 'bar'}}) + payload = {'foo': 'bar'} output = self.app.post( '/api/0/test/issue/1/custom', headers=headers, data=payload) self.assertEqual(output.status_code, 400) @@ -104,13 +101,6 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): headers = {'Authorization': 'token aaabbbcccddd'} - repo = pagure.get_authorized_project(self.session, 'test') - settings = repo.settings - settings['issue_tracker'] = True - repo.settings = settings - self.session.add(repo) - self.session.commit() - # Set some custom fields repo = pagure.get_authorized_project(self.session, 'test') msg = pagure.lib.set_custom_key_fields( @@ -122,8 +112,7 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.session.commit() self.assertEqual(msg, 'List of custom fields updated') - payload = json.dumps({'fields': - {'bugzilla': '', 'upstream': True}}) + payload = {'bugzilla': '', 'upstream': True} output = self.app.post( '/api/0/test/issue/1/custom', headers=headers, data=payload) self.assertEqual(output.status_code, 200) @@ -131,7 +120,7 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.assertDictEqual( data, { - "fields": [ + "messages": [ {"bugzilla": "No changes"}, {"upstream": "Custom field upstream adjusted to True"}, ] @@ -142,10 +131,9 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertEqual(len(issue.other_fields), 1) - payload = json.dumps({'fields': - {'bugzilla': 'https://bugzilla.redhat.com/1234', - 'upstream': False, - 'reviewstatus': 'ack'}}) + payload = {'bugzilla': 'https://bugzilla.redhat.com/1234', + 'upstream': False, + 'reviewstatus': 'ack'} output = self.app.post( '/api/0/test/issue/1/custom', headers=headers, data=payload) @@ -154,11 +142,11 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.assertDictEqual( data, { - "fields": [ + "messages": [ {"bugzilla": "Custom field bugzilla adjusted to " "https://bugzilla.redhat.com/1234"}, {"reviewstatus": "Custom field reviewstatus adjusted to ack"}, - {"upstream": "Custom field upstream reset (from 1)"}, + {"upstream": "Custom field upstream adjusted to False (was: True)"}, ] } @@ -169,10 +157,7 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.assertEqual(len(issue.other_fields), 3) # Reset the value - payload = json.dumps({'fields': - {'bugzilla': '', - 'upstream': '', - 'reviewstatus': ''}}) + payload = {'bugzilla': '', 'upstream': '', 'reviewstatus': ''} output = self.app.post( '/api/0/test/issue/1/custom', headers=headers, data=payload) @@ -181,11 +166,11 @@ class PagureFlaskApiCustomFieldIssuetests(tests.Modeltests): self.assertDictEqual( data, { - "fields": [ + "messages": [ {"bugzilla": "Custom field bugzilla reset " "(from https://bugzilla.redhat.com/1234)"}, {"reviewstatus": "Custom field reviewstatus reset (from ack)"}, - {"upstream": "Custom field upstream reset (from 0)"}, + {"upstream": "Custom field upstream reset (from False)"}, ] } )