浏览代码

DataHandler names unification + test_em modifications

Yann Weber 9 年前
父节点
当前提交
7d209cdb3b

+ 1
- 1
lodel/leapi/datahandlers/data_fields/bool.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
 
6
 
7
     help = 'A basic boolean field'
7
     help = 'A basic boolean field'
8
     ftype = 'bool'
8
     ftype = 'bool'

+ 1
- 1
lodel/leapi/datahandlers/data_fields/datetime.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
 
6
 
7
     help = 'A datetime field. Take two boolean options now_on_update and now_on_create'
7
     help = 'A datetime field. Take two boolean options now_on_update and now_on_create'
8
 
8
 

+ 1
- 1
lodel/leapi/datahandlers/data_fields/file.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
 
6
 
7
     ## @brief a file field
7
     ## @brief a file field
8
     # @param upload_path str : None by default
8
     # @param upload_path str : None by default

+ 1
- 1
lodel/leapi/datahandlers/data_fields/format.py 查看文件

3
 from .varchar import EmDataField as VarcharDataField
3
 from .varchar import EmDataField as VarcharDataField
4
 
4
 
5
 
5
 
6
-class EmDataField(VarcharDataField):
6
+class DataHandler(VarcharDataField):
7
 
7
 
8
     help = 'Automatic string field, designed to use the str % operator to build its content'
8
     help = 'Automatic string field, designed to use the str % operator to build its content'
9
 
9
 

+ 1
- 1
lodel/leapi/datahandlers/data_fields/integer.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
 
6
 
7
     help = 'Basic integer field'
7
     help = 'Basic integer field'
8
     ftype = 'int'
8
     ftype = 'int'

+ 1
- 1
lodel/leapi/datahandlers/data_fields/regexvarchar.py 查看文件

3
 from .varchar import EmDataField as VarcharDataField
3
 from .varchar import EmDataField as VarcharDataField
4
 
4
 
5
 
5
 
6
-class EmDataField(VarcharDataField):
6
+class DataHandler(VarcharDataField):
7
 
7
 
8
     help = 'String field validated with a regex. Takes two options : max_length and regex'
8
     help = 'String field validated with a regex. Takes two options : max_length and regex'
9
 
9
 

+ 1
- 1
lodel/leapi/datahandlers/data_fields/text.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
     help = 'A text field (big string)'
6
     help = 'A text field (big string)'
7
     ftype = 'text'
7
     ftype = 'text'
8
 
8
 

+ 1
- 1
lodel/leapi/datahandlers/data_fields/uid.py 查看文件

2
 from .integer import EmDataField as IntegerDataField
2
 from .integer import EmDataField as IntegerDataField
3
 
3
 
4
 
4
 
5
-class EmDataField(IntegerDataField):
5
+class DataHandler(IntegerDataField):
6
 
6
 
7
     help = 'Fieldtype designed to handle editorial model UID'
7
     help = 'Fieldtype designed to handle editorial model UID'
8
 
8
 

+ 1
- 1
lodel/leapi/datahandlers/data_fields/varchar.py 查看文件

2
 from ..data_field import DataField
2
 from ..data_field import DataField
3
 
3
 
4
 
4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6
     help = 'Basic string (varchar) field. Default size is 64 characters'
6
     help = 'Basic string (varchar) field. Default size is 64 characters'
7
 
7
 
8
     ## @brief A string field
8
     ## @brief A string field

+ 16
- 5
lodel/leapi/datahandlers/field_data_handler.py 查看文件

76
     # @param fieldtype_name str : A field type name
76
     # @param fieldtype_name str : A field type name
77
     # @return DataField child class
77
     # @return DataField child class
78
     @staticmethod
78
     @staticmethod
79
-    def from_name(fieldtype_name):
80
-        mod = importlib.import_module(FieldDataHandler.module_name(fieldtype_name))
81
-        return mod.EmDataField
79
+    def from_name(data_handler_name):
80
+        data_handler_name = data_handler_name.lower()
81
+        mod = None
82
+        for mname in FieldDataHandler.modules_name(data_handler_name):
83
+            try:
84
+                mod = importlib.import_module(mname)
85
+            except ImportError:
86
+                pass
87
+        if mod is None:
88
+            raise NameError("Unknown data_handler name : '%s'" % data_handler_name)
89
+        return mod.DataHandler
82
 
90
 
83
     ## @brief get a module name given a fieldtype name
91
     ## @brief get a module name given a fieldtype name
84
     # @param fieldtype_name str : a field type name
92
     # @param fieldtype_name str : a field type name
85
     # @return a string representing a python module name
