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@&#1;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