'Decode the json into CourseMetadata and save any changed attrs to the db.
Ensures none of the fields are in the blacklist.'

@classmethod
def update_from_json(cls, descriptor, jsondict, user, filter_tabs=True):

    filtered_list = cls.filtered_list()
    if (not filter_tabs):
        filtered_list.remove('tabs')
    key_values = {}
    for (key, model) in jsondict.iteritems():
        if (key in filtered_list):
            continue
        try:
            val = model['value']
            if (hasattr(descriptor, key) and (getattr(descriptor, key) != val)):
                key_values[key] = descriptor.fields[key].from_json(val)
        except (TypeError, ValueError) as err:
            raise ValueError(_("Incorrect    format    for    field    '{name}'.    {detailed_message}").format(name=model['display_name'], detailed_message=err.message))
    return cls.update_from_dict(key_values, descriptor, user)
