Commit 1e252185f5758186bf6e05ab66364f5e5f22c58a

Authored by Etienne Pallier
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  
... ...