From cb676f90e3d7a3c65e7ec9910e7a1828f25fa845 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Fri, 30 Dec 2022 22:38:51 +0100 Subject: [PATCH] initial, migrated to new structure --- .gitignore | 3 + Dockerfile | 28 +++++ django_project/db.sqlite3 | Bin 0 -> 131072 bytes django_project/db.sqlite3-bak | Bin 0 -> 131072 bytes django_project/django_project/__init__.py | 0 django_project/django_project/asgi.py | 16 +++ django_project/django_project/settings.py | 126 ++++++++++++++++++++ django_project/django_project/urls.py | 22 ++++ django_project/django_project/wsgi.py | 16 +++ django_project/manage.py | 22 ++++ django_project/pages/__init__.py | 0 django_project/pages/admin.py | 3 + django_project/pages/apps.py | 6 + django_project/pages/migrations/__init__.py | 0 django_project/pages/models.py | 3 + django_project/pages/templates/about.html | 6 + django_project/pages/templates/home.html | 6 + django_project/pages/tests.py | 35 ++++++ django_project/pages/urls.py | 7 ++ django_project/pages/views.py | 9 ++ django_project/run.sh | 2 + django_project/templates/base.html | 6 + django_project/wsgi.ini | 6 + requirements.txt | 4 + 24 files changed, 326 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 django_project/db.sqlite3 create mode 100644 django_project/db.sqlite3-bak create mode 100644 django_project/django_project/__init__.py create mode 100644 django_project/django_project/asgi.py create mode 100644 django_project/django_project/settings.py create mode 100644 django_project/django_project/urls.py create mode 100644 django_project/django_project/wsgi.py create mode 100755 django_project/manage.py create mode 100644 django_project/pages/__init__.py create mode 100644 django_project/pages/admin.py create mode 100644 django_project/pages/apps.py create mode 100644 django_project/pages/migrations/__init__.py create mode 100644 django_project/pages/models.py create mode 100644 django_project/pages/templates/about.html create mode 100644 django_project/pages/templates/home.html create mode 100644 django_project/pages/tests.py create mode 100644 django_project/pages/urls.py create mode 100644 django_project/pages/views.py create mode 100755 django_project/run.sh create mode 100644 django_project/templates/base.html create mode 100644 django_project/wsgi.ini create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df8c98c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.venv/ +__pycache__/ + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d4a2d0c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM python:latest + +LABEL Maintainer="Wolfgang Hottgenroth wolfgang.hottgenroth@icloud.com" + +ARG APP_DIR="/opt/app" + + +RUN \ + mkdir -p ${APP_DIR} && \ + useradd -d ${APP_DIR} -u 1000 user + +COPY django_project/ ${APP_DIR} +COPY requirements.txt ${APP_DIR} + +WORKDIR ${APP_DIR} + +RUN \ + pip3 install -r ./requirements.txt + +USER 1000:1000 + +EXPOSE 5000 +EXPOSE 9191 + +CMD [ "uwsgi", "./wsgi.ini" ] + + + diff --git a/django_project/db.sqlite3 b/django_project/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..5ccefcbdbca2be5b9e6438b52caaf9d213626f39 GIT binary patch literal 131072 zcmeI5Yit}@R>!;g=~s985vRgVGA_5{NqQZR`{8!GXIOSTNl#)XaVCz#j3q`zb$8k6 zOh26Nb{<*@XisJq%>ojOb|sKt5E2pyKEMK6q1~0xB7^|JE@%gd$0GPNu+r`#(C&U% zM&jIC)m@LSwmVjWBIobXRI2Vh_tgLV?yXyOAF{7syIg8&@>Z>0QJZqgGwKlp&r7oG z@pzu4|JlFopO@*x-@c%K1wFRrh3&m72osXL>r;E^N@AlJWYc|P!Zqs*c)TC@~DA>~xs+u`l z)mTglwQ5tVHkIc69gQ`q!UTG5nvLd~Z#Y1OO^vs9#aHJC#(kC=Rc<*su{t81$p zt1Fi;ZyJfY3tf${TT_>JlSO~`i0#FPL(=@b@Lm+5m&p^74V`o3Xj#s^NKb2_}YHV~4sS>Zv(tY5t?nNOGgV05Jpy3~A^(V?1w z?&Xm;W}+OP{571XM``@#7IuMfP=7hI@#*D|L$b&L3gD#PoxsM>cv?V;MPUk1V{uNrhrB=6V zwwJdd>EM@B=lyKr?z;bGenG?(8UKHLsPG3Vn%`mCRDUm@207 z{4>O*K)`@$A5pj%?(bRu3UMjMV((~T0}C#TKC8BUAt{v-_I7!VyOeZE^4n|P#o`gv ze!_~J1e@yJYo!yDdv@$KZ;&KO2%57LP%Oz z5cX6nyGm)ht~S|V%-~`scx`^8UHONiMqJGIPBLwO@!0zdXD$^jm%83A)DKKfgy}dw z{F+Dn3-R+}QJjwaL*(ZpFNZ%0e<^%7yg2gV$onHdF)}v%wc&Tj2tObI0w4eaAOHd& z00JNY0yYAv@qp*l>`Ft^*JBL4 zQ@1r&M44c3sC)Ru6oh^8mD& zOd^?Hz7!%S?Zz8#H(qmsh|jnlf20XJDSB&`|j*(F$zLnaY4qknQinSnD zyy-aA(P|*zkw{aqQmT@R6q{V8#jW~%Ue9bIwpLZP%IdaKxLGUFynw5#R3e>PTJe)B zqHMTInyw64^widvTUQs!L^8D;_mPX)j*ERegiL%XnMy8ri7A!f9m4)S$WoTNkfn@3 z=w_Yh_Px^*mCU5W;%|F`;vJ9ppW-*fFNt@=&xpS&-m`USxBvkV009sH0T2KI5C8!X z009sH0T4J8fr+4RPH=3qIT0TAO%L!yKHD}j;+xVh*=!EoW^vXFTF}#J?8*N&JfV8+3sm5C8!X009sH0T2KI z5C8!X009sHfyYJQnE%u>LVM$o@o(^?e|AQ&?uf9Q2g3fzNj{ChW(fQd|D?pP`1FBq z!aq69FFO+kRqvQzIyK0r1lk)S*#7^Z_?}1nw)l_YUx{B9-=_=wfB*=900@8p2!H?x zfB*=900@8p2s|bN6G6Y{)H9Cp|1$xvOvF3s`(nBezFr)=YYw*G%2GUXA!ORN8XE`CA$HSry>BEBwO6c@#5aa0r{-;I1T z@;8w$Mt(i=PNW+7$;ib>k_zAl1V8`;KmY_l00ck)1V8`;K;S45821aaLhw#WyQ>%@ z(-X)1LQDwK?>f}z7m*r?lAcJv+_k#hNjyI07iNSY`^^f5+2nD*FfRnSJIgrs*a^Ro z5CVovOU8trVYszqj8FQ7IU&GYTT;hFzc3~ExqCJu9_0f3hF_K<>M4dpmJ*5hg;Ro` zdE$fUQNJ)P__zyw7d|K8Gkox*VLi!k!jp#hoqfy;zaHfJyxfgB{2q|}!h+y6e3|JX zJ>76A5S!VwiCUh{=r$=08s4w76Z2a zPrvjZKOg`CAOHd&00JNY0w4eaAOHd&00Kvt09*ez#{Z!s940~o0T2KI5C8!X009sH z0T2KI5CDOvngG`SpX%yI@E`yJAOHd&00JNY0w4eaAOHeS2?31%pOT73m>>WGAOHd& z00JNY0w4eaAOHeSH37^1e}4K@!$9yL00JNY0w4eaAOHd&00JNY0w8ci31I#Ih*m7Z z0s#;J0T2KI5C8!X009sH0T2KI3jvJ(EiiBj0w4eaAOHd&00JNY0w4eaAOHeKlmOfG ze?r{#i2p18K>Tm<+v11fzl;AYejt8L{7doA#IJ~76#qc{UGcZX_r+fke_8wm@zY{U z{1g?y4+ww&2!H?xfB*=900@8p2!H?xfWZC)0zN?qp5RA`ACL3nBs&I<@#6$Pj`QOf zJNifYQRK%6KZe=SH^Ps@{5ZsqgY4)X;KvX@2Kh1I_YDeucJQ%-*XJ7?#QOjKRfSv- z009sH0T2KI5C8!X009sH0T4I}1T4S*?00@8p2!H?xfB*=900@8p z2!MbK0gV4$pdbkZKmY_l00ck)1V8`;KmY_l00fR00gV5TScM`S5C8!X009sH0T2KI z5C8!X009tiArKCI&okuzoJTwz`TM~Sf?o~a9eFQ!EbzMjbHhJq|L6V4dsXYJc6S>3d8w!@sfnakT+TZUj-6l6t!(7v z)wK(`H{_@@yQ_RuzPi?J7M0IN`CUuJXsq?g@sRWuNowpbi7Qk{TXr#(ju+wuWw%)gC)VTgG<8c?vT}C}TTEur1Vc=~#Nc`MrNP3gRU)fK*?um5g6UlfXzm;{@J=T}* zE@uZxZWkc6x5NRd<;x0tGkwXm1*^mh#Z)q#kDD#0i_mEA_S0pnKQyd1_qk2qu~Cz< zxuIZBN2qG%Y*k}1Db%V>t=d$Y_jfcVBDuAgS<)8uXV$b6UFyWlReE``=r*lc`*9Q? znb*T1Jj6z0Fj+P55O+F1)^5y)crQL2lIG`y2NO*-U)H-o%S*`FrH>d5cw^<|%Q^R# z3B5<;5qct)0(Zx7>>9XYVTc0?S?JLRQySH&$0JU*0qla~G^Hg+3f}ApLoc4L>LRn=~~g zygOq@)?qc&1CrstTh4xTcGO1WZmmvG@2K^{O|^bDkz9^-$WokTwb4|{we3+f#5%T}pQx9M%!7P7B}R#8i3 z^G=zxc_%8*gf`W!t!|N&qZXQ_JEYR7pGBd9o}0T2uazj@E~K>Z`b>Vn|GxSy3~A^(V?1w?#1=l>Uv7JZGVlK zsGGecy|`Q+-7fcLf&T6hqwn6olcuMI)>{ssCd5!LaEF3rZ-dL-?KzeT1*MDA`!)-m zxZW=K`2fW+$iCtCTB8%8C+*AqY5Ex3dt)Rdt*i(SUNjpNe~a*g**+Vchgu&DS#rWI z4bIiYp&B6f)Zf#@O#6F|{$HNe*StY#Zcf9ZkpWS(Wu;5jN8 zYi$Z4X<Q~bL;QdM2!H?xfB*=900@8p2!H?xfWXlv5cXa4OnCmsBi@Sag#UQtKZZUW z`q9DP8TjVFc<@`a51``xL*J(FPrW}YyyrbnW>3(M@1pQ!DHapno#(SMRqd`~&W78s z>~piNV@o0FdQ50#`4qY_JJZnk%DST6+bPvGg-^<>>B3TSX(?qlk&W3MW7mQ`)3v<5 z`e`?0b3m4R(Zc7_Vu;1Fcg8x)WXQ6Ybu7==GnwOdFmGx1%{ik*>nyTm!G>n#+V&K+ z8kL*cy{2`6#VXTff#St?xu5Jvp#^ND98DHU`%qe*Dti4KY zUF5T_DLmW)mVI(9k+yQwSC?YGU-XP$n_~=ui$VU7q!JH5KR-n!ll`pqyuFy@ZROpW zw?9s2`z__!+rGKS=1_Bxhh55}1yo~o>|vJi+(?rfzFN3XosfxRl`ffHeB8@)bW^wW zMOz581>?*k*n$zU_dmSVo9hCPWDCY~A?f~{uqT?kV)nT~p;pvbbtv(KnoniYs<|P? zEEP0FyX>Sgjk>hEyY7242~|qlLo~KGI~!sP0}lkV+c0nKp!lpI*V=)Y#)o=#oI72* z`ylH&rO{1V3mJDkc-ufHW^=(kZt1g#iv8)aEf>UEmrjSIT1ser%KCb=3Q=f1K`Ezh~QP)GCOP>1c{ld|Vd2Qdeg}QYt0vWv#DN zYe^Rk0ejWESRAVQO?^FUMOW>f9czus))iYrmRhWos%+~-XRl--y|k$1)g`CFNh2)# zS4;2mHrO3A7J7SWFxEOd6_OO%YkAGuQaZNXPxE5Fpe<{8r?h7dkY=qgwl%F__~|Xt zQ6d_9`=_7fn}j~SU~LHV5Q2K@_6 ze`^}ab!~@MS=&2kl8y(Ow$)U(HKjryvFbMYcYeY-ftZ~S+uQW0I-YjRFuk{TPg(E4 zyV{3ZG-f+z2;Ej$-HytQidrty_AGg~+9++)rkT#Cs(k)Z?)^AQr*XObV0P`!owbRrd_KLEEObP7t;2uJ-gAOHd&00JNY0w4ea zAOHd&@R$f-{QsE1!Yv4Z00@8p2!H?xfB*=900@8p2s}XqF#dmnDg#nL00ck)1V8`; zKmY_l00ck)1VG?15y1HWF@c3!5C8!X009sH0T2KI5C8!X009tqf(T&z{{&SAq<{bj zfB*=900@8p2!H?xfB*=9z+)m1W`0Mx^OJOZhM(a80w4eaAOHd&00JNY0w4eaAOHd& zaHI&Z@&AdDpYn+RB7Q;qIWaH3AdW=-HS$N1&qwN!waD|4@$i3z|2F*l;djCt;hB-| zk9=d~_eLI20sMdf2!H?xfB*=900@8p2!MctK=eewBh1bR@0958a~pqV`n+0|*|lt3 zKPQn*ED@wXC8{+wtCgP8u{*BY8Gr21;!RI!+sTt;H!~Mhi$$w5x@=p_9V3hROn|F0 z{x)Ls{*KmBW~9k1abbdt6E6k~c@A?!qOHKVUck`lC}3!{7Kn{efw^>m33gaB(N@!w zqhvaD#?O_rzhu{u%r0b+a%blJhSYYxp^;lebPGdU+rkjVE3^vNH$Yvd`v^ffQjH2 zX9p;EF6HGa%)heNkzyvD3z6kQ#%t&?GnlO*%1k^L)U6F=W(Ko1Axv!bthu3X#_HFO1_w31fZ|6NbcZA%YJ?C4_UZ2-%?pET|^vv|G z+c%H(%&Z?e379?K1ziA%phQX}ID~`*fLtCU$y@bCRc*;B&$verJTJ(y z$K!dL{HK3ApBKrFzjHwT3YPtTyH9(bRZa$|vG^luBZ)r>pBnwa=rf~#GW|CSHn{l--(s%V|D!e!Z}=QIM~%tzNxekXP3(6keC3POAf)M&&DOy@jIk z*(ejHm!s$8D3eF@L}TseCPLD7UTCX40wZ@vYgF}SQ?J*W3g4$eET>DEQa-6MWj)4| zW)xQWJw|;zTEzDhp&{6G5b+D+A?Xbw{_=j}4NpXOF_Dayid%Vi-4g@p?s0aIV)Si{k&Lob8Fgu90iEXYvGV|Z$a1- zd6n=YJtrvD%UVsXYDzqz7E`&5%4>s{iuA7rZZx3lfg>R`&=D7n?Y%x0l2%rP`_H%3 zV#T;l+11ZBTtt)iEzX><8N|lQirB$>+UmyY z%B4%2W@6z&Pb2Kr)Z?AA80;Lez4&NIT3i(FPdU)CE6f7aI3DYV(a3(R;2C|yV70<* z2SoPv$A?4G%#85voE=%W@s0F>bSOGIYO{H#-XJaVw%RD&P#b3x$>mtLS&~LlQJXEL zQs35VQMs(Pw3c4gtoeFVY3`DSK^tjQF4pT6Yc5TtT>$r=igWkoy_=k6OK*_V^tbE? z+1Em=s(OW=DVO1ABIT*jmb$goE0W}>rIvo1sC4S55i2+AdQBsUdcuz-MuJjdM)0ui zuz9OO9@i97QN*4+-_Skt0VmPj9o<_S3Q76Aa6iZE*Jw-p>M|~jp44HNn(r|>R5LKV zJoLs)sPmxc1JtAFW7^}vkTg3hwBK|9Wz1P*p?=^F1*%%l?p5PYLa}*u~~@Dn;GdQ7URtt0-0SBvMgw* zh)aQh3Df>Y;bOSIXX7cvr5KI9tBJl?Fj?fWYTFl*QYm3?m({pSNtYzQz2;pk9zyLW ztjLLAuHL;?x-q$D$6oaYY17_hahm;QQ@gdR)k>P<&}WO!k$IM0gXc)eSbI|lNlQz@ zo@!-R)wdgJi@uDRTzG=l<~Q1te<*5%3%~CqGxi&gy}xkglA;y8=k7xKf$6C**-nnW z>Jk4!{G3=8XCwa*`NhbK;g7;!4&Mo<$37f;f9$8mCPu$L`VKL|2LwO>1V8`;KmY_l z00cn5Mj$mA@SK`oX==tiO*|e?D0)qA>1rhzPbL==$;DJ$P9~m9=AKK%pIy!-bNTek z69LckYb*4#MKMq#M8x&r-ZV*!$y~O z8uh#PEHgY!R}bl2B9lEY5)YR<9^$4JV<>^XWgH|Ul}}}p7bC>Ub<;^aZw-iz^$p@E zna}1EFNKMtYaK_+R!5y-zk>uNmNU!oSH_5+H#&ZDrk~qtMJIgf4Kg@aE-PB2QEw{p>@U}=nP6zAvK?Lqnyi=Pv*rD;^LK#i;Oic zJ{YRhb}O!}CYR5pbMY63iH}ZQ$J16HT{iWdmTMrn<>hQDdwz&`=+t#QW%aosMoqHZgt8+DzG3%I&UCzey$6+dxB zD4VX5+?6SdT(x!T*40HSo*^~mBQEB%omlb`rlbVx5ccmua`E(XCXo{e zx_KwMeb1C79ZxzQ7Ju6l6mNUP{}jI|ep$RNep>v3c-PjY;Q$0c00ck)1V8`;KmY_l z00ck)1VG?W1g3(%1;Me*=0teZH#@`<*=XC?m~X~7q@y|HG*iY=cVtBh_)>z)nvCF- z&$l>aX0UM!I%Y8~_?9}>e5JzV2yq+~KkX5}EB>|kPvTd_-yjG0fB*=900@8p2!H?x zfB*=900@8p2s|nR$NZOUV#5c% zDgX2=JM0b^)VvdZ>C`YA66h?5pzHsG;(H$PJK{fze?21KJ!0?w zlU{N-OAq<`|AgT8NT+P?|8)NUL}bPzevi!l|GD@@@z=z6#H#q3cu`D?v*NfYM7|gK zR^)FYUyA&C0 zZ>A@X`GuGeB;R$YkuM@O6D1>&e7S3FyPJ4?!Y|ATLHf-KrrGpyzpy9-m^;gR?6DJm zAt3}zmzInvBg1rS$(Wq>3kyPky0)ZFh<;&4@H6-Hjd+|1@SA>VifE*m4rxjx;ulT{ ze(H(6M34K0S;5C#7_0CZ0iWrEC5;+MrW2Ml!p`iYUfA(4)8}Pw`0MwO!3m00ck)1V8`;KmY_l00cnbh!Vj3{}HWN zgara100JNY0w4eaAOHd&00JNY0u};z|F^)vE(m}C2!H?xfB*=900@8p2!H?x98m&v z(f)Ct{#Aus z5C8!X009sH0T2KI5C8!X009s<3Ir_Q|92F^K@1=O0w4eaAOHd&00JNY0w4eaAOHd` z1n~av0tHDR00JNY0w4eaAOHd&00JNY0w8e22;lwyh*c=U0Ra#I0T2KI5C8!X009sH z0T2KI7XoB!#?e-Qjy_|DjS!DE5f{GT2DVdtOsBkvXAGoEjF zKH+dM`rY6=(v?M_ozQD#?XJ4px}oegwT80YsPFDHjeWhWWYt7cD=!zF2FK2?7gjb3 z^6J`!!s~L>ncY)9DqmUaHH*q;qwK7DIT~w!axx^nNhCG*m&6n*L|Z|DH1kX)`r0u-WR(S+Q?vB=|>dmHJuQe6EPlH%a zmolY%Qe*mij3-?%_Zao@Xc6C2go3x}AmSIsL(&^W{N??`8=i>nVj>wY6}R&4x+ezG z-Q(;a$(;g3?M-n=YWwoS-rPWPZNVz>QaP2(6yv<*^bi{F-+p>*jf;lX=02wxI5yIx zY;H)frz50l7Hm~xF)7t+Ev?p4TK9G|Dk8a+&SkZJWL;JxeIS|sd*$p$XGd)|@6;Ov>TR`Ax}i4CCX&msE?E+1MQyf}N_|_eMdh;E z(pq{|v*znfrMXM41%dTfHJlj#_Hzw~0!pej2fIv#!@Pf~Y6_SYjk76=nnvyF)c^Rdixa zDvH>XM=rW&K653yyQ6z+Lm?@j7w+eH{r22%n0Zg?uuIMN7#*q^7+zejt)8od*$&p2 z33c8}k{g%HrQ7447Z~guG4kB|chc;v(0l19vD`_BOcO+n!^oP*A!!yKl2F zh#T#K?GKSShUqi>UVD5h^te5_KS>W`d#{g$q?Hxn{`0&+vAYP{@b=m4Uew0RkR>PV z(%@WO9I62_PlH`e)O4`x=>O$febpP378Zm}2G;B^o7$~itya<;hdvuZN9I|24W1(< zW9>~LBrPoodn)r;zNyx>>q=GMZm2E#GS-vewfT+qI&d|4pCWGH5>j0|WKlE+-{?z;P!h7EH#OyKp_$~@xkzz67-9^h2MxyQFl!X0wG?9AH*^Qz0L_EX>NvS;$@0%Z_P2iZlEN<8@Z{0u3X9AvKN?R1j0m3Qaf z{y5p&Zz|8;_W2r{LybWmb}EldpqjH|4>FDCMw+-`vxWQA2{CcZ(j_zLM?FnPPU<$l zXbXWX!8r2}mS9Be{SRyPd|u$8EWvmtB;8vO_C&raW}g$3>Sc{qhZ0Yy#Z)e%@&z%x zRL~UdvXY7$^=Nl@J@8@@QYjq|(b(Sne27jA+!uJa!B6d=__Qh4+JSK6LtQ)0l`g$~ zkaeEY>?W;+%(EW6Y@i!6pKy;``Yb}le)ZU<3u5h;Plu#>N@%}jy**lmC}ciCsi;M* zqEt!USCm|~SWcBwMON`H%KfgD?_#*WXWMPmDu|NlYKoHhm@INjU7ZU_sg$snx872% zC0#TG>{ah#aj5F&`uf(2q1rt=)*hFwGq$EIwOrL}bm>HQtz;>aO>0Fp>ohoNhGl0jOkyK6>6?@SHG+Gl4%l0w#6UbVKAu5IttoGzBMWv%Fx_S6B=tQAI=rj<-T{Utg| zL}PFN?9*(K(5IHHEukybspynz8|a!Jt^ttcAN86-*S5GU^B|43Uc9N5T5Jh}@dRev zHO=IPwnJuFJ1c0CjtiPBtEp{kN|ijss@ufB^AXMogm*r4ZPUZ*csebEd+)5CvYvr; zwGT9DOjphjbXyg5J1RG;YNbM!XUV&@roK%U&2%4CX2?6+{~w*GHR2 zti60ZB$Y@on+FBMJd#UB&1W>VoUp9GcEcNXG;c|U#qoYM)X#xauVF{q6We1=3G@Gt(U1nDfB*=900@8p2!H?xfB*=9 z00@A zAOHd&00JNY0w4eaAOHd&@Q4V6so!zt{3O{v#rCiP0T2KI5C8!X009sH0T2KI5C8!X zI8p@Y`~QitpYe$QB7RZ)1+geTCyqt_HS$N1&qW%MwaBxP$?$)L|2F*l;djCt;kmIN zjD2(L_r~s%0{DOc2!H?xfB*=900@8p2!MctK=eewBg`)bZ|mguxy_%MKCjkfdMumA z&q%~3mI#uc64hFo)yhce+8sCS%pW_ncr#KucJef_n_CE~<+9ZoIqX<093vKsxd2mT z{x)Lk-j3E)W~RwBacPPeC!PGy+O^wVVVpy2kIu@oVdib$0u{bsFr(!zUR0Z9C zdW_`F#(eDT>__Cfr)NjeQIbEu=rhmXwJ-%3HY0|Osi13PN?^w)hl$P186VZqHJ~Ec z!Py~_yO8oS75rEBx>9)3xe&2j%6UyaJcHVrqIlxDpkZw);~CW2l*bdF2@va8!b>&s zRBB3v@|4s5fM@tjf{7(R)T-55jeA|GBtd2=XMMzKA!7=)+LRG`(2%In%#*8hu+OBaVA00JNY0w4eaAOHd&00JNY0w4eaM}&ao{r`wWgfKt= a1V8`;KmY_l00ck)1V8`;KmY`s1pW^`C7~t& literal 0 HcmV?d00001 diff --git a/django_project/django_project/__init__.py b/django_project/django_project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_project/django_project/asgi.py b/django_project/django_project/asgi.py new file mode 100644 index 0000000..de1aa42 --- /dev/null +++ b/django_project/django_project/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for django_project project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings') + +application = get_asgi_application() diff --git a/django_project/django_project/settings.py b/django_project/django_project/settings.py new file mode 100644 index 0000000..cf3c337 --- /dev/null +++ b/django_project/django_project/settings.py @@ -0,0 +1,126 @@ +""" +Django settings for django_project project. + +Generated by 'django-admin startproject' using Django 4.0.8. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-#gdunjr!m#$qe8!9@!qpq5blvjvi#rqherh*q)fq%xn)ck-qqr' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'pages.apps.PagesConfig', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'django_project.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + BASE_DIR / "templates", + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'django_project.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/django_project/django_project/urls.py b/django_project/django_project/urls.py new file mode 100644 index 0000000..1410d34 --- /dev/null +++ b/django_project/django_project/urls.py @@ -0,0 +1,22 @@ +"""django_project URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.0/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 path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path("", include("pages.urls")), +] diff --git a/django_project/django_project/wsgi.py b/django_project/django_project/wsgi.py new file mode 100644 index 0000000..391951d --- /dev/null +++ b/django_project/django_project/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for django_project project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings') + +application = get_wsgi_application() diff --git a/django_project/manage.py b/django_project/manage.py new file mode 100755 index 0000000..5ffd8de --- /dev/null +++ b/django_project/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/django_project/pages/__init__.py b/django_project/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_project/pages/admin.py b/django_project/pages/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/django_project/pages/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/django_project/pages/apps.py b/django_project/pages/apps.py new file mode 100644 index 0000000..cdd024b --- /dev/null +++ b/django_project/pages/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PagesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'pages' diff --git a/django_project/pages/migrations/__init__.py b/django_project/pages/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_project/pages/models.py b/django_project/pages/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/django_project/pages/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/django_project/pages/templates/about.html b/django_project/pages/templates/about.html new file mode 100644 index 0000000..a57e700 --- /dev/null +++ b/django_project/pages/templates/about.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{% block content %} +

About Page

+{% endblock content %} + diff --git a/django_project/pages/templates/home.html b/django_project/pages/templates/home.html new file mode 100644 index 0000000..8143ee8 --- /dev/null +++ b/django_project/pages/templates/home.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{% block content %} +

Homepage

+{% endblock content %} + diff --git a/django_project/pages/tests.py b/django_project/pages/tests.py new file mode 100644 index 0000000..cfb6b66 --- /dev/null +++ b/django_project/pages/tests.py @@ -0,0 +1,35 @@ +from django.test import SimpleTestCase +from django.urls import reverse + +# Create your tests here. +class HomePageTests(SimpleTestCase): + def test_url_exists_at_correct_location(self): + response = self.client.get("/") + self.assertEqual(response.status_code, 200) + + def test_url_available_by_name(self): + response = self.client.get(reverse("home")) + + def test_template_name_correct(self): + response = self.client.get(reverse("home")) + self.assertTemplateUsed(response, "home.html") + + def test_template_content(self): + response = self.client.get(reverse("home")) + self.assertContains(response, "

Homepage

") + +class AboutPageTests(SimpleTestCase): + def test_url_exists_at_correct_location(self): + response = self.client.get("/about/") + self.assertEqual(response.status_code, 200) + + def test_url_available_by_name(self): + response = self.client.get(reverse("about")) + + def test_template_name_correct(self): + response = self.client.get(reverse("about")) + self.assertTemplateUsed(response, "about.html") + + def test_template_content(self): + response = self.client.get(reverse("about")) + self.assertContains(response, "

About Page

") diff --git a/django_project/pages/urls.py b/django_project/pages/urls.py new file mode 100644 index 0000000..a3d2a22 --- /dev/null +++ b/django_project/pages/urls.py @@ -0,0 +1,7 @@ +from django.urls import path +from .views import HomePageView, AboutPageView + +urlpatterns = [ + path("", HomePageView.as_view(), name="home"), + path("about/", AboutPageView.as_view(), name="about"), +] diff --git a/django_project/pages/views.py b/django_project/pages/views.py new file mode 100644 index 0000000..89c020f --- /dev/null +++ b/django_project/pages/views.py @@ -0,0 +1,9 @@ +from django.shortcuts import render +from django.views.generic import TemplateView + +# Create your views here. +class HomePageView(TemplateView): + template_name = "home.html" + +class AboutPageView(TemplateView): + template_name = "about.html" diff --git a/django_project/run.sh b/django_project/run.sh new file mode 100755 index 0000000..e9c6c44 --- /dev/null +++ b/django_project/run.sh @@ -0,0 +1,2 @@ +uwsgi ./wsgi.ini + diff --git a/django_project/templates/base.html b/django_project/templates/base.html new file mode 100644 index 0000000..692ea05 --- /dev/null +++ b/django_project/templates/base.html @@ -0,0 +1,6 @@ +
+ Home | + About +
+ +{% block content %} {% endblock content %} diff --git a/django_project/wsgi.ini b/django_project/wsgi.ini new file mode 100644 index 0000000..1270401 --- /dev/null +++ b/django_project/wsgi.ini @@ -0,0 +1,6 @@ +[uwsgi] +http = :5000 +wsgi-file = django_project/wsgi.py +processes = 4 +stats = :9191 + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..483da13 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +asgiref==3.6.0 +Django==4.0.8 +sqlparse==0.4.3 +uWSGI==2.0.21