def create(self): if not self._check_access(model.System(), model.Action.PACKAGE_CREATE): return json.dumps(_('Access denied')) # Create a Package. fs = self._get_standard_package_fieldset() try: request_data = self._get_request_data() request_fa_dict = ckan.forms.edit_package_dict(ckan.forms.get_package_dict(fs=fs), request_data) fs = fs.bind(model.Package, data=request_fa_dict, session=model.Session) log.debug('Created object %s' % str(fs.name.value)) obj = fs.model # Validate the fieldset. validation = fs.validate() if not validation: # Complain about validation errors. log.error('Validation error: %r' % repr(fs.errors)) response.write(self._finish(409, repr(fs.errors), content_type='json')) else: try: # Construct new revision. rev = model.repo.new_revision() rev.author = self.rest_api_user rev.message = _(u'REST API: Create object %s') % str(fs.name.value) # Construct catalogue entity. fs.sync() # Construct access control entities. if self.rest_api_user: admins = [model.User.by_name(self.rest_api_user.decode('utf8'))] else: admins = [] model.setup_default_user_roles(fs.model, admins) for item in self.extensions: item.create(fs.model) # Commit model.repo.commit() # Set location header with new ID. location = str('%s/%s' % (request.path, obj.id)) response.headers['Location'] = location log.debug('Response headers: %r' % (response.headers)) response.write(self._finish_ok( obj.as_dict(), newly_created_resource_location=location)) except Exception, inst: log.exception(inst) model.Session.rollback() log.error('Exception creating object %s: %r' % (str(fs.name.value), inst)) raise except ValueError, inst: response.status_int = 400 response.write(_(u'JSON Error: %s') % str(inst))
def update(self, id): entity = self._get_pkg(id) if entity is not None and not self._check_access(entity, model.Action.EDIT): return json.dumps(_('Access denied')) if entity is None: response.status_int = 404 response.write(_('Package was not found.')) else: fs = self._get_standard_package_fieldset() orig_entity_dict = ckan.forms.get_package_dict(pkg=entity, fs=fs) try: request_data = self._get_request_data() request_fa_dict = ckan.forms.edit_package_dict(orig_entity_dict, request_data, id=entity.id) fs = fs.bind(entity, data=request_fa_dict) validation = fs.validate() if not validation: response.write(self._finish(409, repr(fs.errors), content_type='json')) else: try: rev = model.repo.new_revision() rev.author = self.rest_api_user rev.message = _(u'REST API: Update object %s') % str(fs.name.value) fs.sync() for item in self.extensions: item.edit(fs.model) model.repo.commit() except Exception, inst: log.exception(inst) model.Session.rollback() if inst.__class__.__name__ == 'IntegrityError': response.status_int = 409 response.write(_(u'Integrity Error')) else: raise obj = fs.model response.write(self._finish_ok(obj.as_dict())) except ValueError, inst: response.status_int = 400 response.write(_('JSON Error: %s') % str(inst)) except ckan.forms.PackageDictFormatError, inst: response.status_int = 400 response.write(_(u'Package format incorrect: %s') % str(inst))