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,
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:
É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.
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.
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 :
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 :
bench switch-to-branch v3.x.x
)bench restore ...
)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.
Bonjour,
L’opération a bien fonctionnée.
Je vous remercie.
Yann
Bonjour,
L’opération a bien fonctionnée.
Je vous remercie.
Superbe ! Avec plaisir.
Bonne fin de journée,
Corentin