Erreur "Module import failed for Portal User"

Bonjour,
J’ai essayé de migrer Dokos de la v3 vers la v4 et j’ai le message d’erreur suivant :

Sauriez-vous d’où cela peut venir ?

Yann B.

Bonjour @Yann, qu’affiche la commande suivante ?

bench version -f table

L’erreur en question se produit si l’application Dokos (erpnext) n’est pas installée sur le bench/site.

Voici le résultat:
image

Éventuellement essayer bench install-app erpnext avant de réessayer la mise à jour. Mais ça me paraît étrange que l’application ne soit pas considérée comme installée.

Bonjour,
J’ai restauré une version plus ancienne mais maintenant je me retrouve avec cette erreur :

J’avais personnalisé l’entité client en ajoutant des colonnes. J’aimerais supprimer ces colonnes que j’avais créé pour que la MAJ fonctionne. Comment faire puisque je n’ai plus accès à l’application ?

Je vous remercie.

Yann B.

Bonjour Yann,

Cette erreur provient d’une incompatibilité entre la définition désirée de la colonne (le type issu du champ personnalisé) et les données effectivement dans la base de données. Je ne sais pas pourquoi elles sont incompatibles alors qu’elles sont issues de la même sauvegarde.

Toujours est-il que la situation est corrigeable depuis l’interface en ligne de commande.

Option 1. Suppression du champ personnalisé

La suppression du champ personnalisé laisse les données telles quelles dans la colonne de base de données, mais n’essaie pas de les migrer. On pourra recréer le champ personnalisé pour ré-accéder aux données.

# bench --site NOM_DU_SITE console
frappe.get_doc("Custom Field", "Customer-adhérent_actif").delete()
frappe.db.commit()

Je recommande d’essayer d’abord ceci.

Option 2. Suppression pure et simple des données

Si les données de la colonne adhérent_actif ne sont pas utiles, on peut supprimer la colonne (qui va être recréée à la migration avec la valeur par défaut dans toutes les lignes).

# bench --site NOM_DU_SITE db-console
SELECT name, `adhérent_actif` FROM tabCustomer;
ALTER TABLE `tabCustomer` DROP COLUMN `adhérent_actif`;

Bonjour Corentin,

Pour la 1ère option, j’ai ce message d’erreur:

Pour la 2ème option, cela fonctionne mais je reviens au problème initial :


:frowning:

Yann B.

Hmm je vois.

Est-ce que vous avez créé un nouveau bench pour faire la mise à jour, ou bien vous avez gardé le même bench ?

Je propose de réessayer la mise à jour avec le plan suivant :

  • Revenir sur Dokos 3 (bench switch-to-branch v3.x.x)
  • Restaurer une sauvegarde (bench restore ...)
  • VĂ©rifier que ça fonctionne comme avant
  • CrĂ©er un deuxième bench sur Dokos 4 en suivant la documentation
  • Restaurer la sauvegarde Ă  cet endroit, puis faire bench update

Bonjour Corentin,

J’ai bien réussi à revenir dans la V3, l’application fonctionne à nouveau, je vous remercie.
J’ai créé un nouveau bench et fait l’install mais j’ai toujours le même message d’erreur en faisant un bench update --reset
Ensuite en faisant un bench update, j’ai ce message:

Bonne soirée.

Yann B.

La commande à utiliser dans ce cas est bench update --reset effectivement (plus d’infos dans ce ticket)

Avez-vous bien au moins Python 3.10 installé sur le serveur ? python3 --version

python3 --version donne : Python 3.10.12

Voici tout le message:

