mirror of
https://github.com/yweber/lodel2.git
synced 2026-05-10 16:15:58 +02:00
Updated generated code with LeRel2Type child classes
This commit is contained in:
parent
8cff059ab3
commit
61786cc71e
3 changed files with 36 additions and 17 deletions
|
|
@ -10,8 +10,8 @@ class _LeClass(_LeObject):
|
||||||
|
|
||||||
## @brief Stores fieldtypes by field name
|
## @brief Stores fieldtypes by field name
|
||||||
_fieldtypes = dict()
|
_fieldtypes = dict()
|
||||||
## @brief Stores relation with some LeType using rel2type fields. Key = rel2type fieldname value = LeType class
|
## @brief Stores authorized link2type
|
||||||
_linked_types = dict()
|
_linked_types = list()
|
||||||
## @brief Stores fieldgroups and the fields they contains
|
## @brief Stores fieldgroups and the fields they contains
|
||||||
_fieldgroups = dict()
|
_fieldgroups = dict()
|
||||||
## @brief Stores the EM uid
|
## @brief Stores the EM uid
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,31 @@ class LeFactory(object):
|
||||||
res_ft_l.append( '%s: %s'%(repr(fname), constructor) )
|
res_ft_l.append( '%s: %s'%(repr(fname), constructor) )
|
||||||
return (res_uid_ft, res_ft_l)
|
return (res_uid_ft, res_ft_l)
|
||||||
|
|
||||||
|
## @brief Given a Model generate concrete instances of LeRel2Type classes to represent relations
|
||||||
|
# @param model : the EditorialModel
|
||||||
|
# @return python code
|
||||||
|
def emrel2type_pycode(self, model):
|
||||||
|
res_code = ""
|
||||||
|
for field in [ f for f in model.components('EmField') if f.fieldtype == 'rel2type']:
|
||||||
|
related = model.component(field.rel_to_type_id)
|
||||||
|
src = field.em_class
|
||||||
|
cls_name = "Rel_%s2%s"%(src.name, related.name)
|
||||||
|
|
||||||
|
attr_l = dict()
|
||||||
|
for attr in [ f for f in model.components('EmField') if f.rel_field_id == field.uid]:
|
||||||
|
attr_l[attr.name] = LeFactory.fieldtype_construct_from_field(attr)
|
||||||
|
|
||||||
|
rel_code = """
|
||||||
|
class {classname}(LeRel2Type):
|
||||||
|
_rel_attr_fieldtypes = {attr_dict}
|
||||||
|
|
||||||
|
""".format(
|
||||||
|
classname = cls_name,
|
||||||
|
attr_dict = "{" + (','.join(['\n %s: %s' % (repr(f), v) for f,v in attr_l.items()])) + "\n}"
|
||||||
|
)
|
||||||
|
res_code += rel_code
|
||||||
|
return res_code
|
||||||
|
|
||||||
## @brief Given a Model and an EmClass instances generate python code for corresponding LeClass
|
## @brief Given a Model and an EmClass instances generate python code for corresponding LeClass
|
||||||
# @param model Model : A Model instance
|
# @param model Model : A Model instance
|
||||||
# @param emclass EmClass : An EmClass instance from model
|
# @param emclass EmClass : An EmClass instance from model
|
||||||
|
|
@ -82,13 +107,11 @@ class LeFactory(object):
|
||||||
def emclass_pycode(self, model, emclass):
|
def emclass_pycode(self, model, emclass):
|
||||||
|
|
||||||
cls_fields = dict()
|
cls_fields = dict()
|
||||||
cls_linked_types = dict() #keys are LeType classnames and values are tuples (attr_fieldname, attr_fieldtype)
|
cls_linked_types = list() #Stores authorized LeObject for rel2type
|
||||||
#Populating linked_type attr
|
#Populating linked_type attr
|
||||||
for rfield in [ f for f in emclass.fields() if f.fieldtype == 'rel2type']:
|
for rfield in [ f for f in emclass.fields() if f.fieldtype == 'rel2type']:
|
||||||
fti = rfield.fieldtype_instance()
|
fti = rfield.fieldtype_instance()
|
||||||
cls_linked_types[LeFactory.name2classname(model.component(fti.rel_to_type_id).name)] = [
|
cls_linked_types.append(LeFactory.name2classname(model.component(fti.rel_to_type_id).name))
|
||||||
(f.name, LeFactory.fieldtype_construct_from_field(f)) for f in model.components('EmField') if f.rel_field_id == rfield.uid
|
|
||||||
]
|
|
||||||
# Populating fieldtype attr
|
# Populating fieldtype attr
|
||||||
for field in emclass.fields(relational = False):
|
for field in emclass.fields(relational = False):
|
||||||
self.needed_fieldtypes |= set([field.fieldtype])
|
self.needed_fieldtypes |= set([field.fieldtype])
|
||||||
|
|
@ -104,15 +127,7 @@ class LeFactory(object):
|
||||||
name = LeFactory.name2classname(emclass.name),
|
name = LeFactory.name2classname(emclass.name),
|
||||||
ftypes = "{" + (','.join(['\n %s: %s' % (repr(f), v) for f, v in cls_fields.items()])) + "\n}",
|
ftypes = "{" + (','.join(['\n %s: %s' % (repr(f), v) for f, v in cls_fields.items()])) + "\n}",
|
||||||
|
|
||||||
ltypes = '{'+ (','.join(
|
ltypes = "[" + (','.join(cls_linked_types))+"]",
|
||||||
[
|
|
||||||
'\n {ltname}: {ltattr_list}'.format(
|
|
||||||
ltname = lt,
|
|
||||||
ltattr_list = '['+(', '.join([
|
|
||||||
'(%s, %s)'%(repr(ltname), ltftype) for ltname, ltftype in ltattr
|
|
||||||
]))+']'
|
|
||||||
) for lt, ltattr in cls_linked_types.items()
|
|
||||||
]))+'}',
|
|
||||||
classtype = repr(emclass.classtype)
|
classtype = repr(emclass.classtype)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -289,12 +304,16 @@ class {name}(LeType, {leclass}):
|
||||||
uid=emtype.uid
|
uid=emtype.uid
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#Generating concret class of LeRel2Type
|
||||||
|
result += self.emrel2type_pycode(model)
|
||||||
|
|
||||||
#Set attributes of created LeClass and LeType child classes
|
#Set attributes of created LeClass and LeType child classes
|
||||||
for emclass in emclass_l:
|
for emclass in emclass_l:
|
||||||
result += self.emclass_pycode(model, emclass)
|
result += self.emclass_pycode(model, emclass)
|
||||||
for emtype in emtype_l:
|
for emtype in emtype_l:
|
||||||
result += self.emtype_pycode(model, emtype)
|
result += self.emtype_pycode(model, emtype)
|
||||||
|
|
||||||
|
|
||||||
#Populating LeObject._me_uid dict for a rapid fetch of LeType and LeClass given an EM uid
|
#Populating LeObject._me_uid dict for a rapid fetch of LeType and LeClass given an EM uid
|
||||||
me_uid = {comp.uid: LeFactory.name2classname(comp.name) for comp in emclass_l + emtype_l}
|
me_uid = {comp.uid: LeFactory.name2classname(comp.name) for comp in emclass_l + emtype_l}
|
||||||
result += """
|
result += """
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ from . import lecrud
|
||||||
class _LeRelation(lecrud._LeCrud):
|
class _LeRelation(lecrud._LeCrud):
|
||||||
|
|
||||||
## @brief Handles the superior
|
## @brief Handles the superior
|
||||||
_lesup_fieldtype = ft_leo.EmFieldType(True)
|
_lesup_fieldtype = {'lesup': ft_leo.EmFieldType(True)}
|
||||||
## @brief Handles the subordinate
|
## @brief Handles the subordinate
|
||||||
_lesub_fieldtype = ft_leo.EmFieldType(False)
|
_lesub_fieldtype = {'lesub': ft_leo.EmFieldType(False) }
|
||||||
## @brief Stores the list of fieldtypes that are common to all relations
|
## @brief Stores the list of fieldtypes that are common to all relations
|
||||||
_rel_fieldtypes = dict()
|
_rel_fieldtypes = dict()
|
||||||
## @brief Stores the list of fieldtypes handling relations attributes
|
## @brief Stores the list of fieldtypes handling relations attributes
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue