Commit 545ecb3054a87f3503e44601df21a87b0514ee32

Authored by Alexis Koralewski
1 parent cbf8131a
Exists in dev

Add ephem to pickle seq & add pickle creation when submitting seq via api

  1 +25-04-2023 (AKo): v0.6.22.0
  2 + - Add ephem to pickle seq & add pickle creation when submitting seq via api
  3 +
  4 +06-04-2023 (AKo): v0.6.21.1
  5 + - Try to fix error when submitting seq simplified (no start_date)
  6 +
  7 +
1 04-04-2023 (AKo): v0.6.21.0 8 04-04-2023 (AKo): v0.6.21.0
2 - Improve check of ObsConfig load function and renaming functions of ObsConfig & PyrosUser 9 - Improve check of ObsConfig load function and renaming functions of ObsConfig & PyrosUser
3 - Add schema (Md file) to explain workflow when user import a sequence file 10 - Add schema (Md file) to explain workflow when user import a sequence file
src/core/pyros_django/api/views.py
@@ -23,7 +23,7 @@ from routine_manager.models import Sequence, Album, Plan @@ -23,7 +23,7 @@ from routine_manager.models import Sequence, Album, Plan
23 23
24 24
25 25
26 -from routine_manager.functions import check_sequence_file_validity_and_save 26 +from routine_manager.functions import check_sequence_file_validity_and_save, create_sequence_pickle
27 from src.pyros_logger import log 27 from src.pyros_logger import log
28 import yaml 28 import yaml
29 # Create your views here. 29 # Create your views here.
@@ -63,7 +63,7 @@ class UserViewSet(viewsets.ModelViewSet): @@ -63,7 +63,7 @@ class UserViewSet(viewsets.ModelViewSet):
63 if user_role in ("Unit-PI", "Admin"): 63 if user_role in ("Unit-PI", "Admin"):
64 queryset = PyrosUser.objects.all().order_by("-created") 64 queryset = PyrosUser.objects.all().order_by("-created")
65 else: 65 else:
66 - sp_of_current_user = user.get_scientific_program() 66 + sp_of_current_user = user.get_scientific_programs()
67 pyros_users_with_roles = [] 67 pyros_users_with_roles = []
68 for sp in sp_of_current_user: 68 for sp in sp_of_current_user:
69 for sp_period in sp.SP_Periods.all(): 69 for sp_period in sp.SP_Periods.all():
@@ -101,7 +101,7 @@ class SequenceViewSet(viewsets.ModelViewSet): @@ -101,7 +101,7 @@ class SequenceViewSet(viewsets.ModelViewSet):
101 if user_role in ("Unit-PI", "Admin"): 101 if user_role in ("Unit-PI", "Admin"):
102 return Sequence.objects.all().order_by("-updated") 102 return Sequence.objects.all().order_by("-updated")
103 else: 103 else:
104 - sp_of_user = user.get_scientific_program() 104 + sp_of_user = user.get_scientific_programs()
105 return Sequence.objects.filter(scientific_program__in=sp_of_user).order_by("-updated") 105 return Sequence.objects.filter(scientific_program__in=sp_of_user).order_by("-updated")
106 #return Sequence.objects.filter(pyros_user=user).order_by("-updated") 106 #return Sequence.objects.filter(pyros_user=user).order_by("-updated")
107 107
@@ -126,7 +126,7 @@ class ScientificProgramViewSet(viewsets.ModelViewSet): @@ -126,7 +126,7 @@ class ScientificProgramViewSet(viewsets.ModelViewSet):
126 if user_role in ("Unit-PI", "Admin"): 126 if user_role in ("Unit-PI", "Admin"):
127 return ScientificProgram.objects.all().order_by("-updated") 127 return ScientificProgram.objects.all().order_by("-updated")
128 else: 128 else:
129 - return user.get_scientific_program().order_by("-updated") 129 + return user.get_scientific_programs().order_by("-updated")
130 130
131 131
132 class SPPeriodViewSet(viewsets.ModelViewSet): 132 class SPPeriodViewSet(viewsets.ModelViewSet):
@@ -150,7 +150,7 @@ class SPPeriodViewSet(viewsets.ModelViewSet): @@ -150,7 +150,7 @@ class SPPeriodViewSet(viewsets.ModelViewSet):
150 if user_role in ("Unit-PI", "Admin"): 150 if user_role in ("Unit-PI", "Admin"):
151 return SP_Period.objects.all().order_by("-scientific_program") 151 return SP_Period.objects.all().order_by("-scientific_program")
152 else: 152 else:
153 - user_scientific_programs = user.get_scientific_program() 153 + user_scientific_programs = user.get_scientific_programs()
154 return SP_Period.objects.filter(scientific_program__in=user_scientific_programs).order_by("-scientific_program") 154 return SP_Period.objects.filter(scientific_program__in=user_scientific_programs).order_by("-scientific_program")
155 155
156 156
@@ -264,6 +264,7 @@ def submit_sequence_file(request): @@ -264,6 +264,7 @@ def submit_sequence_file(request):
264 response = check_sequence_file_validity_and_save(yaml_content, request) 264 response = check_sequence_file_validity_and_save(yaml_content, request)
265 if response.get("succeed") == True: 265 if response.get("succeed") == True:
266 seq = Sequence.objects.get(id=response.get("sequence_id")) 266 seq = Sequence.objects.get(id=response.get("sequence_id"))
  267 + create_sequence_pickle(seq)
