def create_dataset_user(user): """ After dataset validation, add a personnal AF and JDD so the user can add new user. """ af_desc_and_name = "Cadre d'acquisition personnel de {name} {surname}".format( name=user["nom_role"], surname=user["prenom_role"]) # actor = data productor af_productor = CorAcquisitionFrameworkActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "6"), ) af_contact = CorAcquisitionFrameworkActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "1"), ) new_af = TAcquisitionFramework( acquisition_framework_name=af_desc_and_name, acquisition_framework_desc=af_desc_and_name + " - auto-créé via la demande de création de compte", acquisition_framework_start_date=datetime.datetime.now(), ) new_af.cor_af_actor = [af_productor, af_contact] DB.session.add(new_af) DB.session.commit() ds_desc_and_name = "Jeu de données personnel de {name} {surname}".format( name=user["nom_role"], surname=user["prenom_role"]) ds_productor = CorDatasetActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "6"), ) ds_contact = CorDatasetActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "1"), ) # add new JDD: terrestrial and marine = True as default new_dataset = TDatasets( id_acquisition_framework=new_af.id_acquisition_framework, dataset_name=ds_desc_and_name, dataset_shortname=ds_desc_and_name + " - auto-créé via la demande de création de compte", dataset_desc=ds_desc_and_name, marine_domain=True, terrestrial_domain=True, ) new_dataset.cor_dataset_actor = [ds_productor, ds_contact] DB.session.add(new_dataset) DB.session.commit()
def post_acquisition_framework(): data = dict(request.get_json()) cor_af_actor = data.pop('cor_af_actor') cor_objectifs = data.pop('cor_objectifs') cor_volets_sinp = data.pop('cor_volets_sinp') af = TAcquisitionFramework(**data) for cor in cor_af_actor: af.cor_af_actor.append(CorAcquisitionFrameworkActor(**cor)) if cor_objectifs is not None: objectif_nom = DB.session.query(TNomenclatures).filter( TNomenclatures.id_nomenclature.in_(cor_objectifs)).all() for obj in objectif_nom: af.cor_objectifs.append(obj) if cor_volets_sinp is not None: volet_nom = DB.session.query(TNomenclatures).filter( TNomenclatures.id_nomenclature.in_(cor_volets_sinp)).all() for volet in volet_nom: af.cor_volets_sinp.append(volet) if af.id_acquisition_framework: DB.session.merge(af) else: DB.session.add(af) DB.session.commit() return af.as_dict()
def create_af(creator=None): with db.session.begin_nested(): af = TAcquisitionFramework(acquisition_framework_name='test', acquisition_framework_desc='test', creator=creator) db.session.add(af) if creator and creator.organisme: actor = CorAcquisitionFrameworkActor( organism=creator.organisme, nomenclature_actor_role=principal_actor_role) af.cor_af_actor.append(actor) return af
def post_acquisition_framework(uuid=None, id_user=None, id_organism=None): """ Post an acquisition framwork from MTD XML""" xml_af = None xml_af = get_acquisition_framework(uuid) if xml_af: acquisition_framwork = parse_acquisition_framwork_xml(xml_af) new_af = TAcquisitionFramework(**acquisition_framwork) actor = CorAcquisitionFrameworkActor( id_role=id_user, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(actor) if id_organism: organism = CorAcquisitionFrameworkActor( id_organism=id_organism, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(organism) # check if exist id_acquisition_framework = TAcquisitionFramework.get_id(uuid) try: if id_acquisition_framework: new_af.id_acquisition_framework = id_acquisition_framework[0] DB.session.merge(new_af) else: DB.session.add(new_af) DB.session.commit() # TODO catch db error ? except SQLAlchemyError as e: DB.session.rollback() error_msg = """ Error posting an aquisition framework {} \n\n Trace: \n {} """.format(uuid, e) log.error(error_msg) return new_af.as_dict() return {'message': 'Not found'}, 404
def post_acquisition_framework(info_role): """ Post a dataset .. :quickref: Metadata; """ if info_role.value_filter == "0": raise InsufficientRightsError( ('User "{}" cannot "{}" a dataset').format( info_role.id_role, info_role.code_action ), 403, ) data = dict(request.get_json()) cor_af_actor = data.pop("cor_af_actor") cor_objectifs = data.pop("cor_objectifs") cor_volets_sinp = data.pop("cor_volets_sinp") af = TAcquisitionFramework(**data) for cor in cor_af_actor: # remove id_cda if None otherwise merge no working well if "id_cafa" in cor and cor["id_cafa"] is None: cor.pop("id_cafa") af.cor_af_actor.append(CorAcquisitionFrameworkActor(**cor)) if cor_objectifs is not None: objectif_nom = ( DB.session.query(TNomenclatures) .filter(TNomenclatures.id_nomenclature.in_(cor_objectifs)) .all() ) for obj in objectif_nom: af.cor_objectifs.append(obj) if cor_volets_sinp is not None: volet_nom = ( DB.session.query(TNomenclatures) .filter(TNomenclatures.id_nomenclature.in_(cor_volets_sinp)) .all() ) for volet in volet_nom: af.cor_volets_sinp.append(volet) if af.id_acquisition_framework: DB.session.merge(af) else: af.id_digitizer = info_role.id_role DB.session.add(af) DB.session.commit() return af.as_dict()
def create_cor_object_actors(actors, new_object): """ Create a new cor_dataset_actor/cor_acquisition_framework_actor object for the JDD/AF Input : actors (list) : List of all actors related to the JDD/AF new_object : JDD or AF """ for act in actors: # person = None # id_person = None org = None id_organism = None # For the moment wo do not match the user with the actor provided by the XML -> only the organism # If the email of the contact Person was provided in the XML file, we try to link him to the t_role table # if act["email"]: # # We first check if the Person's email exists in the t_role table # person = ( # DB.session.query(User) # .filter(User.email == act["email"]) # .first() # ) # # If not, we create it as a new Person in the t_role table and get his ID back # if not person: # if act["uuid_organism"]: # org = ( # DB.session.query(BibOrganismes) # .filter(BibOrganismes.uuid_organisme == act["uuid_organism"]) # .first() # ) # person = { # "id_role": None, # "nom_role": act["name"], # "email": act["email"], # } # if org: # person['id_organisme'] = org.id_organisme # resp = users.insert_role(person) # id_person = json.loads(resp.data.decode('utf-8'))['id_role'] # else: # id_person = person.id_role # If the informations about the Organism is provided, we try to link it to the bib_organismes table if act["uuid_organism"] or act["organism"]: # UUID in actually only present on JDD XML files # Filter on UUID is preferable if available since it avoids dupes based on name changes if act["uuid_organism"]: org = (DB.session.query(BibOrganismes).filter( BibOrganismes.uuid_organisme == act["uuid_organism"]).first()) else: org = (DB.session.query(BibOrganismes).filter( BibOrganismes.nom_organisme == act["organism"]).first()) # If no Organism was corresponding in the bib_organismes table, we add it if not org: org = BibOrganismes( **{ "nom_organisme": act["organism"], "uuid_organisme": act["uuid_organism"], }) DB.session.add(org) DB.session.commit() id_organism = org.id_organisme # With at least the Person or the Organism was provided for the actor in the XML file, # we build the data for the correlation if id_organism: dict_cor = { "id_organism": id_organism, "id_nomenclature_actor_role": func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", act["actor_role"]), } # We finally build the correlation corresponding to the JDD/AF if isinstance(new_object, TAcquisitionFramework): if not any( map( lambda cafa: dict_cor['id_organism'] == cafa. id_organism and act['actor_role'] == cafa. id_nomenclature_actor_role.clauses.clauses[ 1].value, new_object.cor_af_actor)): cor_actor = CorAcquisitionFrameworkActor(**dict_cor) new_object.cor_af_actor.append(cor_actor) elif isinstance(new_object, TDatasets): if not any( map( lambda ca: dict_cor['id_organism'] == ca. id_organism and act['actor_role'] == ca. id_nomenclature_actor_role.clauses.clauses[ 1].value, new_object.cor_dataset_actor)): cor_actor = CorDatasetActor(**dict_cor) new_object.cor_dataset_actor.append(cor_actor)
def create_dataset_user(user): """ After dataset validation, add a personnal AF and JDD so the user can add new user. """ af_desc_and_name = "Cadre d'acquisition personnel de {name} {surname}".format( name=user["nom_role"], surname=user["prenom_role"]) # actor = data productor af_productor = CorAcquisitionFrameworkActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "6"), ) af_contact = CorAcquisitionFrameworkActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "1"), ) new_af = TAcquisitionFramework( acquisition_framework_name=af_desc_and_name, acquisition_framework_desc=af_desc_and_name + " - auto-créé via la demande de création de compte", acquisition_framework_start_date=datetime.datetime.now(), ) new_af.cor_af_actor = [af_productor, af_contact] db.session.add(new_af) ds_desc_and_name = "Jeu de données personnel de {name} {surname}".format( name=user["nom_role"], surname=user["prenom_role"]) ds_productor = CorDatasetActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "6"), ) ds_contact = CorDatasetActor( id_role=user["id_role"], id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature( "ROLE_ACTEUR", "1"), ) # add new JDD: terrestrial and marine = True as default new_dataset = TDatasets( acquisition_framework=new_af, dataset_name=ds_desc_and_name, dataset_shortname=ds_desc_and_name + " - auto-créé via la demande de création de compte", dataset_desc=ds_desc_and_name, marine_domain=True, terrestrial_domain=True, ) new_dataset.cor_dataset_actor = [ds_productor, ds_contact] db.session.add(new_dataset) for module_code in current_app.config['ACCOUNT_MANAGEMENT'][ 'DATASET_MODULES_ASSOCIATION']: module = TModules.query.filter_by( module_code=module_code).one_or_none() if module is None: warn("Module code '{}' does not exist, can not associate dataset.". format(module_code)) continue new_dataset.modules.append(module) db.session.commit()
def post_acquisition_framework(uuid=None, id_user=None, id_organism=None): """ Post an acquisition framwork from MTD XML Params: uuid (str): uuid of the acquisition framework id_user (int): the id of the user connected via CAS id_organism (int): the id of the organism user via CAS """ xml_af = None xml_af = get_acquisition_framework(uuid) if xml_af: acquisition_framwork = parse_acquisition_framwork_xml(xml_af) new_af = TAcquisitionFramework(**acquisition_framwork) id_acquisition_framework = TAcquisitionFramework.get_id(uuid) # if the CA already exist in the DB if id_acquisition_framework: # check if actor role not already exist for this CA actor_role = CorAcquisitionFrameworkActor.get_actor( id_acquisition_framework=id_acquisition_framework, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1'), id_role=id_user) # if no actor push it if actor_role is None: actor = CorAcquisitionFrameworkActor( id_role=id_user, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1')) new_af.cor_af_actor.append(actor) # # check if actor role not already exist for this CA actor_organism = None if id_organism: actor_organism = CorAcquisitionFrameworkActor.get_actor( id_acquisition_framework=id_acquisition_framework, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1'), id_organism=id_organism) if actor_organism is None: organism = CorAcquisitionFrameworkActor( id_organism=id_organism, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1')) new_af.cor_af_actor.append(organism) # finnaly merge the CA new_af.id_acquisition_framework = id_acquisition_framework DB.session.merge(new_af) #its a new AF else: actor = CorAcquisitionFrameworkActor( id_role=id_user, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1')) new_af.cor_af_actor.append(actor) if id_organism: organism = CorAcquisitionFrameworkActor( id_organism=id_organism, id_nomenclature_actor_role=func.ref_nomenclatures. get_id_nomenclature('ROLE_ACTEUR', '1')) new_af.cor_af_actor.append(organism) # Add the new CA DB.session.add(new_af) # try to commit try: DB.session.commit() # TODO catch db error ? except SQLAlchemyError as e: DB.session.flush() DB.session.rollback() error_msg = """ Error posting an aquisition framework {} \n\n Trace: \n {} """.format(uuid, e) log.error(error_msg) return new_af.as_dict() return {'message': 'Not found'}, 404
def post_acquisition_framework(uuid=None, id_user=None, id_organism=None): """ Post an acquisition framwork from MTD XML Params: uuid (str): uuid of the acquisition framework id_user (int): the id of the user connected via CAS id_organism (int): the id of the organism user via CAS """ xml_af = None xml_af = get_acquisition_framework(uuid) if xml_af: acquisition_framwork = parse_acquisition_framwork_xml(xml_af) new_af = TAcquisitionFramework(**acquisition_framwork) id_acquisition_framework = TAcquisitionFramework.get_id(uuid) # if the CA already exist in the DB if id_acquisition_framework: # check if actor role not already exist for this CA actor_role = CorAcquisitionFrameworkActor.get_actor( id_acquisition_framework=id_acquisition_framework, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1'), id_role=id_user ) # if no actor push it if actor_role is None: actor = CorAcquisitionFrameworkActor( id_role=id_user, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(actor) # # check if actor role not already exist for this CA actor_organism = None if id_organism: actor_organism = CorAcquisitionFrameworkActor.get_actor( id_acquisition_framework=id_acquisition_framework, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1'), id_organism=id_organism ) if actor_organism is None: organism = CorAcquisitionFrameworkActor( id_organism=id_organism, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(organism) # finnaly merge the CA new_af.id_acquisition_framework = id_acquisition_framework DB.session.merge(new_af) #its a new AF else: actor = CorAcquisitionFrameworkActor( id_role=id_user, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(actor) if id_organism: organism = CorAcquisitionFrameworkActor( id_organism=id_organism, id_nomenclature_actor_role=func.ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR', '1') ) new_af.cor_af_actor.append(organism) # Add the new CA DB.session.add(new_af) # try to commit try: DB.session.commit() # TODO catch db error ? except SQLAlchemyError as e: DB.session.flush() DB.session.rollback() error_msg = """ Error posting an aquisition framework {} \n\n Trace: \n {} """.format(uuid, e) log.error(error_msg) return new_af.as_dict() return {'message': 'Not found'}, 404