From 837d60cc073c1df4f82ea443d7c52244c3e39277 Mon Sep 17 00:00:00 2001 From: Seth Osman <so00647@surrey.ac.uk> Date: Tue, 6 Dec 2022 12:05:12 +0000 Subject: [PATCH] Added second model workout and all associated webpages and tests --- db.sqlite3 | Bin 151552 -> 176128 bytes gymapp/__pycache__/__init__.cpython-310.pyc | Bin 180 -> 180 bytes homeapp/__pycache__/views.cpython-310.pyc | Bin 1325 -> 1343 bytes homeapp/views.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 184 bytes trackerapp/__pycache__/forms.cpython-310.pyc | Bin 1326 -> 2191 bytes trackerapp/__pycache__/models.cpython-310.pyc | Bin 1079 -> 1653 bytes trackerapp/__pycache__/urls.cpython-310.pyc | Bin 557 -> 931 bytes trackerapp/__pycache__/views.cpython-310.pyc | Bin 1951 -> 3498 bytes trackerapp/forms.py | 45 +++++++++++-- .../commands/__pycache__/seed.cpython-310.pyc | Bin 897 -> 896 bytes trackerapp/management/commands/seed.py | 4 +- ..._workout_weekdays_workout_plan_and_more.py | 41 ++++++++++++ trackerapp/migrations/0007_workout_weekday.py | 18 +++++ ...lter_workout_plan_alter_workout_weekday.py | 24 +++++++ .../migrations/0009_exercise_workout.py | 20 ++++++ .../migrations/0010_alter_exercise_name.py | 18 +++++ .../migrations/0011_alter_exercise_type.py | 18 +++++ ...days_workout_plan_and_more.cpython-310.pyc | Bin 0 -> 1438 bytes .../0007_workout_weekday.cpython-310.pyc | Bin 0 -> 847 bytes ...plan_alter_workout_weekday.cpython-310.pyc | Bin 0 -> 976 bytes .../0009_exercise_workout.cpython-310.pyc | Bin 0 -> 796 bytes .../0010_alter_exercise_name.cpython-310.pyc | Bin 0 -> 648 bytes .../0011_alter_exercise_type.cpython-310.pyc | Bin 0 -> 732 bytes trackerapp/models.py | 52 +++++++++++---- .../templates/trackerapp/detail_view.html | 4 ++ trackerapp/templates/trackerapp/index.html | 6 +- .../trackerapp/workouts_create_view.html | 11 ++++ .../trackerapp/workouts_detail_view.html | 14 ++++ .../templates/trackerapp/workouts_index.html | 19 ++++++ .../trackerapp/workouts_update_view.html | 11 ++++ trackerapp/tests.py | 24 ++++++- trackerapp/urls.py | 27 ++++++-- trackerapp/views.py | 62 +++++++++++++++--- 34 files changed, 378 insertions(+), 42 deletions(-) create mode 100644 trackerapp/migrations/0006_exercise_remove_workout_weekdays_workout_plan_and_more.py create mode 100644 trackerapp/migrations/0007_workout_weekday.py create mode 100644 trackerapp/migrations/0008_alter_workout_plan_alter_workout_weekday.py create mode 100644 trackerapp/migrations/0009_exercise_workout.py create mode 100644 trackerapp/migrations/0010_alter_exercise_name.py create mode 100644 trackerapp/migrations/0011_alter_exercise_type.py create mode 100644 trackerapp/migrations/__pycache__/0006_exercise_remove_workout_weekdays_workout_plan_and_more.cpython-310.pyc create mode 100644 trackerapp/migrations/__pycache__/0007_workout_weekday.cpython-310.pyc create mode 100644 trackerapp/migrations/__pycache__/0008_alter_workout_plan_alter_workout_weekday.cpython-310.pyc create mode 100644 trackerapp/migrations/__pycache__/0009_exercise_workout.cpython-310.pyc create mode 100644 trackerapp/migrations/__pycache__/0010_alter_exercise_name.cpython-310.pyc create mode 100644 trackerapp/migrations/__pycache__/0011_alter_exercise_type.cpython-310.pyc create mode 100644 trackerapp/templates/trackerapp/workouts_create_view.html create mode 100644 trackerapp/templates/trackerapp/workouts_detail_view.html create mode 100644 trackerapp/templates/trackerapp/workouts_index.html create mode 100644 trackerapp/templates/trackerapp/workouts_update_view.html diff --git a/db.sqlite3 b/db.sqlite3 index a2ae44a3236ea3f403046c24a13c11707437cea7..d5b662d186ea31f45cd6375642f024d3033c0174 100644 GIT binary patch delta 5367 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 delta 2267 zcmZuye{2(V6u)=(?e5n0?rm$kZtKdf+sYW-EEN`l5I5OC+)rXKNC<R=HZZrfwLh4P z(T)9~F-T;)gfnR3qW=KVP1BI6U;xEP#E2$fqJR(*H4;b`i9Zse_`U13>y#z8e%|N% zzVE&7yU%^!_zm;;bnziqX&b{ZUi#G02k6r=*|gHp#yqsO)1)zYkN#(zcu#bHkea|! zxwmhNOc{qu)Od5b!k73n9{EObro8I5sbYi?um$i}yo4vQ6A$1K3}OqqGM*KHV>rV2 zAsQJ822+X9?!ibR6pshvL!qe2CUQRbA4w<~N~iV)<B`PhKr%THi^>iQ7Z3_OM`DS= zSUQDxl(82V@LE{0nDYpFfIW#=I<6e?my|QMERzrE<hYffoVD6OP%im>l}<A~nSlKa zeumRHi&L1!e!PR<WlH-up|YvfP91l&R(J3saX9q)(#c4oNFolWZt1y9HsbK;W<F7r zlo6*JLgC?o=um7=B$`T$DwkXR9kQjH!JqIPzJo7e7}ud)nwKs}(^6XMm6nQsiC>D- z;)J+Ud_=6W{$ssr{n+}Z^;v716)iU{XDqK<;+Agu4v3|xRyHx<Z5H+o&?YA%ddJ#B zQCYKP!(LiLeHsIT@<XS`za)!y?+r!wL<)CgncN=PP5tV8g0j5J#aC0@yqZ_KyO#1U ziUVtTWwdKKUuEFq6jxI0YvGkEUG-xX6xTEq={0Gc$`_;=vXidX`HI4kp-3tc%&lil zS@$T<dKfk4Jd6T0v&um|+}@&4IGhhavA%nWoeCK|jV3+4{%Z31b*t7!*S*aqqkz1J zQ9;(HEbF73?{<4jDXwWSY02`=S~lHSRzg>OD~V$6spFAi|7xPF>S^F51Mi|(q_{Ca zltVop-b!&pfKxu~k$DTnz7|fo-c!$;4Q%eMuP>(9>*utLIo)Vy(2`PH)`gUr@3ljR zEFNU=F5bj%@l$*s-=KO*Qt@`;DwNS8-IcCLpGzmCx24yl7p0iAL+X;&N?yq--W9J> zm7SnEJ4ltZK^!Y1;DtpxlI;W<K`{Dch^Zz^F4oVIQUY}#X!ROy?s5Xn!0Yc|cPyHs zC8tK?k?INp0pN|01q-gR?1~Y$V5Q1Izz4h*yMV1k0yVH8u?oF{LQy%hj1f>%O}RwC z4SCTxN(gu$CzCOHUD)*=EE0w-OBqr0H(sWvUXVknULetry71|jI0^WH7$;reG0PhP z7x*zrZ!FQyxxk7x0u8|Fv2#kW>iIY$a*nlRStD+aHS6Us5>l~Fv3f}3Divtz%qzj? z<D85e6#kpX=;i&ll-Y3obU%mih03=<4PpCWN?qOtLG{%qz&<%IsKIV%QV(~)A9MGI z0ob|o?XadgVE%<EV-k#cUGXvDnow4BtH^E|X8+_4aA(+a@HP7~tY#8ac>AosOKE!X zJ~KJF76l5J{p%m*oq+&M_|+E%p;0~cE-R?%S+-0)GYDJdCb@Pb5*ZAKMw7MjzEFZ5 zHL+|>qduT|pX%<OJGl#z!ra**coc|~W~I3ckAaz;8=qmvp@@#Q1KV4a)0PUg`6ycw z(56K&@SxE|ha;@l>KSX{o$Wr@?;ePTBhM-EDwld}hJ9L_79Tl%KA5OeJ7?KCs8ge} z?33!9FrYgB9&1%UnPuH<qd5aN?)OcN6T5&x25;kK`iaiqTR4d+4AR;1I67?tVcag` zn@JkKE?(Vv5vtpZ2;*>Q!%P#eXrh)=v$7&2)bwcPf>=s9!Z_WFrp?^ti{M)^H7*GB zlK2_F$FFGKQ`lyq+p#h^9E;L+TIjw7gDo_mz|hXk;w=V$!&@}UHT3d4XM@d~yG<fj z0~^yrL-P7qc$8?pGyZDvFm>%hb(^0(YM~^H+Za5K+bG+EY@bQp-pcloEyTpAGp+2# Sih<!sKG1&>{)pud&i5}+)_^Sl diff --git a/gymapp/__pycache__/__init__.cpython-310.pyc b/gymapp/__pycache__/__init__.cpython-310.pyc index 666bc96845a78c21461322770bea24690e4245b1..3833fda7aa71c02fbf6a2ee5ce1796a67d79985f 100644 GIT binary patch delta 19 ZcmdnOxP_5BpO=@50SH#F>YK>D5&$jj1u*~s delta 19 ZcmdnOxP_5BpO=@50SGjgc1`472>>d%1f~E0 diff --git a/homeapp/__pycache__/views.cpython-310.pyc b/homeapp/__pycache__/views.cpython-310.pyc index 296d724deed4184ab577fec37c9696ee0262889b..09dbb128bc8dbc41d6f7d9720ebc17eb4555af0d 100644 GIT binary patch delta 56 zcmZ3>wV#VOpO=@50SLb8_9c66<Yi(Os}d>BH!v_WF?T2~Eh<W_)Jsg(E6v_4%-qGu Kcx&=JmVN-M4G^RN delta 38 scmdnbwU&!FpO=@50SKg)^(32b<Yi)JiDL4t+^ovn#mE>nc>_y70IFyShX4Qo diff --git a/homeapp/views.py b/homeapp/views.py index 755b80b..36cb6d6 100644 --- a/homeapp/views.py +++ b/homeapp/views.py @@ -20,7 +20,7 @@ def contact(request): email = form.cleaned_data['email'] message = name + ':\n' + form.cleaned_data['message'] try: - send_mail(subject, message, email, ['My']) + send_mail(subject, message, email, ['so00647@surrey.ac.uk']) except BadHeaderError(): messages.add_message(request, messages.ERROR, 'Message Not Sent') return HttpResponse("Invalid header found.") diff --git a/trackerapp/__pycache__/__init__.cpython-310.pyc b/trackerapp/__pycache__/__init__.cpython-310.pyc index 0c449de316b3bc65bf9e830342afd4b0cacc069c..bac0ff2dcbb91cddd76e660d5aac835a9a52a5ca 100644 GIT binary patch delta 19 ZcmdnNxPy^9pO=@50SL~l>YK>D7630t1zrFE delta 19 ZcmdnNxPy^9pO=@50SK-f>zT;C7632%1%Lnm diff --git a/trackerapp/__pycache__/forms.cpython-310.pyc b/trackerapp/__pycache__/forms.cpython-310.pyc index ae2d0dccf51ddb69661e5ddd3c76e22b54dd4013..f573af21cdd39d7f8960202a925d191d1ef09332 100644 GIT binary patch literal 2191 zcmbW2OK%)S5P;{=^V)}FS;hpEz-A*v1_j57Vh&b>47Ni6WfNr`8IM+4ji)>7vFEXL z&tiM8;e-_N2Yd+JEb)u_%E{uG8z4kg&#t|)HyjvgYPza>s(PxvuF325iU!wjcYcoM zVDvjGlNSMH6>jke1l6dXXsI6Px<(CZCPr!oW=aB*T7ji&Uul$3>qm`ROy9F#nt=lr zn>t`|Mi!U4ZO!*i!JFpm(t45eRGjLlnUXwB!c00_Ip5C*g>*L#8INMYB3wOrnV_t~ z{pNiTObc|X1qQ^@sR6N!mquVx6XFo*qRWR6<dP3(<U@Qp;e(k0K`%Wcu$aB)P!qrC z*r4_+9ds9Thq~0Gm1BZ7T0J%bkJcboeOMpIT71lkP?9W6nXFPKA|CgPIM1YqpZg+a z2_1U4xY2?oCx*15Bosnc`$-tF-8`X;pFncLqTpgUt5&X`yE%Oic6|B(gim-K9()Fb zBs@P5l0<nTe1m&v$J)01igdeO+)TGCE8T9I(?NpcTDSZCAWX^`j+K@cOtM7UYL9{& zX!ADNVexg=$BN)E<SdlVK}>tB5GNYHj*(FO`Q6$|=eb~9blOik>v=RtSyqV7^DJ&) zO*`Aq?sc}<PGg<@z>>U=vz@hkzy&+N>E2Nq_WPZJhtWRcI8<~j_KzgNjJgm*Tm#{1 zM0a&!7`mam{}6&tHU7Ku7yl3zv`z?r2cCQZ#k(lbe7@Ck^a0w?s|EKPOn|G+naXkr zm$QR#8<tH+4gdsP06@aXo(1^Z)B-SUSsf8QmBTZ~-%L104w<!Q!|gB=xYL0(<CPwG zJqYrv9#mkaifmFF=yZTi>vioHjk>^Noq7<qGMt?VtB?eyoM<<XBPL*ImnHN~#R^oE zv3(jsu7SdgS7A59+Q@_Al-Iz-uYefibqmHVf97JUF`N7<3dK)#O@(}j*h{<35*7hT zTN@kSu79!J<{#riB%0%4meofwr7TmtaV+-KqG2_0Qp|%u92N}MAZ7`KO-2}8D&n|r za6J4z8D5>t(74-7trAkQ3b*(P#JK$br%I}7?s?Ue?oH@5sA}cy`s+GWxq55|Go!9^ z{cYc%O3rV>e)&fre5b54DUSL~)&wiMob}=OWreIC!1;@_-WH2{yM?Td)Xf+gn9G?c z)W|_IH0F|x`Z!+~;22(Gi@n9h-KC}d-fes&JL1+8)&Ii8AKu6GhQ&&w*=9wfHAr_D zZyq+EvHnPDsMnVdmzxuB-59@>#@V1?Vg-H*c}6E3`*zv#7V&%Upjbk27sWjgE&s|z zPHmh!<COcTegZ;To7+z}+Wb>AoRjHc5=t(y2mCjjxC3z?gn|>h)d<eATaCNc<tM=V zN7=)81EZXE*YlPoYva^oR@7c@;L>FfEhzJ}&R2Hw$JpKRCAD^%Z{7qa_{{>d<7zYJ z!mP5jd{5eRFU)#*d8}>qs}SnH!PSvh`TPuCQyo;jH7$g6AC$kK&+)e}@MP7rd40}Y GnEw}ovF<tm delta 714 zcmZvZ&2H2%5XWQ3ah&~9TS{qRw=EJv3J9J7)DNV>t}6CWkqcU7+>&kDfRk!PFMEIs zhZU-F<psDP@dUgEG7{q2Gk2DmutI#)l7AWh$1`^Remno6*2<dAnuFukqe=W(oVD6) z^XztKmpKm{5a7Lbz|(B#y>cUoiUc1Of2R1L`c4>}Q+>#+x1X7#{G8E>Td|uCj;+6! znZxX)D8Gu8kDpw&+Q6)7BCIgkD7PZc(mdowksg%a7|1q-?Q(~|*;vJ}_g<Jqk}eaL z2qc?d+kQtKihP8J^SeMOXTddo`9*Zb5|^Q{_1SH<@uD$Ge+{a;hcn+nXeVOeL|nU( z(B4pLcj)6+0Rx^ea3>7Jghv5*AP;y{Lzlc^9XOyT?>OZX7BwJ1e`=?5<3G;5+ttOu zR5p<DriDPe{P<ax#5%Wfl)!;5DnqOqX?+NTm-%U9)?&RkIMSw$MZK{3uP^iq<_du$ z?4|BWS|ra?J>ICAZznnh8|-auJ$$-(|4HB09}ghO`a0EdVQx^}GGT>qjc}32WIpNn zRfKW`Q(Q2?<Wx?TkS=GOsUK=uJyOrCQJe6hKG!i*owQC{Xw?f<c}K0?v_Urmozg2+ UFIpx4yG!{(Ez3E!;4Urx1plp){Qv*} diff --git a/trackerapp/__pycache__/models.cpython-310.pyc b/trackerapp/__pycache__/models.cpython-310.pyc index 84a554fa244aa1015b3c056792967e49b856c177..63a4c3db3074499e3a56b54077552cbe540696eb 100644 GIT binary patch literal 1653 zcmb7EOK;mo5MFZm)+32)r0>?qp#|H*ha8I{u%Sm$1a^Z+fnY)aL2D-xZHiQO$;8Sj zKzcR$7uutLOaH+FJ@w?j&_mG~Qf=bcJ(R=_=drsVcfOe|I-P*w^ZV}4v)>%X{vhM+ z$3kNdhZ>>~Oc)tk8j)eJ@0l<K|A`3>#)<iwM;twtu+d|0JQjK!;iAXgcx>T~Sm<Bk zUMw`Uvn&K;YDVVUkB!D24s{;|u*eWBGJ&61!XQv#o%6^B{)_V~i(CY;g@Yi@YcukM zivXUs9%V^>`3jehhZkH2%j7K1AfJ~D?NoXCtO9Kx<CN2D*c{jF;ZUETxQabT^mAiw zM7H3FV!iYUW%mHeL|b{X1Uk~w6f&U>Lq~gYOwKsgK^)^rtBmw^96zg)tcgeyLA3ot zF5pbNDSbd)FnJr@wfOU>_wDqF0;#5>AE*6dRxKef)$~c8?o0}KIz4)Pe>#EVojyE= ztXNTW+AAul;01-}>t(W9O-q@~PC=5|q<nX^))xJ^Pe&z^J+^JgEmRIeU$zLpO`=1h z{!72NNaT=CCux!P$8c8Gwr&YfGnuZ+w8-l{-W;IO?$9ojSsJQ~!efqM;_Lk7@h!8C zU8CaPGT6ff|4<=}h=X-vH-#W<ECr{w9pJ(h9@;M29{4B&;h&pPO9V()OS_b@qAEi- zG_`Y3<RV$i_i=AD-Ejqq><=2-pMc04&xei28!s@eH07hl;S6O;=Es}(C@CvR4yqhN z7*#dGr)Ww_@pvfdNSBnp2y36B7hGc7G40M4MLGkeT>(#%Dl0Dx?H75B{Q)H$hV6Ga z(cWY*c-Y@R8rAH`_i&Sj7xx9gDekO;VId)%=MQ0B=U2PE{ZVhfKhV|+>-I*D?&3DY zyCTJ7mgxiyOAc?o+gwuUzqu+g`aij{g^x`gAX8q=WNTwJ406#vH=<U}W}~-J??4yj zEz!YMw?!BEy`{au8OT|xAmo_-;4!FFl}SDW`4#>Yy1awpIL*>>Ex&FYPA`!nE#x<7 zUZIFC#VC+(cK93}msGu>SraBba!{X!My<<xs2_%R-r*^-$48F_*GRI;^$Mc4f-;t{ z!iLSus6!o_=JN@XwkUO{U&(|zs_wC<wTX_?B}5+nSxK7w0#R#5<d>*LF3rLczmeP! zXYAlmpP@i<4ad1kZkKnBHokZh&|JF2d~uTG^I}&VZ|<rCy0YtfYG7&NO=#NtuDSCb Q7z9b_YO^hK%fGw*H;+4WLjV8( literal 1079 zcmZuwOK;RL5VrHq_5oCd3mkflgertMA%u$hKnS%UcB@sRNKv|;?q-`!wst~WPDtgt z|DhcDOTKdIfeS|th#Bve7FtIhkG~nuc;<7eg@qQwasFe{`)M)uoi^8pgPS#+>KO{b z1TWZ#$DFg*OjyGH!h{WcXr0-yjff*$MBEwT2(Qf|{{m04h-+_D2`E&Lw%5ns6i*NZ z7IVR33+$mIIHj0au?zOO_m#!|Rf;n!4yNI?^S;Q+i_dtt6Ir@7%1+V(%6>i2UQ^~r z4cy3Rqwg9{^$5kk8T*)X!uvdSg^ibYK7|y0bsOqTJ7qQkD&!!CLa3d{(?OaNn5Mdw zrdVH7kUpQLM@?2tEfU+xwELzMaH9R37Es@qTtwK2UwiA%lU)T;CGB^~M%8OZP}VBh zE%TLbB@dIm4^NXW?5}LVM<}W>S(EjukqVB<+&>*<<8e~Utak{K)M=wv$EVt%i~Ce6 zbva<mT;4@xCkkaq`H6fvN5b4PTpwg|i>i}!NQWIbsm)%`2~a(mkL$cDO^mAorrI5f zLY<|l0u%vT<N;r@40?kE7d_U<^)ZS|5(JNJaE7iSp2wci9k7KfyonwA!beg9?NeW> zrjC4M9N$$bvQzDCn>DgxzivPg<aeeDV&O4}a*BrCOBL~;9$+WQIq1wZM7;x<o0wZ> zB|nwbjWmAknMQu9q1^Hz)*z|H5tmfhh3W2n0&D|lzc;Az9w_Y#ILMl!-id<$IEcgU z=H}aU<JDf<&>`<pR3ah{jsXrak-D|(%jiN(Dtc1^bNGDA;}(9c-;!)Qk*h;7%*uYX iD)wg&a-04}LyhsdEwBz=OyBfNPSHIS^K8j_;Qs+v9s8RA diff --git a/trackerapp/__pycache__/urls.cpython-310.pyc b/trackerapp/__pycache__/urls.cpython-310.pyc index f76da26aef7da98c7da2ef0a91c6b10cb51e9a40..2b9b011d2fd7ed51da148659cb42df4f0a0bd526 100644 GIT binary patch literal 931 zcmZva&1%~~5XV=RoH&*($8MW6fkLjn#E@eMreGgSTN+$bAuy_Ea24x|-BsM^9oqLO z^ey@py7m<46ZF(sX;q~kE41uy=D)LljW+4`yNt%OZ=cszo3ZZ-9u9}#Ilba5O~Aki zS!B3|!Jq|Z*osWoG#DCSp?PCL8}>e#MEgW-=x911+Jmkpn`j?;n)*Z?a5N2w4&YGJ zkf;kIO^=9dc&zCOQ4fwZ9TWB8siIBSb>QThjZg2%F&i6&mHP6-y-`8?Ho%=InA?}! zUvH7Gf*A0llEr?6dFLvK<z>2^x=t+slztEvW{f-6u7d=*Q)vU3P7ngw?8s8^CFX}s z9xz0SjiTaw)F^fd-zJ$9u2ZinXZfh+Nh#jZaqggwttxZ*(Z7Wz%5U$tP#He1sVP-C zZ|Z65C;w6EZ)mht;N^Hw*l^>=o8&y>q2Mj*G^e}7xJ8rOEgQU2eRrMLp&!r7e!f*~ zuQ^hus-#_=T>@1sJ62@|%c?mq0wK$NLmhZfYBVcL>4Yd{qeb~6{)i3dWnmptvce|Y zbVnreSbSmJR@T+@b2+>876Q5Ou3vfcWSvDAOW`fz;7slJ-o3f-miYc`j<*;lsmgk@ vB;x{iD!sXj{519Sl~GI8pY!yt=v+k!WFbz~trVv;^;pkvET{GN)A{iWgcc^Q delta 190 zcmZ3?zLrHhpO=@50SI1y?n#znVqka-;vfS~AjbiSi_<1*Cvv5;MscR_2Qz32OuS>t z$!U|BS7McynKD_DQPnv$C9^~yCSn)GS5lOioSj+}Us{loSdv;Lkdm5{T9S%Q1w_VA slWVdYlO`v3N@_`BW=?$B<Z33Z$t=u`A_74Bc^G&Y`B?avAdur508M@{RsaA1 diff --git a/trackerapp/__pycache__/views.cpython-310.pyc b/trackerapp/__pycache__/views.cpython-310.pyc index 313c61e74036e97eedfeae17dcbc06946de4d98e..e6deb63d294d9e91c5c811c1526e55996016638e 100644 GIT binary patch literal 3498 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 delta 873 zcmZuvzi-n(6!x8e)OKvgNkeGWq)G>>T2W9XI#%t%!a#(?fMkZs&AG^pe?(^oP!*H` zCZrD0tw_wU!oq*R2D8P$U%||KcKIQwPyU|$?(Vzyeed3Hy=^*~ZJQE2ul>u(7j5PA z$n({3|GvW1SWgV!NKD@(5>uEKHxkRY65F@oe~sy{B;R2MGa)uvgIN$=W-|w3i#3@G zvCUc!C9l2ub}WYE4Kc-MG9s?{L86upXXYA!LL6cd-WD_3zcYYDB)y=8RFDN><dQBZ zqlZ#K7ZQ^f^rZ}Z%Ge_%olQ$+76+;LByW#pPGKiUC0qvZWbQyH<uqcviCOnIv~Z%q z!Xk*`lc!Pm%!b5ODK3`M{V-H*qG5&nra01iL=%s-(LH3W$u{xpU&aX!gCeXL+sN1f zKyfC~VYv8GodW+rczR!aH=^}-pd(_SMvv0G2+~P-A-?L}4X5D2WE%35x=N4m8+hWT zI5YQ_mB_j{Ol~3c5YSEDN7zPC5Gpg&%8Z%=%_!yU^qgNSVm@QPL=0eMj!G0TrA>5- zA}sI)HS9vWI^tM0#D3#oxdW>%I*&3w&F0160d!?>H;ls~WPAgrytO~=DK%EjTvzQ? z*XlxV!N&hQuJ=|Rk6=DW8!Y0~_VPXW8++^Gqjj)!*m;mX$!<@wwBXTcbzG^QWjx7w zWu5_xOD)NOGOsUA12P;1^De>wVHW{;|0<<we07WTL)br$!y^JKs)l!<91DGde#^QF H!?En2Xo;pa diff --git a/trackerapp/forms.py b/trackerapp/forms.py index 4160775..35603d0 100644 --- a/trackerapp/forms.py +++ b/trackerapp/forms.py @@ -1,5 +1,5 @@ from django import forms -from .models import Plan, Workout +from .models import Plan, Workout, Exercise # plan form creation class PlanForm(forms.ModelForm): @@ -28,17 +28,48 @@ class WorkoutForm(forms.ModelForm): class Meta: model = Workout - weekdays = forms.MultipleChoiceField(choices = Workout.WEEK_DAYS, - widget = forms.RadioSelect(attrs={ - 'class' : 'formfield'})) + weekday = forms.ChoiceField(widget=forms.Select(choices=Workout.WEEKDAYS)) - fields = ['name', 'weekdays'] + fields = ['name', 'weekday', 'plan'] widgets = { 'name' : forms.TextInput(attrs={ 'class' : 'formfield', 'placeholder' : 'Workout Name', - }), + }), + 'plan' : forms.HiddenInput(), } - + +# exercise form creation + class ExerciseForm(forms.ModelForm): + + #Meta Class + class Meta: + model = Exercise + type = forms.ChoiceField(widget=forms.Select(choices=Exercise.TYPES)) + fields = ['name', 'type', 'set_repCount', 'workingWeight', 'workingTime', 'restTime', 'workout'] + + widgets = { + 'name' : forms.TextInput(attrs={ + 'class' : 'formfield', + 'placeholder' : 'Exercise Name', + }), + 'set_repCount' : forms.TextInput(attrs={ + 'class' : 'formfield', + 'placeholder' : 'e.g. 100kg, 100lbs(Optional)', + }), + 'workingWeight' : forms.TextInput(attrs={ + 'class' : 'formfield', + 'placeholder' : 'Format: "Set Number"x"Rep Number e.g. 5x5"(Optional)', + }), + 'workingTime' : forms.TimeInput(attrs={ + 'class' : 'formfield', + 'placeholder' : 'Format: minutes:seconds(Optional)', + }), + 'restTime' : forms.TimeInput(attrs={ + 'class' : 'formfield', + 'placeholder' : 'Format: minutes:seconds(Optional)', + }), + 'workout' : forms.HiddenInput() + } \ No newline at end of file diff --git a/trackerapp/management/commands/__pycache__/seed.cpython-310.pyc b/trackerapp/management/commands/__pycache__/seed.cpython-310.pyc index 5a480b20af26037ff28f9985ee4a5db6866ec3cb..1dc651e47c81ce702750d584ce88c67b94d1884b 100644 GIT binary patch delta 34 ocmZo<Z(!%m=jG*M0D_;-dXxD#^6q0~i(+xf&r98WiE%w60GqT5D*ylh delta 35 pcmZo*Z)E4q=jG*M0D=$CdXoh<^6q0~uVPKf&r8+Ye35ZIBLJq`3X%W- diff --git a/trackerapp/management/commands/seed.py b/trackerapp/management/commands/seed.py index ec86950..99fbf99 100644 --- a/trackerapp/management/commands/seed.py +++ b/trackerapp/management/commands/seed.py @@ -5,9 +5,9 @@ class Command(BaseCommand): def handle(self, *args, **options): Plan.objects.all().delete() - p = Plan(name = "Full Body", description = "A quicker workout covering all muscle groups for people with less time") + p = Plan(name = "Full Body", description = "A quicker workout covering all muscle groups") p.save() - p = Plan(name = "PPL", description = "A higher volume workout that focuses on different muscle groups per day") + p = Plan(name = "PPL", description = "A higher volume workout that focuses on specific muscle groups") p.save() self.stdout.write('Done') \ No newline at end of file diff --git a/trackerapp/migrations/0006_exercise_remove_workout_weekdays_workout_plan_and_more.py b/trackerapp/migrations/0006_exercise_remove_workout_weekdays_workout_plan_and_more.py new file mode 100644 index 0000000..063e36f --- /dev/null +++ b/trackerapp/migrations/0006_exercise_remove_workout_weekdays_workout_plan_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 4.1.3 on 2022-12-05 16:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0005_alter_plan_name'), + ] + + operations = [ + migrations.CreateModel( + name='Exercise', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128)), + ('type', models.CharField(choices=[('resistance', 'Resistance'), ('mobility', 'Mobility'), ('cardio', 'Cardio')], default='resistance', max_length=10)), + ('set_repCount', models.CharField(blank=True, max_length=3)), + ('workingWeight', models.CharField(blank=True, max_length=16)), + ('workingTime', models.DurationField(blank=True)), + ('restTime', models.DurationField(blank=True)), + ], + ), + migrations.RemoveField( + model_name='workout', + name='weekdays', + ), + migrations.AddField( + model_name='workout', + name='plan', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, to='trackerapp.plan'), + preserve_default=False, + ), + migrations.AlterField( + model_name='workout', + name='name', + field=models.CharField(max_length=128, unique=True), + ), + ] diff --git a/trackerapp/migrations/0007_workout_weekday.py b/trackerapp/migrations/0007_workout_weekday.py new file mode 100644 index 0000000..5ab3e4d --- /dev/null +++ b/trackerapp/migrations/0007_workout_weekday.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.3 on 2022-12-05 16:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0006_exercise_remove_workout_weekdays_workout_plan_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='workout', + name='weekday', + field=models.CharField(choices=[('monday', 'Monday'), ('tuesday', 'Tuesday'), ('wednesday', 'Wednesday'), ('thursday', 'Thursday'), ('friday', 'Friday'), ('saturday', 'Saturday'), ('sunday', 'Sunday')], default='monday', max_length=9), + ), + ] diff --git a/trackerapp/migrations/0008_alter_workout_plan_alter_workout_weekday.py b/trackerapp/migrations/0008_alter_workout_plan_alter_workout_weekday.py new file mode 100644 index 0000000..d2ee5ae --- /dev/null +++ b/trackerapp/migrations/0008_alter_workout_plan_alter_workout_weekday.py @@ -0,0 +1,24 @@ +# Generated by Django 4.1.3 on 2022-12-06 04:19 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0007_workout_weekday'), + ] + + operations = [ + migrations.AlterField( + model_name='workout', + name='plan', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='trackerapp.plan'), + ), + migrations.AlterField( + model_name='workout', + name='weekday', + field=models.CharField(choices=[('Monday', 'Monday'), ('Tuesday', 'Tuesday'), ('Wednesday', 'Wednesday'), ('Thursday', 'Thursday'), ('Friday', 'Friday'), ('Saturday', 'Saturday'), ('Sunday', 'Sunday')], default='monday', max_length=9), + ), + ] diff --git a/trackerapp/migrations/0009_exercise_workout.py b/trackerapp/migrations/0009_exercise_workout.py new file mode 100644 index 0000000..b7942aa --- /dev/null +++ b/trackerapp/migrations/0009_exercise_workout.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.3 on 2022-12-06 04:22 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0008_alter_workout_plan_alter_workout_weekday'), + ] + + operations = [ + migrations.AddField( + model_name='exercise', + name='workout', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='trackerapp.workout'), + preserve_default=False, + ), + ] diff --git a/trackerapp/migrations/0010_alter_exercise_name.py b/trackerapp/migrations/0010_alter_exercise_name.py new file mode 100644 index 0000000..2a5d61e --- /dev/null +++ b/trackerapp/migrations/0010_alter_exercise_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.3 on 2022-12-06 04:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0009_exercise_workout'), + ] + + operations = [ + migrations.AlterField( + model_name='exercise', + name='name', + field=models.CharField(max_length=128, unique=True), + ), + ] diff --git a/trackerapp/migrations/0011_alter_exercise_type.py b/trackerapp/migrations/0011_alter_exercise_type.py new file mode 100644 index 0000000..8bc15ab --- /dev/null +++ b/trackerapp/migrations/0011_alter_exercise_type.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.3 on 2022-12-06 12:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('trackerapp', '0010_alter_exercise_name'), + ] + + operations = [ + migrations.AlterField( + model_name='exercise', + name='type', + field=models.CharField(choices=[('Resistance', 'Resistance'), ('Mobility', 'Mobility'), ('Cardio', 'Cardio')], default='resistance', max_length=10), + ), + ] diff --git a/trackerapp/migrations/__pycache__/0006_exercise_remove_workout_weekdays_workout_plan_and_more.cpython-310.pyc b/trackerapp/migrations/__pycache__/0006_exercise_remove_workout_weekdays_workout_plan_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d0553fc8166fd910d80efcb61f492d79a3e0626 GIT binary patch literal 1438 zcmYjR&2QXP5VxP-dcC{eWYeaBKubfB5WcJ;1RP3*8a53=C@o4;MOc<BuV><T*I#}1 zrrn;9;JVzoa^qim2QHlU58wdeYo5Ky#+KiknKv_@`OVDB`~9v)&mVVw3O_P6?RUl8 zd^j<W=_`k{fChS^rMj!9%w@XbSz@^SD-8_bKWe~HpR|53+!nCsn$ud6jpi`fP2)%e zRh(y~G}9a~DW8Vw?B-(=^O(N!H(F40b<kV}dZfDs@(Fna1I<YrIK3?}p}pYe3@nma z(1GqkC$6WsNCW#99r~~Vn+t=agIb5f7Tj7e;%~3`?G=BA_zrp9seQb4lZ)E$_JYy> zyRZxIz`HfwBl<3B*>Dg0lZ}Zv*_;gEJ-ELxD6+i;C;ctbxr&X$`wIpS7DmL~TX2t% z`9OA#uOLzQR3ZqcD1xGJxA*t=KlOv8Lg5!lkoj4VqO_j8MiIs(N*2TEkz`*VI$YYp ztjhgRU{E2*ULoQ%5OaTubJ;0T#6c3jL1|y280RH6p1AV2{GKp&bSg~n+D|Zxstd`h zd4Z0h!Vy@;Wff#0%I?WEO(#~GkK-h+=F&P|Q6x3PKtP;Jb5!qQi<~c2TRDbohZlJq zVkz5z=fNzg#3mg`yTr;DSd8*nRxJ&s%VcXz`A!>!{;OO}<19MEIJ&5o17*}($xh=G z9bMd2GK*rZY5@~{B{0upOrUhzN;#iZuJsCW3c<Wonbpl#1JP)61@Y52o9hA$mBcZ` zu5#ANGoQK@E5g0X9WEY_w6Sc}|B-`&0zh$zq*v$XuqFX>mc=h;1nAmEd`Q;LZE5*+ z1iml3zE2U&5+vI8{g<;KQRPt_V1XH67RFc#rh@5>>Ovo@`4I{-X@40<2h;*bDrMOj zT?C>b`-ih;-Ws-df@yw<4PzYuG*tH}7X)wi4fTr&lOT(7$zUw4I%S$x+5YzA+3Azf zsq7x8hFqED1+{8D&A)2mp+ZD0fBigq=)E8;O7HnI?=TN%DP~pay~yIdGpdF6-O0z^ z8IJc3@e-4~P^TW%UzDgy<wf(9`rlhu!du@O9u383KCWhf8b_t$uPW?c75G|E&rOg4 zfh%xW%!Rte+Vqu=Xt6YA@c(#=>Dz2W-_Zy3ZqUpA<o|M;=}f1ct9?h&e{)mOw$A^t zmbE9xl${2yA&l$VH09X677m+BZg>Tx_=Nsj+ph6ysL$y@T92A8_(E4P(lx9Nn5FL+ F{{w_wsoDSl literal 0 HcmV?d00001 diff --git a/trackerapp/migrations/__pycache__/0007_workout_weekday.cpython-310.pyc b/trackerapp/migrations/__pycache__/0007_workout_weekday.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d29a94683d9107e0311c23c5b4a0421e7eb9800b GIT binary patch literal 847 zcmYjQO>5gg5Z#qzOEL|VP<qa#1z$oarG>VX6o>Sb6zT+1BUm<?i7iLcs=HDW-wN$D z{Sm$OFYUFb{DneEXV=ch!p_dTd7kmkTd9qW0i*R~>u3HgVC;_z9<GRjUE1b38DPLm zR`DsXf@#3nM+O0eKNy6_7vcAC8bUN?!`?M<*)Xt!s+ein7OFP3Un#)S<SzAaB^2z^ zHZRE_n{r^&0QihgLyQ(Z*8uyAc*Y?5#i0j%h_6COu0moYkW#yWO%HDSxTdX^`59{2 zH1_Sz&dw`=m#Fi?pwL*Ua}*a!pQ)}D7l>ydm*x&=N?8k8gQ%278?Slftcb&y%F{h+ z`jPD)_>+*h?a(+VK3X}1r56bG3QZ@sF5yW#@3bc;M{Cd3Jk^D-x$jTMGqUZp!;<mZ zb3D_ndXN37QyST|GsDov`CJt_8XE(i%C2l_`tnkgSkKxy<p+NLqLvlf$lKm&fh8Oc zQ=15n3t<O>?hajv<UbPPYbQ&`brE2LHDH|=Xf!<)W|I#9`>uu#U6_vMQv28rR6_!I z;eRvzjI!SR)uT7ru|aLJ@uzH0<z0n!YqI0I*qV?i*_Y2RvI(AS?cq6=s&UzDq-bL3 zw8&=5id4<+1<vjtSVmI6zEg6o*mkqj?gjU0n@uta3&Q9o>IFRDn>_lL-1z+AFtRBu kWIa>caN=+0@8pyB|9|DVFTp17R&#pKU1`_jaqu+!4}q-!9RL6T literal 0 HcmV?d00001 diff --git a/trackerapp/migrations/__pycache__/0008_alter_workout_plan_alter_workout_weekday.cpython-310.pyc b/trackerapp/migrations/__pycache__/0008_alter_workout_plan_alter_workout_weekday.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1eb6894533d82c573e5c5d2ed9a0986690b2969 GIT binary patch literal 976 zcmZ8g&2H2%5VoCc{@SIbR7gl1dIIfbRdE3!gj#JW2h>(#TUA7nqI5mYCQahtB$VX} zH&h;i8;=2x;VY-ULL~&_WZSK<<dMG_&v<6OvFP_bg6rq6Z<7Oqklz~IUM7Mq+|>{T zC!A&^r#{V@MGko(k;RZLq5N-lZd!G%z$Jv++dY9-!226Q*63eJgL{TX#7aX!` zf1+)-my2KvcXfyYh)+538K*Jz4KP!T$PKVk8=TZlt<+1GxXF7Lj9VAib{p->G2za4 z%3bd9r3*t_W9IkyGUn4)?%s7GI;&bnlQWP}S^Ddno10I=b0N<}Q-|jOXFQrId#+Gs znMK8?m4(AlD=>yDiV(|z8WgL=z`#;<d0`Rdpv+eGP7}yD#_EC&Y;?2sM1c>;J6I}0 z`>=sZ<CPA($H0qDv)XB#!)YViD|b7EwJQ_tu{O7lqq>n=ac^!PH|-1S2zAdjxYRAi z9PP<eBonBV&EYg^vKq6FK86_-aXsB1+)+;077&KY3qvfZ$pFvGVfem@GF_BL97-rS z6q5uh$@DYcc2<Mj)#XZ@B~<JR2}xYMftj*+8WpinjGri{Z5fV(vPawF(e}<O<&LIN z=c+tWA}Q^({2=lX25QCC*U|Ifr~+99<AY#FOqv{ux(bepWaAi#3*Nnb5*)+H#twXd zOqALhj0Cm~G>t(#%aQ3|!C|nN$^hwq7DhV#n<3B)|EHQ$I4oyU{|g&;^$>+am|^}k zdyF!=PR&2vX$?=#ReN(_DYvVC$WPj4bq#uOqa1eMVtCydxq)$8-$e(y(_=I!=S4@$ PONywnP^>bC-Z%aM;ISO3 literal 0 HcmV?d00001 diff --git a/trackerapp/migrations/__pycache__/0009_exercise_workout.cpython-310.pyc b/trackerapp/migrations/__pycache__/0009_exercise_workout.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40a258db8a6c32e10134faeafa44c23d5d160e90 GIT binary patch literal 796 zcmZ8f!EVz)5M8ew+X;<SAylcHdi8-Q;sgbuMhW47C=yXsVOd%^nQ3Il_L{Zb60UG9 zSH6Mo;4k*diC;iSW!7m(#Y!{U*_}7D@6F17zsG2O`|)-0j5GGr1b3H1!3kM4AO{Sr zjOA8n<viq;iFsy+&MO8sIA0hzXr-OccGv+vV?pN^VOYR*FHe>#t`k{Q+RY_kR-G=) z-QDF=a6(oclS39-z(Nkz(h6;KQmP0xx~WG!{Ir|8X)nD89dNI0@W8)zC~prO>e|)a zH`{imcdg>Z3RPT|;iKVj_(a56jY?cewUSLO$}BGaJGw$#LA(xq{D^9iRH(h%?9)&8 zcjX4Rhk>m<z>B!aYTcEEAbMD%=Czy#4skbpMG@zyoz{0Q63jsFmkKLXmq>sX9Q3s> z+C(9APY41w8Pa}Fh!0Ji8L)`}ODq73MS_*0nKA8;0H&s>vQ5~VN`=X?c#UiALK+uK zsX5HG-@c5dpuO>EHXco0>Ygk~nszeZnK~qN>wZ_`<LHcDS4Fe8(L^qq9E-Y&&Whyd zoP>+szk3{=<NRoXmzc@Y+(u*Bs0xiJ(Q=)W-qB90X!ipm8p2btm3BLaLAh4uuX$wE z19Cp&wsYfjxW%mlGUtzf(`E#&?rum8VBYfIus-~EIM{r#!IrKv^;+zX;b!-cF0}uA Rqx1{Q^mfVZbKg3!{{qIi>F59e literal 0 HcmV?d00001 diff --git a/trackerapp/migrations/__pycache__/0010_alter_exercise_name.cpython-310.pyc b/trackerapp/migrations/__pycache__/0010_alter_exercise_name.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcee5c3aa51b06319a1f2662fb6c243842ceab07 GIT binary patch literal 648 zcmYjP&1&2*5Y~_F^_m1qAvxz%*vsPf)>2B!hV+yanubs#5RNr<ys<4uveV=iXs_u@ z^wj6*Tj<(TUZJ$4BQIeyFoQ<lc)o8&)|;CNLHqmbd+~!3^4lkmEx=?K-9E#hh@v%V zXhs{BF-qPM#T5TW6bHKGUwOt=a71R|9oCW=b4gQ`ChsfVS{F51L2U~UJ+=uZyXba~ z0Z2v_$(W)g%{T<h&=WwkoTxyBD!OHAa?25mRg6SaH$8Y@@N~V&i*qn}*SW1UO<zj5 z0#j5L<QHwu_0YTc;l>4R-oV`rl71YO=2x<Yw(QSbG_=*l05gvIy=LhvO^lT;{9Hk; z4v{#P<F%A7krK;>8t}X!<;9TK{sW&W=%7{578O{-e1qg|-GkZpT@3dZ)5Tf7%3Y#6 z)IM(OCox-yj^WSc;*~hIV5~TLFZOgXG|=`|9JkfZ363Q`eRv^G;B;pXE}_<)N5w)9 z#)6+(l-CU|M67os)~_Pc^m!_CuW7w2uYTTL8~^kXx_ycvCX5I7LC7eh8#MSA-;em= pEO1k`%-d4W)#*6nIM)cSXIP!Kv5$*iueS9D|2ASh#}l^A{{!4iv>pHe literal 0 HcmV?d00001 diff --git a/trackerapp/migrations/__pycache__/0011_alter_exercise_type.cpython-310.pyc b/trackerapp/migrations/__pycache__/0011_alter_exercise_type.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d0d8988bf8a3cc51b70bf5a6bb84d1aee8a3f03 GIT binary patch literal 732 zcmZ8f!EV$r5VhlMHVIThJs>1F^n{d4*&<E|RYhCDsYPm4RYZ|2Z#+%CP2yl@OZN=d zihtn7iU0AHQ-1*om2p;OD@O9jZ{FB5^K8AbkrK3@FTRygK*%o-?pugp50`z8P7+CL z($JhXK^{=@p2$G5uS7DSbM}ShOoqoK8{J?o$pV))sxqQiy0tE9w1nE0p1N-_f<0XJ z6*?d}l_U=&t!U05oR53~i00#p$nZOrBN@r@HIwl*!;DxaST1$R!Cf6+v^S!>03*82 zJ()~)CS24#7!FrpN@an!q5&7*K^OMR4l?FX9)VT17i|e9!EP`VALyB?RlhV|CJaPV zVWiUL0YaCWe+O;`p1E;(u2l)vjU}9kMctza;)>VMR{eR#5P2C^J%mFiqca7yJj@ao z^C8Z;OF759MGd%r$oZ#*sC}+S5;|xlw50-T@Wrr;w|>5N{uaZ0Aeo+v6?UoaP>JCM zeh~8%*}?t3oW3qjEEroHe<=2KxoDv6ZE@17ty66-ijPMxi&L0w?ZYM1y7O!?)eB?c zv!|<NgYp(@rHl1T7pVEp|C)P^x4WhB-zmanH_^o;VBu{z3TQw#Y4|6;9r(j6bcvjc jw$j^jHq1E8HIVBWR=a0-kBi@|)Y_%~YG30~@R<Dt$N0`! literal 0 HcmV?d00001 diff --git a/trackerapp/models.py b/trackerapp/models.py index 89f86e1..5a40d9f 100644 --- a/trackerapp/models.py +++ b/trackerapp/models.py @@ -1,27 +1,53 @@ from django.db import models class Plan(models.Model): - name = models.CharField(max_length = 128, unique = True) + name = models.CharField(max_length = 128, + unique = True, + blank = False) description = models.TextField() class Meta: indexes = [models.Index(fields=['name']),] class Workout(models.Model): - WEEK_DAYS = ( - ("monday", "Monday"), - ("tuesday", "Tuesday"), - ("wednesday", "Wednesday"), - ("thursday", "Thursday"), - ("friday", "Friday"), - ("saturday", "Saturday"), - ("sunday", "Saturday"), + + WEEKDAYS = ( + ("Monday", "Monday"), + ("Tuesday", "Tuesday"), + ("Wednesday", "Wednesday"), + ("Thursday", "Thursday"), + ("Friday", "Friday"), + ("Saturday", "Saturday"), + ("Sunday", "Sunday"), ) - name = models.CharField(max_length = 128) - weekdays = models.CharField(max_length = 9, - choices = WEEK_DAYS, - default = "monday") + name = models.CharField(max_length = 128, + unique = True, + blank = False) + weekday = models.CharField(max_length = 9, + choices = WEEKDAYS, + default = "monday") + plan = models.ForeignKey(Plan, on_delete=models.CASCADE) + +class Exercise(models.Model): + TYPES = ( + ("Resistance", "Resistance"), + ("Mobility", "Mobility"), + ("Cardio", "Cardio"), + ) + + name = models.CharField(max_length = 128, + unique = True, + blank = False) + type = models.CharField(max_length = 10, + choices = TYPES, + default = "resistance") + set_repCount = models.CharField(max_length = 3, blank=True) + workingWeight = models.CharField(max_length = 16, blank=True) + workingTime = models.DurationField(blank=True) + restTime = models.DurationField(blank=True) + workout = models.ForeignKey(Workout, on_delete=models.CASCADE) + diff --git a/trackerapp/templates/trackerapp/detail_view.html b/trackerapp/templates/trackerapp/detail_view.html index 7f0bcdd..c489f0b 100644 --- a/trackerapp/templates/trackerapp/detail_view.html +++ b/trackerapp/templates/trackerapp/detail_view.html @@ -1,11 +1,15 @@ {% extends "base.html" %} {% block content %} <body> + <h2>{{ plan.name }}</h2> <p> {{ plan.description }}</p> <input type="button" onclick="location.href='{% url 'tracker_update' plan.id %}';" value="Edit" /> <input type="button" onclick="location.href='{% url 'tracker_delete' plan.id %}';" value="Delete" /> + <hr/> + {% include 'trackerapp/workouts_index.html' with pid=plan.id%} + <input type="button" onclick="location.href='{% url 'workouts_new' pid=plan.id %}';" value="Add Workout"/> </body> {% endblock content %} \ No newline at end of file diff --git a/trackerapp/templates/trackerapp/index.html b/trackerapp/templates/trackerapp/index.html index 9a98660..f0b1ecf 100644 --- a/trackerapp/templates/trackerapp/index.html +++ b/trackerapp/templates/trackerapp/index.html @@ -1,4 +1,4 @@ -{% extends 'base.html' %} +{% extends "base.html" %} {% block content %} <h2>Workout Plans</h2> <table> @@ -14,11 +14,11 @@ </a> </td> <td> - {{ plan.description | truncatechars:25}} + {{ plan.description | truncatechars:128}} </td> </tr> {% endfor %} </table> <input type="button" - onclick="location.href='{% url 'tracker_new' %}';" value="New"/> + onclick="location.href='{% url 'tracker_new' %}';" value="Create new workout plan"/> {% endblock content %} \ No newline at end of file diff --git a/trackerapp/templates/trackerapp/workouts_create_view.html b/trackerapp/templates/trackerapp/workouts_create_view.html new file mode 100644 index 0000000..f203ac0 --- /dev/null +++ b/trackerapp/templates/trackerapp/workouts_create_view.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +<h2>Enter a new workout</h2> +<form method="POST" enctype="multipart/form-data"> + <!-- Security token --> + {% csrf_token %} + <!-- Using the formset --> + {{ form.as_p }} + <input type="submit" value="Submit"> +</form> +{% endblock content %} diff --git a/trackerapp/templates/trackerapp/workouts_detail_view.html b/trackerapp/templates/trackerapp/workouts_detail_view.html new file mode 100644 index 0000000..c6f3eb6 --- /dev/null +++ b/trackerapp/templates/trackerapp/workouts_detail_view.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block content %} + <body> + <h2>{{ plan.name }}</h2> + <h3>{{ workout.name }}</h3> + <p> {{ workout.weekday }}</p> + <input type="button" onclick="location.href='{% url 'workouts_update' wid=workout.id %}';" + value="Edit" /> + <input type="button" onclick="location.href='{% url 'workouts_delete' wid=workout.id %}';" + value="Delete" /> + <hr/> + + </body> +{% endblock content %} \ No newline at end of file diff --git a/trackerapp/templates/trackerapp/workouts_index.html b/trackerapp/templates/trackerapp/workouts_index.html new file mode 100644 index 0000000..ea68a2c --- /dev/null +++ b/trackerapp/templates/trackerapp/workouts_index.html @@ -0,0 +1,19 @@ +<h2>Workouts List</h2> +<table> + <tr> + <th>Name</th> + <th>Week Day</th> + </tr> + {% for workout in workout_list %} + <tr> + <td> + <a href="{% url 'workouts_detail' workout.id %}"> + {{ workout.name }} + </a> + </td> + <td> + {{ workout.weekday }} + </td> + </tr> + {% endfor %} +</table> \ No newline at end of file diff --git a/trackerapp/templates/trackerapp/workouts_update_view.html b/trackerapp/templates/trackerapp/workouts_update_view.html new file mode 100644 index 0000000..3a6aeb0 --- /dev/null +++ b/trackerapp/templates/trackerapp/workouts_update_view.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +<h2>Update your workout</h2> +<form method="POST" enctype="multipart/form-data"> + <!-- Security token --> + {% csrf_token %} + <!-- Using the formset --> + {{ form.as_p }} + <input type="submit" value="Update"> +</form> +{% endblock content %} \ No newline at end of file diff --git a/trackerapp/tests.py b/trackerapp/tests.py index 4e86396..681a5b6 100644 --- a/trackerapp/tests.py +++ b/trackerapp/tests.py @@ -2,7 +2,9 @@ from django.db.backends.sqlite3.base import IntegrityError from django.db import transaction from django.test import TestCase from django.urls import reverse -from .models import Plan +from .models import Plan, Workout +from .forms import WorkoutForm + class PlanTests(TestCase): @classmethod @@ -37,4 +39,22 @@ class PlanTests(TestCase): } response = self.client.post(reverse('tracker_new'), data=data) print(db_count) - self.assertEqual(Plan.objects.count(), db_count+1) \ No newline at end of file + self.assertEqual(Plan.objects.count(), db_count+1) + + def test_post_create_workout(self): + data = { + "name" : "Full Body 1", + "weekday" : "Monday", + "plan" : Plan.objects.get(pk=1) + } + form = WorkoutForm(data) + self.assertTrue(form.is_valid()) + + def test_post_create_empty_workout(self): + data = { + "name" : "", + "weekday" : "Monday", + "plan" : Plan.objects.get(pk=1) + } + form = WorkoutForm(data) + self.assertFalse(form.is_valid()) \ No newline at end of file diff --git a/trackerapp/urls.py b/trackerapp/urls.py index 6ed0a93..8391dec 100644 --- a/trackerapp/urls.py +++ b/trackerapp/urls.py @@ -2,14 +2,29 @@ from django.urls import path from . import views urlpatterns = [ - # workout lists + # workout plan lists path('', views.index_view, name='tracker_index'), + # workout plan details (shows list of workouts over the course of a week) + path('<int:pk>', views.PlanDetailView, name='tracker_detail'), + # create new workout plans + path('new', views.create_view, name='tracker_new'), + # edit workout plans + path('<int:pid>/edit', views.update_view, name='tracker_update'), + # delete workout plans + path('<int:pid>/delete', views.delete_view, name='tracker_delete'), + # view individual workouts + path('<int:pid>/workouts', views.WorkoutListView, name='workouts_index'), # workout details (shows list of exercises) - path('<int:nid>', views.detail_view, name='tracker_detail'), + path('workouts/<int:wid>', views.WorkoutDetailView, name='workouts_detail'), # create new workouts - path('new', views.create_view, name='tracker_new'), - # edit workouts - path('edit/<int:nid>', views.update_view, name='tracker_update'), + path('<int:pid>/workouts/new', views.CreateWorkoutsView, name='workouts_new'), + # update new workouts + path('workouts/<int:wid>/edit', views.UpdateWorkoutsView, name='workouts_update'), # delete workouts - path('delete/<int:nid>', views.delete_view, name='tracker_delete'), + path('workouts/<int:wid>/delete', views.DeleteWorkoutView, name='workouts_delete'), + # exercise list + # exercise details + # create new exercise + # edit exercise + # delete exercise ] diff --git a/trackerapp/views.py b/trackerapp/views.py index e5dc45a..5ce1193 100644 --- a/trackerapp/views.py +++ b/trackerapp/views.py @@ -1,5 +1,6 @@ from django.shortcuts import get_object_or_404, render, redirect from django.http import HttpResponse +from django.urls import reverse_lazy from django.contrib import messages from .forms import PlanForm, WorkoutForm from .models import Plan, Workout @@ -10,11 +11,23 @@ def index_view(request): context["plan_list"] = Plan.objects.all() return render(request, "trackerapp/index.html", context) -def detail_view(request, nid): +def WorkoutListView(request, pid): context = {} - context["plan"] = get_object_or_404(Plan, pk=nid) + context["workout_list"] = Workout.objects.filter(plan__id=pid) + return render(request, "trackerapp/workouts_index.html", context) + +def PlanDetailView(request, pk): + context = {} + context["plan"] = Plan.objects.get(id=pk) + context["workout_list"] = Workout.objects.filter(plan__id=pk) return render(request, "trackerapp/detail_view.html", context) +def WorkoutDetailView(request, wid): + context = {} + context["plan"] = Plan.objects.all() + context["workout"] = Workout.objects.get(id=wid) + return render(request, "trackerapp/workouts_detail_view.html", context) + def create_view(request): context = {} form = PlanForm(request.POST or None) @@ -29,21 +42,54 @@ def create_view(request): context['form'] = form return render(request, "trackerapp/create_view.html", context) -def update_view(request, nid): +def CreateWorkoutsView(request, pid): + context = {} + form = WorkoutForm(request.POST or None) + if(request.method == 'POST'): + if(form.is_valid()): + form.save() + return redirect('tracker_detail', pk = pid) + + context['form'] = form + context['form'].fields['plan'].initial = pid + return render(request, "trackerapp/workouts_create_view.html", context) + +def UpdateWorkoutsView(request, wid): context = {} - obj = get_object_or_404(Plan, id = nid) + obj = get_object_or_404(Workout, id = wid) + form = WorkoutForm(request.POST or None, instance = obj) + if(request.method == 'POST'): + if form.is_valid(): + form.save() + messages.add_message(request, messages.SUCCESS, 'Workout Plan Updated') + return redirect('workouts_detail', wid = wid) + + context['form'] = form + return render(request, "trackerapp/workouts_update_view.html", context) + +def update_view(request, pid): + context = {} + obj = get_object_or_404(Plan, id = pid) form = PlanForm(request.POST or None, instance = obj) if form.is_valid(): form.save() messages.add_message(request, messages.SUCCESS, 'Workout Plan Updated') - return redirect('tracker_detail', nid = nid) + return redirect('tracker_detail', pid = pid) context['form'] = form return render(request, "trackerapp/update_view.html", context) -def delete_view(request, nid): - obj = get_object_or_404(Plan, id = nid) +def delete_view(request, pid): + obj = get_object_or_404(Plan, id = pid) obj.delete() messages.add_message(request, messages.SUCCESS, 'Workout Plan Deleted') - return redirect('tracker_index') \ No newline at end of file + return redirect('tracker_index') + +def DeleteWorkoutView(request, wid): + workout = Workout.objects.get(pk=wid) + pid = workout.plan_id + workout.delete() + return redirect('tracker_detail', pid) + + \ No newline at end of file -- GitLab