From 6f1ed9a2fa949e729624bdddefea6f4f802477cd Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Feb 2026 03:45:28 +0000 Subject: [PATCH] Finish 1.0 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5685 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1663 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes config/settings.py | 2 + config/urls.py | 1 + core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1686 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1446 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 4789 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1729 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 9295 bytes core/admin.py | 18 +- core/forms.py | 14 + core/migrations/0001_initial.py | 53 ++++ core/migrations/0002_folder_outfit_folder.py | 27 ++ ...older_user_item_tags_item_user_and_more.py | 50 ++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2750 bytes .../0002_folder_outfit_folder.cpython-311.pyc | Bin 0 -> 1466 bytes ...em_tags_item_user_and_more.cpython-311.pyc | Bin 0 -> 2395 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 57 +++- core/templates/base.html | 268 +++++++++++++++-- core/templates/core/index.html | 281 +++++++++--------- core/templates/core/new_fit.html | 263 ++++++++++++++++ core/templates/core/outfits.html | 158 ++++++++++ core/templates/core/wardrobe.html | 164 ++++++++++ core/templates/registration/login.html | 29 ++ core/templates/registration/signup.html | 41 +++ core/urls.py | 24 +- core/views.py | 172 ++++++++++- 33 files changed, 1442 insertions(+), 180 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_folder_outfit_folder.py create mode 100644 core/migrations/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc create mode 100644 core/templates/core/new_fit.html create mode 100644 core/templates/core/outfits.html create mode 100644 core/templates/core/wardrobe.html create mode 100644 core/templates/registration/login.html create mode 100644 core/templates/registration/signup.html diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..abb44a2bb917f4119e05879d599dcf1757e3ead0 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}wcGZJNkE1pq6H1i=6R delta 19 ZcmbQwIG>SwIWI340}xbw%b&y;X;IIWI340}wcGYsze&$ScXj$GTDDGK;-Slzu96mH|i#1Qr-VXjC$lGsSfo z69dC)AclY_qZH;~22Hn3tW&v!s@U~&Q&Tb%^>49)X-(tJ)A{+C+;4IEy1IBe#)k&^ z++rz6EXlaVl9ivCcZ&-m9OUmGQp5u^uSgI?@B@io95%W6DWy57c177hE+Y^Zf7^UY m@HVsZ4Ia@3&Ktb^J>mT^T`@B>7Pw#J)w#l})4&CSU?Tu=HaVvN delta 101 zcmdn0vq778IWI340}xbw%g=O~$ScWog=M40WfoTEU%~q^axtKKdH$UX(XHqHR s0jet!1QGl|;unWaZhlH>PO4o|8j#Bf#KreEn+x4$=Dxrn1Vmt^042s4#{d8T diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..fd771aa6c637a0ac6dbacf04981221ad91e229e1 100644 GIT binary patch delta 165 zcmbQr^Ph)zIWI340}%LcYs##d$ScWcH&J~7qu<06DPpNSObn@>fW1iJtL 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..cd3e6947c65758468108aa3817c096638d9ac9af 100644 GIT binary patch literal 1686 zcmb7E%TC)s6rHgh<2(#BG`v(OssJgpC7W(4Rh6o?s;bgdDm!;!nalvDcAQQewb?}# zACMjW0xHD5-$A4-(5#TUViyD}R=w9I5hSTf$MMNLuFsrv=h{C_Gew|%{Po>kRS5Zw zgKpEWI_H8CvPT$U)FVE%C?!l`s;Bs>rTUts`3WoG>y}Q5LO9(S=@M{tAD%pfJ8lYj zLzuQpSOTJq?(Dt_F>uFiAN~%z17aon7_}jcIxvphnlaVKm>9xn0AupjjOji`eF$R; z7}K|A%&^Ql$(yH`hdh-Dhxu;#6!VzZr18=T`Bot6QhOV6U+N!f;iel(^OfUz_4U#= zXEl$PdO3tn_XN(fFxVrUSd!q-52u2!59 zFO&ko3z4gfyh{0s>^1ZfDq1qI55OufgbNM2lU(P>4giGX1QbCfef*XSi^IfGm@}c%#drx9C)xPN9|+)Y1>lrFQlK sYFR-oE66h4i|=VMTXeon=aFR@S^D8eu04}SmStpFMwa`7@zFc+2jN0r00000 literal 212 zcmZ3^%ge<81k-=yXW9el#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Pt(n;80F)6nZ2$lO diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4873bc56e3763e4ed09960c6e3f34140e1..cb1b371b1d70f25b20d940e38fcbe1f67caef30e 100644 GIT binary patch delta 20 acmeBS>0#ks&dbZi00hokn>KPYG64WBLIf}X 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..8da9bfe4ae83e0d6d6924b489c898a5b5d2317b3 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}wcGZQ98Ffe8RVz6JjP delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd29a8573c7576a0e9ccbbd6b2a36bbbf8c35919 GIT binary patch literal 1446 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 Vi)9%m_X;p zj%1v23OZ%zkRd=dbV!#pMLl@zRP;|c1_WYo?UczeOplq1iOd`_#W8a!k(o!PG-f_ZWEM#JFy1HO=}b(Y zf2xbehf)2<&#$& zT1kaqDNZlUYDPzQRk9+6>H8WvvS0C}Lm`Bo+2<-4N}qT+gB-0MXpS6aF=}JvDM*G zXi-QFVpiEhzWF#en zJaF2U(j{RADOAs4w$?RVOAa$p@b$_iobRDxbj`X;b(``srocC5b|iO9!=c)KU2&Zr zP4kgS9=3;jNckTD<&{o(nNnVdlouN1l|*@|P+kj^A9l)5Gvx<4l)mB=muTJm-%_Kf5q>!2~iYJg&Iq`PK5@0_c|43*}K^Cp8eAJzg`i`dJ9xnSYy zNtMB-51RpOMsgy|q@|~|V7c+C4Lci^@9t@_SZU_bW-rBqBk%<~Uj!mauj DW{1mn delta 278 zcmX@edz-0#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;llQR%#P9({ zKt>dM0f`UHjEsyo7-TM>q6ZA(7f{g$HU?JC2A2+@j*uB_7g*#kvdCXyk^jKV#Lv{g K4T42HK;r;xDL;(> diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..c18fba3f8a18a5fe8c06a10e18031d1d627a9b64 100644 GIT binary patch literal 9295 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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}_omj6qaOJwj4XyiNVPEacEP(z}V@~38n3nf&7sIAth-DK2%k_8%IHwj3ft= z=^@kUp+|1y*i$;4`jF|N&5>gcJt#9eWcI{NPq~R9Cob(<$xa|)+EP~5)BZfY_r34! zKKZ9aBE~@L{OvpS*C@mMNe8VKZgyS_L+1&D7{qE!iG?Span(>MROL%N%W%vXgF@dk zh{vJD);r94h+%$#J7}daVyBpVc$W?*@*Ig()rzUus-as%s2T`sR=KI`Ka$PCi|b(H z34?vVB@VHrP=zV+9D~D)LhA*@p%BbO79oP5Ar>wkg&V>;4>;fs+B}CMzNXlkLD7b| z&VmlyEu9L7VyI1J8}ZkpIOH|)4qn@jdPT>4WPUy<5xQa zjm#0T-kPb(Svc69IKnJlnvDn@kFGluz$M$=z{4l7i(S4ZXiqPm;=YUhV zg9aX6%~$U`Fvp_yM(%a%z{!7!v(Jw+)xv~Mq4yf^AGTEC{{?&hTVVgd_t>%Tk!_ql z!v2|eV*l(L*bg0!pu(3rQ6A3UIU?R_ox5og9a3yuG0bJcsc4jN`lIvV0#e6Vbw^s%Yv8Ch;X~&KVY#b)||4PvtIxF!L;&Y~_)xVZCB6kj_`t zYC%ch$8B8Q{fn-J0YC+>2rA52#e9f_=QKsX z4^HcvM#OqeGZZA-1`(--Y%kX^)R*W(#YCnthe`Bqvj?-HQZ8f5q9Kb{TV1mo-0Y?) z`Vfhf7Yr42NCe?|rLNf~-RUIOBt%wh2r=MDHy+9gLL^#l(zuc+8zwHahI!sR3GbQ` zH6R+g3`Gvxm~gg{=lrt(Y(As!ftu}|TQJ_t&=r>@G320H#D+b}v9Etjb!6$-5r$(mbiLY+nB*$(k z`tr0vWzz+<)pTLhaPyn;GxGw_FfXqZ7mO+{*5~TFT`%HCxD43L;zPr{Z`G7CE>c2@ z2j8ONz`($Vax>yWZP}#X7+=sLX#EZaZFT>8*50u?=J9M=SiR{*88P=m%#HT$q`ID^ zjysuikC)ucxlMkn-zmwCZaNujJ7c*S%SqZhsf;7#*G{-neq+j!E^kYhUFouu{KN}~ z((PW1NuB=jTQ9^NZ}$?S7<Xd+lTP;h+G#g?exrYLdTZ9n&TMCA z-0X~#yt|X?c6tkI^KNg!`FPT~qdAwV9>Y9huW|6W&3#E9xjWo*U+(!5W>Qn!PO8Vr zU0hpoa~Geco!sblZq&_|BM#OW!l&A2^`~!$902NjD?n*S8r+r!U1`usUfM}XPS=ICLAUF| z#z&iIYyJ<_o%q_FsJIg~U}K3LqNH>WQ<^{mO&}>vBb*oEDXIuX1!9j1@5-4DVf71o znM19eoEL}`oU#I%D+K?&3az7NehO+t++X+4xqq~Sqi~H{@l6dw?`8C}plW<>j=_-r vg|g;Acp;W$J%M3QIZR*h+hNW+Z~A#cffYRFsCXQ6ll{->!rmKJeGGpCw{_M; literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc b/core/migrations/__pycache__/0002_folder_outfit_folder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88ac72053a7a7c566d82f5126266a6a2378c5eb0 GIT binary patch literal 1466 zcmZuxy>Ht_6hD555-G`%Y$bxwHfj)~C_P9{lf^+$AdRJd9~3PeK*N_UniQ>1#N zoH$F3qC-b-&0nClu!f8oGj!-k0~~~#3Utaw!=5tr9Vsekn>*gS_ujpG@7?d-@z-Ke zL(nR(ezcxQ2>s24v}NYZ#U?PnAdIkJqmBTxXp2LsBMs$_EFcj*L|FO>VVOvSbPt+< zw^JBN>twL7gY?WBE^g~0(}q@`n!e>a9#e)cCbrj`+s0F2E?is}cx)2K?TA?D3mr*B zM1B_uiQtLRgi{y`n|y4erW!0y3;(t0 zOVi>+gnclQ7UvXW$z{BRuf$&R^JPE>@F@(6sXR~?+|q)(l5)6&%hTlvpn1ALbh`3y zO#5P|ge!pRRi-{l(FADao=XWUtgo-%GAzgPEz@R7+qE&FOtkQBn~7g;>M|>sW8XD; zl$bujEI*>w(4zDX0dxC!a(T0@eEx%(I= zoYsZ|S$*egfKe2&mWcEmt$hK5f_nR`-VW>Sp!6`x%9W)klU22I z1mu#FsD#uHdCU)H)jEWoE#Ex(BwW7v+v>~R*Wdo}By2qnTi=DPesK6hgiuTTMucf) zM?8<|WlX^__X*^ZlW1jWSvmfSce-2(1y?p{(&pVK=a@*jxT1rkYuAON7kjR1X|d^7ZE@V+lnDuNQB|C19fEUljN Lh0FJ>#yR{0$aju_ literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc b/core/migrations/__pycache__/0003_dailyschedule_user_folder_user_item_tags_item_user_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e31bf491894d8a5c0a27d986a522adb18e73575 GIT binary patch literal 2395 zcmcIl&2Jk;6rWwM*Sj01No+$^(a_LDZ4Ig&wH!d=%S{|mNK-@-B%G#`jc4MIu6N!2 zpb0`KLL4~u#(!Xfk^_GM;=mu^NIqC|<wsfwRoR6`V5F45kW+^s)S_p zF(S(Mh{S2U4)Vg*iXpTIU)V|sA}yh;`jk%>vl7!h>iadj;$>xKG-?&s^lOgoF}2|k zYI)`UIWdg%Cr4eG+eC#uC7DPvqOrOXZ3XRWM7Jc+4qw(?W-;D+g{{5w4XSM{%^XqbL!S#MEa7t4KgHfM?U4a zlVo`R!byw&1A%c)1S97_FnUhiV=t|HbP#o!q=fgzB2Ej4y=ZcJ+*8pq6Q;F%q?tDyW&?_oC|?+4>7SsID&8jVzRP31ZUkVT#oFfxtx)}u00AU_MHm#tJGc0 zW|)SBy%;kCW3V6m0CW=LM}cW^3>drodSDsvvDs{z8?a7jliGyZx@7|j&F0kZaM~!++D-bfr{owNIX2u*urB<;&rQ1v;b{&@Mm-cI?*#PUv(NZA8Z7+ zALQv4EeF2i<{vxmL$7I;X`ZJ_{`n=EhorfUPoxLt*%9TDpt=7sj}{h`;F&f7H@Y;} z+;;gzE;@c^dT&9#?hKxuiu7DpyZ(dG(XQ`mof{t=XoZee=*43hb!VZMMEYgE_FDJi zweHx(Zff$$wN7escj}kr-@f?$%T95nQ+&`VZuSuRN-D@O%*l)LF&`fASsKfSq6Zex zy@aA0hX}f3-t~;<;;)<~z8!oE!e-?KE_znJFGQ~i(QBNQUOP+lxDb7nTYhyn(|-3} z`#x@`)(=waoz(gnCWYtz1#vt0228pm&vX5EpV{5QJg}w z2dSw}YU&h-BH$3wiSGE#_T?Oeo5uyZW8U>XoJ^@Z^ZapdN7<9r*rl*ea%3YH{@im> zvA9{-#)kUqWyjtOYf>Ma5alaMFHFc=T&@uQHc-#B_rj|GzU9aR2}S literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8090679ee4c9ffd863c8f7abb0bb73a5db..21a48b2da96ce2ef813e60c78a1b0b869f9a1a57 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}wcGZJNkE7XU2S1l#}s delta 19 ZcmZ3%xPp;;IWI340}xbw%b& - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}New Style{% endblock %} + + + + + + + + + + + + {% block extra_css %}{% endblock %} - - {% block content %}{% endblock %} - + + + + + {% block extra_js %}{% endblock %} + diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..16a974c 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,146 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Weekly Planner - New Style{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ +
+ {% for day in weekly_days|slice:":3" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %}
-

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) -
-{% endblock %} \ No newline at end of file + + +
+ {% for day in weekly_days|slice:"3:5" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %} +
+ + +
+ {% for day in weekly_days|slice:"5:7" %} +
+
+ {% if day.schedule.outfit %} + +
{{ day.schedule.outfit.name }}
+ {% else %} + NO FIT + {% endif %} +
+ +
+ {% endfor %} +
+ + +
+ +
+
+ + {{ total_items }} ITEMS LOADED +
+
+ + + + +
+
+ + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/templates/core/new_fit.html b/core/templates/core/new_fit.html new file mode 100644 index 0000000..d1eb15e --- /dev/null +++ b/core/templates/core/new_fit.html @@ -0,0 +1,263 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}New Fit - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+
+
Outfit Preview
+ +
+ +
+
ALL
+ {% for cat in categories %} +
{{ cat.name|upper }}
+ {% endfor %} +
+ +
+ {% for item in items %} +
+ {{ item.name }} +
+
+ {% empty %} +
+

