Thanks there were some good ideas to try. Btw. what does the first def
constructor(fun)?
On 28 loka, 18:00, "Arnar Birgisson" <[EMAIL PROTECTED]> wrote:
> Hi there,
>
> On 10/28/07, mmstud <[EMAIL PROTECTED]> wrote:
>
> > 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)
>
> I didn't read your code thoroughly, but I have a model with some
> similarities. Perhaps it will provide some insight. Basically, I'm
> dealing with "Pages" and "PageVersions". "PageVersions" refers to it's
> parent "Page", but "Page" also keeps the version number of the latest
> version.
>
> Arnar
>
> # encoding: utf-8
>
> import os
> from datetime import datetime
>
> from sqlalchemy import *
>
> from softproof import utils
> from softproof.json import jsonify_saobject
>
> __meta__ = metadata
>
> def constructor(fun):
> def decorated(self, *args, **kw):
> assert hasattr(self, 'c')
> for key,value in kw.items():
> if hasattr(self.c, key):
> setattr(self, key, value)
> del kw[key]
> fun(self, *args, **kw)
> return decorated
>
> jobs = Table("jobs", __meta__,
> Column("jobno", Unicode(15), primary_key=True),
> Column("created", DateTime, nullable=False,
> default=datetime.now),
> Column("deleted", Boolean, nullable=False, default=False))
>
> class Job(object):
>
> @constructor
> def __init__(self, jobno=None):
> if jobno:
> self.jobno = jobno
>
> def sortedpages(self):
> listcopy = self.pages[:]
> listcopy.sort(key=Page.sort_key)
> return listcopy
>
> def get_page_by_name(self, pagename):
> """Finnur síðu með nafnið pagename og skilar henni. Skilar
> None ef engin síða hefur
> viðkomandi nafn.
> Ef pagename er _firstpage_ er skilað viðeigandi síðu (t.d.
> kápu ef hún er til)"""
> if len(self.pages) == 0:
> return None
>
> if '_firstpage_' == pagename:
> for p in self.pages:
> if 'KAP' in p.pagename:
> return p
> return self.pages[0]
>
> for p in self.pages:
> if p.pagename == pagename:
> return p
> return None
>
> def create_page(self, pagename, *args, **kwargs):
> p = Page(job=self, pagename=pagename, *args, **kwargs)
> return p
>
> def get_path(self):
> if self.jobno.startswith('P'):
> pg1, pg2, pg3 = self.jobno.split('.')
> return os.path.join(pg1, pg1+'.'+pg2, self.jobno)
> else:
> return os.path.join(self.jobno[:-3]+'000',
> self.jobno[:-2]+'00', self.jobno)
>
> mapper(Job, jobs)
>
> pageversions = Table("pageversions", __meta__,
> Column("jobno", Unicode(15),
> ForeignKey("pages.jobno"), primary_key=True),
> Column("pagename", Unicode(30),
> ForeignKey("pages.pagename"), primary_key=True),
> Column("version", Integer, primary_key=True, default=1),
> Column("created", DateTime, nullable=False,
> default=datetime.now),
> Column("md5sum", String(32)),
> Column("width", Integer, nullable=False, default=0),
> Column("height", Integer, nullable=False, default=0),
> ForeignKeyConstraint(["jobno",
> "pagename"],["pages.jobno", "pages.pagename"]))
>
> class PageVersion(object):
>
> @constructor
> def __init__(self, page=None, version=None):
> if page:
> self.page = page
> if version:
> self.version = version
>
> @property
> def filename(self):
> if self.version == 1:
> return self.page.pagename + '.jpg'
> else:
> return "%s.v%02d.jpg" % (self.page.pagename, self.version)
>
> mapper(PageVersion, pageversions)
>
> PageStates = utils.Enum('new', 'approved', 'rejected')
>
> pages = Table("pages", __meta__,
> Column("jobno", Unicode(15), ForeignKey("jobs.jobno"),
> primary_key=True),
> Column("pagename", Unicode(30), primary_key=True),
> Column("created", DateTime, nullable=False,
> default=datetime.now),
> Column("deleted", Boolean, nullable=False, default=False),
> Column("current_version", Integer),
> Column("status", PageStates, nullable=False,
> default=PageStates.new))
>
> class Page(object):
>
> @constructor
> def __init__(self, job=None, pagename=None):
> if job:
> self.job = job
> if pagename:
> self.pagename = pagename
> self.currentversion = PageVersion(self, 1)
> self.status = PageStates.new
>
> def add_version(self):
> self.currentversion = PageVersion(self, self.currentversion.version+1)
> self.status = PageStates.new
> comment = self.add_comment()
> comment.closeable = False
> comment.content = u'Ný útgáfa rippuð'
> return self.currentversion
>
> def get_version(self, versionno):
> return self.versions[versionno-1]
>
> def _get_status(self):
> return self._status
>
> def _set_status(self, newstatus):
> if self._status is None:
> self._status = newstatus
> return
> if self._status == newstatus:
> return
> if self._status == PageStates.new and newstatus ==
> PageStates.approved:
> opencomment = False
> for c in self.comments:
> if not c.closeable:
> continue
> opencomment = opencomment or c.closed is None
> if opencomment:
> raise ValueError('Cant set job state to approved if it
> has open comments.')
> self._status = newstatus
>
> status = property(_get_status, _set_status)
>
> def changeStatus(self, newstatus, user_name=None):
> self.status = newstatus
> comment = self.add_comment(user_name)
> comment.closeable = False
> if newstatus == PageStates.new:
> comment.content = u"Merkt sem ný"
> elif newstatus == PageStates.approved:
> comment.content = u"Samþykkt"
> elif newstatus == PageStates.rejected:
> comment.content = u"Hafnað"
>
> def get_next_page(self):
> myindex = self.job.pages.index(self)
> if myindex < len(self.job.pages)-1:
> return self.job.pages[myindex+1]
> else:
> return None
>
> def get_previous_page(self):
> myindex = self.job.pages.index(self)
> if myindex > 0:
> return self.job.pages[myindex-1]
> else:
> return None
>
> SORT_VALUES = {
> "ali": 0 - 1000,
> "kap": 1 - 1000,
> "ik": 2 - 1000,
> "ib": 3 - 1000,
> "bak": 4 - 1000,
> "aud": 5 - 1000,
> "r": 6 - 1000,
> # Tölur koma hér
> "lakk": 1 + 100000,
> "__default__": 2 + 100000,
> }
>
> def sort_key(self):
> t = []
> pn = self.pagename
> if pn.endswith("-P1"):
> pn = pn[:-3]
> if pn.startswith(self.job.jobno + "."):
> pn = pn[len(self.job.jobno)+1:]
> for part in pn.split("."):
> if part.lower().strip() in Page.SORT_VALUES:
> t.append(Page.SORT_VALUES[part.lower().strip()])
> else:
> try:
> t.append(int(part))
> except ValueError:
> t.append(part)
> return tuple(t)
>
> def __jsonextra__(self, props):
> props['status'] = self.status
>
> mapper(Page, pages, properties={
> '_status': pages.c.status,
> 'job': relation(Job, backref=backref('pages', cascade="all,
> delete-orphan", order_by=pages.c.pagename)),
> 'currentversion': relation(PageVersion,
> foreignkey=pages.c.current_version,
> primaryjoin=and_(pages.c.jobno==pageversions.c.jobno,
>
> pages.c.pagename==pageversions.c.pagename,
>
> pages.c.current_version==pageversions.c.version),
> post_update=True),
> 'versions': relation(PageVersion, cascade="all, delete-orphan",
> primaryjoin=and_(pages.c.jobno==pageversions.c.jobno,
>
> pages.c.pagename==pageversions.c.pagename),
> order_by=pageversions.c.version,
> backref=backref('page',
>
> primaryjoin=and_(pages.c.jobno==pageversions.c.jobno,
>
> pages.c.pagename==pageversions.c.pagename)))
> # '_status': pages.c.status,
> # 'status': synonym('_status')
>
> })
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---