From 8ac308c73fb7787a9fded4cce5caa4d259a982e3 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 2 Feb 2026 03:35:13 +0000 Subject: [PATCH] Autosave: 20260202-033511 --- core/__pycache__/admin.cpython-311.pyc | Bin 24900 -> 25707 bytes core/__pycache__/forms.cpython-311.pyc | Bin 33914 -> 34098 bytes core/__pycache__/models.cpython-311.pyc | Bin 42140 -> 45314 bytes core/__pycache__/views.cpython-311.pyc | Bin 63424 -> 66068 bytes core/admin.py | 26 +- core/forms.py | 5 +- ...le_enable_auto_ban_on_warnings_and_more.py | 40 + core/migrations/0034_profile_language.py | 18 + ...o_ban_on_warnings_and_more.cpython-311.pyc | Bin 0 -> 2381 bytes .../0034_profile_language.cpython-311.pyc | Bin 0 -> 956 bytes core/models.py | 38 +- core/templates/core/driver_dashboard.html | 110 +- core/templates/core/profile.html | 8 +- core/views.py | 58 +- locale/ar/LC_MESSAGES/django.mo | Bin 29514 -> 34320 bytes locale/ar/LC_MESSAGES/django.po | 2548 +++++++++++++---- .../pasted-20260201-154837-60ba680b.png | Bin 0 -> 80141 bytes 17 files changed, 2208 insertions(+), 643 deletions(-) create mode 100644 core/migrations/0033_platformprofile_enable_auto_ban_on_warnings_and_more.py create mode 100644 core/migrations/0034_profile_language.py create mode 100644 core/migrations/__pycache__/0033_platformprofile_enable_auto_ban_on_warnings_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0034_profile_language.cpython-311.pyc create mode 100644 staticfiles/pasted-20260201-154837-60ba680b.png diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a41ab6620e9b44a8b72304ee3dd79e1febe8bf62..365dd75019159e9717ebe5925e3aa98ecc16099a 100644 GIT binary patch delta 6467 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 VpB!1N>-|9LyC(H5uKbDo{$KVI-g^K5 delta 5809 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 d(|o^K zVl!nk9u~W#ZtfArrY?-1)41%984@2EaiAzz_t1%&7S8*Ra(D&qFu7%JACJ??265En z<@uHj9MdGpeX^&QV@diAh{LFi`WQjUQiRkEc2}LpUgtzlMhy($&5W&J6!ohsAnLZs za-u!h?k^jUN)c-_FUzu5D&oW3|Ax55+z-5uLv7m{wB#mZh9$?;&lVNVGc*H3iLjBz z7Zz|BU$9u=0v6{R#WBlC9)`rG>?c6^4hb&dNKOIoU&z-RIoBXb30>kuZXFMUVsZZC z@-&foT4SmN_ksEbXKGdb{uYnm6y7886~g;CRIpd4VkUhvO2F8{m$0dDEyyuYxV4by zoEnFwpB4Q!6)t@aMNqy^>(K7y%(}Vw>Sm|#cYdo|Xw2U2Y_XfwI9IrCTad{G10kM} z#9)>SPm#T!@GLfLKH(tUA}NTRYhyzEP9J9+1FX%E%tBzjG^=4Z!$K~uL$$p z@<;hFw@Cc7s4R2Rm>Eb2rVQ8yU8C!_j~cCGM(eoI8rCS{v|*0HuL|pN<>oZqWRfue zfvgkJ!Dt+b&J|sohc$2wHo%tbCPhIaEEZ0@EzfM!ac$_3}%H8BKupyEy53kDe~uAGT7)c`@GfB(V>?$WK4<2Pc(Fzu2l*&A6l6=~OKGP_ zwYU*G4V{Dog!vLNsd0}<5*{U|bc-L8`!pGF;BG~SchI$ zVoY0_nBtPFmA}yRDZI5S9d{gD2438E@Zz4+sPq*qXSzNEgFHYF{^;Pr>{5kQhIe`l_l|)A}+{6wu_0#A4>3%Or7;TrcA+L2yvm6{b7ir_uL^Yv48lr-!JE$ zbMCq4+cs;P!OUBd=v(^|_{co^t`%!>hSnqrY zJ*CSnZ}NPUqa1$Vs8uRxJn}C>I9}QSBN!>qXSw$dNifF792-IRHaU!9e|QNNJFT#n zhdY@()Cuw=M3|{;n*=9Vr2H{W(Ky$HvRsO9tG7e8y1Z?Hpdu@boKF(o!E2RG={hdb zb8S+EjVt;z9_^qS|5~xKm;|@plh&lN>#rL(_+{m0s0N?X=~yQRTJ0(5ud?Cul{tki zJc80jc#1$rprjKrIPiSc-Eai8)ukox^Whu(^$&4GZvCdRmqfKwIoo66k1f@!4e=Ds zB7I!N5lx9_;6!y%Dp%!_3jcoG#_p;)n+B)w$|LW=VXW<1il5YnVU*Q3?A5|A*mLJ< zG_H--9pcN(XVXs7VZsr@2Eq%34+!rPP7w|g1_+d*GK@28Ey=h2G}#IJnR(rBk}X5a zllw0cq?@~KFr(Aug43+m%Yo%}L2rl0+qF%}Bh$Bp?+8B-ek7bH%n*Je{7m?s z!>(1PNIplHCR`v~mg0#KFRfXyxCGfbCb`+tIhZD<1cVqb;rr+ z4A!~}wV!b@&YpCqE&?aEcUC$?IU)+JwV<$88p?#Ng!$|+*4bzgjxUi?9Os85`3R!* zL|f$F+NEj9>k$>sNB9U04TU(+Wdu7L?J7;xU8ac_ab|lt1Tpv7V~vMMAv*bX@7PHv z8c4XWr{U9t7YRu}^a-*MW?ANr9DoUC**OHdIH?nOHdKT8Zi94lSFUnxggJNp3DA%C zg;zlwJHtgl*FYKU$1~xeE$Je&6phfsuNc3V3xD8+-f}#!y9Q>_vNNCky4waYiCGaV z{Ep5@l@7Qk?=@fK(QHwWlR}94<_}24?XTdK$R+&^vJej7x!yI>4HcH`8M#ATV07z< zZ$MNiGT@$gd5;;=Q2X4c73~20>P*go2L@Lqgl%r2hZ{A0n<}0FFvnHN`LcY_mk_qO Lg&uX--#7dZKftU< diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 92a5f4b8e512d4c3c0449e37437053c4eef56565..0dfce24555f3d6302627cc214773c11e11f1238d 100644 GIT binary patch delta 5341 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 delta 4808 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 UWj-c0)`kBo9^v_I-!W$TKjDyN-2eap diff --git a/core/admin.py b/core/admin.py index e1dab42..9c171e2 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User -from .models import Profile, Parcel, Country, Governate, City, PlatformProfile, Testimonial, DriverRating, NotificationTemplate, PricingRule, DriverReport, DriverRejection, ParcelType +from .models import Profile, Parcel, Country, Governate, City, PlatformProfile, Testimonial, DriverRating, NotificationTemplate, PricingRule, DriverReport, DriverRejection, ParcelType, DriverWarning from django.utils.translation import gettext_lazy as _ from django.urls import path, reverse from django.shortcuts import render, redirect @@ -18,19 +18,23 @@ from django.template.loader import render_to_string import weasyprint from django.db.models import Sum +class DriverWarningInline(admin.TabularInline): + model = DriverWarning + extra = 1 + class ProfileInline(admin.StackedInline): model = Profile can_delete = False verbose_name_plural = _('Profiles') fieldsets = ( - (None, {'fields': ('role', 'is_approved', 'is_banned', 'ban_reason', 'phone_number', 'profile_picture', 'address')}), + (None, {'fields': ('role', 'is_approved', 'is_banned', 'ban_reason', 'phone_number', 'profile_picture', 'address', 'language')}), (_('Driver Assessment'), {'fields': ('driver_grade', 'is_recommended')}), (_('Driver Info'), {'fields': ('license_front_image', 'license_back_image', 'car_plate_number', 'bank_account_number'), 'classes': ('collapse',)}), (_('Location'), {'fields': ('country', 'governate', 'city'), 'classes': ('collapse',)}), ) class CustomUserAdmin(UserAdmin): - inlines = (ProfileInline,) + inlines = (ProfileInline, DriverWarningInline) list_display = ('username', 'email', 'get_role', 'get_driver_grade', 'get_approval_status', 'get_ban_status', 'is_active', 'is_staff', 'send_whatsapp_link') list_filter = ('is_active', 'is_staff', 'profile__role', 'profile__is_approved', 'profile__is_banned', 'profile__driver_grade') @@ -208,9 +212,12 @@ class PlatformProfileAdmin(admin.ModelAdmin): 'fields': ('accepting_shipments', 'maintenance_message_en', 'maintenance_message_ar'), 'description': _('Toggle to allow or stop receiving new parcel shipments. If stopped, buttons will turn red and an alert will be shown.') }), - (_('Driver Rejection / Auto-Ban'), { - 'fields': ('auto_ban_on_rejections', 'rejection_limit'), - 'description': _('Configure automatic banning for drivers who reject too many shipments.') + (_('Driver Warning & Rejection / Auto-Ban'), { + 'fields': ( + 'enable_auto_ban_on_warnings', 'max_warnings_before_ban', + 'auto_ban_on_rejections', 'rejection_limit' + ), + 'description': _('Configure automatic banning for drivers who exceed warning or rejection limits.') }), (_('Testing / Development'), { 'fields': ('auto_mark_paid',), @@ -403,3 +410,10 @@ class NotificationTemplateAdmin(admin.ModelAdmin): admin.site.register(NotificationTemplate, NotificationTemplateAdmin) admin.site.register(ParcelType) + +class DriverWarningAdmin(admin.ModelAdmin): + list_display = ('driver', 'reason', 'created_at') + list_filter = ('created_at',) + search_fields = ('driver__username', 'reason') + +admin.site.register(DriverWarning, DriverWarningAdmin) diff --git a/core/forms.py b/core/forms.py index 57cc2dd..f971caf 100644 --- a/core/forms.py +++ b/core/forms.py @@ -115,6 +115,7 @@ class UserRegistrationForm(forms.ModelForm): profile.car_plate_number = self.cleaned_data['car_plate_number'] if 'bank_account_number' in self.cleaned_data: profile.bank_account_number = self.cleaned_data['bank_account_number'] + profile.language = get_language() profile.save() return user @@ -158,16 +159,18 @@ class UserProfileForm(forms.ModelForm): class Meta: model = Profile - fields = ['profile_picture', 'phone_number', 'address', 'country', 'governate', 'city', 'bank_account_number'] + fields = ['profile_picture', 'phone_number', 'address', 'country', 'governate', 'city', 'bank_account_number', 'language'] widgets = { 'country': forms.Select(attrs={'class': 'form-control'}), 'governate': forms.Select(attrs={'class': 'form-control'}), 'city': forms.Select(attrs={'class': 'form-control'}), + 'language': forms.Select(attrs={'class': 'form-control'}), } labels = { 'country': _('Country'), 'governate': _('Governate'), 'city': _('City'), + 'language': _('Language'), } def __init__(self, *args, **kwargs): diff --git a/core/migrations/0033_platformprofile_enable_auto_ban_on_warnings_and_more.py b/core/migrations/0033_platformprofile_enable_auto_ban_on_warnings_and_more.py new file mode 100644 index 0000000..284a4f2 --- /dev/null +++ b/core/migrations/0033_platformprofile_enable_auto_ban_on_warnings_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 5.2.7 on 2026-02-02 02:52 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0032_parceltype_parcel_parcel_type'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='platformprofile', + name='enable_auto_ban_on_warnings', + field=models.BooleanField(default=False, help_text='Automatically ban drivers who exceed a certain number of warnings.', verbose_name='Enable Auto-Ban on Warnings'), + ), + migrations.AddField( + model_name='platformprofile', + name='max_warnings_before_ban', + field=models.PositiveIntegerField(default=3, help_text='Number of warnings allowed before auto-ban.', verbose_name='Max Warnings Before Ban'), + ), + migrations.CreateModel( + name='DriverWarning', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('reason', models.TextField(verbose_name='Reason for Warning')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), + ('driver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='warnings', to=settings.AUTH_USER_MODEL, verbose_name='Driver')), + ], + options={ + 'verbose_name': 'Driver Warning', + 'verbose_name_plural': 'Driver Warnings', + 'ordering': ['-created_at'], + }, + ), + ] diff --git a/core/migrations/0034_profile_language.py b/core/migrations/0034_profile_language.py new file mode 100644 index 0000000..dacfc86 --- /dev/null +++ b/core/migrations/0034_profile_language.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-02-02 03:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0033_platformprofile_enable_auto_ban_on_warnings_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='language', + field=models.CharField(choices=[('en', 'English'), ('ar', 'Arabic')], default='ar', max_length=10, verbose_name='Language'), + ), + ] diff --git a/core/migrations/__pycache__/0033_platformprofile_enable_auto_ban_on_warnings_and_more.cpython-311.pyc b/core/migrations/__pycache__/0033_platformprofile_enable_auto_ban_on_warnings_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88bdf03457b47fe02544649ae35a56afcd2afb4d GIT binary patch literal 2381 zcma)7J8auV7$zx+qGb6YKcc!yVkStM$cgQ=M(aL;B8u&#X=6Kx9kkU@_M|(>bSRQJ zQhsPCJap)orD%rEZi;xw(4k|eqUb~e8ibn)bjqe6o-*~nqo~A9P?Qq?yZi6I@4o+W z$DjK9(-J(p*_`ZUX=>!6Fyun$V~Hy@0)hbD<~{oH)|C6rek|d ztvi@lUZuNEG=ts2vp;3di3mO=18UmgI@UXBP=vj{Jj~?|EY{rC56g3I3j_v366hMMEe8B1rVKo$KNOog5>Tjfay^&sT zH0t5;mm`he+|U1;Wi5`6;}iH~O~w;H#`g82F|5T(WB3$Q!)caUiZTyn5U)6tu+x_= z&Awx}h*pT@@3^GfjT)|EgRX`Aszd88b*iRCSf1FZY!L%Be8(sw+i+}S3sIXF*tO=> zBB<+7U=?IpJ37qkn3|h}divJ7qm%6lAy`Lxg-{=vwr)4-WkPkQsz(^p&HSR+LFZ6Y zR{_DX_0PLI6k;riNfk9LpQYA`gZKFtfuuh7xK4`&NFhqgL*dkPjzH*-s9yT?nvDxh?r%la3D$6d-y zG4UExZY&hyEF*$ep#=E^vp$!abwqcJyJUx@JVH%mnN31@#W59(JjZSh-xjS7M5E0L za%ht70vX6}rsqRYz34-F!+mUL%Rm@+@xnAPEs8T!Lz+M<1u2A^fcS)ED1m$v9EMKu z9kIGO5ZXoznuABjUbAoN1(`xD+;ZgQq!_N%pvYpHLos-2*T9M&2&Rg}cr59-;#yiR z9Alax_BRZcHVjB*1M1CS8N;~OKo(D@VNiZj*{HXLTvya1CN8ltu`4^2=aLN;@2q`d z+*w_`Z7i)UEZ$_9o`p#~rWG;1#!G_oYnWxOI*vtoG@MGUK^2DG{soBNnpr2|FntXw%≫L5@|tf$W;Y6kKMS2sqrsEID6X zoi8pdvb5up?%n*e^bA-@&#jqtr%q-X<%aDyX2>?Fz?O7o%b|BY7gfj%KgTmK?(`Wr z(X$ZhBS+Twj}vPk8$*OCnRa(5|DXuL?{4pVxYKugzm6)U=Gxl1@6s*p+(WH({>p(? zY-z<#A~ve--t1(g)NwwSZ|Bapv(xS2v-jU>4WE5TI+AonUQnP}Rb1YT+*6(kc_?Hj z8Be93N+1ro=%kMTO}2-pIMCE%6wJFEOZifOlmtjg;UFdDH6Rn5&B=CF|0_Ed zuaqipj@LM0kT3%hG}(2flS+&ZbOxkTZ@16A-##($&C-I zyPxtO{V2*)L1W`#O-%;dOl)ybqgo|j{Q_W9YcCwrkK~vr`A*PkAJZ0%U)#%1N zVQVcH%}lQ60~+!`iyHjB`T*p8Olnzco#qCg zr48*W&_=!iFuItfjl4Bnn#K)#v|9SeyZz1Icc%_+O&?sFI+&c_)GVXb8;kM-eJvN_hN zbg9%hV|hoXRk?S;I&~M%#C<03feXJ9%0B>= platform_profile.max_warnings_before_ban: + profile = self.driver.profile + profile.is_banned = True + profile.ban_reason = _("Automatically banned due to exceeding warning limit (%(limit)d warnings).") % { + 'limit': platform_profile.max_warnings_before_ban + } + profile.save() + except Exception: + pass + + class Meta: + verbose_name = _('Driver Warning') + verbose_name_plural = _('Driver Warnings') + ordering = ['-created_at'] diff --git a/core/templates/core/driver_dashboard.html b/core/templates/core/driver_dashboard.html index 3d37cbc..f8bb2e7 100644 --- a/core/templates/core/driver_dashboard.html +++ b/core/templates/core/driver_dashboard.html @@ -5,9 +5,33 @@
+ + +
+
+
+
+ + + + + + {% if search_query %} + + + + {% endif %} +
+
+
{% if not is_approved %} @@ -15,10 +39,58 @@
{% trans "Account Pending Approval" %}
-

{% trans "Your driver account is currently under review by our administrators. You will be notified once your documents are verified and your account is approved to accept shipments." %}

+

{% trans "We are currently revising your documents. Please be patient. We will inform once we finish." %}

{% endif %} + + +
+
+
+
+
{{ stats.accepted_count }}
+
{% trans "Accepted Parcels" %}
+
+
+
+
+
+
{{ stats.rejected_count }}
+
{% trans "Rejected Parcels" %}
+
+
+
+
+
+ {% if stats.average_rating %} + {{ stats.average_rating|floatformat:1 }} + {% else %} + N/A + {% endif %} +
+
{{ stats.rating_count }}
+
{% trans "Shippers Rating" %}
+
+
+
+
+
+
{{ stats.driver_grade }}
+
{% trans "Admin Rate" %}
+ {% if stats.is_recommended %} + {% trans "Recommended" %} + {% endif %} +
+
+
+
+
+
{{ stats.warning_count }} / {{ stats.max_warnings }}
+
{% trans "Warnings" %}
+
+
+