Traceback with variables (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
      mod_name = 'frappe.utils.bench_helper'
      alter_argv = True
      mod_spec = ModuleSpec(name='frappe.utils.bench_helper', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f6ce                                                c8065c0>, origin='/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.py')
      code = <code object <module> at 0x7f6cea89dbb0, file "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.p                                                y", line 1>
      main_globals = {'__name__': '__main__', '__doc__': None, '__package__': 'frappe.utils', '__loader__': <_frozen_importlib_exte                                                rnal.SourceFileLoader object at 0x7f6cec8065c0>, '__spec__': ModuleSpec(name='frappe.utils.bench_helper', loader=<_frozen_importlib                                                _external.SourceFileLoader object at 0x7f6cec8065c0>, origin='/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper                                                .py'), '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/dokos_user/dokos-bench-v4/apps/fra                                                ppe/frappe/utils/bench_helper.py', '__cached__': '/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/__pycache__/bench_helper                                                .cpython-310.pyc', 'importlib': <module 'importlib' from '/usr/lib/python3.10/importlib/__init__.py'>, 'json': <module 'json' from                                                 '/usr/lib/python3.10/json/__init__.py'>, 'os': <module 'os' from '/usr/lib/python3.10/os.py'>, 'traceback': <module 'traceback' fro                                                m '/usr/lib/python3.10/traceback.py'>, 'warnings': <module 'warnings' from '/usr/lib/python3.10/warnings...
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
      code = <code object <module> at 0x7f6cea89dbb0, file "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.p                                                y", line 1>
      run_globals = {'__name__': '__main__', '__doc__': None, '__package__': 'frappe.utils', '__loader__': <_frozen_importlib_exter                                                nal.SourceFileLoader object at 0x7f6cec8065c0>, '__spec__': ModuleSpec(name='frappe.utils.bench_helper', loader=<_frozen_importlib_                                                external.SourceFileLoader object at 0x7f6cec8065c0>, origin='/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.                                                py'), '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/dokos_user/dokos-bench-v4/apps/frap                                                pe/frappe/utils/bench_helper.py', '__cached__': '/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/__pycache__/bench_helper.                                                cpython-310.pyc', 'importlib': <module 'importlib' from '/usr/lib/python3.10/importlib/__init__.py'>, 'json': <module 'json' from '                                                /usr/lib/python3.10/json/__init__.py'>, 'os': <module 'os' from '/usr/lib/python3.10/os.py'>, 'traceback': <module 'traceback' from                                                 '/usr/lib/python3.10/traceback.py'>, 'warnings': <module 'warnings' from '/usr/lib/python3.10/warnings...
      init_globals = None
      mod_name = '__main__'
      mod_spec = ModuleSpec(name='frappe.utils.bench_helper', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f6ce                                                c8065c0>, origin='/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.py')
      pkg_name = 'frappe.utils'
      script_name = None
      loader = <_frozen_importlib_external.SourceFileLoader object at 0x7f6cec8065c0>
      fname = '/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.py'
      cached = '/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/__pycache__/bench_helper.cpython-310.pyc'
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.py", line 131, in <module>
    main()
      ...skipped... 27 vars
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/utils/bench_helper.py", line 34, in main
    FrappeCommandGroup(commands=commands)(prog_name="bench")
      commands = {'frappe': <FrappeCommandGroup frappe>, 'get-frappe-commands': <Command get-frappe-commands>, 'get-frappe-help': <                                                Command get-frappe-help>}
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
      self = <FrappeCommandGroup None>
      args = ()
      kwargs = {'prog_name': 'bench'}
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
      self = <FrappeCommandGroup None>
      args = ['frappe', '--site', 'adherent.lagaloche.fr', 'migrate']
      prog_name = 'bench'
      complete_var = None
      standalone_mode = True
      windows_expand_args = True
      extra = {}
      ctx = <click.core.Context object at 0x7f6cea88de40>
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
      _process_result = <function MultiCommand.invoke.<locals>._process_result at 0x7f6cea3ba3b0>
      args = ['migrate']
      cmd_name = 'frappe'
      cmd = <FrappeCommandGroup frappe>
      sub_ctx = <click.core.Context object at 0x7f6cea249d80>
      ctx = <click.core.Context object at 0x7f6cea88de40>
      self = <FrappeCommandGroup None>
      __class__ = <class 'click.core.MultiCommand'>
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
      _process_result = <function MultiCommand.invoke.<locals>._process_result at 0x7f6cea24dd80>
      args = []
      cmd_name = 'migrate'
      cmd = <Command migrate>
      sub_ctx = <click.core.Context object at 0x7f6cea24a260>
      ctx = <click.core.Context object at 0x7f6cea249d80>
      self = <FrappeCommandGroup frappe>
      __class__ = <class 'click.core.MultiCommand'>
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
      self = <Command migrate>
      ctx = <click.core.Context object at 0x7f6cea24a260>
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
      _Context__self = <click.core.Context object at 0x7f6cea24a260>
      _Context__callback = <function migrate at 0x7f6cea3ee290>
      args = ()
      kwargs = {'skip_failing': False, 'skip_search_index': False}
      ctx = <click.core.Context object at 0x7f6cea24a260>
  File "/home/dokos_user/dokos-bench-v4/env/lib/python3.10/site-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
      args = ()
      kwargs = {'skip_failing': False, 'skip_search_index': False}
      f = <function migrate at 0x7f6cea3ee050>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/commands/__init__.py", line 29, in _func
    ret = f(frappe._dict(ctx.obj), *args, **kwargs)
      ctx = <click.core.Context object at 0x7f6cea24a260>
      args = ()
      kwargs = {'skip_failing': False, 'skip_search_index': False}
      profile = False
      f = <function migrate at 0x7f6cea3edfc0>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/commands/site.py", line 710, in migrate
    SiteMigration(
      context = {'sites': ['adherent.lagaloche.fr'], 'force': False, 'verbose': False, 'profile': False}
      skip_failing = False
      skip_search_index = False
      activate_by_import = <module 'traceback_with_variables.activate_by_import' from '/home/dokos_user/dokos-bench-v4/env/lib/pyth                                                on3.10/site-packages/traceback_with_variables/activate_by_import.py'>
      SiteMigration = <class 'frappe.migrate.SiteMigration'>
      site = 'adherent.lagaloche.fr'
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/migrate.py", line 186, in run
    self.run_schema_updates()
      self = <frappe.migrate.SiteMigration object at 0x7f6cea24a380>
      site = 'adherent.lagaloche.fr'
      filelock = <function filelock at 0x7f6ce3e5c9d0>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/migrate.py", line 52, in wrapper
    raise e
      args = (<frappe.migrate.SiteMigration object at 0x7f6cea24a380>,)
      kwargs = {}
      method = <function SiteMigration.run_schema_updates at 0x7f6ce3e5c5e0>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/migrate.py", line 44, in wrapper
    ret = method(*args, **kwargs)
      args = (<frappe.migrate.SiteMigration object at 0x7f6cea24a380>,)
      kwargs = {}
      method = <function SiteMigration.run_schema_updates at 0x7f6ce3e5c5e0>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/migrate.py", line 117, in run_schema_updates
    frappe.modules.patch_handler.run_all(
      self = <frappe.migrate.SiteMigration object at 0x7f6cea24a380>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/modules/patch_handler.py", line 76, in run_all
    run_patch(patch)
      patch_type = <PatchType.pre_model_sync: 'pre_model_sync'>
      executed = {'frappe.patches.v4_0.set_user_gravatar', 'frappe.patches.v6_20x.update_insert_after', 'erpnext.patches.v13_0.upda                                                te_job_card_status', 'erpnext.patches.dokos.v1_0.remove_agriculture_domain #2020-05', 'erpnext.patches.v12_0.set_serial_no_status #                                                2020-05-21', 'frappe.patches.dokos.v1_2.add_rrule_to_events', "execute:frappe.delete_doc_if_exists('Page', 'dashboard', force=1)",                                                 'frappe.patches.v13_0.add_toggle_width_in_navbar_settings', 'erpnext.patches.v11_0.check_buying_selling_in_currency_exchange', 'erp                                                next.patches.v12_0.update_uom_conversion_factor', 'frappe.email.doctype.email_queue.patches.drop_search_index_on_message_id', 'erpn                                                ext.patches.v12_0.set_against_blanket_order_in_sales_and_purchase_order', 'erpnext.patches.v13_0.create_accounting_dimensions_in_or                                                ders', 'frappe.patches.v5_0.communication_parent', 'frappe.patches.v12_0.rename_events_repeat_on', 'erpnext.patches.v14_0.delete_am                                                azon_mws_doctype', 'erpnext.patches.v14_0.crm_ux_cleanup', 'frappe.patches.dokos.v3_0.currency_symbo...
      run_patch = <function run_all.<locals>.run_patch at 0x7f6ce299e710>
      patches = ['frappe.patches.v15_0.remove_implicit_primary_key', 'frappe.patches.dokos.v3_0.force_reload_doctype_model', "execu                                                te:frappe.reload_doc('core', 'doctype', 'doctype_state', force=True) #2021-12-15", 'frappe.patches.v12_0.remove_deprecated_fields_f                                                rom_doctype #2022-04-29', 'execute:frappe.utils.global_search.setup_global_search_table()', "execute:frappe.reload_doc('core', 'doc                                                type', 'doctype_action', force=True)", "execute:frappe.reload_doc('core', 'doctype', 'doctype_link', force=True) #2020-10-17", "exe                                                cute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2017-09-22", "execute:frappe.reload_doc('core', 'doctype', 'docfi                                                eld', force=True) #2018-02-20", "execute:frappe.reload_doc('desk', 'doctype', 'form_tour', force=True)", "execute:frappe.reload_doc                                                ('desk', 'doctype', 'form_tour_step', force=True)", 'frappe.patches.v11_0.drop_column_apply_user_permissions', "execute:frappe.relo                                                ad_doc('core', 'doctype', 'custom_docperm')", "execute:frappe.reload_doc('core', 'doctype', 'docper...
      patch = 'erpnext.patches.dokos.v4_0.migrate_integration_references_to_customer'
      skip_failing = False
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/modules/patch_handler.py", line 62, in run_patch
    if not run_single(patchmodule=patch):
      patch = 'erpnext.patches.dokos.v4_0.migrate_integration_references_to_customer'
      skip_failing = False
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/modules/patch_handler.py", line 153, in run_single
    return execute_patch(patchmodule, method, methodargs)
      patchmodule = 'erpnext.patches.dokos.v4_0.migrate_integration_references_to_customer'
      method = None
      methodargs = None
      force = False
      conf = <LocalProxy unbound>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/modules/patch_handler.py", line 189, in execute_patch
    _patch()
      patchmodule = 'erpnext.patches.dokos.v4_0.migrate_integration_references_to_customer'
      method = None
      methodargs = None
      has_patch_file = True
      patch = 'erpnext.patches.dokos.v4_0.migrate_integration_references_to_customer.execute'
      docstring = ''
      _patch = <function execute at 0x7f6ce28580d0>
      start_time = 17896656.07408614
  File "/home/dokos_user/dokos-bench-v4/apps/erpnext/erpnext/patches/dokos/v4_0/migrate_integration_references_to_customer.py", lin                                                e 44, in execute
    customer.save()
      ir = {'name': '121f2bac27'}
      doc = {'name': '121f2bac27', 'creation': datetime.datetime(2023, 3, 2, 12, 31, 10, 559374), 'modified': datetime.datetime(202                                                3, 5, 29, 22, 26, 55, 778065), 'modified_by': 'Guest', 'owner': 'burloty@gmail.com', 'docstatus': 0, 'parent': None, 'parentfield':                                                 None, 'parenttype': None, 'idx': 0, 'customer': 'Yann Burlot', 'customer_name': 'Yann Burlot', 'stripe_customer_id': 'cus_NzAGGi9g                                                jZOdVY', 'stripe_settings': 'lagaloche_production', 'gocardless_customer_id': None, 'gocardless_settings': None, '_user_tags': None                                                , '_comments': None, '_assign': None, '_liked_by': None}
      customer = <Customer: Yann Burlot>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/document.py", line 338, in save
    return self._save(*args, **kwargs)
      self = <Customer: Yann Burlot>
      args = ()
      kwargs = {}
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/document.py", line 363, in _save
    self._set_defaults()
      self = <Customer: Yann Burlot>
      ignore_permissions = None
      ignore_version = None
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/document.py", line 836, in _set_defaults
    new_doc = frappe.new_doc(df.options, parent_doc=self, parentfield=df.fieldname, as_dict=True)
      self = <Customer: Yann Burlot>
      new_doc = {'name': None, 'owner': 'Administrator', 'creation': None, 'modified': None, 'modified_by': None, 'docstatus': 0, '                                                idx': 0, 'sales_person': None, 'contact_no': None, 'allocated_percentage': None, 'allocated_amount': None, 'commission_rate': None,                                                 'incentives': None, 'parent': 'Yann Burlot', 'parentfield': 'sales_team', 'parenttype': 'Customer', 'doctype': 'Sales Team', '__is                                                local': 1, '__unsaved': 1}
      df = <TableDocField: portal_users parent=Customer>
      value = []
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/__init__.py", line 1178, in new_doc
    new_doc = get_new_doc(doctype, parent_doc, parentfield, as_dict=as_dict)
      doctype = 'Portal User'
      parent_doc = <Customer: Yann Burlot>
      parentfield = 'portal_users'
      as_dict = True
      kwargs = {}
      get_new_doc = <function get_new_doc at 0x7f6ce2858670>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/create_new.py", line 23, in get_new_doc
    frappe.local.new_doc_templates[doctype] = make_new_doc(doctype)
      doctype = 'Portal User'
      parent_doc = <Customer: Yann Burlot>
      parentfield = 'portal_users'
      as_dict = True
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/create_new.py", line 36, in make_new_doc
    doc = frappe.get_doc({"doctype": doctype, "__islocal": 1, "owner": frappe.session.user, "docstatus": 0})
      doctype = 'Portal User'
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/__init__.py", line 1322, in get_doc
    doc = frappe.model.document.get_doc(*args, **kwargs)
      args = ({'doctype': 'Portal User', '__islocal': 1, 'owner': 'Administrator', 'docstatus': 0},)
      kwargs = {}
      frappe = <module 'frappe' from '/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/__init__.py'>
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/document.py", line 81, in get_doc
    controller = get_controller(doctype)
      args = ({'doctype': 'Portal User', '__islocal': 1, 'owner': 'Administrator', 'docstatus': 0},)
      kwargs = {'doctype': 'Portal User', '__islocal': 1, 'owner': 'Administrator', 'docstatus': 0}
      doctype = 'Portal User'
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/base_document.py", line 67, in get_controller
    return import_controller(doctype)
      doctype = 'Portal User'
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/model/base_document.py", line 96, in import_controller
    module = load_doctype_module(doctype, module_name)
      doctype = 'Portal User'
      Document = <class 'frappe.model.document.Document'>
      NestedSet = <class 'frappe.utils.nestedset.NestedSet'>
      module_name = 'Core'
      doctype_info = None
      module_path = None
      class_overrides = {'Address': ['erpnext.accounts.custom.address.ERPNextAddress'], 'Event': ['erpnext.venue.doctype.event_regi                                                stration.event.event.DokosEvent'], 'Web Form': ['payments.overrides.payment_webform.PaymentWebForm']}
  File "/home/dokos_user/dokos-bench-v4/apps/frappe/frappe/modules/utils.py", line 294, in load_doctype_module
    raise ImportError(msg) from e
      doctype = 'Portal User'
      module = 'Core'
      prefix = ''
      suffix = ''
      app = 'frappe'
      key = ('frappe', 'Portal User', '', '')
      module_name = 'frappe.core.doctype.portal_user.portal_user'
      msg = "Module import failed for Portal User, the DocType you're trying to open might be deleted.<br> Error: No module named '                                                frappe.core.doctype.portal_user'"
builtins.ImportError: Module import failed for Portal User, the DocType you're trying to open might be deleted.<br> Error: No modul                                                e named 'frappe.core.doctype.portal_user'

Ah oui le problème est plus clair comme ça : il y a un bug dans un patch de migration.

On peut lancer l’étape de migration manuellement, en ignorant les patches qui tombent en erreur.

# La mise Ă  jour Ă©choue lors du patch
#bench update --reset

# On lance la migration manuellement en ne lançant pas les patches
bench migrate --skip-failing

# On tente l'exécution des patches restants
bench migrate

# On relance la mise Ă  jour pour tout remettre en ordre
bench update --reset

Bonjour,

Je vous remercie, Cela semble avoir bien fonctionné.
Comment fait-on pour basculer du bench v3 vers le nouveau bench v4 ?

Yann B.

Superbe !

Comment fait-on pour basculer du bench v3 vers le nouveau bench v4 ?

Peut-être est-il plus simple de supprimer* le nouveau bench et de réessayer la migration v3→v4 sur le bench originel, maintenant que l’on a trouvé une procédure qui fonctionne pour votre site ?

Je ne suis plus sûr de l’opération pour déplacer un site d’un bench à l’autre, je crois bien qu’il suffit de déplacer/copier le dossier du site ancien-bench/sites/monsite.example.com dans le dossier sites du nouveau bench. Le risque est d’avoir deux fois le même site.

* Là encore je ne suis plus sûr de la procédure à suivre pour correctement supprimer un bench.

1 « J'aime »

Bonjour,

L’opération a bien fonctionnée.
Je vous remercie.

Yann

1 « J'aime »

Bonjour,

L’opération a bien fonctionnée.
Je vous remercie.

Superbe ! Avec plaisir.

Bonne fin de journée,
Corentin