Transfert et remise au propre dokos

Bonjour à tous, j’ai une série de bug qui ont l’air d’être présent que sur mon install.
J’ai peut-être une série de difficultés liés aux personnalisations que j’ai réalisé.

Je souhaite donc repartir sur une base propre :

  • installation dokos avec les appli frappeverse
  • creation d’une appli sje pour gĂ©rer toutes les configuration, personnalisation et appli spĂ©cifique (et du coup ne plus avoir de personnalisation autre que dans l’appli)
  • J’en profiterai pour rĂ©importer les donner strictement nĂ©cessaire et du coup faire du nettoyage !!

J’arrive du coup à mes questions :

  • pensez-vous que c’est la bonne mĂ©thode
  • Je pense passer par l’outil export de dokos / traiter la donnĂ©e en csv ou tableur / import dans le nouveau dokos
  • Quel est la hiĂ©rarchie des donnĂ©e Ă  avoir pour Ă©viter au maximum les erreurs d’import ? (ex. groupe d’article avant articles…)
  • Comment structurer le rangement des images liĂ©s aux articles et autres documents sans qu’ils soient en doublon et en vrac dans les publics_files ou privates_files

Merci d’avance pour vos conseil et avis

PS: ci-dessous un des dernier bug que j’ai

Please type some additional information that could help us reproduce this issue:
App Versions
{
	"bank": "1.0.1",
	"builder": "1.13.0",
	"construction": "1.12.0",
	"crm": "1.34.5",
	"erpnext": "4.45.1",
	"frappe": "4.50.0",
	"hrms": "2.48.0",
	"insights": "2.2.9",
	"nextcloud": "0.0.1",
	"ocr": "1.0.0",
	"payments": "2.15.0",
	"print_designer": "1.4.3",
	"wiki": "2.0.0"
}
Route
Form/Sales Invoice/(44m9i74ua8)
Error Report
Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 114, in application
    response = frappe.api.handle(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/api/__init__.py", line 49, in handle
    data = endpoint(**arguments)
           ^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/api/v1.py", line 36, in handle_rpc_call
    return frappe.handler.handle()
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/handler.py", line 49, in handle
    data = execute_cmd(cmd)
           ^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/handler.py", line 85, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/__init__.py", line 1738, in call
    return fn(*args, **newargs)
           ^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/utils/typing_validations.py", line 30, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/desk/form/save.py", line 37, in savedocs
    doc.submit()
  File "apps/frappe/frappe/utils/typing_validations.py", line 30, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/model/document.py", line 1105, in submit
    def cancel(self):
            ^^^^^^^^^^
  File "apps/frappe/frappe/model/document.py", line 1088, in _submit
    """Cancel the document. Sets `docstatus` = 2, then saves."""
           ^^^^^^^^^^^
  File "apps/frappe/frappe/model/document.py", line 343, in save
    return self._save(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/model/document.py", line 416, in _save
    self.run_post_save_methods()
  File "apps/frappe/frappe/model/document.py", line 1188, in run_post_save_methods
    raise
  File "apps/frappe/frappe/model/document.py", line 1022, in run_method
    run_webhooks(self, method)
          ^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/model/document.py", line 1393, in composer
    def runner(self, method, *args, **kwargs):
                  ^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/__init__.py", line 1728, in get_attr
    return getattr(get_module(modulename), methodname)
                   ^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/__init__.py", line 1465, in get_module
    return importlib.import_module(modulename)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "", line 1387, in _gcd_import
  File "", line 1360, in _find_and_load
  File "", line 1331, in _find_and_load_unlocked
  File "", line 935, in _load_unlocked
  File "", line 995, in exec_module
  File "", line 488, in _call_with_frames_removed
  File "apps/erpnext/erpnext/regional/italy/utils.py", line 11, in 
    from erpnext.stock.utils import get_default_stock_uom
ImportError: cannot import name 'get_default_stock_uom' from 'erpnext.stock.utils' (apps/erpnext/erpnext/stock/utils.py)
Request Data
{
	"type": "POST",
	"args": {
  "doc": "{\"make_payment_via_journal_entry\":0},\"__last_sync_on\":\"2025-03-03T17:29:39.500Z\"}",
  "action": "Submit"
	},
	"btn": {
  "jQuery370052702650411046231": {
  	"events": {
    "click": [
    	{
      "type": "click",
      "origType": "click",
      "guid": 776,
      "namespace": ""
    	}
    ]
  	}
  }
	},
	"freeze": true,
	"headers": {},
	"error_handlers": {},
	"url": "/api/method/frappe.desk.form.save.savedocs"
}
Response JSON
{
	"exception": "ImportError: cannot import name 'get_default_stock_uom' from 'erpnext.stock.utils' (apps/erpnext/erpnext/stock/utils.py)",
	"exc_type": "ImportError",
	"_exc_source": "erpnext (app)"
}

Bonjour @oryxr,

En résumé : il faut exécuter la commande bench restart.


Le code source Python en question affiché n’existait pas encore dans Dokos v4.45.1, ce qui me laisse penser que la version de Dokos qui est exécutée (chargée en mémoire) n’est pas la même que la version de Dokos sur le disque dur.

Autrement dit : il faut faire bench restart pour recharger le logiciel, ce qui est normalement fait automatiquement après une mise à jour.

Quelle est la commande/procédure que tu utilises pour mettre à jour Dokos ?

Corentin

Dokos redémarre bien à chaque fois :
Voici la commande que j’exécute bench update --reset --restart-supervisor

De plus on a régulièrement le fait que l’on change un prix sur les devis et il remet celui d’avant. Par moment ca passe et on change la quantité et le prix revient ? Par moment on a du mal à comprendre d’ou ca vient :frowning:

par contre il me donne ca en console

Salut @oryxr,

Par rapport Ă  ta question initiale.
Intuitivement et « Ă  chaud Â» je procèderais comme cela :

  • Etablir une liste de tout les doctype ayant eu des personnalisations (par exemple en regardant ce qu’il y a dans Champ personnalisĂ© et PropriĂ©tĂ© personnalisĂ©)
  • IntĂ©gration de toutes les personnalisations et scrips dans une app (sur une instance locale de dĂ©v)
  • VĂ©rification de tout les flux de l’app sur l’instance de test pour vĂ©rifier que tout fonctionne
  • RĂ©tablir tout les paramètres par dĂ©faut des doctypes listĂ©s dans la 1ere Ă©tape
  • Installation de l’app
  • Bench migrate

Evidemment à tester d’abord sur une copie local de ton site pour ne rien casser.

Cela me semble moins casse-gueule qu’un import de toutes les données manuellement qui risque d’être assez fastidieux si votre site a beaucoup tourné

Antoine.

Il y a aussi la possibilité de faire des sauvegardes partielles et des restaurations partielles de données avec bench backup --include "Item Price", à tester en détails.

1 Like

Je vois ce que tu veux dire, mais j’ai certains champs que je souhaiterai faire disparaitre car ils font doublon avec l’appli chantier, est ce que ca ne fait pas trop de pollution dans la base ?

En faisant comme tu propose, est-ce qu’il sauvegarde aussi tous les liens et les groupes qui en découlent ?

Quelle quoi soit l’approche retenue il va falloir enlever les champs en doublon avant d’exporter les personnalisations dans l’app.

Non malheureusement, donc il faut bien planifier la restauration en plusieurs étapes. Mais je ne pense pas que les données en base puissent avoir un effet délétère sur le fonctionnement du logiciel en lui-même, sauf pour les personnalisations.

oui, c’est ce que je pense faire, mais je les renommes aussi pour avoir des choses plus cohérentes y compris dans les création devis->cmd->factures

Par contre je ne comprends pas pourquoi sur l’interface web il m’indique pas la même version qu’en console ? Je pense qu’il doit y avoir un problème de cache, ce qui expliquerai d’autres soucis mais comment régler le problème et éviter qu’il revienne ?

J’ai pourtant essayé bench --site www.sje.bzh clear-cache et rien ne se fait

Finalement, j’ai redémarré la machine et la bonne version est apparut