From de92a4ccc0c51f90cbb79bb13741dfbc16a2b245 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 23 Jan 2026 09:32:37 +0000 Subject: [PATCH] dem1 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5983 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1092 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes config/settings.py | 18 +- config/urls.py | 18 +- core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 2408 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 8272 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1484 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 10290 bytes core/admin.py | 29 +- core/migrations/0001_initial.py | 26 + ...ssage_truck_shipment_assigned_truck_bid.py | 76 +++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1622 bytes ...hipment_assigned_truck_bid.cpython-311.pyc | Bin 0 -> 5720 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 98 ++- core/templates/base.html | 151 ++++- core/templates/core/index.html | 279 ++++---- core/templates/core/marketplace.html | 39 ++ core/templates/core/place_bid.html | 51 ++ core/templates/core/post_shipment.html | 42 ++ core/templates/core/shipment_detail.html | 101 +++ core/templates/core/shipper_dashboard.html | 61 ++ .../templates/core/truck_owner_dashboard.html | 79 +++ core/templates/core/truck_register.html | 73 +++ core/templates/registration/login.html | 33 + core/templates/registration/register.html | 40 ++ core/urls.py | 18 +- core/views.py | 185 +++++- locale/ar/LC_MESSAGES/django.mo | Bin 0 -> 9674 bytes locale/ar/LC_MESSAGES/django.po | 619 ++++++++++++++++++ media/trucks/red_truk.jfif | Bin 0 -> 11385 bytes static/css/custom.css | 133 +++- staticfiles/css/custom.css | 140 +++- 38 files changed, 2098 insertions(+), 211 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_shipment_message_truck_shipment_assigned_truck_bid.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_shipment_message_truck_shipment_assigned_truck_bid.cpython-311.pyc create mode 100644 core/templates/core/marketplace.html create mode 100644 core/templates/core/place_bid.html create mode 100644 core/templates/core/post_shipment.html create mode 100644 core/templates/core/shipment_detail.html create mode 100644 core/templates/core/shipper_dashboard.html create mode 100644 core/templates/core/truck_owner_dashboard.html create mode 100644 core/templates/core/truck_register.html create mode 100644 core/templates/registration/login.html create mode 100644 core/templates/registration/register.html create mode 100644 locale/ar/LC_MESSAGES/django.mo create mode 100644 locale/ar/LC_MESSAGES/django.po create mode 100644 media/trucks/red_truk.jfif diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..89a21c8c33fcf07e22ab75cbf6d4d9536f2667af 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}wPR6i?)y0stxC1Y7_B delta 19 ZcmbQwIG>SwIWI340}xbw%b&7!a8PE zdTCZ#q*khgDod~jq+M|+NN@mx_%l!uLaKa$|6qMuAr5HA?)DISJfH8pH*em&nRyxe z6c0Y-c|W3GJXKd7gtvoHW{P_?{067sFzKow=z4-lm};16H*}K-L`W2()Dwauls!+d zf}!`Zr-I25=p#MQ4+F+D^ONx_9#}sH{v8IP=d|yC43gQ~&W5%P$KgclJe-76G~f4+ z+Z0TCVHifJH4LK;V-Cj@T=9@T7$^M@Cj$^7gR~F91UV}E;Pl!dgvc>Enp``yju0J8 z*)FPQY^|{5xT}b1m}xD7oNz@X+{Yj%X~Zd4)GVBB&9lQ{dUk9)W79|Z)+sXLTAbYe zH*M5Booouy+h3AW%r$=w=3N=a;Kx6ZD@u^ZTBH6R|Nr7!1kM}pJcBE7Ii@j?A)}Bb z6M#WfPp?dpDU4v8=AD8IJ5K!vOK&o;;P@Ba{t83R&bFd$ zteIXxEB~V0FunUp*Ssq-DCG&0b97|Zc+~MvG*T2ZO9j!cXZgBREas#|QOJq~<9_GI znS{OdEQQG`Rb4x4n{zgjHc~dyHs&czu6{>VbS+~%2u0S-DBLbrE4BDtT~X_CT`O1X zYFSrmRZX;mv1Iyk!qtT(VL>dKfm}W#X|ZVfu87%-g0xh~ng0D@A)ha40eh#A zjSh;h?WvU-+*Rds+HcgPPloFA9)v6wV{A1)gfe(^uP42WB37{dJH|o>Xaub;e~>y3 z(C}MPWA5-b9B%&5rQ(~PQDV3Cx4g*f-DcvQ>?6HdCJ;KHOv9>S4MUhkAi{c~7f%8ZMfM#~gF^qlt4vuG23Q{q z!jMFCdBa&L)PB`i&WtoQoKIgkO(=%JPk;|2<{l&?=&duha`;Ql!TPSaffMx zmR)QBCfFck*boF*3^NW{c24)gWX(qiJCEH((P6#xzg`x#EVBz|9o5m&6y#b>u;H^3 zR7``?rbwV-q)l}NW?EGZidVxt4K~`Qp9O!z?cAO}lMDR2oDZeiB-bF%f5^Az3NYWg znx*0TQ_`kh(9^A|w-Y?z(Q;61by6Y?v~<`sMp#B4HzinPDY(J1Am1gal6BwxO6C#o z8`{A?c^_H#l-E*63|}!**6*$!+F5h!o0;9J4Yf+L~9zgC_PAJHlUR Se`(Zu9%09tIYk7P}7&%#4AP_p>^h++g9KU^c;QhQ<{sogE%mZ2T_> d2V4{mxB?_u0vfzQ@B=$gF(X(DW054#VgOJkYlZ*- literal 1557 zcmb7Ezi-<{6h2a`&9y)mR5TN}FQWWXXv428G3D6*L?bJ<0fDW1Zjz3VjNPzapJ3Kyq?|a{ScjS+a zhJj#=|DxWehS2Zwp%|6icw;CCeUDt!MXutiz7nWiRgredF9ljx3-qp@K5KqCsB|l- zt^3uW)~zW>MMQVYL>;A>B`1#ou`388`7g zU*<*qmTaNZY_LhC)QVZCNgLxap4Ua6pT64h<|4TG!2MmY|X6a7%(M zNY5=}_qiPa7jGN);?PMIr)g8tPfWb+y4Vh}7ethaHpYEM101~Q*-?}`Gnpy=T8@_$ z$O4usgit7UxY2BG=5-BeKsIq`2jo^$+Rc`6*S9&pdIW{JORVoxLB)_TDa1?_7jo_c z*Z)x?@utmtl4PUxFGYKy&UD1oMtq34|o|rLr0PMiA4N-Li?SEIsG{iSDQA%}g4T|C&VOo*;=Po0rs=4pgG= z?B03wSyH{TeX!fx+3O_6!QuAd-rXMTP*TtB&cla?KcP23gx;E#JZ4sW6o(?V$aCVv zf->tFWnc5ic8HaIxao&sMlar0ZwAzjeR7*!gmC%W;eW!iC@G4vP*)Xgf#iabvOYn0 z`JSVXC-1uFXJHUBM^`3i??oBuwd0+W3#Zp#wqJfa)h^Gp%X6&?u8&S0pFBSOYT8(z zHP)xvrI~hVp_f+G?C;%I?i&uYrGP|`uS?f&KIx|?c&hZ0zEp*A0@v#d~_1}Ku$8i7v diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09df194d2dbcad4868349c9177db4b15571..a54dacc1079ddc887f1498da40baf0300f573ed3 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}wPR6mR67!vp{@js%_n delta 20 acmZ3^x}24JIWI340}xbw%iqX7hY0{RMg?d9 diff --git a/config/settings.py b/config/settings.py index 291d043..066e1f2 100644 --- a/config/settings.py +++ b/config/settings.py @@ -42,6 +42,7 @@ SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SESSION_COOKIE_SAMESITE = "None" CSRF_COOKIE_SAMESITE = "None" +SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ @@ -61,6 +62,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -133,7 +135,7 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'en' TIME_ZONE = 'UTC' @@ -180,3 +182,17 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +from django.utils.translation import gettext_lazy as _ + +LANGUAGES = [ + ('en', _('English')), + ('ar', _('Arabic')), +] + +LOCALE_PATHS = [ + BASE_DIR / 'locale', +] + +MEDIA_URL = 'media/' +MEDIA_ROOT = BASE_DIR / 'media' diff --git a/config/urls.py b/config/urls.py index bcfc074..cfd9fd4 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,25 +1,10 @@ -""" -URL configuration for config project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/5.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" from django.contrib import admin from django.urls import include, path from django.conf import settings from django.conf.urls.static import static urlpatterns = [ + path('i18n/', include('django.conf.urls.i18n')), path("admin/", admin.site.urls), path("", include("core.urls")), ] @@ -27,3 +12,4 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b111269bd81aac528770a53e2f849291524d56..d90f7be924c08e6c0132e1c5f8a4e2cc8db57f1f 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}wPR6i?)y1OO?P1Xch5 delta 19 ZcmbQsIG2%oIWI340}xbw%b&>mG1t0(b diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..214e0667cc2cfc0cb06b6c529c9bd7ef74e2a6a0 100644 GIT binary patch literal 2408 zcmbVNzi-<{6u#pRiPjIxjwQ!Vnxsk7q5|q@h?^EgTOc-y4y}!#=|m3%t-IJvL{dGH zO|@yr(9xU!0~bdAh^`%DK!b5pfKJ(DI8%nA@0~pF-d4~oee`6!Pa>JMNzbGMxgb_wt#HTi;glSA~X})gjzF`}_X`6n|&iQ#ePl-l2 zeQKp7Tt9-@FX0(n8u^|u;{{^QRGq{f6?`7H`c43Oq$Y9I?V}54F;uNEq z!Ds>F+{}!nDaKp|V*wb8Gc%T_81os7C15Pi%s9{HACr3J4Mw(3rRg%?3*KO6>ZZ&; z65$iC#ijYPNSe>2^?2WF`#gxHzTq*M-{Mi^?(ya*E%1^i_52z%4hbhVWyIDPwRNW1 z2Gebm8L*@&OGEaDxMW?IMiOx$4H3eErS^Upa3@IoT`uZWl+htg&ZCLrAO^0_#XNLx zALpdyIM{X^S#TUbWJwF(OOEqP;I)+|Td70rF;iN{+k zIwt2pOWv(D_CudHlHDYTlLr5dHYDfzU9JN_5I)BDPXOfNaNal;+hPGnrv%@{K7yfLX7?f<803pUz7upuq>)rtDrvEO$({9;|$|e8~02` ztTw^*KJ}jgw?L@Db4mRMs=tBi?Md}$pRN8sYrHf(T?XoPu?94dRURN#OhCz&{(!yYLQpFvZHJ!tC>_fn6yi~LguxRg33P98CdPUB&r*5zp-oxdDw<~n$ zmpQfJB4I*9;MY;)5%60l@KYu&!S~?g0jCRFxHpxa!D*p(kE$pYSmoEndV6PmJvh$3 z72g0E9^-qJ^B zIPezXOefmv$i6_d1;t{X(B&Ro?rR#|pnZ~!2esbf?K3s_Rw0sI9Z$1THtU4K8ms8j zCa`7W!FRptU36@dqGy{F*{+SJjeOHjXthVH$hM={vheq$SGk33JBn>bvDL=YMr@;a YX>=WhPQx%>Fn}7@$ML#gs!q^<0nUUg4*&oF delta 167 zcmaDMbcHcxIWI340}xFAk)LS~q#uJgFu(+5d=>&SrZc24q%h_%P56p~=j5in*E?`4NY(NzNo6#k8 diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4873bc56e3763e4ed09960c6e3f34140e1..f24c7b73e0f13e05bc968628d9933f0a0ace3abd 100644 GIT binary patch delta 20 ZcmeBS>0#ks&dbZi00d16#T&U9nE)#?1Iqva delta 20 acmeBS>0#ks&dbZi00dRv@;7obG64WD>I9Vl diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..e9a897c5b7ba61539092bb4094bb5eb44bbc4dc5 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}wPR6mR7Izytt2t_7L^ delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..6eff2693246ca351c2ffd5e6e57796030a381246 100644 GIT binary patch literal 8272 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 LT1}zJbWQ#*d=8O) literal 209 zcmZ3^%ge<81k-=yXIcX3#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..244821d30490ca0f40c4e5e675bc2f6e36ea0568 100644 GIT binary patch literal 1484 zcma)*zi-n_7{|}aljc{`KpmhZ1qRd?3aF;4C~5_?Qi*60Dg$bVzIqkh_-NcFc67G+ z;RQwph7L${WP&0X7(4POoY6^CUYXb`u`%(S6Gs$zcrO><_rCYZw@?B2iR_=+PsT3h^h(QdcMcT@`qDY-;rP}FrK%GXNL7i4eicrM>n%)|SgBY1l z1Me{MNBnkM#AK1l#*UFoWbzcYaxwEZAFDsdcR2ajH;h7JoFc}F{-p%}SDeAbI3?V3 zF@Bjbl*p8k8SFF15}D)3l={qYBBLTR)MqM*%n4-T91-JWB6A9vWBoWIiOeW6$NS9b zznRVA`mj-bKqkh1NN7R{p`*J^95ati`o#I6pc|49ns%GYRZDMEKhNl<>9~|>VJ?>b zK+E1VEiKGMqo2jW_FOHLJ_^5J=uUIP)|sJ&`M&ncF7q1OS{z0Tha#gM8~%{fG&^l- zxmw3|FkVRx_1N?W+dA8(Zl|R;s1_FgnEBNh(r%cRI~ULDrg2LP%l)ZAUEOT?=VBv) z-Z15+qj%I%`y5T^M;O+`tA*q!KH7puiy0vLfdaUIzc}qgI=QM1~W#-1D z?zv3{a-|?;Jvw$KuNaeeh{>xF=I_a~UBiroS>1`4uz(((t2CLcN+!#W$+}{)aG0zN zCR5Lb@evkr3z%9=n&o^TKhYw;u4po?nz!LuuBXwbwBfln)1KID+v&*jY}gE!aqp9z zXTNec+P2}f=q+{ze=G~bd5F)$w4x{nWQ-r}2V|Nb?FU5VNBiLb$>d+$emVSd_0{_B zBM##Mj0+e)fE>Ej9s1hZo8vGOz>I*It~;_bC)5kyRPC#(1?rSgr}ncP76Mohu+T+D zckYVH#J9@S*UD5-nHH7l{fitH16UNW*hR*6yw}h7{^c+mz^s7T$mRLdyEQR(m0!QZ zVJUzm0ZYAw(cNpJI{CTIp%y?*K&>0*?CuFMdg=2S4)X!b3z+ZW|LkSN#hd*0Du=ZI z)e7B218KHdLvnZrr|D*{$}_W8G~V*J|vJr2tOEDKmZJT+KOy(r2LtKv!j1|_nB Ay#N3J delta 278 zcmX@ZeVeI%IWI340}xbw%g@XL(vLwL7+{4mKHC5p(-~42QW$d>av7r-85vTTQkZj? za+#x;85x)uQW;ZNQkhd&*RU;PW?)zi#1N3q7{!vp9?YQ0@e(AU$#{#UAh9IlB_ouR zVUVAjdW)e5WD!U*FEKaOPm}c)cS=@bUV6S>X;Dsb5y-S#tYw+0<;6v;let&|V)%d} zAR~&sfW!x8Mn=XP3^Er`(E|qY3#jM=8v`q6gG+}{N5~Ae3oP;%S>&&<$bVpF;%92$ K2Eig8pm6{)aX#Vz diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..e5c35578ef0a2210a8dcd9764731136c114dd4a1 100644 GIT binary patch literal 10290 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 literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_Ht_6hD#@MN+aYscr;$NF*RYECaD@6a_pKZB*N_-CDL|*(j1wurYb8TtowDrkU%aZ`X!*<{#LraqFUYp1#6J-+wucaQJu`0K=k zf?)hnu=T$Mg#Ph`XvD9X%N<~TL>OVtKy?n@yutT`y1@B5!HD(Z^>|OLiyY$78p5&f z5ss61HxU^+0n4vog`=LpTn&}Px4yVl;+SL;$I;EUUE-P2)7w;Ybj!4v*t0M(?B?~k z;FY`^1*gvgwBkK?;%ovWJ ziYGBR3o9Hg9w!21D$=wOmVV)|jFr>m-8cc8x{C#y%IU-j4;EqFSey({6Oo2YcBdk~ z8&t=ay6GETCgN_#csljI-FECWeOCvOXK@B{pJj42%JUve>`<$v8-(#Xe#-cbl~RnQ zw1H!(O-eL}V3zDty{FM5^?)2P*(Oxi4E+URsUe{a%O z?!K6*b@YCp(8BB%A-J$+S=cUAts%iBfF<{K_m{s`x4+o}=>0u9XdV={N2U+25jxbH zqyVlBbxf!ak5^Wz8(VCmf_u8D+Ya=JMX8^cx6?pM0!uVI7M!wK0+W_DFdXP7?NBv{ z*>*ZC)$dp)_&Vq{z#!Ob7@B!Nb8wc$1`rkKWXn{c>4*c_a4b;7g3!d4P7G{sl|EvU z8bqtAOi@+n(1AgKPpRs61I_TkASJ**2XaLH#$nU;NbC2t1^_YX6B84&c|`sDz@{qu zd+X|cZFN_zZm+CvveXSihcJ@MK>@1%J)nMTv(%S*y8@+o>ifgw<&H)}c4FHkdlryT z6meHG+ZN+-gGoU^aHUvcxl&uMtgJG{f}(`i?00kthS9q(${njm%7ezhbOvQ|NSg2& zS{_;S!0u~JQf^w5l>fV)<%NZXMfEz+`Ti00uX{iwU~B~U?f7QCnam!qjYTBS{-Ai$ zqu(TN_Q{!4@ubRF;HSmo&9Q>y2mapu^UTbf%*SqS?&Z+S&ApEO_0X-Wu1VdTeU`Jm zob9Ha^GwdomwvkEv!O zIgU%Ra)E$c`D838S@HNQf6|30B_)aF!-~w~#(el+n~%yu=K#i%*ZWP&Y=zAs-<$~g zC}@B%%VpngV0;m{chYBJAAU|h1=0V}*$$Agz;PTToh!Pi5I*M-b4xSpq7OV{G0TZ# U^ndbF@zM`3{Ee#*>;_)_3m#^(+W-In literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_shipment_message_truck_shipment_assigned_truck_bid.cpython-311.pyc b/core/migrations/__pycache__/0002_shipment_message_truck_shipment_assigned_truck_bid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef3f7eda41d72683fe8d5766a54ac804ab620ca8 GIT binary patch literal 5720 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 Je*+2A?|;ST - + - {% block title %}Knowledge Base{% endblock %} + + {% block title %}MASAR CARGO{% endblock %} {% if project_description %} - - {% endif %} - {% if project_image_url %} - - + + + + {% if request.LANGUAGE_CODE == 'ar' %} + {% endif %} - {% load static %} + + + + {% block head %}{% endblock %} + - {% block content %}{% endblock %} + + + {% if messages %} +
+ {% for message in messages %} + + {% endfor %} +
+ {% endif %} + +
+ {% block content %}{% endblock %} +
+ + + + + - + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..23febdf 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,142 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load i18n static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… + +
+
+
+
+

