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