From d8246c69a2933949f00e9c271577343d6e534455 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 23 Jan 2026 10:05:02 +0000 Subject: [PATCH] demo4 --- core/__pycache__/forms.cpython-311.pyc | Bin 4131 -> 6993 bytes core/__pycache__/views.cpython-311.pyc | Bin 10299 -> 10372 bytes core/forms.py | 30 +++++++++++++- core/templates/registration/register.html | 40 +++++++++++------- core/views.py | 47 ++++++++++------------ 5 files changed, 75 insertions(+), 42 deletions(-) diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index ba213a642bba489fcad29fd789be8c4653b1a26b..5638d921c8dda43ab380be3ef6778473bd3d32b4 100644 GIT binary patch literal 6993 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 Gp!gS^C^qN- delta 1148 zcmZ`&O-vI(6yBw~+ue5Cg+OTeQ9*&SArKVP7=MT%1vQ3h1TJ1SYj=Rcw!6+w1M~t1 zFCNLn$jQWLVz_u|;?cy5XS|WQ=#?9155{>@3W4Zm^6i^%-n{p|nKwW39|qE&QmKT* zzm-B%-ZOU7S^48`?pnVrd6K92S|$Emm!&r8f#j*LBu_)~nz8#XVuw|w$2e=X)$uNsCbrIJ}>r7u*Er%6UB`h{m_PCe1f(SvI#PQww z7BxF&8|&sTInLBd;31zrP5bHJCPW%91yzCrpMFbca&{Y2OTHULEE)Q439Sachwwg6 z>Jow@oaIT2wn^ud;USgVIL(1+%Vp$y5stycSmaqBRl^!#vO_c0AbqXmO{UBv;$o9~ zXpLvq4f*y6Y#-%N+*fcvOfCUjZqaxcEa8;{3(i-7O24+xYGNVLFgo_+?F?T!g5>*c zqC%$NU?al4umdV)isuq!w-(7(h>CXdVp0vL3R1Ds<zlZfpz_fzjNumE~#qU%J_SYxRxFIS-IdQx0ZgnU#YO)(&} zu1ro$UOyER5ftJnh;);~KV-#W?Sd?Ap&9fltlgsT+dHkZ`tNZvN3HIi<{6LDH{E}> zr#WfsEEWbKQ=?jlFw-5UTrCsF!O#gT9=urNg+|Z~K0#QVBGX^i5Z;Oqu~nvUDa%Z8 z@d|fZ-+(_Zz*fU?MAJD=1fd4_x6?e(hkROZpDA139BnzcWj7zg@!HzOYZP|? z`&jBEYzg_k6c_zZGj#yq?n zsH547;`&60^PT!zzsuiP%}3LCiSL7a(N7M?F4^aVU)*{C{*EO8JBH<5;0z JdfzHg?O*1o5k>$2 diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 00c55ae24457b342f8510393b7eaef0141a07932..c979782d4fb3c450edd0e315f207e2931fe59233 100644 GIT binary patch delta 2342 zcmah~Z)_V?65qF8|Et$tJ9gr@c4EhyIB|41%~41SDHWw@lE!J0A}C!z!OdQp zAt{m(RDy_8ovK?884XH<5mv%RM2Q%UN+XqXsz+}!qDqwUUcK3fDZ3fJOOG1~CBb-~ z-eR;Wt&|rRIVGw3DNSikHL%ECqiI}+TsQ}PFK@i+QX8M-vQ6XydWQUj_91~}_;f=p z@|3CJW7_GWY2kuZEX}PQ;zfkKWYS?Ek$mM)_&iVILd@}B%Rz4MZX#ns$bnWVFQi@g zqcU0*C@Y8gGC%8N0V#ReQAV>aqDPbDf*=LUjw#Q!YDY2PWeV?(!ofVHn-OO%$?KAYByv@Xl6_%Ngd72y=69{JEVA0_ov3cr zQ$|H}jh5p&l!Pr>5ij}C8J{@UR$qgZIX^wEndYf^J(oJJ>C+`cYpZ$Hf;n@tRKV)F z)P$}TOf5BC!dRQOQr3)?(l9PzGj&qaOMlIgkV_7SYA!>wW=bj!(`YzN3CX)+3pH_? z{ywLvQ)TmMVMcCuCv%!cq1Dx9$!so?mIY=}uPM$qh+f9eOukm3nQdcS%_HNtgD& zw*TURNI(xT_*|ZHkfQqbq&y zJzmKSSKCMI_K~W1#1@ZK*t03gRjI?4I@T84PYc04bO&soTlMmjO<%i91Yv+kVmInu zdqn)+f%-@y_;&stW2g-71QG-S-KaSakK_lR#9biB0_g_=#m5f-$pPu1WX&CV1d*WN zMJ_VhaPomqEFYELS!Hh4was5c6kqh+S}!AdKHP9r$X5X;@{nFnBdG<_{=2B>S3OKG zL^|(aI7p5}lCioYFzes;SLUo3c{bfm{wXC<3;B=K6?%~Ba0d|B(P2DFZbjsynfn8@ zILF|6s)UW)xhO@j)^nz0T2tms@r60>65gsI`7)SzqOMANA>99|(iSou zb;$H=do=;HYYDC((K|{?^$y&wk*1 z<7_pWv!l7C;q_$ZN_lCRB5YlZTpD|A?Be+H_|o`B9q5LtnPHnEN*uApk%~BSU(h{t zwAwyyw~trF30s_~uxC?>Up&8jeo5H$h2H3_#P{BK@pJ3OT-7&d`vxn*AWpq0#K;d# z-^Tl(5>Wk`Fg`JO^g~p0nO4D?H}ON{`)GXNVXDe{@01a2**RxWgr?$yK%M|{2najb z{8s%QCjHGV&f`>kYE5ar&G+rZVx7(+=9M;_TAXV>SX5JI^un~J)(tQHY#TmKUWp$$ zfhVa|wgJP0#w_xEPe%io0G8?+z7IaZ#qYXKx)UvEk_;!hoX=DJ+}eENW4_@8WwZR& zAMD=&(x1#MFb|J{PO8gmD>;@8b9OgF7W-+4!p6m; zHbx1Ty7sm(ee0jFPO6dFb*6XEexo^&<_mz z!VvsJ4yS;Jd*Oec0UB#w*B-+!(oYyy=54YsbBtWg45UXY+#fvT=gf(QAR0lpxH{TS dUg&%*7D9)q80c*W#|IZ%Z}Ci&A)j`>`YVFRJI4S3 delta 2480 zcmZ`*?Qh%087C={qAby*B#V+`*_15Bk{ZNL+c>S8CRx)sYa1^~n{+Qs5Lq@En+|Ci zM>%T?c`612bGHCndIl0;``{0&w<6nz!Ptgw81@gem}CgB#v#Ktpg=!5SUX_F2JD_w zlR8~`kbihy@1DEogcVJsv9+;Zp?^Lo#e#bKBLb~7ztN1G$Lcnkdt&%MvBrsPQSa)7@&06NxOr_ zAf+SDkgFRyq2*P^$e6tZvzA~gtIQ^I^I!Eep%Xwe%pHi2E~98_7no8Kzs7zus=n%3 z=y_ySYIb$;bQQVy1NK=qfP1*%t&^O@vOV}rz-49pUcgAd&oay{rp_$f-- zJv_#jWM+YKAlV3DR!HFA^(pEKM_e9OKx?E@94r%z!aPQ~}U*{J@aE7%a z)VaD)4t6<)sRsxrJ>UfJ%Bayq{Jw~oFm-;D9CU}n=L8Ms^cdDfJ(}EWVG5>*GpR%& zc-H67pSy6;=TX(M{K(RLbF1s@p@GD!qF zKqMYKL540g1Qt>QS#!2mBl=Oo_kqoy2)xO3g1xKXxvgyn^=44NtLPiSpGI2B!M1X6 zjqfPhjrxwFZxgZDQVMOQK!j>?J+h-_w$;qWP)j}3Ru8QSov`x5W8Xja)`=S@c9~$P z)QKl=O}ssE^XU4~wNo8!-#Y$VPzvW%@7k?DVi!ulm9Freo4{RNi{~lluV?Fv~v1^R~oJf!Q z!s!>MCNH28m_7zD4gi<-gWmG&tmSz=TlNL=8dbC<#-3rrP!;gF|9pnSmy=WYRy@Jo zt>dMkY~18GNzvXRf8DjhQaS!lGRkpX@}jB+Rsvo6H$d~0)=cROu0pMsVentGB`o)Z zV|A9)XQ0m4gWmrgR^hvghV&zF0-}oW1CSvSu&R4)tZza_s9CdcAB`Y8I)c$6=F~0bT*P z0B{lDRRZ{0BGX9DR*^NfRP}0QZ{A*Vt;O2te9d)Az32-`qE%V|XNU?F0mzjZbb^2{ z&cc|mXe!Vd5KjT@t?Ea`F$RJBUroyo#e=>hHw+f!bHtm6=fH9%+l7j{%@TdOlH^P?WgcPQH_E=AUm3 zpK1@EYDtrAX|gFz-c^#f!!0G>R`N|L|6w@#qe64wa4S6C4v#naaeN~A@5W(xImo}y zpF2N!_FdK&y;`NV?4c)!@QnmbnOi~EtlE-OnYC!b(33=03OzDw57LCbLX6OJ05mgP zciw=jM@AzVEM%zQ-=%XhZ zj`MmJUB({|ymZBv?pIYQh6Li#EtxMZEtuEc`ue=ZkAQ3%0Q!7SaeWQnN)NKr_}A&8 zFiTY4)<4p};$l|_S>n1L)OP~EqmMME!TD*>DSIM$9HcZH1t_Rx`bfTLy+)?0w`WS7 z1Rd=H*u@W29H;w=eD@VApq~Z+y$6;sr@LcX!7pW0VUEb&+A3#0;MgnpU~Z5#@R{7P zr$9{J6*eeEyTQ?Driq~2!!$yA_9c+f(f2g|V{T0Uyw}R$9-y)K;*4#UZ4=F4IX@^Y z5zRUt%YVd{aBBZmqu*SpEY4L&XRC`fWY3INmTU8)SIPI?qn|K8@|k|QW;-5&e_qHZ zu1bcBhazyi3_y#DhN*&qK>hI__Mc*>FgNnt3!`8}r`S25potMw6@pYDxH5vc-eph* zX!w|YDm_b%S$3@BXoavam%UH%4@O>5k2INwe)umV$J0+XnJ@j}qlIt96!t}Sm)V2E dc(ZU^)7T@s41s$AhErFEb~z9n!v8IN?|;y?Ra^i7 diff --git a/core/forms.py b/core/forms.py index a294740..5970473 100644 --- a/core/forms.py +++ b/core/forms.py @@ -1,6 +1,34 @@ from django import forms -from .models import Truck, Shipment, Bid +from .models import Truck, Shipment, Bid, Profile from django.utils.translation import gettext_lazy as _ +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User + +class UserRegistrationForm(UserCreationForm): + email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={'class': 'form-control'})) + confirm_email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={'class': 'form-control'}), label=_("Confirm Email")) + role = forms.ChoiceField(choices=Profile.ROLE_CHOICES, widget=forms.Select(attrs={'class': 'form-select'})) + phone_number = forms.CharField(max_length=20, required=False, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '+1234567890'})) + + class Meta(UserCreationForm.Meta): + model = User + fields = UserCreationForm.Meta.fields + ('email',) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + for field in self.fields.values(): + if not isinstance(field.widget, (forms.CheckboxInput, forms.Select)): + field.widget.attrs.update({'class': 'form-control'}) + + def clean(self): + cleaned_data = super().clean() + email = cleaned_data.get("email") + confirm_email = cleaned_data.get("confirm_email") + + if email and confirm_email and email != confirm_email: + self.add_error('confirm_email', _("The two email fields didn't match.")) + + return cleaned_data class TruckForm(forms.ModelForm): class Meta: diff --git a/core/templates/registration/register.html b/core/templates/registration/register.html index b5eab21..6e0ea86 100644 --- a/core/templates/registration/register.html +++ b/core/templates/registration/register.html @@ -9,24 +9,34 @@

