Browse Source

DataHandler names unification + test_em modifications

Yann Weber 9 years ago
parent
commit
7d209cdb3b

+ 1
- 1
lodel/leapi/datahandlers/data_fields/bool.py View File

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

+ 1
- 1
lodel/leapi/datahandlers/data_fields/datetime.py View File

@@ -2,7 +2,7 @@
2 2
 from ..data_field import DataField
3 3
 
4 4
 
5
-class EmDataField(DataField):
5
+class DataHandler(DataField):
6 6
 
7 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 View File

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

+ 1
- 1
lodel/leapi/datahandlers/data_fields/format.py View File

@@ -3,7 +3,7 @@ import warnings
3 3
 from .varchar import EmDataField as VarcharDataField
4 4
 
5 5
 
6
-class EmDataField(VarcharDataField):
6
+class DataHandler(VarcharDataField):
7 7
 
8 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 View File

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

+ 1
- 1
lodel/leapi/datahandlers/data_fields/regexvarchar.py View File

@@ -3,7 +3,7 @@ import re
3 3
 from .varchar import EmDataField as VarcharDataField
4 4
 
5 5
 
6
-class EmDataField(VarcharDataField):
6
+class DataHandler(VarcharDataField):
7 7
 
8 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 View File

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

+ 1
- 1
lodel/leapi/datahandlers/data_fields/uid.py View File

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

+ 1
- 1
lodel/leapi/datahandlers/data_fields/varchar.py View File

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

+ 16
- 5
lodel/leapi/datahandlers/field_data_handler.py View File

@@ -76,16 +76,27 @@ class FieldDataHandler(object):
76 76
     # @param fieldtype_name str : A field type name
77 77
     # @return DataField child class
78 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 91
     ## @brief get a module name given a fieldtype name
84 92
     # @param fieldtype_name str : a field type name
85 93
     # @return a string representing a python module name
86 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 101
     ## @brief __hash__ implementation for fieldtypes
91 102
     def __hash__(self):

+ 4
- 5
lodel/leapi/datahandlers/reference.py View File

@@ -6,13 +6,12 @@ from lodel.editorial_model.components import EmClass
6 6
 class Reference(FieldDataHandler):
7 7
 
8 8
     ## @brief Instanciation
9
-    # @param allowed list
9
+    # @param allowed_classes list | None : list of allowed em classes if None no restriction
10 10
     # @param internal bool : if False, the field is not internal
11 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 16
     ## @brief gets the target of the reference
18 17
     def get_relateds(self):

+ 0
- 16
lodel/leapi/datahandlers/references/Link.py View File

@@ -1,16 +0,0 @@
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 View File

@@ -3,17 +3,14 @@ from lodel.leapi.datahandlers.reference import Reference
3 3
 from lodel.editorial_model.components import EmClass
4 4
 
5 5
 
6
-class Dict(Reference):
6
+class DataHandler(Reference):
7 7
 
8 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 10
     # @param internal bool : if False, the field is not internal
12 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 15
     ## @brief checks if the given target is valid
19 16
     # @return bool
@@ -37,4 +34,4 @@ class Dict(Reference):
37 34
         if isinstance(emclass, EmClass) and isinstance(ref_name, str):
38 35
             self._refs[ref_name] = emclass
39 36
             return True
40
-        return False
37
+        return False

+ 13
- 0
lodel/leapi/datahandlers/references/link.py View File

@@ -0,0 +1,13 @@
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 View File

@@ -3,17 +3,14 @@ from lodel.editorial_model.components import EmClass
3 3
 from lodel.leapi.datahandlers.reference import Reference
4 4
 
5 5
 
6
-class List(Reference):
6
+class DataHandler(Reference):
7 7
 
8 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 10
     # @param internal bool
12 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 15
     ## @brief adds a referenced element
19 16
     # @param emclass EmClass
@@ -22,4 +19,4 @@ class List(Reference):
22 19
         if isinstance(emclass, EmClass):
23 20
             self._refs.append(emclass)
24 21
             return True
25
-        return False
22
+        return False

lodel/leapi/datahandlers/references/Set.py → lodel/leapi/datahandlers/references/set.py View File

@@ -3,17 +3,14 @@ from lodel.editorial_model.components import EmClass
3 3
 from lodel.leapi.datahandlers.reference import Reference
4 4
 
5 5
 
6
-class Set(Reference):
6
+class DataHandler(Reference):
7 7
 
8 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 10
     # @param internal bool : if False, the field is not internal
12 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 15
     ## @brief adds a referenced element
19 16
     # @param emclass EmClass
@@ -22,4 +19,4 @@ class Set(Reference):
22 19
         if isinstance(emclass, EmClass):
23 20
             self._refs.add(emclass)
24 21
             return True
25
-        return False
22
+        return False

+ 119
- 3
test_em.py View File

@@ -73,6 +73,41 @@ person = em.new_class(  'person',
73 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 111
 entry = em.new_class(   'entry',
77 112
                         display_name = 'Entry',
78 113
                         help_text = 'Replace olf entry classtype',
@@ -95,19 +130,19 @@ editorial_group = em.new_group( 'editorial_abstract',
95 130
 )
96 131
 
97 132
 # Classe texte
98
-texte = em.new_class(   'text',
133
+text = em.new_class(   'text',
99 134
                         display_name = 'Text',
100 135
                         help_text = 'Abstract class that represent texts',
101 136
                         group = editorial_group,
102 137
                         abstract = True,
103 138
 )
104 139
 
105
-texte.new_field(    'title',
140
+text.new_field(    'title',
106 141
                     display_name = {'eng': 'Title', 'fre': 'Titre'},
107 142
                     group = editorial_group,
108 143
                     data_handler = 'varchar',
109 144
 )
110
-texte.new_field(    'subtitle',
145
+text.new_field(    'subtitle',
111 146
                     display_name = {
112 147
                         'eng': 'Subtitle',
113 148
                         'fre': 'Sous-titre',
@@ -128,3 +163,84 @@ collection.new_field(   'title',
128 163
                         abstract = True,
129 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
+

Loading…
Cancel
Save