From 60332e7b5b61b0eb17a363a7128d5399db3c5636 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 13:11:58 +0000 Subject: [PATCH] Add bank account number to profile model, admin, and forms --- core/__pycache__/admin.cpython-311.pyc | Bin 20366 -> 20387 bytes core/__pycache__/forms.cpython-311.pyc | Bin 32073 -> 32790 bytes core/__pycache__/models.cpython-311.pyc | Bin 32555 -> 32697 bytes core/admin.py | 2 +- core/forms.py | 6 +++++- .../0026_profile_bank_account_number.py | 18 ++++++++++++++++++ ...rofile_bank_account_number.cpython-311.pyc | Bin 0 -> 904 bytes core/models.py | 1 + 8 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 core/migrations/0026_profile_bank_account_number.py create mode 100644 core/migrations/__pycache__/0026_profile_bank_account_number.cpython-311.pyc diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 1928577d514c32b444f0aece593f140906cab6f5..edbbe1701ed6c9e4ccbedcdff243e14a7abb9276 100644 GIT binary patch delta 2717 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 diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 88156a010a7a74d0033da79c371fc34b46214eff..7eb8830329e2737806c3f7d434636b7c6646c1cc 100644 GIT binary patch delta 2296 zcma)-e^69a6vy9vyUU`;FBgRcmR$sm<;TJzg60o|CIvGBH!YZ^1$nD20=wK@Hd#@a ziOOFyX{SMFWCW+e3>%@>)M%4s%`~P~Puq;>hfdZsSu`;6M>);ZJ$Drl_mA%E``mNy zIq&Rw_kQntpWP3rWd6s4qy>r`;Cr4Z&DtI1Qc+gKxtQWRV_ z8uU?mjO49dWsjM%VW=e?#!|H;8vaV{h#%2yu4~?AudA5PZ3`rk zcEiYmrJ6(RWvq%pVrL7_fvM(){7>A?N-%tlKmMPKr8@A*JEXB&|jRDK1 z1KL1Lmi&4;A>@#JeBmk4lB|gv6aF{ku8e*{c0g99+xRLgfWF4yAq=Z&K92kE!VhOM z*CgYxo?VkI;*NDo5TQ<+4128^a&6WMQXvWsRRdo~j9?>;6w}WV4`6cMq*zJhQFn6) zl8VR8oe`(&5y79GIxlj!u!Tr*UEwuRyM^tfCfX*L=fPn1VR8z}bIOz$c)I4Dz}qW!EleZb0EN}04@L{KG#@ZuFBppSTAvb& zKY3-5b2d2*$4kzTUby9409~a!wYWW=Icl(Grpo4rYBl5r>@7P;j7)!eSW=!|dKCW% zj}>(ydJ%mH8)6UQEaF|ndx)12T(&)E9fR(2fU4461gm$OU?*Yav{y*s&1oP`n$scsB&a zyMc@M*GDdq)ABp(e-9%Uq0hFw;}R>YF@pFGvFLl`4~PKb zYX&BXt7w0N_z`hU?tFX}S$Pp{ESQ%UEacuArjp#30zTciCZZ2-eiQK_obwqp7nnIF zFWdC>*5LAp4Mve&!k1$e2<1UKpPRiWhi07myA_QJnr0e7@x|$I!GOc>3TX{lUgNF+JzpF=#P{G9NTcnr= eI6X1tORy7?JSK$Z0mmz@aqgR#9#INPd)t3=Jx1C9 delta 1573 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

