From f69cb03bdbf7c42f67a1894748f7153c2f6c5549 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 25 Jan 2026 07:17:07 +0000 Subject: [PATCH] 1st update --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5709 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1153 bytes config/settings.py | 9 + config/urls.py | 30 +- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1225 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 3088 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 5215 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1059 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2501 bytes core/admin.py | 14 +- core/forms.py | 39 +++ core/migrations/0001_initial.py | 44 +++ ..._options_alter_profile_options_and_more.py | 99 ++++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3235 bytes ...r_profile_options_and_more.cpython-311.pyc | Bin 0 -> 4364 bytes core/models.py | 57 +++- core/templates/base.html | 134 ++++++-- core/templates/core/index.html | 242 ++++++-------- core/templates/core/login.html | 50 +++ core/templates/core/register.html | 64 ++++ core/templates/core/shipment_request.html | 42 +++ core/urls.py | 11 +- core/views.py | 61 ++-- locale/ar/LC_MESSAGES/django.mo | Bin 0 -> 5509 bytes locale/ar/LC_MESSAGES/django.po | 316 ++++++++++++++++++ locale/en/LC_MESSAGES/django.mo | Bin 0 -> 380 bytes locale/en/LC_MESSAGES/django.po | 315 +++++++++++++++++ static/css/custom.css | 108 +++++- staticfiles/css/custom.css | 115 ++++++- 29 files changed, 1526 insertions(+), 224 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_alter_parcel_options_alter_profile_options_and_more.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_alter_parcel_options_alter_profile_options_and_more.cpython-311.pyc create mode 100644 core/templates/core/login.html create mode 100644 core/templates/core/register.html create mode 100644 core/templates/core/shipment_request.html create mode 100644 locale/ar/LC_MESSAGES/django.mo create mode 100644 locale/ar/LC_MESSAGES/django.po create mode 100644 locale/en/LC_MESSAGES/django.mo create mode 100644 locale/en/LC_MESSAGES/django.po diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce5584823cd4ebfccfc40c2b36df8beaee7db..625a9a3b199c08d6f998fcd53e3beeed53052014 100644 GIT binary patch delta 674 zcmdm>eO8BeIWI340}!|#D$Tq5NfwDF#vU zDS}Z7K&+Tz7^MW1GXlv)DFa!?AQq4|fzqa6UCdD`lM|Q~>Z4Sd7*d(D!1jRbO0h`c zTE@h{uo{RVAW99WLLE(&Wr`K5s%4BoJwOcAqk*R0I)xWieUv6xg)YKk8w@2{XolEM z{AMexjV5T9Vn6YRb-WImutSO?nuWS4PAv>*s+?1GQB^I_gLwg&PH~xhjzwNrKUJrQ zDaAEPJH;)^AcZ-YLDPK`t0@a3`(!iDO5U9Orn5TTH2Wx7c0t z(sMG4GeF$LqFZc^MTtq7$+y@bIyR^9ZeV2GJXw^#k9E3yO$T8S z*rwQ_*`l3d-@<^V${|%7Rn-C=n7fhb6h~A)xiBmPO0R}1iP9BH)hc32af;GRagNeU zVGd@{blEJzYRbaMHrb1_a`QXRt<0NG@NQsaTs66pzmZXY^Kbqd#>o=|-A#>wrWBa~ ziCfH>c_l@rAg(!xumBO3Ai@en*Z_%Jti=U6nI%OIlX-*;xzd0lpkOY(x7l4No>7pK bkLd#gjA-EcAhvnCFcTvakKpFpB1Mb@L>Zw7=%6|2}z8KG$zk56tgO;h4LW{=dphdsbP)Fb3VpuMC0?kkHczI zi{)bsVv!t@IPh4CoP**8?5>?d=L^_fD>M1H90y*^ui#~-k_d7YAwc~#J~QfT$Nr}+ z#V-@*A?OCXYc)`Weq3cJh>%6UI}fqpAO?6Oz?VXQ@16pkn3sltIT|pf;aVJ_!F*|C z2hp7#{YB|%#tRoEP0`b=hpR>F*o!E7Nwp;zGQ25UmZFzUz?^9nEu{oVQ05-$1>jmT z(alv-%sZ!L-My6!wM;V)_W`@RVoG&hVs1_|5MD{b!L1e5-{~M;0 z5spU2ZmN5;b}vUFG&}evg!i>TJGi-rO~sNuOxtkr#CHaHYgUUTS)}7CWzm1i z>icW{v1UlNDld}>D5t-$xd6TsVi=~4?zH+>8{KUUT7#IgE!4N#NNn}54u`_g`dVYG zIn$hJjn6sBc{e%l-~|^ibVBSfTaR~m#3UN0jng*ffqA?6;Ox=aQwLAGc)A-(Huf9) z%{PuP=?aq$o^tV2dt$N^!6WQ%1nv)YfEcQlKsfPXxr10H$F%WqbE&!X>7F}&|J#B4 xB-={moK(&Qk8}0SAU*r_rMtNPgLf9UTdAy*%DUijw!TTfPM9in^~g9p-e1ZCF~|S_ 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/settings.py b/config/settings.py index 291d043..fbbd525 100644 --- a/config/settings.py +++ b/config/settings.py @@ -61,6 +61,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', @@ -134,6 +135,14 @@ AUTH_PASSWORD_VALIDATORS = [ # https://docs.djangoproject.com/en/5.2/topics/i18n/ LANGUAGE_CODE = 'en-us' +LANGUAGES = [ + ('en', 'English'), + ('ar', 'Arabic'), +] + +LOCALE_PATHS = [ + BASE_DIR / 'locale', +] TIME_ZONE = 'UTC' diff --git a/config/urls.py b/config/urls.py index bcfc074..4d288c5 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,29 +1,19 @@ -""" -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.urls import path, include from django.conf import settings from django.conf.urls.static import static +from django.conf.urls.i18n import i18n_patterns urlpatterns = [ - path("admin/", admin.site.urls), - path("", include("core.urls")), + path('i18n/', include('django.conf.urls.i18n')), ] +urlpatterns += i18n_patterns( + path('admin/', admin.site.urls), + path('', include('core.urls')), + prefix_default_language=False +) + if settings.DEBUG: - urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") \ No newline at end of file diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..d1dabe0910e161cb7f96af0a210118c7e7a9fb78 100644 GIT binary patch literal 1225 zcma)5OHUL*5bmDWF3UcUhoC4SpohW89*lZ18c!xFNTR2?Oor)(9hk@3Gox~w16LDn z`~!^PPnei^hGY+$K9P9hwggU`teSm99wv6rd{Z@5{dMFdp zzZpH_^cNVrgb_x45>Sg$!W5?ZN}yV5pjjFv3gL7^?+@ha9wlTS-fmOKE5fvG!gR>$ zvywd(a^UT@J^1YR9by$OF>2Q^8o*fiZ^j}kz9;6;G0tI9sXHw2!ed;csmQ{Lh}Jxx zOJl_mF8AHRO2Fvv`JIq|g6x&7&oq&sB_`PfzvS{1r+qNv(b`Y`DN4sp>A5+KgMasSx zCpPoqrtfUY;oO5=Brs$x(E%`H)cF*#^p#CHL*K|dOMl)Y__PG@i0<4>|B>|(s1f4zJ&5dN2Z zmcew8(2&F30(2GBWi1hoyXl4NJ>g^_Zg|Zm?6BZELU>>papELtEK9E7PQsb(B&H&! zaV>WMOjS(5M^*%Px%UagM)hQM;O2FKf?(FNSr8Q*Sw*NJj3C@V7zL0un1n^4ztxjg zjA1C>`2<>%eZcz0a{zy9_5n3pK+RrfOYNHr**omr;W%>H9FkSG;e_kaq8o*Y@Kyz0 z5oy2?;C?LdjtRU%vMBgElph2rEnzHItXr~t4HwsSUVPR)M9;-N7>!3d{t3`gDWz>P zdvNh-llg<|o+DbzCbnmG3Ws#6MW;H7N}qPfRoHpl8k;}Cz!}1cN|alJ{1Q<{au(x| gPPXV|N73km4!H_D_gkZLCm1+GKo*$wa(=GfANR>AYybcN delta 147 zcmX@fd4(}$IWI340}xFAk)LS~q#uJgFu(+5d=>&SrZc24q%h_%TC(VnrPPep~mf9c@Hte!Ma9ePjCT(B=S-@!Gxk((xp6s15 zDUpF_sf4L2(UrPtD&-^MqXd=x=aXIagU@j^Qb!|ILgK4`uF{WHKM?2MiS61AV)xFS z<8#kF=iEEz>2G4OFoN;!f64_ufY8r$(HO!Wvilw&H;{@{PD4d5$8i+*X}+RA=V!QI zqre;Mrsgq%b|wSTYiLY!|RP)SQXzyQs_QiN}MY!=%i=> z!vEF41b(B7*fjAaQ`VHVkMDCHSMUPS7YZ8AdrCYAw`XJb1>pJu?u${5Q&G<6L)gE} z@9k2&@m+9398kGiz<--+X5%~GEg!7m^+qoEJM#YDkr$bK^ZRjlInvP0&gVPig^u&1 z?dPijCKc?E5<8?~%=#g)ez;?&OO0GcxwzU@MGKr7yBx}OSJ5Rd*8_ftyM5H|b9k{} zm_#uPdg%-}#1$_nhOw#>Rr0xk)q)C6aRp78$J$zVMlUTCNHN)9S&Mk$m?RYg_=EW+ zy^zNSiNa^!?*p(Fy|AR0aB`+xoChcS+;CC3Bx|^|Xf83X{r$QEqAjmte~w>-i2Rz% z3CtqCc8f4thi@3I!`_T0w9Bg8CZ7wc0kBB$(a?StNu9^0BJr+R26L5^B6bB_R0^6K z23r`W%t#?kX`mui;_;oPd~4w|lrK30qHCdP;A7~FB)X!^q-EI+%W_dy%NhneD$9Q> zD;iZH%Y;U=E5Ih!+`vKsYpUULvKwG7F}_8+u#X;{OfTt0oG#CoOJ+HZFX4RI)JYor z_@S|)@z(9+0G-GTsKT-h7x7q6}UBX>RL43BJ#ZA{-xZ>F80;f6YDZ|b-{kM03xbEAamAIr%yGLLn4I@AX05-GGDcF>OUKM)Q8DvN zlHf-38dgeJl~u)5Tt8$Rp_g#uZ!1~>Xpokt3DF4|1*+tCc>`+;+OVQ=Bz8?jhUnS}$gIPG+r>*?YYMcJHx&an|vv+W2es z_-nP^jNO~Dq8TTC$Py2+IC(4IEX8m>E%Nm1cE=$i{>j}y=3|j@3pQ@U>y6)v87S}| z(<=B70luxr&uA#15!m#->K|&-+vPa~5i|`t9=l1C6}8`qL#Ei;Yc-;+M)PWI0#@<0 z-GFc1pp7oH=-&m}+bi6S#$j;g47AcfUN064CW{l7C%T5+=n5^wa>*;i5Jebb+Dpx976V*yBF4=LZ$~$88 zt~j(K4s9HX7g?3d@Ro~xd_7foE9y&FBe z6Fuzo55ctik8XWr_otlEF?%$%{i!|ray^J*e|UiSSl2@e>I{St6u}6KN{M?*>Lr74 zF+#0RhACh<8pfNId_d)2ckEmMR78db(G0Kj^U$B7@Tmal%ch3%s+ z{?G%@pZ-01XVi+%*5b2ve0Kc}XW;0y^7YTQv7MUwvFFDg>)iXb><4!C18YF84aoL@ zZ1H_g!+N=;cFAuU)i4jo`WY%{tw{w8)}dlDdGmyWu>&J zd)^xM7AYvnCMnFPl(M;$Vtv){n(W{nL)k27MhgBDl?;s)U_x62^Qjxy6JWUzI#0VY z{nx}?Kn_v1Bn4vt9*HjjGqm)V$*ZuWPBT6SQ1^2j=b%BWeLCob)jl2cg4I49G-9>S YIzPsNg`NZ(6PvF*p!A3PY_d!K3TVpMv;Y7A literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..158b3118944cc0b30e2cace48b746ef91244e37e 100644 GIT binary patch literal 5215 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 C$^p6n delta 150 zcmcbwagi~7IWI340}xFAk)LS^q#uJgFu(+5d=>&SrZc24q%h_%0RuWMYOxP^lNxQfob#_*;CypFE za4?ahC)B_n;MtSMS+WVuUOjOm;bJ&Bv+WWg_3g~gd%yRaH}AcfuccA}a9R85o3~N` z{1!$cv4bdD z@Ro2px{bRs!7bCHn4l=1sNJmPwoC_gD@~VR6dUz6wJpA@M6unmbc!{xJ<7z+ZjLXm zPZ1}`4&I_#M{nUsgyCp+%xjw+8#{EG;CDXuD2hfCNE<-iicYB6wD7cnscu>*Dh~jy z4>W4!sAz2HPRp(P#PW!^{YV)gP1m8sT(9dsZ4)Rw1)*wj=|nsoBHjiOS02evMR~7y zSE8Km#hj?XF`lacNm(!}f?4Dz@hcdCQV^Se&J+|V z%b~K&Uav8z1yBp2)@NSdeG;m*V|C_8o%ylI)R{nC2-SsO4;Wkt;7SNrVjh#H_HcOf s9((wV!A1ZZA#4mBlY5WDsXOfcB7;i-TngdRX(?ApZ5PEyCV26G0py$+A^-pY delta 278 zcmZ3?ahs`rIWI340}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;lTR`Q#P9({ zKt>dM0f`UHjEsyo7-TM>q6ZA(7f{g$HU?JC2A2+@j*uB_7g*#kvdCXyk^jKV#Lv{g K4T42HK;r;Ojz4n% diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..eaa422078bcb9aec56ad07321d453ae29cce034c 100644 GIT binary patch literal 2501 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 OvhVrC#|vgXul@^yI%Zn{ literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_alter_parcel_options_alter_profile_options_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_alter_parcel_options_alter_profile_options_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fb3a9ae3f7c5c2f76d8bd6f1ab47301e6861f50 GIT binary patch literal 4364 zcmb7HJ8;{`83w@jLoY~YMZVakWy?12e3W&0Cyvgv9(EjCq9iKzF|iPkyP`mW0KEWD zmYm$VNRjfoYf`09oG}X*DKe=vnG~5x1I?h|Y@13QJ$7|X^6!EmC7+M7KyvrrfA|0P zf9=2EU;6su0zCitXI=ZxfFS&r4g4q6CSK)$_)0(m5_O>L3j>7?PgyEN_}Zw? zK@tj}APW6SYJ_(sSPMVzd1GA!MN#Zq*TsA(z>9-qyprf}5-5R_l|Fx5;XY@hN`Hq3 z-uE7qJghzHYxM7eEzdjlGzO0PlWTc+_d&k}V{G)#CIww0Qr-T735nj5Fx$i80Q-fssPzPmD3nF*-SMY(5Nk{C43; zK3r@}>_VPD@8tTiUc7Wv`?7#8|5-#=Pzt3RADj^D!=qRz0VoM{weisjaWWj|aE?wk zuAMNyrZ~n($4?)l@1gIbA2fb=B3&ZrM{lv|$BmyHJ!QvuIf8!r2FlOS^|FMcB zX}G465{5qK^%1XUH9PqkCPmZ2ilJ699X>o#YI>chI>Y3X5wqsi_DGGG>za;fB-bXQ zZNj3Fl1hk%NuCaP6jHp+VQR*kN{4BvsH?^%;MR4W#!N$jy8_#wHo>}TW8`Tg*(PCi zHywbhg+-Gh{j6DcM-tjRGZjaVC6t%eCrTG+6= z&Ry}?=^$a(EIG}Z_gTX{NW+$`+I1@(0^1@rY#_L@K}C;9d8)!xj2Qv$uh({BjEPZd zwZ`0`8H!C*!_vUbzc5mHk7g2WpJGH~Z9ihf_$AeVl+zi1#wSUJ>$2kM5`<*gFtrkf z)IfM$t?M=!?`S*#`;|69O~t5JieLhHOMryNsz}}yB5^dI%&2l;&r2Pn&w5qDZ!BCmj zu??)(6dOOby?jAhS+gw|%m>z?GX^A!(t755egiK*kXL_T2lT!qGSAW_UM11tvz zlGGw2X>b`<(qP?U^eVLJfEVvhs29?sG^+3=kC&EXN3l~4`p>5lY8t`F1E`; zoU`WHxg^YeG(HcdNGlt^#M?BCDymU7sf3C&3PPBb5*l5Z%PR}3ckj}^S%_F(t70w> zIkTaXHkk(pdt_uLyE2oVoukQFFA^TRZ_&Vc6B=(AH{p1Auc3bxUV$RQ*PD|YW))A? zi*>`UPvXb81jT_&Zkc4$szEF#S<#&AzP?UE`TST>nThQarnHNn&-4mkmunz!G{KqL zHes*MykT#t)^EYlPdlGhScsi(Mlb&{?nW;^i@H~C>_@Y1G}{UVM#4|;wvs|@g3VoQ z4vjS@KHAfqksN$sIu?H^K=Yb4t!Q`I>E=XcZ^s!~hVNUJon>fenxp5ML#Lbag)c9; z@`Yy?U*z|G^{-Fexm9;=&7CW^1Yt|OEkSorT9sb24zrOh{hoEhpGz-!3o}5sB0;7M zG_P6HiVLwryPRptm)I_sUd-+`gQ1!>?nXuDlf`!w z>V{{%p}Co9H*?F)EIMnt^Jp6!PsBSc7N1H*9+DCdNr?q(xO7ZN#(Wb%{wj~?;r3P_ z7l4U}0flu&;4{_@Zv|M$w*m}*E705AaUcKL$lu5J^3DUzkt_Rh#g!|)1-rQt+`Imc zZUSQ_SguUGSlY`t57(UPjw3(Wm!G)ulODUJnnULftNHI~M=tEk1y?TgmKyb?oU1pT z*)``w#nA|O=!SHY1!76M&*Slc$KwHy$Aez+07U?@eMCI-Dsb%NB;@&p_ z@(Xc}L(X%^c@8=M4M;`Gi*oqs9rhs){gRW8(lM{nW>7KX{RhwZ<(4eLGMZ@5mrP^b zEA_FC1iuw{@%F0NZx}8IUjypv=ymThnI=UTvcKil=g_nQq9{UT6VE$B%KJ8b;t=PG fBfRC?3jbOZ!!6 - - + - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}masarX | {% trans "Small Shipments, Smart Delivery" %}{% endblock %} + + {% if project_description %} + + + + {% endif %} + {% if project_image_url %} + + + {% endif %} + + + + + + + + + + {% if lang.direction == 'rtl' %} + + {% endif %} + + {% block head %}{% endblock %} - - {% block content %}{% endblock %} - + + + +
+ {% block content %}{% endblock %} +
+ +
+
+