No items in your wardrobe yet.

+ Add Items +
+ {% endfor %} +
+
+ +
+ + +
+ + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/outfits.html b/core/templates/core/outfits.html new file mode 100644 index 0000000..36b7cfa --- /dev/null +++ b/core/templates/core/outfits.html @@ -0,0 +1,158 @@ +{% extends "base.html" %} + +{% block title %}My Outfits - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+

COLLECTIONS

+ +
+ +
+ {% for folder in folders %} +
+ + {{ folder.name }} + {{ folder.outfits.count }} OUTFITS +
+ {% empty %} +
No folders created yet.
+ {% endfor %} +
+ +
+ +

UNCATEGORIZED FITS

+ +
+ {% for outfit in outfits %} +
+
+ {% if outfit.items.exists %} + {{ outfit.name }} + {% else %} + + {% endif %} +
+
+

{{ outfit.name|default:"UNTITLED" }}

+
+ {{ outfit.items.count }} ITEMS +
+
+
+ {% empty %} +
+

No outfits found.

+ CREATE NEW FIT +
+ {% endfor %} +
+ + + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/wardrobe.html b/core/templates/core/wardrobe.html new file mode 100644 index 0000000..e1d42e7 --- /dev/null +++ b/core/templates/core/wardrobe.html @@ -0,0 +1,164 @@ +{% extends "base.html" %} + +{% block title %}{{ title }} - New Style{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+

{{ title|upper }}

+ +
+ +
+ {% for item in items %} +
+
+ {% if item.image %} + {{ item.name }} + {% else %} +
+ +
+ {% endif %} +
+
+
+ {% csrf_token %} + +
+
+
+

{{ item.name }}

+
+ {{ item.category.name|default:"General" }} + {% if item.tags %} +
+ {% for tag in item.tags.split|slice:":2" %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+
+ {% empty %} +
+ +

Your {{ title|lower }} is empty.

+ +
+ {% endfor %} +
+ + + +{% endblock %} \ No newline at end of file diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html new file mode 100644 index 0000000..3cff058 --- /dev/null +++ b/core/templates/registration/login.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} + +{% block title %}Login - New Style{% endblock %} + +{% block content %} +
+

LOGIN

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

Don't have an account?

+ SIGN UP +
+
+
+
+{% endblock %} diff --git a/core/templates/registration/signup.html b/core/templates/registration/signup.html new file mode 100644 index 0000000..5d68847 --- /dev/null +++ b/core/templates/registration/signup.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block title %}Sign Up - New Style{% endblock %} + +{% block content %} +
+

