Skip to content

Commit

Permalink
Merge branch 'integrate-vdm-stateful' into remove-vdm
Browse files Browse the repository at this point in the history
  • Loading branch information
David Read committed Mar 22, 2019
2 parents d3203f6 + 4db0ab5 commit 797a18f
Show file tree
Hide file tree
Showing 18 changed files with 95 additions and 109 deletions.
24 changes: 8 additions & 16 deletions ckan/lib/dictization/model_save.py
Expand Up @@ -96,16 +96,14 @@ def package_resource_list_save(res_dicts, package, context):
resource_list.append(resource)


def package_extras_save(extra_dicts, obj, context):
def package_extras_save(extra_dicts, pkg, context):
allow_partial_update = context.get("allow_partial_update", False)
if extra_dicts is None and allow_partial_update:
return

model = context["model"]
session = context["session"]

extras_list = obj.extras_list
old_extras = dict((extra.key, extra) for extra in extras_list)
old_extras = pkg._extras

new_extras = {}
for extra_dict in extra_dicts or []:
Expand All @@ -116,28 +114,22 @@ def package_extras_save(extra_dicts, obj, context):
pass
else:
new_extras[extra_dict["key"]] = extra_dict["value"]

#new
for key in set(new_extras.keys()) - set(old_extras.keys()):
state = 'active'
extra = model.PackageExtra(state=state, key=key, value=new_extras[key])
session.add(extra)
extras_list.append(extra)
pkg.extras[key] = new_extras[key]
#changed
for key in set(new_extras.keys()) & set(old_extras.keys()):
extra = old_extras[key]
if new_extras[key] == extra.value and extra.state != 'deleted':
if new_extras[key] == extra.value:
continue
state = 'active'
extra.value = new_extras[key]
extra.state = state
session.add(extra)
#deleted
for key in set(old_extras.keys()) - set(new_extras.keys()):
extra = old_extras[key]
if extra.state == 'deleted':
continue
state = 'deleted'
extra.state = state
extra.delete()


def package_tag_list_save(tag_dicts, package, context):
allow_partial_update = context.get("allow_partial_update", False)
Expand Down Expand Up @@ -305,7 +297,7 @@ def package_dict_save(pkg_dict, context):
objects = pkg_dict.get('relationships_as_object')
relationship_list_save(objects, pkg, 'relationships_as_object', context)

extras = package_extras_save(pkg_dict.get("extras"), pkg, context)
package_extras_save(pkg_dict.get("extras"), pkg, context)

return pkg

Expand Down
4 changes: 2 additions & 2 deletions ckan/migration/versions/077_add_revisions_to_system_info.py
@@ -1,6 +1,6 @@
# encoding: utf-8

import vdm.sqlalchemy
from ckan import model


def upgrade(migrate_engine):
Expand All @@ -21,5 +21,5 @@ def upgrade(migrate_engine):
ALTER TABLE system_info_revision
DROP CONSTRAINT "system_info_revision_key_key";
'''.format(state=vdm.sqlalchemy.State.ACTIVE)
'''.format(state=model.State.ACTIVE)
)
@@ -0,0 +1,14 @@
# encoding: utf-8


def upgrade(migrate_engine):
migrate_engine.execute(
'''
ALTER TABLE "package_extra_revision"
DROP CONSTRAINT IF EXISTS package_extra_revision_continuity_id_fkey;
ALTER TABLE "group_extra_revision"
DROP CONSTRAINT IF EXISTS group_extra_revision_continuity_id_fkey;
DELETE FROM "package_extra" WHERE state='deleted';
DELETE FROM "group_extra" WHERE state='deleted';
'''
)
28 changes: 23 additions & 5 deletions ckan/model/core.py
Expand Up @@ -2,13 +2,14 @@

import datetime

from sqlalchemy import Column, DateTime, Text, Boolean

import domain_object
import meta
import vdm.sqlalchemy
from sqlalchemy import Column, DateTime, Text, Boolean


__all__ = ['System', 'State']
__all__ = ['System', 'State', 'StatefulObjectMixin']
log = __import__('logging').getLogger(__name__)


class System(domain_object.DomainObject):
Expand All @@ -27,5 +28,22 @@ def by_name(cls, name):


# VDM-specific domain objects
State = vdm.sqlalchemy.State
State.all = [State.ACTIVE, State.DELETED]
class State(object):
ACTIVE = u'active'
DELETED = u'deleted'
PENDING = u'pending'


