Commit 1e252185f5758186bf6e05ab66364f5e5f22c58a
1 parent
259a04cb
Exists in
dev
petites optimisations et clarifications du code et commentaires
Showing
1 changed file
with
114 additions
and
34 deletions
Show diff stats
src/core/pyros_django/routine_manager/functions.py
... | ... | @@ -13,42 +13,91 @@ from src.core.pyros_django.obsconfig.obsconfig_class import OBSConfig |
13 | 13 | |
14 | 14 | |
15 | 15 | def check_sequence_file_validity_and_save(yaml_content,request): |
16 | + ''' Create a sequence in DB from the uploaded sequence (yaml_content) ''' | |
17 | + | |
16 | 18 | is_simplified = yaml_content.get("simplified", False) |
19 | + # renommer : user_sp | |
17 | 20 | sp_of_user = request.user.get_scientific_program() |
18 | 21 | sp_list = ScientificProgram.objects.observable_programs().filter(id__in=sp_of_user) |
22 | + | |
23 | + # Create a sequence seq object (from yaml_content) to be saved in DB | |
19 | 24 | seq = Sequence.objects.create() |
20 | 25 | seq.pyros_user = PyrosUser.objects.get(id=request.user.id) |
26 | + | |
27 | + # Get the unit config | |
21 | 28 | unit_name = os.environ["unit_name"] |
22 | 29 | config = OBSConfig(os.environ["PATH_TO_OBSCONF_FILE"], unit_name) |
30 | + | |
31 | + # Create a Sequence form | |
23 | 32 | sequence_form = SequenceForm(instance=seq, data_from_config=config.getEditableAttributesOfMount(config.unit_name), layouts = config.get_layouts(config.unit_name), sp_list=sp_list) |
24 | 33 | result = { |
25 | 34 | "succeed": True, |
26 | 35 | "errors": [], |
27 | 36 | } |
37 | + | |
28 | 38 | if is_simplified: |
29 | 39 | seq.scientific_program = sp_list[yaml_content["sequence"]["scientific_program"]] |
40 | + | |
30 | 41 | else: |
31 | - index_value_sp = yaml_content["sequence"]["scientific_program"]["value"] | |
32 | - values = yaml_content["sequence"]["scientific_program"]["values"] | |
33 | - if index_value_sp < 0 or index_value_sp > len(yaml_content["sequence"]["scientific_program"]["values"]): | |
34 | - result["errors"].append(f"Value of scientific program isn't valid, index out of bounds ({index_value_sp} > {len(values)})") | |
42 | + # pour la lisibilité du code (et éviter la redondance) | |
43 | + yaml_seq_sp = yaml_content["sequence"]["scientific_program"] | |
44 | + index_value_sp = yaml_seq_sp["value"] | |
45 | + values = yaml_seq_sp["values"] | |
46 | + if index_value_sp < 0 or index_value_sp > len(values): | |
47 | + result["errors"].append(f"SP value isn't valid, index out of bounds ({index_value_sp} > {len(values)})") | |
35 | 48 | index_value_sp = 0 |
36 | - chosen_sp = ScientificProgram.objects.get(name=yaml_content["sequence"]["scientific_program"]["values"][index_value_sp]) | |
49 | + chosen_sp = ScientificProgram.objects.get(name=values[index_value_sp]) | |
37 | 50 | if chosen_sp in sp_list: |
38 | - seq.scientific_program = ScientificProgram.objects.get(name=yaml_content["sequence"]["scientific_program"]["values"][index_value_sp]) | |
51 | + #seq.scientific_program = ScientificProgram.objects.get(name=yaml_content["sequence"]["scientific_program"]["values"][index_value_sp]) | |
52 | + seq.scientific_program = chosen_sp | |
39 | 53 | else: |
40 | - result["errors"].append(f"Scientific program {chosen_sp.name} is not assigned to that user ") | |
54 | + result["errors"].append(f"SP {chosen_sp.name} is not assigned to that user ") | |
55 | + | |
41 | 56 | seq.config_attributes = {} |
57 | + | |
58 | + # Fill all Sequence form fields | |
59 | + # keys() inutile ? => for field in sequence_form.fields : | |
60 | + # Sinon, y a aussi => for key,val in sequence_form.fields.items(): | |
61 | + # => Ca éviterait de faire => sequence_form.fields[field] pour recuperer "val" | |
42 | 62 | for field in sequence_form.fields.keys(): |
43 | - if sequence_form.fields[field].required == False or field == "scientific_program": | |
63 | + | |
64 | + #if sequence_form.fields[field].required == False or field == "scientific_program": | |
65 | + if not sequence_form.fields[field].required or field=="scientific_program": | |
44 | 66 | continue |
67 | + # pour lisibilité, simplicité et éviter redondance | |
68 | + yaml_field = yaml_content["sequence"][field] | |
69 | + value = yaml_field if is_simplified else yaml_field["value"] | |
70 | + ''' (orig) | |
45 | 71 | if is_simplified: |
46 | - value = yaml_content["sequence"][field] | |
72 | + value = yaml_content["sequence"][field] | |
47 | 73 | else: |
48 | 74 | value = yaml_content["sequence"][field]["value"] |
75 | + ''' | |
49 | 76 | if field not in yaml_content["sequence"]: |
50 | 77 | result["errors"].append(f"{field} not in yaml file") |
51 | 78 | else: |
79 | + if is_simplified: | |
80 | + if sequence_form.fields[field].__dict__.get("_choices"): | |
81 | + # y a pas conflit ici avec la variable "value" définie au-dessus ? | |
82 | + values = [value[0] for value in sequence_form.fields[field].__dict__.get("_choices")] | |
83 | + value = values[value] | |
84 | + else: | |
85 | + if yaml_field.get("values"): | |
86 | + index_value = yaml_field["value"] | |
87 | + values = yaml_field["values"] | |
88 | + if index_value < 0 or index_value > len(yaml_field["values"]): | |
89 | + result["errors"].append(f"Value of {field} isn't valid, index out of bounds ({index_value} > {len(values)})") | |
90 | + index_value = 0 | |
91 | + value = yaml_field["values"][index_value] | |
92 | + else: | |
93 | + if field == "start_date": | |
94 | + if type(value) != datetime.datetime: | |
95 | + #value = datetime.datetime.strptime(yaml_content["sequence"][field]["value"],'%d/%m/%Y %H:%M:%S') | |
96 | + # ISO format | |
97 | + value = datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%f') | |
98 | + seq.__dict__[field] = value | |
99 | + ''' (orig) | |
100 | + else: | |
52 | 101 | if not is_simplified: |
53 | 102 | if yaml_content["sequence"][field].get("values"): |
54 | 103 | index_value = yaml_content["sequence"][field]["value"] |
... | ... | @@ -68,27 +117,38 @@ def check_sequence_file_validity_and_save(yaml_content,request): |
68 | 117 | if sequence_form.fields[field].__dict__.get("_choices"): |
69 | 118 | values = [value[0] for value in sequence_form.fields[field].__dict__.get("_choices")] |
70 | 119 | value = values[value] |
120 | + ''' | |
121 | + | |
122 | + # suffisant ? => if field in seq.__dict__ | |
71 | 123 | if field in seq.__dict__.keys(): |
72 | 124 | seq.__dict__[field] = value |
73 | 125 | else: |
74 | 126 | seq.config_attributes[field] = value |
75 | 127 | |
128 | + # Create ALBUMS | |
76 | 129 | albums_from_file = yaml_content["sequence"]["ALBUMS"] |
77 | 130 | chosen_layout = seq.config_attributes["layout"] |
78 | 131 | if type(chosen_layout) == int: |
79 | 132 | layouts = config.get_layouts(config.unit_name)["layouts"] |
80 | 133 | chosen_layout = list(layouts.keys())[chosen_layout] |
134 | + # renommer : layout_albums | |
81 | 135 | albums_of_layout = config.getLayoutByName(unit_name=config.unit_name,name_of_layout=chosen_layout)["ALBUMS"] |
136 | + | |
82 | 137 | if len(albums_of_layout) == len(albums_from_file): |
83 | 138 | for album in albums_from_file: |
84 | 139 | album = album["Album"] |
85 | 140 | if album["name"] not in albums_of_layout: |
86 | 141 | result["errors"].append(f"Album {album['name']} is not the chosen layout") |
87 | 142 | else: |
143 | + # alb n'est pas utilisé | |
88 | 144 | alb = Album.objects.create(name=album["name"], sequence=seq, complete=True) |
89 | 145 | else: |
90 | 146 | result["errors"].append(f"The number of albums doesn't correspond to the chosen layout") |
91 | - for album in yaml_content["sequence"]["ALBUMS"]: | |
147 | + | |
148 | + # Tu itères 2 fois sur albums_from_file, y aurait pas moyen d'iterer 1 seule fois dessus ? | |
149 | + #for album in yaml_content["sequence"]["ALBUMS"]: | |
150 | + for album in albums_from_file: | |
151 | + | |
92 | 152 | album = album["Album"] |
93 | 153 | plans = album.get("Plans") |
94 | 154 | if plans == None: |
... | ... | @@ -101,42 +161,63 @@ def check_sequence_file_validity_and_save(yaml_content,request): |
101 | 161 | config_attributes = {} |
102 | 162 | plan_form = PlanForm(data_from_config=config.getEditableAttributesOfChannel(config.unit_name,list(config.get_channels(config.unit_name).keys())[0]),edited_plan=None) |
103 | 163 | for field in plan_form.fields: |
164 | + plan_field = plan[field] | |
165 | + ''' | |
104 | 166 | min_value = None |
105 | 167 | max_value = None |
106 | 168 | value_type = None |
169 | + ''' | |
170 | + min_value = max_value = value_type = None | |
107 | 171 | if field not in plan.keys(): |
108 | 172 | result["errors"].append(f"Missing field : '{field}' for plan {plans.index(plan)}") |
109 | 173 | else: |
110 | 174 | # TODO : ajouter max_value, min_value, suppression plan et album si invalides |
111 | 175 | if not is_simplified: |
112 | - if plan[field].get("value_type"): | |
113 | - value_type = plan[field]["value_type"] | |
114 | - if type(plan[field]["value"]) == str and ast.literal_eval(plan[field]["value"]) != value_type: | |
176 | + if plan_field.get("value_type"): | |
177 | + value_type = plan_field["value_type"] | |
178 | + if type(plan_field["value"]) == str and ast.literal_eval(plan_field["value"]) != value_type: | |
115 | 179 | result["errors"].append(f"Field {field} value doesn't correspond to the assigned type (type required : {value_type})") |
116 | - if plan[field].get("min_value"): | |
117 | - if type(plan[field]["min_value"]) == str: | |
118 | - min_value = ast.literal_eval(plan[field]["min_value"]) | |
180 | + if plan_field.get("min_value"): | |
181 | + min_value = plan_field["min_value"] | |
182 | + if type(min_value) == str: | |
183 | + min_value = ast.literal_eval(min_value) | |
184 | + ''' | |
185 | + if type(plan_field["min_value"]) == str: | |
186 | + min_value = ast.literal_eval(plan_field["min_value"]) | |
119 | 187 | else: |
120 | - min_value = plan[field]["min_value"] | |
121 | - if plan[field].get("max_value"): | |
122 | - if type(plan[field].get("max_value")) == str: | |
123 | - max_value = ast.literal_eval(plan[field]["max_value"]) | |
188 | + min_value = plan_field["min_value"] | |
189 | + ''' | |
190 | + if plan_field.get("max_value"): | |
191 | + max_value = plan_field["max_value"] | |
192 | + if type(max_value) == str: | |
193 | + max_value = ast.literal_eval(max_value) | |
194 | + ''' | |
195 | + if type(plan_field.get("max_value")) == str: | |
196 | + max_value = ast.literal_eval(plan_field["max_value"]) | |
124 | 197 | else: |
125 | - max_value = plan[field]["max_value"] | |
198 | + max_value = plan_field["max_value"] | |
199 | + ''' | |
126 | 200 | if field == "nb_images": |
201 | + new_plan_object.__dict__[field] = plan_field if is_simplified else plan_field["value"] | |
202 | + ''' | |
127 | 203 | if is_simplified: |
128 | - new_plan_object.__dict__[field] = plan[field] | |
204 | + new_plan_object.__dict__[field] = plan_field | |
129 | 205 | else: |
130 | - new_plan_object.__dict__[field] = plan[field]["value"] | |
206 | + new_plan_object.__dict__[field] = plan_field["value"] | |
207 | + ''' | |
131 | 208 | else: |
132 | - if not is_simplified: | |
133 | - if plan[field].get("values"): | |
134 | - index_value = plan[field]["value"] | |
135 | - values = plan[field]["values"] | |
136 | - if index_value < 0 or index_value > len(plan[field]["values"]): | |
209 | + # shortcut possible ? | |
210 | + #new_plan_object_field = new_plan_object.config_attributes[field] | |
211 | + if is_simplified: | |
212 | + new_plan_object.config_attributes[field] = plan_field | |
213 | + else: | |
214 | + if plan_field.get("values"): | |
215 | + index_value = plan_field["value"] | |
216 | + values = plan_field["values"] | |
217 | + if index_value < 0 or index_value > len(plan_field["values"]): | |
137 | 218 | result["errors"].append(f"Value of Plan field '{field}' isn't valid, index out of bounds ({index_value} > {len(values)})") |
138 | 219 | index_value = 0 |
139 | - value = plan[field]["values"][index_value] | |
220 | + value = plan_field["values"][index_value] | |
140 | 221 | try: |
141 | 222 | # linked values |
142 | 223 | splitted_values = value.split(";") |
... | ... | @@ -150,13 +231,12 @@ def check_sequence_file_validity_and_save(yaml_content,request): |
150 | 231 | new_plan_object.config_attributes[field] = config_attributes[field] |
151 | 232 | else: |
152 | 233 | if max_value and min_value: |
153 | - if plan[field]["value"] > max_value: | |
234 | + if plan_field["value"] > max_value: | |
154 | 235 | result["errors"].append(f"Plan field {field} doesn't respect max value") |
155 | - if plan[field]["value"] < min_value: | |
236 | + if plan_field["value"] < min_value: | |
156 | 237 | result["errors"].append(f"Plan field {field} doesn't respect min value") |
157 | - new_plan_object.config_attributes[field] = plan[field]["value"] | |
158 | - else: | |
159 | - new_plan_object.config_attributes[field] = plan[field] | |
238 | + new_plan_object.config_attributes[field] = plan_field["value"] | |
239 | + | |
160 | 240 | new_plan_object.save() |
161 | 241 | |
162 | 242 | ... | ... |