Browse Source

Bugfix and better implementation of _LeCrud.check_datas_value()

Yann Weber 9 years ago
parent
commit
d44d86cb79
1 changed files with 19 additions and 29 deletions
  1. 19
    29
      leapi/lecrud.py

+ 19
- 29
leapi/lecrud.py View File

@@ -106,39 +106,29 @@ class _LeCrud(object):
106 106
     @classmethod
107 107
     def check_datas_value(cls, datas, complete = False, allow_internal = True):
108 108
         err_l = [] #Stores errors
109
-        excepted = set()
110
-        internal = set() #Only used if not allow_internal
111
-        if not allow_internal:
112
-            internal = list()
113
-            excepted = list()
114
-            for ftn, ftt in cls.fieldtypes().items():
115
-                if ftt.is_internal():
116
-                    internal.append(ftn)
117
-                else:
118
-                    excepted.append(ftn)
119
-            excepted =  set(excepted)
120
-            internal = set(internal)
121
-        else:
122
-            excepted = set( cls.fieldtypes().keys() )
109
+        correct = [] #Valid fields name
110
+        mandatory = [] #mandatory fields name
111
+        for fname, ftt in cls.fieldtypes().items():
112
+            if allow_internal and not ftt.is_internal():
113
+                correct.append(fname)
114
+                if complete and not hasattr(ftt, 'default'):
115
+                    mandatory.append(fname)
116
+        mandatory = set(mandatory)
117
+        correct = set(correct)
123 118
         provided = set(datas.keys())
124 119
 
125
-        #Searching unknown fields
126
-        unknown = provided - (excepted | internal)
120
+        #searching unknow fields
121
+        unknown = provided - correct
127 122
         for u_f in unknown:
128
-            err_l.append(AttributeError("Unknown field '%s'"%u_f))
129
-        #Checks for missing fields
130
-        if complete:
131
-            missings = excepted - provided
132
-            for miss_field in missings:
133
-                err_l.append(AttributeError("The data for field '%s' is missing"%miss_field))
134
-        #Checks for internal fields if not allowe
135
-        if not allow_internal:
136
-            wrong_internal = provided & internal
137
-            for wint in wrong_internal:
138
-                err_l.append(AttributeError("A value was provided for the field '%s' but it is marked as internal"%wint))
139
-        #Datas check
123
+            #here we can check if the field is unknown or rejected because it is internal
124
+            err_l.append(AttributeError("Unknown or unauthorized field '%s'"%u_f))
125
+        #searching missings fields
126
+        missings = mandatory - provided
127
+        for miss_field in missings:
128
+            err_l.append(AttributeError("The data for field '%s' is missing"%miss_field))
129
+        #Checks datas
140 130
         checked_datas = dict()
141
-        for name, value in [ (name, value) for name, value in datas.items() if name in (excepted | internal) ]:
131
+        for name, value in [ (name, value) for name, value in datas.items() if name in correct ]:
142 132
             checked_datas[name], err = cls.fieldtypes()[name].check_data_value(value)
143 133
             if err:
144 134
                 err_l.append(err)

Loading…
Cancel
Save