From 9726a81f0cfb7ef635817a2cb90bcaf3b5fe8da7 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 24 Jan 2026 03:30:04 +0000 Subject: [PATCH] adding subscription fee --- core/__pycache__/admin.cpython-311.pyc | Bin 8356 -> 8839 bytes core/__pycache__/forms.cpython-311.pyc | Bin 14430 -> 15734 bytes core/__pycache__/models.cpython-311.pyc | Bin 26922 -> 27822 bytes core/__pycache__/views.cpython-311.pyc | Bin 24159 -> 24640 bytes core/admin.py | 14 ++++-- core/forms.py | 14 +++++- ...ual_fee_appsetting_monthly_fee_and_more.py | 43 ++++++++++++++++++ ...tting_monthly_fee_and_more.cpython-311.pyc | Bin 0 -> 1870 bytes core/models.py | 11 +++++ core/templates/registration/register.html | 27 +++++++++++ core/views.py | 8 +++- 11 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 core/migrations/0017_appsetting_annual_fee_appsetting_monthly_fee_and_more.py create mode 100644 core/migrations/__pycache__/0017_appsetting_annual_fee_appsetting_monthly_fee_and_more.cpython-311.pyc diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index c9f108df52a5e1907774a3ac39b2f554770b4db7..af5adc3af30a7e9d201cf1dcd777a730ef301c76 100644 GIT binary patch delta 1392 zcmZWpU1%It6rQ_3lbPASq?_z+Hfh~ZX}h(iQfV|zk%Um%h1gW1rCDRAlbO4_lg`YJ zcV=T^NwQ)ksTP}hAF5PpONvqoQpvOW?2}UnSO$cMZ-S7559*Wm%wlZG41Dv=_nmw0 z<=%78-I3)J$*&U$iDOUWxT`;({xou5isG)T|Hj?vepbNos0PSFR_3_l8Vlon!#(J1q=0A3N1lk~e-i5~}doW|pa z(KvIv>0(=&*5Y||hJFw)NoTt&FX@2+3&zEybtl`%5QxG~u+cS$%pz8IGuBFS2EOR$F%$1SGl|vdThqaIv)*?EpghCvSXwk1& zj{A@&c$mj;du=;BVcQdTcoKM(NIAN~Rgf0DER^@~E8H9^w@q-xxStxa?FsCX&~ zOx-F*=x><=OMd55MT9M7+Q8arpRefH&>U7yD{NtY#Hd&6KJT!PV!f9hWqZo%tx&Qm zbz&+|l`QfKizFXGcnUV11;~n~5$rgAbPQJ&qZski1Xp#(CBYckQX1woCcfkx)l1x9?awFTI9NZ`V0k`Ea;PaOL) zhyZVa@i~LPn%sZyW_q$Ywkal71uy@ymm2hhV~<2>rNfIA9*TV%V&CmkUcc(?)jRz`q@>lb#&(*xbMX$^71hXZ-@=(lgi22XXdHbil-nTvB{FWH);G3nbB<;`SsGUpF z;Y^e+=6JLm+}a;2?J!lmCppgXaBDh$=HV4aFqd)cRMi18i==nK( lG=W~+;&#F+-pK5G491@TkHcK3cLViog&=ef{rj2w{{lmAhx7md delta 967 zcmZXS-%Aux6vy}OFW1?fRkv*y-CcDR%%wmvQnp{X#tMQ;p=DV#j^-+Q_%RfN!_|+XC%MtCF>dRWDN5O-Ojk>k zrQu!msJDmbSPvwm4$=cR1NG49OTwyj*_*{gKYW#Dqzp<#8ziMLl>AYWIq<&mAN8S^ zFPw#M{sHe0x`!YW=paMf)lY`ubzndm#W11^cB;bAB!|dorAuxlBn_8>SBO@58Ki_v zLZr6$809|OU1mko_G@L+GD-@5uqhrl-5kx$&5Nv+3s$Hs*RHz=gHX7;yNGoGs%q1U zX6P23vsfBK9;HMrm3g>Mc^P(RHxMSmf`xD!(JN2FGo)L?NCBa9*s`K%Mb$JlS}ZEc zGqSe>!c)C_%a5aV9I}yx7)mTZc$|OK_ZAqGn__ch+%w`xx$K(E?Cc1&th_#z$(8bY z$_00$?eIe0YGl`W4O0*~4%5YPa8wO?>yIcRIgO4M4t|_C>I9+@(S#7kSVnb^!~AE% zD;Pvv#l#topNo$D_sgLSD3Le}H`J4r{VP7@?^AU?J9~R|vs=8z_82Tj8M}sB(il}O znp0HknUme;ArVh;D|~LaD6L@xLB;%>k44FvXucFnkBM#plWJDp&=u>>EdASoJ>W$t z7kjwh(ypCUwZarL%6g99aM57={Mdo5BQ_A5h%u;(XC*+1D8NL#lK^bS=gBhTv23`ERt`?Mwgw diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index cb35ac54118422d8bb02576cb3381fd9f5b9328b..4624d9cdb5947c76e0fe5f7cee09722bab4b0018 100644 GIT binary patch delta 4295 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 NlU*FS=a<3!e*k}+mMQ=M diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index c0eda8549ba039e68b37012c75dade92cd27fac9..9f1466b581bf39c77c04a25add60fb600dab01ca 100644 GIT binary patch delta 3280 zcma)8dr(x@8Q-%nmQ^16VqYMjh_3SV0Vuu}>izAE)nwm6Y zYyy5vwb7*JF^G>Q>YYq8t*zQLNn2y*(%C=AHtCp}OzU*4P|Zvo|FGw~D`O=2qj%^2 z_B-F}eCIpoeBV9$7xLccB=K}Yf>y?!s&!%iH>DR77bKBCLvGS9IrhdL#!r;^NpP^(U`8EPkK_sEoQ9vzC7zFmOuNCX>PdWTB;%5~TGGM!HuS1=>?#vZqRj+RDpZJwiL;EkN+kZhb8otrh4 zxlNq)kj$OJ*%}oxhaIYuk5)zF>gruh)wQjR=nICs1A|eu)8%S**0TR#aKIagDqZ!i z3Wj|_zUhoSstgVU0(3p|T1j;bZ>t!<&E&;$+6;G9Rv}Y2N=UgN=naI_!l#BD*s<0G z8e{Ho7t^Fm5&R6I#>VEd#`0&jG&F6gcX`UI>$j9wG)8ryfsT-m`uoHFzM!W+;0;FO zH+#c;rJoOQQNvSGeqX$4W&_`c!<rb=My+F3 zQDdKuQ>Lm#rDa+xvpSBeBbKEX%EV1gVml{V_(=;NvGAhOG-X?MJUe1rc0u{!X3^%H zv^gU-r>Hbfr4<}+iKG>LXcE&lPNr>)sM0oyO4}vVE;(ry+RbXBcVm=c1`ZM>yU)n! zPS|V7Glv)_8rRp+!~4RasM<$)mLxh1zqYI<8?6fIWq#3;FAIoVIKMu%GvMDIJ4r3!UUgf?`o3QN6+x z?!kL*3*=?pSC6t$XgR#^PJs=Jr_{&L#Ysrb-kK-5lupkWGG9mdIl?;#KSlT%!kY+h z!&r7kJRlil03T()p7moKNo!w%)E)%M{|Tf{A-pTC`!JFS?ZTT&1{LHm?6g^h!sXdY zas+ndr?FM<&3`Sq8P)J2P&_|$089mKq!acOw31)J^@4lk3S22nCBK0$3a^uoU}8l* zxeEVXk;!P=%HNW4_4pbu z^2ro9)>b&KqXE_*S~6=&*C2HZL5c8pgu`%bZD#rnMn*NhzTRFw7!JiQyA*3IEa}=s zP#pmm8(M_d&LHSZEkuP(->A+6o7dfX9FB8+Jqu@a{VMVme6oH^t`z^A`R|}ZY34W| zD`ITsSQh?`(`j#`6ydMXzTqgjEzE34A>=Y>HaXZvuGn-@b)N}u!#_8jNcfgf4teb0 z+SnmAzy*UE&N$8F4qS7-tert$2wy{E+3&~u_!<*N)s2C^E^m-thEFT%$W1U+7VR7|R|LHs0Y0Pg zJB2x;lILUfe`wz0#(^xF%)HPq7^BBDqX;aE{6>^S#9%djHYs?M9+d)wTs+57bQQvPM!Ox~x;%*l+(^o_9T0^NZdby=cmw3PcE|~Vms|xT1%Bx|PST;FzC>-s#GZs#>qW-! zG_;!1k+BG2DZ&zjvv8v!qxJz#bQ&QQnNR9Y2J)65NF_E4r4EEN0yPoV zZ2N!^opAS=enp8M`3401exgQ3HPLlQnvi)JsT4*H%`cDL_Kc+!E(g5{$66d&c#Nq9 z^`t~#W@0(2L8=zvC-8O4N~M|UNGXbFs$k#t{5V{Ni>|^dnUsNgMT}9*-q0#3W4E@q z#t}B83kZxlEzq{Z7{3n384O_CqOgK4M2TT3u6W2=-Pg-EvgXV_WAZqEh<(Wndcyv2 zfZvElC)o@!qio5DIN*cU%=ikFEsHta4{h%GL&>BswwI}J1>1zr+7+bOiB{@pT(>vm4TmYMV&kYX zzQ6#x5?#>Xvzxy&0fwRKqJ0DXv>aaWRj67SXP5AqubHS1qO%uZ37=kqUp`WgmHMUB zv7|mCH2|q##E!6(ENSB~Xxa+T^J&B@oaA#!P8wM~E&D#a+<7E0gZ%qXgd2o!I~S51 ZBT1WitcS_UD-ld~cO|R)YcWZ3OJ9B???s#(5=huL)0C$9W}7RxxF(aEu3y{2MB?r--Rrh4xg@)*`slhHb;9Z;afy0?*o} znp8t%ARNZda);tfdk~;p8A(qEsKe74#bCqgGCP93xUiE4up&YiVHIH|hnmpOqWuz+ zhu9rxtIEQ6?N;3d0nghvDHk0bI%rg?oF+(Xp@1F^7pTztgpRGm)!ClRAf+%zyVgko zIi{KdO!CVTi{X*%GHAvRvqP{F=jCKgiBPzU5GM3fSW-;(%b`G@B=b>7LlA%ySEa^m^PZLk)-Q<`89cTTyM zcOSX65)wJoWSI>FdVTUxzvS~XwjCcXtcJUlbA?ubEy@p5Qvr71U(>Fc_E5-P{AKzQ zkCsB~*LG4qKtRGngq?)@3B!Z~7%j?A*~UdRv5q&OJ|u-jJXmz7@NP0|#ZMHXHMevHq6|U8gBsk-bx7JpEXX@&#D0* z*3W8#XYi3(*K(ibrVW`bJ)!@fAM!<6C>V;2;b_TQ@I2mAx(vqf?a~4` zi9eOT42SSU*_7TFDQhv|1;WdOQ-qU*(}W`&YO*MWLxU0<@`?1qpCbe9UbXsTu~0A~ zi9W6A>}Cz1{jo8v?BgU7_A70(kLchyeplyIQoT!c5E@Q%;$ZnI@Z&q>GvGb^t9*g$ z74oN#ip?cx;a-wHAs7fB6E#vF)7WWG$i;xDw^=g3O<5KF3t;T#o* z=d1pNQT(jh#b2qpX4Lo%w_m_hHHQ2Ia3zfzNKSAL_LCn}Hi1uSTJ~8+mzuMD92cH-jVkVy$S!h}0v2NiO)zlJ>2K^B> ziuH>c;UnC)Xf}=-R^dI1>n+#01KqJ1xH&N$KVQ5{_p5+?OR~U@r)zV~>=$liM{#6H z2b{sghB=T=MW$XMHQ{RteiW3)8oB`G#)WW2d8zTZju$I7xnU~~H_f<(&aax-BZd2Y zvb0`iUs14)l*VODlo+EDScrq~%Yo3`3VK}KTy9AMK``+E_kCp9QomzZE86 z`SODX8@J)9>DhR7d5+o2AJ|?2{T+k2qooZp@QaoI7&xXFK~vy-QC>DdCxxSlXX3In$$cGVc? zaMyaJsY?%YN+`;tntS{)zbrH6<=kMa6-zRLNSD{E!=p z?ND|__&>IH?+#xj{q-A04{loLQ1+}#f?^v?x+44^dmZ~GUM2nY8^&q)M(cKryY za|WnV*@`+s&ib(xG}dY92kS;#vv*_HUXWSfTgCr17gvo47AJ+{UG8|byq$hfu@x$jGN~h!|T;0S@~cwoT+hwKiA_`tFvs`Hh;fvow@{mSLuZFHTm!l zn^!_5nK3H{uhR{G-dI^HsVlQO;yT$Lm*RTaaY;XkiMcwPoNk@JB+w2Qa$8+mQS8Lg zSU(SssNrZNI5HfHXokR^K%3tT@8>Sj^Nopr=6YF!U#}UCMfq{fF>k&S2^}3)WPd4l z;KtmKpc#*ac}(SxA`O+6dV@5esIc2o#kN4y;`8S4I+~Rq8W{=36jcpJ24Z3|Zy^<% z;X9Uc6Xn$FgzB~4nGxn9!_S%%a_Dsj!tsO~M?~BbT zS9217dwY|HGWgh1Ej`dV!J6M*eb?tt`5Nx{nr3`W$&Gj7ynO%tjbCU%QJLbr>=!v%gUk7X#;zar+$4#g2kzm z9atYFa_MJOh%>-9<5b=a{YAc}El6tSa4dKtrpP^f9Z4DpHX-<>1q{A{L>md3;YQK9 z0HszlkDTBm(U{_|;JZk)lYq_#-bUaec!Z#xU^_t(0aX=WfuI?NLs(h8@NDrT6{KA& zMT_PYWT;;ak18-#?AX*n%K`)xTYtLl(mshwBbRt5f|eImM}l1Gk8)Wvpo5%;pvYco z+eR}8n(&R4>0!P70CU5Hz0dhTx2T|py*PNsT|eWlpLVZJxz{2OnB(lKnoW0Vw$0RR zOSbGw_I`1?=5VU!@VGf;^WU|Xr|dP?Of&X|q`l$py2kPCDaV?`S;uvW?SO`|7fiyY zt?*vig&kz0-;oZ@VlrelG+GXJ6eR-fBtauVC4ul(_)THe^kJFrg4Y*SG(ARAp}dNy z-2@^kX3>r5)>DWpG*VP}7s1|%@+HP$q?E++@<~JG05Q!7uQ5JIw6JO)Qtf;{{MGF~ z-ACLn5F8*lgy1h*m~bj&?j;cWeQy4TXv+K|;D?FVOAsU=W76LD6J<)L9lq{aRGxKc ze!{s->CJnb<`X=X_{ekK#1uHb?1RElWN5~1t-E&y(8p7-uX;0!!#An}DE~wCZWe<2 zsyaqKxq#)HJPvFDsos29*@cjzeuZWTqLgm>9k`a zd9$AIaT16Q7Jht|3nBmkIK8IaL@Id;e0z=C_yUr@N&IxpZGF)gaVexcg3!Z<;PSdN zrx%3rX_5<7S%buGw6A8y9to)`=fYo#oR)*Po2mpOQ7)QbHm-hSI*`wkLNZ9RL{CN( z9vpc*ihp~N6T>awQiIEQ83&&v-fmc?x6CmT{ znW-rl-?YN`U7VVixV6bWXa64l6;cp`Pqw%UzKo9fy0vZzabkLeOc7d+hxm}9 zV(9x7{yh|U5(8U*X|Rb}6zNL41}$x;mI~Wm!Abm8g4YOMC%8)ReS$aO!?u;4mx+9m zKorn5qTVFgNg;RQjf(ufTMziEHg!G!*^%5>lE~4#zMAr-En>oZG&rRaiW~4CiFw z;axRbkm>W8oYthHc&J|@?R)VMD}jG+&o}-UhszUrJANTKsbBnho{dksO5xsPRVKk4 z1zU%wnrc-uDNlrBYK)7hXFbpM)hO)mSZo*DTJWL`M@FN=ql(N&;e5wZ;}q)XOK z9->zv%sZ6%G_eW3nvi-QW$ah5y|1z2UE(GY{HE-ebVl8!K3ByI%H}Id(Gr4*#Cv_u zFxCNw4~%rt*RuFz;lo6UE3S{I2?9D|`DKDD1k~T6CplFRpCX{}aPlc_X$m|C%k96% uF~c`jBI$JZCC1oY*mJNvaqQq$=JT+V?7nUewlF_ChO9ZbKXLoebL_t;1uUun delta 3255 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 literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index ec465ab..1c6482e 100644 --- a/core/models.py +++ b/core/models.py @@ -53,6 +53,14 @@ class Profile(models.Model): ) user = models.OneToOneField(User, on_delete=models.CASCADE) role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='SHIPPER') + SUBSCRIPTION_CHOICES = ( + ('MONTHLY', _('Monthly')), + ('ANNUAL', _('Annual')), + ('NONE', _('None')), + ) + subscription_plan = models.CharField(max_length=20, choices=SUBSCRIPTION_CHOICES, default='NONE') + subscription_expiry = models.DateField(null=True, blank=True) + is_subscription_active = models.BooleanField(default=False) country_code = models.CharField(max_length=5, blank=True, default="966") phone_number = models.CharField(max_length=20, unique=True, null=True) # Changed to unique and nullable for migration safety @@ -240,6 +248,9 @@ class AppSetting(models.Model): contact_address = models.TextField(_('Contact Address'), blank=True) terms_of_service = models.TextField(_('Terms of Service'), blank=True) privacy_policy = models.TextField(_('Privacy Policy'), blank=True) + subscription_enabled = models.BooleanField(_('Enable Subscription Fee'), default=False) + monthly_fee = models.DecimalField(_('Monthly Fee'), max_digits=10, decimal_places=2, default=0.00) + annual_fee = models.DecimalField(_('Annual Fee'), max_digits=10, decimal_places=2, default=0.00) class Meta: verbose_name = _('App Setting') diff --git a/core/templates/registration/register.html b/core/templates/registration/register.html index be7b142..74fcb1e 100644 --- a/core/templates/registration/register.html +++ b/core/templates/registration/register.html @@ -47,6 +47,33 @@ {% elif field.name == 'phone_number' %} {# Handled above #} + {% elif field.name == 'subscription_plan' %} + {% if subscription_enabled %} +
+ + {{ field }} + {% if field.errors %} + {% for error in field.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+ {% endif %} + {% elif field.name == 'accept_terms' %} +
+ {{ field }} + + {% if field.errors %} + {% for error in field.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
{% else %}
diff --git a/core/views.py b/core/views.py index 9a89dbc..d0ab69f 100644 --- a/core/views.py +++ b/core/views.py @@ -23,6 +23,8 @@ def home(request): return render(request, "core/index.html", context) def register(request): + app_settings = AppSetting.objects.first() + subscription_enabled = app_settings.subscription_enabled if app_settings else False if request.method == 'POST': form = UserRegistrationForm(request.POST) if form.is_valid(): @@ -34,6 +36,7 @@ def register(request): 'role': form.cleaned_data['role'], 'phone_number': form.cleaned_data['phone_number'], 'country_code': form.cleaned_data['country_code'], + 'subscription_plan': form.cleaned_data.get('subscription_plan', 'NONE'), } request.session['registration_data'] = registration_data @@ -50,7 +53,7 @@ def register(request): messages.error(request, _("Please correct the errors below.")) else: form = UserRegistrationForm() - return render(request, 'registration/register.html', {'form': form}) + return render(request, 'registration/register.html', {'form': form, 'subscription_enabled': subscription_enabled}) def verify_otp_registration(request): registration_data = request.session.get('registration_data') @@ -78,6 +81,9 @@ def verify_otp_registration(request): profile.role = registration_data['role'] profile.phone_number = registration_data['phone_number'] profile.country_code = registration_data['country_code'] + profile.subscription_plan = registration_data.get('subscription_plan', 'NONE') + if profile.subscription_plan != 'NONE': + profile.is_subscription_active = True profile.save() login(request, user)