From a74f3bd5cfdbb278db03d313fcc0ae6afb276549 Mon Sep 17 00:00:00 2001 From: bmzsombi <bmzsombi@sch.bme.hu> Date: Sun, 6 Apr 2025 21:12:54 +0200 Subject: [PATCH] rollback? --- imageuploader/pictures/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 153 bytes .../__pycache__/admin.cpython-313.pyc | Bin 0 -> 326 bytes .../pictures/__pycache__/apps.cpython-313.pyc | Bin 0 -> 515 bytes .../__pycache__/forms.cpython-313.pyc | Bin 0 -> 781 bytes .../__pycache__/models.cpython-313.pyc | Bin 0 -> 1208 bytes .../pictures/__pycache__/urls.cpython-313.pyc | Bin 0 -> 569 bytes .../__pycache__/views.cpython-313.pyc | Bin 0 -> 1817 bytes imageuploader/pictures/admin.py | 4 +++ imageuploader/pictures/apps.py | 6 ++++ imageuploader/pictures/forms.py | 7 +++++ .../pictures/migrations/0001_initial.py | 24 +++++++++++++++ .../pictures/migrations/0002_post_banner.py | 18 +++++++++++ .../pictures/migrations/0003_post_author.py | 21 +++++++++++++ .../migrations/0004_alter_post_author.py | 21 +++++++++++++ imageuploader/pictures/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-313.pyc | Bin 0 -> 1125 bytes .../0002_post_banner.cpython-313.pyc | Bin 0 -> 801 bytes .../0003_post_author.cpython-313.pyc | Bin 0 -> 1150 bytes .../0004_alter_post_author.cpython-313.pyc | Bin 0 -> 1180 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 164 bytes imageuploader/pictures/models.py | 13 ++++++++ .../pictures/templates/posts/picture_new.html | 16 ++++++++++ .../templates/posts/picture_page.html | 21 +++++++++++++ .../templates/posts/pictures_list.html | 23 ++++++++++++++ imageuploader/pictures/tests.py | 3 ++ imageuploader/pictures/urls.py | 11 +++++++ imageuploader/pictures/views.py | 28 ++++++++++++++++++ 28 files changed, 216 insertions(+) create mode 100644 imageuploader/pictures/__init__.py create mode 100644 imageuploader/pictures/__pycache__/__init__.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/admin.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/apps.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/forms.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/models.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/urls.cpython-313.pyc create mode 100644 imageuploader/pictures/__pycache__/views.cpython-313.pyc create mode 100644 imageuploader/pictures/admin.py create mode 100644 imageuploader/pictures/apps.py create mode 100644 imageuploader/pictures/forms.py create mode 100644 imageuploader/pictures/migrations/0001_initial.py create mode 100644 imageuploader/pictures/migrations/0002_post_banner.py create mode 100644 imageuploader/pictures/migrations/0003_post_author.py create mode 100644 imageuploader/pictures/migrations/0004_alter_post_author.py create mode 100644 imageuploader/pictures/migrations/__init__.py create mode 100644 imageuploader/pictures/migrations/__pycache__/0001_initial.cpython-313.pyc create mode 100644 imageuploader/pictures/migrations/__pycache__/0002_post_banner.cpython-313.pyc create mode 100644 imageuploader/pictures/migrations/__pycache__/0003_post_author.cpython-313.pyc create mode 100644 imageuploader/pictures/migrations/__pycache__/0004_alter_post_author.cpython-313.pyc create mode 100644 imageuploader/pictures/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 imageuploader/pictures/models.py create mode 100644 imageuploader/pictures/templates/posts/picture_new.html create mode 100644 imageuploader/pictures/templates/posts/picture_page.html create mode 100644 imageuploader/pictures/templates/posts/pictures_list.html create mode 100644 imageuploader/pictures/tests.py create mode 100644 imageuploader/pictures/urls.py create mode 100644 imageuploader/pictures/views.py diff --git a/imageuploader/pictures/__init__.py b/imageuploader/pictures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/imageuploader/pictures/__pycache__/__init__.cpython-313.pyc b/imageuploader/pictures/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bbe52a22f064f48c1b82cc0ada72dc3d8bb83f3 GIT binary patch literal 153 zcmey&%ge>Uz`*e5*ZXu3{TM{RFe8-lnT3IYVJbs9gC?WjN`@jP1_p-DAgNmx`WgAT zsrpG(#re5O`9=E0RjEmtIf+Ro`kA?j>8Yg!Ir)hxsYUt)`Nbv0`tk9Zd6^~g@p=W7 iw>WHa^HWN5QtgUZ85kHq78QdSADI~$8H<=17#IKyk|v`7 literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/admin.cpython-313.pyc b/imageuploader/pictures/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4917768c6fb9e9c5917537201cbce6fb0337ebbc GIT binary patch literal 326 zcmey&%ge>Uz`#%?{4qU*fq~&Mhy%mSP{!vV1_p+y48aV+jNS}hj75wJ48csn%-&31 z%tg!!3^9yB98i@=R1h~32g;0LHf4k`6&TW4G+AGQIGT*NSQArnGxJ`8<TM#?u>|B7 zm-uP2-Qr8hO3X{o*GtaND=ErMDgwFZ7F%w9N@`AV5i0`&!!4HL%#zew97U<=nZ+fk zMJpLTgG{_-s-Kaco2s8wRh*xjlwYJ@T$P%XnUk1gqMw<Yn4Vf%kdvR7l3Ju+kY8L< ztPi$aub}c4hfQvNN@-52T@fz>0|Ur4#j*?x3?G;o85!>~DBNX`c)-Bg&eh0uok92_ PgYX2Gs|=DwAa4Qy%~ndy literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/apps.cpython-313.pyc b/imageuploader/pictures/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf2f236a9f67da466e76327eca0189bf5928d727 GIT binary patch literal 515 zcmey&%ge>Uz`*e5*ZcH71_p-5APx+(LK&ac7#J9)G6XXOGkP<4F%~f@Fi0>cF$6P7 zF$6QmFq$$$)D<zMvuLuu1aUMOZ*e*n6gcPSrDdikgG6AM5z6>112!{;p@=b<p@=D% zv4}aCsfZ<*xrjBGrHCz^Rg>)&cR+q|NioEbmn;kn3{|ozS&4b+`Fbfydb#;2sX4`Z zPMPVBr6u`pnW;G`w^$268dfs+X|mtqh>y=p%uS7tzr__FpPQdjnge3<#K#wwCgwn8 z_~YZ#GK-2!ax(K$^YY{4ZwaNOrX`l<l*A{NmgL8$femE=DZV8dA75OOSdy6>pIA~- zl$lgol3E-eU&O({!0;L5rCTQY8Tq-X`bkyA`MF8?Mf$~6sY#hRiAg5<nYoGSsig%u z`H3m1MfzYT>L(Ty6zdgK7J-5oOn|&s%*(*Q(8h2>(&7S(*bQ!>W|txX1_lPOyq_lX zEpDjqL7Iy|few}dy8)t5kb!~W7KaVQw{}Is3=9mQ@Gcf%U|{&b%*e=imqGCh8xy1O N1kJAuOpL-{T>vKsh;#q| literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/forms.cpython-313.pyc b/imageuploader/pictures/__pycache__/forms.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43537214a77a2d0b4d53cbb7ebc03278f7ad8ee7 GIT binary patch literal 781 zcmey&%ge>Uz`(G{^<(;G1_p-5APx+(LK&ak7#J9)G6XXOGkP<4F%~f@Fa$FNGkY_6 zF&8l_Fi0>cF$A+nF$A;5Fa~iz^&nBE%n(iyYdV`I`%4f<lkpa7T7FS(@k>Sq1_n*W zTWq=cDXBTd$skD>W`Qz3Yk;kfVJKn@W+-9`W-MX`TgfEF5X@}K1W{GQ63kM>n$D`p zc8kloC^fMpH6XvZ<R!=q6hooP89tj}7#hP81P%*`fiSX&O`jo{DUh*<J(#(OBb`N) z^%g(E0zKc<lEjywfYM~S#afbCl9PIiB`H6p@)k>RPHFlrwxq<oywswV41SuNw>aYC z^AdAY<Ku5}#mDF7r<CS^*gWy^g{6r(P#OOC__WNT;*y-qywtq>`1m4_*|%6gp1H*e z4y0RbX_=`xDaE%$<Kv4<5=%0Z;}c6tiZYW*OHzyD<BJ3s7#Kc-Tz|_{KO;XkRX?e! zI6pTjzevBhDm5uHCo#!HKQlKmJ+-tTCqFSIwMf4pzqq7W9~>Wg1(mm0Kz=F$1qI0N zVvu=l3^xSCrgKl^?qIzoXxPnGB+0<QP$Uf^K+=AiY(;_~ju40t1`#440<1s+!~&^; zXp#bP*<l1Ieu{Y*7#P|ZzB4hg8hv44Vl{#&1gY`UWV^+dl9ia3o?iq?MYk9r;lb$( zN-l2sMY%;FWne!;bb*Y&#bE;pUArQA1_lOD5-SEd<pVP#Bja5LiMtFUUs#wKjV6dr Om!ByAm4TTNVkH2XgsnFK literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/models.cpython-313.pyc b/imageuploader/pictures/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6c0a46293e668f1281cb5cd0f1d5840ba5f9c86 GIT binary patch literal 1208 zcmey&%ge>Uz`(G><74`1Mh1q*APx+(LK&ak7#J9)G6XXOGkP<4F%~f@fY?mlOkT`I z%nA$=3`z{a%u)=&EHR8h98f(-lqoZWQ^cCis>${e#L;BD#g?0&lA2Sj$#{z;v^cdW z86*tD>`=z%Uto)47>XE!8H$*K8H<=>Sc1R~hN^&4N({kF!OWJ7MQkxFL3~g_Bua_F z6v`{&h+zp5f^v{3Bo$mSEJ0#OQc$K6LoiD)t0iL*PYg?t6jTt2Qep^Z3uXysw`3~f zi(v_pLz03rl^9|KVpxKdpj;#>m?fAanA4J_NGO;~ilIn2n7c?MokNr77E3^Wamh;- z1_p+g-V6*3nvA!&auX}!b5irtOEN+<8E^3<mX_ql=jE5jC#IxS@uVf@<Rm2~XX_Q@ zrE4<XVoym;ODxSPxy724lbDz7r^$SaGe0jrB{e6tB=r_cUTIEF5jO(^Loy?hV?b<B zlzj$yaw<b8LlBZAjH$w)$>^uac#E|pvm_@K6pO{FIcdcpy$ZL?^fU5vQ}vUoit}@m z@{9C~t5TCPa}twG^fPl4(^E?ea`F>XQj7Ep@{3D~^&tsCub}c4dwhIxNl|?KEgq1! z^`JZ+1_p*=5YfPJgI~D6s<Y|>hva9FLsl|qir(UgkIzfYO^uJg#T6f)o1ape17h>U z#}}3+=0Iim<KxpZi;7EfGV@aN^5f%+K>oYM>70>R<d&J5lTswWz`$^eGbFX51kAt1 zl9ZoPd5beRr!*ZZP@Gemev8*7u_QGlGdC3~n37nMdW*{w<SB><TT)_PUTV=TF1P%m z)Xele@6^g7Q0(1ecXkYRc64#Q#g<rFl969jBn+}q6y(LklFa1z#FCPt%%swi)Z+N~ zB2elp5@lduC<3L_A~p~UM1V{xE?{6_Xk)m+BXpfd<`R$03Z{!Z+6}HZxCO6sOJCxa zzRWG#;DUuGe~DXuMaV^NqXw57yu#Oc<u38cEvVZOa*@}m!3{1lqhv+d`nr{M2V5=$ zg<a$gZ*cp{!pJHGaSX@_ewu8zI8(9`^V0M6Qj#FyC<Wyw=jVYup$GDz9wb&Fo@ez1 z<#mWZQ2lm`!v+#%c179@3=E*;Q!LHE!0>^Yk&*E(gUnq9?Jq2xj8YwD{WhI8Ul}+V HA#MQx0jVAz literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/urls.cpython-313.pyc b/imageuploader/pictures/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c3110390a56b093c75efa8d3646973991d44ac3 GIT binary patch literal 569 zcmey&%ge>Uz`$_R?PIzyBLl-@5C?`ipp4Jc7#J9)G6XXOGkP<4F%~f@fY?mlOkT`I z%nA&_%)u<)EMBZdtO^XltVL`w%t{QwY%#1sd{F&JR4{umhb1#u1!oLvkN}btlo`wg zSHT^_8YBc2MxugwKq~Z^i@4HxHThnGWHcFXu_mVEX69)!-eM_8EXjDu$iTn=5-rP2 zEib;sT998{QhbZy7E4ZMaS2FKUSe))6=z;*xh_abzlsCKtm3vQ&M8f|0ugo~!_rgz zG`Vl_rDP@MrRVD<=jW9aWhNCdGcYjR;)V*A7UdKdu`n<&6oG=Qhz%sikyua=53=PJ z7s!U<c#zGvI6&<9ywvhroM2W#VtVQ=?$V;1g2a-N)S|rNl?<Oj9=c_spOK%Ns-IL< zoS&PNU!-4Lm70{9lbB?ppP8GOo?2Rvlb@K9TBHv$rC1;20KJ0BTO2mI`6;D2sdhzT z3=9mQFevt8U|{&b%*e=imqFn!gUnq9;RoD84ICfY7+5(wggQd6^U7Z2m0jR=kwyC^ u3rC0agw*MI6Z2MBU1Tu>@nvVQ&gY-Wzas4-i|Ge;7JjBi?jjKe1_l5*9+dF_ literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/__pycache__/views.cpython-313.pyc b/imageuploader/pictures/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588b26383ed22003960d4cea1036e80d4e9e7d9c GIT binary patch literal 1817 zcmey&%ge>Uz`$_9?PGd9GXuk85C?`?pp4Hk3=9lY8G;#t8NC_27>gLan2MMb7=oFC znZ234Sc+H_KyobJtX^zIY+!L#Z+0(^A`S(HU^Xd+BF<oTDTX4h7&aw_V2)r;OU7U> zDF#!h;YHl(+?qTuK|D>STWm$Cc`2zyw>XMYQ!<NElS^JQGB7Y`GTved$S*F@WW2?f zlb@cM7hjZGSejXsnxe^gi#093D7QEnqz+^V2(vLTFfcPPFnq28J3JaB2F5{5U<!o@ zVnyMCIWWfsv4goNL@=W%)UG_nXik_^C^$Gm84VasK{himFsLwSviMc8>ZT-?q*jR* z<QJC|>x0SooXp}9y^NCFoLj750ZrB-kc)4z=O<;QCYKc7VouD-xy6xRl#*H$pHx`{ zGEkH07CXq(sl_ElpcpF#`9wkCmZ^S5er~FMQdMz&Zc=`cesNW5Qf5wKl8Jt1Zen_B zX+chYVoGWe#Af}n%+&H?y@JYHTwsgAE-4aVU|`^2U|=XVVPIfrV7S90(C^dfbDc-# zB9F{v9=Yp0>KA#`SFm5^F=%kT!!0;L{era7hVUJ!7ff6(bGu$(as3Pmgk+F|KnxHD zc?aa`&rxJXKqzA{qa|Y=Q#3pRpaIN;7QmpSQJhnnUL^wd5!j#c1&QgYkN{=@iE6Td z!?%c=fq~%`b9!nCBt)5u_!t-%iiAOg2+02+7b_?z6!C-9ae{P$O)3&&U|`?{DbQsA z2M{-ZzfGsjb#Cd4+|mm~E^td<;8tsJfd-A?2Dcq98|*G~J6&LLDiUO1V5s8NFD*_j zD%J-lU42c)Tby84d}&b*_GFvH2+D7v3_+l<M8m<1RuK#gi8Txi(eMxtg5^{swMq=3 z3_+lHKoSEnLm7fVkqu%ZVN<ACd5ocqL7;F#k^?be8A1cZVPIfLv}RxkWefs^3RDC} zfl38X%!M)pfr1w%45dSva^SXyGGWsXvq^y=8Wb~NeZefSET_WYFG|SYFcb0^qea2m z85kHs8G>1Z+0e2lyWcIA0RP|+H%-P{Y{~h#xtS$Zkc?pk%A!@mpd<jvwDEbV<<Jxb zDsD8nZ?Wa3mSp6o6oI^Ri_5tvHL)ZWR7Mp^f>IBwo2QR!@GXwa;`p+}oXnJ4EX9ds zskc}_3E>u7VrfZ6eo+x9)=-k7G)OCZUTQhmVwB{_0TKeaqDX~-fdQ1PihIDR@c}zu zdtGDQ46)1X@^|<}uJg-Z;+J2*zMN+v&x-W*xhr!o^V@W=+~DT#x9zm;x9_ySAtp6F zb7JO#(g~Rt#B@8{Z^)|5kC_?M;ojqSgGU&Y^?Us82usiKxh$-Cfk*QLCj*c47aj%y zQHar(`4u}@plRIzl-4g8IbG&<zQE!PPV9b~Jhuc=vJ&&s^Yw}|@{3B6OG}Euo&<aM z7F%w9N@`9qI78l&gDOnU&nqd)Owt2|i(X1<a(+=_Nq$jr5h(NDVgLs*xRe6tL~sDC zWB}U+$*LSSx%nxjIjMF<S_}*fpu)M>f`NhI12ZEd<9!C*y9^R{87%KI2!G;WVsvBt j#Kpwu%=nRmfk|M7{zXQuk4#*QE{va<8JM&oOt8rS&75@h literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/admin.py b/imageuploader/pictures/admin.py new file mode 100644 index 0000000..112f607 --- /dev/null +++ b/imageuploader/pictures/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import Post + +admin.site.register(Post) \ No newline at end of file diff --git a/imageuploader/pictures/apps.py b/imageuploader/pictures/apps.py new file mode 100644 index 0000000..b38c60c --- /dev/null +++ b/imageuploader/pictures/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PostsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'pictures' diff --git a/imageuploader/pictures/forms.py b/imageuploader/pictures/forms.py new file mode 100644 index 0000000..37e0e85 --- /dev/null +++ b/imageuploader/pictures/forms.py @@ -0,0 +1,7 @@ +from django import forms +from . import models + +class CreatePost(forms.ModelForm): + class Meta: + model = models.Post + fields = ['title','body','slug','banner'] \ No newline at end of file diff --git a/imageuploader/pictures/migrations/0001_initial.py b/imageuploader/pictures/migrations/0001_initial.py new file mode 100644 index 0000000..6297b53 --- /dev/null +++ b/imageuploader/pictures/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2 on 2025-04-05 09:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=75)), + ('body', models.TextField()), + ('slug', models.SlugField()), + ('date', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/imageuploader/pictures/migrations/0002_post_banner.py b/imageuploader/pictures/migrations/0002_post_banner.py new file mode 100644 index 0000000..912685a --- /dev/null +++ b/imageuploader/pictures/migrations/0002_post_banner.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2 on 2025-04-05 12:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='banner', + field=models.ImageField(blank=True, default='fallback.png', upload_to=''), + ), + ] diff --git a/imageuploader/pictures/migrations/0003_post_author.py b/imageuploader/pictures/migrations/0003_post_author.py new file mode 100644 index 0000000..3413a52 --- /dev/null +++ b/imageuploader/pictures/migrations/0003_post_author.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2 on 2025-04-05 15:06 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0002_post_banner'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='author', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/imageuploader/pictures/migrations/0004_alter_post_author.py b/imageuploader/pictures/migrations/0004_alter_post_author.py new file mode 100644 index 0000000..d89258f --- /dev/null +++ b/imageuploader/pictures/migrations/0004_alter_post_author.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2 on 2025-04-05 15:14 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0003_post_author'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='author', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/imageuploader/pictures/migrations/__init__.py b/imageuploader/pictures/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/imageuploader/pictures/migrations/__pycache__/0001_initial.cpython-313.pyc b/imageuploader/pictures/migrations/__pycache__/0001_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e977a8357823b3158c2349cd2b0c73a5dd205bd GIT binary patch literal 1125 zcmey&%ge>Uz`!u&--q-TCI*JbAPx+(LK&a!7#J9)G6XXOGkP<4F%~g;F%>Z>Fi0>c zF$6P7F$6QmFb1(f)gn=*%n(iyb2^JA>q`(vlj#;$Zf1H>Vo7FxUhyrq-29Z(oZ@7V z6b$n~8K1v^EsbF)Vhm;|VhUy~Vh(01V$o+PVvS)7;)AL}qLdhdnS)tkID&+b1ffij zLxY)uS%cYv*)3U2n1VTCID$l=l1P*iLojDBmnEYKQ!sZ7N01nj6qKpNU<zfKFa`6( za0E#}xkwa>8r~R=ASonCC==`=K9EiNtik-2O!|yPe8B=m{ON+4Lbo`5VPW(V6s{q+ zSOW5kOKve`rnuc=@^sN;xy6%MT9O~1T$GwvlA3ahyPzmDH?gQPK0CGY7H4s4QD$OJ zW>xAfp0d=Ur2OL4_`Jm2)LX12nI$=?FTEKU7&IAgapfjf#OI{urI%#fVoAzRsl3Hf zoKu>9izOwoBvq3UYC~Rrd3<6@iYC)77O)v?X_=`xDa9)p{4@n_am0fSj*q{^6(66Q zpHiBW8Xtd)CqBNgG%*LHJU;#we|&seW>IlTPG(+eUVeQ1E%wa3%#zH+oLf98sRgNd zDXDqMnW@D^ptN#}+ZpU3Ur?$jVqsulxW(g?neJFxlJ5qx_7<meMq&|^8IoF20%Zp0 zl%_+Nye^3)sUexUsSqw#enBcMt%=6R7ndZKWG2TamXs7_CY6??7RSdIfuip-C{Av< z>u2QWrs^kE73b$B<rnD}SEVLp<|HPW=x638rl*z`<m4x&q!#HH<QJC|>myRJzJY;( zVLa4VdIgn5peO?qAV%>71_p*Uh6j8?4elRU7)96`d_Hh6a0*}Nkh{bocSBJ8fuQJw zvg_hnm&CPpu$)l25EXwRujrz9@dbgB8-fxu)UHcuU6Rt;kaSVX@`8ZX4MFi4V%H@# zFG*@%mejr=po2?5_mZUU4wH+L4i^L*KX9{&@O@<E<mCFm%q_&$>{X=Bz`y`@qMs(q zEzXpz#Ju!;y_6(yEPw+ZEC~)Ah*}L$WN_F(BH6A;i-CcGk%57sScZXt;R7=xBja~A c21d;<Y(k7|6S%Gms9Y3K`N|-~$OhI80HJyz5C8xG literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/migrations/__pycache__/0002_post_banner.cpython-313.pyc b/imageuploader/pictures/migrations/__pycache__/0002_post_banner.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a736588e1ecc08fe2868920dae4005e0a30e248 GIT binary patch literal 801 zcmey&%ge>Uz`*cZ>0|n2Mh1q*APx+(LK&a!7#J9)G6XXOGkP<4F%~g;F%>Z>Fi0>c zF$6P7F$6QmFb1(f)gn=*%n(iyb2^JA>q`(vlj#;$Zf1H>Vo7FxUhyrq-29Z(oZ@7V z6byr%!@$7sIRR{G3_}rPFhdbjFk=yOFq1xG5lakf5D!c-f>vS(W)5bFVGj~Oh{0G& z48g3yY{Bfo9G1+%oR-Y`j76NmTt!^z+?qVMIDKL6c?t4^Cetm}g8br=;#)ih1_p-l znR%HdnTa{KSU`fe*pd?S@=}XJs(8{8b8?arle6^-^3rcHXfoeoP0C5k%f7{)lA4xS znp1L%v$P;5KQSe~Bwv&H78lr~@p*~4skd0bBx_n`YEH^Z20u;iTO9FVnfUlyT=DU_ z`6;D2sqyi*c;e#=OA~WIs^jBt@yExfWfm2e<YeZh=H-K=Q&J03^HNgtk~33_i$Fnr zi^DM`#SLU^5eowY!!0h)+{E-$u)r;@{DM?isEfwO7ndZKWG2TamXs7_CY6??7RSdI z34;P16lAx&^)vEwQ}vUoit}@m@{9C~t5TCPa}twG^fN&wLOhmQqz?*`Vtqt>>Khms z7{!A`<00XsS5R353RExwVibc?QX9huHU>_m56ny=Yz;mixEMHvuX9LW;*h=}E_*{z z@`jMabs^<TLdq*tcJN&Y3b`m0`jMT5lj{RBn-E*GSCK3O0|VGVKTVcfoGDp}dFlCj zDM{cU0DBxP3HA;|tsE#YIBXyRYgeSez`(%Bz`#%}!@$7sftit!@jDv>qvjVj9!9na TT-OCuE()l8W#D0C1M3C=ZOG6u literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/migrations/__pycache__/0003_post_author.cpython-313.pyc b/imageuploader/pictures/migrations/__pycache__/0003_post_author.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61d358c9351fe2644f2a6c4bba479d6161439646 GIT binary patch literal 1150 zcmey&%ge>Uz`$_Z?PIzV69dCz5C?`?p^VQ#3=9lY8G;#t8NC^b7=sytnY@|2n2VSd zKw`|^EMBZdtX^zIYzhn#3`z{aEK&@?tTC)Xd{F&JlqoZWQ^cOmsLA#c#PQQ)yv0$R zT2hjkmtL&Nbc-uDGrcIWBr`v+_!e7keoAUiaWY6941?Xvz`*eN7uZ!XU>6lJ1v3^g z2Q$U61i|EC>KPaqlo(>zu)2m3qDY^qh$Dt2NC?71CY2b1nS)tkxPruxMIme@kS}?H zq#!(GGDrlO2Vn=vKxkw#NDi3?VPkh`Fq<WFFuNtQK4XzUFh`MKI;$q<ElyupNWJ7> zU|`T>y2V<MUtCgrOTfUuz$hNXj!#O=%S$b~#RB5oVoNM7$;dDA(`3HIo|2lDSejFE zi!(njJ|#6LwIuZxQ%Sxi^DQoLn8)WO=BD0a0h6q0nW;G`D;YF}ZgIqeCF0|6amB~y z=BJeAq{heJ;)#zhEKSS-DUOf7#UCG^mRVF>l9QR2nwK9RU&O+|z;H{XxID3-ATcQ? zH9jS^AT=)~H7~ic2$URd@jHfwc*KVWy9UMk`n$OL+~R?&$V@H1#o?He;s$a-5hy|4 z;&RI`O3h5q^G>b2#g>wln3tY^izy}P76;fDnfZCQ*qt4NogH0VZ*k=pq{5PtXncHe zNn%N6a(rS*Nl|7}X-R5ve0-5GC?$bH{+73XMt*Lpeo|F&er{5Jk$!PiYEouSVv>n| zW^Q77YH2}Eequ^$kv=FSi}ewSRNuhBz!(zPkl@uTs4QY<U|;|fpol5XV_;xtWB9<v zz^QhFL+Cn(`Xvta6&%+!94=}&T;_26z{)Jb*5LDjhk;Z0I*0Tn4(S`>vNr@JZwN_T z7gD|?q`bmqhueP7ou1cid@kDfT(=3mXcKzfCibFD?1iMP>q%7?ld3KXRexk>;pF<j z%qGOv>{X-;bATqtElEfy>7^v;f#bGV4;EBKvY@EphRP@B=cPengcB-~k_3)CaKMAT z0}d~U;VK}l95#?dU{|EUz`y{?PQ^+L3=AKb85tQrvoSC#-epj@&!F*zjhB&a0@rl` Qm5Tx@Um18A*}!H10Ihl(1^@s6 literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/migrations/__pycache__/0004_alter_post_author.cpython-313.pyc b/imageuploader/pictures/migrations/__pycache__/0004_alter_post_author.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7592ef74e81f97843e50507d3a713fe836433b0 GIT binary patch literal 1180 zcmey&%ge>Uz`(H2<72u%69dCz5C?`?p^VQ#3=9lY8G;#t8NC^b7=sytnY@|2n2VSd zKw`|^EMBZdtX^zIYzhn#3`z{aEK&@?tTC)Xd{F&JlqoZWQ^cOmsLA#c#PQQ)yv0$R zT2hjkmtL&Nbc-uDGrcIWBr`v+_!e7keoAUiaWY6940A&npZ|be6$5rr5mPW@5pyt8 z3`-E$KTtJLN{Jzc4XbMyAqw=Fia26ef`lMEWKxMCm^qjwhAT)6Sro!nVhCmpW{cqo zl7jG&$siGA9)ukv1EG=0AUR|ngpJ*;!R(eS!5o&%`iw;a!JI{c>8zSuw>W)aVfB)O zfq_Aj=@x52esM|hEdc`q1LJrQJ3g_rBqP7*77K`Tiw(l_3(;h`#h#LymROooa*HLe zG$-d4XMSFMN@`AON$M@8l6+0(TU_A4kIzfYO})heCRx)mQ*%;QGH43j;)n-J#K+&_ zijU9DPbtkwjgP;@6CYn#nwSGp93Ov+KR!M!v#7WvCo?ZKFF!uMh=qZH;g(2od1669 zVp2|Od`fCTYF<ieUUFp-C|%s*cMJ{jhz|{R4T|^mcX9Q(#RFH7nOb~{%Q2@Uwa5+R zh9Xefyv5~~UzD1ep68ufd5bM2D={xU{}xk9(k%|KKQi<4Zm~N%20J^txZdK*FGz)@ zD$)4(;*!LY%;fmQl9Hm#q|%bq;`sO?P?UWJMZv8={fzwFRQ;r?;{4pC{38A0s??;+ zoWvv({mk6N^wiRVoczR;)FORQkQVDB(yP9Kfq_YUBFL4<VXs$ES;Wr3zyKyd@l;&R zz`)SP@PUniQ|$(a&~*;=OC0JeIIe3rT-0#5%;ETfm05(X!RG@H1E=tH4%tf_vNyzK zZwN}>5R$kqq<l$8d4<b{k^^POD-Tv)cMrel9)8_D;i7xOb@z;m?im+yOTRNP<T1K2 zeS}lO?o1!qSva{qFtZ7<HG37Qz+9uraZ3^saC#|8df*5z)`Nv!5h!uq;)cp6=jWwC zqKOkKl9B|DQE*&<{RR#~h~cWBsOGSNqzt<vO$G)AP-ZJuVqjqSz|6?V_?eA?QSmN= d!hHsfFKoPwY!kSy3#eQaQ2ENh%g6>c0|1isBsc&7 literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/migrations/__pycache__/__init__.cpython-313.pyc b/imageuploader/pictures/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc84e21da6819ac225362e4b4645aa14d92499e GIT binary patch literal 164 zcmey&%ge>Uz`*e5*ZXu3{TM{RFe8-lnT3IYVJbs9gC?WjN`@jP1_p-DAgNo<`WgAT zsrpG(#re5O`9=E0RjEmtIf+Ro`kA?j>8Yg!Ir)hxsYUt)`Nbv0`nj3uMTsSu`FX|q t@$s2?nI-Y@dIgoYIBatBQ%ZAE?TT0#7#Kiy7K0ccnHd=wi<lW07yu~OD;fX* literal 0 HcmV?d00001 diff --git a/imageuploader/pictures/models.py b/imageuploader/pictures/models.py new file mode 100644 index 0000000..e255e6f --- /dev/null +++ b/imageuploader/pictures/models.py @@ -0,0 +1,13 @@ +from django.db import models +from django.contrib.auth.models import User + +class Picture(models.Model): + title = models.CharField(max_length=75) + body = models.TextField() + slug = models.SlugField() + date = models.DateTimeField(auto_now_add=True) + banner = models.ImageField(default='fallback.png', blank=True) + author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, default=None) + + def __str__(self): + return self.title \ No newline at end of file diff --git a/imageuploader/pictures/templates/posts/picture_new.html b/imageuploader/pictures/templates/posts/picture_new.html new file mode 100644 index 0000000..11741b0 --- /dev/null +++ b/imageuploader/pictures/templates/posts/picture_new.html @@ -0,0 +1,16 @@ +{% extends 'layout.html' %} + +{% block title %} + New Picture +{% endblock %} + +{% block content %} + <section> + <h1>New Picture</h1> + <form class="form-with-validation" action="{% url 'posts:new-picture' %}" method="post" enctype="multipart/form-data"> + {% csrf_token %} + {{ form }} + <button class="form-submit">Add Picture</button> + </form> + </section> +{% endblock %} \ No newline at end of file diff --git a/imageuploader/pictures/templates/posts/picture_page.html b/imageuploader/pictures/templates/posts/picture_page.html new file mode 100644 index 0000000..d828673 --- /dev/null +++ b/imageuploader/pictures/templates/posts/picture_page.html @@ -0,0 +1,21 @@ +{% extends 'layout.html' %} + +{% block title %} + {{ picture.title }} +{% endblock %} + +{% block content %} + <section> + <img + class="banner" + src="{{ picture.banner.url }}" + alt="{{ picture.title }}" + /> + <h1> + {{ picture.title }} + </h1> + <p>{{ picture.date }}</p> + <p>{{ picture.body }}</p> + + </section> +{% endblock %} \ No newline at end of file diff --git a/imageuploader/pictures/templates/posts/pictures_list.html b/imageuploader/pictures/templates/posts/pictures_list.html new file mode 100644 index 0000000..b17308e --- /dev/null +++ b/imageuploader/pictures/templates/posts/pictures_list.html @@ -0,0 +1,23 @@ +{% extends 'layout.html' %} + +{% block title %} + Pictures +{% endblock %} + +{% block content %} + <section> + <h1>Pictures</h1> + + {% for picture in pictures %} + <article class="post"> + <h2> + <a href="{% url 'pictures:page' slug=picture.slug %}"> + {{ picture.title }} + </a> + </h2> + <p>{{ picture.date }} by {{ picture.author }}</p> + <p>{{ picture.body }}</p> + </article> + {% endfor %} +</section> +{% endblock %} \ No newline at end of file diff --git a/imageuploader/pictures/tests.py b/imageuploader/pictures/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/imageuploader/pictures/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/imageuploader/pictures/urls.py b/imageuploader/pictures/urls.py new file mode 100644 index 0000000..2ea0e73 --- /dev/null +++ b/imageuploader/pictures/urls.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from django.urls import path +from . import views + +app_name = "pictures" + +urlpatterns = [ + path("", views.pictures_list, name="list"), + path('new-picture/', views.picture_new, name="new-picture"), + path("<slug:slug>", views.picture_page, name="page") +] \ No newline at end of file diff --git a/imageuploader/pictures/views.py b/imageuploader/pictures/views.py new file mode 100644 index 0000000..e5818e1 --- /dev/null +++ b/imageuploader/pictures/views.py @@ -0,0 +1,28 @@ +from django.shortcuts import render, redirect +from .models import Post +from django.contrib.auth.decorators import login_required +from . import forms + + + +def pictures_list(request): + pictures = Post.objects.all().order_by('-date') + return render(request, 'posts/posts_list.html', {'pictures': pictures}) + + +def picture_page(request, slug): + picture = Post.objects.get(slug=slug) + return render(request, 'pictures/picture_page.html', {'picture': picture}) + +@login_required(login_url="/users/login/") +def picture_new(request): + if request.method == 'POST': + form = forms.CreatePost(request.POST, request.FILES) + if form.is_valid(): + newpicture = form.save(commit=False) + newpicture.author = request.user + newpicture.save() + return redirect('pictures:list') + else: + form = forms.CreatePost() + return render(request, 'pictures/picture_new.html', { 'form': form }) \ No newline at end of file -- GitLab