m?>TWJzR&WGEDr0jxxibUKw)~MB$ zBG=CZqnPCCiKLW%L1eTw){MtpMc~3)t{ZwP*;+om`DzpNyUVjXDNJ2{0kJ$a)T6$1 zHlHlP1T|RUnUSDwRei1@ErGQsPOctsDbLIZ9LligdC(DU>5q<8%Mb&d9%gFjptz; zGd9h%(mw{Kwtec>f!3uSMtx#x#noLkVE3kE*rM#&R1P^-$hpg_I2B%X^mhD4_6L*B JIz`y5z(1ZtCUgJ* diff --git a/core/admin.py b/core/admin.py index 9be8687..e0bc4e2 100644 --- a/core/admin.py +++ b/core/admin.py @@ -23,7 +23,7 @@ class ProfileInline(admin.StackedInline): verbose_name_plural = _('Profiles') fieldsets = ( (None, {'fields': ('role', 'is_approved', 'phone_number', 'profile_picture', 'address')}), - (_('Driver Info'), {'fields': ('license_front_image', 'license_back_image', 'car_plate_number'), 'classes': ('collapse',)}), + (_('Driver Info'), {'fields': ('license_front_image', 'license_back_image', 'car_plate_number', 'bank_account_number'), 'classes': ('collapse',)}), (_('Location'), {'fields': ('country', 'governate', 'city'), 'classes': ('collapse',)}), ) diff --git a/core/forms.py b/core/forms.py index c216544..741107d 100644 --- a/core/forms.py +++ b/core/forms.py @@ -113,6 +113,8 @@ class UserRegistrationForm(forms.ModelForm): profile.license_back_image = self.cleaned_data['license_back_image'] if 'car_plate_number' in self.cleaned_data: 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.save() return user @@ -128,6 +130,7 @@ class DriverRegistrationForm(UserRegistrationForm): license_front_image = forms.ImageField(label=_("License Front Image"), required=True, widget=forms.FileInput(attrs={'class': 'form-control', 'accept': 'image/*'})) license_back_image = forms.ImageField(label=_("License Back Image"), required=True, widget=forms.FileInput(attrs={'class': 'form-control', 'accept': 'image/*'})) car_plate_number = forms.CharField(label=_("Car Plate Number"), max_length=20, required=True, widget=forms.TextInput(attrs={'class': 'form-control'})) + bank_account_number = forms.CharField(label=_("Bank Account Number"), max_length=50, required=True, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('Bank Name - Account Number')})) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -144,6 +147,7 @@ class UserProfileForm(forms.ModelForm): address = forms.CharField(label=_("Address"), required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) profile_picture = forms.ImageField(label=_("Profile Picture"), required=False, widget=forms.FileInput(attrs={'class': 'form-control'})) + bank_account_number = forms.CharField(label=_("Bank Account Number"), required=False, max_length=50, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('Bank Name - Account Number')})) otp_method = forms.ChoiceField( choices=[('email', _('Email')), ('whatsapp', _('WhatsApp'))], @@ -154,7 +158,7 @@ class UserProfileForm(forms.ModelForm): class Meta: model = Profile - fields = ['profile_picture', 'phone_number', 'address', 'country', 'governate', 'city'] + fields = ['profile_picture', 'phone_number', 'address', 'country', 'governate', 'city', 'bank_account_number'] widgets = { 'country': forms.Select(attrs={'class': 'form-control'}), 'governate': forms.Select(attrs={'class': 'form-control'}), diff --git a/core/migrations/0026_profile_bank_account_number.py b/core/migrations/0026_profile_bank_account_number.py new file mode 100644 index 0000000..f447a0a --- /dev/null +++ b/core/migrations/0026_profile_bank_account_number.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-01-31 13:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0025_platformprofile_admin_panel_logo_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='bank_account_number', + field=models.CharField(blank=True, max_length=50, verbose_name='Bank Account Number'), + ), + ] diff --git a/core/migrations/__pycache__/0026_profile_bank_account_number.cpython-311.pyc b/core/migrations/__pycache__/0026_profile_bank_account_number.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcc0d35aa3e89187573ed64aefbe9a2e7f05224d GIT binary patch literal 904 zcmZuw&ui2`6rM@4*-dCcw*}EElp@8wG^J2aMQ95O{@6=Ja1V~Nnc3ZJlT4g!v1h|i+W7l1_>B?z zqd~bU6X#?NoPER)!y$@r3r9xFz{o(45Hmg@W^&v&%R^tl`*Dt1CbPCsqjIFv4MVw6 z(3Nx$h&WYtBp44J2epeBI@Op1q+I1ZE7<@w%NLTXrRC+7Rg#2s&=E39r04`8CzM4&OcEONkc6Tu z2#pzubbWPFqGsAO-X_%dMHUZ8oJDOepC7FNw+}NLkeXi~r{ROE$ zPk79D><2uR`c_nJow0|yhqN?wHhWYSSh*tMle_tjPPC|JTV78@+{@bVO_|4cxStJ# z^xg@%ohH=hp4QC!f2SU(cb}B1U7^TQ@?P4|xiH#EUxL{^-?@#PO`My?tiAg*cad}Z zvpcNKjc&}3t}l-23ww*h`og!_p9_aiULV%!uR0ypXy+TCNFIK3iU%>4&S^Yn)R literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index efb9c7e..0e1a1eb 100644 --- a/core/models.py +++ b/core/models.py @@ -78,6 +78,7 @@ class Profile(models.Model): license_front_image = models.ImageField(_('License Front Image'), upload_to='licenses/', blank=True, null=True) license_back_image = models.ImageField(_('License Back Image'), upload_to='licenses/', blank=True, null=True) car_plate_number = models.CharField(_('Car Plate Number'), max_length=20, blank=True) + bank_account_number = models.CharField(_('Bank Account Number'), max_length=50, blank=True) country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Country')) governate = models.ForeignKey(Governate, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Governate'))