+ {% trans "Smart Cargo Solutions" %}
+ {% trans "Locally & Abroad" %} +

+

+ {% trans "The most reliable platform connecting shippers with truck owners across the region. Transparent, fast, and secure." %} +

+ +
+
+ Logistics +
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+ + + +
+
+
+

{% trans "How would you like to use MASAR?" %}

+

{% trans "Choose your path to get started with our platform." %}

+
+
+ +
+
+
+ +
+

{% trans "I am a Shipper" %}

+

+ {% trans "I need to move goods locally or abroad. Post your shipment, receive offers from verified drivers, and track your cargo in real-time." %} +

+
    +
  • {% trans "Post shipments easily" %}
  • +
  • {% trans "Compare competitive bids" %}
  • +
  • {% trans "Real-time tracking" %}
  • +
+ {% trans "Find a Truck" %} +
+
+ +
+
+
+ +
+

{% trans "I am a Truck Owner" %}

+

+ {% trans "I have trucks and want to find cargo to transport. Register your fleet, bid on available jobs, and grow your business." %} +

+
    +
  • {% trans "Access daily cargo leads" %}
  • +
  • {% trans "Flexible bidding system" %}
  • +
  • {% trans "Direct chat with shippers" %}
  • +
+ {% trans "Register Your Truck" %} +
+
+
+
+
+ + +
+
+
+
+

