diff --git a/loko/assets/permissions.py b/loko/assets/permissions.py index 3adcbe2..45fdf54 100644 --- a/loko/assets/permissions.py +++ b/loko/assets/permissions.py @@ -16,32 +16,32 @@ ASSET_EDITABLE_FIELDS_BY_ROLE = { 'admin': [ 'code', 'external_reference', 'name_fr', 'name_nl', 'status', 'model', 'category', 'serial_number', 'installation_date', 'brand', 'warranty_duration', - 'last_inspection_date', 'funding_program', 'geom', 'lon', 'lat', + 'last_inspection_date', 'funding_program', 'note', 'geom', 'lon', 'lat', 'location_id', 'intersection_id', ], 'manager': [ 'code', 'external_reference', 'name_fr', 'name_nl', 'status', 'model', 'category', 'serial_number', 'installation_date', 'brand', 'warranty_duration', - 'last_inspection_date', 'funding_program', 'geom', 'lon', 'lat', + 'last_inspection_date', 'funding_program', 'note', 'geom', 'lon', 'lat', 'location_id', 'intersection_id', ], 'controller': [ 'code', 'external_reference', 'name_fr', 'name_nl', 'status', 'model', 'category', 'serial_number', 'installation_date', 'brand', 'warranty_duration', - 'last_inspection_date', 'funding_program', 'geom', 'lon', 'lat', + 'last_inspection_date', 'funding_program', 'note', 'geom', 'lon', 'lat', 'location_id', 'intersection_id', ], 'external_manager': [ - 'name_fr', 'name_nl', 'external_reference', 'category', 'brand', 'serial_number', 'funding_program' + 'name_fr', 'name_nl', 'external_reference', 'category', 'brand', 'serial_number', 'funding_program', 'note', ], - 'technician': ['name_fr', 'name_nl', 'external_reference', 'category', 'brand', 'serial_number', 'funding_program'], + 'technician': ['name_fr', 'name_nl', 'external_reference', 'category', 'brand', 'serial_number', 'funding_program', 'note'], 'operator': [], 'observer': [], 'viewer': [], 'editor': [ 'code', 'external_reference', 'name_fr', 'name_nl', 'status', 'model', 'category', 'serial_number', 'installation_date', 'brand', 'warranty_duration', - 'last_inspection_date', 'funding_program', 'geom', 'lon', 'lat', + 'last_inspection_date', 'funding_program', 'note', 'geom', 'lon', 'lat', 'location_id', 'intersection_id', ], } @@ -588,6 +588,10 @@ def get_allowed_update_fields_for_asset(user, asset): role_fields = ASSET_EDITABLE_FIELDS_BY_ROLE.get(role.name, []) allowed_fields.update(role_fields) + # Superuser fallback if no explicit roles configured + if getattr(user, 'is_superuser', False) and not allowed_fields: + allowed_fields.update(ASSET_EDITABLE_FIELDS_BY_ROLE.get('admin', [])) + # Check validation permission if can_validate_asset(user, asset): allowed_fields.add('validation_status') diff --git a/loko/assets/templates/assets/detail_generic.html b/loko/assets/templates/assets/detail_generic.html index 8ca6ca7..9cb723e 100644 --- a/loko/assets/templates/assets/detail_generic.html +++ b/loko/assets/templates/assets/detail_generic.html @@ -534,6 +534,19 @@ + + + + {% translate "Note générale" %} + +
+ {{ asset.note|default:"-"|linebreaksbr }} +
+
+ +
+ + {% get_asset_specific_fields asset as asset_specific_fields %} {% if asset_specific_fields %} diff --git a/loko/assets/templates/assets/naturetree_detail.html b/loko/assets/templates/assets/naturetree_detail.html index 82f6a90..6cb6dd7 100644 --- a/loko/assets/templates/assets/naturetree_detail.html +++ b/loko/assets/templates/assets/naturetree_detail.html @@ -490,7 +490,7 @@ {{ asset.note|default:"-"|linebreaksbr }}
- +
diff --git a/loko/assets/tests.py b/loko/assets/tests.py index 361d45b..2520abe 100644 --- a/loko/assets/tests.py +++ b/loko/assets/tests.py @@ -3516,6 +3516,16 @@ class AssetValidationPermissionTest(TestCase): fields = get_allowed_update_fields_for_asset(self.user, self.asset) self.assertIn("validation_status", fields) + def test_note_in_allowed_update_fields(self): + from assets.permissions import get_allowed_update_fields_for_asset + from common.models import Role + + editor_role, _ = Role.objects.get_or_create(name="editor") + self.user_config.roles.add(editor_role) + + fields = get_allowed_update_fields_for_asset(self.user, self.asset) + self.assertIn("note", fields) + def test_bulk_edit_assets(self): import json from django.urls import reverse diff --git a/loko/mobile/tests_asset_mobile.py b/loko/mobile/tests_asset_mobile.py index 85c0b78..a7b4e70 100644 --- a/loko/mobile/tests_asset_mobile.py +++ b/loko/mobile/tests_asset_mobile.py @@ -178,6 +178,8 @@ class MobileAssetDetailTests(TestCase): self.assertContains(response, 'id="asset-cms-edit-btn"') self.assertContains(response, 'id="asset-cms-save-btn"') self.assertContains(response, 'id="asset-cms-cancel-btn"') + self.assertIn('note', response.context['allowed_update_fields']) + self.assertContains(response, 'data-field="note" data-can-edit="true"') def test_tree_mobile_specific_elements(self): """NatureTree specific mobile design: dendrometric widgets, icons and input attributes.""" @@ -224,7 +226,8 @@ class MobileAssetDetailTests(TestCase): "height": 18.2, "circumference": 175.0, "vitality": "strong", - "tag_number": "TAG-99999" + "tag_number": "TAG-99999", + "note": "Arbre sain, élagage prévu à l'automne." } response = self.client.post( @@ -243,6 +246,7 @@ class MobileAssetDetailTests(TestCase): self.assertEqual(self.tree.circumference, 175.0) self.assertEqual(self.tree.vitality, "strong") self.assertEqual(self.tree.tag_number, "TAG-99999") + self.assertEqual(self.tree.note, "Arbre sain, élagage prévu à l'automne.") def test_mobile_index_shows_assets_card_when_authorized(self): """User with asset view rights sees 'Assets' card on mobile home."""