diff --git a/ckan/controllers/revision.py b/ckan/controllers/revision.py index a5856835698..d12a793cf20 100644 --- a/ckan/controllers/revision.py +++ b/ckan/controllers/revision.py @@ -62,8 +62,6 @@ def list(self): package_indications = [] revision_changes = model.repo.list_changes(revision) resource_revisions = revision_changes[model.Resource] - resource_group_revisions = \ - revision_changes[model.ResourceGroup] package_extra_revisions = revision_changes[model.PackageExtra] for package in revision.packages: if not package: @@ -89,16 +87,9 @@ def list(self): else: transition = 'updated' for resource_revision in resource_revisions: - if resource_revision.continuity.resource_group.\ - package_id == package.id: + if resource_revision.package_id == package.id: transition += ':resources' break - for resource_group_revision in \ - resource_group_revisions: - if resource_group_revision.package_id == \ - package.id: - transition += ':resource_group' - break for package_extra_revision in package_extra_revisions: if package_extra_revision.package_id == \ package.id: diff --git a/ckan/lib/create_test_data.py b/ckan/lib/create_test_data.py index 324531ee70d..2d02ffe1f79 100644 --- a/ckan/lib/create_test_data.py +++ b/ckan/lib/create_test_data.py @@ -440,8 +440,8 @@ def create(cls, auth_profile="", package_type=None): ) model.Session.add(pr1) model.Session.add(pr2) - pkg1.resource_groups_all[0].resources_all.append(pr1) - pkg1.resource_groups_all[0].resources_all.append(pr2) + pkg1.resources_all.append(pr1) + pkg1.resources_all.append(pr2) pkg1.notes = u'''Some test notes ### A 3rd level heading diff --git a/ckan/lib/dictization/model_dictize.py b/ckan/lib/dictization/model_dictize.py index ce0f4df75ab..ddaf63e271c 100644 --- a/ckan/lib/dictization/model_dictize.py +++ b/ckan/lib/dictization/model_dictize.py @@ -146,7 +146,6 @@ def _unified_resource_format(format_): def resource_dictize(res, context): model = context['model'] resource = d.table_dictize(res, context) - resource_group_id = resource['resource_group_id'] extras = resource.pop("extras", None) if extras: resource.update(extras) @@ -156,13 +155,11 @@ def resource_dictize(res, context): ## for_edit is only called at the times when the dataset is to be edited ## in the frontend. Without for_edit the whole qualified url is returned. if resource.get('url_type') == 'upload' and not context.get('for_edit'): - resource_group = model.Session.query( - model.ResourceGroup).get(resource_group_id) last_part = url.split('/')[-1] cleaned_name = munge.munge_filename(last_part) resource['url'] = h.url_for(controller='package', action='resource_download', - id=resource_group.package_id, + id=resource['package_id'], resource_id=res.id, filename=cleaned_name, qualified=True) @@ -240,13 +237,8 @@ def package_dictize(pkg, context): result_dict['title'] = result_dict['title'].strip() #resources res_rev = model.resource_revision_table - resource_group = model.resource_group_table - q = select([res_rev], from_obj = res_rev.join(resource_group, - resource_group.c.id == res_rev.c.resource_group_id)) - q = q.where(resource_group.c.package_id == pkg.id) - result = _execute_with_revision(q, res_rev, context) - result_dict["resources"] = resource_list_dictize(result, context) - result_dict['num_resources'] = len(result_dict.get('resources', [])) + + result_dict["resources"] = resource_list_dictize(pkg.resources_all,context) #tags tag_rev = model.package_tag_revision_table diff --git a/ckan/lib/dictization/model_save.py b/ckan/lib/dictization/model_save.py index 56ba6ec0758..0fe2c319541 100644 --- a/ckan/lib/dictization/model_save.py +++ b/ckan/lib/dictization/model_save.py @@ -71,8 +71,8 @@ def package_resource_list_save(res_dicts, package, context): pending = context.get('pending') - resource_list = package.resource_groups_all[0].resources_all - old_list = package.resource_groups_all[0].resources_all[:] + resource_list = package.resources_all + old_list = package.resources_all[:] obj_list = [] for res_dict in res_dicts or []: diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index f56d64cb5a4..91d4ce59879 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -1676,7 +1676,7 @@ def resource_search(context, data_dict): offset = data_dict.get('offset') limit = data_dict.get('limit') - q = model.Session.query(model.Resource).join(model.ResourceGroup).join(model.Package) + q = model.Session.query(model.Resource).join(model.Package) q = q.filter(model.Package.state == 'active') q = q.filter(model.Package.private == False) q = q.filter(model.Resource.state == 'active') diff --git a/ckan/logic/action/update.py b/ckan/logic/action/update.py index 8118c7aacb7..8b809b05a1b 100644 --- a/ckan/logic/action/update.py +++ b/ckan/logic/action/update.py @@ -90,7 +90,7 @@ def make_latest_pending_package_active(context, data_dict): _make_latest_rev_active(context, q) #resources - for resource in pkg.resource_groups_all[0].resources_all: + for resource in pkg.resources_all: q = session.query(model.ResourceRevision).filter_by(id=resource.id) _make_latest_rev_active(context, q) @@ -214,7 +214,7 @@ def resource_update(context, data_dict): _check_access('resource_update', context, data_dict) del context["resource"] - package_id = resource.resource_group.package.id + package_id = resource.package.id pkg_dict = _get_action('package_show')(context, {'id': package_id}) for n, p in enumerate(pkg_dict['resources']): @@ -247,7 +247,7 @@ def package_update(context, data_dict): You must be authorized to edit the dataset and the groups that it belongs to. - + It is recommended to call :py:func:`ckan.logic.action.get.package_show`, make the desired changes to the result, and then call ``package_update()`` with it. @@ -735,7 +735,7 @@ def task_status_update_many(context, data_dict): '''Update many task statuses at once. :param data: the task_status dictionaries to update, for the format of task - status dictionaries see + status dictionaries see :py:func:`~task_status_update` :type data: list of dictionaries diff --git a/ckan/logic/auth/delete.py b/ckan/logic/auth/delete.py index 08974144a71..0ad5eda7a75 100644 --- a/ckan/logic/auth/delete.py +++ b/ckan/logic/auth/delete.py @@ -26,11 +26,7 @@ def resource_delete(context, data_dict): resource = get_resource_object(context, data_dict) # check authentication against package - query = model.Session.query(model.Package)\ - .join(model.ResourceGroup)\ - .join(model.Resource)\ - .filter(model.ResourceGroup.id == resource.resource_group_id) - pkg = query.first() + query = model.Package.get(resource.package_id) if not pkg: raise logic.NotFound(_('No package found for this resource, cannot check auth.')) diff --git a/ckan/logic/auth/get.py b/ckan/logic/auth/get.py index 37de61d975a..ad7d59c7799 100644 --- a/ckan/logic/auth/get.py +++ b/ckan/logic/auth/get.py @@ -126,11 +126,7 @@ def resource_show(context, data_dict): resource = get_resource_object(context, data_dict) # check authentication against package - query = model.Session.query(model.Package)\ - .join(model.ResourceGroup)\ - .join(model.Resource)\ - .filter(model.ResourceGroup.id == resource.resource_group_id) - pkg = query.first() + pkg = model.Package.get(resource.package_id) if not pkg: raise logic.NotFound(_('No package found for this resource, cannot check auth.')) diff --git a/ckan/logic/auth/update.py b/ckan/logic/auth/update.py index 176c333a5ff..cd32e1e96e6 100644 --- a/ckan/logic/auth/update.py +++ b/ckan/logic/auth/update.py @@ -51,11 +51,7 @@ def resource_update(context, data_dict): resource = logic_auth.get_resource_object(context, data_dict) # check authentication against package - query = model.Session.query(model.Package)\ - .join(model.ResourceGroup)\ - .join(model.Resource)\ - .filter(model.ResourceGroup.id == resource.resource_group_id) - pkg = query.first() + pkg = model.Package.get(resource.package_id) if not pkg: raise logic.NotFound( _('No package found for this resource, cannot check auth.') diff --git a/ckan/logic/schema.py b/ckan/logic/schema.py index e9bd4077260..648fc433dc0 100644 --- a/ckan/logic/schema.py +++ b/ckan/logic/schema.py @@ -67,7 +67,6 @@ def default_resource_schema(): schema = { 'id': [ignore_empty, unicode], 'revision_id': [ignore_missing, unicode], - 'resource_group_id': [ignore], 'package_id': [ignore], 'url': [not_empty, unicode],#, URL(add_http=False)], 'description': [ignore_missing, unicode], @@ -204,7 +203,6 @@ def default_show_package_schema(): 'cache_last_updated': [ckan.lib.navl.validators.ignore_missing], 'webstore_last_updated': [ckan.lib.navl.validators.ignore_missing], 'revision_timestamp': [], - 'resource_group_id': [], 'cache_last_updated': [], 'webstore_last_updated': [], 'size': [], diff --git a/ckan/migration/versions/072-remove-resource-groups.py b/ckan/migration/versions/072-remove-resource-groups.py new file mode 100644 index 00000000000..a93f90e1f55 --- /dev/null +++ b/ckan/migration/versions/072-remove-resource-groups.py @@ -0,0 +1,27 @@ +import ckan.model + + +def upgrade(migrate_engine): + migrate_engine.execute( + ''' + ALTER TABLE "resource" ADD COLUMN "package_id" text NOT NULL DEFAULT ''; + UPDATE "resource" AS R + SET package_id = G.package_id + FROM "resource_group" AS G + WHERE R.resource_group_id = G.id; + + ALTER TABLE "resource_revision" ADD COLUMN "package_id" text NOT NULL DEFAULT ''; + UPDATE "resource_revision" AS R + SET package_id = G.package_id + FROM "resource_group_revision" AS G + WHERE R.resource_group_id = G.id; + + ALTER TABLE resource DROP CONSTRAINT resource_resource_group_id_fkey; + ALTER TABLE resource_revision DROP CONSTRAINT resource_revision_resource_group_id_fkey; + + DROP TABLE "resource_group"; + DROP TABLE "resource_group_revision"; + ''' + ) + + diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index 96812963a17..8bd33da393f 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -89,14 +89,10 @@ ) from resource import ( Resource, - ResourceGroup, ResourceRevision, DictProxy, - resource_group_table, resource_table, resource_revision_table, - ResourceGroupRevision, - resource_group_revision_table, ) from tracking import ( tracking_summary_table, @@ -408,7 +404,7 @@ def purge_revision(self, revision, leave_record=False): repo = Repository(meta.metadata, meta.Session, versioned_objects=[Package, PackageTag, Resource, - ResourceGroup, PackageExtra, Member, + PackageExtra, Member, Group] ) diff --git a/ckan/model/package.py b/ckan/model/package.py index a6663a02e42..eff975780c1 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -65,8 +65,6 @@ class Package(vdm.sqlalchemy.RevisionedObjectMixin, def __init__(self, **kw): from ckan import model super(Package, self).__init__(**kw) - resource_group = model.ResourceGroup(label="default") - self.resource_groups_all.append(resource_group) @classmethod def search_by_name(cls, text_query): @@ -85,12 +83,8 @@ def get(cls, reference): @property def resources(self): - if len(self.resource_groups_all) == 0: - return [] - - assert len(self.resource_groups_all) == 1, "can only use resources on packages if there is only one resource_group" - return [resource for resource in - self.resource_groups_all[0].resources_all + return [resource for resource in + self.resources_all if resource.state <> 'deleted'] def related_packages(self): @@ -98,8 +92,8 @@ def related_packages(self): def add_resource(self, url, format=u'', description=u'', hash=u'', **kw): import resource - self.resource_groups_all[0].resources_all.append(resource.Resource( - resource_group_id=self.resource_groups_all[0].id, + self.resources_all.append(resource.Resource( + package_id=self.id, url=url, format=format, description=description, @@ -377,7 +371,7 @@ def all_related_revisions(self): Ordered by most recent first. ''' from tag import PackageTag - from resource import ResourceGroup, Resource + from resource import Resource from package_extra import PackageExtra results = {} # revision:[PackageRevision1, PackageTagRevision1, etc.] @@ -385,14 +379,9 @@ def all_related_revisions(self): if not results.has_key(pkg_rev.revision): results[pkg_rev.revision] = [] results[pkg_rev.revision].append(pkg_rev) - for class_ in [ResourceGroup, Resource, PackageExtra, PackageTag]: + for class_ in [Resource, PackageExtra, PackageTag]: rev_class = class_.__revision_class__ - if class_ == Resource: - q = meta.Session.query(rev_class).join('continuity', - 'resource_group') - obj_revisions = q.filter(ResourceGroup.package_id == self.id).all() - else: - obj_revisions = meta.Session.query(rev_class).filter_by(package_id=self.id).all() + obj_revisions = meta.Session.query(rev_class).filter_by(package_id=self.id).all() for obj_rev in obj_revisions: if not results.has_key(obj_rev.revision): results[obj_rev.revision] = [] @@ -413,32 +402,23 @@ def diff(self, to_revision=None, from_revision=None): '''Overrides the diff in vdm, so that related obj revisions are diffed as well as PackageRevisions''' from tag import PackageTag - from resource import ResourceGroup, Resource + from resource import Resource from package_extra import PackageExtra results = {} # field_name:diffs results.update(super(Package, self).diff(to_revision, from_revision)) # Iterate over PackageTag, PackageExtra, Resources etc. - for obj_class in [ResourceGroup, Resource, PackageExtra, PackageTag]: + for obj_class in [Resource, PackageExtra, PackageTag]: obj_rev_class = obj_class.__revision_class__ # Query for object revisions related to this package - if obj_class == Resource: - obj_rev_query = meta.Session.query(obj_rev_class).\ - join('continuity', 'resource_group').\ - join('revision').\ - filter(ResourceGroup.package_id == self.id).\ - order_by(core.Revision.timestamp.desc()) - else: - obj_rev_query = meta.Session.query(obj_rev_class).\ - filter_by(package_id=self.id).\ - join('revision').\ - order_by(core.Revision.timestamp.desc()) + obj_rev_query = meta.Session.query(obj_rev_class).\ + filter_by(package_id=self.id).\ + join('revision').\ + order_by(core.Revision.timestamp.desc()) # Columns to include in the diff cols_to_diff = obj_class.revisioned_fields() cols_to_diff.remove('id') if obj_class is Resource: - cols_to_diff.remove('resource_group_id') - else: cols_to_diff.remove('package_id') # Particular object types are better known by an invariant field if obj_class is PackageTag: diff --git a/ckan/model/resource.py b/ckan/model/resource.py index b983e7cf4e7..4bdd5aa44bb 100644 --- a/ckan/model/resource.py +++ b/ckan/model/resource.py @@ -16,11 +16,10 @@ import activity import domain_object import ckan.lib.dictization +from .package import Package __all__ = ['Resource', 'resource_table', - 'ResourceGroup', 'resource_group_table', 'ResourceRevision', 'resource_revision_table', - 'ResourceGroupRevision', 'resource_group_revision_table', ] CORE_RESOURCE_COLUMNS = ['url', 'format', 'description', 'hash', 'name', @@ -34,8 +33,8 @@ 'resource', meta.metadata, Column('id', types.UnicodeText, primary_key=True, default=_types.make_uuid), - Column('resource_group_id', types.UnicodeText, - ForeignKey('resource_group.id')), + Column('package_id', types.UnicodeText, + ForeignKey('package.id')), Column('url', types.UnicodeText, nullable=False), Column('format', types.UnicodeText), Column('description', types.UnicodeText), @@ -57,36 +56,18 @@ Column('extras', _types.JsonDictType), ) -resource_group_table = Table( - 'resource_group', meta.metadata, - Column('id', types.UnicodeText, primary_key=True, - default=_types.make_uuid), - Column('package_id', types.UnicodeText, ForeignKey('package.id')), - Column('label', types.UnicodeText), - Column('sort_order', types.UnicodeText), - Column('extras', _types.JsonDictType), -) - vdm.sqlalchemy.make_table_stateful(resource_table) resource_revision_table = core.make_revisioned_table(resource_table) -vdm.sqlalchemy.make_table_stateful(resource_group_table) -resource_group_revision_table = core.make_revisioned_table( - resource_group_table) - class Resource(vdm.sqlalchemy.RevisionedObjectMixin, vdm.sqlalchemy.StatefulObjectMixin, domain_object.DomainObject): extra_columns = None - def __init__(self, resource_group_id=None, url=u'', - format=u'', description=u'', hash=u'', - extras=None, - **kwargs): + def __init__(self, url=u'', format=u'', description=u'', hash=u'', + extras=None, **kwargs): self.id = _types.make_uuid() - if resource_group_id: - self.resource_group_id = resource_group_id self.url = url self.format = format self.description = description @@ -109,7 +90,7 @@ def as_dict(self, core_columns_only=False): _dict = OrderedDict() cols = self.get_columns() if not core_columns_only: - cols = ['id', 'resource_group_id'] + cols + ['position'] + cols = ['id'] + cols + ['position'] for col in cols: value = getattr(self, col) if isinstance(value, datetime.datetime): @@ -117,8 +98,8 @@ def as_dict(self, core_columns_only=False): _dict[col] = value for k, v in self.extras.items() if self.extras else []: _dict[k] = v - if self.resource_group and not core_columns_only: - _dict["package_id"] = self.resource_group.package_id + if self.package_id and not core_columns_only: + _dict["package_id"] = self.package_id # FIXME format unification needs doing better import ckan.lib.dictization.model_dictize as model_dictize _dict[u'format'] = model_dictize._unified_resource_format(self.format) @@ -126,14 +107,7 @@ def as_dict(self, core_columns_only=False): def get_package_id(self): '''Returns the package id for a resource. ''' - query = meta.Session.query(ResourceGroupRevision) \ - .filter(and_(ResourceGroupRevision.id == self.resource_group_id, - ResourceGroupRevision.state == u'active', - ResourceGroupRevision.current == True)) - resource_group = query.first() - if resource_group is None: - return None - return resource_group.package_id + return self.package_id @classmethod def get(cls, reference): @@ -162,7 +136,7 @@ def get_extra_columns(cls): return cls.extra_columns def related_packages(self): - return [self.resource_group.package] + return [self.package] def activity_stream_detail(self, activity_id, activity_type): import ckan.model as model @@ -181,60 +155,12 @@ def activity_stream_detail(self, activity_id, activity_type): {'resource': res_dict}) -class ResourceGroup(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, - domain_object.DomainObject): - extra_columns = None - - def __init__(self, package_id=None, sort_order=u'', label=u'', - extras=None, **kwargs): - if package_id: - self.package_id = package_id - self.sort_order = sort_order - self.label = label - self.extras = extras or {} - self.state = 'active' - - extra_columns = self.get_extra_columns() - for field in extra_columns: - value = kwargs.pop(field, u'') - setattr(self, field, value) - if kwargs: - raise TypeError('unexpected keywords %s' % kwargs) - - def as_dict(self, core_columns_only=False): - _dict = OrderedDict() - cols = self.get_columns() - if not core_columns_only: - cols = ['package_id', 'label', 'sort_order'] + cols - for col in cols: - _dict[col] = getattr(self, col) - for k, v in self.extras.items() if self.extras else []: - _dict[k] = v - return _dict - - @classmethod - def get_columns(cls, extra_columns=True): - '''Returns the core editable columns of the resource.''' - if extra_columns: - return ['label', 'sort_order'] + cls.get_extra_columns() - else: - return ['label', 'sort_order'] - - @classmethod - def get_extra_columns(cls): - if cls.extra_columns is None: - cls.extra_columns = config.get( - 'ckan.extra_resource_group_fields', '').split() - for field in cls.extra_columns: - setattr(cls, field, DictProxy(field, 'extras')) - return cls.extra_columns - ## Mappers +## Mappers meta.mapper(Resource, resource_table, properties={ - 'resource_group': orm.relation( - ResourceGroup, + 'package': orm.relation( + Package, # all resources including deleted # formally package_resources_all backref=orm.backref('resources_all', @@ -244,27 +170,12 @@ def get_extra_columns(cls): ), ) }, -order_by=[resource_table.c.resource_group_id], +order_by=[resource_table.c.package_id], extension=[vdm.sqlalchemy.Revisioner(resource_revision_table), extension.PluginMapperExtension(), ], ) -meta.mapper(ResourceGroup, resource_group_table, properties={ - 'package': orm.relation( - _package.Package, - # all resources including deleted - backref=orm.backref('resource_groups_all', - cascade='all, delete, delete-orphan', - order_by=resource_group_table.c.sort_order, - ), - ) -}, -order_by=[resource_group_table.c.package_id], -extension=[vdm.sqlalchemy.Revisioner(resource_group_revision_table), - extension.PluginMapperExtension(), - ], -) ## VDM @@ -272,14 +183,6 @@ def get_extra_columns(cls): ResourceRevision = vdm.sqlalchemy.create_object_version( meta.mapper, Resource, resource_revision_table) -vdm.sqlalchemy.modify_base_object_mapper(ResourceGroup, core.Revision, - core.State) -ResourceGroupRevision = vdm.sqlalchemy.create_object_version( - meta.mapper, ResourceGroup, resource_group_revision_table) - -ResourceGroupRevision.related_packages = lambda self: [ - self.continuity.package -] ResourceRevision.related_packages = lambda self: [ self.continuity.resouce_group.package ] diff --git a/ckan/public/scripts/application.js b/ckan/public/scripts/application.js index dc4d9e3e290..8db86ddf77a 100644 --- a/ckan/public/scripts/application.js +++ b/ckan/public/scripts/application.js @@ -707,7 +707,6 @@ CKAN.View.Resource = Backbone.View.extend({ word=='name' || word=='package_id' || word=='position' || - word=='resource_group_id' || word=='resource_type' || word=='revision_id' || word=='revision_timestamp' || diff --git a/ckan/tests/functional/test_revision.py b/ckan/tests/functional/test_revision.py index 56121c783da..bdf0b1510a3 100644 --- a/ckan/tests/functional/test_revision.py +++ b/ckan/tests/functional/test_revision.py @@ -103,12 +103,12 @@ def create_updating_revision(self, name, **kwds): package = self.get_package(name) if 'resources' in kwds: resources = kwds.pop('resources') - for resource in package.resource_groups_all[0].resources_all: + for resource in package.resources_all: resource.state = 'deleted' for resource in resources: resource = model.Resource(**resource) model.Session.add(resource) - package.resource_groups_all[0].resources_all.append(resource) + package.resources_all.append(resource) if 'extras' in kwds: extras_data = kwds.pop('extras') # extras = [] @@ -134,7 +134,7 @@ def create_deleting_revision(self, name): model.repo.commit() def get_package(self, name): - return model.Package.by_name(name) + return model.Package.by_name(name) def test_read(self): anna = model.Package.by_name(u'annakarenina') @@ -151,7 +151,7 @@ def test_read(self): #assert "Datasets' Tags" in res #res = res.click('annakarenina', index=0) #assert 'Datasets - annakarenina' in res - + def test_list_format_atom(self): self.create_40_revisions() self.create_updating_revision(u'warandpeace', diff --git a/ckan/tests/lib/test_dictization.py b/ckan/tests/lib/test_dictization.py index 954e3d5d4aa..d55091a934e 100644 --- a/ckan/tests/lib/test_dictization.py +++ b/ckan/tests/lib/test_dictization.py @@ -195,7 +195,7 @@ def test_01_dictize_main_objects_simple(self): ## resource - resource = pkg.resource_groups_all[0].resources_all[0] + resource = pkg.resources_all[0] result = resource_dictize(resource, context) self.remove_changable_columns(result) @@ -412,7 +412,7 @@ def test_09_package_alter(self): package_dictized = package_dictize(pkg, context) - resources_revisions = model.Session.query(model.ResourceRevision).filter_by(resource_group_id=anna1.resource_groups_all[0].id).all() + resources_revisions = model.Session.query(model.ResourceRevision).filter_by(package_id=anna1.id).all() sorted_resources = sorted(resources_revisions, key=lambda x: (x.revision_timestamp, x.url))[::-1] for res in sorted_resources: @@ -464,7 +464,7 @@ def test_10_package_alter_pending(self): assert str(sorted_packages[1].expired_timestamp) != '9999-12-31 00:00:00' assert str(sorted_packages[2].expired_timestamp) != '9999-12-31 00:00:00' - resources_revisions = model.Session.query(model.ResourceRevision).filter_by(resource_group_id=anna1.resource_groups_all[0].id).all() + resources_revisions = model.Session.query(model.ResourceRevision).filter_by(package_id=anna1.id).all() sorted_resources = sorted(resources_revisions, key=lambda x: (x.revision_timestamp, x.url))[::-1] for pkg in sorted_resources: @@ -546,7 +546,7 @@ def test_11_add_pending(self): model.Session.commit() model.Session.remove() - resources_revisions = model.Session.query(model.ResourceRevision).filter_by(resource_group_id=anna1.resource_groups_all[0].id).all() + resources_revisions = model.Session.query(model.ResourceRevision).filter_by(package_id=anna1.id).all() sorted_resources = sorted(resources_revisions, key=lambda x: (x.revision_timestamp, x.url))[::-1] pprint(anna_dictized['resources']) @@ -632,7 +632,7 @@ def test_12_make_active(self): assert sorted_packages[2].state == 'active' assert sorted_packages[3].state == 'active' - resources_revisions = model.Session.query(model.ResourceRevision).filter_by(resource_group_id=anna1.resource_groups_all[0].id).all() + resources_revisions = model.Session.query(model.ResourceRevision).filter_by(package_id=anna1.id).all() sorted_resources = sorted(resources_revisions, key=lambda x: (x.revision_timestamp, x.url))[::-1] assert len(sorted_resources) == 5 @@ -994,7 +994,7 @@ def test_16_group_dictized(self): result['packages'] = sorted(result['packages'], key=lambda x: x['name']) assert_equal(sorted(result.keys()), sorted(expected.keys())) - + for key in result: if key in ('is_organization', 'package_count'): continue diff --git a/ckan/tests/lib/test_resource_search.py b/ckan/tests/lib/test_resource_search.py index 68e6fd5724d..60e3968dd14 100644 --- a/ckan/tests/lib/test_resource_search.py +++ b/ckan/tests/lib/test_resource_search.py @@ -120,7 +120,7 @@ def test_12_search_all_fields(self): assert isinstance(res_dict, dict) res_keys = set(res_dict.keys()) expected_res_keys = set(model.Resource.get_columns()) - expected_res_keys.update(['id', 'resource_group_id', 'package_id', 'position', 'size_extra']) + expected_res_keys.update(['id', 'package_id', 'position', 'size_extra']) assert_equal(res_keys, expected_res_keys) pkg1 = model.Package.by_name(u'pkg1') ab = pkg1.resources[0] diff --git a/ckan/tests/models/test_package.py b/ckan/tests/models/test_package.py index 5d02e469020..92932854158 100644 --- a/ckan/tests/models/test_package.py +++ b/ckan/tests/models/test_package.py @@ -26,7 +26,7 @@ def setup_class(self): @classmethod def teardown_class(self): pkg1 = model.Session.query(model.Package).filter_by(name=self.name).one() - + pkg1.purge() model.Session.commit() model.repo.rebuild_db() @@ -151,7 +151,7 @@ def test_tags(self): pkg = model.Package.by_name(self.pkgname) # TODO: go back to this # 2 default packages each with 2 tags so we have 2 + 4 - all = model.Session.query(model.Tag).all() + all = model.Session.query(model.Tag).all() assert len(all) == 3, all def test_add_tag_by_name(self): @@ -180,7 +180,7 @@ def test_add_tag_by_name_existing(self): class TestPackageTagSearch: - @classmethod + @classmethod def setup_class(self): CreateTestData.create() @@ -204,7 +204,7 @@ def setup_class(self): pkg.add_tag(tagordered) model.repo.commit_and_remove() - @classmethod + @classmethod def teardown_class(self): model.Session.remove() model.repo.rebuild_db() @@ -227,7 +227,7 @@ def test_1_tag_search_2(self): def test_1_tag_search_3(self): out = list(model.Tag.search_by_name(u's')) assert len(out) == 3 - + def test_alphabetical_ordering(self): pkg = model.Package.by_name(u'annakarenina') tag = pkg.get_tags()[0] @@ -259,7 +259,7 @@ def setup_class(self): pkg1.extras['mykey'] = self.notes[i] model.repo.commit_and_remove() - self.pkg1 = model.Package.by_name(self.name) + self.pkg1 = model.Package.by_name(self.name) @classmethod def teardown_class(self): @@ -317,7 +317,7 @@ def setup_class(self): # edit pkg - ResourceRevision rev = model.repo.new_revision() pkg1 = model.Package.by_name(self.name) - pkg1.resource_groups_all[0].resources_all.append(model.Resource(url=u'http://url1.com', + pkg1.resources_all.append(model.Resource(url=u'http://url1.com', format=u'xls', description=u'It is.', hash=u'abc123')) @@ -327,8 +327,8 @@ def setup_class(self): # edit pkg - ResourceRevision rev = model.repo.new_revision() pkg1 = model.Package.by_name(self.name) - pkg1.resource_groups_all[0].resources_all[0].url = u'http://url1.com/edited' - pkg1.resource_groups_all[0].resources_all.append(model.Resource(url=u'http://url2.com')) + pkg1.resources_all[0].url = u'http://url1.com/edited' + pkg1.resources_all.append(model.Resource(url=u'http://url2.com')) rev.message = u'Added resource' model.repo.commit_and_remove() @@ -354,7 +354,7 @@ def teardown_class(self): def test_1_all_revisions(self): assert len(self.pkg1.all_revisions) == 3, self.pkg1.all_revisions - assert len(self.pkg1.all_related_revisions) == 7, self.pkg1.all_related_revisions + assert len(self.pkg1.all_related_revisions) == 7, self.pkg1.all_related_revisions def test_2_diff(self): rev_q = model.repo.history() diff --git a/ckan/tests/models/test_resource.py b/ckan/tests/models/test_resource.py index c1342ffc539..0fdd1a1cee8 100644 --- a/ckan/tests/models/test_resource.py +++ b/ckan/tests/models/test_resource.py @@ -15,14 +15,13 @@ def setup(self): self.format = u'csv' self.description = u'Important part.' self.hash = u'abc123' - self.alt_url = u'http://alturl' + self.alt_url = u'http://alturl' self.size = 200 self.label = 'labeltest' self.sort_order = '1' rev = model.repo.new_revision() pkg = model.Package(name=self.pkgname) model.Session.add(pkg) - rg = pkg.resource_groups_all[0] for url in self.urls: pr = model.Resource(url=url, format=self.format, @@ -30,30 +29,27 @@ def setup(self): hash=self.hash, alt_url=self.alt_url, extras={u'size':self.size}, + package_id=pkg.id ) - rg.resources_all.append(pr) + pkg.resources_all.append(pr) pr = model.Resource(url="no_extra", format=self.format, description=self.description, hash=self.hash, + package_id=pkg.id ) - rg.resources_all.append(pr) + pkg.resources_all.append(pr) model.repo.commit_and_remove() def teardown(self): model.repo.rebuild_db() - + def test_01_create_package_resources(self): pkg = model.Package.by_name(self.pkgname) - assert len(pkg.resource_groups_all) == 1 - assert len(pkg.resource_groups_all[0].resources_all) == 3, pkg.resource_groups_all[0].resources - - resource_group_0 = pkg.resource_groups_all[0] - assert resource_group_0.label == 'default', resource_group_0 - assert resource_group_0.sort_order == '' , resource_group_0 + assert len(pkg.resources_all) == 3, pkg.resources - resource_0 = resource_group_0.resources_all[0] + resource_0 =pkg.resources_all[0] assert resource_0.url == self.urls[0], resource_0 assert resource_0.description == self.description, resource_0 @@ -62,16 +58,10 @@ def test_01_create_package_resources(self): assert resource_0.alt_url == self.alt_url, resource_0.alt_url assert_equal(resource_0.extras[u'size'], self.size) - assert resource_group_0.package == pkg, resource_group_0.package - assert resource_0.resource_group == resource_group_0, resource.resource_group - generated_dict_resource = resource_0.as_dict() assert generated_dict_resource['alt_url'] == u'http://alturl', generated_dict_resource['alt_url'] assert_equal(generated_dict_resource['size'], 200) - generated_dict_resource_group = resource_group_0.as_dict() - assert generated_dict_resource_group['label'] == 'default', generated_dict_resource_group['label'] - ## check to see if extra descriptor deletes properly rev = model.repo.new_revision() del resource_0.extras[u'size'] @@ -99,26 +89,23 @@ def test_01_create_package_resources(self): def test_02_delete_resource(self): pkg = model.Package.by_name(self.pkgname) - rg = pkg.resource_groups_all[0] - res = rg.package.resources[0] - assert len(rg.package.resources) == 3, rg.resources + res = pkg.resources[0] + assert len(package.resources) == 3, pkg.resources rev = model.repo.new_revision() res.delete() model.repo.commit_and_remove() pkg = model.Package.by_name(self.pkgname) - rg = pkg.resource_groups_all[0] - assert len(rg.package.resources) == 2, rg.resources - assert len(rg.resources_all) == 3, rg.resources_all - + assert len(package.resources) == 2, pkg.resources + assert len(pkg.resources_all) == 3, pkg.resources_all + def test_03_reorder_resources(self): rev = model.repo.new_revision() pkg = model.Package.by_name(self.pkgname) - rg = pkg.resource_groups_all[0] - res0 = rg.resources_all[0] - del rg.resources_all[0] - rg.resources_all.append(res0) + res0 = pkg.resources_all[0] + del pkg.resources_all[0] + pkg.resources_all.append(res0) # this assert will fail # assert pkg.resources[1].position == 1 # Why? According to docs for ordering list it does not reorder appended @@ -126,16 +113,16 @@ def test_03_reorder_resources(self): # http://www.sqlalchemy.org/trac/browser/lib/sqlalchemy/ext/orderinglist.py#L197) # so we have to call reorder directly in supported versions # of sqlalchemy and set position to None in older ones. - rg.resources_all.reorder() + pkg.resources_all.reorder() model.repo.commit_and_remove() pkg = model.Package.by_name(self.pkgname) - assert len(rg.resources_all) == 3, len(rg.package.resources) - lastres = rg.package.resources[2] + assert len(rg.resources_all) == 3, len(pkg.resources) + lastres = pkg.resources[2] assert lastres.position == 2, lastres print lastres assert lastres.url == self.urls[0], (self.urls, lastres.url) - + def test_04_insert_resource(self): pkg = model.Package.by_name(self.pkgname) @@ -143,15 +130,13 @@ def test_04_insert_resource(self): newurl = u'http://xxxxxxxxxxxxxxx' resource = model.Resource(url=newurl) - rg = pkg.resource_groups_all[0] - - rg.resources_all.insert(0, resource) + pkg.resources_all.insert(0, resource) model.repo.commit_and_remove() - rg = model.Package.by_name(self.pkgname).resource_groups_all[0] - assert len(rg.package.resources) == 4, rg.resources - assert rg.resources_all[1].url == self.urls[0] - assert len(rg.resources_all[1].all_revisions) == 2 + pkg = model.Package.by_name(self.pkgname) + assert len(pkg.resources) == 4, pkg.resources + assert pkg.resources_all[1].url == self.urls[0] + assert len(pkg.resources_all[1].all_revisions) == 2 def test_05_delete_package(self): pkg = model.Package.by_name(self.pkgname) @@ -169,12 +154,6 @@ def test_05_delete_package(self): assert all_resources.count() == 3, all_resources.all() assert active_resources.count() == 3, active_resources.count() - @raises(AssertionError) - def test_06_not_allow_two_resource_groups(self): - pkg = model.Package.by_name(self.pkgname) - resource_group = model.ResourceGroup(label="new") - pkg.resource_groups_all.append(resource_group) - pkg.resources def test_07_purge_package(self): pkg = model.Package.by_name(self.pkgname)