This commit is contained in:
Flatlogic Bot 2026-01-23 16:20:16 +00:00
parent 066a111def
commit b15b95317d
8 changed files with 79 additions and 24 deletions

View File

@ -66,7 +66,7 @@ class TruckForm(forms.ModelForm):
fields = [ fields = [
'truck_type_link', 'model', 'model_ar', 'year', 'plate_no', 'truck_type_link', 'model', 'model_ar', 'year', 'plate_no',
'load_capacity', 'load_capacity_ar', 'color', 'color_ar', 'registration_expiry_date', 'load_capacity', 'load_capacity_ar', 'color', 'color_ar', 'registration_expiry_date',
'truck_picture', 'registration_front', 'registration_back', 'driver_license' 'truck_picture', 'registration_front', 'registration_back', 'driver_license_front', 'driver_license_back'
] ]
widgets = { widgets = {
'truck_type_link': forms.Select(attrs={'class': 'form-select'}), 'truck_type_link': forms.Select(attrs={'class': 'form-select'}),
@ -82,7 +82,8 @@ class TruckForm(forms.ModelForm):
'truck_picture': forms.FileInput(attrs={'class': 'form-control'}), 'truck_picture': forms.FileInput(attrs={'class': 'form-control'}),
'registration_front': forms.FileInput(attrs={'class': 'form-control'}), 'registration_front': forms.FileInput(attrs={'class': 'form-control'}),
'registration_back': forms.FileInput(attrs={'class': 'form-control'}), 'registration_back': forms.FileInput(attrs={'class': 'form-control'}),
'driver_license': forms.FileInput(attrs={'class': 'form-control'}), 'driver_license_front': forms.FileInput(attrs={'class': 'form-control'}),
'driver_license_back': forms.FileInput(attrs={'class': 'form-control'}),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -144,4 +145,4 @@ class ShipperOfferForm(forms.Form):
delivery_date = forms.DateField(label=_('Requested Delivery Date'), widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'})) delivery_date = forms.DateField(label=_('Requested Delivery Date'), widget=forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}))
amount = forms.DecimalField(label=_('Offer Amount'), max_digits=10, decimal_places=2, widget=forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'})) amount = forms.DecimalField(label=_('Offer Amount'), max_digits=10, decimal_places=2, widget=forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}))
comments = forms.CharField(label=_('Comments'), required=False, widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 2})) comments = forms.CharField(label=_('Comments'), required=False, widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 2}))

View File

@ -0,0 +1,27 @@
# Generated by Django 5.2.7 on 2026-01-23 16:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0011_trucktype_alter_truck_truck_type_and_more'),
]
operations = [
migrations.RemoveField(
model_name='truck',
name='driver_license',
),
migrations.AddField(
model_name='truck',
name='driver_license_back',
field=models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Driver License (Back Face)'),
),
migrations.AddField(
model_name='truck',
name='driver_license_front',
field=models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Driver License (Front Face)'),
),
]

View File

@ -109,7 +109,8 @@ class Truck(models.Model):
truck_picture = models.ImageField(_('Truck Picture'), upload_to='trucks/', blank=True, null=True) truck_picture = models.ImageField(_('Truck Picture'), upload_to='trucks/', blank=True, null=True)
registration_front = models.ImageField(_('Registration Front'), upload_to='docs/', blank=True, null=True) registration_front = models.ImageField(_('Registration Front'), upload_to='docs/', blank=True, null=True)
registration_back = models.ImageField(_('Registration Back'), upload_to='docs/', blank=True, null=True) registration_back = models.ImageField(_('Registration Back'), upload_to='docs/', blank=True, null=True)
driver_license = models.ImageField(_('Driver License'), upload_to='docs/', blank=True, null=True) driver_license_front = models.ImageField(_('Driver License (Front Face)'), upload_to='docs/', blank=True, null=True)
driver_license_back = models.ImageField(_('Driver License (Back Face)'), upload_to='docs/', blank=True, null=True)
is_approved = models.BooleanField(_('Is Approved'), default=False) is_approved = models.BooleanField(_('Is Approved'), default=False)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
@ -256,4 +257,4 @@ def sync_user_groups(sender, instance, **kwargs):
instance.user.groups.remove(*other_groups) instance.user.groups.remove(*other_groups)
# Add user to the correct group # Add user to the correct group
instance.user.groups.add(group) instance.user.groups.add(group)

View File