{% trans "Create your account" %}

-
+ + {% csrf_token %} - {{ form.as_p }} -
- - -
+ {% if form.non_field_errors %} +
+ {% for error in form.non_field_errors %} + {{ error }} + {% endfor %} +
+ {% endif %} + + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %} +
{{ field.help_text|safe }}
+ {% endif %} + {% if field.errors %} + {% for error in field.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+ {% endfor %} -
- - -
- - +

{% trans "Already have an account?" %} {% trans "Login" %}

diff --git a/core/views.py b/core/views.py index 32e746d..256a0f9 100644 --- a/core/views.py +++ b/core/views.py @@ -1,10 +1,9 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth import login, authenticate -from django.contrib.auth.forms import UserCreationForm from django.utils import timezone from .models import Profile, Truck, Shipment, Bid, Message -from .forms import TruckForm, ShipmentForm, BidForm +from .forms import TruckForm, ShipmentForm, BidForm, UserRegistrationForm from django.contrib import messages from django.utils.translation import gettext as _ from django.db.models import Q @@ -19,19 +18,20 @@ def home(request): def register(request): if request.method == 'POST': - form = UserCreationForm(request.POST) - role = request.POST.get('role') - phone = request.POST.get('phone_number') + form = UserRegistrationForm(request.POST) if form.is_valid(): user = form.save() profile = user.profile - profile.role = role - profile.phone_number = phone + profile.role = form.cleaned_data.get('role') + profile.phone_number = form.cleaned_data.get('phone_number') profile.save() login(request, user) + messages.success(request, _("Registration successful. Welcome!")) return redirect('dashboard') + else: + messages.error(request, _("Please correct the errors below.")) else: - form = UserCreationForm() + form = UserRegistrationForm() return render(request, 'registration/register.html', {'form': form}) @login_required @@ -85,24 +85,19 @@ def post_shipment(request): return redirect('dashboard') if request.method == 'POST': - description = request.POST.get('description') - weight = request.POST.get('weight') - origin = request.POST.get('origin') - destination = request.POST.get('destination') - delivery_date = request.POST.get('delivery_date') - - Shipment.objects.create( - shipper=request.user, - description=description, - weight=weight, - origin=origin, - destination=destination, - delivery_date=delivery_date - ) - messages.success(request, _("Shipment posted successfully!")) - return redirect('dashboard') + form = ShipmentForm(request.POST) + if form.is_valid(): + shipment = form.save(commit=False) + shipment.shipper = request.user + shipment.save() + messages.success(request, _("Shipment posted successfully!")) + return redirect('dashboard') + else: + messages.error(request, _("Please correct the errors in the form.")) + else: + form = ShipmentForm() - return render(request, 'core/post_shipment.html') + return render(request, 'core/post_shipment.html', {'form': form}) @login_required def marketplace(request): @@ -164,4 +159,4 @@ def accept_bid(request, bid_id): bid.shipment.save() messages.success(request, _("Bid accepted! Shipment is now in progress.")) - return redirect('shipment_detail', shipment_id=bid.shipment.id) + return redirect('shipment_detail', shipment_id=bid.shipment.id) \ No newline at end of file