[Modeling-cvs] ProjectModeling/Modeling PyModel.py,1.1.2.1,1.1.2.2
Status: Abandoned
Brought to you by:
sbigaret
|
From: <sbi...@us...> - 2003-05-18 15:23:28
|
Update of /cvsroot/modeling/ProjectModeling/Modeling
In directory sc8-pr-cvs1:/tmp/cvs-serv1779
Modified Files:
Tag: brch-0_9pre7-1-PyModel
PyModel.py
Log Message:
Full implementation for Association (version 1)
Index: PyModel.py
===================================================================
RCS file: /cvsroot/modeling/ProjectModeling/Modeling/Attic/PyModel.py,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** PyModel.py 15 May 2003 17:44:58 -0000 1.1.2.1
--- PyModel.py 18 May 2003 15:23:25 -0000 1.1.2.2
***************
*** 61,65 ****
def debug(msg):
! print msg
def error(msg):
--- 61,66 ----
def debug(msg):
! #print msg
! pass
def error(msg):
***************
*** 186,190 ****
entities.remove(entity)
while entities:
! print [e.name for e in entities], entities_processed
es=[e for e in entities if e.parent in entities_processed]
for entity in es:
--- 187,191 ----
entities.remove(entity)
while entities:
! #print [e.name for e in entities], entities_processed
es=[e for e in entities if e.parent in entities_processed]
for entity in es:
***************
*** 317,321 ****
if isinstance(prop, APrimaryKey):
return prop
! return 0
def propagate_attribute(self, attributeDescObj, model):
--- 318,322 ----
if isinstance(prop, APrimaryKey):
return prop
! return None
def propagate_attribute(self, attributeDescObj, model):
***************
*** 586,590 ****
class BaseRelation(BaseDescription):
''' Describes a Relation '''
! defaults={ 'delete': 0,
#'key': 0,
#'destinationEntity': '',
--- 587,591 ----
class BaseRelation(BaseDescription):
''' Describes a Relation '''
! defaults={ 'delete': 0, # nullify
#'key': 0,
#'destinationEntity': '',
***************
*** 623,629 ****
class RToOne(BaseRelation):
! defaults={ 'multiplicity': [0,1],
! 'joinSemantic': 0,
! }
propagated_by=None
--- 624,631 ----
class RToOne(BaseRelation):
! defaults=BaseRelation.defaults.copy()
! defaults.update({ 'multiplicity': [0,1],
! 'joinSemantic': 0,
! })
propagated_by=None
***************
*** 693,699 ****
class RToMany(BaseRelation):
! defaults={ 'multiplicity': [0,None],
! 'joinSemantic': 0,
! }
propagated_by=None
--- 695,702 ----
class RToMany(BaseRelation):
! defaults=BaseRelation.defaults.copy()
! defaults.update({ 'multiplicity': [0,None],
! 'joinSemantic': 0,
! })
propagated_by=None
***************
*** 765,793 ****
class Association(BaseDescription):
! ''' Describes a Relation between 2 entities '''
! # TBD a placer dans les prop. de Entity
! # ex. Relation('Employee', 'Address', ([0,None],cascade), ([0,1],deny))
! # --> soit ca
! # --> soit tout a la main
! # --> soit dans les Entity, RToOne, RToMany:
! # - avec seulement destEntity
! # - avec destEntity et inverse=
! def __init__(self, src, dst,
! multiplicity=[0,1], invMultiplicity=[0,None],
! srcProps={}, dstProps={}):
! if multiplicity[1]>1:
! raise ValueError, 'invalid mult'
! if not (invMultiplicity[1] in (None, '*', -1) or invMultiplicity[0]>1):
! raise ValueError, 'invalid invMult'
! self.src=src
! self.dst=dst
## TBD 1: inverser src/dst si multiplicities sont inversees
## TBD 2: possibilite d'ajout des srcKey/dstKey
! self.multiplicity=multiplicity
! self.invMultiplicity=invMultiplicity
! self.srcProps=srcProps
! self.dstProps=dstProps
!
def build(self, model):
srcE=model.entityNamed(self.src)
--- 768,824 ----
+ def relationsForSrcAndDst(src,dst):
+ return ('to'+dst, 'to'+src+'s')
+
class Association(BaseDescription):
! '''
! Describes an Association between 2 entities
!
! An Association binds two entities, 'src' and 'dst' (cf. __init__()),
! with two relationships:
!
! - a toOne relationship src -> dst
!
! - a toMany relationship dst -> src
!
! '''
! defaults = { 'multiplicity': [ [0,1], [0,None] ],
! 'relations': MP(relationsForSrcAndDst, 'src', 'dst'),
! 'keys': [ None, None ],
! 'delete': [ RToOne.defaults['delete'],
! RToMany.defaults['delete'] ],
! 'isClassProperty': [ RToOne.defaults['isClassProperty'],
! RToMany.defaults['isClassProperty'] ],
! 'joinSemantic': [ RToOne.defaults['joinSemantic'],
! RToMany.defaults['joinSemantic'] ],
! 'displayLabel': [ RToOne.defaults['displayLabel'],
! RToMany.defaults['displayLabel'] ],
! 'doc': [ RToOne.defaults['doc'],
! RToMany.defaults['doc'] ],
! }
!
! def __init__(self, src, dst, **kw):
! self.src=kw['src']=src
! self.dst=kw['dst']=dst
! updateComponent(self,kw,Association.defaults,
! name='Association(%s,%s)'%(src, dst))
! self.check_multiplicity()
!
! def check_multiplicity(self):
! """
! Check the self.multiplicity is correct
!
! Returns: (src->dst multiplicity, dst->src multiplicity)
! """
## TBD 1: inverser src/dst si multiplicities sont inversees
## TBD 2: possibilite d'ajout des srcKey/dstKey
! sd_mult=self.multiplicity[0]
! ds_mult=self.multiplicity[1]
! if sd_mult[1]>1:
! raise ValueError, 'invalid multiplicity src->dst: should be toOne'
! if not (ds_mult[1] in (None, '*', -1) or ds_mult[0]>1):
! raise ValueError, 'invalid multiplicity dst->src: should be toMany'
! return sd_mult, ds_mult
!
def build(self, model):
srcE=model.entityNamed(self.src)
***************
*** 797,816 ****
if not dstE:
raise ValueError, 'Association: Unable to find destination entity %s'%self.dst
- dstAtt=dstE.primaryKey()
- if not dstAtt:
- dstAtt=APrimaryKey()
- dstE.properties.append(srcAtt)
- # FK: create it (TBD: unless ajout dstKey cf __init__)
- srcAtt=AForeignKey(srcE.attFKName(dstE.name))
- srcE.properties.append(srcAtt)
! # Relationships
! srcRelName='to'+dstE.name # TBD: build it appropriately!
! dstRelName='to'+srcE.name+'s' # TBD: build it appropriately!
! srcRel=RToOne(srcRelName, dstE.name, ## TBD: +properties
! src=srcAtt.name, dst=dstAtt.name)
! dstRel=RToMany(dstRelName, srcE.name, ## TBD: +properties
! src=dstAtt.name, dst=srcAtt.name)
srcE.properties.append(srcRel)
dstE.properties.append(dstRel)
--- 828,875 ----
if not dstE:
raise ValueError, 'Association: Unable to find destination entity %s'%self.dst
! ## PK
! dstE_pk=dstE.primaryKey()
! if not self.keys[1]: # unspecified: retrieve it
! if not dstE_pk:
! raise ValueError, '%s: Unable to find a PK in entity %s'%(self.name, self.dst)
! dstAtt=dstE_pk
! self.keys[1]=dstAtt.name
!
! else: # destination PK was specified
! if dstE_pk and dstE_pk.name != self.keys[1]:
! raise ValueError, '%s: specifies a destination attribute %s for entity %s for this entity already has a PK named %s'%(self.name,self.keys[1],self.dst,dstE_pk.name)
!
! dstAtt=dstE.attributeNamed(self.keys[1])
! if not dstAtt:
! debug('Creating default PK in %s'%self.dst)
! dstAtt=APrimaryKey()
! dstE.properties.append(dstAtt)
! ## FK
! srcAtt=srcE.attributeNamed(self.keys[0])
! if not srcAtt:
! if not self.keys[0]:
! self.keys[0]=srcE.attFKName(dstE.name)
! debug('%s: Creating FK %s.%s'%(self.name, self.src, self.keys[0]))
! srcAtt=AForeignKey(self.keys[0])
! srcE.properties.append(srcAtt)
!
! ## Now srcAtt and dstAtt are set
!
! # Relationships
! toOne_kw={} ; toMany_kw={}
! for k in ('delete','isClassProperty','joinSemantic','displayLabel','doc'):
! toOne_kw[k]=getattr(self, k)[0]
! toMany_kw[k]=getattr(self, k)[1]
! toOne_kw['src']=srcAtt.name ; toOne_kw['dst']=dstAtt.name
! toMany_kw['src']=dstAtt.name ; toMany_kw['dst']=srcAtt.name
!
! #srcRel=RToOne(self.relations[0], dstE.name, ## TBD: +properties
! # src=srcAtt.name, dst=dstAtt.name)
! srcRel=apply(RToOne, (self.relations[0], dstE.name), toOne_kw)
! #dstRel=RToMany(self.relations[1], srcE.name, ## TBD: +properties
! # src=dstAtt.name, dst=srcAtt.name)
! dstRel=apply(RToMany, (self.relations[1], srcE.name), toMany_kw)
srcE.properties.append(srcRel)
dstE.properties.append(dstRel)
***************
*** 865,873 ****
l=[kw[n] for n in v.param]
v=apply(v.method, l)
else:
v=copy(v)
! #try: print k, ': ', v
! #except: import pdb ; pdb.set_trace()
! object.component.takeStoredValueForKey(v,k)
##
--- 924,933 ----
l=[kw[n] for n in v.param]
v=apply(v.method, l)
+ setattr(object, k, v)
else:
v=copy(v)
! if hasattr(object, 'component'):
! # Associations do not have any 'component'
! object.component.takeStoredValueForKey(v,k)
##
|