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 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