SIGN UP

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

Already have an account?

+ LOG IN +
+
+
+
+ + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..7c2f6c9 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,21 @@ -from django.urls import path - -from .views import home +from django.urls import path, include +from django.contrib.auth import views as auth_views +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.home, name='home'), + path('new-fit/', views.new_fit, name='new_fit'), + path('outfits/', views.outfits, name='outfits'), + path('wardrobe/', views.wardrobe, name='wardrobe'), + path('accessories/', views.accessories, name='accessories'), + path('add-item/', views.add_item, name='add_item'), + path('delete-item//', views.delete_item, name='delete_item'), + path('save-outfit/', views.save_outfit, name='save_outfit'), + path('schedule-outfit/', views.schedule_outfit, name='schedule_outfit'), + path('create-folder/', views.create_folder, name='create_folder'), + + # Auth + path('accounts/login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'), + path('accounts/logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'), + path('accounts/signup/', views.signup, name='signup'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..84ccefd 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,167 @@ import os -import platform +from datetime import date, timedelta +from django.shortcuts import render, get_object_or_404, redirect +from django.contrib.auth.decorators import login_required +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth import login +from django.db.models import Q +from .models import Item, Outfit, DailySchedule, Category, Folder +from .forms import ItemForm -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def signup(request): + if request.method == 'POST': + form = UserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect('home') + else: + form = UserCreationForm() + return render(request, 'registration/signup.html', {'form': form}) +def get_weekly_schedule(user): + today = date.today() + start_of_week = today - timedelta(days=today.weekday()) + days = [] + for i in range(7): + day_date = start_of_week + timedelta(days=i) + schedule, _ = DailySchedule.objects.get_or_create(user=user, date=day_date) + days.append({ + 'date': day_date, + 'day_name': day_date.strftime('%A'), + 'schedule': schedule + }) + return days +@login_required 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 with the weekly planner grid.""" + weekly_days = get_weekly_schedule(request.user) + total_items = Item.objects.filter(user=request.user).count() + + month = date.today().month + if month in [12, 1, 2]: + season = "Winter" + elif month in [3, 4, 5]: + season = "Spring" + elif month in [6, 7, 8]: + season = "Summer" + else: + season = "Autumn" context = { + "weekly_days": weekly_days, + "total_items": total_items, + "current_season": season, "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) + +@login_required +def new_fit(request): + """View to create a new outfit on a model.""" + items = Item.objects.filter(user=request.user) + categories = Category.objects.all() + context = { + "title": "New Fit", + "items": items, + "categories": categories, + "total_items": items.count(), + } + return render(request, "core/new_fit.html", context) + +@login_required +def outfits(request): + """View all saved outfits and folders.""" + outfits = Outfit.objects.filter(user=request.user, folder__isnull=True) + folders = Folder.objects.filter(user=request.user) + context = { + "outfits": outfits, + "folders": folders, + "title": "Outfits", + "total_items": Item.objects.filter(user=request.user).count(), + } + return render(request, "core/outfits.html", context) + +@login_required +def wardrobe(request): + """Render the wardrobe items.""" + items = Item.objects.filter(user=request.user, item_type='wardrobe') + categories = Category.objects.all() + form = ItemForm(initial={'item_type': 'wardrobe'}) + context = { + "items": items, + "categories": categories, + "title": "Wardrobe", + "total_items": Item.objects.filter(user=request.user).count(), + "form": form, + } + return render(request, "core/wardrobe.html", context) + +@login_required +def accessories(request): + """Render the accessories items.""" + items = Item.objects.filter(user=request.user, item_type='accessory') + categories = Category.objects.all() + form = ItemForm(initial={'item_type': 'accessory'}) + context = { + "items": items, + "categories": categories, + "title": "Accessories", + "total_items": Item.objects.filter(user=request.user).count(), + "form": form, + } + return render(request, "core/wardrobe.html", context) + +@login_required +def add_item(request): + """Handle item creation.""" + if request.method == 'POST': + form = ItemForm(request.POST, request.FILES) + if form.is_valid(): + item = form.save(commit=False) + item.user = request.user + item.save() + if item.item_type == 'accessory': + return redirect('accessories') + return redirect('wardrobe') + return redirect('wardrobe') + +@login_required +def delete_item(request, pk): + item = get_object_or_404(Item, pk=pk, user=request.user) + item.delete() + return redirect(request.META.get('HTTP_REFERER', 'wardrobe')) + +@login_required +def save_outfit(request): + if request.method == 'POST': + name = request.POST.get('name', 'Untitled Outfit') + item_ids = request.POST.getlist('items') + outfit = Outfit.objects.create(user=request.user, name=name) + if item_ids: + outfit.items.add(*item_ids) + return redirect('outfits') + return redirect('new_fit') + +@login_required +def schedule_outfit(request): + if request.method == 'POST': + day_date = request.POST.get('date') + outfit_id = request.POST.get('outfit_id') + schedule = get_object_or_404(DailySchedule, user=request.user, date=day_date) + if outfit_id: + outfit = get_object_or_404(Outfit, pk=outfit_id, user=request.user) + schedule.outfit = outfit + else: + schedule.outfit = None + schedule.save() + return redirect('home') + +@login_required +def create_folder(request): + if request.method == 'POST': + name = request.POST.get('name') + if name: + Folder.objects.create(user=request.user, name=name) + return redirect('outfits') \ No newline at end of file
+
+
+ {% if user.is_authenticated %} + + + {{ user.username }} + + {% endif %} +
+
+
+ {% if user.is_authenticated %} +
+ {% csrf_token %} + +
+ {% else %} + + + + {% endif %} +
+
+ {% if user.is_authenticated %} + + {% endif %} + + {% block content %}{% endblock %} +