def datastore_delete(context, data_dict): '''Deletes a table or a set of records from the datastore. :param resource_id: resource id that the data will be deleted from. :type resource_id: string :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. :type filters: dictionary :returns: original filters sent. :rtype: dictionary ''' res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''' ) results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound( p.toolkit._('Resource "{0}" was not found.'.format(res_id))) p.toolkit.check_access('datastore_delete', context, data_dict) result = db.delete(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_delete(context, data_dict): '''Deletes a table or a set of records from the datastore. :param resource_id: resource id that the data will be deleted from. :type resource_id: string :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. :type filters: dictionary :returns: original filters sent. :rtype: dictionary ''' res_id = _get_or_bust(data_dict, 'resource_id') data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''') results = db._get_engine(None, data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( 'Resource "{0}" was not found.'.format(res_id) )) p.toolkit.check_access('datastore_delete', context, data_dict) result = db.delete(context, data_dict) result.pop('id', None) result.pop('connection_url') return result
def datastore_delete(context, data_dict): '''Deletes a table from the datastore. :param resource_id: resource id that the data will be deleted from. :type resource_id: string :param filter: filter to do deleting on over (eg {'name': 'fred'}). If missing delete whole table. :returns: original filters sent. :rtype: dictionary ''' model = _get_or_bust(context, 'model') id = _get_or_bust(data_dict, 'resource_id') if not model.Resource.get(id): raise p.toolkit.ObjectNotFound(p.toolkit._( 'Resource "{}" was not found.'.format(id) )) p.toolkit.check_access('datastore_delete', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore_write_url'] result = db.delete(context, data_dict) result.pop('id') result.pop('connection_url') return result
def datastore_delete(context, data_dict): '''Deletes a table from the datastore. :param resource_id: resource id that the data will be deleted from. :type resource_id: string :param filter: filter to do deleting on over (eg {'name': 'fred'}). If missing delete whole table. :returns: original filters sent. :rtype: dictionary ''' model = _get_or_bust(context, 'model') id = _get_or_bust(data_dict, 'resource_id') if not model.Resource.get(id): raise p.toolkit.ObjectNotFound( p.toolkit._('Resource "{}" was not found.'.format(id))) p.toolkit.check_access('datastore_delete', context, data_dict) data_dict['connection_url'] = pylons.config['ckan.datastore_write_url'] result = db.delete(context, data_dict) result.pop('id') result.pop('connection_url') return result
def after_delete(self, context, resources): model = context['model'] pkg = context['package'] res_query = model.Session.query(model.Resource) query = res_query.filter(model.Resource.package_id == pkg.id, model.Resource.state == State.DELETED) deleted = [ res for res in query.all() if res.extras.get('datastore_active') is True ] for res in deleted: db.delete(context, { 'resource_id': res.id, 'connection_url': self.write_url }) res.extras['datastore_active'] = False res_query.update({'extras': res.extras}, synchronize_session=False)
def datastore_delete(context, data_dict): '''Deletes a table or a set of records from the DataStore. :param resource_id: resource id that the data will be deleted from. (optional) :type resource_id: string :param force: set to True to edit a read-only resource :type force: bool (optional, default: False) :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. (optional) :type filters: dictionary **Results:** :returns: Original filters sent. :rtype: dictionary ''' schema = context.get('schema', dsschema.datastore_upsert_schema()) filters = data_dict.pop('filters', None) data_dict, errors = _validate(data_dict, schema, context) if filters: data_dict['filters'] = filters if errors: raise p.toolkit.ValidationError(errors) p.toolkit.check_access('datastore_delete', context, data_dict) if not data_dict.pop('force', False): resource_id = data_dict['resource_id'] _check_read_only(context, resource_id) data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] res_id = data_dict['resource_id'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''' ) results = db._get_engine(data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound( p.toolkit._(u'Resource "{0}" was not found.'.format(res_id))) result = db.delete(context, data_dict) # Set the datastore_active flag on the resource if necessary if not data_dict.get('filters'): p.toolkit.get_action('resource_patch')(context, { 'id': data_dict['resource_id'], 'datastore_active': False }) result.pop('id', None) result.pop('connection_url') return result
def after_delete(self, context, resources): model = context['model'] pkg = context['package'] res_query = model.Session.query(model.Resource) query = res_query.filter( model.Resource.package_id == pkg.id, model.Resource.state == State.DELETED ) deleted = [ res for res in query.all() if res.extras.get('datastore_active') is True] for res in deleted: db.delete(context, { 'resource_id': res.id, 'connection_url': self.write_url }) res.extras['datastore_active'] = False res_query.update( {'extras': res.extras}, synchronize_session=False)
def datastore_delete(context, data_dict): '''Deletes a table or a set of records from the DataStore. :param resource_id: resource id that the data will be deleted from. (optional) :type resource_id: string :param force: set to True to edit a read-only resource :type force: bool (optional, default: False) :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. (optional) :type filters: dictionary **Results:** :returns: Original filters sent. :rtype: dictionary ''' schema = context.get('schema', dsschema.datastore_upsert_schema()) filters = data_dict.pop('filters', None) data_dict, errors = _validate(data_dict, schema, context) if filters: data_dict['filters'] = filters if errors: raise p.toolkit.ValidationError(errors) p.toolkit.check_access('datastore_delete', context, data_dict) if not data_dict.pop('force', False): resource_id = data_dict['resource_id'] _check_read_only(context, resource_id) data_dict['connection_url'] = pylons.config['ckan.datastore.write_url'] res_id = data_dict['resource_id'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''') results = db._get_engine(data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( u'Resource "{0}" was not found.'.format(res_id) )) result = db.delete(context, data_dict) # Set the datastore_active flag on the resource if necessary if not data_dict.get('filters'): p.toolkit.get_action('resource_patch')( context, {'id': data_dict['resource_id'], 'datastore_active': False}) result.pop('id', None) result.pop('connection_url') return result
def datastore_delete(context, data_dict): """Deletes a table or a set of records from the DataStore. :param resource_id: resource id that the data will be deleted from. (optional) :type resource_id: string :param force: set to True to edit a read-only resource :type force: bool (optional, default: False) :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. (optional) :type filters: dictionary **Results:** :returns: Original filters sent. :rtype: dictionary """ schema = context.get("schema", dsschema.datastore_upsert_schema()) filters = data_dict.pop("filters", None) data_dict, errors = _validate(data_dict, schema, context) if filters: data_dict["filters"] = filters if errors: raise p.toolkit.ValidationError(errors) p.toolkit.check_access("datastore_delete", context, data_dict) if not data_dict.pop("force", False): resource_id = data_dict["resource_id"] _check_read_only(context, resource_id) data_dict["connection_url"] = pylons.config["ckan.datastore.write_url"] res_id = data_dict["resource_id"] resources_sql = sqlalchemy.text( u"""SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL""" ) results = db._get_engine(data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._(u'Resource "{0}" was not found.'.format(res_id))) result = db.delete(context, data_dict) result.pop("id", None) result.pop("connection_url") return result
def datastore_delete(context, data_dict): '''Deletes a table or a set of records from the DataStore. :param resource_id: resource id that the data will be deleted from. (optional) :type resource_id: string :param force: set to True to edit a read-only resource :type force: bool (optional, default: False) :param filters: filters to apply before deleting (eg {"name": "fred"}). If missing delete whole table and all dependent views. (optional) :type filters: dictionary **Results:** :returns: Original filters sent. :rtype: dictionary ''' schema = context.get('schema', dsschema.datastore_upsert_schema()) # Remove any applied filters before running validation. filters = data_dict.pop('filters', None) data_dict, errors = _validate(data_dict, schema, context) if filters is not None: if not isinstance(filters, dict): raise p.toolkit.ValidationError({ 'filters': [ 'filters must be either a dict or null.' ] }) data_dict['filters'] = filters if errors: raise p.toolkit.ValidationError(errors) p.toolkit.check_access('datastore_delete', context, data_dict) if not data_dict.pop('force', False): resource_id = data_dict['resource_id'] _check_read_only(context, resource_id) data_dict['connection_url'] = config['ckan.datastore.write_url'] res_id = data_dict['resource_id'] resources_sql = sqlalchemy.text(u'''SELECT 1 FROM "_table_metadata" WHERE name = :id AND alias_of IS NULL''') results = db._get_engine(data_dict).execute(resources_sql, id=res_id) res_exists = results.rowcount > 0 if not res_exists: raise p.toolkit.ObjectNotFound(p.toolkit._( u'Resource "{0}" was not found.'.format(res_id) )) result = db.delete(context, data_dict) # Set the datastore_active flag on the resource if necessary model = _get_or_bust(context, 'model') resource = model.Resource.get(data_dict['resource_id']) if (not data_dict.get('filters') and resource.extras.get('datastore_active') is True): log.debug( 'Setting datastore_active=False on resource {0}'.format(resource.id) ) set_datastore_active_flag(model, data_dict, False) result.pop('id', None) result.pop('connection_url') return result