class StatefulObjectMixin(object):
__stateful__ = True

def delete(self):
log.debug('Running delete on %s', self)
self.state = State.DELETED

def undelete(self):
self.state = State.ACTIVE

def is_active(self):
# also support None in case this object is not yet refreshed ...
return self.state is None or self.state == State.ACTIVE
2 changes: 1 addition & 1 deletion ckan/model/domain_object.py
Expand Up @@ -79,7 +79,7 @@ def remove(self):

def delete(self):
# stateful objects have this method overridden - see
# vmd.base.StatefulObjectMixin
# core.StatefulObjectMixin
self.Session.delete(self)

def purge(self):
Expand Down
17 changes: 10 additions & 7 deletions ckan/model/group.py
Expand Up @@ -27,9 +27,11 @@
Column('capacity', types.UnicodeText,
nullable=False),
Column('group_id', types.UnicodeText,
ForeignKey('group.id')),)
ForeignKey('group.id')),
Column('state', types.UnicodeText,
default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(member_table)

group_table = Table('group', meta.metadata,
Column('id', types.UnicodeText,
Expand All @@ -46,12 +48,13 @@
default=datetime.datetime.now),
Column('is_organization', types.Boolean, default=False),
Column('approval_status', types.UnicodeText,
default=u"approved"))
default=u"approved"),
Column('state', types.UnicodeText,
default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(group_table)


class Member(vdm.sqlalchemy.StatefulObjectMixin,
class Member(core.StatefulObjectMixin,
domain_object.DomainObject):
'''A Member object represents any other object being a 'member' of a
particular Group.
Expand Down Expand Up @@ -108,7 +111,7 @@ def __unicode__(self):
table_info, self.capacity, self.state)


class Group(vdm.sqlalchemy.StatefulObjectMixin,
class Group(core.StatefulObjectMixin,
domain_object.DomainObject):

def __init__(self, name=u'', title=u'', description=u'', image_url=u'',
Expand Down
18 changes: 6 additions & 12 deletions ckan/model/group_extra.py
@@ -1,8 +1,8 @@
# encoding: utf-8

import vdm.sqlalchemy
import vdm.sqlalchemy.stateful
from sqlalchemy import orm, types, Column, Table, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy
from six import text_type

import group
Expand All @@ -19,14 +19,12 @@
Column('group_id', types.UnicodeText, ForeignKey('group.id')),
Column('key', types.UnicodeText),
Column('value', types.UnicodeText),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(group_extra_table)


class GroupExtra(
vdm.sqlalchemy.StatefulObjectMixin,
domain_object.DomainObject):
class GroupExtra(core.StatefulObjectMixin,
domain_object.DomainObject):
pass

meta.mapper(GroupExtra, group_extra_table, properties={
Expand All @@ -40,12 +38,8 @@ class GroupExtra(
order_by=[group_extra_table.c.group_id, group_extra_table.c.key],
)


def _create_extra(key, value):
return GroupExtra(key=text_type(key), value=value)

_extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras',
vdm.sqlalchemy.stateful.StatefulDict)
setattr(group.Group, 'extras_active', _extras_active)
group.Group.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value',
creator=_create_extra)
group.Group.extras = association_proxy(
'_extras', 'value', creator=_create_extra)
9 changes: 3 additions & 6 deletions ckan/model/package.py
Expand Up @@ -7,7 +7,6 @@
from sqlalchemy import orm
from sqlalchemy import types, Column, Table
from ckan.common import config
import vdm.sqlalchemy

import meta
import core
Expand Down Expand Up @@ -52,17 +51,15 @@
Column('metadata_created', types.DateTime, default=datetime.datetime.utcnow),
Column('metadata_modified', types.DateTime, default=datetime.datetime.utcnow),
Column('private', types.Boolean, default=False),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)


vdm.sqlalchemy.make_table_stateful(package_table)

## -------------------
## Mapped classes

class Package(
vdm.sqlalchemy.StatefulObjectMixin,
domain_object.DomainObject):
class Package(core.StatefulObjectMixin,
domain_object.DomainObject):

text_search_fields = ['name', 'title']

Expand Down
18 changes: 5 additions & 13 deletions ckan/model/package_extra.py
Expand Up @@ -2,8 +2,8 @@

from six import text_type
import vdm.sqlalchemy
import vdm.sqlalchemy.stateful
from sqlalchemy import orm, types, Column, Table, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy

import meta
import core
Expand All @@ -22,12 +22,12 @@
Column('package_id', types.UnicodeText, ForeignKey('package.id')),
Column('key', types.UnicodeText),
Column('value', types.UnicodeText),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(package_extra_table)

class PackageExtra(
vdm.sqlalchemy.StatefulObjectMixin,
core.StatefulObjectMixin,
domain_object.DomainObject):

def related_packages(self):
Expand All @@ -41,11 +41,6 @@ def related_packages(self):
cascade='all, delete, delete-orphan',
),
),
'package_no_state': orm.relation(_package.Package,
backref=orm.backref('extras_list',
cascade='all, delete, delete-orphan',
),
)
},
order_by=[package_extra_table.c.package_id, package_extra_table.c.key],
extension=[extension.PluginMapperExtension()],
Expand All @@ -55,8 +50,5 @@ def related_packages(self):
def _create_extra(key, value):
return PackageExtra(key=text_type(key), value=value)

_extras_active = vdm.sqlalchemy.stateful.DeferredProperty('_extras',
vdm.sqlalchemy.stateful.StatefulDict)
setattr(_package.Package, 'extras_active', _extras_active)
_package.Package.extras = vdm.sqlalchemy.stateful.OurAssociationProxy('extras_active', 'value',
creator=_create_extra)
_package.Package.extras = association_proxy(
'_extras', 'value', creator=_create_extra)
4 changes: 2 additions & 2 deletions ckan/model/package_relationship.py
Expand Up @@ -27,11 +27,11 @@ def _(txt):
Column('object_package_id', types.UnicodeText, ForeignKey('package.id')),
Column('type', types.UnicodeText),
Column('comment', types.UnicodeText),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(package_relationship_table)

class PackageRelationship(vdm.sqlalchemy.StatefulObjectMixin,
class PackageRelationship(core.StatefulObjectMixin,
domain_object.DomainObject):
'''The rule with PackageRelationships is that they are stored in the model
always as the "forward" relationship - i.e. "child_of" but never
Expand Down
6 changes: 2 additions & 4 deletions ckan/model/resource.py
Expand Up @@ -8,7 +8,6 @@
from sqlalchemy import orm
from ckan.common import config
import vdm.sqlalchemy
import vdm.sqlalchemy.stateful
from sqlalchemy import types, func, Column, Table, ForeignKey, and_

import meta
Expand Down Expand Up @@ -53,12 +52,11 @@
Column('cache_last_updated', types.DateTime),
Column('url_type', types.UnicodeText),
Column('extras', _types.JsonDictType),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(resource_table)


class Resource(vdm.sqlalchemy.StatefulObjectMixin,
class Resource(core.StatefulObjectMixin,
domain_object.DomainObject):
extra_columns = None

Expand Down
5 changes: 2 additions & 3 deletions ckan/model/system_info.py
Expand Up @@ -23,12 +23,11 @@
Column('id', types.Integer(), primary_key=True, nullable=False),
Column('key', types.Unicode(100), unique=True, nullable=False),
Column('value', types.UnicodeText),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(system_info_table)


class SystemInfo(vdm.sqlalchemy.StatefulObjectMixin,
class SystemInfo(core.StatefulObjectMixin,
domain_object.DomainObject):

def __init__(self, key, value):
Expand Down
8 changes: 3 additions & 5 deletions ckan/model/tag.py
Expand Up @@ -34,10 +34,9 @@
Column('id', types.UnicodeText, primary_key=True, default=_types.make_uuid),
Column('package_id', types.UnicodeText, ForeignKey('package.id')),
Column('tag_id', types.UnicodeText, ForeignKey('tag.id')),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(package_tag_table)


class Tag(domain_object.DomainObject):
def __init__(self, name='', vocabulary_id=None):
Expand Down Expand Up @@ -215,9 +214,8 @@ def packages(self):
def __repr__(self):
return '<Tag %s>' % self.name

class PackageTag(
vdm.sqlalchemy.StatefulObjectMixin,
domain_object.DomainObject):
class PackageTag(core.StatefulObjectMixin,
domain_object.DomainObject):
def __init__(self, package=None, tag=None, state=None, **kwargs):
self.package = package
self.tag = tag
Expand Down

0 comments on commit 797a18f

Please sign in to comment.