Defect #9598

JSON REST API : PUT returns one space character

Added by Francis West almost 10 years ago. Updated almost 10 years ago.

Status:ClosedStart date:2011-11-18
Priority:HighDue date:
Assignee:-% Done:


Category:REST API
Target version:-
Resolution:Invalid Affected version:1.2.2


I am trying to build a python class to support creating, updating and closing tickets to be used in my deploy system. It looks something like this:

class Issues(Resource):      
    def __init__(self, **kwargs):
        init Issues
        redmine_url = "<URL>" 
        self.key = None
        self.project = None
        super(Issues, self).__init__(redmine_url, 
    def set_key(self, key):
        self.key = key

    def set_project(self, project):
        self.project = project

    def tickets(self):
        if (self.key == None) and (self.project == None):
            resp = dict()
            resp = self.get('issues.json', project=self.project, key=self.key)
        return resp

    def get_ticket(self, ticket_id):
        resp = self.get('issues/%s.json' % ticket_id,
                        project=self.project, key=self.key)
        return resp

    def update_ticket(self, ticket_update, ticket_id):
        json_ticket = json.dumps(ticket_update)
        resp = self.put('issues/%s.json' % ticket_id,
                        headers={'Content-type': 'application/json', },
                        params_dict={'key': self.key, })       

        return resp

    def new_ticket(self, ticket):
        json_ticket = json.dumps(ticket)
        resp ='issues.json',
                         headers={'Content-type': 'application/json',
                                  'key': self.key,
                                  'project': self.project},
                         params_dict={'key': self.key,
                                      'project': self.project}
        return resp

    def request(self, *args, **kwargs):
        resp = super(Issues, self).request(*args, **kwargs)
        self.body_string = resp.body_string()
        if len(self.body_string) == 1:
            return dict()
            return json.loads(self.body_string)
        return self.body_string

a quick test harness

from redmine import Issues
from pprint import pprint
issue = Issues()
issue.set_key('<what ever>')

# create a ticket
a = {'issue': {'project_id': 'Project_X', 'description': 'information description', 'subject': 'something test', 'tracker_id': 4}}
z = issue.new_ticket(a)
ticket_id = z['issue']['id']

z['issue']['notes'] = u"Changing the subject" 
z['issue']['status'] = {'id': 3}
z['issue']['done_ratio'] = 100
z['issue']['subject'] = u"Example issue (was: %s)" % z['issue']['subject']
asd = issue.update_ticket(z,ticket_id)

So the print out from z looks very sensible and with the right permissions the ticket updates!

The problem is with the return value of the update which breaks the json.loads on the request method. This is because I do not get some JSON returned, just a ' '.

I think the ticket should be returned with its updates! also if there were any errors could they be returned in ['errors'] for example?

Yes, right now I could get the ticket again to check if the updates have happened. However this is not a good solution.

Related issues

Related to Redmine - Defect #11388: Updating a version through rest API returns invalid JSON Closed


#1 Updated by Jean-Philippe Lang almost 10 years ago

  • Status changed from New to Closed
  • Resolution set to Invalid
This is a common behaviour of the API. When you update an object:
  • you get a simple 200 OK if the update succeeded.
  • you get a 422 Unprocessable Entity with the errors in the response body if the update failed.

Also available in: Atom PDF