© 2026 masarX. {% trans "All rights reserved." %}

+
+
+ + + + diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..a82bcf4 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,105 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static i18n %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… + +
+
+
+
+

{% trans "Small Shipments," %}
{% trans "Smart Delivery." %}

+

{% trans "masarX connects shippers with local car owners for fast, reliable, and trackable deliveries. Your cargo, our priority." %}

+ +
+
+
+

{% trans "Track your Parcel" %}

+
+
+ + +
+
+ + {% if parcel %} +
+
+ {% trans "Status" %} + {{ parcel.get_status_display }} +
+
{{ parcel.description|truncatechars:30 }}
+

{% trans "From" %}: {{ parcel.pickup_address }}

+

{% trans "To" %}: {{ parcel.delivery_address }}

+
+ {% elif error %} +
+ {{ error }} +
+ {% else %} +

{% trans "Enter your 10-character tracking ID to see live updates." %}

+ {% endif %} +
+
+
-

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 masarX Works" %}

+

{% trans "Simple steps to get your shipment moving" %}

+
+
+
+
+
+ +
+

1. {% trans "List your Parcel" %}

+

{% trans "Enter shipment details, weight, and delivery addresses. It's quick and easy." %}

+
+
+
+
+
+ +
+

2. {% trans "Connect with Driver" %}

