|
@@ -40,10 +40,68 @@ class LeFactory(object):
|
40
|
40
|
def fieldtype_construct_from_field(emfield):
|
41
|
41
|
return '%s.EmFieldType(**%s)'%(
|
42
|
42
|
GenericFieldType.module_name(emfield.fieldtype),
|
43
|
|
- emfield._fieldtype_args.__repr__(),
|
|
43
|
+ repr(emfield._fieldtype_args),
|
44
|
44
|
)
|
45
|
|
-
|
|
45
|
+
|
|
46
|
+ ## @brief Given a Model and an EmClass instances generate python code for corresponding LeClass
|
|
47
|
+ # @param model Model : A Model instance
|
|
48
|
+ # @param emclass EmClass : An EmClass instance from model
|
|
49
|
+ # @return A string representing the python code for the corresponding LeClass child class
|
|
50
|
+ @staticmethod
|
|
51
|
+ def emclass_pycode(model, emclass):
|
|
52
|
+ cls_fields = dict()
|
|
53
|
+ cls_linked_types = list()
|
|
54
|
+ for field in emclass.fields():
|
|
55
|
+ cls_fields[field.name] = LeFactory.fieldtype_construct_from_field(field)
|
|
56
|
+ fti = field.fieldtype_instance()
|
|
57
|
+ if fti.name == 'rel2type':
|
|
58
|
+ #relationnal field/fieldtype
|
|
59
|
+ cls_linked_types.append(LeFactory.name2classname(model.component(fti.rel_to_type_id).name))
|
|
60
|
+ cls_fieldgroup = dict()
|
|
61
|
+ for fieldgroup in emclass.fieldgroups():
|
|
62
|
+ cls_fieldgroup[fieldgroup.name] = list()
|
|
63
|
+ for field in fieldgroup.fields():
|
|
64
|
+ cls_fieldgroup[fieldgroup.name].append(field.name)
|
46
|
65
|
|
|
66
|
+ return """
|
|
67
|
+{name}._fildtypes = {ftypes}
|
|
68
|
+{name}._linked_types = {ltypes}
|
|
69
|
+{name}._fieldgroups = {fgroups}
|
|
70
|
+""".format(
|
|
71
|
+ name = LeFactory.name2classname(emclass.name),
|
|
72
|
+ ftypes = repr(cls_fields),
|
|
73
|
+ ltypes = "{"+(','.join(cls_linked_types))+'}',
|
|
74
|
+ fgroups = repr(cls_fieldgroup)
|
|
75
|
+)
|
|
76
|
+
|
|
77
|
+ ## @brief Given a Model and an EmType instances generate python code for corresponding LeType
|
|
78
|
+ # @param model Model : A Model instance
|
|
79
|
+ # @param emtype EmType : An EmType instance from model
|
|
80
|
+ # @return A string representing the python code for the corresponding LeType child class
|
|
81
|
+ @staticmethod
|
|
82
|
+ def emtype_pycode(model, emtype):
|
|
83
|
+ type_fields = list()
|
|
84
|
+ type_superiors = list()
|
|
85
|
+ for field in emtype.fields():
|
|
86
|
+ type_fields.append(field.name)
|
|
87
|
+
|
|
88
|
+ for nat, sup_l in emtype.superiors().items():
|
|
89
|
+ type_superiors.append('%s:[%s]'%(
|
|
90
|
+ repr(nat),
|
|
91
|
+ ','.join([ LeFactory.name2classname(sup.name) for sup in sup_l])
|
|
92
|
+ ))
|
|
93
|
+
|
|
94
|
+ return """
|
|
95
|
+{name}._fields = {fields}
|
|
96
|
+{name}._superiors = {dsups}
|
|
97
|
+{name}._leClass = {leclass}
|
|
98
|
+""".format(
|
|
99
|
+ name = LeFactory.name2classname(emtype.name),
|
|
100
|
+ fields = repr(type_fields),
|
|
101
|
+ dsups = '{'+(','.join(type_superiors))+'}',
|
|
102
|
+ leclass = LeFactory.name2classname(emtype.em_class.name)
|
|
103
|
+)
|
|
104
|
+
|
47
|
105
|
## @brief Generate python code containing the LeObject API
|
48
|
106
|
# @param model_args dict : Dict of Model __init__ method arguments
|
49
|
107
|
# @param datasource_args dict : Dict of datasource __init__ method arguments
|
|
@@ -53,89 +111,47 @@ class LeFactory(object):
|
53
|
111
|
model = Model(backend=backend_cls(**backend_args))
|
54
|
112
|
|
55
|
113
|
result = ""
|
56
|
|
- result += "#-*- coding: utf-8 -*-\n"
|
|
114
|
+ #result += "#-*- coding: utf-8 -*-\n"
|
57
|
115
|
#Putting import directives in result
|
58
|
|
- result += "\n\n\
|
59
|
|
-from EditorialModel.model import Model\n\
|
60
|
|
-from leobject.leobject import _LeObject\n\
|
61
|
|
-from leobject.leclass import LeClass\n\
|
62
|
|
-from leobject.letype import LeType\n\
|
63
|
|
-import EditorialModel.fieldtypes\n\
|
64
|
|
-"
|
65
|
|
-
|
66
|
|
- result += "\n\
|
67
|
|
-import %s\n\
|
68
|
|
-import %s\n\
|
69
|
|
-"%(backend_cls.__module__, datasource_cls.__module__)
|
|
116
|
+ result += """
|
|
117
|
+
|
|
118
|
+from EditorialModel.model import Model
|
|
119
|
+from leobject.leobject import _LeObject
|
|
120
|
+from leobject.leclass import LeClass
|
|
121
|
+from leobject.letype import LeType
|
|
122
|
+import EditorialModel.fieldtypes
|
|
123
|
+"""
|
|
124
|
+
|
|
125
|
+ result += """
|
|
126
|
+import %s
|
|
127
|
+import %s
|
|
128
|
+"""%(backend_cls.__module__, datasource_cls.__module__)
|
70
|
129
|
|
71
|
130
|
#Generating the code for LeObject class
|
72
|
|
- backend_constructor = '%s.%s(**%s)'%(backend_cls.__module__, backend_cls.__name__, backend_args.__repr__())
|
|
131
|
+ backend_constructor = '%s.%s(**%s)'%(backend_cls.__module__, backend_cls.__name__, repr(backend_args))
|
73
|
132
|
leobj_me_uid = dict()
|
74
|
133
|
for comp in model.components('EmType') + model.components('EmClass'):
|
75
|
134
|
leobj_me_uid[comp.uid] = LeFactory.name2classname(comp.name)
|
76
|
135
|
|
77
|
|
- result += "\n\
|
78
|
|
-class LeObject(_LeObject):\n\
|
79
|
|
- _model = Model(backend=%s)\n\
|
80
|
|
- _datasource = %s(**%s)\n\
|
81
|
|
- _me_uid = %s\n\
|
82
|
|
-\n\
|
83
|
|
-"%(backend_constructor, datasource_cls.__name__, datasource_args.__repr__(), leobj_me_uid.__repr__())
|
|
136
|
+ result += """
|
|
137
|
+class LeObject(_LeObject):
|
|
138
|
+ _model = Model(backend=%s)
|
|
139
|
+ _datasource = %s(**%s)
|
|
140
|
+ _me_uid = %s
|
|
141
|
+
|
|
142
|
+"""%(backend_constructor, datasource_cls.__name__, repr(datasource_args), repr(leobj_me_uid))
|
84
|
143
|
|
|
144
|
+ #LeClass and LeType child classes definition
|
85
|
145
|
for emclass in model.components(EditorialModel.classes.EmClass):
|
86
|
|
- cls_fields = dict()
|
87
|
|
- cls_linked_types = list()
|
88
|
|
- for field in emclass.fields():
|
89
|
|
- cls_fields[field.name] = LeFactory.fieldtype_construct_from_field(field)
|
90
|
|
- fti = field.fieldtype_instance()
|
91
|
|
- if fti.name == 'rel2type':
|
92
|
|
- #relationnal field/fieldtype
|
93
|
|
- cls_linked_types.append(LeFactory.name2classname(model.component(fti.rel_to_type_id).name))
|
94
|
|
- cls_fieldgroup = dict()
|
95
|
|
- for fieldgroup in emclass.fieldgroups():
|
96
|
|
- cls_fieldgroup[fieldgroup.name] = list()
|
97
|
|
- for field in fieldgroup.fields():
|
98
|
|
- cls_fieldgroup[fieldgroup.name].append(field.name)
|
99
|
|
-
|
100
|
|
- result += "\n\
|
101
|
|
-class %s(LeObject, LeClass):\n\
|
102
|
|
- _fieldtypes = %s\n\
|
103
|
|
- _linked_types = [%s]\n\
|
104
|
|
- _fieldgroups = %s\n\
|
105
|
|
-\n\
|
106
|
|
-"%(
|
107
|
|
- LeFactory.name2classname(emclass.name),
|
108
|
|
- cls_fields.__repr__(),
|
109
|
|
- ','.join(cls_linked_types),
|
110
|
|
- cls_fieldgroup.__repr__()
|
111
|
|
-)
|
112
|
|
-
|
|
146
|
+ result += 'class %s(LeObject,LeType): pass\n'%(LeFactory.name2classname(emclass.name))
|
113
|
147
|
for emtype in model.components(EditorialModel.types.EmType):
|
114
|
|
- type_fields = list()
|
115
|
|
- type_superiors = list()
|
116
|
|
- for field in emtype.fields():
|
117
|
|
- type_fields.append(field.name)
|
118
|
|
-
|
119
|
|
- for nat, sup_l in emtype.superiors().items():
|
120
|
|
- type_superiors.append('%s:[%s]'%(
|
121
|
|
- nat.__repr__(),
|
122
|
|
- ','.join([ LeFactory.name2classname(sup.name) for sup in sup_l])
|
123
|
|
- ))
|
124
|
|
-
|
125
|
|
-
|
126
|
|
- result += "\n\
|
127
|
|
-class %s(%s,LeType):\n\
|
128
|
|
- _fields = %s\n\
|
129
|
|
- _superiors = {%s}\n\
|
130
|
|
- _leClass = %s\n\
|
131
|
|
-\n\
|
132
|
|
-"%(
|
133
|
|
- LeFactory.name2classname(emtype.name),
|
134
|
|
- LeFactory.name2classname(emtype.em_class.name),
|
135
|
|
- type_fields.__repr__(),
|
136
|
|
- ','.join(type_superiors),
|
137
|
|
- LeFactory.name2classname(emtype.em_class.name)
|
138
|
|
-)
|
139
|
|
-
|
|
148
|
+ result += 'class %s(%s,LeType): pass\n'%(LeFactory.name2classname(emtype.name),LeFactory.name2classname(emtype.em_class.name),)
|
|
149
|
+
|
|
150
|
+ #Set attributes of created LeClass and LeType child classes
|
|
151
|
+ for emclass in model.components(EditorialModel.classes.EmClass):
|
|
152
|
+ result += LeFactory.emclass_pycode(model, emclass)
|
|
153
|
+ for emtype in model.components(EditorialModel.types.EmType):
|
|
154
|
+ result += LeFactory.emtype_pycode(model, emtype)
|
|
155
|
+
|
140
|
156
|
return result
|
141
|
157
|
|