Exemple #1
0
    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))
Exemple #2
0
    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))