diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-08-02 17:19:16 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-08-02 17:24:05 +0200 |
commit | a4d00559bd8dad2605aaf7e38da873663e3bff0e (patch) | |
tree | 134b06750346dfe806fc73eb564104e70f0608d0 | |
parent | 8cc2fa3f7df67daa316621e645ea0988732c5730 (diff) | |
download | Ishtar-a4d00559bd8dad2605aaf7e38da873663e3bff0e.tar.bz2 Ishtar-a4d00559bd8dad2605aaf7e38da873663e3bff0e.zip |
Preventive file: copy planned, add default cost - tests - fixtures
-rw-r--r-- | Makefile.example | 10 | ||||
-rw-r--r-- | archaeological_files/fixtures/initial_data-fr.json | 2751 | ||||
-rw-r--r-- | archaeological_files/models.py | 6 | ||||
-rw-r--r-- | archaeological_files/templates/ishtar/forms/preventive_detail.html | 10 | ||||
-rw-r--r-- | archaeological_files/tests.py | 186 | ||||
-rw-r--r-- | archaeological_files/urls.py | 11 | ||||
-rw-r--r-- | archaeological_files/views.py | 34 |
7 files changed, 2993 insertions, 15 deletions
diff --git a/Makefile.example b/Makefile.example index 0d49c0c70..f7f6b7b90 100644 --- a/Makefile.example +++ b/Makefile.example @@ -1,5 +1,6 @@ SHELL := /bin/bash +NB_PROCESS=8 # if a virtualenv is used put the full python path # e.g.: PYTHON=$$HOME/.virtualenvs/ishtar/bin/python PYTHON=python3 @@ -81,6 +82,10 @@ soft_test: clean ## launch tests without database regeneration cd $(project); $(PYTHON) manage.py test -k --tag gis $(apps) cd $(project); $(PYTHON) manage.py test -k --exclude-tag gis $(apps) +soft_test_multi: clean ## launch multi-process tests without database regeneration + cd $(project); $(PYTHON) manage.py test -k --parallel $(NB_PROCESS) --tag gis $(apps) + cd $(project); $(PYTHON) manage.py test -k --parallel $(NB_PROCESS) --exclude-tag gis $(apps) + soft_test_verbose: clean ## launch tests without database regeneration - verbose cd $(project); $(PYTHON) manage.py test -k --verbosity 2 $(apps) @@ -237,9 +242,12 @@ fixtures_files: archaeological_files.saisinetype \ archaeological_files.filetype \ archaeological_files.permittype \ + archaeological_files.job \ + archaeological_files.genericequipmentservicetype \ + archaeological_files.equipmentservicetype \ + archaeological_files.equipmentservicecost \ > '../archaeological_files/fixtures/initial_data-'$(default_data)'.json' - readme_md_to_rst: pandoc --from=markdown --to=rst --output=README.rst README.md diff --git a/archaeological_files/fixtures/initial_data-fr.json b/archaeological_files/fixtures/initial_data-fr.json index 2c9847587..1bfd8d08c 100644 --- a/archaeological_files/fixtures/initial_data-fr.json +++ b/archaeological_files/fixtures/initial_data-fr.json @@ -249,5 +249,2756 @@ "comment": "Saisine suite \u00e0 une demande de travaux MH :\r\nArticle R523-10 \r\n\r\nPour les travaux sur les monuments historiques class\u00e9s mentionn\u00e9s au 6\u00b0 de l'article R. 523-4, la saisine du pr\u00e9fet de r\u00e9gion au titre de l'autorisation exig\u00e9e par l'article L. 621-9 vaut saisine au titre du pr\u00e9sent chapitre", "available": true } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Frais de repas", + "txt_idx": "frais-de-repas", + "comment": "", + "available": true, + "ground_daily_cost": 17.5, + "daily_cost": 17.5, + "permanent_contract": true, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 1000, + "child": null + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Responsable d'op\u00e9ration", + "txt_idx": "responsable-doperation", + "comment": "", + "available": true, + "ground_daily_cost": 245.0, + "daily_cost": 245.0, + "permanent_contract": true, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 10, + "child": [ + "frais-de-repas" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Topographe", + "txt_idx": "topographe", + "comment": "", + "available": true, + "ground_daily_cost": 172.0, + "daily_cost": 172.0, + "permanent_contract": true, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 20, + "child": [ + "frais-de-repas" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "DAO", + "txt_idx": "dao", + "comment": "", + "available": true, + "ground_daily_cost": 155.0, + "daily_cost": 155.0, + "permanent_contract": true, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 30, + "child": [ + "frais-de-repas" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Frais de repas", + "txt_idx": "frais-de-repas-temp", + "comment": "", + "available": true, + "ground_daily_cost": 17.5, + "daily_cost": 17.5, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 1000, + "child": null + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "DAO", + "txt_idx": "dao-temp", + "comment": "", + "available": true, + "ground_daily_cost": 180.0, + "daily_cost": 180.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 30, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Gestionnaire des collections", + "txt_idx": "gestionnaire-des-collections", + "comment": "", + "available": true, + "ground_daily_cost": 180.0, + "daily_cost": 180.0, + "permanent_contract": true, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 40, + "child": [ + "frais-de-repas" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Responsable de secteur", + "txt_idx": "responsable-de-secteur-temp", + "comment": "", + "available": true, + "ground_daily_cost": 150.0, + "daily_cost": 150.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 10, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Responsable de secteur (avec anciennet\u00e9)", + "txt_idx": "responsable-de-secteur-avec-anciennete-temp", + "comment": "", + "available": true, + "ground_daily_cost": 180.0, + "daily_cost": 180.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 15, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Sp\u00e9cialiste", + "txt_idx": "specialiste-temp", + "comment": "", + "available": true, + "ground_daily_cost": 140.0, + "daily_cost": 140.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 20, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Sp\u00e9cialiste (avec anciennet\u00e9)", + "txt_idx": "specialiste-avec-anciennete", + "comment": "", + "available": true, + "ground_daily_cost": 180.0, + "daily_cost": 180.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 25, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.job", + "fields": { + "label": "Technicien de fouille", + "txt_idx": "technicien-de-fouille", + "comment": "", + "available": true, + "ground_daily_cost": 140.0, + "daily_cost": 140.0, + "permanent_contract": false, + "default_daily_need_on_ground": 0.0, + "default_daily_need": 0.0, + "order": 40, + "child": [ + "frais-de-repas-temp" + ] + } +}, +{ + "model": "archaeological_files.genericequipmentservicetype", + "fields": { + "label": "Engins m\u00e9caniques", + "txt_idx": "engins-mecaniques", + "comment": "", + "available": true, + "order": 10 + } +}, +{ + "model": "archaeological_files.genericequipmentservicetype", + "fields": { + "label": "Locaux de chantiers et prestations techniques", + "txt_idx": "locaux-de-chantiers-et-prestations-techniques", + "comment": "", + "available": true, + "order": 20 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Amen\u00e9e", + "txt_idx": "amenee", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 12 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Repli", + "txt_idx": "repli", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 14 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Transfert", + "txt_idx": "transfert", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 16 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Amen\u00e9e et repli", + "txt_idx": "amenee-repli", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 18 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pelle m\u00e9canique hydraulique \u00e0 chenilles (18 T- 24 T)", + "txt_idx": "pelle-mecanique-chenille-18-t-24-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 20 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pelle m\u00e9canique hydraulique \u00e0 chenilles (25 T- 29 T)", + "txt_idx": "pelle-mecanique-chenille-25-t-29-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 30 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pelle m\u00e9canique hydraulique \u00e0 chenilles (30 T)", + "txt_idx": "pelle-mecanique-chenille-30-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 40 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pelle m\u00e9canique hydraulique \u00e0 pneus (18 T mini)", + "txt_idx": "pelle-meca-hydrau-pneus-18-t-mini", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 50 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Mini-pelle m\u00e9canique hydraulique \u00e0 chenilles (800 kg)", + "txt_idx": "mini-pelle-meca-hy-chenilles-800kg", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 60 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Mini-pelle m\u00e9canique hydraulique \u00e0 chenilles (1 - 1,5 T)", + "txt_idx": "mini-pelle-meca-hydrau-chen-1-15-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 70 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Mini-pelle hydraulique \u00e0 chenilles caoutchouc (2,5 T)", + "txt_idx": "mini-pelle-hydrau-chen-caout-25-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 80 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Mini-pelle hydraulique \u00e0 chenilles (5-6 T)", + "txt_idx": "mini-pelle-hydrau-chen-5-6-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 90 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Mini-pelle hydraulique \u00e0 chenilles (10 T)", + "txt_idx": "mini-pelle-hydrau-chen-10-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 100 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Tracteur sur chenilles \u00e0 lames (15 - 18 T)", + "txt_idx": "tracteur-sur-chen-lam-15-18-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 110 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Chargeur sur chenilles (12 - 15 T)", + "txt_idx": "chargeur-sur-chenilles-12-15-t", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 120 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Tombereau automoteur 6x4 (14 m\u00b3)", + "txt_idx": "tombereau-automoteur-6x4-14-m", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 130 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Tracteur agricole (200 cv minimum) avec benne TP de 11 m\u00b3", + "txt_idx": "tracteur-agricole-avec-benne-tp", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 140 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Camion benne 6x4", + "txt_idx": "camion-benne-6x4", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 150 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Camion semi-remorque \u00e0 benne 20 m\u00b3", + "txt_idx": "camion-semi-remorque-benne-20-m", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 160 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Sciage de chauss\u00e9e ou de dalle b\u00e9ton", + "txt_idx": "sciage-de-chaussee-ou-de-dalle-beton", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 170 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pompe thermique \u00e0 eaux charg\u00e9es (25 m\u00b3/h mini)", + "txt_idx": "pompe-thermique-eaux-chargees-25-mh-mini", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 180 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Pompe thermique \u00e0 eaux charg\u00e9es (65 m\u00b3/h mini)", + "txt_idx": "pompe-thermique-eaux-chargees-65-mh-mini", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 190 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "V\u00e9hicule de transport de mat\u00e9riel et/ou de personnel", + "txt_idx": "vehicule-de-transport-de-materiel-etou-de-personne", + "comment": "", + "available": true, + "generic_equipment_type": [ + "engins-mecaniques" + ], + "order": 200 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Bungalow r\u00e9fectoire \u00e9quip\u00e9 de 15m\u00b2 (tables et chaises)", + "txt_idx": "bungalow-refectoire-equipe-de-15m2-tables-et-chais", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 230 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Bungalow suppl\u00e9mentaire de 15 m\u00b2", + "txt_idx": "bungalow-supplementaire-de-15-m", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 240 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Amen\u00e9e et repli", + "txt_idx": "amenee-et-repli-locaux", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 210 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Assemblage / d\u00e9sassemblage", + "txt_idx": "assemblage-desassemblage-locaux", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 212 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Bungalow vestiaire (armoires de rangement)", + "txt_idx": "bungalow-vestiaire-armoires-de-rangement", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 240 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Container de stockage m\u00e9tallique ferm\u00e9 10 m\u00b3", + "txt_idx": "container-de-stockage-metallique-ferme-10-m3", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 240 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Container de stockage m\u00e9tallique ferm\u00e9 15 m\u00b3", + "txt_idx": "container-de-stockage-metallique-ferme-15-m", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 250 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Container de stockage m\u00e9tallique ferm\u00e9 30 m\u00b3", + "txt_idx": "container-de-stockage-metallique-ferme-30-m3", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 260 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Groupe \u00e9lectrog\u00e8ne 6 kwa", + "txt_idx": "groupe-electrogene-6-kwa", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 270 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Raccordement \u00e9lectrique bungalow au d\u00e9part compteur EDF", + "txt_idx": "raccordement-electrique-bungalow-au-depart-compteu", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 280 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "R\u00e9serve d'eau de 500 \u00e0 1 000 litres mini", + "txt_idx": "reserve-deau-de-500-1-000-litres-mini", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 290 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "WC chimique avec produits", + "txt_idx": "wc-chimique-avec-produits", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 300 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Vidange WC", + "txt_idx": "vidange-wc", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 310 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Cl\u00f4ture mobile de chantier par panneaux en treillis", + "txt_idx": "cloture-mobile-de-chantier-par-panneaux-en-treilli", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 320 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "Amen\u00e9e et pose de 1 \u00e0 50 ml", + "txt_idx": "amenee-et-pose-de-1-50-ml", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 330 + } +}, +{ + "model": "archaeological_files.equipmentservicetype", + "fields": { + "label": "D\u00e9pose et repli de 1 \u00e0 50 ml", + "txt_idx": "depose-et-repli-de-1-50-ml", + "comment": "", + "available": true, + "generic_equipment_type": [ + "locaux-de-chantiers-et-prestations-techniques" + ], + "order": 340 + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-18-t-24-t" + ], + "slug": "pelle-mecanique-chenille-18-t-24-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 10, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-18-t-24-t" + ], + "slug": "pelle-mecanique-chenille-18-t-24-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 12, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "pelle-mecanique-chenille-18-t-24-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 14, + "available": true, + "parent": [ + "pelle-mecanique-chenille-18-t-24-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "pelle-mecanique-chenille-18-t-24-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 16, + "available": true, + "parent": [ + "pelle-mecanique-chenille-18-t-24-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "pelle-mecanique-chenille-18-t-24-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 18, + "available": true, + "parent": [ + "pelle-mecanique-chenille-18-t-24-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-25-t-29-t" + ], + "slug": "pelle-mecanique-chenille-25-t-29-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 20, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-25-t-29-t" + ], + "slug": "pelle-mecanique-chenille-25-t-29-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 22, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "pelle-mecanique-chenille-25-t-29-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 24, + "available": true, + "parent": [ + "pelle-mecanique-chenille-25-t-29-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "pelle-mecanique-chenille-25-t-29-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 26, + "available": true, + "parent": [ + "pelle-mecanique-chenille-25-t-29-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "pelle-mecanique-chenille-25-t-29-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 28, + "available": true, + "parent": [ + "pelle-mecanique-chenille-25-t-29-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-30-t" + ], + "slug": "pelle-mecanique-chenille-30-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 30, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-mecanique-chenille-30-t" + ], + "slug": "pelle-mecanique-chenille-30-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 32, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "pelle-mecanique-chenille-30-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 34, + "available": true, + "parent": [ + "pelle-mecanique-chenille-30-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "pelle-mecanique-chenille-30-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 36, + "available": true, + "parent": [ + "pelle-mecanique-chenille-30-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "pelle-mecanique-chenille-30-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 38, + "available": true, + "parent": [ + "pelle-mecanique-chenille-30-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-meca-hydrau-pneus-18-t-mini" + ], + "slug": "pelle-meca-hydrau-pneus-18-t-mini-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 40, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pelle-meca-hydrau-pneus-18-t-mini" + ], + "slug": "pelle-meca-hydrau-pneus-18-t-mini-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 42, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "pelle-meca-hydrau-pneus-18-t-mini-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 44, + "available": true, + "parent": [ + "pelle-meca-hydrau-pneus-18-t-mini" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "pelle-meca-hydrau-pneus-18-t-mini-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 46, + "available": true, + "parent": [ + "pelle-meca-hydrau-pneus-18-t-mini" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "pelle-meca-hydrau-pneus-18-t-mini-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 48, + "available": true, + "parent": [ + "pelle-meca-hydrau-pneus-18-t-mini" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-meca-hy-chenilles-800kg" + ], + "slug": "mini-pelle-meca-hy-chenilles-800kg-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 50, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-meca-hy-chenilles-800kg" + ], + "slug": "mini-pelle-meca-hy-chenilles-800kg-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 52, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "mini-pelle-meca-hy-chenilles-800kg-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 54, + "available": true, + "parent": [ + "mini-pelle-meca-hy-chenilles-800kg" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "mini-pelle-meca-hy-chenilles-800kg-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 56, + "available": true, + "parent": [ + "mini-pelle-meca-hy-chenilles-800kg" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "mini-pelle-meca-hy-chenilles-800kg-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 58, + "available": true, + "parent": [ + "mini-pelle-meca-hy-chenilles-800kg" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-meca-hydrau-chen-1-15-t" + ], + "slug": "mini-pelle-meca-hydrau-chen-1-15-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 60, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-meca-hydrau-chen-1-15-t" + ], + "slug": "mini-pelle-meca-hydrau-chen-1-15-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 62, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "mini-pelle-meca-hydrau-chen-1-15-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 64, + "available": true, + "parent": [ + "mini-pelle-meca-hydrau-chen-1-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "mini-pelle-meca-hydrau-chen-1-15-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 66, + "available": true, + "parent": [ + "mini-pelle-meca-hydrau-chen-1-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "mini-pelle-meca-hydrau-chen-1-15-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 68, + "available": true, + "parent": [ + "mini-pelle-meca-hydrau-chen-1-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-caout-25-t" + ], + "slug": "mini-pelle-hydrau-chen-caout-25-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 70, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-caout-25-t" + ], + "slug": "mini-pelle-hydrau-chen-caout-25-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 72, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "mini-pelle-hydrau-chen-caout-25-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 74, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-caout-25-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "mini-pelle-hydrau-chen-caout-25-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 76, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-caout-25-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "mini-pelle-hydrau-chen-caout-25-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 78, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-caout-25-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-5-6-t" + ], + "slug": "mini-pelle-hydrau-chen-5-6-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 80, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-5-6-t" + ], + "slug": "mini-pelle-hydrau-chen-5-6-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 82, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "mini-pelle-hydrau-chen-5-6-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 84, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-5-6-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "mini-pelle-hydrau-chen-5-6-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 86, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-5-6-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "mini-pelle-hydrau-chen-5-6-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 88, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-5-6-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-10-t" + ], + "slug": "mini-pelle-hydrau-chen-10-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 90, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "mini-pelle-hydrau-chen-10-t" + ], + "slug": "mini-pelle-hydrau-chen-10-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 92, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "mini-pelle-hydrau-chen-10-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 94, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-10-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "mini-pelle-hydrau-chen-10-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 96, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-10-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "mini-pelle-hydrau-chen-10-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 98, + "available": true, + "parent": [ + "mini-pelle-hydrau-chen-10-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tracteur-sur-chen-lam-15-18-t" + ], + "slug": "tracteur-sur-chen-lam-15-18-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 100, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tracteur-sur-chen-lam-15-18-t" + ], + "slug": "tracteur-sur-chen-lam-15-18-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 102, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "tracteur-sur-chen-lam-15-18-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 104, + "available": true, + "parent": [ + "tracteur-sur-chen-lam-15-18-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "tracteur-sur-chen-lam-15-18-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 106, + "available": true, + "parent": [ + "tracteur-sur-chen-lam-15-18-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "tracteur-sur-chen-lam-15-18-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 108, + "available": true, + "parent": [ + "tracteur-sur-chen-lam-15-18-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "chargeur-sur-chenilles-12-15-t" + ], + "slug": "chargeur-sur-chenilles-12-15-t-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 110, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "chargeur-sur-chenilles-12-15-t" + ], + "slug": "chargeur-sur-chenilles-12-15-t-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 112, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "chargeur-sur-chenilles-12-15-t-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 114, + "available": true, + "parent": [ + "chargeur-sur-chenilles-12-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "chargeur-sur-chenilles-12-15-t-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 116, + "available": true, + "parent": [ + "chargeur-sur-chenilles-12-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "chargeur-sur-chenilles-12-15-t-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 118, + "available": true, + "parent": [ + "chargeur-sur-chenilles-12-15-t" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tombereau-automoteur-6x4-14-m" + ], + "slug": "tombereau-automoteur-6x4-14-m-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 120, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tombereau-automoteur-6x4-14-m" + ], + "slug": "tombereau-automoteur-6x4-14-m-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 122, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "tombereau-automoteur-6x4-14-m-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 124, + "available": true, + "parent": [ + "tombereau-automoteur-6x4-14-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "tombereau-automoteur-6x4-14-m-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 126, + "available": true, + "parent": [ + "tombereau-automoteur-6x4-14-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "tombereau-automoteur-6x4-14-m-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 128, + "available": true, + "parent": [ + "tombereau-automoteur-6x4-14-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tracteur-agricole-avec-benne-tp" + ], + "slug": "tracteur-agricole-avec-benne-tp-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 130, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "tracteur-agricole-avec-benne-tp" + ], + "slug": "tracteur-agricole-avec-benne-tp-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 132, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee" + ], + "slug": "tracteur-agricole-avec-benne-tp-amenee", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 134, + "available": true, + "parent": [ + "tracteur-agricole-avec-benne-tp" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "repli" + ], + "slug": "tracteur-agricole-avec-benne-tp-repli", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 136, + "available": true, + "parent": [ + "tracteur-agricole-avec-benne-tp" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "transfert" + ], + "slug": "tracteur-agricole-avec-benne-tp-transfert", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 138, + "available": true, + "parent": [ + "tracteur-agricole-avec-benne-tp" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "camion-benne-6x4" + ], + "slug": "camion-benne-6x4-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 140, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "camion-benne-6x4" + ], + "slug": "camion-benne-6x4-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 142, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "camion-semi-remorque-benne-20-m" + ], + "slug": "camion-semi-remorque-benne-20-m-lj", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "D", + "specificity": "lundi au jeudi", + "default_quantity_by_day": 0, + "order": 150, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "camion-semi-remorque-benne-20-m" + ], + "slug": "camion-semi-remorque-benne-20-m-v", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 400.0, + "unit": "D", + "specificity": "vendredi", + "default_quantity_by_day": 0, + "order": 152, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "sciage-de-chaussee-ou-de-dalle-beton" + ], + "slug": "sciage-de-chaussee-ou-de-dalle-beton", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 500.0, + "unit": "L", + "specificity": "", + "default_quantity_by_day": 0, + "order": 160, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-repli" + ], + "slug": "sciage-de-chaussee-ou-de-dalle-beton-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 400.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 162, + "available": true, + "parent": [ + "sciage-de-chaussee-ou-de-dalle-beton" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pompe-thermique-eaux-chargees-25-mh-mini" + ], + "slug": "pompe-thermique-eaux-chargees-25-mh-mini", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 100.0, + "unit": "D", + "specificity": "", + "default_quantity_by_day": 0, + "order": 170, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "pompe-thermique-eaux-chargees-65-mh-mini" + ], + "slug": "pompe-thermique-eaux-chargees-65-mh-mini", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 100.0, + "unit": "D", + "specificity": "", + "default_quantity_by_day": 0, + "order": 180, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "vehicule-de-transport-de-materiel-etou-de-personne" + ], + "slug": "vehicule-de-transport-de-materiel-etou-de-personne", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 100.0, + "unit": "D", + "specificity": "", + "default_quantity_by_day": 0, + "order": 190, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "bungalow-refectoire-equipe-de-15m2-tables-et-chais" + ], + "slug": "bungalow-refectoire-equipe-de-15m2-tables-et-chais-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 200, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "bungalow-refectoire-equipe-de-15m2-tables-et-chais" + ], + "slug": "bungalow-refectoire-equipe-de-15m2-tables-et-chais-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 202, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "bungalow-refectoire-equipe-de-15m2-tables-et-chais-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 204, + "available": true, + "parent": [ + "bungalow-refectoire-equipe-de-15m2-tables-et-chais" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "bungalow-supplementaire-de-15-m" + ], + "slug": "bungalow-supplementaire-de-15-m", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 210, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "assemblage-desassemblage-locaux" + ], + "slug": "bungalow-supplementaire-de-15-m-assemblage-desassemblage-locaux", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 140.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 212, + "available": true, + "parent": [ + "bungalow-supplementaire-de-15-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "bungalow-supplementaire-de-15-m-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 214, + "available": true, + "parent": [ + "bungalow-supplementaire-de-15-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "bungalow-vestiaire-armoires-de-rangement" + ], + "slug": "bungalow-vestiaire-armoires-de-rangement-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 220, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "bungalow-vestiaire-armoires-de-rangement" + ], + "slug": "bungalow-vestiaire-armoires-de-rangement-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 222, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "bungalow-vestiaire-armoires-de-rangement-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 224, + "available": true, + "parent": [ + "bungalow-vestiaire-armoires-de-rangement" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-10-m3" + ], + "slug": "container-de-stockage-metallique-ferme-10-m3-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 230, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-10-m3" + ], + "slug": "container-de-stockage-metallique-ferme-10-m3-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 232, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "container-de-stockage-metallique-ferme-10-m3-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 234, + "available": true, + "parent": [ + "container-de-stockage-metallique-ferme-10-m3" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-15-m" + ], + "slug": "container-de-stockage-metallique-ferme-15-m-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 240, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-15-m" + ], + "slug": "container-de-stockage-metallique-ferme-15-m-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 242, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "container-de-stockage-metallique-ferme-15-m-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 244, + "available": true, + "parent": [ + "container-de-stockage-metallique-ferme-15-m" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-30-m3" + ], + "slug": "container-de-stockage-metallique-ferme-30-m3-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 250, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "container-de-stockage-metallique-ferme-30-m3" + ], + "slug": "container-de-stockage-metallique-ferme-30-m3-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 252, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "container-de-stockage-metallique-ferme-30-m3-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 254, + "available": true, + "parent": [ + "container-de-stockage-metallique-ferme-30-m3" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "groupe-electrogene-6-kwa" + ], + "slug": "groupe-electrogene-6-kwa-jour", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 80.0, + "unit": "D", + "specificity": "", + "default_quantity_by_day": 0, + "order": 260, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "groupe-electrogene-6-kwa" + ], + "slug": "groupe-electrogene-6-kwa-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 262, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "groupe-electrogene-6-kwa" + ], + "slug": "groupe-electrogene-6-kwa-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 264, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "raccordement-electrique-bungalow-au-depart-compteu" + ], + "slug": "groupe-electrogene-6-kwa-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 266, + "available": true, + "parent": [ + "groupe-electrogene-6-kwa" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "reserve-deau-de-500-1-000-litres-mini" + ], + "slug": "reserve-deau-de-500-1-000-litres-mini-jour", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 80.0, + "unit": "D", + "specificity": "", + "default_quantity_by_day": 0, + "order": 270, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "reserve-deau-de-500-1-000-litres-mini" + ], + "slug": "reserve-deau-de-500-1-000-litres-mini-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 272, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "reserve-deau-de-500-1-000-litres-mini" + ], + "slug": "reserve-deau-de-500-1-000-litres-mini-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 140.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 274, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "wc-chimique-avec-produits" + ], + "slug": "wc-chimique-avec-produits-mois", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 80.0, + "unit": "M", + "specificity": "", + "default_quantity_by_day": 0, + "order": 280, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "wc-chimique-avec-produits" + ], + "slug": "wc-chimique-avec-produits-semaine", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 120.0, + "unit": "W", + "specificity": "", + "default_quantity_by_day": 0, + "order": 282, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-repli-locaux" + ], + "slug": "wc-chimique-avec-produits-am-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 100.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 284, + "available": true, + "parent": [ + "wc-chimique-avec-produits" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "vidange-wc" + ], + "slug": "wc-chimique-avec-produits-vidange", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 100.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 286, + "available": true, + "parent": [ + "wc-chimique-avec-produits" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "cloture-mobile-de-chantier-par-panneaux-en-treilli" + ], + "slug": "cloture-mobile-de-chantier-par-panneaux-en-treilli", + "service_provider": "", + "flat_rate": false, + "unitary_cost": 1.0, + "unit": "L", + "specificity": "", + "default_quantity_by_day": 0, + "order": 290, + "available": true, + "parent": null + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "amenee-et-pose-de-1-50-ml" + ], + "slug": "cloture-mobile-de-chantier-par-panneaux-en-treilli-am-pos", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 292, + "available": true, + "parent": [ + "cloture-mobile-de-chantier-par-panneaux-en-treilli" + ] + } +}, +{ + "model": "archaeological_files.equipmentservicecost", + "fields": { + "equipment_service_type": [ + "depose-et-repli-de-1-50-ml" + ], + "slug": "cloture-mobile-de-chantier-par-panneaux-en-treilli-dep-rep", + "service_provider": "", + "flat_rate": true, + "unitary_cost": 200.0, + "unit": "", + "specificity": "", + "default_quantity_by_day": 0, + "order": 294, + "available": true, + "parent": [ + "cloture-mobile-de-chantier-par-panneaux-en-treilli" + ] + } } ] diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 3237f594c..51273a17e 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -227,6 +227,12 @@ class EquipmentServiceCost(models.Model): lbl += " - " + str(DCT_ES_UNITS[self.unit]) return lbl + def natural_key(self): + return (self.slug,) + + def history_compress(self): + return self.slug + class FileType(GeneralType): class Meta: diff --git a/archaeological_files/templates/ishtar/forms/preventive_detail.html b/archaeological_files/templates/ishtar/forms/preventive_detail.html index cc27e26f3..3c58053ba 100644 --- a/archaeological_files/templates/ishtar/forms/preventive_detail.html +++ b/archaeological_files/templates/ishtar/forms/preventive_detail.html @@ -17,10 +17,16 @@ </div> </div> <div class="w-100 pb-3 text-center form-group"> - <button class="btn btn-secondary btn-sm form-planned" type="button">{% trans "Add default costs" %}</button> + <a class="btn btn-secondary btn-sm form-planned" type="button" + href="{% url 'file-edit-preventive-default-cost' file.pk %}"> + {% trans "Add default costs" %} + </a> </div> <div class="w-100 pb-3 text-center form-group"> - <button class="btn btn-secondary btn-sm form-worked" type="button">{% trans "Copy planned costs" %}</button> + <a class="btn btn-secondary btn-sm form-worked" type="button" + href="{% url 'file-edit-preventive-copy-planned' file.pk %}"> + {% trans "Copy planned costs" %} + </a> </div> {% for inline in inline_forms %} <h4>{{inline.form_label}}</h4> diff --git a/archaeological_files/tests.py b/archaeological_files/tests.py index bf9ac14c0..53c7d5282 100644 --- a/archaeological_files/tests.py +++ b/archaeological_files/tests.py @@ -61,7 +61,7 @@ def create_administrativact(user, fle): class FileTest(TestCase, FileInit): - fixtures = COMMON_FIXTURES + fixtures = FILE_TOWNS_FIXTURES model = models.File def setUp(self): @@ -234,7 +234,6 @@ class FileTest(TestCase, FileInit): self.assertEqual(parcel_nb, Parcel.objects.count()) def test_show(self): - c = Client() url = "show-file" pk = self.item.pk response = self.client.get(reverse(url, kwargs={"pk": pk})) @@ -247,6 +246,189 @@ class FileTest(TestCase, FileInit): self.assertEqual(response.status_code, 200) self.assertIn('class="card sheet"', response.content.decode()) + def test_preventive(self): + pk = self.item.pk + url = reverse("file-edit-preventive", kwargs={"pk": pk}) + response = self.client.get(url) + self.assertEqual(response.status_code, 302) + self.login_as_superuser() + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + job1 = models.Job.objects.all()[0] + job2 = models.Job.objects.all()[1] + cost1 = models.EquipmentServiceCost.objects.filter( + equipment_service_type=models.EquipmentServiceType.objects.all()[0] + ).all()[0] + cost2 = models.EquipmentServiceCost.objects.filter( + equipment_service_type=models.EquipmentServiceType.objects.all()[1] + ).all()[1] + data = { + "pk": pk, + "start_date": "2021-05-03", + "total_surface": 6000, + "linear_meter": 200, + "preventive-040-ground-jobs-0-file_id": pk, + "preventive-040-ground-jobs-0-job": job1.pk, + "preventive-040-ground-jobs-0-man_by_day_planned": 5, + "preventive-040-ground-jobs-0-days_planned": 6, + "preventive-040-ground-jobs-0-man_by_day_worked": 0, + "preventive-040-ground-jobs-0-days_worked": 0, + "preventive-030-post-excavation-0-file_id": pk, + "preventive-030-post-excavation-0-job": job2.pk, + "preventive-030-post-excavation-0-man_by_day_planned": 5, + "preventive-030-post-excavation-0-days_planned": 6, + "preventive-030-post-excavation-0-man_by_day_worked": 0, + "preventive-030-post-excavation-0-days_worked": 0, + "engins-mecaniques-0-file_id": pk, + "engins-mecaniques-0-equipment_service_cost": cost1.pk, + "engins-mecaniques-0-quantity_by_day_planned": 5, + "engins-mecaniques-0-days_planned": 6, + "engins-mecaniques-0-quantity_by_day_worked": 0, + "engins-mecaniques-0-days_worked": 0, + "locaux-de-chantiers-et-prestations-techniques-0-file_id": pk, + "locaux-de-chantiers-et-prestations-techniques-0-equipment_service_cost": cost2.pk, + "locaux-de-chantiers-et-prestations-techniques-0-quantity_by_day_planned": 5, + "locaux-de-chantiers-et-prestations-techniques-0-days_planned": 6, + "locaux-de-chantiers-et-prestations-techniques-0-quantity_by_day_worked": 0, + "locaux-de-chantiers-et-prestations-techniques-0-days_worked": 0, + } + for k in ( + "preventive-040-ground-jobs", + "preventive-030-post-excavation", + "engins-mecaniques", + "locaux-de-chantiers-et-prestations-techniques", + ): + data[k + "-TOTAL_FORMS"] = 1 + data[k + "-INITIAL_FORMS"] = 0 + data[k + "-MIN_NUM_FORMS"] = 0 + data[k + "-MAX_NUM_FORMS"] = 1000 + response = self.client.post(url, data) + self.assertRedirects( + response, + url, + status_code=302, + target_status_code=200, + fetch_redirect_response=True, + ) + file = models.File.objects.get(pk=self.item.pk) + self.assertEqual(file.total_surface, 6000) + self.assertEqual(file.linear_meter, 200) + self.assertEqual(file.start_date, datetime.date(2021, 5, 3)) + self.assertEqual( + models.PreventiveFileGroundJob.objects.filter(file_id=pk, job=job1).count(), + 1, + ) + self.assertEqual( + models.PreventiveFileGroundJob.objects.filter( + file_id=pk, job=job1.child + ).count(), + 1, + ) + self.assertEqual( + models.PreventiveFileJob.objects.filter(file_id=pk, job=job2).count(), 1 + ) + self.assertEqual( + models.PreventiveFileJob.objects.filter(file_id=pk, job=job2.child).count(), + 1, + ) + self.assertEqual( + models.PreventiveFileEquipmentServiceCost.objects.filter( + file_id=pk, equipment_service_cost=cost1.pk + ).count(), + 1, + ) + self.assertEqual( + models.PreventiveFileEquipmentServiceCost.objects.filter( + file_id=pk, equipment_service_cost=cost2.pk + ).count(), + 1, + ) + + def test_preventive_add_default(self): + pk = self.item.pk + url = reverse("file-edit-preventive", kwargs={"pk": pk}) + self.login_as_superuser() + for job in models.Job.objects.all()[:5]: + job.default_daily_need_on_ground = 4 + job.save() + for job in models.Job.objects.all()[:3]: + job.default_daily_need = 5 + job.save() + nb = models.EquipmentServiceCost.objects.update(default_quantity_by_day=10) + response = self.client.get( + reverse("file-edit-preventive-default-cost", kwargs={"pk": pk}) + ) + self.assertRedirects( + response, + url, + status_code=302, + target_status_code=200, + fetch_redirect_response=True, + ) + self.assertEqual(models.PreventiveFileJob.objects.filter(file_id=pk).count(), 3) + self.assertEqual( + models.PreventiveFileGroundJob.objects.filter(file_id=pk).count(), 5 + ) + self.assertEqual( + models.PreventiveFileEquipmentServiceCost.objects.filter( + file_id=pk + ).count(), + nb, + ) + + def test_preventive_copy_planned(self): + pk = self.item.pk + url = reverse("file-edit-preventive", kwargs={"pk": pk}) + self.login_as_superuser() + + for job in models.Job.objects.all()[:5]: + models.PreventiveFileJob.objects.create( + file_id=pk, job=job, man_by_day_planned=5, days_planned=42 + ) + models.PreventiveFileGroundJob.objects.create( + file_id=pk, job=job, man_by_day_planned=2, days_planned=50 + ) + + nb = models.EquipmentServiceCost.objects.count() + for cost in models.EquipmentServiceCost.objects.all(): + models.PreventiveFileEquipmentServiceCost.objects.create( + equipment_service_cost=cost, + file_id=pk, + quantity_by_day_planned=4, + days_planned=3, + ) + + response = self.client.get( + reverse("file-edit-preventive-copy-planned", kwargs={"pk": pk}) + ) + self.assertRedirects( + response, + url, + status_code=302, + target_status_code=200, + fetch_redirect_response=True, + ) + self.assertEqual( + models.PreventiveFileJob.objects.filter( + file_id=pk, man_by_day_worked=5, days_worked=42 + ).count(), + 5, + ) + self.assertEqual( + models.PreventiveFileGroundJob.objects.filter( + file_id=pk, man_by_day_worked=2, days_worked=50 + ).count(), + 5, + ) + self.assertEqual( + models.PreventiveFileEquipmentServiceCost.objects.filter( + file_id=pk, + days_worked=3, + quantity_by_day_worked=4, + ).count(), + nb, + ) + class FileOperationTest(TestCase, OperationInitTest, FileInit): model = models.File diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py index 1b1c4c771..dda3ce8e7 100644 --- a/archaeological_files/urls.py +++ b/archaeological_files/urls.py @@ -138,17 +138,24 @@ urlpatterns = [ name="file-add-operation", ), url( - r'^file/edit-preventive/(?P<pk>.+)/$', + r'^file/edit-preventive/(?P<pk>\d+)/$', check_rights(["change_file", "change_own_file"])( views.PreventiveEditView.as_view() ), name="file-edit-preventive", ), url( - r'^file/edit-preventive/(?P<pk>.+)/add-default-cost/$', + r'^file/edit-preventive/add-default-cost/(?P<pk>\d+)/$', check_rights(["change_file", "change_own_file"])( views.file_edit_preventive_add_default ), name="file-edit-preventive-default-cost", ), + url( + r'^file/edit-preventive/copy-planned/(?P<pk>\d+)/$', + check_rights(["change_file", "change_own_file"])( + views.file_edit_preventive_copy_planned + ), + name="file-edit-preventive-copy-planned", + ), ] diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 26787142f..9f45d5e08 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -21,7 +21,7 @@ import json import re from django.core.urlresolvers import reverse -from django.db.models import Q +from django.db.models import Q, F from django.http import HttpResponse, Http404, HttpResponseRedirect from django.forms.formsets import formset_factory from django.views.generic.edit import UpdateView @@ -489,7 +489,7 @@ class PreventiveEditView(IshtarMixin, LoginRequiredMixin, MixFormFormsetUpdateVi return context -def file_edit_preventive_add_default(request, pk): +def file_edit_preventive_add_default(request, pk, current_right=None): job_attrs = ( ("default_daily_need_on_ground", models.PreventiveFileGroundJob), ("default_daily_need", models.PreventiveFileJob), @@ -503,18 +503,36 @@ def file_edit_preventive_add_default(request, pk): "job": job, "file_id": pk, "days_planned": 1, - "man_by_day_planned": getattr(job, attr) + "man_by_day_planned": getattr(job, attr), } - job_model.create(**dct) - q = models.EquipmentServiceCost.exclude(default_quantity_by_day=0) + job_model.objects.create(**dct) + q = models.EquipmentServiceCost.objects.exclude(default_quantity_by_day=0) for cost in list(q.all()): q = models.PreventiveFileEquipmentServiceCost.objects.filter( - equipment_service_cost=cost, file_id=pk) + equipment_service_cost=cost, file_id=pk + ) if not q.count(): models.PreventiveFileEquipmentServiceCost.objects.create( - equipment_service_cost=cost, file_id=pk, + equipment_service_cost=cost, + file_id=pk, quantity_by_day_planned=cost.default_quantity_by_day, - days_planned=1 + days_planned=1, ) + return redirect(reverse("file-edit-preventive", kwargs={"pk": pk})) + +def file_edit_preventive_copy_planned(request, pk, current_right=None): + job_models = ( + models.PreventiveFileGroundJob, + models.PreventiveFileJob, + ) + for job_model in job_models: + job_model.objects.filter(file_id=pk).update( + man_by_day_worked=F("man_by_day_planned"), days_worked=F("days_planned") + ) + + models.PreventiveFileEquipmentServiceCost.objects.filter(file_id=pk).update( + quantity_by_day_worked=F("quantity_by_day_planned"), + days_worked=F("days_planned"), + ) return redirect(reverse("file-edit-preventive", kwargs={"pk": pk})) |