Source code for api_traitement.common_functions

# -*- coding: utf-8 -*-
""" 

Module de fonctions communes et générales à l'application indépendamment de la pêcherie. 

"""
import json
import datetime
import re
import openpyxl
import pandas as pd
import numpy as np
from api_traitement.ps_build_json_fonctions import *

[docs] def load_json_file(file_path): """ Fonction qui charge un fichier json enregistré dans un dossier donné en argument et le renvoie Args: file_path Returns: dict: fichier json en format dictionnaire """ try: with open(file_path, 'r', encoding='utf-8') as file: data = json.load(file) return data except FileNotFoundError: print(f"File '{file_path}' not found.") return None except json.JSONDecodeError as e: print(f"Error decoding JSON file '{file_path}': {e}") return None
[docs] def serialize(obj): """ Serialize obj dans un format json de type date, int ou str. """ if isinstance(obj, datetime.datetime): return obj.isoformat() if isinstance(obj, np.int64) or isinstance(obj, np.int32): return int(obj) return str(obj)
# raise TypeError("Type not serializable")
[docs] def pretty_print(json_data, file="media/temporary_files/created_json_file.json", mode="a"): """ Fonction qui affiche le fichier json avec les bonnes indentations un fichier json Args: json_data (json): Données json en entrée file (str, optional): Nom de fichier json de sortie "created_json_file.json". mode (str, optional): Defaults to "a" pour "append" - "w" pour "write" """ json_formatted_str = json.dumps( json_data, indent=2, default=serialize) with open(file, mode) as outfile: outfile.write(json_formatted_str)
[docs] def del_empty_col(dataframe): """ Fonction qui supprime la colonne si elle ne contient pas d'information Args: dataframe: avec des potentielles colonnes vides (cellules mergées) Returns: dataframe: uniquement avec des éléments """ colonnes_a_supprimer = [ colonne for colonne in dataframe.columns if all(dataframe[colonne].isna())] dataframe.drop(columns=colonnes_a_supprimer, inplace=True) return dataframe
[docs] def strip_if_string(element): """ Fonction qui applique la fonction python strip() si l'élement est bien de type texte """ return element.strip() if isinstance(element, str) else element
[docs] def remove_spec_char_from_list(char_list): """ Fonction qui applique remove_spec_char à chaque élément d'une liste de chaînes """ return [re.sub("[^A-Z a-z0-9]", "", str(item), 0, re.IGNORECASE) for item in char_list]
[docs] def convert_to_int(value): """ Vérifie si la valeur est numérique ou peut être transformée en numérique (integer). Args: value: L'élément à vérifier. Returns: bool: la valeur si elle est de type numérique et un message sinon. """ if isinstance(value, (int, float)): return int(value) if isinstance(value, str): if value.isdigit(): return int(value) try: int(value) return int(value) except ValueError: return value return value
[docs] def convert_to_time_or_text(value): """ Fonction qui converti la cellule en time si elle est au format type time ou date dans le excel et qui laisse au format texte (cruising, in port etc) si la cellule est au format texte """ if isinstance(value, str): if re.findall(r"[0-9]{4}", value): time_value = value[:2]+ ":"+ value[2:]+":00" return datetime.datetime.strptime(time_value, '%H:%M:%S').time().strftime('%H:%M:%S') if re.match("[0-9]{2}:[0-9]{2}:[0-9]{2}", value): return datetime.datetime.strptime(value, '%H:%M:%S').time().strftime('%H:%M:%S') elif re.match("[0-9]{2}:[0-9]{2}", value.strip()): return value.strip() + ':00' elif re.match("[0-9]{1}:[0-9]{2}", value.strip()): return '0' + value.strip() + ':00' return value elif isinstance(value, datetime.datetime): date_time = value.time() if hasattr(date_time, 'strftime'): return date_time.strftime('%H:%M:%S') return str(date_time) return str(value)
[docs] def np_removing_semicolon(numpy_table, num_col): """ Fonction qui prend une numpy table et ne retourne que la partie avant les deux point (:) de la colonne demandée """ return np.array([s.partition(':')[num_col].strip() for s in numpy_table[:, num_col]])
[docs] def dms_to_decimal(degrees, minutes, direction): """Transforme des degrés minutes secondes en décimal Args: degrees (int), minutes (int): value direction (str): N S E W Returns: float: value """ if degrees is None: return None degrees = degrees.fillna(0) minutes = minutes.fillna(0) degrees = degrees.astype(int) minutes = minutes.astype(int) decimal_degrees = degrees + minutes / 60.0 decimal_degrees = np.where(direction.isin(['S', 'W']), -decimal_degrees, decimal_degrees) return decimal_degrees
[docs] def zero_if_empty(value): """ Remplace par 0 quand la case est vide """ if value == "None" or pd.isna(value): return 0 elif isinstance(value, str) and (value == "" or re.search(r"\S*", value)): return 0 else: return int(value)
[docs] def remove_if_nul(df, column): """ Function that remove the last rows if the value is null in a specific column Args: df (dataframe) column: column you want to check """ while df[column].iloc[-1] == 0: df = df[:-1] return df
[docs] def read_excel(logbook_file_path, num_page): """ Fonction qui extrait les informations d'un fichier excel en dataframe Args: logbook_file_path: lien vers le fichier contenant le logbook num_page (int): numéro de page à extraire (1, 2 etc ...) Returns: (dataframe): du fichier excel """ classeur = openpyxl.load_workbook(filename=logbook_file_path, data_only=True) noms_feuilles = classeur.sheetnames feuille = classeur[noms_feuilles[num_page - 1]] df_donnees = pd.DataFrame(feuille.values) classeur.close() return df_donnees
[docs] def get_list_harbours(allData): """ Args: allData Returns: list: all the enabled ports (topiaId and label2) """ harbours = allData["Harbour"] sorted_list_harbours = [{'topiaId': harbour.get('topiaId'), 'label2': harbour.get('label2')} for harbour in harbours if harbour.get('status') == 'enabled'] sorted_list_harbours.sort(key=lambda x: x['label2']) return sorted_list_harbours
[docs] def from_topiaid_to_value(topiaid, lookingfor, label_output, allData, domaine=None): """ Fonction générale qui retourne le label output pour un topiad donné dans la base common ou longliner Args: topiad lookingfor: catégorie issu du WS dans laquelle on veut chercher notre topiaid label_output: ce qu'on veut présenter (label, nom, espèce ...) domaine si nécessaire (palangre, senne) Returns: nom souhaité associé au topotiad """ if lookingfor == 'VesselActivity' or lookingfor == 'Program': if domaine is None : print("Error il faut préciser un domaine") return None else : if domaine == 'palangre': domaine_en = str('longline') else: domaine_en = str('seine') for element in allData[lookingfor][domaine_en]: if element['topiaId'] == topiaid: return element[label_output] else: if allData[lookingfor] is not None: for element in allData[lookingfor]: if element['topiaId'] == topiaid: return element[label_output] else: print("please do check the orthographe of looking for element") return None
# Retourne ID d'un module en fonction des arguments donnés
[docs] def getId(allData, moduleName, argment, nbArg=False, domaine=None): """Fonction qui retourne l'ID d'un module en fonction des arguments donnés Args: allData (json): données de references moduleName (str): le module de la base de donnée argment (str): les arguments de la requete sur le module domaine (str): "seine" ou "longline" dans le cas ou nous voulons recuperer les id de VesselActivity nbArg (bool): permet de signifier le nombre d'argument dont on aura besoin pour trouver l'ID par defaut quand c'est False nous avons 1 argument en paramentre si c'est True, nous avons 2 arguments en parametre Returns: topiad (str) """ message = "" Id = "" dataKey = [k for (k, v) in allData.items()] if moduleName in dataKey: if domaine != None: tempDic = allData[moduleName][domaine] else: tempDic = allData[moduleName] if nbArg: # 2 arguments argTab = argment.split("&filters.") argments = [argTab[0].split("="), argTab[1].split("=")] for val in tempDic: if (val[argments[0][0]] == argments[0][1]) and (val[argments[1][0]] == argments[1][1]): Id = val['topiaId'] else: # 1 argument argments = argment.split("=") for val in tempDic: if val[argments[0]] == argments[1]: Id = val['topiaId'] if Id == "": # message = "Aucun topiad" Id = None else: # message = "Le module: "+ module + " n'existe pas" Id = None return Id
[docs] def search_in(allData, search="Ocean"): """Fonction permet d'avoir à partir des données de references les oceans ou les programmes Args: allData (json): données de references search (str): "Ocean" ou "Program" Returns: prog_dic (json) """ if allData == []: return {} if search == "Ocean": return { val["topiaId"] : val["label2"] for val in allData[search]} prog_dic = {} if allData == [] : return prog_dic for val in allData[search]: prog_dic[val["topiaId"]] = val["label2"] return prog_dic
[docs] def getSome(allData, moduleName, argment): """Permet de retouner un dictionnaire de donnée du module dans une liste (tableau) Args: allData (json): données de references moduleName (str): le module de la base de donnée argment (str): les arguments de la requete sur le module Returns: (list) """ tempDic = {} dico = {} dataKey = [k for (k, v) in allData.items()] if moduleName in dataKey: tempDic = allData[moduleName] # print(tempDic) argments = argment.split("=") for val in tempDic: if val[argments[0]].lower() == argments[1].lower(): dico = val return [dico]
[docs] def getAll(allData, moduleName, type_data="dictionnaire"): """Permet de retourner un dictionnaire ou un tableau Args: allData (json): données de references moduleName (str): le module de la base de donnée type_data (str): "dictionnaire" ou "tableau" Returns: tab (list) dico (dict) """ if type_data == "tableau": tab = [] for val in allData[moduleName]: tab.append((val["topiaId"], val["label1"])) return tab else: dico = {} for val in allData[moduleName]: dico[val["code"]] = val["topiaId"] return dico
# Traitement du logbook
[docs] def traiLogbook(logB): """Fonction qui permet d'extraire les informations d'un logbook SENNE dans ces variables --> info_bat : contient les informations sur le navire, le port (D/A) et heure (D/A) --> observ : contient les informations sur le capitaine et le mar_homeid --> df_data : contient les données du logbook Args: logB (str): fichier logbook à traiter Returns: info_bat (json), df_data (dataframe), observ (json), (str) """ # Chargement du fichier # wb = Workbook() try: wb = openpyxl.load_workbook(logB) except Exception as e: return '', '', '', "Error : Fichier illisible" + str(e) if "xlsm" in logB.split('.') or "XLSM" in logB.split('.'): # Recuperer le non du bateau et autres information utils # st.text(wb.get_sheet_names()) maree_log = wb["1.Marée"] # Recuperer la feuille active act_sheet = wb["2.Logbook"] else: # Recuperer le non du bateau et autres information utils maree_log = wb["Marée"] # st.text(wb.get_sheet_names()) # Recuperer la feuille active act_sheet = wb["Logbook"] info_bat = { "Navire": maree_log["F"][1].value, "Depart_Port": maree_log["F"][12].value, "Depart_Date": str(maree_log["F"][13].value).split(" ")[0], "Depart_heure": str(maree_log["F"][14].value).split(" ")[0], "Arrivee_Port": maree_log["F"][17].value, "Arrivee_Date": str(maree_log["F"][18].value).split(" ")[0], "Arrivee_Loch": maree_log["F"][20].value, } observ = { "captain": maree_log["D"][9].value, "mar_homeId": maree_log["D"][10].value, } # Variable pour recuperer les donnée dans le logbook data = [] obj = [] # Recuperation des lignes qui nous interesses à partir de la ligne 33 dans le fichier i = 1 for row in act_sheet.rows: if i >= 33: for index in range(len(row)): obj.append(row[index].value) data.append(obj) obj = [] i = i + 1 # Transformer le tableau "data" en dataFrame pour faciliter la manipulation des données data = pd.DataFrame(np.array(data)) # Titrer le tableau data = data.rename( columns={0: "date", 1: "heure", 2: "lat1", 3: "lat2", 4: "lat3", 5: "long1", 6: "long2", 7: "long3", 8: "zee", 9: "temp_mer", 10: "vent_dir", 11: "vent_vit", 12: "calee_porta", 13: "calee_nul", 14: "calee_type", 15: "cap_alb_yft_p10_tail", 16: "cap_alb_yft_p10_cap", 17: "cap_alb_yft_m10_tail", 18: "cap_alb_yft_m10_cap", 19: "cap_lst_skj_tail", 20: "cap_lst_skj_cap", 21: "cap_pat_bet_p10_tail", 22: "cap_pat_bet_p10_cap", 23: "cap_pat_bet_m10_tail", 24: "cap_pat_bet_m10_cap", 25: "cap_ger_alb_tail", 26: "cap_ger_alb_cap", 27: "cap_aut_esp_oth_esp", 28: "cap_aut_esp_oth_tail", 29: "cap_aut_esp_oth_cap", 30: "cap_rej_dsc_esp", 31: "cap_rej_dsc_tail", 32: "cap_rej_dsc_cap", 33: "asso_bc_libre", 34: "asso_objet", 35: "asso_balise", 36: "asso_baliseur", 37: "asso_requin", 38: "asso_baleine", 39: "asso_oiseaux", 40: "obj_flot_act_sur_obj", 41: "obj_flot_typ_obj", 42: "obj_flot_typ_dcp_deriv", 43: "obj_flot_risq_mail_en_surf", 44: "obj_flot_risq_mail_sou_surf", 45: "bouee_inst_act_bou", 46: "bouee_inst_bou_prst_typ", 47: "bouee_inst_bou_prst_id", 48: "bouee_inst_bou_deplo_typ", 49: "bouee_inst_bou_deplo_id", 50: "comment"}) ##### Traitement pour supprimer les lignes qui n'ont pas de donnée dans le datFrame 'data' # Suppression des lignes identiques c.a.d les doublons df_data = data.drop_duplicates(keep=False) df_data.loc[:, "date"] = df_data.date.fillna(method="ffill") # Si nous avons des ligne contenant des valeurs NaT; les ignorer et garder la bonne données if df_data.date.isnull().sum() > 0: df_data = df_data[~df_data["date"].isna()] df_data.reset_index(drop=True, inplace=True) # réinitialiser l'index à son format par défaut (c'est-à-dire un RangeIndex de 0 à la longueur du cadre de données moins 1) df_data = df_data.loc[:, :"comment"] if info_bat['Depart_Date'] == 'None': info_bat['Depart_Date'] = str(df_data['date'].iloc[0]).split(' ')[0] if info_bat['Arrivee_Date'] == 'None': info_bat['Arrivee_Date'] = str(df_data['date'].iloc[-1]).split(' ')[0] return info_bat, df_data, observ, ''
# Traitement du logbook orth v23
[docs] def traiLogbook_v23(logB): """Fonction qui permet d'extraire les informations d'un logbook SENNE dans ces variables --> info_bat : contient les informations sur le navire, le port (D/A) et heure (D/A) et contient les informations sur le capitaine et le mar_homeid --> df_data : contient les données du logbook Args: logB (str): fichier logbook à traiter Returns: info_bat (json), df_data (dataframe), (str) """ try: wb = openpyxl.load_workbook(logB) if "Synthèse marée" in wb.sheetnames: # maree_log = wb[wb.sheetnames[3]] # act_sheet = wb[wb.sheetnames[4]] maree_log = wb["Synthèse marée"] act_sheet = wb["Journal toutes activités"] else: raise ValueError("Aucune feuille compatible trouvée pour l'extraction des données") col_C = maree_log["C"] if len(col_C) > 25: info_bat = { "Navire": col_C[3].value, "Depart_Port": col_C[17].value, "Depart_Date": str(col_C[18].value).split(" ")[0], "Depart_heure": str(col_C[19].value).split(" ")[0], "Arrivee_Port": col_C[22].value, "Arrivee_Date": str(col_C[23].value).split(" ")[0], "Arrivee_Loch": col_C[25].value, "captain": str(col_C[11].value) + " " + str(col_C[12].value), "mar_homeId": str(col_C[14].value) + "" + str(col_C[15].value), } else: return None, None, "Colonne incomplète" # Variable pour recuperer les donnée dans le logbook data = [] obj = [] # Recuperation des lignes qui nous interesses à partir de la ligne 33 dans le fichier i = 1 for row in act_sheet.rows: if i >= 7: for index in range(len(row)): obj.append(row[index].value) data.append(obj) obj = [] i = i + 1 # Transformer le tableau "data" en dataFrame pour faciliter la manipulation des données data = pd.DataFrame(np.array(data)) data = data.drop(data.columns[[0, data.shape[1]-2]], axis=1) # supprimer la 1ere et derniere colonne data.columns = range(data.columns.size) # reninitialiser les colonnes à partir de 0 # Titrer le tableau data = data.rename( columns={0: "type_declaration", 1: "date", 2: "heure", 3: "lat1", 4: "lat2", 5: "lat3", 6: "long1", 7: "long2", 8: "long3", 9: "port", 10: "zee", 11: "temp_mer", 12: "vent_dir", 13: "vent_vit", 14: "calee_type", 15: "espece", 16: "categ_poids", 17: "quant_conser_tonne", 18: "quant_conser_nb", 19: "quant_reje_tonne", 20: "quant_reje_nb", 21: "obj_flot_act_sur_obj", 22: "obj_flot_typ_obj", 23: "obj_flot_typ_dcp_deriv", 24: "obj_type_composant", 25: "obj_nombre", 26: "obj_hauteur", 27: "obj_longueur", 28: "obj_largeur", 29: "obj_profondeur", 30: "obj_mailles", 31: "obj_plastique", 32: "obj_metal", 33: "obj_bio", 34: "bouee_inst_act_bou", 35: "bouee_posit_connue", 36: "bouee_nav_proprietaire", 37: "bouee_modele", 38: "bouee_numero", 39: "commentaire"}) ##### Traitement pour supprimer les lignes qui n'ont pas de donnée dans le datFrame 'data' # Suppression des lignes identiques c.a.d les doublons df_data = data.drop_duplicates(keep=False) # pd.options.mode.copy_on_write = True df_data.date = df_data.date.fillna(method="ffill") # Si nous avons des ligne contenant des valeurs NaT; les ignorer et garder la bonne données if df_data.date.isnull().sum() > 0: df_data = df_data[~df_data["date"].isna()] df_data.reset_index(drop=True, inplace=True) # réinitialiser l'index à son format par défaut (c'est-à-dire un RangeIndex de 0 à la longueur du cadre de données moins 1) df_data = df_data.loc[:, :"commentaire"] return info_bat, df_data, "" except : return None, None, "Mauvais format de logbook"
[docs] def read_data(file, type_doc="v21"): """Fonction qui permet de faire appel à la fonction de traitement du logbook Args: file (str): fichier logbook à traiter type_doc (str): logbook "v21" ou "v23" Returns: info_bat (json), data_bat (dataframe), obs (json), message (str) """ if type_doc == "v21": info_bat, data_bat, obs, message = traiLogbook(file) return info_bat, data_bat, obs, message if type_doc == "v23": info_bat, data_bat, message = traiLogbook_v23(file) # data_bat.to_csv('./ma_data.csv') # print(data_bat.columns) return info_bat, data_bat, message
[docs] def get_lat_long(allData, harbour): """Fonction qui permet de retourner les coordonnées de longitude et de latitude du port de depart ou soit d'arrivé Args: allData (json): données de references harbour (str): nom du port Returns: (float), (float) """ print(harbour) if harbour != None: harbour = str(harbour).strip() for val in allData["Harbour"]: # print("Label 2: ",val["label2"], " ==> Recherche: ", harbour) if (harbour.lower() in val["label1"].lower()) or (harbour.lower() in val["label2"].lower()) or ( harbour.lower() in val["label3"].lower()): return float(val["latitude"]), float(val["longitude"]) # return "Le port de départ << "+ harbour + " >> n'a pas été trouvé dans le service." return None, None else: # return "Le port de départ << "+ harbour + " >> n'a pas été trouvé dans le service." return None, None
[docs] def lat_long(lat1, lat2, lat3, long1, long2, long3): """Fonction qui permet de calculer la longitude et la latitude pour l'inserer facilement dans la BD Args: lat1, lat2, lat3, long1, long2, long3 (str): position geographique Returns: (float), (float), (bool) """ try: lat_1 = int(float(str(lat1).replace("°", ""))) lat_2 = int(float(str(lat2).replace("'", ""))) long_1 = int(float(str(long1).replace("°", ""))) long_2 = int(float(str(long2).replace("'", ""))) # Latitude var1 = (lat_2 / 60) var1 = str(var1) varAr1 = var1.split(".") # Longitude var2 = (long_2 / 60) var2 = str(var2) varAr2 = var2.split(".") if lat_2 >= 60: lat_ = varAr1[0] + varAr1[1][:4] add = int(lat_1) + float(lat_) res_long = str(add) else: lat_ = varAr1[1][:4] res_lat = str(lat_1) + "." + lat_ if long_2 >= 60: long_ = varAr2[0] + varAr2[1][:4] add = int(long_1) + float(long_) res_long = str(add) else: long_ = varAr2[1][:4] res_long = str(long_1) + "." + long_ # print(res_long) if (lat3 != None) and (long3 != None): if lat3.lower() == "s": res_lat = float(res_lat) * (-1) else: res_lat = float(res_lat) if long3.lower() == "w": res_long = float(res_long) * (-1) else: res_long = float(res_long) return res_lat, res_long, False else: return None, None, True except ValueError: return None, None, False
[docs] def get_wind_id_interval(allData, moduleName, windSpeed): """Fonction qui permet de retourner le topiaId de l'interval de vitesse du vent Args: allData (json): données de references moduleName (str): le module de la base de donnée windSpeed (str): vitesse du vent Returns: id (str) """ tab = [] for val in allData[moduleName]: if val['code'] == '0': pass else: try: if (int(val['minSpeed']) <= int(windSpeed) <= int(val['maxSpeed'])): return val['topiaId'] except: return None return None
[docs] def weightCategory(allData, chaine, specise): """Fonction qui permet de retourner le topiaId de la categorie d'especes trouvées Args: allData (json): données de references chaine (str): chaine contenant la categorie specise (str): type d'especes Returns: id (str) """ inconnu = [val['topiaId'] for val in allData["WeightCategory"] if 'inconnu' in val['label2'].lower()] if chaine != None: if ">" in chaine: chaine = chaine.replace(">", "plus de") elif "<" in chaine: chaine = chaine.replace("<", "moins de") elif "-" in chaine: chaine = chaine.replace("-", "à") for val in allData["WeightCategory"]: if ((specise.lower() in val['label2'].lower()) and (chaine.lower() in val['label2'].lower())): # print("Chaine: ", specise, chaine, " Id & lab: ",val['topiaId'], val['label2']) return val['topiaId'] return inconnu[0] else: return inconnu[0]
[docs] def fpaZone_id(chaine, tableau, allData): """Fonction qui permet de retourner le topiaId et un commentaire lorsqu'on ne retrouve pas la zone fpa passée en paramettre Args: allData (json): données de references tableau (list): liste de données fpa zone chaine (str): zone à rechercher Returns: id (str), '' (str) ou chaine (str) """ status = False for val in tableau: # print("FPA : ", chaine) if (chaine != None) and (chaine.lower() in val[1].lower()): return val[0], "" status = True if status: return getId(allData, "FpaZone", argment="code=XXX*"), chaine
[docs] def transmittingBType(chaine, dico): """Fonction qui permet de retourner le topiaId du type de balise et un commentaire lorsqu'on ne retrouve pas la balise passée en paramettre Args: dico (json): dictionnaire de données pour les balises chaine (str): balise à rechercher Returns: id (str), '' (str) ou commentaire (str) """ if ("m3i+" in str(chaine).lower()): return dico['26'], "" if ("m3igo" in str(chaine).lower()): return dico['29'], "" if ("m3i" in str(chaine).lower()): return dico['25'], "" if ("m4i+" in str(chaine).lower()): return dico['28'], "" if ("m4i" in str(chaine).lower()): return dico['27'], "" if ("thalos mod" in str(chaine).lower()): return dico['90'], "" if ("ortbit+" in str(chaine).lower()): return dico['92'], "" if ("orbit+" in str(chaine).lower()): return dico['92'], "" if ("ortbit" in str(chaine).lower()): return dico['91'], "" if ("orbit" in str(chaine).lower()): return dico['91'], "" if ("marine instru" in str(chaine).lower()): return dico['20'], "" if ("SLX+" in str(chaine).lower()): return dico['47'], "" if ("slx+" in str(chaine).lower()): return dico['47'], "" if ("isd+" in str(chaine).lower()): return dico['46'], "" if ("autre satl" in str(chaine).lower()): return dico['40'], "" if ("satlink mod" in str(chaine).lower()): return dico['40'], "" if ("marque et mod" in str(chaine).lower()): return dico['98'], "" if ("pas de bou" in str(chaine).lower()): return dico['999'], "" if chaine != "": # Getsome Zunibal # https://demo.ultreia.io/observe-9.1.6/doc/api/public/ # print(dico) # Si n'est pas present dans le Getsome return dico['99'], str(chaine) + ": Balise // Type à préciser" else: # auccun type de balise dans le logbook return dico['999'], "Aucun type de balise indiqué dans le logbook"
[docs] def floatingObjectPart(chaine, data, dico, index, perte_act=False): """Fonction qui permet de retourner un ou deux topiaId en fonction du type d'objet flottant Args: data (dataFrame): les données du logbook en cours d'insertion index (str): nom de la colonne du dataFrame faisant reference aux objets flottants dico (json): dictionnaire de données pour les objets flottants perte_act (bool): gestion des pertes chaine (str): objet flottant à rechercher Returns: id (str), id (str) """ # Types objets flottants if index == 'obj_flot_typ_obj': if ("dcp ancré" in str(chaine).lower()): return dico['1-2'] if (("epave artificielle liée à la pêche" in str(chaine).lower()) or ("débris artificiel issu de la pêche" in str(chaine).lower())): return dico['2-2-4'] if (("epave artificielle liée à d'autres activités humaines" in str(chaine).lower()) or ("débris artificiel non issu de la pêche" in str(chaine).lower())): return dico['2-2-5'] if ("d'origine animale" in str(chaine).lower()): return dico['2-1-2'] if ("d'origine végétale" in str(chaine).lower()): return dico['2-1-1'] if ("dcp dérivant" in str(chaine).lower()): # Types de DCP if (("dcp français émergé bambou" in str(data['obj_flot_typ_dcp_deriv']).lower()) or ("radeau émergé bambou" in str(data['obj_flot_typ_dcp_deriv']).lower())): return dico['1-1-1-1-1'] if ("radeau immergé métal" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1-1-5'] if ("dcp français émergé métal" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1-1-2'] if ("dcp français émergé bambou-métal" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico[ '1-1-1-1-1'], dico['1-1-1-1-2'] if ("dcp français furtif" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['4-9'], dico['1-1-1'] if ("dcp français cage" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1'] if ("dcp espagnol émergé bambou" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1-1-1'] if ("dcp espagnol émergé métal" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1-1-2'] if ("traine" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-2-6'] if ("dcp espagnol émergé bambou-métal" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico[ '1-1-1-1-1'], dico['1-1-1-1-2'] if ("dcp espagnol émergé plastique" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico[ '1-1-1-1-2'] if ("dcp espagnol furtif" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['4-9'], dico['1-1-1'] if ("dcp espagnol cage" in str(data['obj_flot_typ_dcp_deriv']).lower()) or ("radeau" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-1'] if ("dcp coréen" in str(data['obj_flot_typ_dcp_deriv']).lower()) : return dico['1-1'] if (("dcp cage" in str(data['obj_flot_typ_dcp_deriv']).lower()) or \ ("dcp avd" in str(data['obj_flot_typ_dcp_deriv']).lower()) or \ ("autre dcp dérivant" in str(data['obj_flot_typ_dcp_deriv']).lower()) or \ ("autre objet" in str(data['obj_flot_typ_dcp_deriv']).lower()) or \ (data['obj_flot_typ_dcp_deriv'].isna() | (data['obj_flot_typ_dcp_deriv'] == "")).any()): return dico['1-1'] if ("cage" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['1-1-2-5'] if ("tas de bout" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['2-2-4-1'] if ("tas de paille" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['2-1-1-1'] if ("bille de bois" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['2-1-1-3'] if ("defense" in str(data['obj_flot_typ_dcp_deriv']).lower()): return dico['2-2'] # Mailles if index == 'obj_mailles': if ("pas de mailles" in str(chaine).lower()): return dico['1-1-1-2-1-3'] if ("< 7 cm" in str(chaine).lower()): return dico['1-1-1-2-1-1'] if ("> 7 cm" in str(chaine).lower()): return dico['1-1-1-2-1-2'] if ("mailles de taille inconnue" in str(chaine).lower()): return dico['1-1-1-2-1-6'] if ("non observable" in str(chaine).lower()): return dico['1-1-1-2-1-5'] # Risque de maillage en surface if index == 'obj_flot_risq_mail_en_surf': if ("pas de mailles" in str(chaine).lower()): return dico['1-1-1-2-3'] if ("< 6, 5 cm" in str(chaine).lower()): return dico['1-1-1-2-1-1'] if ("> 6,5 cm" in str(chaine).lower()): return dico['1-1-1-2-1-2'] if ("mailles de taille inconnue" in str(chaine).lower()): return dico['1-1-1-2-5'] if ("non observable" in str(chaine).lower()): return dico['1-1-1-2-5'] # Risque de maillage sous la surface if index == 'obj_flot_risq_mail_sou_surf': if ("pas de mailles" in str(chaine).lower()): return None, dico['1-1-2-3'] if ("< 6, 5 cm" in str(chaine).lower()): return None, dico['1-1-2-4-2'] if ("> 6,5 cm" in str(chaine).lower()): return None, dico['1-1-2-4-3'] if ("mailles de taille inconnue" in str(chaine).lower()): None, dico['1-1-2-2'] if ("non observable" in str(chaine).lower()): None, dico['1-1-2-2'] # Autre DFAD if perte_act: return dico['1-1']
[docs] def cap_obs_sea(allData, ob): """ Recherche le topiaId du capitaine (et potentiellement de l'opérateur de saisie) à partir de son nom complet fourni dans 'ob'. Si la recherche échoue, renvoie l'ID "[inconnu]" et un message d'alerte. Args: allData (dict): données contenant les personnes avec leur topiaId, prénom, nom ob (dict): objet contenant les informations de saisie (ex: ob["captain"]) Returns: Tuple[str, str, Optional[str]]: topiaId du capitaine, de l'opérateur (même pour l’instant), et message d’erreur ou None """ def normalise(text): """Nettoie une chaîne de caractères : supprime les espaces en trop et met en minuscules.""" return re.sub(r"\s+", " ", text.strip().lower()) def extraire_nom_prenoms(chaine): """Extrait prénom et nom depuis une chaîne. Suppose que le prénom est au début.""" chaine = normalise(chaine) # Découpage par espace ou tiret (ex: "Julien MERCIER - KERADENNEC") parts = re.split(r"\s+|-", chaine) if len(parts) == 1: return parts[0], "[inconnu]" elif len(parts) == 2: return parts[0], parts[1] else: prenom = parts[0] nom = " ".join(parts[1:]) return prenom, nom def rechercher_id(liste_personnes, nom_capitaine): """Cherche un topiaId correspondant à un nom complet. Gère les erreurs et renvoie un message si échec.""" try: id_inconnu = next(val[0] for val in liste_personnes if val[1] == "[inconnu]" and val[2] == "[inconnu]") except StopIteration: id_inconnu = None if not nom_capitaine: return id_inconnu, "Nom du capitaine vide" try: nom_capitaine = normalise(nom_capitaine) prenom, nom = extraire_nom_prenoms(nom_capitaine) for topiaId, firstName, lastName in liste_personnes: # Recherche standard (prenom, nom) if prenom in firstName and nom in lastName: return topiaId, None # Recherche inversée (nom, prenom) if nom in firstName and prenom in lastName: return topiaId, None # Cas prénom connu uniquement if prenom in firstName and lastName == "[inconnu]": return topiaId, None # Cas nom connu uniquement if lastName in nom_capitaine and firstName == "[inconnu]": return topiaId, None return id_inconnu, f"Capitaine non trouvé dans la base : '{nom_capitaine}'" except Exception as e: # return id_inconnu, f"Erreur lors de la recherche ID pour '{nom_capitaine}': {str(e)}" return id_inconnu, f"Capitaine non trouvé dans la base : '{nom_capitaine}'" # Création des listes (captains et opérateurs) depuis allData cap = [ (val["topiaId"], normalise(val["firstName"]), normalise(val["lastName"])) for val in allData["Person"] if val.get("captain") ] logbookDataEntryOperator = [ (val["topiaId"], normalise(val["firstName"]), normalise(val["lastName"])) for val in allData["Person"] if val.get("dataEntryOperator") ] # Appel de la recherche id_cap, msg1 = rechercher_id(cap, ob.get('captain')) # À activer si un jour on utilise l'opérateur de saisie séparément : # id_op, msg2 = rechercher_id(logbookDataEntryOperator, ob.get('dataEntryOperator')) id_op = id_cap # Actuellement avec double retour identique # On garde seulement le message s'il y a une erreur message = msg1 if msg1 else None return id_cap, id_op, message
[docs] class TransmitException(Exception): """Classe qui permet de gerer les exceptions sur les activités sur objet Args: Returns: """ def __init__(self, message): self.message = message super().__init__(self.message)
[docs] def obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation): """Fonction qui permet de construire les operations sur les objets et retourne l'ensemble des operations sur balise pour une route Args: dico_trams (json): dictionnaire de données pour les balises dico_trams_oper (json): dictionnaire de données pour les operations sur balises dico_trams_owner (json): dictionnaire de données pour les sur balises allData (json): données de references js_Transmitts (json): structure json pour un enregistrement sur les balises data (dataFrame): les données du logbook en cours d'insertion operation (str) : permet de connaitre le type d'operation (visite, transfert, mise à l'eau...) Returns: tab2_Transmitt (liste) : liste de structure de données Json """ tab2_Transmitt = [] def sub_func(data, tab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, js_Transmitts): js_Transmitts['transmittingBuoyOperation'] = dico_trams_oper[code_trams_oper] js_Transmitts['transmittingBuoyType'], comment = transmittingBType(data[tab_dcp_type_and_id[0]], dico_trams) if comment != "": js_Transmitts['comment'] = comment if data[tab_dcp_type_and_id[1]] != "": if data[tab_dcp_type_and_id[1]] != None: code = int(data[tab_dcp_type_and_id[1]]) if code == 0: js_Transmitts['code'] = None else: js_Transmitts['code'] = str(code) else: code = str(data[tab_dcp_type_and_id[1]]) if (code == "None") or (code == "0"): js_Transmitts['code'] = None else: js_Transmitts['code'] = str(data[tab_dcp_type_and_id[1]]) else: js_Transmitts['code'] = None js_Transmitts['transmittingBuoyOwnership'] = dico_trams_owner[code_trams_owner] return js_Transmitts def fun_dcp_activ(data, Basetab_dcp_type_and_id, Othtab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts, makeException=True): if (data[Basetab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Basetab_dcp_type_and_id[0]]).lower()): js_transmi = sub_func(data, Basetab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, js_Transmitts) if (data[Othtab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Othtab_dcp_type_and_id[0]]).lower()) and (makeException == True): # exception message = "Le " + str(data["date"]) + " à " + str(data[ "heure"]) + " ===> Attention: Information non conforme sur le ou les FOB de l'activité: - '" + operation raise TransmitException(message) return js_transmi elif (data[Othtab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Othtab_dcp_type_and_id[0]]).lower()): return sub_func(data, Othtab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, js_Transmitts) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut if ("mise" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], '3', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut if ("visite" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], '1', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut if (("retrait" in str(data['bouee_inst_act_bou']).lower()) or ("perte" in str(data['bouee_inst_act_bou']).lower())): js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], '2', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) ############################# # print("perte ou retrait ",data["date"]) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut if ("fin" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], '5', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut if ("transfert" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], '2', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts, makeException=False, ) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut js_transmi = fun_dcp_activ(data, ['bouee_inst_bou_deplo_typ', 'bouee_inst_bou_deplo_id'], ['bouee_inst_bou_prst_typ', 'bouee_inst_bou_prst_id'], '3', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts, makeException=False, ) tab2_Transmitt.append(js_transmi) return tab2_Transmitt
[docs] def obj_deja_deploy_v23(data_ob, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation): """Fonction qui permet de construire les operations sur les objets et retourne l'ensemble des operations sur balise pour une route Args: dico_trams (json): dictionnaire de données pour les balises dico_trams_oper (json): dictionnaire de données pour les operations sur balises dico_trams_owner (json): dictionnaire de données pour les sur balises allData (json): données de references js_Transmitts (json): structure json pour un enregistrement sur les balises data_ob (dataFrame): les données du logbook sur operation sur objet operation (str) : permet de connaitre le type d'operation (visite, transfert, mise à l'eau...) Returns: tab2_Transmitt (liste) : liste de structure de données Json """ tab2_Transmitt = [] def sub_func(data, tab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts): js_Transmitts['transmittingBuoyOperation'] = dico_trams_oper[code_trams_oper] js_Transmitts['transmittingBuoyType'], comment = transmittingBType(data[tab_dcp_type_and_id[0]], dico_trams) if comment != "": js_Transmitts['comment'] = comment if data[tab_dcp_type_and_id[1]] != "": if data[tab_dcp_type_and_id[1]] != None: code = int(data[tab_dcp_type_and_id[1]]) if code == 0: js_Transmitts['code'] = None else: js_Transmitts['code'] = str(code) else: code = str(data[tab_dcp_type_and_id[1]]) if (code == "None") or (code == "0") : js_Transmitts['code'] = None else: js_Transmitts['code'] = str(data[tab_dcp_type_and_id[1]]) else: js_Transmitts['code'] = None js_Transmitts['transmittingBuoyOwnership'] = dico_trams_owner[code_trams_owner] return js_Transmitts def fun_dcp_activ(data, Basetab_dcp_type_and_id, Othtab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts, makeException=True): if (data[Othtab_dcp_type_and_id[0]] != None) and (data[Basetab_dcp_type_and_id[0]] == data[Othtab_dcp_type_and_id[0]]) and ( "pas de" not in str(data[Othtab_dcp_type_and_id[0]]).lower()): ############# Orth v23 return sub_func(data, Othtab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) elif (data[Basetab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Basetab_dcp_type_and_id[0]]).lower()): js_transmi = sub_func(data, Basetab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) if (data[Othtab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Othtab_dcp_type_and_id[0]]).lower()) and (makeException == True): # exception message = "Le " + str(data["date"]) + " à " + str(data[ "heure"]) + " ===> Attention: Information non conforme sur le ou les FOB de l'activité: - '" + operation raise TransmitException(message) return js_transmi elif (data[Othtab_dcp_type_and_id[0]] != None) and ( "pas de" not in str(data[Othtab_dcp_type_and_id[0]]).lower()): return sub_func(data, Othtab_dcp_type_and_id, code_trams_oper, code_trams_owner, dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) for _, data in data_ob.iterrows(): js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut ### OKOKO if ("déploiement" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_modele', 'bouee_numero'], ['bouee_modele', 'bouee_numero'], '3', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut ### OKOKO Visite if ("renforcement" in str(data['bouee_inst_act_bou']).lower()) or ("visite" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_modele', 'bouee_numero'], ['bouee_modele', 'bouee_numero'], '1', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut ### OKOKO if (("récupération" in str(data['bouee_inst_act_bou']).lower()) or ("perte" in str(data['bouee_inst_act_bou']).lower())): js_transmi = fun_dcp_activ(data, ['bouee_modele', 'bouee_numero'], ['bouee_modele', 'bouee_numero'], '2', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) js_Transmitts = js_Transmitt() # intialisatiion des parametres par defaut ### OKOKO if ("fin" in str(data['bouee_inst_act_bou']).lower()): js_transmi = fun_dcp_activ(data, ['bouee_modele', 'bouee_numero'], ['bouee_modele', 'bouee_numero'], '5', '3', dico_trams_oper, dico_trams, dico_trams_owner, allData, js_Transmitts) tab2_Transmitt.append(js_transmi) return tab2_Transmitt
[docs] def obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple=("false", "false")): """Fonction qui permet de traiter les materiels Args: tab1_Float (list): liste de données pour les materiels js_Floats (json): structure json pour un enregistrement sur les materiels Returns: """ js_Floats = js_Float() if temp_float == None: pass elif type(temp_float) == tuple: js_Floats["objectMaterial"] = temp_float[0] js_Floats["whenArriving"] = bool_tuple[0] js_Floats["whenLeaving"] = bool_tuple[1] tab1_Float.append(js_Floats) js_Floats = js_Float() js_Floats["objectMaterial"] = temp_float[1] js_Floats["whenArriving"] = bool_tuple[0] js_Floats["whenLeaving"] = bool_tuple[1] tab1_Float.append(js_Floats) else: js_Floats["objectMaterial"] = temp_float js_Floats["whenArriving"] = bool_tuple[0] js_Floats["whenLeaving"] = bool_tuple[1] tab1_Float.append(js_Floats)
[docs] def build_trip(allData, info_bat, data_log, oce, prg, ob): """Fonction qui permet de contruire le gros fragment json de la marée et retourner des messages par rapport à la construction Args: allData (json): données de references info_bat (json): info sur le bateau date de depart/arrivée du port de depart/arrivé data_log (dataFrame): les données du logbook oce (list): la liste des océans prg (list): pour la liste des programmes ob (json) : info sur le capitaine et homeid du bateau Returns: allMessages, js_contents """ group = data_log.groupby(['date']) allMessages = [] tab3_floatingObject = [] activite = [] routes = [] ################## NEw js_catches = {} js_activitys = {} js_routeLogbooks = {} js_Transmitts = {} js_Floats = {} js_floatingObjects = {} ##################### homeId = nb_r = Som_thon = 0 nb = 1 yft_id = getId(allData, "Species", argment="faoCode=YFT") skj_id = getId(allData, "Species", argment="faoCode=SKJ") bet_id = getId(allData, "Species", argment="faoCode=BET") germon_alb_id = getId(allData, "Species", argment="faoCode=ALB") WeightMeasureMet = getId(allData, "WeightMeasureMethod", argment="label2=Estimation visuelle") code_conser = getId(allData, "SpeciesFate", argment="code=6") code_conser_autre = getId(allData, "SpeciesFate", argment="code=15") code_reje = getId(allData, "SpeciesFate", argment="code=11") vers_code_6 = getId(allData, "VesselActivity", argment="code=6", domaine="seine") vers_code_13 = getId(allData, "VesselActivity", argment="code=13", domaine="seine") vers_code_21 = getId(allData, "VesselActivity", argment="code=21", domaine="seine") vers_code_99 = getId(allData, "VesselActivity", argment="code=99", domaine="seine") id_infoSource = getId(allData, "InformationSource", argment="code=S") id_dataQua = getId(allData, "DataQuality", argment="code=A") dico_code_sch_type = getAll(allData, "SchoolType") dico_code_setSucc = getAll(allData, "SetSuccessStatus") dico_objec = getAll(allData, "ObjectOperation") dico_trams_oper = getAll(allData, "TransmittingBuoyOperation") dico_trams = getAll(allData, "TransmittingBuoyType") dico_trams_owner = getAll(allData, "TransmittingBuoyOwnership") dico_objeMat = getAll(allData, "ObjectMaterial") tab_fpa = getAll(allData, "FpaZone", type_data="tableau") ############################# oths = False oths_rej = [] data_date = "" fpa_prece = "" heure_prece = "" comment_prece = "" nb_prece = 0 not_time = False date = "" for val in group: #print(val) for index, data in val[1].iterrows(): date = data["date"] # print(str(date).replace(" ","T").replace("00:00:00","")+str(data["heure"])+".000Z") tab4_catches = [] # Permet d'incrementer le homeId sans perdre le file s'il n'y a pas d'activités if (data["lat1"] is not None) and (data["long1"] is not None) and ( data["zee"] is not None) and ( (data["cap_aut_esp_oth_esp"] is not None) or (data["cap_rej_dsc_esp"] is not None)): for vals in group: for _, datas in vals[1].iterrows(): if data["date"] == datas["date"]: if (datas['cap_alb_yft_p10_tail'] != None or datas['cap_alb_yft_p10_cap'] != None or \ datas['cap_alb_yft_m10_tail'] != None or datas['cap_alb_yft_m10_cap'] != None or \ datas['cap_lst_skj_tail'] != None or datas['cap_lst_skj_cap'] != None or \ datas['cap_pat_bet_p10_tail'] != None or datas['cap_pat_bet_p10_cap'] != None or \ datas['cap_pat_bet_m10_tail'] != None or datas['cap_pat_bet_m10_cap'] != None or \ datas['cap_ger_alb_tail'] != None or datas['cap_ger_alb_cap'] != None or \ datas['cap_aut_esp_oth_esp'] != None or datas['cap_aut_esp_oth_cap'] != None or \ datas['cap_rej_dsc_esp'] != None or datas['cap_rej_dsc_cap'] != None): ############################################ Modifier ################################## def func_tab4_catches(js_catches, topId_sp, weight, WeightMeasureMet, code_conser): # js_catches["homeId"] = homeId js_catches["species"] = topId_sp js_catches["weight"] = weight js_catches["weightMeasureMethod"] = WeightMeasureMet js_catches["speciesFate"] = code_conser return js_catches # Recuperation des caputure et chercher les infor a partir de l'api pour concevoir le content pour catches js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_alb_yft_p10_tail'] != None and datas['cap_alb_yft_p10_cap'] != None): homeId += 1 Som_thon += float(datas['cap_alb_yft_p10_cap']) js_catches = func_tab4_catches(js_catches, yft_id, datas['cap_alb_yft_p10_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_alb_yft_m10_tail'] != None and datas['cap_alb_yft_m10_cap'] != None): homeId += 1 Som_thon += float(datas['cap_alb_yft_m10_cap']) js_catches = func_tab4_catches(js_catches, yft_id, datas['cap_alb_yft_m10_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_lst_skj_tail'] != None and datas['cap_lst_skj_cap'] != None): # print("Taille: ", datas['cap_lst_skj_tail']) homeId += 1 Som_thon += float(datas['cap_lst_skj_cap']) js_catches = func_tab4_catches(js_catches, skj_id, datas['cap_lst_skj_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_pat_bet_p10_tail'] != None and datas['cap_pat_bet_p10_cap'] != None): homeId += 1 Som_thon += float(datas['cap_pat_bet_p10_cap']) js_catches = func_tab4_catches(js_catches, bet_id, datas['cap_pat_bet_p10_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_pat_bet_m10_tail'] != None and datas['cap_pat_bet_m10_cap'] != None): homeId += 1 Som_thon += float(datas['cap_pat_bet_m10_cap']) js_catches = func_tab4_catches(js_catches, bet_id, datas['cap_pat_bet_m10_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_ger_alb_tail'] != None and datas['cap_ger_alb_cap'] != None): homeId += 1 Som_thon += float(datas['cap_ger_alb_cap']) js_catches = func_tab4_catches(js_catches, germon_alb_id, datas['cap_ger_alb_cap'], WeightMeasureMet, code_conser) tab4_catches.append(js_catches) ### Autre especes et rejets # print("AAAA AAAAAA ", data["date"]) try: if datas["cap_aut_esp_oth_esp"] is not None: if len(datas["cap_aut_esp_oth_esp"].replace(" ", "")) == 3: js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_aut_esp_oth_esp'] != None and datas[ 'cap_aut_esp_oth_cap'] != None): homeId += 1 if datas['cap_aut_esp_oth_tail'] == None: oths_id = getId(allData, "Species", argment="faoCode=" + ( datas["cap_aut_esp_oth_esp"]).upper()) if (oths_id == "") or (oths_id == None): oths_id = getId(allData, "Species", argment="faoCode=XXX*") js_catches["comment"] = "Code espèce non trouvé: \"" + str( datas["cap_aut_esp_oth_esp"]) + "\"" # print("Esp trouv : ", datas["cap_aut_esp_oth_esp"], oths_id) js_catches[ "species"] = oths_id ###### PAscal verifier si 3 lettres => recherce faoCode si trouve pas code recherche facode XXX* sinon XXX* js_catches["weight"] = datas['cap_aut_esp_oth_cap'] Som_thon += float(datas[ 'cap_aut_esp_oth_cap']) ####### Revenir sur la capture Pascal #### js_catches["weightMeasureMethod"] = WeightMeasureMet js_catches["speciesFate"] = code_conser_autre else: oths_id = getId(allData, "Species", argment="faoCode=" + ( datas["cap_aut_esp_oth_esp"]).upper()) if (oths_id == "") or (oths_id == None): oths_id = getId(allData, "Species", argment="faoCode=XXX*") js_catches["comment"] = "Code espèce non trouvé: \"" + str( datas["cap_aut_esp_oth_esp"]) + "\"" # print("Esp trouv 2 : ", datas["cap_aut_esp_oth_esp"], oths_id) Som_thon += float(datas['cap_aut_esp_oth_cap']) js_catches = func_tab4_catches(js_catches, oths_id, datas['cap_aut_esp_oth_cap'], WeightMeasureMet, code_conser_autre) tab4_catches.append(js_catches) else: allMessages.append("Le " + str(data["date"]) + " à " + str(data[ "heure"]) + " ===> les espèces rejetées doivent être indiquées avec leur code FAO (ASFIS) 3 lettres. Le code trouvé est: " + datas["cap_aut_esp_oth_esp"]) if datas["cap_rej_dsc_esp"] is not None: if len(datas["cap_rej_dsc_esp"].replace(" ", "")) == 3: js_catches = js_catche() # intialisatiion des parametres defau if (datas['cap_rej_dsc_esp'] != None and datas['cap_rej_dsc_cap'] != None): homeId += 1 if datas['cap_rej_dsc_tail'] == None: rejs_id = getId(allData, "Species", argment="faoCode=" + (datas["cap_rej_dsc_esp"]).upper()) if (rejs_id == "") or (rejs_id == None): rejs_id = getId(allData, "Species", argment="faoCode=XXX*") js_catches["comment"] = "Code espèce non trouvé: \"" + str( datas["cap_rej_dsc_esp"]) + "\"" js_catches[ "species"] = rejs_id ###### PAscal verifier si 3 lettres => recherce faoCode si trouve pas code recherche facode XXX* sinon XXX* js_catches["weight"] = datas['cap_rej_dsc_cap'] Som_thon += float(datas[ 'cap_rej_dsc_cap']) ####### Revenir sur la capture Pascal #### js_catches["weightMeasureMethod"] = WeightMeasureMet js_catches["speciesFate"] = code_reje else: rejs_id = getId(allData, "Species", argment="faoCode=" + (datas["cap_rej_dsc_esp"]).upper()) if (rejs_id == "") or (rejs_id == None): rejs_id = getId(allData, "Species", argment="faoCode=XXX*") js_catches["comment"] = "Code espèce non trouvé: \"" + str( datas["cap_rej_dsc_esp"]) + "\"" Som_thon += float(datas['cap_rej_dsc_cap']) js_catches = func_tab4_catches(js_catches, rejs_id, datas['cap_rej_dsc_cap'], WeightMeasureMet, code_reje) tab4_catches.append(js_catches) else: allMessages.append("Le " + str(data["date"]) + " à " + str(data[ "heure"]) + " ===> les espèces rejetées doivent être indiquées avec leur code FAO (ASFIS) 3 lettres. Le code trouvé est: " + datas["cap_rej_dsc_esp"]) except: # Date heure ==> Les données concernant les espèces rejetées sont mal formatées (raison exacte indeterminée) allMessages.append("Le " + str(data["date"]) + " à " + str(data[ "heure"]) + " ===> Les données concernant les espèces rejetées sont mal formatées (raison exacte indeterminée)") ################# Floating Obj ############## tab1_Float = [] tab2_Transmitt = [] temp_float = None def func_tab3_floatingObject(allData, data, dico_objeMat, js_Floats, bool_tuple, argment, tab1_Float=[]): # Types objets flottants js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(data['obj_flot_typ_obj'], data, dico_objeMat, index='obj_flot_typ_obj') obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) # Risque de maillage en surface js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(data['obj_flot_risq_mail_en_surf'], data, dico_objeMat, index='obj_flot_risq_mail_en_surf') obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) # Risque de maillage sous la surface js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(data['obj_flot_risq_mail_sou_surf'], data, dico_objeMat, index='obj_flot_risq_mail_sou_surf', perte_act=True) obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) js_floatingObjects = js_floatingObject(tab2_Transmitt, tab1_Float) js_floatingObjects["objectOperation"] = getId(allData, "ObjectOperation", argment) return js_floatingObjects try: if (data['obj_flot_act_sur_obj'] == None) or ("perte" in str(data['bouee_inst_act_bou']).lower()): depart_date = info_bat['Depart_Date'] if (str(data["date"]).split(" ")[0] >= depart_date) and ( "perte" in str(data['bouee_inst_act_bou']).lower()): # print("perte") operation = "perte" tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("perte ou Fin ", data['date']) # code 13 mettre avec ce que js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=11") tab3_floatingObject.append(js_floatingObjects) elif ("mise" in str(data['obj_flot_act_sur_obj']).lower()): operation = "mise à l'eau" tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("Mise ", data['date']) js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("false", "true"), argment="code=1") tab3_floatingObject.append(js_floatingObjects) elif ("visite" in str(data['obj_flot_act_sur_obj']).lower()): operation = "visite" # print(data) tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("visite ", data['date']) js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("true", "false"), argment="code=2") tab3_floatingObject.append(js_floatingObjects) elif ("renforcement" in str(data['obj_flot_act_sur_obj']).lower()): operation = "renforcement" tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("renforcement ", data['date']) js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=8") tab3_floatingObject.append(js_floatingObjects) elif ("retrait" in str(data['obj_flot_act_sur_obj']).lower()): operation = "retrait" tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("retrat ", data['date']) js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("true", "false"), argment="code=4") tab3_floatingObject.append(js_floatingObjects) elif (("perte" in str(data['obj_flot_act_sur_obj']).lower()) or ( "fin" in str(data['obj_flot_act_sur_obj']).lower())): operation = "Perte ou de fin d'utilisation" tab2_Transmitt = obj_deja_deploy(data, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) # print("perte ou Fin ", data['date']) js_floatingObjects = func_tab3_floatingObject(allData, data, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=11") tab3_floatingObject.append(js_floatingObjects) if ((data['obj_flot_act_sur_obj'] == None) and (data['obj_flot_typ_obj'] != None) and ( "perte" != str(data['bouee_inst_act_bou']).lower())): allMessages.append("Le " + str(data["date"]) + " à " + str( data["heure"]) + " ===> Activité sur objet flottant non renseignéé ") except TransmitException as e: # print(data["date"],data["heure"]," Logbook non conforme #######") allMessages.append(e.message) ############################################################################################################################################## ########### Activite ############ depart_date = info_bat['Depart_Date'] Depart_heure = info_bat['Depart_heure'] last = len(data_log) - 1 if (((data["heure"] is not None) or (data["heure"] is None)) and (data["lat1"] is not None) and ( data["long1"] is not None) and ( data["zee"] is not None)) or (((str(data["date"]).split(" ")[0] == depart_date) and ( str(Depart_heure) == str(data["heure"]))) or (index == last)): if data["heure"] is None: not_time = True js_activitys = js_activity(tab4_catches, tab3_floatingObject) # print("BBBBBB BBB ", data["date"]," ", data["heure"]," ", data["calee_porta"]," ", data["calee_nul"]) ######################### NEW LIGnE tab3_floatingObject = [] ########################### if tab4_catches is not []: if data["comment"] is not None: js_activitys["comment"] = data["comment"] else: js_activitys["comment"] = "Aucun commentaire" else: js_activitys["comment"] = "Le programme de lecture du livre de bord n’a pas pu \ déterminer le code bateau. Le nom du bateau était " + info_bat['Navire'] if data["heure"] is None: js_activitys["time"] = data["heure"] else: js_activitys["time"] = str(date).replace(" ", "T").replace("00:00:00", "") + str( data["heure"]) + ".000Z" js_activitys["seaSurfaceTemperature"] = data["temp_mer"] js_activitys["windDirection"] = data["vent_dir"] if Som_thon != 0: js_activitys["totalWeight"] = Som_thon # Verifier si premiere activité et enregistrer if ((str(data["date"]).split(" ")[0] == depart_date) and (str(Depart_heure) == str(data["heure"]))): if data["lat1"] != None and data["lat2"] != None and \ data["lat3"] != None and data["long1"] != None and \ data["long2"] != None and data["long3"] != None: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data["lat1"], data["lat2"], data["lat3"], data["long1"], data["long2"], data["long3"]) returnMsg = "Position manquante (latitude / longitude): Le " + str(data["date"]).replace( " 00:00:00", " à ") + str(data["heure"]) if checkMsg: allMessages.append(returnMsg) else: js_activitys["latitude"], js_activitys["longitude"] = get_lat_long(allData, info_bat['Depart_Port']) elif index == last: if data["lat1"] != None and data["lat2"] != None and \ data["lat3"] != None and data["long1"] != None and \ data["long2"] != None and data["long3"] != None: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data["lat1"], data["lat2"], data["lat3"], data["long1"], data["long2"], data["long3"]) returnMsg = "Position manquant (latitude / longitude): Le " + str(data["date"]).replace( " 00:00:00", " à ") + str(data["heure"]) if checkMsg: allMessages.append(returnMsg) else: js_activitys["latitude"], js_activitys["longitude"] = get_lat_long(allData, info_bat['Arrivee_Port']) else: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data["lat1"], data["lat2"], data["lat3"], data["long1"], data["long2"], data["long3"]) returnMsg = "Position manquant (latitude / longitude): Le " + str(data["date"]).replace(" 00:00:00", " à ") + str( data["heure"]) if checkMsg: allMessages.append(returnMsg) def schoolType(chaine, dico_code_sch_type): if chaine != None and chaine != "": if ("libre" in chaine.lower()): ## Table SchoolType code 2 return dico_code_sch_type["2"] elif ("objet" in chaine.lower()): ## Table SchoolType code 1 return dico_code_sch_type["1"] elif ("ind" in chaine.lower()): ## Table SchoolType code 0 return dico_code_sch_type["0"] def setCo_setSuc_vess(setCount, setSuccessStatus, vesselActivity): return setCount, setSuccessStatus, vesselActivity messg = "Le " + str(data["date"]).replace(" 00:00:00", " à ") + str( data["heure"]) + " ===> Le type de banc n'a pas été précisé" if (data['calee_porta'] is not None) and (data['calee_nul'] is None): # Code 6 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(1, dico_code_setSucc["1"], vers_code_6) if data["calee_type"] is None: allMessages.append(messg) else: js_activitys["schoolType"] = schoolType(data["calee_type"], dico_code_sch_type) elif (data['calee_porta'] is None) and (data['calee_nul'] is not None): # Code 6 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(1, dico_code_setSucc["0"], vers_code_6) if data["calee_type"] is None: allMessages.append(messg) else: js_activitys["schoolType"] = schoolType(data["calee_type"], dico_code_sch_type) elif (data['calee_porta'] is not None) and (data['calee_nul'] is not None): # Code 6 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(1, dico_code_setSucc["2"], vers_code_6) if data["calee_type"] is None: allMessages.append(messg) else: js_activitys["schoolType"] = schoolType(data["calee_type"], dico_code_sch_type) elif data['obj_flot_act_sur_obj'] is not None: # Code 13 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(0, None, vers_code_13) js_activitys["schoolType"] = None else: if (str(data["date"]).split(" ")[0] >= depart_date) and ( "perte" in str(data['bouee_inst_act_bou']).lower()): # Code 13 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(0, None, vers_code_13) js_activitys["schoolType"] = None elif ("perte" not in str(data['bouee_inst_act_bou']).lower()): # Code 99 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys[ "vesselActivity"] = setCo_setSuc_vess(0, None, vers_code_99) js_activitys["schoolType"] = None js_activitys["informationSource"] = id_infoSource js_activitys["dataQuality"] = id_dataQua js_activitys["currentFpaZone"], comment_temp = fpaZone_id(data["zee"], tab_fpa, allData) if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp ObserSys0 = getSome(allData, argment="code=0", moduleName="ObservedSystem")[0]["topiaId"] observedSystem = [ObserSys0] if data["asso_bc_libre"] != None: observedSystem.remove(ObserSys0) observedSystem.append(getSome(allData, argment="code=0", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_objet"] != None: observedSystem.remove(ObserSys0) observedSystem.append( getSome(allData, argment="code=20", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_balise"] != None: observedSystem.remove(ObserSys0) observedSystem.append( getSome(allData, argment="code=20", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_baliseur"] != None: observedSystem.remove(ObserSys0) observedSystem.append( getSome(allData, argment="code=28", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_requin"] != None: observedSystem.remove(ObserSys0) observedSystem.append( getSome(allData, argment="code=12", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_baleine"] != None: observedSystem.remove(ObserSys0) observedSystem.append( getSome(allData, argment="code=11", moduleName="ObservedSystem")[0]["topiaId"]) elif data["asso_oiseaux"] != None: observedSystem.remove(ObserSys0) observedSystem.append(getSome(allData, argment="code=4", moduleName="ObservedSystem")[0]["topiaId"]) js_activitys["observedSystem"] = observedSystem js_activitys["wind"] = get_wind_id_interval(allData, "Wind", data["vent_vit"]) js_activitys["number"] = int(nb) if (heure_prece == data["heure"]) and (date_prece == data["date"]): # Supprimer activité inseré en dernier if len(activite) != 0: del (activite[-1]) # faire le changement de zone js_activitys["number"] = nb_prece js_activitys["previousFpaZone"], comment_temp = fpaZone_id(fpa_prece, tab_fpa, allData) js_activitys["nextFpaZone"], comment_temp = fpaZone_id(data["zee"], tab_fpa, allData) js_activitys["currentFpaZone"] = None if (comment_prece is not None) and ( (js_activitys["comment"] is not None) and (js_activitys["comment"] != "Aucun commentaire")): js_activitys["comment"] = comment_prece + " ==> " + js_activitys["comment"] elif (comment_prece is None) and (js_activitys["comment"] is not None): js_activitys["comment"] = js_activitys["comment"] elif (comment_prece is not None) and ( (js_activitys["comment"] is None) or (js_activitys["comment"] == "Aucun commentaire")): js_activitys["comment"] = comment_prece else: js_activitys["comment"] = "Aucun commentaire" if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp js_activitys["vesselActivity"] = vers_code_21 # ajouter la nouvelle activité activite.append(js_activitys) # Reinitialliser les variables nb = nb_prece else: activite.append(js_activitys) fpa_prece = data["zee"] heure_prece = data["heure"] date_prece = data["date"] comment_prece = data["comment"] nb_prece = int(nb) Som_thon = 0 nb += 1 js_routeLogbooks = js_routeLogbook(activite) # print("DDDDDD DDDDD DDDD", type(data["heure"])) js_routeLogbooks["date"] = str(date).replace(" ", "T") + ".000Z" routes.append(js_routeLogbooks) activite = [] nb = 1 nb_r += 1 #print("Yes", routes) js_contents = js_content(routes, oce, prg) # activitiesAcquisitionMode [BY_NUMBER, BY_TIME] if not_time: js_contents["activitiesAcquisitionMode"] = "BY_NUMBER" else: js_contents["activitiesAcquisitionMode"] = "BY_TIME" # noinspection PyBroadException try: # si plusieurs Rechercher celui qui a le code le plus elévé avec toujours son status == 1 #########################################################"" js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'] + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'].upper() + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'].lower() + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: allMessages.append( "Le nom du Navire n'a pas été trouvé. Veuillez verifier son existance dans la base de données puis corriger dans le livre de bord.") except: pass if info_bat['Depart_Port'] == None: js_contents["departureHarbour"] = getId(allData, "Harbour", argment="code=999") else: resu = getId(allData, "Harbour", argment="label2=" + (info_bat['Depart_Port']).upper()) if resu == None: js_contents["departureHarbour"] = getId(allData, "Harbour", argment="code=999") else: js_contents["departureHarbour"] = resu if info_bat['Arrivee_Port'] == None: js_contents["landingHarbour"] = getId(allData, "Harbour", argment="code=999") else: resu = getId(allData, "Harbour", argment="label2=" + (info_bat['Arrivee_Port']).upper()) if resu == None: js_contents["landingHarb number = 1our"] = getId(allData, "Harbour", argment="code=999") else: js_contents["landingHarbour"] = resu if info_bat['Depart_Date'] == None: js_contents["startDate"] = None else: js_contents["startDate"] = info_bat['Depart_Date'] + "T00:00:00.000Z" # "2021-03-02T00:00:00.000Z" # if info_bat['Arrivee_Date'] == None: js_contents["endDate"] = None else: js_contents["endDate"] = info_bat['Arrivee_Date'] + "T00:00:00.000Z" id_cap, id_op, message = cap_obs_sea(allData, ob) js_contents["captain"], js_contents["logbookDataEntryOperator"] = id_cap, id_op if message: allMessages.append(message) js_contents["loch"] = info_bat['Arrivee_Loch'] js_contents["homeId"] = str(ob["mar_homeId"]) js_contents["observationsProgram"] = None js_contents['logbookComment'] = "NB: Service Web" return allMessages, js_contents
[docs] def build_trip_v23(allData, info_bat, data_log, oce, prg): """Fonction qui permet de contruire le gros fragment json de la marée et retourner des messages par rapport à la construction Args: allData (json): données de references info_bat (json): info sur le bateau date de depart/arrivée du port de depart/arrivé et info sur le capitaine et homeid du bateau data_log (dataFrame): les données du logbook oce (list): la liste des océans prg (list): pour la liste des programmes Returns: allMessages, js_contents """ # 2024-02-24T06:50:00.000Z, "2024-02-24T00:00:00.000Z" grouped_by_date = data_log.groupby('date') oths = False oths_rej = [] data_date = "" nb_prece = 0 not_time = False allMessages = [] tab3_floatingObject = [] activite = [] routes = [] ################## NEw js_catches = {} js_activitys = {} js_routeLogbooks = {} js_Transmitts = {} js_Floats = {} js_floatingObjects = {} ##################### homeId = 0 nb = 1 WeightMeasureMet = getId(allData, "WeightMeasureMethod", argment="label2=Estimation visuelle") code_conser = getId(allData, "SpeciesFate", argment="code=6") code_conser_autre = getId(allData, "SpeciesFate", argment="code=15") code_reje = getId(allData, "SpeciesFate", argment="code=11") # Champs type de declaration dans le logbook vers_code_0 = getId(allData, "VesselActivity", argment="code=0", domaine="seine") vers_code_6 = getId(allData, "VesselActivity", argment="code=6", domaine="seine") vers_code_13 = getId(allData, "VesselActivity", argment="code=13", domaine="seine") vers_code_21 = getId(allData, "VesselActivity", argment="code=21", domaine="seine") vers_code_99 = getId(allData, "VesselActivity", argment="code=99", domaine="seine") vers_code_103 = getId(allData, "VesselActivity", argment="code=103", domaine="seine") id_infoSource = getId(allData, "InformationSource", argment="code=S") id_dataQua = getId(allData, "DataQuality", argment="code=A") dico_code_sch_type = getAll(allData, "SchoolType") dico_code_setSucc = getAll(allData, "SetSuccessStatus") dico_objec = getAll(allData, "ObjectOperation") dico_trams_oper = getAll(allData, "TransmittingBuoyOperation") dico_trams = getAll(allData, "TransmittingBuoyType") dico_trams_owner = getAll(allData, "TransmittingBuoyOwnership") dico_objeMat = getAll(allData, "ObjectMaterial") tab_fpa = getAll(allData, "FpaZone", type_data="tableau") ############################# for date, day_group in grouped_by_date: # print(date) number = 1 # Regrouper par heure pour chaque journée grouped_by_hour = day_group.groupby('heure') for heure, hour_group in grouped_by_hour: list_catches = [] tab3_floatingObject = [] total_weight = 0 #print(date) # Construire les captures spécifiques à cette heure for _, row in hour_group.iterrows(): if pd.notna(row['espece']) and row['espece'] != "": # Si une capture est présente wgtCategory = weightCategory(allData, row['categ_poids'], row["espece"][:3].upper()) species_id = getId(allData, "Species", argment="faoCode=" + row["espece"][:3].upper()) if species_id == "": species_id = getId(allData, "Species", argment="faoCode=XXX") def func_tab4_catches(topId_sp, weight, WeightMeasureMet, code_conser_reje, wgtCategory=None, count=None): js_catch = js_catche() js_catch.update({ "species": topId_sp, "weight": weight, "weightMeasureMethod": WeightMeasureMet, "speciesFate": code_conser_reje, "weightCategory": wgtCategory, "count": count, }) return js_catch # total_weight += row['quant_conser_tonne'] if pd.notna(row['quant_conser_tonne']) else 0 if pd.notna(row['quant_conser_tonne']): total_weight += float(row['quant_conser_tonne']) # Tonne js_catch = func_tab4_catches(topId_sp=species_id, weight=row['quant_conser_tonne'], WeightMeasureMet=WeightMeasureMet, code_conser_reje=code_conser, wgtCategory=wgtCategory, count=row['quant_conser_nb']) elif pd.notna(row['quant_reje_tonne']): total_weight += float(row['quant_reje_tonne']) # Tonne js_catch = func_tab4_catches(topId_sp=species_id, weight=row['quant_reje_tonne'], WeightMeasureMet=WeightMeasureMet, code_conser_reje=code_reje, wgtCategory=wgtCategory, count=row['quant_reje_nb']) else: total_weight += float(0) # Tonne js_catch = func_tab4_catches(topId_sp=species_id, weight=float(0), WeightMeasureMet=WeightMeasureMet, code_conser_reje=code_conser_autre, wgtCategory=wgtCategory) if (row['quant_conser_tonne'] == "") or (row['quant_conser_tonne'] == None) or (row['quant_conser_tonne'] == "0"): if pd.notna(row['quant_conser_nb']): js_catch.update({"count": str(row['quant_conser_nb'])}) js_catch.update({"comment": "CONSERVEE"}) if pd.notna(row['quant_reje_nb']): js_catch.update({"count": str(row['quant_reje_nb'])}) js_catch.update({"speciesFate": code_reje}) js_catch.update({"comment": "REJETEE"}) list_catches.append(js_catch) ##### Floating Obj CODE ########### d_date = hour_group.iloc[0]['date'] d_act_boue = hour_group.iloc[0]['bouee_inst_act_bou'] depart_date = info_bat['Depart_Date'] Depart_heure = info_bat['Depart_heure'] # recuperer les objets data_act_obj = hour_group.loc[:, 'obj_flot_act_sur_obj':'obj_bio'] data_act_bo = hour_group.loc[:, 'bouee_inst_act_bou':'bouee_numero'] # supprimer les doublons d_act_obj = data_act_obj.drop_duplicates() d_act_bo = data_act_bo.drop_duplicates() check_vis_dep = () for index, row in d_act_obj.iterrows(): tab1_Float = [] tab2_Transmitt = [] temp_float = None def func_tab3_floatingObject(allData, row, dico_objeMat, js_Floats, bool_tuple, argment, tab1_Float=[]): # Types objets flottants js_Floats = js_Float() # intialisatiion des parametres defaut temp_float = floatingObjectPart(row['obj_flot_typ_obj'], row, dico_objeMat, index='obj_flot_typ_obj') obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) try: # Maillage js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(row['obj_mailles'], row, dico_objeMat, index='obj_mailles') obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) except: # Risque de maillage en surface js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(row['obj_flot_risq_mail_en_surf'], row, dico_objeMat, index='obj_flot_risq_mail_en_surf') obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) # Risque de maillage sous la surface js_Floats = js_Float() # intialisatiion des parametres defau temp_float = floatingObjectPart(row['obj_flot_risq_mail_sou_surf'], row, dico_objeMat, index='obj_flot_risq_mail_sou_surf', perte_act=True) obj_ob_part_body_(temp_float, tab1_Float, js_Floats, bool_tuple) js_floatingObjects = js_floatingObject(tab2_Transmitt, tab1_Float) js_floatingObjects["objectOperation"] = getId(allData, "ObjectOperation", argment) return js_floatingObjects prev = -1 try: if (row['obj_flot_act_sur_obj'] != None) and (d_act_obj.loc[index + 1, 'obj_flot_act_sur_obj'] != None): check_vis_dep = row['obj_flot_act_sur_obj'].lower(), d_act_obj.loc[index + 1, 'obj_flot_act_sur_obj'].lower() prev = index + 1 if ("visite" in check_vis_dep) and ("déploiement" in check_vis_dep): operation = "renforcement == Visite + Déploiement" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=8") tab3_floatingObject.append(js_floatingObjects) except: if index != prev: try: if (row['obj_flot_act_sur_obj'] == None) or ("perte" in str(d_act_boue).lower()): depart_date = info_bat['Depart_Date'] if (str(d_date).split(" ")[0] >= depart_date) and ( "perte" in str(d_act_boue).lower()): ##### A corriger operation = "perte" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) ############# A corriger js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=11") tab3_floatingObject.append(js_floatingObjects) elif ("déploiement" in str(row['obj_flot_act_sur_obj']).lower()): ####### Déploiement operation = "mise à l'eau == Déploiement" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("false", "true"), argment="code=1") tab3_floatingObject.append(js_floatingObjects) elif ("visite" in str(row['obj_flot_act_sur_obj']).lower()): ###### Visite operation = "visite == Visite" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "false"), argment="code=2") tab3_floatingObject.append(js_floatingObjects) elif ("pêche" in str(row['obj_flot_act_sur_obj']).lower()): ###### Pêche operation = "pêche == Pêche" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "false"), argment="code=6") tab3_floatingObject.append(js_floatingObjects) elif ("récupération" in str(row['obj_flot_act_sur_obj']).lower()): ####### Récupération operation = "retrait == Récupération" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "false"), argment="code=4") tab3_floatingObject.append(js_floatingObjects) elif (("perte" in str(row['obj_flot_act_sur_obj']).lower()) or ( "fin" in str(row['obj_flot_act_sur_obj']).lower())): ####### Perte ou Fin d'utilisation operation = "Perte ou de fin d'utilisation == Perte ou Fin d'utilisation" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=11") tab3_floatingObject.append(js_floatingObjects) if ((row['obj_flot_act_sur_obj'] == None) and (row['obj_flot_typ_obj'] != None) and ("perte" != str(row['bouee_inst_act_bou']).lower())): allMessages.append("Le " + str(row["date"]) + " à " + str(row["heure"]) + " ===> Activité sur objet flottant non renseignéé ") except TransmitException as e: allMessages.append(e.message) elif ("déploiement" in str(row['obj_flot_act_sur_obj']).lower()): operation = "renforcement == Visite + Déploiement" tab2_Transmitt = obj_deja_deploy_v23(d_act_bo, js_Transmitts, dico_trams_oper, dico_trams, dico_trams_owner, allData, operation) js_floatingObjects = func_tab3_floatingObject(allData, d_act_obj, dico_objeMat, js_Float, bool_tuple=("true", "true"), argment="code=8") tab3_floatingObject.append(js_floatingObjects) ########### Activite ############ data_activity = hour_group.iloc[0] date = data_activity["date"] last = len(data_log) - 1 if data_activity["heure"] is None: not_time = True js_activitys = js_activity(tab4_catches=list_catches, tab3_floatingObject=tab3_floatingObject, sommeThon=total_weight) if list_catches is not []: if data_activity["commentaire"] is not None: js_activitys["comment"] = data_activity["commentaire"] else: js_activitys["comment"] = "Aucun commentaire" else: js_activitys["comment"] = "Le programme de lecture du livre de bord n’a pas pu \ déterminer le code bateau. Le nom du bateau était " + info_bat['Navire'] if data_activity["heure"] is None: js_activitys["time"] = data_activity["heure"] else: js_activitys["time"] = str(date).replace(" ", "T").replace("00:00:00", "") + str( data_activity["heure"]) + ".000Z" js_activitys["seaSurfaceTemperature"] = data_activity["temp_mer"] js_activitys["windDirection"] = data_activity["vent_dir"] # Verifier si premiere activité et enregistrer if ( ((str(data_activity["date"]).split(" ")[0] == depart_date) and (str(Depart_heure) == str(data_activity["heure"]))) or ("DEP" in data_activity["type_declaration"].upper()) ): if data_activity["lat1"] != None and data_activity["lat2"] != None and \ data_activity["lat3"] != None and data_activity["long1"] != None and \ data_activity["long2"] != None and data_activity["long3"] != None: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data_activity["lat1"], data_activity["lat2"], data_activity["lat3"], data_activity["long1"], data_activity["long2"], data_activity["long3"]) returnMsg = "Position manquante (latitude / longitude): Le " + str(data_activity["date"]).replace( " 00:00:00", " à ") + str(data_activity["heure"]) if checkMsg: allMessages.append(returnMsg) else: js_activitys["latitude"], js_activitys["longitude"] = get_lat_long(allData, info_bat['Depart_Port']) elif ( (index == last) or ("RTP" in data_activity["type_declaration"].upper()) ) : if data_activity["lat1"] != None and data_activity["lat2"] != None and \ data_activity["lat3"] != None and data_activity["long1"] != None and \ data_activity["long2"] != None and data_activity["long3"] != None: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data_activity["lat1"], data_activity["lat2"], data_activity["lat3"], data_activity["long1"], data_activity["long2"], data_activity["long3"]) returnMsg = "Position manquant (latitude / longitude): Le " + str(data_activity["date"]).replace( " 00:00:00", " à ") + str(data_activity["heure"]) if checkMsg: allMessages.append(returnMsg) else: js_activitys["latitude"], js_activitys["longitude"] = get_lat_long(allData, info_bat['Arrivee_Port']) else: js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long(data_activity["lat1"], data_activity["lat2"], data_activity["lat3"], data_activity["long1"], data_activity["long2"], data_activity["long3"]) returnMsg = "Position manquant (latitude / longitude): Le " + str(data_activity["date"]).replace(" 00:00:00", " à ") + str( data_activity["heure"]) if checkMsg: allMessages.append(returnMsg) def schoolType(chaine, dico_code_sch_type): if chaine != None and chaine != "": if ("libre" in chaine.lower()): ## Table SchoolType code 2 return dico_code_sch_type["2"] elif ("objet" in chaine.lower()): ## Table SchoolType code 1 return dico_code_sch_type["1"] elif ("ind" in chaine.lower()): ## Table SchoolType code 0 return dico_code_sch_type["0"] def setCo_setSuc_vess(setCount, setSuccessStatus, vesselActivity): return setCount, setSuccessStatus, vesselActivity if pd.notna(data_activity["calee_type"]): if total_weight != 0: posi_or_null_c = dico_code_setSucc["1"] else: posi_or_null_c = dico_code_setSucc["0"] if ( ("FAR -" in data_activity["type_declaration"].upper()) and ("libre" in data_activity["calee_type"].lower()) ): # Code 6 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys["vesselActivity"] = setCo_setSuc_vess(1, posi_or_null_c, vers_code_6) js_activitys["schoolType"] = schoolType(data_activity["calee_type"], dico_code_sch_type) elif ( ("FAR -" in data_activity["type_declaration"].upper()) and ("objet" in data_activity["calee_type"].lower()) ): # Code 6 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys["vesselActivity"] = setCo_setSuc_vess(1, posi_or_null_c, vers_code_6) js_activitys["schoolType"] = schoolType(data_activity["calee_type"], dico_code_sch_type) elif ( ("FAR -" in data_activity["type_declaration"].upper()) and (data_activity["calee_type"] is None) ): # Code 13 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys["vesselActivity"] = setCo_setSuc_vess(1, dico_code_setSucc["0"], vers_code_13) js_activitys["schoolType"] = schoolType(data_activity["calee_type"], dico_code_sch_type) elif ( ("DEP -" in data_activity["type_declaration"].upper()) or ("RTP -" in data_activity["type_declaration"].upper()) ): # Code 0 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys["vesselActivity"] = setCo_setSuc_vess(None, None, vers_code_0) js_activitys["schoolType"] = None elif ( "FAR0 -" in data_activity["type_declaration"].upper() ): # Code 103 js_activitys["setCount"], js_activitys["setSuccessStatus"], js_activitys["vesselActivity"] = setCo_setSuc_vess(0, None, vers_code_103) js_activitys["schoolType"] = None js_activitys["informationSource"] = id_infoSource js_activitys["dataQuality"] = id_dataQua js_activitys["currentFpaZone"], comment_temp = fpaZone_id(data_activity["zee"], tab_fpa, allData) if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp ObserSys0 = getSome(allData, argment="code=0", moduleName="ObservedSystem")[0]["topiaId"] observedSystem = [ObserSys0] js_activitys["wind"] = get_wind_id_interval(allData, "Wind", data_activity["vent_vit"]) # Récupération des éléments de datas utilisés pour le changement de zone types_decls = hour_group["type_declaration"].str.lower().str[:3] # Repérer COE et COX dans hour_group index_coe = hour_group[types_decls == "coe"].index index_cox = hour_group[types_decls == "cox"].index # Récupération des types_dec présents dans le groupe types_dec = list(types_decls) # Cas d'erreur : plusieurs COX ou plusieurs COE à la même heure if types_dec.count("cox") > 1 or types_dec.count("coe") > 1: data_activity = hour_group.iloc[0] err_message = "Il y a une activité de changement de zone qui semble un peu louche. : Le " + str(data_activity["date"]).replace(" 00:00:00", " à ") + str(data_activity["heure"]) allMessages.append(err_message) print("==> Il y a une activité de changement de zone qui semble un peu louche. ") # Cas général : un COX et un COE présents (changement de zone correct) elif "cox" in types_dec and "coe" in types_dec: ligne_coe = hour_group.loc[index_coe[0]] ligne_cox = hour_group.loc[index_cox[0]] comment_suiv = ligne_cox["type_declaration"] + " ==> " + ligne_coe["type_declaration"] js_activitys["previousFpaZone"], comment_temp = fpaZone_id(ligne_cox["zee"], tab_fpa, allData) js_activitys["nextFpaZone"], comment_temp = fpaZone_id(ligne_coe["zee"], tab_fpa, allData) js_activitys["currentFpaZone"] = None js_activitys["comment"] = comment_suiv if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp js_activitys["vesselActivity"] = vers_code_21 ligne_base = hour_group.loc[min(index_cox[0], index_coe[0])] # on prend la 1e ligne (niveau info GPS) js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long( ligne_base["lat1"], ligne_base["lat2"], ligne_base["lat3"], ligne_base["long1"], ligne_base["long2"], ligne_base["long3"] ) # ajouter la nouvelle activité activite.append(js_activitys) # Reinitialliser les variables nb = nb_prece print(f"Changement de zone standard détecté le {ligne_coe['date']} {ligne_coe['heure']}") # Cas particulier 1 : uniquement COE (entrée de zone) elif "coe" in types_dec and "cox" not in types_dec: ligne_coe = hour_group.loc[index_coe[0]] js_activitys["previousFpaZone"] = getId(allData, "FpaZone", argment="code=XXX*") js_activitys["nextFpaZone"], comment_temp = fpaZone_id(ligne_coe["zee"], tab_fpa, allData) js_activitys["currentFpaZone"] = None js_activitys["comment"] = ligne_coe["type_declaration"] if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp js_activitys["vesselActivity"] = vers_code_21 ligne_base = hour_group.loc[index_coe[0]] # on prend la 1e ligne (niveau info GPS) js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long( ligne_base["lat1"], ligne_base["lat2"], ligne_base["lat3"], ligne_base["long1"], ligne_base["long2"], ligne_base["long3"] ) # ajouter la nouvelle activité activite.append(js_activitys) # Reinitialliser les variables nb = nb_prece print(f"Entrée de zone uniquement le {ligne_coe['date']} {ligne_coe['heure']}") # Cas particulier 2 : uniquement COX (sortie de zone) elif "cox" in types_dec and "coe" not in types_dec: ligne_cox = hour_group.loc[index_cox[0]] js_activitys["previousFpaZone"], comment_temp = fpaZone_id(ligne_cox["zee"], tab_fpa, allData) js_activitys["nextFpaZone"] = getId(allData, "FpaZone", argment="code=XXX*") js_activitys["currentFpaZone"] = None js_activitys["comment"] = ligne_cox["type_declaration"] if (comment_temp != "") and (comment_temp != None): js_activitys["comment"] = js_activitys["comment"] + " # " + comment_temp js_activitys["vesselActivity"] = vers_code_21 ligne_base = hour_group.loc[index_cox[0]] # on prend la 1e ligne (niveau info GPS) js_activitys["latitude"], js_activitys["longitude"], checkMsg = lat_long( ligne_base["lat1"], ligne_base["lat2"], ligne_base["lat3"], ligne_base["long1"], ligne_base["long2"], ligne_base["long3"] ) # ajouter la nouvelle activité activite.append(js_activitys) # Reinitialliser les variables nb = nb_prece print(f"Sortie de zone uniquement le {ligne_cox['date']} {ligne_cox['heure']}") else: activite.append(js_activitys) js_activitys["number"] = int(number) nb += 1 number += 1 js_routeLogbooks = js_routeLogbook(activite) js_routeLogbooks["date"] = str(date).replace(" ", "T") + ".000Z" routes.append(js_routeLogbooks) activite = [] nb = 1 js_contents = js_content(routes, oce, prg) if not_time: js_contents["activitiesAcquisitionMode"] = "BY_NUMBER" else: js_contents["activitiesAcquisitionMode"] = "BY_TIME" # noinspection PyBroadException try: # si plusieurs Rechercher celui qui a le code le plus elévé avec toujours son status == 1 js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'] + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'].upper() + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: js_contents["vessel"] = getId(allData, "Vessel", argment="label2=" + info_bat['Navire'].lower() + "&filters.status=enabled", nbArg=3) if js_contents["vessel"] is None: allMessages.append( "Le nom du Navire n'a pas été trouvé. Veuillez verifier son existance dans la base de données puis corriger dans le livre de bord.") except: pass if info_bat['Depart_Port'] == None: js_contents["departureHarbour"] = getId(allData, "Harbour", argment="code=999") else: resu = getId(allData, "Harbour", argment="label2=" + (info_bat['Depart_Port']).upper()) if resu == None: js_contents["departureHarbour"] = getId(allData, "Harbour", argment="code=999") else: js_contents["departureHarbour"] = resu if info_bat['Arrivee_Port'] == None: js_contents["landingHarbour"] = getId(allData, "Harbour", argment="code=999") else: resu = getId(allData, "Harbour", argment="label2=" + (info_bat['Arrivee_Port']).upper()) if resu == None: js_contents["landingHarbour"] = getId(allData, "Harbour", argment="code=999") else: js_contents["landingHarbour"] = resu if info_bat['Depart_Date'] == None: js_contents["startDate"] = None else: js_contents["startDate"] = info_bat['Depart_Date'] + "T00:00:00.000Z" # "2021-03-02T00:00:00.000Z" # if info_bat['Arrivee_Date'] == None: js_contents["endDate"] = None else: js_contents["endDate"] = info_bat['Arrivee_Date'] + "T00:00:00.000Z" id_cap, id_op, message = cap_obs_sea(allData, info_bat) js_contents["captain"], js_contents["logbookDataEntryOperator"] = id_cap, id_op if message: allMessages.append(message) js_contents["loch"] = info_bat['Arrivee_Loch'] js_contents["homeId"] = str(info_bat["mar_homeId"]) js_contents["observationsProgram"] = None js_contents['logbookComment'] = "NB: Service Web" return allMessages, js_contents