Next design problem for me is version table. I have Document model
with DocumentVersion model, but i dont know how to:

- get the latest version of document
- set creator and updator, automatic behavior for this
- update version number
- fetch thru Document(s) and DocumentVersion(s)

Lets see the code sample i have prepared (raw sketch):

##################################################################
# Tables
##################################################################
users_table = Table("users", metadata,
    Column("id", Integer, primary_key=True),
)
languages_table = Table("languages", metadata,
    Column("id", Integer, primary_key=True),
    Column("alpha2", String(2)),
    Column("name", Unicode(100)),
)
documents_table = Table("documents", metadata,
    Column("id", Integer, primary_key=True),
    # how to get latest version
    # Column("latest_version", Integer,
ForeignKey('document_versions.version'), default=1),
    Column("created", DateTime, default=datetime.now),
    # how to set creator and updator?
    Column("creator", Integer, ForeignKey('users.id'),
default=uid_users_id),
)
document_versions_table = Table("document_versions", metadata,
    Column("id", Integer, primary_key=True),
    Column("document_id", Integer, ForeignKey('documents.id')),
    Column("language_id", Integer, ForeignKey('language.id')),
                Column("name", Unicode(64)),
                Column("content", Unicode),
                # how to update DocumentVersion.version ???
    Column("version", Integer, default=1,
onupdate=DocumentVersion.version+1),
    Column("updated", DateTime, default=datetime.now,
onupdate=datetime.now),
    # how to set creator and updator?
    Column("updator", Integer, ForeignKey('users.id'),
onupdate=uid_users_id),
)

##################################################################
# Models
##################################################################
class BaseObject(object):
    def __init__(self):
        self._repr_ = []

    def __repr__(self):
        from string import join
        str = ', '.join("'%s'" % (self.__dict__[v]) for v in
self._repr_)
        return "<%s(%s)>" % (self.__class__, str)

class NameObject(BaseObject):
    def __init__(self, name):
        BaseObject.__init__(self)
        self.name = name

    def __repr__(self):
        self._repr_ = ["name"]
        return BaseObject.__repr__(self)

class User(BaseObject):
    def __init__(self):
        BaseObject.__init__(self)

class Language(NameObject):
    def __init__(self, alpha2, name):
        NameObject.__init__(self, name)
        self.alpha2 = alpha2

    def __repr__(self):
        self._repr_ = ["alpha2", "name"]
        return BaseObject.__repr__(self)

class Document(BaseObject):
    def __init__(self):
        BaseObject.__init__(self)

    def __repr__(self):
        self._repr_ = ["created", "creator"]
        return BaseObject.__repr__(self)

class DocumentVersion(NameObject):
    def __init__(self, name, content = "", language = Null):
        NameObject.__init__(self, name)
        self.document = Document()
        self.content = content
        self.language = language

    def __repr__(self):
        self._repr_ = ["name", "document", "version"]
        return BaseObject.__repr__(self)

class UserDocument(object):
    pass

class OrganisationDocument(object):
    pass

##################################################################
# Mappers
##################################################################
mapper(User, users_table)
mapper(Document, documents_table, properties={
    'user':relation(User, backref="documentversions"),
    }
)
mapper(DocumentVersion, document_versions_table, properties={
    'document':relation(Document, backref="documentversions"),
    'language':relation(Language, backref="documentversions"),
    'user':relation(User, backref="documentversions"),
    }
)
mapper(Language, languages_table)
"""
mapper(UserDocument, user_documents, properties={
    'document':relation(DocumentVersion, backref="users"),
    }
)
mapper(OrganisationDocument, organisation_documents, properties={
    'document':relation(DocumentVersion, backref="organisations"),
    }
)
"""
##################################################################
# Fixtures
##################################################################

language_fi = Language('fi', 'Finnish')
language_en = Language('en', 'English')

dv = DocumentVersion("My first document", "some content...",
language_en)
db_sess.save(dv)

# accidental english
dv = DocumentVersion("Toinen dokumentti", "hiukan tavaraa...",
language_en)
db_sess.save(dv)

##################################################################
# Tests and examples
##################################################################

dv = db_sess.query(DocumentVersion).filter_by(name="Toinen
dokumentti").first()
dv.language = language_fi
dv.save()

print dv # should have version 2

# how to fetch thru Document(s) and their DocumentVersion(s)
# how to set up UserDocument(s)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to