diff --git a/models/res_partner.py b/models/res_partner.py index a5260bdf31c0d95ec634faf26eab4385fc787887..2afba025125c37b6491e0b162e73a990da65113b 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -95,35 +95,36 @@ class ResPartner(models.Model): UTILS: renvoi l objet etablissement du siege """ # check si l etablissement principal est le siege - ets_prin = inpi_data.formality.content.personneMorale.etablissementPrincipal + if inpi_data.formality.content.personneMorale: + ets_prin = inpi_data.formality.content.personneMorale.etablissementPrincipal - if ( - ets_prin - and ets_prin.descriptionEtablissement.rolePourEntreprise - == inpi_models.RolePourEntreprise.SIEGE_ETS_PRIN.value - ): - return ets_prin - - # si l etablissement pricipal n est pas le siege, - # on cherche parmi les secondaires - ets_secondaires = ( - inpi_data.formality.content.personneMorale.autresEtablissements - ) - - for ets in ets_secondaires: if ( - ets.descriptionEtablissement.rolePourEntreprise - == inpi_models.RolePourEntreprise.SIEGE.value + ets_prin + and ets_prin.descriptionEtablissement.rolePourEntreprise + == inpi_models.RolePourEntreprise.SIEGE_ETS_PRIN.value ): - return ets + return ets_prin - # si dissolution on renvoi l adresse du siege fermé - for ets in ets_secondaires: - if ( - ets.descriptionEtablissement.rolePourEntreprise - == inpi_models.RolePourEntreprise.SIEGE_FERME.value - ): - return ets + # si l etablissement pricipal n est pas le siege, + # on cherche parmi les secondaires + ets_secondaires = ( + inpi_data.formality.content.personneMorale.autresEtablissements + ) + + for ets in ets_secondaires: + if ( + ets.descriptionEtablissement.rolePourEntreprise + == inpi_models.RolePourEntreprise.SIEGE.value + ): + return ets + + # si dissolution on renvoi l adresse du siege fermé + for ets in ets_secondaires: + if ( + ets.descriptionEtablissement.rolePourEntreprise + == inpi_models.RolePourEntreprise.SIEGE_FERME.value + ): + return ets return None # -------------------------------------------------- @@ -174,6 +175,9 @@ class ResPartner(models.Model): MAJ denomination """ logger.info(_(f"Update denomination for {self.name}: {self.siren}")) + if not inpi_data.formality.content.personneMorale: + return self._get_current_period() + inpi_name = ( inpi_data.formality.content.personneMorale.identite.entreprise.denomination ) @@ -205,6 +209,8 @@ class ResPartner(models.Model): MAJ code naf """ logger.info(_(f"Update code naf for {self.name}: {self.siren}")) + if not inpi_data.formality.content.personneMorale: + return self._get_current_period() inpi_naf_id = self._get_inpi_naf_id( inpi_data.formality.content.personneMorale.identite.entreprise.codeApe ) @@ -280,13 +286,14 @@ class ResPartner(models.Model): """ UTILS: get facility data from siret """ - inpi_facilities = ( - inpi_data.formality.content.personneMorale.autresEtablissements - ) - if inpi_facilities: - for facility in inpi_facilities: - if facility.descriptionEtablissement.siret == siret: - return facility + if inpi_data.formality.content.personneMorale: + inpi_facilities = ( + inpi_data.formality.content.personneMorale.autresEtablissements + ) + if inpi_facilities: + for facility in inpi_facilities: + if facility.descriptionEtablissement.siret == siret: + return facility return None def _update_facility(self, inpi_facility, facility): @@ -331,9 +338,11 @@ class ResPartner(models.Model): Les nouveaux sont créées on ne fait rien pour ceux qui ne sont plus dans INPI """ logger.info(_(f"Update etablissement for {self.name}: {self.siren}")) - inpi_facilities = ( - inpi_data.formality.content.personneMorale.autresEtablissements - ) + inpi_facilities = None + if inpi_data.formality.content.personneMorale: + inpi_facilities = ( + inpi_data.formality.content.personneMorale.autresEtablissements + ) facilities_not_in_inpi = [] if inpi_facilities: @@ -386,7 +395,7 @@ class ResPartner(models.Model): Les dirigants sont créées via le modele cgscop.inpi.director """ logger.info(_(f"Update dirigeants for {self.name}: {self.siren}")) - if inpi_data.formality.content.personneMorale.composition: + if inpi_data.formality.content.personneMorale and inpi_data.formality.content.personneMorale.composition: inpi_pouvoirs = ( inpi_data.formality.content.personneMorale.composition.pouvoirs ) diff --git a/wizard/inpi_update_wizard.py b/wizard/inpi_update_wizard.py index 2c80017d7640a19556c7aef2596495c7cf07d8f8..81ef213537ca406b7d295e65dae37a2a79d77ceb 100644 --- a/wizard/inpi_update_wizard.py +++ b/wizard/inpi_update_wizard.py @@ -1,9 +1,7 @@ # © 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from odoo import fields, models - class InpiUpdateWizard(models.TransientModel): _name = "inpi.update.wizard" _description = "Update inpi wizard" @@ -30,6 +28,8 @@ class InpiUpdateWizard(models.TransientModel): def update(self): + rate_limit_max_by_minute = 100 + if self.all_scop == "all": scop_to_update = self.env["res.partner"].search( [ @@ -42,7 +42,12 @@ class InpiUpdateWizard(models.TransientModel): else: scop_to_update = self.partner_ids - for scop in scop_to_update: + # due to rate limit we launch batch of queue every minute + eta = 1 + for nb_jobs, scop in enumerate(scop_to_update): + if nb_jobs and nb_jobs % rate_limit_max_by_minute == 0: + eta += 60 scop.sudo().with_delay( - description=f"Mise à jours INPI: {scop.name}" + description=f"Mise à jours INPI: {scop.name}", eta=eta ).update_from_inpi(update_type="all") +