93
     # @return a string representing a python module name
86
     @staticmethod
94
     @staticmethod
87
-    def module_name(fieldtype_name):
88
-        return 'lodel.leapi.datahandlers.data_fields.%s' % fieldtype_name
95
+    def modules_name(fieldtype_name):
96
+        return (
97
+                'lodel.leapi.datahandlers.data_fields.%s' % fieldtype_name,
98
+                'lodel.leapi.datahandlers.references.%s' % fieldtype_name
99
+        )
89
 
100
 
90
     ## @brief __hash__ implementation for fieldtypes
101
     ## @brief __hash__ implementation for fieldtypes
91
     def __hash__(self):
102
     def __hash__(self):

+ 4
- 5
lodel/leapi/datahandlers/reference.py 查看文件

6
 class Reference(FieldDataHandler):
6
 class Reference(FieldDataHandler):
7
 
7
 
8
     ## @brief Instanciation
8
     ## @brief Instanciation
9
-    # @param allowed list
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
10
     # @param internal bool : if False, the field is not internal
10
     # @param internal bool : if False, the field is not internal
11
     # @param **kwargs : other arguments
11
     # @param **kwargs : other arguments
12
-    def __init__(self, allowed=[], internal=False, **kwargs):
13
-        self.allowed = allowed
14
-        self.internal = internal
15
-        super().__init__(internal=self.internal, **kwargs)
12
+    def __init__(self, allowed_classes = None, internal=False, **kwargs):
13
+        self.allowed_classes = None if allowed_classes is None else set(allowed_classes)
14
+        super().__init__(internal=internal, **kwargs)
16
 
15
 
17
     ## @brief gets the target of the reference
16
     ## @brief gets the target of the reference
18
     def get_relateds(self):
17
     def get_relateds(self):

+ 0
- 16
lodel/leapi/datahandlers/references/Link.py 查看文件

1
-# -*- coding: utf-8 -*-
2
-from lodel.leapi.datahandlers.reference import Reference
3
-from lodel.editorial_model.components import EmClass
4
-
5
-
6
-class Link(Reference):
7
-
8
-    ## @brief instanciates a link reference
9
-    # @param emclass EmClass : linked object
10
-    # @param allowed list
11
-    # @param internal bool : if False, the field is not internal
12
-    # @param kwargs : Other named arguments
13
-    def __init__(self, emclass, allowed=[], internal=False, **kwargs):
14
-        self._refs = emclass
15
-        self._refs_class = EmClass
16
-        super().__init__(allowed=allowed, internal=internal, **kwargs)

lodel/leapi/datahandlers/references/Dict.py → lodel/leapi/datahandlers/references/dict.py 查看文件

3
 from lodel.editorial_model.components import EmClass
3
 from lodel.editorial_model.components import EmClass
4
 
4
 
5
 
5
 
6
-class Dict(Reference):
6
+class DataHandler(Reference):
7
 
7
 
8
     ## @brief instanciates a dict reference
8
     ## @brief instanciates a dict reference
9
-    # @param emclasses dict : Dict of EmClass objects
10
-    # @param allowed list
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
11
     # @param internal bool : if False, the field is not internal
10
     # @param internal bool : if False, the field is not internal
12
     # @param kwargs : Other named arguments
11
     # @param kwargs : Other named arguments
13
-    def __init__(self, emclasses, allowed=[], internal=False, **kwargs):
14
-        self._refs = set(emclasses)
15
-        self._refs_class = dict
16
-        super().__init__(allowed=allowed, internal=internal, **kwargs)
12
+    def __init__(self, allowed_classes = None, internal=False, **kwargs):
13
+        super().__init__(allowed_classes=allowed_classes, internal=internal, **kwargs)
17
 
14
 
18
     ## @brief checks if the given target is valid
15
     ## @brief checks if the given target is valid
19
     # @return bool
16
     # @return bool
37
         if isinstance(emclass, EmClass) and isinstance(ref_name, str):
34
         if isinstance(emclass, EmClass) and isinstance(ref_name, str):
38
             self._refs[ref_name] = emclass
35
             self._refs[ref_name] = emclass
39
             return True
36
             return True
40
-        return False
37
+        return False

+ 13
- 0
lodel/leapi/datahandlers/references/link.py 查看文件

1
+# -*- coding: utf-8 -*-
2
+from lodel.leapi.datahandlers.reference import Reference
3
+from lodel.editorial_model.components import EmClass
4
+
5
+
6
+class DataHandler(Reference):
7
+
8
+    ## @brief instanciates a link reference
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
10
+    # @param internal bool : if False, the field is not internal
11
+    # @param kwargs : Other named arguments
12
+    def __init__(self, allowed_classes = None, internal=False, **kwargs):
13
+        super().__init__(allowed_classes=allowed_classes, internal=internal, **kwargs)

