diff --git a/streetup/assets/migrations/0015_parkingspotinspection_apply_physical_counts_to_asset.py b/streetup/assets/migrations/0015_parkingspotinspection_apply_physical_counts_to_asset.py new file mode 100644 index 0000000..2a50168 --- /dev/null +++ b/streetup/assets/migrations/0015_parkingspotinspection_apply_physical_counts_to_asset.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.7 on 2026-08-08 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0014_alter_inspectiondocument_file'), + ] + + operations = [ + migrations.AddField( + model_name='parkingspotinspection', + name='apply_physical_counts_to_asset', + field=models.BooleanField(default=False, verbose_name="Mettre à jour la capacité / comptages de l'asset"), + ), + ] diff --git a/streetup/assets/models/inspection.py b/streetup/assets/models/inspection.py index 9a732cd..4748ded 100644 --- a/streetup/assets/models/inspection.py +++ b/streetup/assets/models/inspection.py @@ -285,6 +285,10 @@ class ParkingSpotInspection(AssetInspection): blank=True, verbose_name=_("Qualité du marquage constatée") ) + apply_physical_counts_to_asset = models.BooleanField( + default=False, + verbose_name=_("Mettre à jour la capacité / comptages de l'asset") + ) class Meta: verbose_name = _("Inspection d'emplacement de stationnement") @@ -292,6 +296,23 @@ class ParkingSpotInspection(AssetInspection): def save(self, *args, **kwargs): super().save(*args, **kwargs) + if self.apply_physical_counts_to_asset and self.asset: + target_asset = self.asset + modified = False + if self.verified_standard_stand_count is not None and hasattr(target_asset, 'standard_stand_count'): + target_asset.standard_stand_count = self.verified_standard_stand_count + modified = True + if self.verified_cargo_stand_count is not None and hasattr(target_asset, 'cargo_stand_count'): + target_asset.cargo_stand_count = self.verified_cargo_stand_count + modified = True + if self.verified_has_scooter_drop_zone is not None and hasattr(target_asset, 'has_scooter_drop_zone'): + target_asset.has_scooter_drop_zone = self.verified_has_scooter_drop_zone + modified = True + if self.verified_marking_quality and hasattr(target_asset, 'marking_quality'): + target_asset.marking_quality = self.verified_marking_quality + modified = True + if modified: + target_asset.save() def inspection_document_upload_path(instance, filename): diff --git a/streetup/assets/permissions.py b/streetup/assets/permissions.py index 65bfcb5..42f2376 100644 --- a/streetup/assets/permissions.py +++ b/streetup/assets/permissions.py @@ -216,6 +216,21 @@ def can_validate_asset(user, asset): return False +def can_inspect_asset(user, asset): + """Check if user has permission to perform an inspection on a specific asset.""" + if not user or not user.is_authenticated: + return False + if not hasattr(user, 'config') or not user.config: + return False + if user.config.roles.filter(name='admin').exists(): + return True + thematic = _get_asset_thematic(asset) + if not thematic: + return False + inspectable = user.config.get_inspectable_thematics() + return inspectable.filter(pk=thematic.pk).exists() if inspectable is not None else False + + def can_view_location(user, location): """Check if user can view a specific location.""" def _fallback(): diff --git a/streetup/assets/templates/assets/components/asset_inspections.html b/streetup/assets/templates/assets/components/asset_inspections.html new file mode 100644 index 0000000..21a96ca --- /dev/null +++ b/streetup/assets/templates/assets/components/asset_inspections.html @@ -0,0 +1,151 @@ +{% load i18n static %} + +{# Inspections et contrôles liés à l'asset #} +
+
+
+ {% translate "Inspections et contrôles terrain" %} + {% if inspections %} + {{ total_count }} + {% endif %} +
+ {% if can_inspect %} + + {% translate "Réaliser une inspection" %} + + {% endif %} +
+
+ {% if inspections %} +
+ + + + + + + + + + + + + {% for insp in inspections %} + + + + + + + + + {% endfor %} + +
{% translate "Date & Heure" %}{% translate "Statut du contrôle" %}{% translate "Nature" %}{% translate "Inspecteur" %}{% translate "Remarques" %}{% translate "Action" %}
+ {{ insp.inspection_date|date:"d/m/Y H:i" }} + + + {{ insp.get_result_status_display }} + + + {{ insp.get_nature_display }} + + {{ insp.inspector.get_full_name|default:insp.inspector.username|default:"-" }} + + + {{ insp.details_summary }} + + + +
+
+ {% else %} +
+ + {% translate "Aucune inspection ni vérification enregistrée pour cet équipement." %} +
+ {% endif %} +
+
+ +{% for insp in inspections %} + + +{% endfor %} diff --git a/streetup/assets/templates/assets/components/inspection_form_modal.html b/streetup/assets/templates/assets/components/inspection_form_modal.html index 588aca6..3211ba1 100644 --- a/streetup/assets/templates/assets/components/inspection_form_modal.html +++ b/streetup/assets/templates/assets/components/inspection_form_modal.html @@ -2,7 +2,7 @@