From 3b6666910527717d79d35252063f059d636a597e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 24 Jan 2026 06:19:14 +0000 Subject: [PATCH] update29 --- core/__pycache__/forms.cpython-311.pyc | Bin 16185 -> 17904 bytes core/__pycache__/models.cpython-311.pyc | Bin 31909 -> 31877 bytes core/__pycache__/urls.cpython-311.pyc | Bin 2946 -> 3049 bytes core/__pycache__/views.cpython-311.pyc | Bin 33114 -> 34163 bytes core/forms.py | 22 ++++ core/templates/core/admin_dashboard.html | 13 ++ core/templates/core/app_settings.html | 145 +++++++++++++++++++++++ core/urls.py | 1 + core/views.py | 22 +++- 9 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 core/templates/core/app_settings.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 7e66c47dc9982a690a55e0846022855b4ed14a03..affcaa741612b559912b80ed73639895bcd4e4d1 100644 GIT binary patch delta 2956 zcmb7GZ%kX)75BA`ZNN5U5Fi9&z>cXYArx?+36M1WX`2-{EBOO1$?L=K2EWb!df%fZ z$rNYOs**M9+TJLmE8E;EZPSJ=$*f9Lil%HIqNpFXXX$COUZ-iAv`N#dDb>0!`Luhk zlelr{hdnMo&O7Jc^UnXvr>AefhTI>zTvaCaymLU67d z)r5A_Ph5XO6S;Hl&&{?z*!mbvY#QmC1oCNsrvNMrjGDt@T$V&tP9-M@Nf9!|xIr_S zh8=ymKX3XMa*P5C5t06}u6x%U2#x|c05;G`j)8#du@v=)z!=Si>i>>VAKlvU_%q{- zV^l=rSWI$dMx`i80xnrlQ9Q}N#$Av=M}&b=!Jv&jXNVVgm}VO;Rrdoq01%?njqTO^ z4A?*Xu5M(LHt=I6OhW59LpOEI>XoRo1~A_q82j7D)<6;w|l|n1SIEglJq;lqinJ1>qw^A~}E49gFvC7QtSKHi-jps}gji#bZ<8U7;_u zoJ0y;>zc{+dzQ^;C%x|dZ?Nnr`V>CDhNcJaQpf9xsoj)vKAwK5afpdc#y4(D#dt$uKA(^Wfqkpl7?e1GEfkM zy~VsN0dt9t`3YL$zPYz8nxkid`y&S7pp%p-w1MnF7Y)ZjyrhZ*izES3?(vU-`UyY_ zKsx|01#Zzw?jN1*QV`Dg-URtO0B-?M21>bm*Mid4^B^tv;sP))(B7_7=t6F->nNIi z7dY=R2nVanJ+Oo9K@W;1p98@qfN!+>S9HGnENka4x>peTHGQRLI8(|Q&wi=bAbW=6 z#YId`C|E7FGo;n1jNy2imF8G2Do)n!lcmWNN%RPUoRn2TIA@}J zcl>_is9XkBm#L@s6uO*yyZ5BkR*VYW651d56ogFx7XjV}_<#YMDkaf}^lZpuD^>$t z3$@s;!M5MfKZL%WDJzSz&f!sf8+P-G_!*;&+NqR;<72Uu9L2>pcESc8uqT1yb;E0* z5?)sUssVlu@C$%nGB7H~MRn}13SMSe;5x@~R8ENTqH3PYD{$m0Kv@l52j2DE=R04s zpzCyDmtOq@a2^HNM<;i8k8I?g3}VP&(NdU8<%(|t?H#(b{1yP( z_n*9{df>HKdyER!7!EO=&Im~{femXswU9Dw3i~4_jXHuCWJM+Xt`w4siFr(nDpg#% zN4uh_q$);LAstI4v2p(uCqy}J)ZCM@i;iGLF>3kcBBYKB3MMbH!ZqA!BEKX?PY9WG zDlSJ)kY|`lMx7Fq(`ihE1XCZ2pAe2?Y<%k;Q%oio#W?3Rs$?Fh6>XG%NHZY}m!g)_v z_k;`H?JJ9`ry29`5p7@wmUlMqoz=awg|?n-#YOk}Y3<027Mg|C7Rk3o^tMQ$wR;7x zCfAQ?hYoA~M_{$iX7mslHMT|I)}20dgsusR!v;c_QYUy z%K1)N@01IH!7SDTgSXt;3&*w51z3StJ`mFbvD@C-x~khI2Fv#4jD6W&yba+Z3E-uh*}S?1nFRP4ay87Ll&jn3x(cTKVfYewUzH1L8MF9(&=(GR=*aLqnxfg^1J5ap zV^s1n4bzG6{|@-&%I^|BHTi_&_B?3g9mjAYB`wDBDES*x14BS*H|Iu1{*89I>k+f? SVR+-vdEraof3<;-8~Hy??Dh=+ delta 1755 zcmZ{kUu;uV9LIP1Z!KMG7RNS5=hl<~g+Vu^HEu4zS~k%!Q1;;BpYHDVG;O%ut>@lm zqa@B3qRWhmCkx;|hW`i){+Sn|W>0FC_~ILyc%Q(;7@{$}@S-oC@43c8GyCw#x!>RU z{rdZJ&bhrvzJ4)$DHPh&Abt;wn#F59XTt4ddUc0Fe7ViX8{)0jRWjj;?nxB%5=~U5 zD>G&#LFcGiF?E)h)!7N7tf(|$1$=FURIO-ZC-J33G?w5Qf0CrEs(;l(_VeCQrQ>1f zF#+3`FKQ-bwl`m7hRFu_TIeTVMp&wyTxr>CT?v2V^7UhTA2*tZf`_nt3>f8W%^jgJ zv5dReQ&9S?Uz&d>{vk+&P4OS^?;UsshGzjkaF;ti-N18zjN^9VOhFj323vk5q@PDy zA9*q@6x*w6RGE>%?0}NXWhrAib3DC{r~EgWt%?|v0)|(hTl`*PUC?p@)eccx2VZYp z2tEkyAz&Y$Y>Nh^Gm>E{Ki#%%{+L+W9;R!Qp)Na+E+}lINVS|Dn4oj!;hA#9WK(b$ zhP`Q67kiZ%xrH5-lA@}#Y-UB9O9s0STjgBPW%fLv07%RZWwWZL7=}tUEt|beTx`-XH`8%SpZfA2iUr(&T)Rk7i+mtjCm79{hL0k**8aRzf7 z_6b1F#3NRxl{4{ue5goiwP)MiCsNwF3pJmBm?}GvohWy4q~7V%J8O zF2fUvpEqv93Vc?0tnU*$#XFd0|zSvUBHu zqpvm{&F3lWK3LMl8+i*a>Ma)>KL=L%_2d(K>yCySmfCHSojeCko{IDQNNVf6Y|RKn zc}nEe1NeL!2m|Ik->Z@flEe;MSl4;;2}^ zrB1ua8ZQl84<3NN8#u_v278A#s-^%l2Ii!Tx2Zn-I<$3uZSdtrEXU&!{@w628ROg2 z$9kAh?7$K6nrI_BD=~TBi_@% diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 0f074b3dbe7c8b1b296ff53266feee4cf5b0e334..c3f9b3a3c46b3caff23588777a07f2968cecadd2 100644 GIT binary patch delta 208 zcmZn?e<`lMoR^o20SGPylw>+_Ffcp@abQ3W%J}?iqxwbWi4Ryc%~P4P6kyUR7Him+ zF*7i%24V@ zr>Qh~G5ckvBE`wY906Q9K%*FexcJ!Svm8sAG;gqQG`L*gl$zmsMaJZUwf_Z{fQu{v US6Bi*m`d|AHE@Gqkrq$`00me!%m4rY delta 109 zcmaDU-XyNRoR^o20SNefN-{sNGcY^`abQ3e%J_V3qxwZ=u5`&Lg%tB(22G32YAo}Z snf){sC%<98JoyNRFPAn@DI*XUuiY%oxs*xZgRvApQv){$7HI;-0rzGY4gdfE diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 219f92b935818192ab8fd8802b5847c7a75855e2..a0cf697b84ea884f0494b4263cbb5fb9e6293cd8 100644 GIT binary patch delta 6364 zcmcIod2kfhnV%kM4m6_~2?R(Wkc18x0YVbOuo!~|bRYym2!SJQU_6>`i9vJubq^p8 zj~%Fhsl-QK5}Z^jA?0!s$~n9lZ{j$P!)|JKQz@4%Y*kD;W;dJNWUn}3la06HP2&B2 zUylw(_>cUNuF+5Leee42_jQ{evj66?-S@@f;vyS8ul5_!-pG@_a%J+#)z4<)wZpZF zO|_{DVs-KQ;d*Wt#Tw$Phu3i16AQ!}ha0)=jjfHZ8(v3kr&=6aA8#6NV!AK3A>KUP z%x!33oqD)?@<>KZdS_(YqzM2>EBbW#wz4hWpQTNycyeRZ23Iu4x(1hqqY-u#XM?|s4M4DcM`QK zpK2f8C9Ca=GaWQolRr4zsjebHy3|_2ZkkayZ^mw-*3YB%5Vc_*bq`Tj&!hGdb&Y)9 zUb=BFwF2|T_Yt*m9<@&`J!lK8l|QxrLUGI23Q}Iv7fhuNYK9R_jAidFJY`?8o-{6+ z2uxQbnJ~0dhF(a$YI@!+mbaZ{j?L6voL%60(owe)lXqdVI~CUTlS!e9PSCml-GJTM zm%Rs+;tiPO7>x?u5dE^!mr{cAqrPs>Ud*Wn)X0DGHP*FZo;RFIg>;K6UG#%gII3y7 z*pG?5a=m}evU@;v3vDc_8=4SN>Q>XA9~>u%u-FDmrYow4(z>P&iWwQj9vTP~d04@J~{;MO;;){Qb}D4)QBV07as&T03QIX0Dwg?1Q-S^1VDkJnZPWJ zg-MBVZtCF^ny8b{l`kvF*Sj>!Ym`>``|`ke4d%M^bR?qbx(H#XFaU-PxCL}BSV62` zHpwW_%pzz>Xc022SxDLt;tY{>Hv#+skANLS-!u$npQ!jG6n}MNMYg^2*LF8#2`J(( z<<_bzPTqQ-e6#BD-8d>xW(nPZ)NCywcjq;(@155YK|*8 zhk9<+s)7~gu^gJXric%t&HRs3t4qY>uj*H31gJW|0GuEQl;<1WiJ>|GbN0SIa1m4P zbOdni z#m~s`<~rwRvG|JoMDu#z=g_>0eUy~gBqy7f`q_2aN`ULxcbcz}>t?TR4B9>IL=ij| zl)u=N%|J(i(m6_FX5ogG3s;~OBrqLaJ$pM3TH(ufkr;v=<`^f>HU+b8YB~&&j*ROC zv|u{EOkWujDHe0-?s*#hwQSw|4!LCeiHhvbEk64Sc0)c5j8Oh@M-#dcPDHdW@iiIW zxW#zoOAWN@S49T%f5@BNRs}%u+v4BG@H;)V8E$mz)t#d>sQr02c0UaBW{b{-BNHpSLHt+PEVm+;=w1k@D=zBDEtwIt05H%jQ{lvRS zKDhHVv4@Q9*mc-mx&xb8u1_tvPOS4QRsi_lKLD0tRS+-)fUd=3fEobQnSb%jb$Yjc zESidI2_uhpx+#qi#{3u*e^1-o1Loh6`+L^N*ScQMG5+mthce6fp!gKddtBbwz5M7W zsTo*sSH{`Nk&bc+2Q7A4yQNVq)$Ih+7lS7r7UP;h{u0r|_i3P4?&*n9&iH1}(Za5TX9Ab^uQvqq87j%yL?$hT?qOLFSS z1ZleOXi)L67YtxwNParByn$1vivFhjjl}&#(qN( zaEirf&)qm4US9cIBHqE5_+Lx|yiD6Q$RC8eY0D>E71^~TKU7L!e6ba9FJQYYRU0yF z6XtF|hzAJhhGv8F&@-U2uJU-O!oWemAm9+-FyMXwVpNO(A_UX-T;5@t&9-iyE0^i% z5j`TJDI=Op%v52&qg}qA{i(VfW#J#SZxwC`V)NYqn zzSAlt-;hn?OPsHR`UAOV{AuN!{N?x&tC+?yfjX<;VgdP-A?9Tv z%tpEVe0qtaj7aO`OX>5(d;5t$D8&} zgQ9|X-AqBO|5E-)6^r(tEAl(ttL63f?Q-u)uRP;eAiH-jkx$h52F@vG zZO7eoCO>MyIFbOp0vn4g3XoSfXPa-~L21UJjACrdMlk~?^f$eWQ9Iqn>8eY0pS4GoJI|u;V+;Dk zjK!?7=^M1}bR&H!i$x=0_-Xa@$EoUcN~O?LtM!cab!9Xii%m3{3&UzWnh4GPj&*to zeMiwY%q2A)GvYBWjRFhjWH8QFPt%!q&Fmk*Ks6u;_&R`6;DKDGszD#-wmgEv&~jMQ zJI!?{Ida^3|ALOGP_e$^EGJzFKp)KgmW=Lfkrmpa%uSc?!b49jdEHet>8iTrU-8t~ zXJTLK{_?)-dnf$|Zuk#O`43zwyy@{je&6N$9^LVg9k*=-3tDe_OCImJ-1BJfM|v;y z-tv}Bc`Ki~|C#XQn!y_lho%}1-S8fs@*bY_9=^3``DA7DjYTa}i&`eVEw^2?__sy2 zl9gA_PWsz!_}gly{B4&Cf95HDV)f+mjn9p~pgwo>hNol7(=l1tA-0eNf&Fsy^t%JB z6{=K^hZAGTCVagV(GkwMW_ga7Hli`Ti8Btp^N}URs%cf3CAm53NE2R%W4fr7UpZ4< zQb#jP_sL^nL&wWqy}Wg%D$@Ys^a>cZDUQMp>EHCsaxltwfpyhx#!2{2X?-rcgw_Rs z06Y(P5pW&wJpf*J_%(wIVXhhlYAEqG3IVG;;iBSq=;9jSjLq3oaE?LnvPrMmSW|51 zcir1az;sO8F4ogH{cQR(*?%}&r(_BgJ6Z3~3T~THH)*S#`@3mtndDzK_0U`Prgb)Z a$!)t&=~Qmpfd5@UgbOR@lB@w1>Hh)joXj!+ delta 5677 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 + diff --git a/core/templates/core/app_settings.html b/core/templates/core/app_settings.html new file mode 100644 index 0000000..8077554 --- /dev/null +++ b/core/templates/core/app_settings.html @@ -0,0 +1,145 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+

{% trans "Application Settings" %}

+ + {% trans "Back to Dashboard" %} + +
+ +
+ {% csrf_token %} +
+
{% trans "General Information" %}
+
+
+ + {{ form.app_name }} + {% if form.app_name.errors %}
{{ form.app_name.errors }}
{% endif %} +
+
+ + {{ form.slogan }} + {% if form.slogan.errors %}
{{ form.slogan.errors }}
{% endif %} +
+
+ + {{ form.logo }} + {% if form.logo.errors %}
{{ form.logo.errors }}
{% endif %} + {% if form.instance.logo %} +
+ Logo +
+ {% endif %} +
+
+ +
{% trans "Contact & Legal" %}
+
+
+ + {{ form.registration_number }} +
+
+ + {{ form.tax_number }} +
+
+ + {{ form.contact_phone }} +
+
+ + {{ form.contact_email }} +
+
+ + {{ form.contact_address }} +
+
+ +
{% trans "Subscription Fees" %}
+
+
+ {{ form.subscription_enabled }} + +
+
+ +
+
+
+
+
{% trans "Shipper Fees" %}
+
+ + {{ form.shipper_monthly_fee }} +
+
+ + {{ form.shipper_annual_fee }} +
+
+
+
+
+
{% trans "Truck Owner Fees" %}
+
+ + {{ form.truck_owner_monthly_fee }} +
+
+ + {{ form.truck_owner_annual_fee }} +
+
+
+
+
+ +
{% trans "Policies" %}
+
+
+ + {{ form.terms_of_service }} +
+
+ + {{ form.privacy_policy }} +
+
+
+ +
+
+
+
+ + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 23d8bc1..471f4cf 100644 --- a/core/urls.py +++ b/core/urls.py @@ -28,4 +28,5 @@ urlpatterns = [ path("receipt//", views.transaction_receipt, name="transaction_receipt"), path("admin/financials/", views.admin_financials, name="admin_financials"), path("admin/refund//", views.issue_refund, name="issue_refund"), + path("admin/settings/", views.admin_app_settings, name="admin_app_settings"), ] \ No newline at end of file diff --git a/core/views.py b/core/views.py index 454b70b..43eb66c 100644 --- a/core/views.py +++ b/core/views.py @@ -4,7 +4,10 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import login, authenticate, logout from django.utils import timezone from .models import Profile, Truck, Shipment, Bid, Message, OTPCode, Country, City, AppSetting, Banner, HomeSection, Transaction -from .forms import TruckForm, ShipmentForm, BidForm, UserRegistrationForm, OTPVerifyForm, ShipperOfferForm, RenewSubscriptionForm +from .forms import ( + TruckForm, ShipmentForm, BidForm, UserRegistrationForm, + OTPVerifyForm, ShipperOfferForm, RenewSubscriptionForm, AppSettingForm +) from django.contrib import messages from django.utils.translation import gettext as _ from django.db.models import Q @@ -583,3 +586,20 @@ def issue_refund(request, receipt_number): messages.success(request, _("Refund issued successfully! Receipt: %(receipt)s") % {'receipt': refund.receipt_number}) return redirect('admin_financials') + +@login_required +def admin_app_settings(request): + if not (request.user.profile.role == 'ADMIN' or request.user.is_superuser): + return redirect('dashboard') + + settings_obj = AppSetting.objects.first() + if request.method == 'POST': + form = AppSettingForm(request.POST, request.FILES, instance=settings_obj) + if form.is_valid(): + form.save() + messages.success(request, _("Application settings updated successfully.")) + return redirect('admin_app_settings') + else: + form = AppSettingForm(instance=settings_obj) + + return render(request, 'core/app_settings.html', {'form': form}) \ No newline at end of file