{% trans "Everything you need for seamless logistics" %}

+
+
+
+ +
+
+
+
{% trans "WhatsApp Integration" %}
+

{% trans "Receive instant updates and communicate easily via WhatsApp API." %}

+
+
+
+
+
+ +
+
+
+
{% trans "Multilingual Support" %}
+

{% trans "Fully accessible in both Arabic and English for all users." %}

+
+
+
+
+
+ +
+
+
+
{% trans "Secure Documentation" %}
+

{% trans "Digital verification of truck registration and driver licenses." %}

+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+

{% trans "Ready to move your cargo?" %}

+

{% trans "Join thousands of shippers and drivers on MASAR today." %}

+ {% trans "Join Now" %} +
+
+
+ {% endblock %} \ No newline at end of file diff --git a/core/templates/core/marketplace.html b/core/templates/core/marketplace.html new file mode 100644 index 0000000..d3c8358 --- /dev/null +++ b/core/templates/core/marketplace.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+

{% trans "Shipment Marketplace" %}

+
+ {% for shipment in shipments %} +
+
+
+
+ {% trans "Open for Bids" %} + {{ shipment.created_at|timesince }} {% trans "ago" %} +
+
{{ shipment.origin }} {{ shipment.destination }}
+

{{ shipment.description|truncatechars:100 }}