lodel/leapi/datahandlers/references/List.py → lodel/leapi/datahandlers/references/list.py 查看文件

3
 from lodel.leapi.datahandlers.reference import Reference
3
 from lodel.leapi.datahandlers.reference import Reference
4
 
4
 
5
 
5
 
6
-class List(Reference):
6
+class DataHandler(Reference):
7
 
7
 
8
     ## @brief instanciates a list reference
8
     ## @brief instanciates a list reference
9
-    # @param emclasses list : linked emclasses objects
10
-    # @param allowed list
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
11
     # @param internal bool
10
     # @param internal bool
12
     # @param kwargs
11
     # @param kwargs
13
-    def __init__(self, emclasses, allowed=[], internal=False, **kwargs):
14
-        self._refs = emclasses
15
-        self._refs_class = list
16
-        super().__init__(self, allowed=allowed, internal=internal, **kwargs)
12
+    def __init__(self, allowed_classes = None, internal=False, **kwargs):
13
+        super().__init__(allowed_classes=allowed_classes, internal=internal, **kwargs)
17
 
14
 
18
     ## @brief adds a referenced element
15
     ## @brief adds a referenced element
19
     # @param emclass EmClass
16
     # @param emclass EmClass
22
         if isinstance(emclass, EmClass):
19
         if isinstance(emclass, EmClass):
23
             self._refs.append(emclass)
20
             self._refs.append(emclass)
24
             return True
21
             return True
25
-        return False
22
+        return False

lodel/leapi/datahandlers/references/Set.py → lodel/leapi/datahandlers/references/set.py 查看文件

3
 from lodel.leapi.datahandlers.reference import Reference
3
 from lodel.leapi.datahandlers.reference import Reference
4
 
4
 
5
 
5
 
6
-class Set(Reference):
6
+class DataHandler(Reference):
7
 
7
 
8
     ## @brief instanciates a set reference
8
     ## @brief instanciates a set reference
9
-    # @param emclasses list : List of EmClass objects
10
-    # @param allowed list
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
11
     # @param internal bool : if False, the field is not internal
10
     # @param internal bool : if False, the field is not internal
12
     # @param kwargs : Other named arguments
11
     # @param kwargs : Other named arguments
13
-    def __init__(self, emclasses, allowed=[], internal=False, **kwargs):
14
-        self._refs = set(emclasses)
15
-        self._refs_class = set
16
-        super().__init__(allowed=allowed, internal=internal, **kwargs)
12
+    def __init__(self, allowed_classes = None, internal=False, **kwargs):
13
+        super().__init__(allowed_classes=allowed_classes, internal=internal, **kwargs)
17
 
14
 
18
     ## @brief adds a referenced element
15
     ## @brief adds a referenced element
19
     # @param emclass EmClass
16
     # @param emclass EmClass
22
         if isinstance(emclass, EmClass):
19
         if isinstance(emclass, EmClass):
23
             self._refs.add(emclass)
20
             self._refs.add(emclass)
24
             return True
21
             return True
25
-        return False
22
+        return False

+ 119
- 3
test_em.py 查看文件

73
                         parents = em_object,
73
                         parents = em_object,
74
 )
74
 )
75
 
75
 
76
+person.new_field(   'firstname',
77
+                    display_name = {
78
+                        'eng': 'Firstname',
79
+                        'fre': 'Prénom',
80
+                    },
81
+                    data_handler = 'varchar',
82
+)
83
+person.new_field(   'lastname',
84
+                    display_name = {
85
+                        'eng': 'Lastname',
86
+                        'fre': 'Nom de famille',
87
+                    },
88
+                    data_handler = 'varchar',
89
+)
90
+person.new_field(   'fullname',
91
+                    display_name = {
92
+                        'eng': 'Fullname',
93
+                        'fre': 'Nom complet',
94
+                    },
95
+                    group = base_group,
96
+                    data_handler = 'varchar', # <-- should be concat type
97
+                    internal = True,
98
+                    immutable = True,
99
+)
100
+person.new_field(   'alias',
101
+                    display_name = 'alias',
102
+                    help_text = {
103
+                        'eng': 'Link to other person class instance that represent the same person',
104
+                        'fre': 'Lien vers un ensemble d\'instances de la classe personne représentant le même individu',
105
+                    },
106
+                    data_handler = 'set',
107
+                    allowed_classes = [person],
108
+)
109
+
110
+
76
 entry = em.new_class(   'entry',
111
 entry = em.new_class(   'entry',
77
                         display_name = 'Entry',
112
                         display_name = 'Entry',
78
                         help_text = 'Replace olf entry classtype',
113
                         help_text = 'Replace olf entry classtype',
95
 )
130
 )