+

{% trans "A verified car owner near you picks up the parcel and starts the journey." %}

+
+
+
+
+
+ +
+

3. {% trans "Secure Delivery" %}

+

{% trans "Track your parcel in real-time until it reaches its destination safely." %}

+
+
+
+
+
+ + +
+
+

{% trans "Ready to join the movement?" %}

+
+
+

{% trans "I want to send a parcel" %}

+ {% trans "Become a Shipper" %} +
+
+

{% trans "I have a car and want to earn" %}

+ {% trans "Become a Driver" %} +
+
+
+
{% endblock %} \ No newline at end of file diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..0d181ef --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,50 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans "Login" %} | masarX{% endblock %} + +{% block content %} +
+
+
+
+
+
+

{% trans "Login to masarX" %}

+
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.errors %} +
{{ field.errors }}
+ {% endif %} +
+ {% endfor %} + +
+
+

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

+
+
+
+
+
+
+
+ + +{% endblock %} diff --git a/core/templates/core/register.html b/core/templates/core/register.html new file mode 100644 index 0000000..2bdddbf --- /dev/null +++ b/core/templates/core/register.html @@ -0,0 +1,64 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans "Register" %} | masarX{% endblock %} + +{% block content %} +
+
+
+
+
+
+

{% trans "Join masarX" %}

