I am not sure if anyone else experiences this but let me summarize:
-
We dont frequently patch / update, at most it is done on a monthly basis and I think alot of people will probably have the same practice
-
Patches for Frappe and ERPNext are published very frequently (which is awesome +1)
-
When we do update, we encounter alot of errors which we find could be due to the patch sequencing
-
For example, we are trying to upgrade from v6 to v7, please see the traceback error below (this is but one example of many we encounter)
-
This patch is for v6.20x and the error is basically complaining that the Sales Invoice Timesheet doctype does not exist
-
Correct me if I am wrong but the patch for Time Sheet only comes in v7, so I believe some of the checkings are done prematurely before some patches
-
What is the best way to avoid these errors other than patch super frequently? Do the patches need to be sequenced properly in this case? - We really experience this very frequently and it really makes updating a very painful process
-
Any idea how we can fix the problem below?
Executing erpnext.patches.v6_20x.remove_customer_supplier_roles in erp (erp)
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/home/test/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 79, in <module>
main()
File "/home/test/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 16, in main
click.Group(commands=commands)(prog_name='bench')
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 700, in __call__
return self.main(*args, **kwargs)
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 680, in main
rv = self.invoke(ctx)
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 1027, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 1027, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 873, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py", line 508, in invoke
return callback(*args, **kwargs)
File "/home/test/frappe-bench/env/local/lib/python2.7/site-packages/click/decorators.py", line 16, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/commands/__init__.py", line 24, in _func
ret = f(frappe._dict(ctx.obj), *args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/commands/site.py", line 203, in migrate
migrate(context.verbose, rebuild_website=rebuild_website)
File "/home/test/frappe-bench/apps/frappe/frappe/migrate.py", line 27, in migrate
frappe.modules.patch_handler.run_all()
File "/home/test/frappe-bench/apps/frappe/frappe/modules/patch_handler.py", line 25, in run_all
if not run_single(patchmodule = patch):
File "/home/test/frappe-bench/apps/frappe/frappe/modules/patch_handler.py", line 52, in run_single
return execute_patch(patchmodule, method, methodargs)
File "/home/test/frappe-bench/apps/frappe/frappe/modules/patch_handler.py", line 68, in execute_patch
frappe.get_attr(patchmodule.split()[0] + ".execute")()
File "/home/test/frappe-bench/apps/erpnext/erpnext/patches/v6_20x/remove_customer_supplier_roles.py", line 15, in execute
d.save()
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 242, in save
return self._save(*args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 269, in _save
self.run_before_save_methods()
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 687, in run_before_save_methods
self.run_method("validate")
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 638, in run_method
return Document.hook(fn)(self, *args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 816, in composer
return composed(self, method, *args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 799, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File "/home/test/frappe-bench/apps/frappe/frappe/model/document.py", line 632, in <lambda>
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File "/home/test/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 52, in validate
validate_fields(self)
File "/home/test/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 452, in validate_fields
check_link_table_options(d)
File "/home/test/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 300, in check_link_table_options
frappe.throw(_("Options must be a valid DocType for field {0} in row {1}").format(d.label, d.idx))
File "/home/test/frappe-bench/apps/frappe/frappe/__init__.py", line 299, in throw
msgprint(msg, raise_exception=exc, title=title, indicator='red')
File "/home/test/frappe-bench/apps/frappe/frappe/__init__.py", line 292, in msgprint
_raise_exception()
File "/home/test/frappe-bench/apps/frappe/frappe/__init__.py", line 265, in _raise_exception
raise raise_exception, encode(msg)
frappe.exceptions.ValidationError: Options must be a valid DocType for field Time Sheets in row 43
Traceback (most recent call last):
File "/usr/local/bin/bench", line 9, in <module>
load_entry_point('bench==0.92', 'console_scripts', 'bench')()
File "/home/test/bench-repo/bench/cli.py", line 40, in cli
bench_command()
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 700, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 680, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1027, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 873, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 508, in invoke
return callback(*args, **kwargs)
File "/home/test/bench-repo/bench/commands/update.py", line 60, in update
_update(pull, patch, build, bench, auto, restart_supervisor, requirements, no_backup, upgrade, force=force)
File "/home/test/bench-repo/bench/commands/update.py", line 90, in _update
patch_sites(bench_path=bench_path)
File "/home/test/bench-repo/bench/utils.py", line 124, in patch_sites
run_frappe_cmd('--site', 'all', 'migrate', bench_path=bench_path)
File "/home/test/bench-repo/bench/utils.py", line 453, in run_frappe_cmd
raise CommandFailedError(args)
bench.utils.CommandFailedError: ('--site', 'all', 'migrate')