Update this issue on the server.

        Each keyword argument (other than the predefined ones) is treated as a field name and the argument's value
        is treated as the intended value for that field -- if the fields argument is used, all other keyword arguments
        will be ignored.

        JIRA projects may contain many different issue types. Some issue screens have different requirements for
        fields in an issue. This information is available through the :py:meth:`.JIRA.editmeta` method. Further examples
        are available here: https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Edit+issues

        :param fields: a dict containing field names and the values to use
        :param update: a dict containing update operations to apply
        :param notify: query parameter notifyUsers. If true send the email with notification that the issue was updated
                       to users that watch it. Admin or project admin permissions are required to disable the notification.
        :param fieldargs: keyword arguments will generally be merged into fields, except lists,
                          which will be merged into updates

        :type fields: dict
        :type update: dict

def update(self, fields=None, update=None, async_=None, jira=None, notify=True, **fieldargs):
        """Update this issue on the server.

        Each keyword argument (other than the predefined ones) is treated as a field name and the argument's value
        is treated as the intended value for that field -- if the fields argument is used, all other keyword arguments
        will be ignored.

        JIRA projects may contain many different issue types. Some issue screens have different requirements for
        fields in an issue. This information is available through the :py:meth:`.JIRA.editmeta` method. Further examples
        are available here: https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Edit+issues

        :param fields: a dict containing field names and the values to use
        :param update: a dict containing update operations to apply
        :param notify: query parameter notifyUsers. If true send the email with notification that the issue was updated
                       to users that watch it. Admin or project admin permissions are required to disable the notification.
        :param fieldargs: keyword arguments will generally be merged into fields, except lists,
                          which will be merged into updates

        :type fields: dict
        :type update: dict

        """
        data = {}
        if fields is not None:
            fields_dict = fields
        else:
            fields_dict = {}
        data['fields'] = fields_dict
        if update is not None:
            update_dict = update
        else:
            update_dict = {}
        data['update'] = update_dict
        for field in sorted(fieldargs.keys()):
            value = fieldargs[field]
            # apply some heuristics to make certain changes easier
            if isinstance(value, string_types):
                if field == 'assignee' or field == 'reporter':
                    fields_dict['assignee'] = {'name': value}
                elif field == 'comment':
                    if 'comment' not in update_dict:
                        update_dict['comment'] = []
                    update_dict['comment'].append({
                        'add': {'body': value}})
                else:
                    fields_dict[field] = value
            elif isinstance(value, list):
                if field not in update_dict:
                    update_dict[field] = []
                update_dict[field].extend(value)
            else:
                fields_dict[field] = value

        super(Issue, self).update(async_=async_, jira=jira, notify=notify, fields=data)