@ -87,7 +87,8 @@
data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}" data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}"
data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}" data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}"
data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}" data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}"
data-license="{% if truck.driver_license %}{{ truck.driver_license.url }}{% endif %}"> data-license-front="{% if truck.driver_license_front %}{{ truck.driver_license_front.url }}{% endif %}"
data-license-back="{% if truck.driver_license_back %}{{ truck.driver_license_back.url }}{% endif %}">
<i class="fa-solid fa-eye me-1"></i> {% trans "View" %} <i class="fa-solid fa-eye me-1"></i> {% trans "View" %}
</button> </button>
<a href="{% url 'approve_truck' truck.id %}" class="btn btn-success btn-sm"> <a href="{% url 'approve_truck' truck.id %}" class="btn btn-success btn-sm">
@ -145,7 +146,8 @@
data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}" data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}"
data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}" data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}"
data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}" data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}"
data-license="{% if truck.driver_license %}{{ truck.driver_license.url }}{% endif %}"> data-license-front="{% if truck.driver_license_front %}{{ truck.driver_license_front.url }}{% endif %}"
data-license-back="{% if truck.driver_license_back %}{{ truck.driver_license_back.url }}{% endif %}">
<i class="fa-solid fa-eye me-1"></i> {% trans "View" %} <i class="fa-solid fa-eye me-1"></i> {% trans "View" %}
</button> </button>
<a href="{% url 'suspend_truck' truck.id %}" class="btn btn-outline-danger btn-sm"> <a href="{% url 'suspend_truck' truck.id %}" class="btn btn-outline-danger btn-sm">
@ -166,7 +168,7 @@
<!-- Truck Details Modal --> <!-- Truck Details Modal -->
<div class="modal fade" id="truckDetailsModal" tabindex="-1" aria-labelledby="truckDetailsModalLabel" aria-hidden="true"> <div class="modal fade" id="truckDetailsModal" tabindex="-1" aria-labelledby="truckDetailsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-xl">
<div class="modal-content border-0 shadow"> <div class="modal-content border-0 shadow">
<div class="modal-header bg-primary text-white"> <div class="modal-header bg-primary text-white">
<h5 class="modal-title fw-bold" id="truckDetailsModalLabel">{% trans "Truck Details" %}</h5> <h5 class="modal-title fw-bold" id="truckDetailsModalLabel">{% trans "Truck Details" %}</h5>
@ -222,7 +224,7 @@
<hr class="my-4"> <hr class="my-4">
<h6 class="fw-bold text-primary mb-3">{% trans "Documents & Registration" %}</h6> <h6 class="fw-bold text-primary mb-3">{% trans "Documents & Registration" %}</h6>
<div class="row g-3"> <div class="row g-3">
<div class="col-md-4"> <div class="col-md-3">
<p class="small text-muted mb-1">{% trans "Registration Front" %}</p> <p class="small text-muted mb-1">{% trans "Registration Front" %}</p>
<div class="bg-light rounded text-center p-2"> <div class="bg-light rounded text-center p-2">
<a id="modal-reg-front-link" href="#" target="_blank"> <a id="modal-reg-front-link" href="#" target="_blank">
@ -231,7 +233,7 @@
<p id="no-reg-front" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p> <p id="no-reg-front" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-3">
<p class="small text-muted mb-1">{% trans "Registration Back" %}</p> <p class="small text-muted mb-1">{% trans "Registration Back" %}</p>
<div class="bg-light rounded text-center p-2"> <div class="bg-light rounded text-center p-2">
<a id="modal-reg-back-link" href="#" target="_blank"> <a id="modal-reg-back-link" href="#" target="_blank">
@ -240,13 +242,22 @@
<p id="no-reg-back" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p> <p id="no-reg-back" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-3">
<p class="small text-muted mb-1">{% trans "Driver License" %}</p> <p class="small text-muted mb-1">{% trans "License Front" %}</p>
<div class="bg-light rounded text-center p-2"> <div class="bg-light rounded text-center p-2">
<a id="modal-license-link" href="#" target="_blank"> <a id="modal-license-front-link" href="#" target="_blank">
<img id="modal-license-img" src="" alt="License" class="img-fluid rounded" style="max-height: 120px; display: none;"> <img id="modal-license-front-img" src="" alt="License Front" class="img-fluid rounded" style="max-height: 120px; display: none;">
</a> </a>
<p id="no-license" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p> <p id="no-license-front" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p>
</div>
</div>
<div class="col-md-3">
<p class="small text-muted mb-1">{% trans "License Back" %}</p>
<div class="bg-light rounded text-center p-2">
<a id="modal-license-back-link" href="#" target="_blank">
<img id="modal-license-back-img" src="" alt="License Back" class="img-fluid rounded" style="max-height: 120px; display: none;">
</a>
<p id="no-license-back" class="text-muted py-3 mb-0" style="display: none;">{% trans "Not available" %}</p>
</div> </div>
</div> </div>
</div> </div>
@ -326,7 +337,8 @@
{ id: 'modal-truck-img', noId: 'no-truck-img', src: data.truckPicture }, { id: 'modal-truck-img', noId: 'no-truck-img', src: data.truckPicture },
{ id: 'modal-reg-front-img', noId: 'no-reg-front', src: data.regFront, linkId: 'modal-reg-front-link' }, { id: 'modal-reg-front-img', noId: 'no-reg-front', src: data.regFront, linkId: 'modal-reg-front-link' },
{ id: 'modal-reg-back-img', noId: 'no-reg-back', src: data.regBack, linkId: 'modal-reg-back-link' }, { id: 'modal-reg-back-img', noId: 'no-reg-back', src: data.regBack, linkId: 'modal-reg-back-link' },
{ id: 'modal-license-img', noId: 'no-license', src: data.license, linkId: 'modal-license-link' } { id: 'modal-license-front-img', noId: 'no-license-front', src: data.licenseFront, linkId: 'modal-license-front-link' },
{ id: 'modal-license-back-img', noId: 'no-license-back', src: data.licenseBack, linkId: 'modal-license-back-link' }
]; ];
imgFields.forEach(field => { imgFields.forEach(field => {
@ -366,4 +378,4 @@
border-bottom: none; border-bottom: none;
} }
</style> </style>
{% endblock %} {% endblock %}

View File

@ -101,7 +101,7 @@
<h5>{% trans "Documents & Photos" %}</h5> <h5>{% trans "Documents & Photos" %}</h5>
<div class="row {% if CURRENT_LANGUAGE == "ar" %}flex-row-reverse{% endif %}"> <div class="row {% if CURRENT_LANGUAGE == "ar" %}flex-row-reverse{% endif %}">
<div class="col-md-6 mb-3"> <div class="col-md-12 mb-3">
<label class="form-label">{% trans "Truck Picture" %}</label> <label class="form-label">{% trans "Truck Picture" %}</label>
{% if truck.truck_picture %} {% if truck.truck_picture %}
<div class="mb-2"> <div class="mb-2">
@ -111,17 +111,31 @@
{{ form.truck_picture }} {{ form.truck_picture }}
{{ form.truck_picture.errors }} {{ form.truck_picture.errors }}
</div> </div>
</div>
<div class="row {% if CURRENT_LANGUAGE == "ar" %}flex-row-reverse{% endif %}">
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label class="form-label">{% trans "Driver License" %}</label> <label class="form-label">{% trans "Driver License (Front Face)" %}</label>
{% if truck.driver_license %} {% if truck.driver_license_front %}
<div class="mb-2"> <div class="mb-2">
<img src="{{ truck.driver_license.url }}" class="img-thumbnail" style="height: 100px;"> <img src="{{ truck.driver_license_front.url }}" class="img-thumbnail" style="height: 100px;">
</div> </div>
{% endif %} {% endif %}
{{ form.driver_license }} {{ form.driver_license_front }}
{{ form.driver_license.errors }} {{ form.driver_license_front.errors }}
</div>
<div class="col-md-6 mb-3">
<label class="form-label">{% trans "Driver License (Back Face)" %}</label>
{% if truck.driver_license_back %}
<div class="mb-2">
<img src="{{ truck.driver_license_back.url }}" class="img-thumbnail" style="height: 100px;">
</div>
{% endif %}
{{ form.driver_license_back }}
{{ form.driver_license_back.errors }}
</div> </div>
</div> </div>
<div class="row {% if CURRENT_LANGUAGE == "ar" %}flex-row-reverse{% endif %}"> <div class="row {% if CURRENT_LANGUAGE == "ar" %}flex-row-reverse{% endif %}">
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label class="form-label">{% trans "Registration (Front Face)" %}</label> <label class="form-label">{% trans "Registration (Front Face)" %}</label>
@ -158,4 +172,4 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}