From 77d103ab4041ba019d68b04d5b259e37306d23a2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Feb 2026 23:13:52 +0000 Subject: [PATCH] Autosave: 20260204-231352 --- core/__pycache__/forms.cpython-311.pyc | Bin 11204 -> 11821 bytes core/__pycache__/models.cpython-311.pyc | Bin 7290 -> 8993 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1807 -> 2013 bytes core/__pycache__/views.cpython-311.pyc | Bin 18712 -> 22154 bytes core/forms.py | 12 +- core/migrations/0004_userprofile.py | 24 + .../0004_userprofile.cpython-311.pyc | Bin 0 -> 1448 bytes core/models.py | 23 +- core/templates/base.html | 9 +- core/templates/core/accessory_list.html | 98 ++-- core/templates/core/index.html | 218 +++++--- core/templates/core/new_fit.html | 365 +++++++++---- core/templates/core/outfit_list.html | 479 +++++++++++++----- core/templates/core/wardrobe_list.html | 98 ++-- core/urls.py | 4 +- core/views.py | 91 +++- media/accessories/images_YIMWngy.jpg | Bin 0 -> 28437 bytes 17 files changed, 1022 insertions(+), 399 deletions(-) create mode 100644 core/migrations/0004_userprofile.py create mode 100644 core/migrations/__pycache__/0004_userprofile.cpython-311.pyc create mode 100644 media/accessories/images_YIMWngy.jpg diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index ef4e8dd25b2458f822b91c510dae69958631f5f3..d51bf4c3080868b93ae5842726435b50bc2737cd 100644 GIT binary patch delta 2520 zcmaJ?OKej|6n)Rnezp_aI3Wr7ki_HzaY7P66iT6#j}(3-q5N^7=EZN4ICA{LeGcJM zHHm^$HmHfF6;&6ls;ZQT7FF^BscTkon(3&_zy}5a5NJ{tw$3H8vDj->Tf|WnZS{pP2CzNRLDb9(ij;G6_KKrSPnLhsKj)aqc z%4T$otgd8=B_K67+_S{L4T89>FeRp%O3WpXP{k3hJ1#}JCw{pR(@agAGQig56*o0d)C#-aatW>14yP1z^k-&twzLCk0-5&MxqCkBqobP!0 zER&@iy(`I5rcIjQaU)Q{fAX~sIc{jDkl=a5&)z9uc>XgLuDI!$Dl8u>zo|b76pdM9 z>{ILRnaOQElN*zhCB46v^!{GbJFU4^=iT(;Lu0#ekAIHdTOetdsbT&|s}632gePTmvJ|ys|I?mnY90T}+gL!QVuhLjkfCin;ya?lLsZ8v`3`vr zSD=0TnXgJ+o6Ymzb(Oyj4n!Q?W`=F09Z#~)=w?*FALmyNZNV}uq4kgnCC#`!(3vnY ztlOfigglfMw@34rdk^8EH2`TAqUiWfvMZTG>HdL?qn}_RyE9YxR1go!*lhIIq*F5ev9`Nl~>+DOaD+!)Teu}ko-6`wK4B&(Ah%CJ6^ zRtwJEp8Y!9s20QG3H9Ve;bPbDCk2rnoKFV<9{_M2$G^YFpf;pDT>!HakN}`kr8@{` zI>C5c)>ML}Qt|kNO43AB=AN8o5y%4q{Bd-A1$w0mSJ=rE3Zo{9Rf?!D(5eG#%r^Qu8X~v_}TXb!)5MHj&{v|_lO zP_Bs_9Y|%8{VBFmAMq+QD)fB8|EYgC7wiY?JJfR*1=qHOOT@^3u%YX-d2K?s>i(%f{RKnkB8gb)l{{wMOC~yD( delta 2022 zcma)7T}&KR6rNf3f7qqaEq_~g+Du8Km7t z!C=ydYEpU=`=CY>jdo*fjQe0>Vl<{Nz8Di9m20d8Jxqq*atJsu393Z&x7q8C6-2qx!KOX3V!LHgy;MhkuwhVeRbb_4~CT-3KdjD7sNyrCcN|r|FE5= z_6o5plLpbUB&DV_zTGj9P-{8>N`RlL=BS#aglAWL!GfO-!9N8!&Sq+!eC#=Hn$S>m z=UEdW(pf&2KQO7$6wS?%VT)uEyv)5gx3Bm^OJpbPTZLJb|`799t?$O570D$b{m z1113YI=1h`f<_Z44?Tm)X~0E5Kj1uImV+HoRUw)rF$`5L$W(*~bq$pwQ$Phc`D^C6 z=g&21=WjC_?Tk;D5&Q8#MSX>RL0f=IX;?`r>1c(5d0a1Xc ze=DpGz~SP9y0wbt80Bk>Il!z620Q3N=AzrK~P<>--W_%MC;_G;_Yas91}-h0{>+|4vWf4w}eSRqWD+K`gVPm zSfsXrz0>-k+{6akB62gEX)C{Wt?WTv1AD*ir&VzmM)-1mL%ASLThWq9VwyRs6Eo%% zSED2+ktOsAK0Cxe=re$40YXlYPFcD5D8GMv*_ziap>kE#v%00K*SW*gIBgd9pa(;gdUe!=ZUjp;tNZ4kS93&`-Xhv?Xf^hRQ0A5(^3DYtT7+Ok$9v6;1VI zb6LWh%HG<0z<*Tj?cju1KDumJ`l3M|B?FH{U*-GUWR0D7w<}-#rE^?fMd@vSmaM3y z$YZi-IWb=;o3l6^87Q?EA1rab=U~0Y!SIdvL7@Ea!uQD%V z5^#-u+qGFKPQY+1R>?l*#bUvpJGbRM&VLG)4e~U-#@EaIHGh^^ WxF;MR`BC~`|9?2y&7NCM#PBz!V8-+S diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 5575bf415962a37ad8d9abf43844a1ada03e3f3f..a2ff4fc404101024e41d0227caff12c768770522 100644 GIT binary patch delta 3716 zcma)9U2Gf25xzSf$>Xmmk@}%%>(5Gri(M&7tVl_n)UtkR!;#chQe?BOFDKqfB7G#) zy^|a(cBwWF;72>_)&`0iHVU{Fth7PhrhQ4#hd%VJl)*y60Y(cHeJBbP3X+E+D2mSP zk+l8_^mP2VJ2SgG`_0U9^~J#b(eO`0AwLJt_x|`^dZzAXxar(F&vCaojnjC8%koK{ z$F^VySy$4<+Ac%Px|43!77b6tAWu66$df#V**$9c5CHSPg4A5{cgGW0)fgZpg5Y^e||6)rDTQ^Q0xAc|B( z5hkhyQC&q;%S2HS#VVpYCaMQfLq!y2qDBxkl|}tA%{|G<@xP1CbJ5&laz5BvBG{aIb2fJ|gOl`U)hy70gS9KgqUl3w7z zm60la&83N&xbEI#<XvQ?iEgNt zepFL(YF1y7)MeFDiP*snQdhcWWg4fz#&^g#O2n2BU3l#=&xM;!(K%(EuttZ(H&lQ zmxV!?*=zt<<+kb?Zpo#(&SK4rb#@2JZCkO zn!zR6bI(n$iX8B50B zfQgP&S*%5y-5mCSK8A*809Lub1?om`4BR=t5$Gxfx{#xnDr|NMcpV zMX7g743@;$rWk)B#y7-7NlX+gFNxFp-uUBp`CgtMpdSiN&l4=NDO*Y{q@il`+?q&2 zAR!TiT7)nF{g3cbgw#XJM3S87(|@>*@}0C%928*QqmCg%k(+-YkZu(?Vk7wX~u;T2$0R39fjj^HgD?ej8YbjC88Rn9o5xBwZ$3R8O(tx!$Kgh0sygW@M|b=W}tJvKgpyU z1hzYkXA{9g#}*e=YhlgJB4dkKbu4G-g1_Z3JEL&KO6^Q}=`*l$H)hZY`V)U17`@Uk zLeB;2jt}8vLR#A!Hzy#mUE|Bg?kRdVaO6C0SdQ*w5oZcdjtovtj4MN@C(aCwOtMp# zOn`>qLSzyFNwcNNktt<-`pq{XtI9zqt*E_7+k;(w=sk164k=2?P)#$X8-}6)S&N`z z33k#sjHl5Qp@&`#{?!S@G|S*ZD9VrYq53TZ1z?K24QL0{R7y9^JW1>2cm#JyddMu= zV?am>L8F`Dk6)k1<^n<%z;pvZb+)ZKZZN*XgXMWIGqS&d#@|732(O6*8%*r(%YND$ zY2eS%(~%=A+h3x0BP}gw(R6o4JE{16P<-Z~{C<4hjKT zM#Uurhj?tggK!yP1)&-SXWe&Eb_HMu|1rWCMi@bj0JZ-w`rF2S`bjWGH*0_GM5GTR zLO-m#-}(wp(vQGS74kYZu_i{zmjU4vX`t^#M^2oCjx0E($dYFtX<)Dtn^>~u($;9+ zfM3SSv5}%;tnb@M%(xufOUglfJS+OI!yv-q#wvdg`|qO`;R5|(?2@yy_gStTt55KK zd(!M#2ElJBbJIyS*i{%OszuPC6vtmUI4eNE5_UFN+1fJwyx|Co`S|}AZx&Hjcg%SV zy6u@`blEjyYVPt>9?`iFO{3QB98)Z;-$fTOAMBt8Wm>)hv}w+{xQCtVXpFExKW=>L zXNig3)Xmy@`irJJZh|*97GNWOvUXoQ=_m14{wjSMKXSo|UErYD*}h@$#PRnQuE;jW z)@EV+0m=>v-VIbBT&5SAzva{ocIA58r)AXKe7;+ob?%AH<$fxkvq*ZjTV1jix}7V$ zb7^d<4k(Me&GdXuHB91$8SR>iI&H!^omwDxiMNHkX}g!KG+0So5}6*u{|cO20bYm* z{-Qg-EEox=vRK&I_Sgn?bN+>N0^C|M^f$;|7y-4%ng6EUi9^Sa7P(#T7S~z8_b?j4=fBsAv<^=z0({=gIaFK7{;M+@l`?etPa6be1)Wr!M eRf%+vsf$0f%>g_!b@8r4+y2LTqLvpi2mTAc^+=8Y delta 2070 zcma)7OK)366u#s5{l4)dapFgspr&qdQkA5kfmB4!gP_E;O;Bl+#=Z8vahzQHhPif2 z!c%HlvS>#Y2sU&BcuOSM@*fZaMv6eNfn6mws8SK<%yrr{$$~7t%zS6&%*^+lbNyiE z(Tl;a0s*fCe;>DQSFeQb2D?YRM3O#{R7oYeR3poT;Mk_ymThW>YS%kz_GLSfY|^Zx zI_^lSQzILWyYF{}oPu%z<=&@Ug7N_6-KX4w@&V=Fr#ylR02SP)yn+e=6>d{;pK4o_ zvhrVe*(~ACnxSgC$=tTwZrwFbt^|SSuJXE3Eouw83t++J_$I(L+GrM}7iRMVA)rWWf;O=G{MT0^0yVBW>P^kuq5Pqac1g;SuYD>Ejy4d%@=tvBPJDyt#RjEpHhbUH4R$TOe%EtA7F;*46a9s>8l8HY(4tz#5@ic z5EcPU)U^-(KD4eO__)BU|L&)Tf^5~XuQJN8Z@K?>}CV)QyHP{{fZzy7#~kKtjWX-9B0iXb}okj6C( zAk4ABo?F%vYT^muh@F)J6YSp}K6J&PZi?F*8_Vi z86gV$C^;ZpE&M-6Z(wfGTH@AdD|fCLx~fqgT2SiSO9rCVSlBY~jetHkE#ua3H#*M! zDs*D8Of~q|ryeWI7A{6uWV5L~uP8m7mhZ|jmQR1`fv3iCO#+;}CLc9zHj^Ritdbd6 zwM_FJXBziR!4<6gzKhw!hS;56&!9(6;hSBxRGBpQO- z43j&WjjC>1pGwC9{^nU9Yw>LnRV@S+2aD9t7Re*`%kV?l)U}KBHXMS#Q05fi!wy2o V&r*_|Iw3RTMDMP@UnX{Z?|0 diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index b6c116d071bd66e6975dfd16812798df00ecc356..074aafd375a3d6f92bd78773df56940a15370876 100644 GIT binary patch delta 288 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 ImFf4t0BFsnssI20 delta 5474 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 UvpHyHm+v~O2qF}}2z>4T0?{Dx6aWAK diff --git a/core/forms.py b/core/forms.py index 6c13593..2cbb512 100644 --- a/core/forms.py +++ b/core/forms.py @@ -1,5 +1,13 @@ from django import forms -from .models import WardrobeItem, Accessory, Outfit, Category, OutfitFolder +from .models import WardrobeItem, Accessory, Outfit, Category, OutfitFolder, UserProfile + +class UserProfileForm(forms.ModelForm): + class Meta: + model = UserProfile + fields = ['avatar'] + widgets = { + 'avatar': forms.FileInput(attrs={'class': 'form-control bg-dark text-white border-secondary'}), + } class WardrobeItemForm(forms.ModelForm): main_category = forms.ModelChoiceField( @@ -163,4 +171,4 @@ class OutfitForm(forms.ModelForm): if commit: instance.save() self.save_m2m() - return instance \ No newline at end of file + return instance diff --git a/core/migrations/0004_userprofile.py b/core/migrations/0004_userprofile.py new file mode 100644 index 0000000..57acf88 --- /dev/null +++ b/core/migrations/0004_userprofile.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.7 on 2026-02-04 23:00 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_outfitfolder_is_preset'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('avatar', models.ImageField(blank=True, null=True, upload_to='avatars/')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/core/migrations/__pycache__/0004_userprofile.cpython-311.pyc b/core/migrations/__pycache__/0004_userprofile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6efa000e7962b051eca6510f2325e37313eb65d GIT binary patch literal 1448 zcmZux&2QX96d!-A*WQn0w+gJnN(H2fc1w~CqCzoibd9PW9D)Lm>&^AL~@WR!7MxSKrt0b$P`B%#?7d|LeJ@ zoJ<|b5EYEH^(3=OrUB6kH`X%r07|vvG0N+Ui;Ev)ZxnRxpzAq=GHm;J$S8o$i`zbB z8_et44&|~sO&4$8rZO3wVx$2G_ha01z<5>g;9#==;h3ALq(O_tJE{0^&0K78l zh+|W)a^Q)(q$hN3>Ja}?;~Lj-qQ;mPForrAITZL3#!p9%aNZ?1lY*Vb27AM(<~!lphiE+^Mt6Gh0xTi~U;cCQ7%+!JB& z!h?a;qbXlrcj=Y~BwcExZ@E2>%cRZqooek@AFFuLtbHCm>B`^D7ednyc6V-RZig{kGg|qW7-i~JH zPqp8SXz6~m^f+4D37kS`JnBH%$%eJsa$b!IBg<&DAx0&*ot ztQgm{!!Jc=bJ-OeI-gBZULfs-^iQ#nLCrn@GhQ6)JD%H3Gj2?FB*l?rHAU@1;Wu$U z58NyL)3l~OV;{j%{5<>sNUTVb1V~Enhv>cZJI|QcB)3BJhA-ACk`|-?ljnt~a^pfM KuHK+cqWT-l$%$kD literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 621a191..b7d19bd 100644 --- a/core/models.py +++ b/core/models.py @@ -1,7 +1,28 @@ from django.db import models +from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver import os from .utils import process_clothing_image +class UserProfile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') + avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) + + def __str__(self): + return f"{self.user.username}'s Profile" + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + if created: + UserProfile.objects.get_or_create(user=instance) + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + if not hasattr(instance, 'profile'): + UserProfile.objects.create(user=instance) + instance.profile.save() + class Category(models.Model): TYPE_CHOICES = [ ('wardrobe', 'Wardrobe'), @@ -102,4 +123,4 @@ class CalendarAssignment(models.Model): outfit = models.ForeignKey(Outfit, on_delete=models.CASCADE, related_name='assignments') def __str__(self): - return f"{self.date}: {self.outfit}" + return f"{self.date}: {self.outfit}" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index f154411..14f47b6 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -14,6 +14,7 @@ --bg-dark: #121212; --surface-dark: #1E1E1E; --primary-accent: #BB86FC; + --accent-lavender: #BB86FC; --secondary-accent: #03DAC6; --text-main: #E0E0E0; --text-dim: #9E9E9E; @@ -112,14 +113,14 @@ Outfits - - - Accs - Wardrobe + + + Accs + diff --git a/core/templates/core/accessory_list.html b/core/templates/core/accessory_list.html index 22554ee..8d8ae93 100644 --- a/core/templates/core/accessory_list.html +++ b/core/templates/core/accessory_list.html @@ -2,38 +2,59 @@ {% load static %} {% block content %} -
-
-

Accessories

- - Add Accessory +
+ + + +
+ + + +
+ -