+
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %} +
{{ field.help_text }}
+ {% endif %} + {% if field.errors %} +
{{ field.errors }}
+ {% endif %} +
+ {% endfor %} + +
+
+

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

+
+
+
+
+
+
+
+ + +{% endblock %} diff --git a/core/templates/core/shipment_request.html b/core/templates/core/shipment_request.html new file mode 100644 index 0000000..de179ad --- /dev/null +++ b/core/templates/core/shipment_request.html @@ -0,0 +1,42 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+
+

Request a Shipment

+
+ {% csrf_token %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..ddda4d3 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,12 @@ 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.index, name='index'), + path('register/', views.register, name='register'), + path('login/', auth_views.LoginView.as_view(template_name='core/login.html'), name='login'), + path('logout/', auth_views.LogoutView.as_view(next_page='index'), name='logout'), + path('shipment-request/', views.shipment_request, name='shipment_request'), + path('article-detail/', views.article_detail, name='article_detail'), ] diff --git a/core/views.py b/core/views.py index c9aed12..f9e0421 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,44 @@ -import os -import platform +from django.shortcuts import render, redirect +from django.contrib.auth import login, authenticate +from django.contrib.auth.forms import AuthenticationForm +from django.contrib.auth.decorators import login_required +from .models import Parcel, Profile +from .forms import UserRegistrationForm +from django.utils.translation import gettext_lazy as _ -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def index(request): + tracking_id = request.GET.get('tracking_id') + parcel = None + error = None + if tracking_id: + try: + parcel = Parcel.objects.get(tracking_number=tracking_id) + except Parcel.DoesNotExist: + error = _("Parcel not found.") + + return render(request, 'core/index.html', { + 'parcel': parcel, + 'error': error, + 'tracking_id': tracking_id + }) +def register(request): + if request.method == 'POST': + form = UserRegistrationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect('index') + else: + form = UserRegistrationForm() + return render(request, 'core/register.html', {'form': form}) -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() +@login_required +def shipment_request(request): + if request.method == 'POST': + # Logic for creating shipment will go here + pass + return render(request, 'core/shipment_request.html') - 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", ""), - } - return render(request, "core/index.html", context) +def article_detail(request): + return render(request, 'core/article_detail.html') diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d09703c850b57a62d182910f7e6552b25b1dfec0 GIT binary patch literal 5509 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 S*+6inYqMORf+uO+Y5of+*GR4a 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..b844de2 --- /dev/null +++ b/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,316 @@ +# 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. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-25 07:13+0000\n" +"PO-Revision-Date: 2026-01-25 07:13+0000\n" +"Last-Translator: Gemini\n" +"Language-Team: Arabic\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" + +#: core/forms.py:7 +msgid "Password" +msgstr "كلمة المرور" + +#: core/forms.py:8 +msgid "Confirm Password" +msgstr "تأكيد كلمة المرور" + +#: core/forms.py:9 +msgid "Register as" +msgstr "التسجيل كـ" + +#: core/forms.py:10 core/models.py:13 +msgid "Phone Number" +msgstr "رقم الهاتف" + +#: core/forms.py:16 +msgid "Username" +msgstr "اسم المستخدم" + +#: core/forms.py:17 +msgid "Email" +msgstr "البريد الإلكتروني" + +#: core/forms.py:18 +msgid "First Name" +msgstr "الاسم الأول" + +#: core/forms.py:19 +msgid "Last Name" +msgstr "اسم العائلة" + +#: core/forms.py:26 +msgid "Passwords don't match" +msgstr "كلمات المرور غير متطابقة" + +#: core/models.py:8 core/models.py:32 +msgid "Shipper" +msgstr "شاحن" + +#: core/models.py:9 +msgid "Car Owner" +msgstr "صاحب سيارة" + +#: core/models.py:11 +msgid "User" +msgstr "مستخدم" + +#: core/models.py:12 +msgid "Role" +msgstr "الدور" + +#: core/models.py:19 +msgid "Profile" +msgstr "الملف الشخصي" + +#: core/models.py:20 +msgid "Profiles" +msgstr "الملفات الشخصية" + +#: core/models.py:24 +msgid "Pending Pickup" +msgstr "في انتظار الاستلام" + +#: core/models.py:25 +msgid "Picked Up" +msgstr "تم الاستلام" + +#: core/models.py:26 +msgid "In Transit" +msgstr "في الطريق" + +#: core/models.py:27 +msgid "Delivered" +msgstr "تم التوصيل" + +#: core/models.py:28 +msgid "Cancelled" +msgstr "ملغي" + +#: core/models.py:31 +msgid "Tracking Number" +msgstr "رقم التتبع" + +#: core/models.py:33 +msgid "Carrier" +msgstr "الناقل" + +#: core/models.py:35 +msgid "Description" +msgstr "الوصف" + +#: core/models.py:36 +msgid "Weight (kg)" +msgstr "الوزن (كجم)" + +#: core/models.py:36 +msgid "Weight in kg" +msgstr "الوزن بالكيلوجرام" + +#: core/models.py:38 +msgid "Pickup Address" +msgstr "عنوان الاستلام" + +#: core/models.py:39 +msgid "Delivery Address" +msgstr "عنوان التوصيل" + +#: core/models.py:41 +msgid "Receiver Name" +msgstr "اسم المستلم" + +#: core/models.py:42 +msgid "Receiver Phone" +msgstr "هاتف المستلم" + +#: core/models.py:44 core/templates/core/index.html:30 +msgid "Status" +msgstr "الحالة" + +#: core/models.py:45 +msgid "Created At" +msgstr "أنشئ في" + +#: core/models.py:46 +msgid "Updated At" +msgstr "حدث في" + +#: core/models.py:57 +msgid "Parcel" +msgstr "طرد" + +#: core/models.py:58 +msgid "Parcels" +msgstr "طرود" + +#: core/templates/base.html:9 +msgid "Small Shipments, Smart Delivery" +msgstr "شحنات صغيرة، توصيل ذكي" + +#: core/templates/base.html:58 +msgid "How it Works" +msgstr "كيف يعمل" + +#: core/templates/base.html:62 +msgid "Hello" +msgstr "مرحباً" + +#: core/templates/base.html:67 +msgid "Logout" +msgstr "تسجيل الخروج" + +#: core/templates/base.html:72 core/templates/core/login.html:4 +#: core/templates/core/login.html:25 +msgid "Login" +msgstr "تسجيل الدخول" + +#: core/templates/base.html:75 core/templates/core/register.html:4 +msgid "Register" +msgstr "تسجيل" + +#: core/templates/base.html:101 core/templates/core/index.html:13 +msgid "Start Shipping" +msgstr "ابدأ الشحن" + +#: core/templates/base.html:114 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة." + +#: core/templates/core/index.html:10 +msgid "Small Shipments," +msgstr "شحنات صغيرة،" + +#: core/templates/core/index.html:10 +msgid "Smart Delivery." +msgstr "توصيل ذكي." + +#: core/templates/core/index.html:11 +msgid "" +"masarX connects shippers with local car owners for fast, reliable, and " +"trackable deliveries. Your cargo, our priority." +msgstr "يربط مسارX بين الشاحنين وأصحاب السيارات المحليين لتوصيل سريع وموثوق وقابل للتتبع. شحنتك هي أولويتنا." + +#: core/templates/core/index.html:14 +msgid "Learn More" +msgstr "تعلم المزيد" + +#: core/templates/core/index.html:19 +msgid "Track your Parcel" +msgstr "تتبع طردك" + +#: core/templates/core/index.html:22 +msgid "Enter Tracking ID (e.g. 5A2B...)" +msgstr "أدخل رقم التتبع (مثال: 5A2B...)" + +#: core/templates/core/index.html:23 +msgid "Track" +msgstr "تتبع" + +#: core/templates/core/index.html:34 +msgid "From" +msgstr "من" + +#: core/templates/core/index.html:35 +msgid "To" +msgstr "إلى" + +#: core/templates/core/index.html:42 +msgid "Enter your 10-character tracking ID to see live updates." +msgstr "أدخل رقم التتبع المكون من 10 أرقام لرؤية التحديثات المباشرة." + +#: core/templates/core/index.html:54 +msgid "How masarX Works" +msgstr "كيف يعمل مسارX" + +#: core/templates/core/index.html:55 +msgid "Simple steps to get your shipment moving" +msgstr "خطوات بسيطة لبدء شحن طردك" + +#: core/templates/core/index.html:63 +msgid "List your Parcel" +msgstr "أدرج طردك" + +#: core/templates/core/index.html:64 +msgid "" +"Enter shipment details, weight, and delivery addresses. It's quick and easy." +msgstr "أدخل تفاصيل الشحنة والوزن وعناوين التوصيل. إنه سريع وسهل." + +#: core/templates/core/index.html:72 +msgid "Connect with Driver" +msgstr "تواصل مع السائق" + +#: core/templates/core/index.html:73 +msgid "" +"A verified car owner near you picks up the parcel and starts the journey." +msgstr "يقوم صاحب سيارة تم التحقق منه بالقرب منك باستلام الطرد وبدء الرحلة." + +#: core/templates/core/index.html:81 +msgid "Secure Delivery" +msgstr "توصيل آمن" + +#: core/templates/core/index.html:82 +msgid "Track your parcel in real-time until it reaches its destination safely." +msgstr "تتبع طردك في الوقت الفعلي حتى يصل إلى وجهته بأمان." + +#: core/templates/core/index.html:92 +msgid "Ready to join the movement?" +msgstr "مستعد للانضمام إلينا؟" + +#: core/templates/core/index.html:95 +msgid "I want to send a parcel" +msgstr "أريد إرسال طرد" + +#: core/templates/core/index.html:96 +msgid "Become a Shipper" +msgstr "كن شاحناً" + +#: core/templates/core/index.html:99 +msgid "I have a car and want to earn" +msgstr "لدي سيارة وأريد كسب المال" + +#: core/templates/core/index.html:100 +msgid "Become a Driver" +msgstr "كن سائقاً" + +#: core/templates/core/login.html:13 +msgid "Login to masarX" +msgstr "تسجيل الدخول إلى مسارX" + +#: core/templates/core/login.html:28 +msgid "Don't have an account?" +msgstr "ليس لديك حساب؟" + +#: core/templates/core/login.html:28 +msgid "Register here" +msgstr "سجل هنا" + +#: core/templates/core/register.html:13 +msgid "Join masarX" +msgstr "انضم إلى مسارX" + +#: core/templates/core/register.html:28 +msgid "Create Account" +msgstr "إنشاء حساب" + +#: core/templates/core/register.html:31 +msgid "Already have an account?" +msgstr "لديك حساب بالفعل؟" + +#: core/templates/core/register.html:31 +msgid "Login here" +msgstr "سجل دخولك هنا" + +#: core/views.py:17 +msgid "Parcel not found." +msgstr "الطرد غير موجود." \ No newline at end of file diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..71cbdf3e9d8d54be31066ec4ad8628bc2c1f2845 GIT binary patch literal 380 zcmYL@K~KUk7=|%=+R?Lz&%}d9i{c3jGZa>EvE7z2Nc2{r&Y96JZ6W$Y{CoZuJ5A(G zp7i_Dx9RhJeDu}vIq;l#&OC>nD^HugXY4QU{MmN?lNtRkR}RH%w3NnHT4Bh@vF%H^(V-=Ii1iQ$Qo9Pt!I1Rhe%oml#`f^NEGFCKEL->Rc=KoQ6a?!10%_7(V7ey8`V`;n{war z20Z3;uifk31QV^CRQ|iq#``$=;jWunRB8aLH({)F;i8zL{=V00y-I_qTIqGAN(}v% i$^}`yHKImSZ8jEzYJOK6-VWez49^vuhS0kh1f3tbb!oc* literal 0 HcmV?d00001 diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..01f7466 --- /dev/null +++ b/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,315 @@ +# 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-25 07:13+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: core/forms.py:7 +msgid "Password" +msgstr "" + +#: core/forms.py:8 +msgid "Confirm Password" +msgstr "" + +#: core/forms.py:9 +msgid "Register as" +msgstr "" + +#: core/forms.py:10 core/models.py:13 +msgid "Phone Number" +msgstr "" + +#: core/forms.py:16 +msgid "Username" +msgstr "" + +#: core/forms.py:17 +msgid "Email" +msgstr "" + +#: core/forms.py:18 +msgid "First Name" +msgstr "" + +#: core/forms.py:19 +msgid "Last Name" +msgstr "" + +#: core/forms.py:26 +msgid "Passwords don't match" +msgstr "" + +#: core/models.py:8 core/models.py:32 +msgid "Shipper" +msgstr "" + +#: core/models.py:9 +msgid "Car Owner" +msgstr "" + +#: core/models.py:11 +msgid "User" +msgstr "" + +#: core/models.py:12 +msgid "Role" +msgstr "" + +#: core/models.py:19 +msgid "Profile" +msgstr "" + +#: core/models.py:20 +msgid "Profiles" +msgstr "" + +#: core/models.py:24 +msgid "Pending Pickup" +msgstr "" + +#: core/models.py:25 +msgid "Picked Up" +msgstr "" + +#: core/models.py:26 +msgid "In Transit" +msgstr "" + +#: core/models.py:27 +msgid "Delivered" +msgstr "" + +#: core/models.py:28 +msgid "Cancelled" +msgstr "" + +#: core/models.py:31 +msgid "Tracking Number" +msgstr "" + +#: core/models.py:33 +msgid "Carrier" +msgstr "" + +#: core/models.py:35 +msgid "Description" +msgstr "" + +#: core/models.py:36 +msgid "Weight (kg)" +msgstr "" + +#: core/models.py:36 +msgid "Weight in kg" +msgstr "" + +#: core/models.py:38 +msgid "Pickup Address" +msgstr "" + +#: core/models.py:39 +msgid "Delivery Address" +msgstr "" + +#: core/models.py:41 +msgid "Receiver Name" +msgstr "" + +#: core/models.py:42 +msgid "Receiver Phone" +msgstr "" + +#: core/models.py:44 core/templates/core/index.html:30 +msgid "Status" +msgstr "" + +#: core/models.py:45 +msgid "Created At" +msgstr "" + +#: core/models.py:46 +msgid "Updated At" +msgstr "" + +#: core/models.py:57 +msgid "Parcel" +msgstr "" + +#: core/models.py:58 +msgid "Parcels" +msgstr "" + +#: core/templates/base.html:9 +msgid "Small Shipments, Smart Delivery" +msgstr "" + +#: core/templates/base.html:58 +msgid "How it Works" +msgstr "" + +#: core/templates/base.html:62 +msgid "Hello" +msgstr "" + +#: core/templates/base.html:67 +msgid "Logout" +msgstr "" + +#: core/templates/base.html:72 core/templates/core/login.html:4 +#: core/templates/core/login.html:25 +msgid "Login" +msgstr "" + +#: core/templates/base.html:75 core/templates/core/register.html:4 +msgid "Register" +msgstr "" + +#: core/templates/base.html:101 core/templates/core/index.html:13 +msgid "Start Shipping" +msgstr "" + +#: core/templates/base.html:114 +msgid "All rights reserved." +msgstr "" + +#: core/templates/core/index.html:10 +msgid "Small Shipments," +msgstr "" + +#: core/templates/core/index.html:10 +msgid "Smart Delivery." +msgstr "" + +#: core/templates/core/index.html:11 +msgid "" +"masarX connects shippers with local car owners for fast, reliable, and " +"trackable deliveries. Your cargo, our priority." +msgstr "" + +#: core/templates/core/index.html:14 +msgid "Learn More" +msgstr "" + +#: core/templates/core/index.html:19 +msgid "Track your Parcel" +msgstr "" + +#: core/templates/core/index.html:22 +msgid "Enter Tracking ID (e.g. 5A2B...)" +msgstr "" + +#: core/templates/core/index.html:23 +msgid "Track" +msgstr "" + +#: core/templates/core/index.html:34 +msgid "From" +msgstr "" + +#: core/templates/core/index.html:35 +msgid "To" +msgstr "" + +#: core/templates/core/index.html:42 +msgid "Enter your 10-character tracking ID to see live updates." +msgstr "" + +#: core/templates/core/index.html:54 +msgid "How masarX Works" +msgstr "" + +#: core/templates/core/index.html:55 +msgid "Simple steps to get your shipment moving" +msgstr "" + +#: core/templates/core/index.html:63 +msgid "List your Parcel" +msgstr "" + +#: core/templates/core/index.html:64 +msgid "" +"Enter shipment details, weight, and delivery addresses. It's quick and easy." +msgstr "" + +#: core/templates/core/index.html:72 +msgid "Connect with Driver" +msgstr "" + +#: core/templates/core/index.html:73 +msgid "" +"A verified car owner near you picks up the parcel and starts the journey." +msgstr "" + +#: core/templates/core/index.html:81 +msgid "Secure Delivery" +msgstr "" + +#: core/templates/core/index.html:82 +msgid "Track your parcel in real-time until it reaches its destination safely." +msgstr "" + +#: core/templates/core/index.html:92 +msgid "Ready to join the movement?" +msgstr "" + +#: core/templates/core/index.html:95 +msgid "I want to send a parcel" +msgstr "" + +#: core/templates/core/index.html:96 +msgid "Become a Shipper" +msgstr "" + +#: core/templates/core/index.html:99 +msgid "I have a car and want to earn" +msgstr "" + +#: core/templates/core/index.html:100 +msgid "Become a Driver" +msgstr "" + +#: core/templates/core/login.html:13 +msgid "Login to masarX" +msgstr "" + +#: core/templates/core/login.html:28 +msgid "Don't have an account?" +msgstr "" + +#: core/templates/core/login.html:28 +msgid "Register here" +msgstr "" + +#: core/templates/core/register.html:13 +msgid "Join masarX" +msgstr "" + +#: core/templates/core/register.html:28 +msgid "Create Account" +msgstr "" + +#: core/templates/core/register.html:31 +msgid "Already have an account?" +msgstr "" + +#: core/templates/core/register.html:31 +msgid "Login here" +msgstr "" + +#: core/views.py:17 +msgid "Parcel not found." +msgstr "" diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..f76f993 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,106 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +/* masarX Custom Styles */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@600;700&display=swap'); + +:root { + --primary-dark: #1A1A1D; + --accent-orange: #FF922B; + --soft-cloud: #F8F9FA; + --slate-blue: #4D96FF; + --glass-bg: rgba(255, 255, 255, 0.1); } + +body { + font-family: 'Inter', sans-serif; + background-color: var(--soft-cloud); + color: var(--primary-dark); +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Outfit', sans-serif; + font-weight: 700; +} + +.hero-section { + background: linear-gradient(135deg, var(--primary-dark) 0%, #2D2D30 100%); + padding: 100px 0; + color: white; + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 200px; + height: 200px; + background: var(--accent-orange); + filter: blur(80px); + opacity: 0.2; +} + +.glass-card { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 20px; + padding: 30px; +} + +.btn-masarx-primary { + background-color: var(--accent-orange); + color: white; + border: none; + padding: 12px 30px; + border-radius: 12px; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn-masarx-primary:hover { + background-color: #E87E1B; + transform: translateY(-2px); + color: white; +} + +.tracking-input { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; + border-radius: 12px 0 0 12px; + padding: 15px 20px; +} + +.tracking-input:focus { + background: rgba(255, 255, 255, 0.15); + border-color: var(--accent-orange); + box-shadow: none; + color: white; +} + +.feature-icon { + width: 60px; + height: 60px; + background: var(--accent-orange); + border-radius: 15px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 20px; + color: white; + font-size: 24px; +} + +.parcel-status-badge { + padding: 8px 16px; + border-radius: 50px; + font-size: 14px; + font-weight: 600; +} + +.status-pending { background: #FFE8CC; color: #D9480F; } +.status-picked_up { background: #E3FAFC; color: #0B7285; } +.status-in_transit { background: #E7F5FF; color: #1864AB; } +.status-delivered { background: #EBFBEE; color: #2B8A3E; } \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..f76f993 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,106 @@ +/* masarX Custom Styles */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@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-dark: #1A1A1D; + --accent-orange: #FF922B; + --soft-cloud: #F8F9FA; + --slate-blue: #4D96FF; + --glass-bg: rgba(255, 255, 255, 0.1); } + body { - 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; + background-color: var(--soft-cloud); + color: var(--primary-dark); } + +h1, h2, h3, h4, h5, h6 { + font-family: 'Outfit', sans-serif; + font-weight: 700; +} + +.hero-section { + background: linear-gradient(135deg, var(--primary-dark) 0%, #2D2D30 100%); + padding: 100px 0; + color: white; + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 200px; + height: 200px; + background: var(--accent-orange); + filter: blur(80px); + opacity: 0.2; +} + +.glass-card { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 20px; + padding: 30px; +} + +.btn-masarx-primary { + background-color: var(--accent-orange); + color: white; + border: none; + padding: 12px 30px; + border-radius: 12px; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn-masarx-primary:hover { + background-color: #E87E1B; + transform: translateY(-2px); + color: white; +} + +.tracking-input { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; + border-radius: 12px 0 0 12px; + padding: 15px 20px; +} + +.tracking-input:focus { + background: rgba(255, 255, 255, 0.15); + border-color: var(--accent-orange); + box-shadow: none; + color: white; +} + +.feature-icon { + width: 60px; + height: 60px; + background: var(--accent-orange); + border-radius: 15px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 20px; + color: white; + font-size: 24px; +} + +.parcel-status-badge { + padding: 8px 16px; + border-radius: 50px; + font-size: 14px; + font-weight: 600; +} + +.status-pending { background: #FFE8CC; color: #D9480F; } +.status-picked_up { background: #E3FAFC; color: #0B7285; } +.status-in_transit { background: #E7F5FF; color: #1864AB; } +.status-delivered { background: #EBFBEE; color: #2B8A3E; } \ No newline at end of file