1
+ from server .requests_to_models .request import Request , GetRequest
2
+
1
3
import string
2
4
import copy
3
5
import re
@@ -17,37 +19,39 @@ def __init__(self, config):
17
19
def parse (self , request : dict ):
18
20
for key in request .keys ():
19
21
request [key ] = str (request [key ])
22
+ self .validate_key (key )
23
+
20
24
if key in self .COMMA_SEPARATED_KEYS :
21
- request [key ] = self ._comma_separated_field_to_list (request [key ])
22
- self ._validate_key_value (key , request [key ])
25
+ request [key ] = self .comma_separated_field_to_list (request [key ])
23
26
24
- return self ._parse_dict ( request )
27
+ self .validate_value ( key , request [ key ] )
25
28
26
- def _validate_key_value (self , key , value ):
27
- self ._validate_key (key )
29
+ return self .parse_dict (request )
30
+
31
+ def validate_value (self , key : str , value ):
32
+ if type (value ) not in [str , int , list ]:
33
+ raise ValidationError ('Value type should be string, integer or list' )
28
34
29
- if len (key ) > self .MAXIMUM_KEY_LENGTH :
30
- raise ValidationError (
31
- 'Some key is too big. Maximum allowed length is {}' .format (self .MAXIMUM_KEY_LENGTH ))
32
35
if len (value ) > self .MAXIMUM_VALUE_LENGTH :
33
36
raise ValidationError (
34
37
'Some value is too big. Maximum allowed length is {}' .format (self .MAXIMUM_VALUE_LENGTH ))
35
38
36
39
# validate list types
37
40
if type (value ) is list :
38
41
for value_item in value :
39
- self ._validate_key_value (key , value_item )
42
+ self .validate_value (key , value_item )
40
43
return
41
44
42
45
if key in {'model' , 'method' , 'fields' , 'order_by' }:
46
+ self ._validate_value_type (key , value , str )
43
47
self ._validate_value_regex (key , value , r'^[a-zA-Z][a-zA-Z0-9_]+$' )
44
48
elif key in {'filter' }:
49
+ self ._validate_value_type (key , value , str )
45
50
self ._validate_value_regex (key , value , r'^[a-zA-Z0-9_]+$' )
46
- pass
47
51
elif key in {'limit' , 'offset' }:
48
- if type ( value ) is not int :
49
- raise ValidationError ( "Value of key '{}' should be int" . format ( key ))
50
- pass
52
+ self . _validate_value_type ( key , value , int )
53
+ if value < 0 :
54
+ raise ValidationError ( 'Value of key "{}" should be positive' . format ( key ))
51
55
else :
52
56
# It means I forget to add validation of field
53
57
raise ValidationError ('Server Error' )
@@ -56,62 +60,73 @@ def _validate_value_regex(self, key, value, pattern):
56
60
if not re .match (pattern , value ):
57
61
raise ValidationError ("Value of key '{}' doesn't match to pattern {}" .format (key , pattern ))
58
62
59
- def _validate_key (self , key ):
63
+ def _validate_value_type (self , key , value , type ):
64
+ if type (value ) is not type :
65
+ raise ValidationError ('Value of key "{}" should be {}' .format (key , type ))
66
+
67
+ def validate_key (self , key : str ):
60
68
if type (key ) is not str :
61
69
raise ValidationError ("Key {} is not string" .format (key ))
70
+ if len (key ) > self .MAXIMUM_KEY_LENGTH :
71
+ raise ValidationError (
72
+ 'Some key is too big. Maximum allowed length is {}' .format (key , self .MAXIMUM_KEY_LENGTH ))
62
73
if not re .match (r'^[a-zA-Z][a-zA-Z0-9_]+$' , key ):
63
- raise ValidationError (" Key '{}' doesn't match to pattern ^[a-zA-Z][a-zA-Z0-9_]+$" .format (key ))
74
+ raise ValidationError (' Key "{}" doesn\ ' t match to pattern ^[a-zA-Z][a-zA-Z0-9_]+$' .format (key ))
64
75
if key not in self .ALLOWED_KEYS :
65
- raise ValidationError (" Key '{}' isn't allowed" .format (key ))
76
+ raise ValidationError (' Key "{}" isn\ ' t allowed' .format (key ))
66
77
67
- def _comma_separated_field_to_list (self , string_field ):
78
+ def comma_separated_field_to_list (self , string_field ):
68
79
result = []
69
80
for val in string_field .split (',' ):
70
81
val = val .strip ()
71
82
if val :
72
83
result .append (val )
73
84
return result
74
85
75
- def _parse_dict (self , req_dict ):
76
- self .result_request = {}
86
+ def parse_dict (self , req_dict ):
77
87
if 'model' not in req_dict :
78
- raise ParseError (" You should specify ' model'" )
88
+ raise ParseError (' You should specify " model"' )
79
89
80
90
if req_dict ['model' ] not in self .config :
81
91
raise ParseError ("Model doesn't exist or isn't allowed" )
82
92
83
93
config = self .config [req_dict ['model' ]]
84
94
85
- self . result_request [ 'ClassName' ] = config ['modelClass' ]
95
+ result_request = Request ( config ['modelClass' ])
86
96
87
97
if 'method' not in req_dict :
88
- raise ParseError ("You should specify 'method'" )
98
+ raise ParseError ('You should specify "method"' )
99
+
100
+ method = req_dict ['method' ]
89
101
90
- if req_dict [ ' method' ] not in config ['methods' ]:
102
+ if method not in config ['methods' ]:
91
103
raise ParseError ("Method doesn't exist or isn't allowed" )
92
104
93
- self . result_request [ 'method' ] = req_dict [ 'method' ]
105
+ config = config [ 'methods' ][ method ]
94
106
95
- config = config ['methods' ][req_dict ['method' ]]
96
107
return {
97
108
'get' : self ._get ,
98
- }[req_dict ['method' ]](req_dict , config )
109
+ }[method ](req_dict , config , result_request )
110
+
111
+ def _get (self , req_dict , config , result_request ):
112
+ fields = []
99
113
100
- def _get (self , req_dict , config ):
101
114
if 'fields' not in req_dict :
102
- req_dict ['fields' ] = ["*" ]
103
- self .result_request ['fields' ] = copy .copy (config ['fields' ])
115
+ fields = copy .copy (config ['fields' ])
104
116
else :
105
- self .result_request ['fields' ] = []
106
-
107
117
for field in req_dict ['fields' ]:
108
118
if field not in config ['fields' ]:
109
- raise ParseError ("Field '{}' doesn't exist or isn't allowed" .format (field ))
110
- self .result_request ['fields' ].append (field )
119
+ raise ParseError ("Field \" {}\" doesn't exist or isn't allowed" .format (field ))
120
+
121
+ fields .append (field )
122
+
123
+ result_request = GetRequest .from_request (result_request )
124
+ result_request .fields = fields
111
125
112
- return self . result_request
126
+ return result_request
113
127
114
128
def _validate_config (self ):
129
+ # TODO: check fields for existence and so on
115
130
if False :
116
131
raise ConfigFormatError ()
117
132
0 commit comments