96
 
131
 
97
 # Classe texte
132
 # Classe texte
98
-texte = em.new_class(   'text',
133
+text = em.new_class(   'text',
99
                         display_name = 'Text',
134
                         display_name = 'Text',
100
                         help_text = 'Abstract class that represent texts',
135
                         help_text = 'Abstract class that represent texts',
101
                         group = editorial_group,
136
                         group = editorial_group,
102
                         abstract = True,
137
                         abstract = True,
103
 )
138
 )
104
 
139
 
105
-texte.new_field(    'title',
140
+text.new_field(    'title',
106
                     display_name = {'eng': 'Title', 'fre': 'Titre'},
141
                     display_name = {'eng': 'Title', 'fre': 'Titre'},
107
                     group = editorial_group,
142
                     group = editorial_group,
108
                     data_handler = 'varchar',
143
                     data_handler = 'varchar',
109
 )
144
 )
110
-texte.new_field(    'subtitle',
145
+text.new_field(    'subtitle',
111
                     display_name = {
146
                     display_name = {
112
                         'eng': 'Subtitle',
147
                         'eng': 'Subtitle',
113
                         'fre': 'Sous-titre',
148
                         'fre': 'Sous-titre',
128
                         abstract = True,
163
                         abstract = True,
129
                         data_handler = 'varchar'
164
                         data_handler = 'varchar'
130
 )
165
 )
166
+
167
+#####################
168
+# Persons & authors #
169
+#####################
170
+
171
+editorial_person_group = em.new_group(  'editorial_person',
172
+                                        display_name = 'Editorial person',
173
+                                        help_text = {
174
+                                            'eng': 'Introduce the concept of editorial person (authors, translator etc)',
175
+                                            'fre': 'Contient les classes servant à la gestion des personnes editorials (auteurs, traducteur...)',
176
+                                        },
177
+                                        depends = (editorial_group,)
178
+)
179
+text_person = em.new_class( 'text_person',
180
+                            display_name = {
181
+                                'eng': 'TextPerson',
182
+                                'fre': 'TextePersonne',
183
+                            },
184
+                            help_text = {
185
+                                'eng': 'Represent a link between someone and a text',
186
+                                'fre': 'Représente un lien entre une personne et un texte',
187
+                            },
188
+                            group = editorial_person_group,
189
+                            abstract = True,
190
+)
191
+bref_textperson_text = text_person.new_field(  'text',
192
+                                                display_name = {
193
+                                                    'eng': 'Linked text',
194
+                                                    'fre': 'Texte lié',
195
+                                                },
196
+                                                data_handler = 'link',
197
+                                                allowed_classes = [text],
198
+                                                group = editorial_person_group
199
+)
200
+bref_textperson_person = text_person.new_field( 'person',
201
+                                                display_name = {
202
+                                                    'eng': 'Linked person',
203
+                                                    'fre': 'Personne liée',
204
+                                                },
205
+                                                data_handler = 'link',
206
+                                                allowed_classes = [person],
207
+                                                group = editorial_person_group,
208
+)
209
+text_person.new_field(  'role',
210
+                        display_name = {
211
+                            'eng': 'Person role',
212
+                            'fre': 'Role de la personne',
213
+                        },
214
+                        data_handler = 'varchar',
215
+                        group = editorial_person_group
216
+)
217
+"""
218
+person.new_field(   'linked_texts',
219
+                    display_name = {
220
+                        'eng': 'Linked texts',
221
+                        'fre': 'Textes liés',
222
+                    },
223
+                    data_handler = 'relation',
224
+                    data_handler_kwargs = {
225
+                        'data_handler': 'list',
226
+                        'allowed_class': text_person,
227
+                        'backreference': bref_textperson_text,
228
+                    },
229
+                    group = editorial_person_group,
230
+)
231
+text.new_field( 'linked_persons',
232
+                display_name = {
233
+                    'eng': 'Linked persons',
234
+                    'fre': 'Personnes liées',
235
+                },
236
+                data_handler = 'relation',
237
+                data_handler_kwargs = {
238
+                    'data_handler': 'list',
239
+                    'allowed_class': text_person,
240
+                    'backreference': bref_textperson_person,
241
+
242
+                },
243
+                group = editorial_person_group,
244
+)
245
+"""
246
+

正在加载...
取消
保存