Skip to content

Commit

Permalink
Move vdm State and StatefulObjectMixin into CKAN
Browse files Browse the repository at this point in the history
  • Loading branch information
David Read committed Mar 15, 2019
1 parent 793f57f commit bf985bf
Show file tree
Hide file tree
Showing 12 changed files with 60 additions and 34 deletions.
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)
)
27 changes: 24 additions & 3 deletions ckan/model/core.py
Expand Up @@ -8,7 +8,9 @@
from sqlalchemy import Column, DateTime, Text, Boolean


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

# VDM-specific tables
revision_table = vdm.sqlalchemy.make_revision_table(meta.metadata)
Expand All @@ -31,8 +33,27 @@ 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


Revision = vdm.sqlalchemy.make_Revision(meta.mapper, revision_table)


Expand Down
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: 11 additions & 6 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)
member_revision_table = core.make_revisioned_table(member_table)

group_table = Table('group', meta.metadata,
Expand All @@ -47,14 +49,17 @@
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)
group_revision_table = core.make_revisioned_table(group_table)


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


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

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

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

Expand All @@ -19,15 +18,15 @@
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)
group_extra_revision_table = core.make_revisioned_table(group_extra_table)


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

meta.mapper(GroupExtra, group_extra_table, properties={
Expand Down
6 changes: 3 additions & 3 deletions ckan/model/package.py
Expand Up @@ -52,18 +52,18 @@
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)
package_revision_table = core.make_revisioned_table(package_table)

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

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

text_search_fields = ['name', 'title']

Expand Down
5 changes: 3 additions & 2 deletions ckan/model/package_extra.py
Expand Up @@ -23,13 +23,14 @@
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)

extra_revision_table= core.make_revisioned_table(package_extra_table)

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

def related_packages(self):
Expand Down
5 changes: 3 additions & 2 deletions ckan/model/package_relationship.py
Expand Up @@ -27,13 +27,14 @@ 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)

package_relationship_revision_table = core.make_revisioned_table(package_relationship_table)

class PackageRelationship(vdm.sqlalchemy.RevisionedObjectMixin,
vdm.sqlalchemy.StatefulObjectMixin,
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
5 changes: 3 additions & 2 deletions ckan/model/resource.py
Expand Up @@ -55,14 +55,15 @@
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)

resource_revision_table = core.make_revisioned_table(resource_table)


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

Expand Down
4 changes: 2 additions & 2 deletions ckan/model/system_info.py
Expand Up @@ -23,14 +23,14 @@
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)
system_info_revision_table = core.make_revisioned_table(system_info_table)


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

def __init__(self, key, value):
Expand Down
6 changes: 3 additions & 3 deletions ckan/model/tag.py
Expand Up @@ -35,9 +35,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)
# TODO: this has a composite primary key ...
package_tag_revision_table = core.make_revisioned_table(package_tag_table)

Expand Down Expand Up @@ -218,8 +218,8 @@ def __repr__(self):
return '<Tag %s>' % self.name

class PackageTag(vdm.sqlalchemy.RevisionedObjectMixin,
vdm.sqlalchemy.StatefulObjectMixin,
domain_object.DomainObject):
core.StatefulObjectMixin,
domain_object.DomainObject):
def __init__(self, package=None, tag=None, state=None, **kwargs):
self.package = package
self.tag = tag
Expand Down
6 changes: 2 additions & 4 deletions ckan/model/user.py
Expand Up @@ -11,7 +11,6 @@
from sqlalchemy.orm import synonym
from sqlalchemy import types, Column, Table, func
from six import text_type
import vdm.sqlalchemy

import meta
import core
Expand All @@ -33,12 +32,11 @@
Column('activity_streams_email_notifications', types.Boolean,
default=False),
Column('sysadmin', types.Boolean, default=False),
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)

vdm.sqlalchemy.make_table_stateful(user_table)


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

VALID_NAME = re.compile(r"^[a-zA-Z0-9_\-]{3,255}$")
Expand Down

0 comments on commit bf985bf

Please sign in to comment.