+
+
+ {% trans "Weight" %} + {{ shipment.weight }} +
+
+ {% trans "Delivery Date" %} + {{ shipment.delivery_date }} +
+
+ {% trans "Place an Offer" %} +
+
+
+ {% empty %} +
+

{% trans "No shipments available at the moment." %}

+
+ {% endfor %} +
+
+{% endblock %} diff --git a/core/templates/core/place_bid.html b/core/templates/core/place_bid.html new file mode 100644 index 0000000..8a4e79e --- /dev/null +++ b/core/templates/core/place_bid.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+

{% trans "Place an Offer" %}

+
+ {% trans "Shipment:" %} {{ shipment.origin }} to {{ shipment.destination }}
+ {% trans "Goods:" %} {{ shipment.description }} +
+ + {% if trucks %} +
+ {% csrf_token %} +
+ + +
+
+ +
+ $ + +
+
+
+ + +
+ +
+ {% else %} +
+

{% trans "You must register a truck before placing a bid." %}

+ {% trans "Register Truck Now" %} +
+ {% endif %} +
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/post_shipment.html b/core/templates/core/post_shipment.html new file mode 100644 index 0000000..4a3303e --- /dev/null +++ b/core/templates/core/post_shipment.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+

{% trans "Post a New Shipment" %}

+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/shipment_detail.html b/core/templates/core/shipment_detail.html new file mode 100644 index 0000000..e87b32e --- /dev/null +++ b/core/templates/core/shipment_detail.html @@ -0,0 +1,101 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+
+

{{ shipment.origin }} {{ shipment.destination }}

+ + {{ shipment.get_status_display }} + +
+
+
{% trans "Details" %}
+

{{ shipment.description }}

+
+
+ {% trans "Weight" %} + {{ shipment.weight }} +
+
+ {% trans "Delivery Date" %} + {{ shipment.delivery_date }} +
+
+
+
+ + {% if user == shipment.shipper and shipment.status == 'OPEN' %} +
+
+
{% trans "Received Bids" %}
+
+
+
+ + + + + + + + + + + {% for bid in bids %} + + + + + + + {% empty %} + + + + {% endfor %} + +
{% trans "Truck Owner" %}{% trans "Truck" %}{% trans "Amount" %}{% trans "Action" %}
{{ bid.truck_owner.username }}{{ bid.truck.truck_type }}${{ bid.amount }} + {% trans "Accept" %} +
{% trans "No bids received yet." %}
+
+
+
+ {% endif %} + + {% if shipment.status == 'IN_PROGRESS' %} +
+ +
+ {% trans "Shipment in progress!" %}
+ {% trans "Assigned Truck:" %} {{ shipment.assigned_truck.truck_type }} ({{ shipment.assigned_truck.plate_no }}) +
+
+ + {% endif %} +
+ +
+
+
+
{% trans "Contact Information" %}
+

+ {% trans "Shipper:" %} {{ shipment.shipper.username }}
+ {% if shipment.status == 'IN_PROGRESS' %} + {% trans "Phone:" %} {{ shipment.shipper.profile.phone_number }} + {% endif %} +

+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/shipper_dashboard.html b/core/templates/core/shipper_dashboard.html new file mode 100644 index 0000000..9672079 --- /dev/null +++ b/core/templates/core/shipper_dashboard.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+

{% trans "Shipper Dashboard" %}

+ + {% trans "Post New Shipment" %} + +
+ +
+
+
+
+
{% trans "My Shipments" %}
+
+
+
+ + + + + + + + + + + + + {% for shipment in shipments %} + + + + + + + + + {% empty %} + + + + {% endfor %} + +
{% trans "Description" %}{% trans "Route" %}{% trans "Delivery Date" %}{% trans "Status" %}{% trans "Bids" %}{% trans "Action" %}
{{ shipment.description|truncatechars:30 }}{{ shipment.origin }} {{ shipment.destination }}{{ shipment.delivery_date }} + + {{ shipment.get_status_display }} + + {{ shipment.bids.count }} + {% trans "View Details" %} +
{% trans "No shipments posted yet." %}
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/truck_owner_dashboard.html b/core/templates/core/truck_owner_dashboard.html new file mode 100644 index 0000000..919e63a --- /dev/null +++ b/core/templates/core/truck_owner_dashboard.html @@ -0,0 +1,79 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+

{% trans "Truck Owner Dashboard" %}

+ +
+ +
+
+
+
+
{% trans "My Trucks" %}
+
+
+ {% if trucks %} +
    + {% for truck in trucks %} +
  • + {{ truck.truck_type }} - {{ truck.plate_no }} + {{ truck.load_capacity }} +
  • + {% endfor %} +
+ {% else %} +

{% trans "No trucks registered." %}

+ {% endif %} +
+
+
+
+
+
+
{% trans "My Active Bids" %}
+
+
+
+ + + + + + + + + + {% for bid in bids %} + + + + + + {% empty %} + + + + {% endfor %} + +
{% trans "Shipment" %}{% trans "Amount" %}{% trans "Status" %}
{{ bid.shipment.origin }} - {{ bid.shipment.destination }}{{ bid.amount }} + + {{ bid.get_status_display }} + +
{% trans "No bids placed." %}
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/truck_register.html b/core/templates/core/truck_register.html new file mode 100644 index 0000000..c3ac686 --- /dev/null +++ b/core/templates/core/truck_register.html @@ -0,0 +1,73 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+

{% trans "Register a Truck" %}

+
+ {% csrf_token %} +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
{% trans "Documents & Photos" %}
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html new file mode 100644 index 0000000..0f5dc9d --- /dev/null +++ b/core/templates/registration/login.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+
+

{% trans "Login" %}

+
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+
+

{% trans "Don't have an account?" %} {% trans "Register" %}

+
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/registration/register.html b/core/templates/registration/register.html new file mode 100644 index 0000000..b5eab21 --- /dev/null +++ b/core/templates/registration/register.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +
+
+
+
+
+
+

{% trans "Create your account" %}

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + +
+ +
+ + +
+ + +
+
+

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