267 log.info( 268 log.info(
268 f"User {request.user} did action submit sequence {seq} for period {seq.period} ") 269 f"User {request.user} did action submit sequence {seq} for period {seq.period} ")
269 return Response(response) 270 return Response(response)
src/core/pyros_django/routine_manager/functions.py
@@ -12,6 +12,9 @@ from django.db import IntegrityError @@ -12,6 +12,9 @@ from django.db import IntegrityError
12 # Project imports 12 # Project imports
13 from src.core.pyros_django.obsconfig.obsconfig_class import OBSConfig 13 from src.core.pyros_django.obsconfig.obsconfig_class import OBSConfig
14 from django.http import HttpRequest 14 from django.http import HttpRequest
  15 +from config.pyros.config_pyros import ConfigPyros
  16 +# guitastro import
  17 +import vendor.guitastro.src.guitastro as guitastro
15 #from silk.profiling.profiler import silk_profile 18 #from silk.profiling.profiler import silk_profile
16 19
17 #@silk_profile(name="check_sequence_file") 20 #@silk_profile(name="check_sequence_file")
@@ -158,6 +161,11 @@ def check_sequence_file_validity_and_save(yaml_content: dict, request: HttpReque @@ -158,6 +161,11 @@ def check_sequence_file_validity_and_save(yaml_content: dict, request: HttpReque
158 if Period.objects.next_period() != None and Period.objects.next_period().start_date < seq.start_date.date(): 161 if Period.objects.next_period() != None and Period.objects.next_period().start_date < seq.start_date.date():
159 period = Period.objects.next_period() 162 period = Period.objects.next_period()
160 seq.period = period 163 seq.period = period
  164 + fn = guitastro.FileNames()
  165 + home = config.getHome()
  166 + guitastro_home = guitastro.Home(home)
  167 + fn.longitude = guitastro_home.longitude
  168 + seq.night_id = fn.get_night(seq.start_date.isoformat()[:19])
161 try: 169 try:
162 seq.save() 170 seq.save()
163 except IntegrityError as e: 171 except IntegrityError as e:
@@ -331,6 +339,7 @@ def process_sequence(yaml_content, seq, config, is_simplified, result, user_sp): @@ -331,6 +339,7 @@ def process_sequence(yaml_content, seq, config, is_simplified, result, user_sp):
331 # pour lisibilité, simplicité et éviter redondance 339 # pour lisibilité, simplicité et éviter redondance
332 yaml_field = yaml_content["sequence"][field] 340 yaml_field = yaml_content["sequence"][field]
333 value = yaml_field if is_simplified else yaml_field["value"] 341 value = yaml_field if is_simplified else yaml_field["value"]
  342 +
334 ''' (orig) 343 ''' (orig)
335 if is_simplified: 344 if is_simplified:
336 value = yaml_content["sequence"][field] 345 value = yaml_content["sequence"][field]
@@ -414,15 +423,47 @@ def create_sequence_pickle(sequence): @@ -414,15 +423,47 @@ def create_sequence_pickle(sequence):
414 for plan in album.plans.all(): 423 for plan in album.plans.all():
415 fullseq_dict["albums"][f"{album.name}"]["plans"].append(model_to_dict(instance=plan)) 424 fullseq_dict["albums"][f"{album.name}"]["plans"].append(model_to_dict(instance=plan))
416 period = sequence.period 425 period = sequence.period
417 - root_project_path = os.environ.get("PROJECT_ROOT_PATH")  
418 - data_path = root_project_path + "/data/"  
419 - if not os.path.exists(data_path + "sequences_pickle"):  
420 - os.mkdir(data_path +"sequences_pickle")  
421 - if not os.path.exists(data_path + f"sequences_pickle/P{period.id}"):  
422 - os.mkdir(data_path + f"sequences_pickle/P{period.id}")  
423 - if not os.path.exists(data_path +f"sequences_pickle/P{period.id}/{sequence.night_id}"):  
424 - os.mkdir(data_path +f"sequences_pickle/P{period.id}/{sequence.night_id}")  
425 - seq_pickle_file_name = data_path +f"./sequences_pickle/P{period.id}/{sequence.night_id}/{sequence.id}.p" 426 + # Old folder & file creation
  427 + # root_project_path = os.environ.get("PROJECT_ROOT_PATH")
  428 + # data_path = root_project_path + "/data/"
  429 + # if not os.path.exists(data_path + "sequences_pickle"):
  430 + # os.mkdir(data_path +"sequences_pickle")
  431 + # if not os.path.exists(data_path + f"sequences_pickle/P{period.id}"):
  432 + # os.mkdir(data_path + f"sequences_pickle/P{period.id}")
  433 + # if not os.path.exists(data_path +f"sequences_pickle/P{period.id}/{sequence.night_id}"):
  434 + # os.mkdir(data_path +f"sequences_pickle/P{period.id}/{sequence.night_id}")
  435 + # seq_pickle_file_name = data_path +f"./sequences_pickle/P{period.id}/{sequence.night_id}/{sequence.id}.p"
426 # get guitastro ephemeris 436 # get guitastro ephemeris
427 - #fullseq_dict["ephem"] = fn.ephem(sequence.target)  
428 - pickle.dump(fullseq_dict,open(seq_pickle_file_name,"wb"))  
429 \ No newline at end of file 437 \ No newline at end of file
  438 + unit_name = os.environ["unit_name"]
  439 + config = OBSConfig(os.environ["PATH_TO_OBSCONF_FILE"], unit_name)
  440 + pyros_config = ConfigPyros(os.environ["pyros_config_file"])
  441 + pyros_config.fn.fcontext = "pyros_seq"
  442 + home = guitastro.Home(config.getHome())
  443 + pyros_config.fn.longitude(home.longitude)
  444 + if len(str(period.id)) < 3:
  445 + period_id = str(period.id)
  446 + while len(period_id) < 3:
  447 + period_id = "0" + period_id
  448 + fn_param = {
  449 + "period" : f"P{period_id}",
  450 + "version": "1",
  451 + "unit": config.unit_name,
  452 + "date": sequence.night_id,
  453 + "id_seq": sequence.id
  454 + }
  455 + fname = pyros_config.fn.naming_set(fn_param)
  456 + pyros_config.fn.update_subdir_fname_from_filename(fname)
  457 + fpath_name = pyros_config.fn.join()
  458 + # create dirs if they don't exist
  459 + os.makedirs(os.path.dirname(fpath_name), exist_ok=True)
  460 + eph = guitastro.Ephemeris()
  461 + eph.set_home(config.getHome())
  462 + # duskelev a parametrer dans obsconfig (yml)
  463 + duskelev = -7
  464 + try:
  465 + # TODO remplacer les none par les fichiers pickle de ephem_sun & ephem_moon
  466 + fullseq_dict["ephem"] = eph.target2night(fullseq_dict["sequence"]["config_attributes"]["target"], sequence.night_id, None, None, preferance=sequence.start_expo_pref, duskelev=duskelev)
  467 + except:
  468 + # target incorrecte
  469 + pass
  470 + pickle.dump(fullseq_dict,open(fpath_name,"wb"))
430 \ No newline at end of file 471 \ No newline at end of file