Source code for palangre_syc.json_construction

""" 

Module de fonctions qui permettent la construction du json 
palangre, tel qu'il est envoyé à Observe

"""

# import json
import pandas as pd
import palangre_syc.api
import palangre_syc.views
import palangre_syc.excel_extractions
from datetime import timedelta

[docs] def get_captain_topiaid(df_donnees_p1, allData): """ Fonction qui propose le topiaID associé au capitaine du logbook (ou inconnu is non présent dans les données de référence) Args: df_donnees_p1 (dataframe): page 1 du doc excel allData (json): Données de références Returns: _type_: topiaID du capitaine présenté dans le logbook """ for captain in allData['Person']: captain_logbook = palangre_syc.excel_extractions.extract_cruise_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_cruise_info(df_donnees_p1)['Logbook_name'] == 'Captain', 'Value'].values[0] captain_json = captain['firstName'] + ' ' + captain['lastName'] if captain_logbook == captain_json: return captain['topiaId'] else: captain_logbook = '[inconnu] [inconnu]' if captain_logbook == captain_json: return captain['topiaId'] return None
[docs] def get_operator_topiaid(df_donnees_p1, allData): """ Fonction qui propose le topiaID de la personne qui a saisi les données du logbook (ou inconnu is non présent dans les données de référence) Args: df_donnees_p1 (dataframe): page 1 du doc excel allData (json): Données de références Returns: _type_: topiaID de l'opérateur """ for person in allData['Person']: reported_logbook = palangre_syc.excel_extractions.extract_report_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_report_info( df_donnees_p1)['Logbook_name'] == 'Person reported', 'Value'].values[0] reported_json = person['firstName'] + ' ' + person['lastName'] if reported_logbook == reported_json: return person['topiaId'] else: reported_logbook = '[inconnu] [inconnu]' if reported_logbook == reported_json: return person['topiaId'] return None
[docs] def get_vessel_topiaid(df_donnees_p1, allData): """ Fonction qui propose le topiaId du navire cité dans le logbook à partir de son 'nationlId' s'il existe Args: df_donnees_p1 (dataframe): page 1 du doc excel allData (json): Données de références Returns: _type_: topiaID du navire (vessel) """ vessel_logbook = palangre_syc.excel_extractions.extract_vessel_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_vessel_info(df_donnees_p1)['Logbook_name'] == 'Official Number', 'Value'].values[0] enabled_topiaids = [ vessel["topiaId"] for vessel in allData["Vessel"] if 'nationalId' in vessel and vessel["nationalId"] == vessel_logbook and vessel["status"] == "enabled" and vessel["flagCountry"] == "fr.ird.referential.common.Country#1239832675593#0.3601938043845213" ] if len(enabled_topiaids) > 0: return enabled_topiaids[0] else : return None
[docs] def get_baittype_topiaid(row, allData): """ Fonction qui propose le topiaId de l'appat coché dans le logbook Args: row (dataframe): nom de l'appât allData (json): Données de références Returns: str: topiaID de l'appât utilisé """ baittypes = allData["BaitType"] bait_logbook = row['Logbook_name'] for baittype in baittypes: if baittype.get("label1")[:len(bait_logbook)] == bait_logbook: return baittype["topiaId"]
[docs] def get_species_topiaid(fao_code_logbook, allData): """ Fonction qui propose le topiaId pour une espèce à partir de son code FAO (saisi manuellement dans la trascription du excel) Args: FAO_code_logbook (_type_): Code FAO (3 caractères) extrait du datatable de prises créé depuis la page 1 et 2 allData (json): Données de références Returns: str: topiaID de l'espèce demandée """ species = allData["Species"] for specie in species: if fao_code_logbook == specie.get("faoCode"): return specie["topiaId"] # On part du principe que si le code fao n'est pas exactement trouvé, c'est qu'il s'agit d'une espèce non identifié return "fr.ird.referential.common.Species#1433499266610#0.696541526820511"
[docs] def get_catchfate_topiaid(catchfate_logbook, allData): """ Fonction qui propose le topiaId du devenir de l'espèce (associé manuellement à l'espèce dans la trascription du excel) Args: catchFate_logbook (str): Code catchFate (3 caractères) extrait du datatable de prises créé depuis la page 1 et 2 allData (json): Données de références Returns: str: topiaID du devenir de l'espèce demandée """ fates = allData["CatchFate"] for catchfate in fates: if 'code' in catchfate: if catchfate.get("code") == catchfate_logbook: return catchfate["topiaId"] else : return None
# Opimisation éventuelle : ajouter unparamètre qui permettrait de distinguer les fish des bycatch # notamment si les by catch son relachées A alive ou D dead
[docs] def get_processing_topiaid(fao_code, allData): """ Fonction qui associe un process on board à une espèce de poisson Args: fao_code (str): espèce de poisson allData (json): Données de références Returns: topiaid: OnBoardProcess """ if fao_code == 'SBF' or fao_code == 'BET' or fao_code == 'YFT': processing_code = "GG" elif fao_code == 'SWO' or fao_code == 'MLS' or fao_code == 'BUM' or fao_code == 'BLM' or fao_code == 'SFA' or fao_code == 'SSP': processing_code = "HG" elif fao_code == 'ALB' or fao_code == 'OIL' or fao_code == 'MZZ': processing_code = "WL" else : processing_code = "UNK" processings = allData["OnBoardProcessing"] for processing in processings: if 'code' in processing: if processing.get("code") == processing_code: return processing["topiaId"] else : return None
[docs] def get_target_species_topiaid(df_donnees_p1, allData): """ Fonction qui va récupérer les topiaid de chacune des espèces visées dans une liste Args: df_donnees_p1 (dataframe): page 1 du doc excel allData (json): Données de références Returns: list de topiaid """ data = palangre_syc.excel_extractions.extract_target_species(df_donnees_p1) list_target_topiaid = [] for target in data['Logbook_name']: if 'Tropical Tuna' in target: # list_target_topiaid.loc[len(list_target_topiaid)] = get_species_topiaid("YFT", data_common) list_target_topiaid.append(get_species_topiaid("YFT", allData)) list_target_topiaid.append(get_species_topiaid("BET", allData)) elif 'Albacore Tuna' in target: list_target_topiaid.append(get_species_topiaid("ALB", allData)) elif 'Swordfish' in target: list_target_topiaid.append(get_species_topiaid("SWO", allData)) else: list_target_topiaid.append(get_species_topiaid("MZZ", allData)) return list_target_topiaid
[docs] def construction_catch_table(fish_file): """ Args: fish_file (dataframe): Issu des fonction d'extraction propre à chaque espèce ou groupe d'espèce Returns: dataframe: Construction d'un df avec chaque code FAO et le catchfate associée en lignes """ df_catches = pd.DataFrame(columns=['fao_code', 'catch_fate', 'count', 'totalWeight']) # On récupère les données des colonnes de FAO et catchFate for col in fish_file.columns: fao_code = col[-3:] catchfate = col[-7:-4] df_catches.loc[len(df_catches)] = {'fao_code': fao_code, 'catch_fate': catchfate} # On supprime les doublons df_catches = df_catches.drop_duplicates() df_catches.reset_index(drop=True, inplace=True) return df_catches
# a voir si c'est pertinent en terme de gain de temps de découper la fonction ici en 2 # on pourrait avoir une fonctionn qui gère les lignes issues des noms de colonnes # et une seconde fonction qui remplirait les lignes count et totalWeight en allant chercher les infos dans le excel
[docs] def create_catch_table_fish_perday(fish_file, row_number): """ Args: fish_file (datatable): issu des extraction, donc un datatable par groupe d'espèce row_number (int): ligne (ou un jour de pêche) à extraire Returns: dataframe: par type de poisson pêché et par jour de pêche de 4 colonnes Ce dataframe contient les champs obligatoires à remplir dans la table 'catch' de Observe """ df_catches = construction_catch_table(fish_file) # On rempli la suite du dataframe pour count et totalWeight (pour une ligne donnée) for index, row in df_catches.iterrows(): col_end_name = row['catch_fate'] + ' ' + row['fao_code'] for col in fish_file.columns: if col[-7:] == col_end_name: if col[:2] == 'No': fish_file_colname = 'No' + ' ' + col_end_name count = fish_file.loc[row_number, fish_file_colname] df_catches.loc[index, 'count'] = count # df_catches.loc[index, 'count'] = int(df_catches.loc[index, 'count']) if col[:2] == 'Kg': fish_file_colname = 'Kg' + ' ' + col_end_name total_weight = fish_file.loc[row_number, fish_file_colname] df_catches.loc[index, 'totalWeight'] = total_weight # df_catches.loc[index, 'totalWeight'] = int(df_catches.loc[index, 'totalWeight']) # a voir si on veut des Nan car il n'y a pas de donnée ou des 0 else: df_catches.loc[index, 'totalWeight'] = int(0) return df_catches
[docs] def create_catch_table_fishes(df_donnees_p1, df_donnees_p2, row_number): """ Args: df_donnees_p1 (dataframe): page 1 du doc excel df_donnees_p2 (dataframe): page 2 du doc excel row_number (int): ligne ou jour du set Returns: dataframe: avec les prises réalisées pour une journée de pêche (code FAO, catchFate, nombre de prise et Poids tot) """ liste_fct_extraction = [palangre_syc.excel_extractions.extract_fish_p1(df_donnees_p1), palangre_syc.excel_extractions.extract_bycatch_p2(df_donnees_p2) ] df_catches = pd.DataFrame( columns=['fao_code', 'catch_fate', 'count', 'totalWeight']) for fish_file in liste_fct_extraction: df_per_extraction = create_catch_table_fish_perday( fish_file, row_number) df_catches = pd.concat( [df_catches, df_per_extraction], ignore_index=True) # Tester si les colonnes 'count' et 'totalWeight' contiennent des zéros not_catch = df_catches[(df_catches['count'] == 0) & (df_catches['totalWeight'] == 0)] # Supprimer les lignes qui contiennent des zéros dans ces colonnes df_catches = df_catches.drop(not_catch.index) df_catches.reset_index(drop=True, inplace=True) return df_catches
# TopType et tracelineType sont unknown
[docs] def create_branchline_composition(df_gear): """ Fonction de construction du json pour les branchlineComposition Args: df_donnees_p1 (dataframe): page 1 du doc excel Returns: _type_: le json rempli à partir des infos de mon logbook """ branchlines_composition = [{ 'homeId': None, # 'length': palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1)['Logbook_name'] == 'Set Line length m', 'Value'].values[0], 'length': df_gear.loc[df_gear['Logbook_name'] == 'Branchline length m', 'Value'].values[0], 'proportion': None, 'tracelineLength': None, 'topType': "fr.ird.referential.ll.common.LineType#1239832686157#0.9", 'tracelineType': "fr.ird.referential.ll.common.LineType#1239832686157#0.9", }] return branchlines_composition
[docs] def create_bait_composition(bait_datatable, allData): """ Fonction de construction du json pour les BaitComposition Args: bait_datatable (datatable): datatable non vide 'Baits' construite in views.py allData (json): Données de références Returns: _type_: le json rempli à partir des infos de mon logbook """ total_baits = len(bait_datatable) MultipleBaits = [] for index, row in bait_datatable.iterrows(): BaitsComposition = { "homeId": None, "proportion": 100/total_baits, "individualSize": None, "individualWeight": None, "baitSettingStatus": None, "baitType": get_baittype_topiaid(row, allData), } MultipleBaits.append(BaitsComposition) return MultipleBaits
[docs] def create_floatline_composition(df_gear, df_line): """ Fonction de construction du json pour les FloatlineComposition Args: df_donnees_p1 (dataframe): page 1 du doc excel Returns: _type_: le json rempli à partir des infos de mon logbook """ Multiplefloatlines_composition = [] if (len(df_line) >= 1) : for (row) in df_line.iterrows(): if row[1]["Value"] != "": floatlines_composition = { "homeId": None, "length": df_gear.loc[df_gear['Logbook_name'] == 'Floatline length m', 'Value'].values[0], "proportion": 100/len(df_line), "lineType": create_lineType(row[1]["Logbook_name"]) } Multiplefloatlines_composition.append(floatlines_composition) return Multiplefloatlines_composition else : floatlines_composition = [{ "homeId": None, "length": df_gear.loc[df_gear['Logbook_name'] == 'Floatline length m', 'Value'].values[0], "proportion": 100, "lineType": "fr.ird.referential.ll.common.LineType#1239832686157#0.9" }] return floatlines_composition
[docs] def create_lineType(logbook_lineType): """ Fonction de recherche de la line type dans le référentiel Args: logbook_lineType: l'élement coché du logbook (e.g. "braided nylon") Returns: lineType: le topiaId de la ligne """ # if (len(df_line) == 1) : # logbook_lineType = df_line.loc[df_line["Value"] != "", "Logbook_name"].values[0] # if contains "thick" == PV if "thick" in logbook_lineType.lower(): lineType = "fr.ird.referential.ll.common.LineType#1707486846969#0.09086405093041561" # # if contains "thin" == PR elif "thin" in logbook_lineType.lower(): lineType = "fr.ird.referential.ll.common.LineType#1707486754220#0.7999222136319315" # # if contains "braid" == BRL elif "braid" in logbook_lineType.lower(): lineType = "fr.ird.referential.ll.common.LineType#1239832686157#0.6" # if contains "mono" == MON elif "mono" in logbook_lineType.lower(): lineType = "fr.ird.referential.ll.common.LineType#1239832686157#0.1" # else == UNK else: lineType = "fr.ird.referential.ll.common.LineType#1239832686157#0.9" # # si on a plusieurs lignes de cochées # else: # lineType = "fr.ird.referential.ll.common.LineType#1239832686157#0.9" return lineType
# peut etre ajouter le healthStatus
[docs] def create_catches(datatable, allData): """ Fonction de construction du json pour les catches Args: datatable (datatable): datatable créé pour une journée / un set allData (json): Données de références Returns: _type_: le json rempli à partir des infos de mon logbook """ MultipleCatches = [] for n_ligne_datatable in range(len(datatable)): catches = {"homeId": None, } if get_species_topiaid(datatable.loc[n_ligne_datatable, 'fao_code'], allData) == 'fr.ird.referential.common.Species#1433499266610#0.696541526820511' or get_species_topiaid(datatable.loc[n_ligne_datatable, 'fao_code'], allData) == 'fr.ird.referential.common.Species#1239832685020#0.7691470969492022': catches.update({"comment": "Other fish non specified", }) else: catches.update({"comment": None, }) catches.update({"count": datatable.loc[n_ligne_datatable, 'count'], "totalWeight": datatable.loc[n_ligne_datatable, 'totalWeight'], "hookWhenDiscarded": None, "depredated": None, "beatDiameter": None, "photoReferences": None, "number": None, "acquisitionMode": 1, "countDepredated": None, "depredatedProportion": None, "tagNumber": None, "catchFate": get_catchfate_topiaid(datatable.loc[n_ligne_datatable, 'catch_fate'], allData), "discardHealthStatus": None, "species": get_species_topiaid(datatable.loc[n_ligne_datatable, 'fao_code'], allData), "predator": [], "catchHealthStatus": None, "onBoardProcessing": get_processing_topiaid(datatable.loc[n_ligne_datatable, 'fao_code'], allData), "weightMeasureMethod": None }) MultipleCatches.append(catches) return MultipleCatches
[docs] def create_starttimestamp(df_donnees_p1, allData, index_day, need_hour=bool): """ Fonction qui permet d'avoir le bon format de date-time pour envoyer le json Args: df_donnees_p1 (_type_): ma page excel 1 allData (json): Données de références index_day (int): le numero de la ligne de mon datatable need_hour (bool) : si true - on va chercher l'heure correspondante dans le datatable, si false - on ajoute '00:00:00' cad que le bateau n'est pas en train de pêcher donc il nous faut une horaire juste pour convenir au format demandé Returns: _type_: la datetime au format qui permet l'insersion dans la bdd """ if need_hour is True: time_ = palangre_syc.excel_extractions.extract_time(df_donnees_p1, allData).loc[index_day, 'Time'] else: time_ = '00:00:00' date_formated = '{}-{:02}-{:02}T{}.000Z'.format( palangre_syc.excel_extractions.extract_logbook_date(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_logbook_date( df_donnees_p1)['Logbook_name'] == 'Year', 'Value'].values[0], palangre_syc.excel_extractions.extract_logbook_date(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_logbook_date( df_donnees_p1)['Logbook_name'] == 'Month', 'Value'].values[0], palangre_syc.excel_extractions.extract_time(df_donnees_p1, allData).loc[index_day, 'Day'], time_) return date_formated
[docs] def create_starttimestamp_from_field_date(date): """ Fonction qui permet d'avoir le bon format de date-time pour envoyer le json Args: date: issue du input Returns: datetime: pour stratDate et endDAte """ date_formated = '{}-{:02}-{:02}T{}.000Z'.format(int(date[:4]), int(date[5:7]), int(date[-2:]), '00:00:00') return date_formated
[docs] def search_date_into_json(json_previoustrip, date_to_look_for): """ Fonction qui cherche une date est présente dans un précédent trip (json file) Args: json_previoustrip (json): du précédent trip qu'on veut continuer date_to_look_for (date): aaaa-mm-jj Returns: bool: True si la date est dans le json, False sinon """ for content in json_previoustrip: for activity in content['activityLogbook'] : start_time = activity.get('startTimeStamp') if start_time and start_time.startswith(date_to_look_for) : return True return False
[docs] def create_activity_and_set(df_donnees_p1, df_donnees_p2, allData, start_extraction, end_extraction, context): """ Fonction qui créé les activités et les set selon le format json attendu dans la base de données Observe Args: df_donnees_p1 (dataframe): page 1 du logbook excel df_donnees_p2 (dataframe): page 2 du logbook excel allData (json): Données de références start_extraction (int): numéro qui indique la ligne du logbook à partir de laquelle on commence à remplir le json (0 si on commence au 1er jour, 5 si la marée commence au 6 du mois) end_extraction (int): numéro qui indique la ligne du logbook à laquelle on arrête de remplir le json (len(excel_p1) si on considère le logbook entier, 15 si la marée s'arrête au 16 du mois) Returns: json: des activités et set pour la période et le logbook soumis par l'utilisateur """ ############################# # messages d'erreurs if isinstance(palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1), tuple): df_gear, _ = palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1) else: df_gear = palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1) # mais pour l'instant on ne traite pas cette info anyways if isinstance(palangre_syc.excel_extractions.extract_line_material(df_donnees_p1), tuple): df_line, _ = palangre_syc.excel_extractions.extract_line_material(df_donnees_p1) else: df_line = palangre_syc.excel_extractions.extract_line_material(df_donnees_p1) ############################# MultipleActivity = [] for i in range(start_extraction, end_extraction): set = { 'homeId': None, 'comment': None, 'number': None, 'basketsPerSectionCount': None, 'branchlinesPerBasketCount': palangre_syc.excel_extractions.extract_fishing_effort(df_donnees_p1).loc[i, 'Hooks per basket'], 'totalSectionsCount': None, 'totalBasketsCount': palangre_syc.excel_extractions.extract_fishing_effort(df_donnees_p1).loc[i, 'Total hooks / Hooks per basket'], 'totalHooksCount': palangre_syc.excel_extractions.extract_fishing_effort(df_donnees_p1).loc[i, 'Total hooks'], 'totalLightsticksCount': palangre_syc.excel_extractions.extract_fishing_effort(df_donnees_p1).loc[i, 'Total lightsticks'], 'weightedSnap': False, 'snapWeight': None, 'weightedSwivel': False, 'swivelWeight': None, 'timeBetweenHooks': None, 'shooterUsed': False, 'shooterSpeed': None, 'maxDepthTargeted': None, } set.update({'settingStartTimeStamp': create_starttimestamp(df_donnees_p1, allData, index_day=i, need_hour=True)}) set.update({'settingStartLatitude': palangre_syc.excel_extractions.extract_positions(df_donnees_p1).loc[i, 'Latitude'], 'settingStartLongitude': palangre_syc.excel_extractions.extract_positions(df_donnees_p1).loc[i, 'Longitude'], 'settingEndTimeStamp': None, 'settingEndLatitude': None, 'settingEndLongitude': None, 'settingVesselSpeed': None, 'haulingDirectionSameAsSetting': None, 'haulingStartTimeStamp': None, 'haulingStartLatitude': None, 'haulingStartLongitude': None, 'haulingEndTimeStamp': None, 'haulingEndLatitude': None, 'haulingEndLongitude': None, 'haulingBreaks': None, 'monitored': False, # En fait "totalLineLength" serait de plusierus km, ce qui ne correspond pas avec le champ "Set Line length m" 'totalLineLength' : palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_gear_info(df_donnees_p1)['Logbook_name'] == 'Set Line length m', 'Value'].values[0], 'basketLineLength': None, 'lengthBetweenBranchlines': df_gear.loc[df_gear['Logbook_name'] == 'Length between branches m', 'Value'].values[0] }) bait_datatable = palangre_syc.excel_extractions.extract_bait(df_donnees_p1) set.update({'baitsComposition': create_bait_composition(bait_datatable, allData),}) set.update({'floatlinesComposition': create_floatline_composition(df_gear, df_line), 'hooksComposition': [], 'settingShape': None, }) datatable = create_catch_table_fishes( df_donnees_p1, df_donnees_p2, row_number=i) set.update({ 'catches': create_catches(datatable, allData), }) if (len(df_line) == 1) : set.update({'lineType': create_lineType(df_line.loc[df_line["Value"] != "", "Logbook_name"].values[0]), }) else: set.update({'lineType': None, }) set.update({ 'lightsticksUsed': False, 'lightsticksType': None, 'lightsticksColor': None, 'mitigationType': [], 'branchlinesComposition': create_branchline_composition(df_gear) }) activity = { 'homeId': None, 'comment': None, } if palangre_syc.excel_extractions.extract_time(df_donnees_p1, allData).loc[i, 'VesselActivity'] == 'fr.ird.referential.ll.common.VesselActivity#1239832686138#0.1': activity.update({'startTimeStamp': create_starttimestamp( df_donnees_p1, allData, index_day=i, need_hour=True)}) else: activity.update({'startTimeStamp': create_starttimestamp(df_donnees_p1, allData, index_day=i, need_hour=False) # 'startTimeStamp' : '2022-07-26T00:00:00.000Z' , }) activity.update({'endTimeStamp': None, 'latitude': palangre_syc.excel_extractions.extract_positions(df_donnees_p1).loc[i, 'Latitude'], 'longitude': palangre_syc.excel_extractions.extract_positions(df_donnees_p1).loc[i, 'Longitude'], 'seaSurfaceTemperature': palangre_syc.excel_extractions.extract_temperature(df_donnees_p1).loc[i, 'Temperature'], 'wind': None, 'windDirection': None, 'currentSpeed': None, 'currentDirection': None,}) if (context['at_port_checkbox'] == "true"): activity.update({'vesselActivity' : 'fr.ird.referential.ll.common.VesselActivity#666#03',}) elif ((context['continuetrip'] == None) and (i == start_extraction)): activity.update({'vesselActivity' : 'fr.ird.referential.ll.common.VesselActivity#666#03',}) else: activity.update({'vesselActivity': palangre_syc.excel_extractions.extract_time(df_donnees_p1, allData).loc[i, 'VesselActivity'], }) activity.update({'dataQuality': None, 'fpaZone': None, 'relatedObservedActivity': None, }) if activity.get('vesselActivity') == 'fr.ird.referential.ll.common.VesselActivity#1239832686138#0.1': activity.update({'set': set, }) else: activity.update({ 'set': None, 'sample': None }) MultipleActivity.append(activity) return MultipleActivity
[docs] def create_trip(df_donnees_p1, MultipleActivity, allData, context): """ Fonction qui créé un trip selon le format json attendu dans la base de données Observe (avec éventuellement les information d'un précédent trip si l'utilisateur update un trip existant) Args: df_donnees_p1 (dataframe): page 1 du logbook excel MultipleActivity (json): Inofrmations de sortie de la fonction "create_activity_and_set(df_donnees_p1, df_donnees_p2, allData, start_extraction, end_extraction)" allData (json): Données de références context (dict): infrormation concernant startDate, endDate, depPort, endPort saisies par l'utilisateur, mais aussi les information du trip à modifier / continuer si l'utilisateur choisi de continuer un trip existant Returns: json: trip """ # Dans le trip on a fixé : # tripType = Marée de pêche commerciale # observer = unknown car information non présente sur le logbook # species semble être TargetSpecies - a voir si on développe trip = { 'homeId': None, 'startDate': context['startDate'], 'endDate': context['endDate'], 'noOfCrewMembers': palangre_syc.excel_extractions.extract_cruise_info(df_donnees_p1).loc[palangre_syc.excel_extractions.extract_cruise_info(df_donnees_p1)['Logbook_name'] == 'No Of Crew', 'Value'].values[0], 'ersId': None, 'gearUseFeatures': None, 'activityObs': None, 'activityLogbook': MultipleActivity, 'landing': None, 'sample': None, 'tripType': 'fr.ird.referential.ll.common.TripType#1464000000000#02', 'observationMethod': None, 'observer': 'fr.ird.referential.common.Person#1254317601353#0.6617065204572095', 'vessel': get_vessel_topiaid(df_donnees_p1, allData), 'observationsProgram': None, 'logbookProgram': context['programtopiaid'], 'captain': get_captain_topiaid(df_donnees_p1, allData), 'observationsDataEntryOperator': None, 'logbookDataEntryOperator': get_operator_topiaid(df_donnees_p1, allData), 'sampleDataEntryOperator': None, 'landingDataEntryOperator': None, 'ocean': context['oceantopiaid'], 'departureHarbour': context['depPort'], 'landingHarbour': context['endPort'], 'observationsDataQuality': None, 'logbookDataQuality': None, 'generalComment': None, 'observationsComment': None, 'logbookComment': None, 'species': get_target_species_topiaid(df_donnees_p1, allData), 'observationsAvailability': False, 'logbookAvailability': True, } return trip
[docs] def remove_keys(obj, keys_to_remove): if isinstance(obj, dict): for key in keys_to_remove: obj.pop(key, None) for value in obj.values(): remove_keys(value, keys_to_remove) elif isinstance(obj, list): for item in obj: remove_keys(item, keys_to_remove) return obj
[docs] def replace_null_false_true(obj): if isinstance(obj, dict): return {key: replace_null_false_true(value) for key, value in obj.items()} elif isinstance(obj, list): return [replace_null_false_true(item) for item in obj] elif obj == "null": return None elif obj == "true": return True elif obj == "false": return False else: return obj