+
+
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..ba2a209 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,17 @@ from django.urls import path - -from .views import home +from django.contrib.auth import views as auth_views +from . import views urlpatterns = [ - path("", home, name="home"), -] + path("", views.home, name="home"), + path("register/", views.register, name="register"), + path("login/", auth_views.LoginView.as_view(), name="login"), + path("logout/", auth_views.LogoutView.as_view(), name="logout"), + path("dashboard/", views.dashboard, name="dashboard"), + path("truck/register/", views.truck_register, name="truck_register"), + path("shipment/post/", views.post_shipment, name="post_shipment"), + path("marketplace/", views.marketplace, name="marketplace"), + path("shipment//", views.shipment_detail, name="shipment_detail"), + path("shipment//bid/", views.place_bid, name="place_bid"), + path("bid//accept/", views.accept_bid, name="accept_bid"), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..e03d3f5 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,172 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render +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 django.contrib import messages +from django.utils.translation import gettext as _ +from django.db.models import Q def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - + """Render the landing screen for MASAR CARGO.""" + if request.user.is_authenticated: + return redirect('dashboard') context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "deployment_timestamp": timezone.now().timestamp(), } return render(request, "core/index.html", context) + +def register(request): + if request.method == 'POST': + form = UserCreationForm(request.POST) + role = request.POST.get('role') + phone = request.POST.get('phone_number') + if form.is_valid(): + user = form.save() + profile = user.profile + profile.role = role + profile.phone_number = phone + profile.save() + login(request, user) + return redirect('dashboard') + else: + form = UserCreationForm() + return render(request, 'registration/register.html', {'form': form}) + +@login_required +def dashboard(request): + profile = request.user.profile + if profile.role == 'SHIPPER': + my_shipments = Shipment.objects.filter(shipper=request.user).order_by('-created_at') + return render(request, 'core/shipper_dashboard.html', {'shipments': my_shipments}) + elif profile.role == 'TRUCK_OWNER': + my_trucks = Truck.objects.filter(owner=request.user) + my_bids = Bid.objects.filter(truck_owner=request.user).order_by('-created_at') + return render(request, 'core/truck_owner_dashboard.html', { + 'trucks': my_trucks, + 'bids': my_bids + }) + else: + return redirect('/admin/') + +@login_required +def truck_register(request): + if request.user.profile.role != 'TRUCK_OWNER': + return redirect('dashboard') + + if request.method == 'POST': + truck_type = request.POST.get('truck_type') + model = request.POST.get('model') + year = request.POST.get('year') + plate_no = request.POST.get('plate_no') + load_capacity = request.POST.get('load_capacity') + color = request.POST.get('color') + + truck = Truck.objects.create( + owner=request.user, + truck_type=truck_type, + model=model, + year=year, + plate_no=plate_no, + load_capacity=load_capacity, + color=color, + truck_picture=request.FILES.get('truck_picture'), + registration_front=request.FILES.get('registration_front'), + registration_back=request.FILES.get('registration_back'), + driver_license=request.FILES.get('driver_license') + ) + messages.success(request, _("Truck registered successfully!")) + return redirect('dashboard') + + return render(request, 'core/truck_register.html') + +@login_required +def post_shipment(request): + if request.user.profile.role != 'SHIPPER': + 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') + + return render(request, 'core/post_shipment.html') + +@login_required +def marketplace(request): + if request.user.profile.role != 'TRUCK_OWNER': + return redirect('dashboard') + + shipments = Shipment.objects.filter(status='OPEN').order_by('-created_at') + return render(request, 'core/marketplace.html', {'shipments': shipments}) + +@login_required +def place_bid(request, shipment_id): + shipment = get_object_or_404(Shipment, id=shipment_id) + if request.user.profile.role != 'TRUCK_OWNER': + return redirect('dashboard') + + my_trucks = Truck.objects.filter(owner=request.user) + if request.method == 'POST': + truck_id = request.POST.get('truck') + amount = request.POST.get('amount') + comments = request.POST.get('comments') + + truck = get_object_or_404(Truck, id=truck_id, owner=request.user) + Bid.objects.create( + shipment=shipment, + truck_owner=request.user, + truck=truck, + amount=amount, + comments=comments + ) + messages.success(request, _("Bid placed successfully!")) + return redirect('marketplace') + + return render(request, 'core/place_bid.html', {'shipment': shipment, 'trucks': my_trucks}) + +@login_required +def shipment_detail(request, shipment_id): + shipment = get_object_or_404(Shipment, id=shipment_id) + # Security: check if user is shipper or a truck owner who bid + if shipment.shipper != request.user and not Bid.objects.filter(shipment=shipment, truck_owner=request.user).exists(): + if request.user.profile.role != 'ADMIN': + return redirect('dashboard') + + bids = shipment.bids.all() + return render(request, 'core/shipment_detail.html', {'shipment': shipment, 'bids': bids}) + +@login_required +def accept_bid(request, bid_id): + bid = get_object_or_404(Bid, id=bid_id) + if bid.shipment.shipper != request.user: + return redirect('dashboard') + + # Accept this bid + bid.status = 'ACCEPTED' + bid.save() + + # Reject others + bid.shipment.bids.exclude(id=bid_id).update(status='REJECTED') + + # Update shipment + bid.shipment.status = 'IN_PROGRESS' + bid.shipment.assigned_truck = bid.truck + bid.shipment.save() + + messages.success(request, _("Bid accepted! Shipment is now in progress.")) + return redirect('shipment_detail', shipment_id=bid.shipment.id) diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..993798e6c2aa0c6276c2d1d2d8285173fe8bd72f GIT binary patch literal 9674 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 literal 0 HcmV?d00001 diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..38e53f8 --- /dev/null +++ b/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,619 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-23 09:04+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: config/settings.py:188 +msgid "English" +msgstr "الإنجليزية" + +#: config/settings.py:189 +msgid "Arabic" +msgstr "العربية" + +#: core/models.py:9 core/templates/registration/register.html:19 +msgid "Shipper (Need Goods Moved)" +msgstr "شاحن (بحاجة لنقل بضائع)" + +#: core/models.py:10 core/templates/registration/register.html:20 +msgid "Truck Owner (Service Provider)" +msgstr "صاحب شاحنة (مزود خدمة)" + +#: core/models.py:11 +msgid "Administrator" +msgstr "مدير النظام" + +#: core/models.py:22 core/templates/core/truck_register.html:15 +msgid "Truck Type" +msgstr "نوع الشاحنة" + +#: core/models.py:23 core/templates/core/truck_register.html:19 +msgid "Model" +msgstr "الموديل" + +#: core/models.py:24 core/templates/core/truck_register.html:25 +msgid "Year" +msgstr "السنة" + +#: core/models.py:25 core/templates/core/truck_register.html:29 +msgid "Plate No" +msgstr "رقم اللوحة" + +#: core/models.py:26 +msgid "Load Capacity" +msgstr "حمولة الشاحنة" + +#: core/models.py:27 core/templates/core/truck_register.html:33 +msgid "Color" +msgstr "اللون" + +#: core/models.py:30 core/templates/core/truck_register.html:47 +msgid "Truck Picture" +msgstr "صورة الشاحنة" + +#: core/models.py:31 +msgid "Registration Front" +msgstr "التسجيل (الوجه الأمامي)" + +#: core/models.py:32 +#, fuzzy +#| msgid "Register Your Truck" +msgid "Registration Back" +msgstr "سجل شاحنتك" + +#: core/models.py:33 core/templates/core/truck_register.html:51 +msgid "Driver License" +msgstr "رخصة القيادة" + +#: core/models.py:42 core/templates/core/marketplace.html:13 +msgid "Open for Bids" +msgstr "مفتوح للعروض" + +#: core/models.py:43 +msgid "In Progress" +msgstr "قيد التنفيذ" + +#: core/models.py:44 +msgid "Completed" +msgstr "مكتمل" + +#: core/models.py:45 +msgid "Cancelled" +msgstr "ملغي" + +#: core/models.py:48 core/templates/core/post_shipment.html:14 +msgid "Goods Description" +msgstr "وصف البضائع" + +#: core/models.py:49 core/templates/core/post_shipment.html:18 +msgid "Weight/Volume" +msgstr "الوزن/الحجم" + +#: core/models.py:50 core/templates/core/post_shipment.html:23 +msgid "Origin" +msgstr "المصدر" + +#: core/models.py:51 core/templates/core/post_shipment.html:27 +msgid "Destination" +msgstr "الوجهة" + +#: core/models.py:52 core/templates/core/post_shipment.html:32 +msgid "Requested Delivery Date" +msgstr "تاريخ التسليم المطلوب" + +#: core/models.py:64 +msgid "Pending" +msgstr "قيد الانتظار" + +#: core/models.py:65 +msgid "Accepted" +msgstr "مقبول" + +#: core/models.py:66 +msgid "Rejected" +msgstr "مرفوض" + +#: core/models.py:71 +msgid "Offer Amount" +msgstr "قيمة العرض" + +#: core/models.py:72 +msgid "Comments" +msgstr "تعليقات" + +#: core/templates/base.html:49 +msgid "Dashboard" +msgstr "لوحة التحكم" + +#: core/templates/base.html:53 +msgid "Marketplace" +msgstr "السوق" + +#: core/templates/base.html:91 +msgid "Logout" +msgstr "تسجيل الخروج" + +#: core/templates/base.html:98 core/templates/registration/login.html:11 +#: core/templates/registration/login.html:22 +#: core/templates/registration/register.html:32 +msgid "Login" +msgstr "تسجيل الدخول" + +#: core/templates/base.html:101 +msgid "Get Started" +msgstr "ابدأ الآن" + +#: core/templates/base.html:129 +msgid "Empowering logistics with smart technology. Locally and abroad." +msgstr "تمكين الخدمات اللوجستية بتقنيات ذكية. محلياً ودولياً." + +#: core/templates/base.html:132 +msgid "Quick Links" +msgstr "روابط سريعة" + +#: core/templates/base.html:134 +msgid "Privacy Policy" +msgstr "سياسة الخصوصية" + +#: core/templates/base.html:135 +msgid "Terms of Service" +msgstr "شروط الخدمة" + +#: core/templates/base.html:136 +msgid "Contact Us" +msgstr "اتصل بنا" + +#: core/templates/base.html:140 +msgid "Contact" +msgstr "اتصال" + +#: core/templates/core/index.html:11 +msgid "Smart Cargo Solutions" +msgstr "حلول شحن ذكية" + +#: core/templates/core/index.html:12 +msgid "Locally & Abroad" +msgstr "محلياً ودولياً" + +#: core/templates/core/index.html:15 +msgid "" +"The most reliable platform connecting shippers with truck owners across the " +"region. Transparent, fast, and secure." +msgstr "" +"المنصة الأكثر موثوقية لربط الشاحنين مع أصحاب الشاحنات في جميع أنحاء المنطقة. " +"شفافة، سريعة، وآمنة." + +#: core/templates/core/index.html:18 +msgid "Start Shipping" +msgstr "ابدأ الشحن" + +#: core/templates/core/index.html:19 +msgid "Learn More" +msgstr "تعلم المزيد" + +#: core/templates/core/index.html:33 +msgid "How would you like to use MASAR?" +msgstr "كيف تود استخدام مسار؟" + +#: core/templates/core/index.html:34 +msgid "Choose your path to get started with our platform." +msgstr "اختر مسارك للبدء مع منصتنا." + +#: core/templates/core/index.html:43 +msgid "I am a Shipper" +msgstr "أنا شاحن" + +#: core/templates/core/index.html:45 +msgid "" +"I need to move goods locally or abroad. Post your shipment, receive offers " +"from verified drivers, and track your cargo in real-time." +msgstr "" +"أريد نقل بضائع محلياً أو دولياً. انشر شحنتك، واستقبل عروضاً من سائقين موثقين، " +"وتتبع شحنتك في الوقت الفعلي." + +#: core/templates/core/index.html:48 +msgid "Post shipments easily" +msgstr "انشر الشحنات بسهولة" + +#: core/templates/core/index.html:49 +msgid "Compare competitive bids" +msgstr "قارن العروض التنافسية" + +#: core/templates/core/index.html:50 +msgid "Real-time tracking" +msgstr "تتبع في الوقت الفعلي" + +#: core/templates/core/index.html:52 +msgid "Find a Truck" +msgstr "ابحث عن شاحنة" + +#: core/templates/core/index.html:61 +msgid "I am a Truck Owner" +msgstr "أنا صاحب شاحنة" + +#: core/templates/core/index.html:63 +msgid "" +"I have trucks and want to find cargo to transport. Register your fleet, bid " +"on available jobs, and grow your business." +msgstr "" +"لدي شاحنات وأريد العثور على بضائع لنقلها. سجل أسطولك، وقدم عروضك على الوظائف " +"المتاحة، ونمِ عملك." + +#: core/templates/core/index.html:66 +msgid "Access daily cargo leads" +msgstr "الوصول إلى فرص شحن يومية" + +#: core/templates/core/index.html:67 +msgid "Flexible bidding system" +msgstr "نظام عروض مرن" + +#: core/templates/core/index.html:68 +msgid "Direct chat with shippers" +msgstr "دردشة مباشرة مع الشاحنين" + +#: core/templates/core/index.html:70 +msgid "Register Your Truck" +msgstr "سجل شاحنتك" + +#: core/templates/core/index.html:82 +msgid "Everything you need for seamless logistics" +msgstr "كل ما تحتاجه للوجستيات سلسة" + +#: core/templates/core/index.html:90 +msgid "WhatsApp Integration" +msgstr "تكامل واتساب" + +#: core/templates/core/index.html:91 +msgid "Receive instant updates and communicate easily via WhatsApp API." +msgstr "استقبل تحديثات فورية وتواصل بسهولة عبر واجهة برمجة تطبيقات واتساب." + +#: core/templates/core/index.html:101 +msgid "Multilingual Support" +msgstr "دعم متعدد اللغات" + +#: core/templates/core/index.html:102 +msgid "Fully accessible in both Arabic and English for all users." +msgstr "متاح بالكامل باللغتين العربية والإنجليزية لجميع المستخدمين." + +#: core/templates/core/index.html:112 +msgid "Secure Documentation" +msgstr "توثيق آمن" + +#: core/templates/core/index.html:113 +msgid "Digital verification of truck registration and driver licenses." +msgstr "التحقق الرقمي من تسجيل الشاحنات ورخص القيادة." + +#: core/templates/core/index.html:135 +msgid "Ready to move your cargo?" +msgstr "هل أنت مستعد لنقل شحنتك؟" + +#: core/templates/core/index.html:136 +msgid "Join thousands of shippers and drivers on MASAR today." +msgstr "انضم إلى آلاف الشاحنين والسائقين على مسار اليوم." + +#: core/templates/core/index.html:137 +msgid "Join Now" +msgstr "انضم الآن" + +#: core/templates/core/marketplace.html:6 +msgid "Shipment Marketplace" +msgstr "سوق الشحنات" + +#: core/templates/core/marketplace.html:14 +msgid "ago" +msgstr "منذ" + +#: core/templates/core/marketplace.html:20 +#: core/templates/core/shipment_detail.html:21 +msgid "Weight" +msgstr "الوزن" + +#: core/templates/core/marketplace.html:24 +#: core/templates/core/shipment_detail.html:25 +#: core/templates/core/shipper_dashboard.html:26 +msgid "Delivery Date" +msgstr "تاريخ التسليم" + +#: core/templates/core/marketplace.html:28 +#: core/templates/core/place_bid.html:10 +msgid "Place an Offer" +msgstr "قدم عرضاً" + +#: core/templates/core/marketplace.html:34 +msgid "No shipments available at the moment." +msgstr "لا توجد شحنات متاحة حالياً." + +#: core/templates/core/place_bid.html:12 +msgid "Shipment:" +msgstr "الشحنة:" + +#: core/templates/core/place_bid.html:13 +msgid "Goods:" +msgstr "البضائع:" + +#: core/templates/core/place_bid.html:20 +msgid "Select Truck" +msgstr "اختر الشاحنة" + +#: core/templates/core/place_bid.html:28 +msgid "Your Offer Amount" +msgstr "مبلغ عرضك" + +#: core/templates/core/place_bid.html:35 +msgid "Comments/Conditions" +msgstr "التعليقات/الشروط" + +#: core/templates/core/place_bid.html:38 +msgid "Submit Offer" +msgstr "تقديم العرض" + +#: core/templates/core/place_bid.html:42 +msgid "You must register a truck before placing a bid." +msgstr "يجب عليك تسجيل شاحنة قبل تقديم عرض." + +#: core/templates/core/place_bid.html:43 +#, fuzzy +#| msgid "Register Your Truck" +msgid "Register Truck Now" +msgstr "سجل شاحنتك" + +#: core/templates/core/post_shipment.html:10 +#, fuzzy +#| msgid "Post shipments easily" +msgid "Post a New Shipment" +msgstr "انشر الشحنات بسهولة" + +#: core/templates/core/post_shipment.html:15 +msgid "What are you moving? (e.g. 500 boxes of food)" +msgstr "ماذا ستنقل؟ (مثال: 500 صندوق مواد غذائية)" + +#: core/templates/core/post_shipment.html:24 +#: core/templates/core/post_shipment.html:28 +msgid "City, Country" +msgstr "المدينة، الدولة" + +#: core/templates/core/post_shipment.html:35 +#, fuzzy +#| msgid "Post shipments easily" +msgid "Post Shipment" +msgstr "انشر الشحنات بسهولة" + +#: core/templates/core/shipment_detail.html:17 +msgid "Details" +msgstr "التفاصيل" + +#: core/templates/core/shipment_detail.html:35 +msgid "Received Bids" +msgstr "العروض المستلمة" + +#: core/templates/core/shipment_detail.html:42 +#, fuzzy +#| msgid "I am a Truck Owner" +msgid "Truck Owner" +msgstr "أنا صاحب شاحنة" + +#: core/templates/core/shipment_detail.html:43 +msgid "Truck" +msgstr "الشاحنة" + +#: core/templates/core/shipment_detail.html:44 +#: core/templates/core/truck_owner_dashboard.html:51 +msgid "Amount" +msgstr "المبلغ" + +#: core/templates/core/shipment_detail.html:45 +#: core/templates/core/shipper_dashboard.html:29 +msgid "Action" +msgstr "الإجراء" + +#: core/templates/core/shipment_detail.html:55 +msgid "Accept" +msgstr "قبول" + +#: core/templates/core/shipment_detail.html:60 +msgid "No bids received yet." +msgstr "لم يتم استلام عروض بعد." + +#: core/templates/core/shipment_detail.html:74 +msgid "Shipment in progress!" +msgstr "الشحنة قيد التنفيذ!" + +#: core/templates/core/shipment_detail.html:75 +#, fuzzy +#| msgid "Find a Truck" +msgid "Assigned Truck:" +msgstr "ابحث عن شاحنة" + +#: core/templates/core/shipment_detail.html:80 +msgid "Contact Driver on WhatsApp" +msgstr "تواصل مع السائق عبر واتساب" + +#: core/templates/core/shipment_detail.html:89 +msgid "Contact Information" +msgstr "معلومات الاتصال" + +#: core/templates/core/shipment_detail.html:91 +#, fuzzy +#| msgid "I am a Shipper" +msgid "Shipper:" +msgstr "أنا شاحن" + +#: core/templates/core/shipment_detail.html:93 +msgid "Phone:" +msgstr "الهاتف:" + +#: core/templates/core/shipper_dashboard.html:7 +#, fuzzy +#| msgid "Dashboard" +msgid "Shipper Dashboard" +msgstr "لوحة التحكم" + +#: core/templates/core/shipper_dashboard.html:9 +#, fuzzy +#| msgid "Post shipments easily" +msgid "Post New Shipment" +msgstr "انشر الشحنات بسهولة" + +#: core/templates/core/shipper_dashboard.html:17 +msgid "My Shipments" +msgstr "شحناتي" + +#: core/templates/core/shipper_dashboard.html:24 +msgid "Description" +msgstr "الوصف" + +#: core/templates/core/shipper_dashboard.html:25 +msgid "Route" +msgstr "المسار" + +#: core/templates/core/shipper_dashboard.html:27 +#: core/templates/core/truck_owner_dashboard.html:52 +msgid "Status" +msgstr "الحالة" + +#: core/templates/core/shipper_dashboard.html:28 +msgid "Bids" +msgstr "العروض" + +#: core/templates/core/shipper_dashboard.html:45 +msgid "View Details" +msgstr "عرض التفاصيل" + +#: core/templates/core/shipper_dashboard.html:50 +#, fuzzy +#| msgid "Post shipments easily" +msgid "No shipments posted yet." +msgstr "انشر الشحنات بسهولة" + +#: core/templates/core/truck_owner_dashboard.html:7 +#, fuzzy +#| msgid "Dashboard" +msgid "Truck Owner Dashboard" +msgstr "لوحة التحكم" + +#: core/templates/core/truck_owner_dashboard.html:10 +msgid "Find Shipments" +msgstr "ابحث عن شحنات" + +#: core/templates/core/truck_owner_dashboard.html:13 +#, fuzzy +#| msgid "Register Your Truck" +msgid "Register Truck" +msgstr "سجل شاحنتك" + +#: core/templates/core/truck_owner_dashboard.html:22 +msgid "My Trucks" +msgstr "شاحناتي" + +#: core/templates/core/truck_owner_dashboard.html:35 +msgid "No trucks registered." +msgstr "لا توجد شاحنات مسجلة." + +#: core/templates/core/truck_owner_dashboard.html:43 +msgid "My Active Bids" +msgstr "عروضي النشطة" + +#: core/templates/core/truck_owner_dashboard.html:50 +msgid "Shipment" +msgstr "الشحنة" + +#: core/templates/core/truck_owner_dashboard.html:68 +msgid "No bids placed." +msgstr "لا توجد عروض مقدمة." + +#: core/templates/core/truck_register.html:10 +#, fuzzy +#| msgid "Register Your Truck" +msgid "Register a Truck" +msgstr "سجل شاحنتك" + +#: core/templates/core/truck_register.html:38 +msgid "Load Capacity (e.g. 20 Tons)" +msgstr "الحمولة (مثال: 20 طن)" + +#: core/templates/core/truck_register.html:43 +msgid "Documents & Photos" +msgstr "المستندات والصور" + +#: core/templates/core/truck_register.html:57 +msgid "Registration (Front Face)" +msgstr "التسجيل (الوجه الأمامي)" + +#: core/templates/core/truck_register.html:61 +msgid "Registration (Back Face)" +msgstr "التسجيل (الوجه الخلفي)" + +#: core/templates/core/truck_register.html:66 +msgid "Submit Registration" +msgstr "إرسال التسجيل" + +#: core/templates/registration/login.html:15 +msgid "Username" +msgstr "اسم المستخدم" + +#: core/templates/registration/login.html:19 +msgid "Password" +msgstr "كلمة المرور" + +#: core/templates/registration/login.html:25 +msgid "Don't have an account?" +msgstr "ليس لديك حساب؟" + +#: core/templates/registration/login.html:25 +#: core/templates/registration/register.html:29 +msgid "Register" +msgstr "تسجيل" + +#: core/templates/registration/register.html:11 +msgid "Create your account" +msgstr "أنشئ حسابك" + +#: core/templates/registration/register.html:17 +msgid "I am a:" +msgstr "أنا:" + +#: core/templates/registration/register.html:25 +msgid "Phone Number" +msgstr "رقم الهاتف" + +#: core/templates/registration/register.html:32 +msgid "Already have an account?" +msgstr "لديك حساب بالفعل؟" + +#: core/views.py:79 +msgid "Truck registered successfully!" +msgstr "تم تسجيل الشاحنة بنجاح!" + +#: core/views.py:104 +msgid "Shipment posted successfully!" +msgstr "تم نشر الشحنة بنجاح!" + +#: core/views.py:137 +msgid "Bid placed successfully!" +msgstr "تم تقديم العرض بنجاح!" + +#: core/views.py:171 +msgid "Bid accepted! Shipment is now in progress." +msgstr "تم قبول العرض! الشحنة قيد التنفيذ الآن." + +#~ msgid "Features" +#~ msgstr "المميزات" + +#~ msgid "How it Works" +#~ msgstr "كيف يعمل" diff --git a/media/trucks/red_truk.jfif b/media/trucks/red_truk.jfif new file mode 100644 index 0000000000000000000000000000000000000000..af339cadc23a119625a7785ff848bc72dbd4cccb GIT binary patch literal 11385 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 VF(xKj>U?~V{NR5!yvp1y{2%+f0yzKx literal 0 HcmV?d00001 diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..48834d9 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,131 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +@import url('https://fonts.googleapis.com/css2?family=Cairo:wght@400;700&family=Outfit:wght@400;600;700&display=swap'); + +:root { + --primary-color: #0A1D37; + --secondary-color: #2196F3; + --accent-color: #00BCD4; + --bg-light: #F4F7F6; + --white: #FFFFFF; + --text-dark: #333333; + --text-muted: #666666; } + +body { + font-family: 'Outfit', 'Cairo', sans-serif; + background-color: var(--bg-light); + color: var(--text-dark); + margin: 0; + overflow-x: hidden; +} + +[lang="ar"] body { + direction: rtl; + text-align: right; +} + +.navbar { + background-color: var(--white); + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + padding: 1rem 2rem; +} + +.navbar-brand { + font-weight: 700; + font-size: 1.5rem; + color: var(--primary-color) !important; +} + +.nav-link { + color: var(--primary-color) !important; + font-weight: 600; + margin: 0 10px; +} + +.btn-primary { + background-color: var(--secondary-color); + border: none; + padding: 10px 25px; + border-radius: 50px; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn-primary:hover { + background-color: var(--primary-color); + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(33, 150, 243, 0.3); +} + +.btn-outline-primary { + border: 2px solid var(--secondary-color); + color: var(--secondary-color); + padding: 10px 25px; + border-radius: 50px; + font-weight: 600; +} + +.hero-section { + padding: 100px 0; + background: linear-gradient(135deg, var(--white) 0%, #E3F2FD 100%); + position: relative; + overflow: hidden; +} + +.hero-title { + font-size: 3.5rem; + font-weight: 700; + color: var(--primary-color); + margin-bottom: 20px; + line-height: 1.2; +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 40px; +} + +.role-card { + background: var(--white); + padding: 40px; + border-radius: 20px; + box-shadow: 0 10px 30px rgba(0,0,0,0.05); + transition: all 0.3s ease; + border: 1px solid transparent; + height: 100%; + cursor: pointer; +} + +.role-card:hover { + border-color: var(--secondary-color); + transform: translateY(-10px); +} + +.role-icon { + font-size: 3rem; + color: var(--secondary-color); + margin-bottom: 20px; +} + +.role-title { + font-size: 1.5rem; + font-weight: 700; + color: var(--primary-color); +} + +.role-desc { + color: var(--text-muted); + margin-bottom: 25px; +} + +footer { + background-color: var(--primary-color); + color: var(--white); + padding: 50px 0; +} + +/* RTL Adjustments */ +[lang="ar"] .ms-auto { + margin-right: auto !important; + margin-left: 0 !important; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..48834d9 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,131 @@ +@import url('https://fonts.googleapis.com/css2?family=Cairo:wght@400;700&family=Outfit:wght@400;600;700&display=swap'); :root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); + --primary-color: #0A1D37; + --secondary-color: #2196F3; + --accent-color: #00BCD4; + --bg-light: #F4F7F6; + --white: #FFFFFF; + --text-dark: #333333; + --text-muted: #666666; } + body { + font-family: 'Outfit', 'Cairo', sans-serif; + background-color: var(--bg-light); + color: var(--text-dark); margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + overflow-x: hidden; } + +[lang="ar"] body { + direction: rtl; + text-align: right; +} + +.navbar { + background-color: var(--white); + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + padding: 1rem 2rem; +} + +.navbar-brand { + font-weight: 700; + font-size: 1.5rem; + color: var(--primary-color) !important; +} + +.nav-link { + color: var(--primary-color) !important; + font-weight: 600; + margin: 0 10px; +} + +.btn-primary { + background-color: var(--secondary-color); + border: none; + padding: 10px 25px; + border-radius: 50px; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn-primary:hover { + background-color: var(--primary-color); + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(33, 150, 243, 0.3); +} + +.btn-outline-primary { + border: 2px solid var(--secondary-color); + color: var(--secondary-color); + padding: 10px 25px; + border-radius: 50px; + font-weight: 600; +} + +.hero-section { + padding: 100px 0; + background: linear-gradient(135deg, var(--white) 0%, #E3F2FD 100%); + position: relative; + overflow: hidden; +} + +.hero-title { + font-size: 3.5rem; + font-weight: 700; + color: var(--primary-color); + margin-bottom: 20px; + line-height: 1.2; +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 40px; +} + +.role-card { + background: var(--white); + padding: 40px; + border-radius: 20px; + box-shadow: 0 10px 30px rgba(0,0,0,0.05); + transition: all 0.3s ease; + border: 1px solid transparent; + height: 100%; + cursor: pointer; +} + +.role-card:hover { + border-color: var(--secondary-color); + transform: translateY(-10px); +} + +.role-icon { + font-size: 3rem; + color: var(--secondary-color); + margin-bottom: 20px; +} + +.role-title { + font-size: 1.5rem; + font-weight: 700; + color: var(--primary-color); +} + +.role-desc { + color: var(--text-muted); + margin-bottom: 25px; +} + +footer { + background-color: var(--primary-color); + color: var(--white); + padding: 50px 0; +} + +/* RTL Adjustments */ +[lang="ar"] .ms-auto { + margin-right: auto !important; + margin-left: 0 !important; +} \ No newline at end of file