On 6/19/06, Michael Bayer <[EMAIL PROTECTED]> wrote:
hey arnar -

I cant reproduce this one with what youve given me.  If i just set up
"jobs" and "pages" mappers (no page version stuff since its not in
the example), and dont compile anything, the creation of the Job()
object compiles the "jobs" mapper which properly hits the "pages"
backref.

Hmm.. that is strange. This is a IPython session:

In [1]: from jobs import *

In [2]: j = Job('nr1')

In [3]: dir(j)
Out[3]:
['_AttributeManager__sa_attr_state',
'_Job__sa_attr_state',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__str__',
'__weakref__',
'_state',
'c',
'created',
'deleted',
'jobno']

In [4]: 'pages' in dir(j)
Out[4]: False

In [5]: j2 = Job()

In [6]: dir(j2)
Out[6]:
['_Job__sa_attr_state',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__str__',
'__weakref__',
'_state',
'c',
'created',
'deleted',
'jobno']

In [7]: 'pages' in j2
---------------------------------------------------------------------------
exceptions.TypeError                                 Traceback (most
recent call last)

/home/arnarb/workdir/softproof/webinterface/softproof/softproof/nontgmodel/<ipython
console>

TypeError: iterable argument required

In [8]: 'pages' in dir(j2)
Out[8]: False

In [9]: p = Page()

In [10]: 'pages' in dir(j2)
Out[10]: True



Only after first referring to Page I get the pages property on Job.
The file jobs.py is attached. I must be doing something wrong because
I pasted your test into a file and ran it, and j.pages showed up just
fine.

Arnar
# encoding: utf-8

from datetime import datetime

from sqlalchemy import *

__meta__ = metadata = DynamicMetaData()

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

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

class PageVersion(object):
    
    @constructor
    def __init__(self, page=None, version=None):
        if page:
            self.page = page
        if version:
            self.version = version
    
    def basename():
        if self.version == 1:
            return self.page.pagename
        else:
            return "%s.v%03d" % (self.page.pagename, self.version)

mapper(PageVersion, pageversions)


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))
                
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)
    
    def addVersion(self):
        self.currentversion = PageVersion(self, self.currentversion.version+1)
        return self.currentversion
        
mapper(Page, pages, properties={
    'job': relation(Job, backref=backref('pages', cascade="all, 
delete-orphan")),
    '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",
                    order_by=pageversions.c.version, backref='page', lazy=False)
})
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to