From 6432062bcb7a9fa25c25a0280e35e869578fb1ff Mon Sep 17 00:00:00 2001
From: Ricy40 <ricardogarcia.pt@outlook.com>
Date: Thu, 11 May 2023 15:04:10 +0100
Subject: [PATCH] Reviews implemented (not fully stylised) product pages
 implemented

---
 instance/database.db                      | Bin 28672 -> 28672 bytes
 store/__pycache__/itemInit.cpython-39.pyc | Bin 1850 -> 2041 bytes
 store/__pycache__/models.cpython-39.pyc   | Bin 1618 -> 1687 bytes
 store/__pycache__/views.cpython-39.pyc    | Bin 3272 -> 3578 bytes
 store/itemInit.py                         |  36 ++++---
 store/models.py                           |   6 +-
 store/templates/checkout.html             |   8 +-
 store/templates/creamer.html              | 124 ++--------------------
 store/templates/home.html                 |   4 +-
 store/templates/product.html              |  96 +++++++++++++++++
 store/views.py                            |  34 ++++--
 11 files changed, 162 insertions(+), 146 deletions(-)
 create mode 100644 store/templates/product.html

diff --git a/instance/database.db b/instance/database.db
index 4ecb35b6738983767d24c447a815d93e7e3ace54..22c011408e2e6f3d1890dfc83d4423d981d9b486 100644
GIT binary patch
delta 597
zcmZp8z}WDBae_1>&qNt#Ngf8ha4%lodImNgB?kTgz7XDa9wpu|Ufs=t0;{+snmAb4
z#YIIKn~O^llX6l^i&Kk0n04|`z7n>g)UwRf^2zskl_xjyE1T*laB;f%2f2E>`zd(4
zMruH$<1<q<6@pydT!UQwoLz$zAfgHynJJoFn(AzmFY+sL7=g@WS7)7kkzY-fje&uI
zgMop8q0x((U0hO<u_+&HH$)?ZWSQ*3<2ZQ+Po4soW@9B2ySTJ8W3wk%SwT^LN@;Ql
zlwzJ7%=<u!5n_%hSV2-^adv76gk+lR%Qt0{1B(C;3x5&=|7HGF{4M-Rn*{}e`0Eu|
z*cpt4nHU-T^7C|qOEQzQ72I+v6#^0qQj5}ZDjC^XRhZcs^yQft89eifOA_-+6kIDZ
zi%U}Tl2cP*3`Q0vbtZNOTX7~v2B>UFW@3(lOHpcKib7CoPG)La3W&{kjai$Koxxd}
zk&z)NH8Dp)(>cFf!6h-Xs8ZLhC^c2VxhOR;H?=4kLRGNwGB7YO@_%FC|F&7s;SIkC
z2O}#3ry!$;Cl5rXnSsA~v!FsHKW8-~JA-YbttjW@9(nn|e8+-Fp9+5`C#TSefb6U=
zl|&0O(_|wvQwuXABeP^nBZEY<)HI7UOM@hX6jNg(Lkmj-3)3VMleA<b6N@CXRAUR{
WR0GRoGs9$K(=;<n)6IY6Srh<|d8L&A

delta 349
zcmZp8z}WDBae_1>>qHr6Nmd5Ea4%l|9}H|f8Vr07`Oot&<1^$n<<ZzID6oNBriqJ<
zU0hO<u{pmaF)1gtD77pzwH!jSPhQOH$WmIIS~U48Z|&rZ{Q7c@m8|UI($b90o?z7l
zMfoYE$t6&VZE_Lc11T1;aZRRR1xbm;*{LNEl67(p{}hQvCq{O0QBlUGbg%-D=^)HB
z*@~xR@?jox7A{S7=E?fJYRoL^Oq2C_6(tNo^2`hj3>*v$3=F&s3=E9?Ee!lEn*{}`
z_&KT=*%)jaZAB;d_{#@Y7<-o+J2^Uqg_|da803_xq!=5dnHr^9m?aygnwlD<S|lY|
zCYh$DCYvT1r<hr$CZ(k&rx;lzCYdK27^N6nCYz?Em>QZ|CL36!rY0w*Z2sfVqOeJT
PMPM<DfWT%Jfj|5Jwqay?

diff --git a/store/__pycache__/itemInit.cpython-39.pyc b/store/__pycache__/itemInit.cpython-39.pyc
index d40d6c4947cac6e84d17dafbee8d59b24661efa4..6285db82f9eeab9871fcf8f9d7b598d28361ebb0 100644
GIT binary patch
literal 2041
zcmYe~<>g{vU|=wN5tCBK&cN^(#6iZ)3=9ko3=9m#0SpWbDGVu$ISjdsQH+crHd78$
zE^`z!BSQ*v3QG$^6iW(g3R??96l)553P%e=6k7^s3Req56nlzL3Qr1e3u6>Vif{^l
zia-lv6laQHFoUMZOGX9;22I9W>;XmjDW%CJnvA!YQj(I9T>w(S&cMLn4044N0|P?|
zLl$EeQwn1WQ!nEJ=7kKk3^feJb|qj}q%eZqkiy=}TFX$vlEu1!t%hMCBO`>(zL0^D
zp@t!tL6gJp7JG70YGQ6`(MrZ!oW&XWMI{-Dc`3IT4XdPsQWJ9&ob$^SToN;jDs|n8
zQd1S2A&OsCFfcH@WMg1pSjl>eDKq63OCHD!kiae0f}+gi)LWdXd1aot1&PTeD>;go
z7#J9Cu@;u57FFKjOv}tENiB*`s=URTmRVF>QUnUyTkOTD#l@NVdAFDoQ&MiRCFken
zW|n9&7O{XVVJH$~U|{$a=4=%cTAW%`98;8;oLCg&lAm0fo0?Zr91~EPoRL_R8&H&=
zm6}{q921(CS(aK<oLN#C<Lql_XkZlMm{X9E=$lwn5>s4~Uz8e?S(2LTnU`6jS5SG2
zD?POY>NAja#XO*JXB1*&VH9HIVdP>gl3-w9phsk|rWB<nrWCP)f{W3pO2V}wv$!NR
zuOu@uN5KUor4W>wlbM>9d5w{Q;Uy^Cia^P>h##DKiX<5rARz?~t|D=eF&ycsC19<*
zpmc-bGZ{Mhj58JDmE=^Y?~JPiJ@bl767xzFpuS8_&13<23zS$;yd{gpTRiEhC2)P9
z#DN)U3Uu-sb6QR%)Kex^!hZRAy1^xx$=M2SIh6_li3O=end~5Mfg%;fTZ&k`#g?90
z;+9h>k2S7TK=H|t3@Qjf2^54uY*3N~7YZH>3=B04DU8`nMLZ=8!5}tMHdB#A2_u-z
zoXu3EQo;mgvt%<B8I&*wGn6niGn6nkGn6njGn6nlGo-TwGo*lu239|C)`O%ea14Ol
ztH}b+3q_!0Qv?d&B9Nn2GTve<E-A{)ONS&pP<%jAA9s3c3A9Kn)&O}*2<&POMixdS
z%v1!DD*`1>+`fxI_)e+>?B*1v6y_F&6qa6ypIEb*icFv~Y$!79*-S-#P#F${49MS5
z-*Wn4w;dF|!60{oinbbtEQVl)m5hFxj9}F(8E-LGp!=A^CMPjBDJ9X)oPmMiGsw49
za>e;Y@KDgR$;nSn%qh0hgDKQxyv3ZIT3H0jpcvlA;(#JeNNxwIFVezHL`6Cb3=Eba
zaa|C>2g(K@V?b^JVGtXH(fkE77Nj1hvDP3HLB?t_-C_fID>VfYcWNLBaJ+*FaM8m9
zQUHs6Q&1>^%w}NZU=)I3rXm9d1_n@oszN*kN&}i)x7c#?Q&Mw^!4*dlND5p@U`u-t
k>p`X<#RS3)95%W6DWy57b|4=YgY4&F<YD6Agg`D{0P*CH2><{9

literal 1850
zcmYe~<>g{vU|`7Wj84g6V_<j;;vi#Y1_lNP1_p*=7X}7~6owSW9EM!RC`Lwx6s8pB
z7KSLM6qXd$7KSM16t)!h7KSL66pj?m7KSL+6u}hk6rL8wD7F-#6uuPx7RD&{6oFs{
zP2rb}3=9mKjJMbWit<xRlS`73?E}fNF)%PVgY48|U|=X=$YRW5N?}Z4>SbKOypW-m
zp@yMYt%M<kIfW5qcM4lC3rH-OL6hC@7JG70YGQ6`(MrZ!oW&XWMI{-Dc_~%WL8*y3
z3eNfE3NDG6MU}d4MX9L@&JdL^D;O9UUV^M#$#RP&52Trufq~%`Ye7+Fa_TM4)Vwm!
z+=9g9l9en)Okjz^($u2LTbyZ`IVGt@@ky1pSkp3#ic3~97J&k5B}0)Q0|UdaFlVcn
z(Bjmh;+Ue$<iw&Fm;B_?+|<01;+TNS<c!3k+<>C|tkmR^;+W99%(B#?;>?oD7-wHY
zLj$82$DD$UMBl`sl9=L>{G!yD%#zex&%DeMy@JYHT<NJLP^Yti!iWPDdW=GhEQ|t-
zMZydW4Acxx)|8^u#FQeCMO6~66`92)sd*)ti8%@`AaRAD)SS%Jw9IRa3=A(pelG$!
zrih1ufuTqMM1TSU92!MJppfH8Pb~p!<i>Eg7?mB)nF?`iaw^2}f}VNBC5d?@3Q$iZ
zr)IK%Tn&m*0<PvsPc4D#0{NpD<VyxvkV{h8<;-b0l@K=z`{n292A5<eXDhhnR4N1{
z7NizsvV&X=N}vQ>&6b{8;+9hhaviFBWk4~(kPOOapp*l`AT}t9!FkSufq|ihA%!uU
zsfee9AsEDF%4RB(C}9M%nX{RSR7#k@Y?f@MB7+j<V1^QgW`+{RW`+``W`+{xW`=Z@
zV1^WiU<OTAKX9HX5&@+KaS$N|%KI$fgjxiO^dgW8i$IQA$#{#cxTGjEFCCI(z=;PG
z-nY2ZQ%j&_MX>@X>3~ET7&#bOkTFvcNUn$z6dxcTfqVwSAU5205eVN&m4Mw0DaTS+
zdLe#d&1Nbxfy%IfN;tR-dp1*%A5?||Ap`O^)VG{|*lh>7AQ<FsP$^Txki`(pu#(YF
zlM$?XCF3o|3UnWH*yJSUCZ#0W=`%1ed<OZVO0GD+2p$T0HaYppi8;k~dN75WjJKGx
zQ!9%=r8!3AVsSu`A}Asl!Rm{YKrsUjZ!iH0-XawS1_ncrxGIPM<ycaT1*ykrtTD($
zkg=Lfx7a}5N=<>pog7F4>;y0Ya>p$mkOElj>w-d&4-_7Z9E?IR%v7Yoz`y_sP+5ql
zKxsge;}%<PeoAUiF}T>qmf|3mg7hMVKf-1Xo80`A(wtN~Q1BIlN;Mv44t5CS;spQ)
ClVP*~

diff --git a/store/__pycache__/models.cpython-39.pyc b/store/__pycache__/models.cpython-39.pyc
index 57e3b10b75776f35990daa91d10e4d02bf88b5e1..884f468017782ad33618e82e4297248a026ead59 100644
GIT binary patch
delta 671
zcmcb_Go6<=k(ZZ?fq{YH)uWh{mlJtq8H*-rOV_6`q_E_$<g!MwGBUU`q_C#2wJ@Zx
zr7~x+H8V%CyECM)r*O0|q;Nn*INTXhI8(S<7*e>PBAo6FDcmVMEet6<AdytoW|k<f
z6y9J4O}>{P>ogf}u_q-aXBVZWy<}uyV9;c|#gvky$#{!1v^ceB;<_Hjs>#-j28=9|
za~Ri&voSC*a4;}16oUv3Mgc}HMjpl@w#kM})7Uu~7#Ko|*e9Q3(qm+q{Fh0A@z!KH
zW(kg4tOZ4x$*H#{+cE3Qf)w$A3;+=z0|cOk@Gur}PBvtcWel6_&!jl{B(q>WX9~+g
z#we~-<^?RN%nP_vSQj!bWQ^j0@UvJKGDh*Humv+{vKL7}tY%<fsNyOp%1<dxF44<O
zxy1tV!pmO_3=Dpnd_|zpE#hWiU?}1N5iB5r7es)ZQp68p2{SM-++xoxNzIMVOyMpP
z0C8DLi&Kjxr?VJ~ii6w@G6m#r5k@XX0mdSU$%ahUlV7nohq9zHXR)R-FW^mKTgbSO
zDT*(JJ(xk0qevd^wjz)LnvA#DO7k)cOH+$Lfmy{_lv<XVTCSIw;-|@v;l|0utPcDj
zS4Bb9#b>5WZe$T<1(_;0`68>RFNo!*$$g8jxG*O%CpjZEw^A>^D7T0S<amZ6kT-8}
zr{yFTXUFH{r)TCBv4SL6ee+XNbHGk00>ue92#e$=%dx2mfP#mIiHDJgMTkv^Q-~b^
DIK7cO

delta 596
zcmbQvdx?iPk(ZZ?fq{YH#OA1!BNKUL8Pg_eODDK9q_Cv0wlJiyrZQ%+G&4uBx-+D(
zrLea!q_9Ip*xVUXI8r!U7*aT)BJA!ADO@SsEet8#Adyt&W|k<96rNxPP2QJ`3=9mK
zjJKFll3s#ro49uh<FCm<j0TKMlbadWiL){=Ft9N&FcfnzFfed13NUgp@-P;$PF~0?
zJNW^N+~j7aXm*fPND<rQr%ZZ`Op`^J6%?a5i!<_zN-`4jQi=o^7#MD`7p0bErj{2+
zu@)3%CZ|SC4rSJt1?l4fnau|^TL5Z44`UGr$OguQ$q!j%C*NTf&0tAo&SFhvUcjEh
zvXF5hQxs<^^8%Js<^^0StP2?zGDdMj_*twA8KZbo*n$}}*^49?7#Ko|K(4RiDk#cN
zDNQcX%S<WaWME);`HO*p!B3O72o%Ic+zbp1MIe_HF-;C&QDhNeU|^VB&0;Jd3UVDt
z3CQOnj3Sfwu}E@(g2VwNkumupOM)AB3fn@)DBcwIU<OT&TP&f)sYMV=i^L&8%T}6~
zSy-A{1kwj~lb<FZroGcx9T=r2C$fpN6)7+<Fvv{)&njvGV)<!u-eM?X0)--XT25kd
vc6?5LdS+e`3rK|3H$Npc2VyiRIKk!@DNIgeQ{w}<n}?ByMTkv^Q-~b^o-utF

diff --git a/store/__pycache__/views.cpython-39.pyc b/store/__pycache__/views.cpython-39.pyc
index 5b081deebbbd5c4681502ff87aac0c9903fcf826..b0a2352c864a74d0ba68ef69daaec9787d37c5ff 100644
GIT binary patch
delta 1894
zcmX>h`AeEFk(ZZ?fq{V`>tjrcqu@k78AiE@+O_p5+$lUQ3{m2#qFE9tyeWJs{OL?7
z0=-Nrf+<2R49$#Dl3*EOBpHzuQLu~@SVjy<Mm$9VEF%q;kwlV_N|6T3$be;JQuxyu
z!M3Q&rpSRMWWf^ha0!JJMX<PB3VSevrqX0L#zpmvAooKtGXnzy2s<+{Fcj-CFff!b
z)G#zNHZx=~)-u*Gx-i5_)H2mDWih2NN-~r%XEPNEFfybt1v3;1q%a3FXtMYffs6}r
z(`32Dot|0}P?Voinp{$Ri@hkdEHkyd_!diPacWT!D9kjOZ?R;SqzdI0i7+rQ++u^M
zSjkW%F}a8-QjNDbHL)l;BM71oq@fr@Ffj5kaxn5SaxfN2F)%Ppe$E&lS|kQCfGIOY
zlch+Mfq?<cFOp_pV2I*MN-WM!Ey*lN%`K7uNr4GTkb2JKjMU_8&yv(!A&_q&hI27;
zG4e19Fc!&fe#Iof$fz*+H?uOM*kpN@cu|niQ5*$OFKG%D34<Iko5est7G$y-h~NPc
zGLvt!IO`~Zn93lVxFL>+$L0!_jQreGsmWff#*D_3>sUP^6&M&8s-QabGD>oDinJLR
z7&KXnSU~3KfCx|wfrAk20wjOIJqPx@HON~aT?|ZI%tg|Z<=Ollz-BQQ5jNo#2RL~0
zOG}(U#xQ{r2y>Ci<aKOP_3R7`46F<c4B%8^!U#$wS&S)+*-R4{i&RP&vX~Yyr!XyK
zED9)LX=bQpsA0%rbzz9r0HvTTwiISbh7$H{rXrORjx5dvTs4df85tSCZ0>~&j0}Y;
zc~`(@@GN8~I#<FAG9!zxnX&i)Sd=-1rG6n}EfbW(x{$G!8Kk6^p@hGLJ)N<JxrQl)
zt(Uo$1!V04ff^Q6<4Xi<SRjtb5=voD;pk;zWXR(w5lrDs;eztQz~-@*2$!(eur@Q*
zvemE^eW+o}5=r3}XQ*L|uNTRaD-kVW&l0O)O=kpU^<L&$Hn0!GYuM1OOW}oCQzDVV
zSHcc5JcYj(lv@P+ia@b_i!CKJC$%IMoON!o6(yEr=A{>jgJPW-oStuSr=%7q7iAWd
zWaj4;nSoMjkvb?LXiWagZo<Y5VyaBG;gG1W;z=$_P0UR#0;e2JCb0G*P)gL4L`p!q
zARVCW9mSQNTH*}R0?vjI4PYAtK#Dj)geizH1f^uQvc#Oy)M9Yfi{dQK$S*3%NX$zq
z;s;A6))y3{=A{&Y(ngUMNE3R-0EroZ2v7plWWU7@buQSqMP?uwb8xoJOD&Iw6bN9~
z7a4)1z{wj-fHH6qD1Ezw5~m3$aWe5R@yIZ;F>*2TG4e3-F>x{RF!C_+FtITTF!C^R
zF^WwN<P>4Fo}9*cLk$vmpo}I7%Kr*^`6UWz`K5U&3YmEdkj$!BWHC8~ORfGEYhh_>
zQDqS*w2Hu494%bHo&^O?5gRDRn7~=D$OhBBx40nD46-pF<ZMu>#lQqA%6OPqK<;J&
zxtoWPi>U~d=c@Sh({d(raVMn0ovX=KWCt?X9z=k0c98>!1$F}1cE%!5o<u4UKmm1&
zCoLzjIKwx!xHvIAwFzW32ROvQRx=j4fZQ!V`8;=iJ;?N19P#maiMgrq@kOA55ggY=
zpoqN1T9jW}l3HX8vJ+Ig7J&jD91UOxgAGEm8y-`)IBatBQ%ZAE?Ld`7u?7PJg9alH
oqXf7p=V0Pu;^5%m5Mbm|5E5YIViREGVi92EQs-mj65?Y708i$BFaQ7m

delta 1560
zcmew*eL|8ik(ZZ?fq{YH=C<gRx%?CPWEjOJYS-4Mie`zYaHsI3@TN1R@bxmK@TUm0
zFf=npNq}Vpkz|BYguybBU>Ol48POCmu#6N~MjS~-B1IA`BMp|3O5sgs1luB=A_Eqe
zmjO%2!X@NV<iQfMDeS=vnhKNs7#B@uWRBCh#gbW)ntO{WGewi-7E5VyYEh900|P^m
zFarZa6jxGWadv76NX1HqBJs(MOp)@O$r-81*`6h-x!ep448>r-GjcI<G4e19FcwK}
z-oh-v$S5=UD2p<q$mEwS@v>qdlQ;^B@>5EaONupxZgHolmIOe#lVe#81SCNgDuD<d
z5Ft8wE~~SS9Ed5;z`$^e8{&$1kTZ(JLBe1{0wl+hk)N9?Jeh~hn9*Re1Di*r3<Cp0
z6;y{_MoDf?kvandgC=Vc3rM3Th+qa0Aa@sOfLLI|5Cq6ru<uPk-UI1kVB%sf5}y2!
z&EElR7IP6{6K-*UgDJnX#2RD_6DWl+7a2}2V3(?AV_;waVP}xcGX@5R5{4|s6vk|(
zqH84#SxgI<7cvwzpoy`hFfC-P1*v3Oz>>nekg=Argf)vTi@k&+i!+6#mvI5tLWWwV
z8m8i+5>}8{33oF?7H17(4MPfRFH0?R2~QU90=^pNg^cx#429Q9_*2+Y*i$%qnHU-J
z!a#~^SxN*-IBHm$nQB>USc?|bux1ISaEde3u*M7K$(0C!46R{FXH4Nt;p%0sWrZ5Z
zx{#5P0n8R&$iT=@!VgaLU~@}EQg}-^KxU`#^)d%DX!83N$uKaOGu&b;N-W9DOTWcd
zlv<XVTCT}hqzH;67BCgX4vOgb%#>T)DXGQDMVSR9nfZA|Mw10OP3l!ZF$PL_MGByZ
z76zq5g~XJU)D(r1e1+u1q7ua-WsnR{a#3nxZfX%Y4QMhIfl^@+C{1aKA|(YaP#R(@
zOUx-vEiTdqnavLpVJ$38Evmf5nU<MTl3Em>R9OU0E}{(e3=Fqe(=v;SOQN{aQ%js7
zb`%MKbaH|ST@b+vBG3}G9!Lz7ZZz47j6iHq@+vY0<qfX9)be;pNPt~fqz{ruO_8_Q
z!TvE%Eph;*8j!mgn7EiA`HqK4go%ZbkCEv=8xtQBA2S;x7l_X!#K;56mrO-glP7WA
zU;~9qk;>!(Zh1!2$rHHMB8tpG7J<DD&V6ui++s^f%}FguEdu)l>~v6q)no!^j3Q8y
zM$d>`5FMcSNSw^eBhTnKS(hgx6=EkSa@mS(LAKd}2vDvnvInui7J$uWEOG(~pn01o
zEhn)!!#B0KI59o71mtxNP*!5%W8`4uVJre=Ax*i-zj*TNL8jm0h>y=p%uS7tFA@S7
z28x4QtVQ{yC8<RQAOTRRR%8fbS%C;g5CJj+$v0pJfC_<I95%W6DWy57c8nl<)fgBU
pG#GgpB^Y@aIT$&ZxR^OO1Q@v#1Q@y41Q@xvSwI{<MlK;fMgW{-Nf7`5

diff --git a/store/itemInit.py b/store/itemInit.py
index 42fbff1..e33a547 100644
--- a/store/itemInit.py
+++ b/store/itemInit.py
@@ -1,32 +1,40 @@
 from .models import Product
-
+from . import db
 
 def getCreamer():
     creamer = Product.query.filter_by(shorthand="creamer").first()
     if not creamer:
-        creamer = Product(name="Real Cow Dairy-Free Creamer", shorthand="creamer", price=120, envImpact=6)
+        creamer = Product(id="1", name="Real Cow Dairy-Free Creamer", shorthand="creamer", price=120, envImpact=6)
+        db.session.add(creamer)
+        db.session.commit()
     return creamer
 
 
 def getDread():
-    creamer = Product.query.filter_by(shorthand="dread").first()
-    if not creamer:
-        creamer = Product(name="Existential Dread Relief", shorthand="dread", price=470, envImpact=3)
-    return creamer
+    dread = Product.query.filter_by(shorthand="dread").first()
+    if not dread:
+        dread = Product(id="2",name="Existential Dread Relief", shorthand="dread", price=470, envImpact=3)
+        db.session.add(dread)
+        db.session.commit()
+    return dread
 
 
 def getExistence():
-    creamer = Product.query.filter_by(shorthand="existence").first()
-    if not creamer:
-        creamer = Product(name="Instant Existence", shorthand="existence", price=260, envImpact=2)
-    return creamer
+    existence = Product.query.filter_by(shorthand="existence").first()
+    if not existence:
+        existence = Product(id="3",name="Instant Existence", shorthand="existence", price=260, envImpact=2)
+        db.session.add(existence)
+        db.session.commit()
+    return existence
 
 
 def getFly():
-    creamer = Product.query.filter_by(shorthand="fly").first()
-    if not creamer:
-        creamer = Product(name="Non-Stick Fly Paper", shorthand="fly", price=263, envImpact=5)
-    return creamer
+    fly = Product.query.filter_by(shorthand="fly").first()
+    if not fly:
+        fly = Product(id="4", name="Non-Stick Fly Paper", shorthand="fly", price=263, envImpact=5)
+        db.session.add(fly)
+        db.session.commit()
+    return fly
 
 
 def getProducts(string=""):
diff --git a/store/models.py b/store/models.py
index 5f63fca..6de550b 100644
--- a/store/models.py
+++ b/store/models.py
@@ -1,3 +1,5 @@
+from sqlalchemy.orm import backref
+
 from . import db
 from flask_login import UserMixin
 
@@ -21,7 +23,7 @@ class Product(db.Model):
 class Review(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     item_id = db.Column(db.Integer, db.ForeignKey('product.id'))
-    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
+    user = db.relationship('User')
     description = db.Column(db.String(250))
     rating = db.Column(db.Integer)
 
@@ -31,5 +33,5 @@ class User(db.Model, UserMixin):
     password = db.Column(db.String(100))
     username = db.Column(db.String(100), unique=True)
     basket = db.relationship('Basket')
-    reviews = db.relationship('Review')
+    review_id = db.Column(db.Integer, db.ForeignKey('review.id'))
 
diff --git a/store/templates/checkout.html b/store/templates/checkout.html
index de0ff12..7ccdab2 100644
--- a/store/templates/checkout.html
+++ b/store/templates/checkout.html
@@ -25,7 +25,7 @@
               <div class="icon-discover icon icon-cc-discover"></div>
             </div>
             <div style="margin-left: auto;margin-right:100px;margin-top:14px;height:60px">
-              <input id="ccn" class='input-ccn' style="width:200px;text-align: center;margin-right: 60px;margin-top:10px" type="tel" placeholder="XXXX XXXX XXXX XXXX"/>
+              <input id="ccn" class='input-ccn form-control' style="width:200px;text-align: center;margin-right: 60px;margin-top:10px" type="tel" placeholder="XXXX XXXX XXXX XXXX"/>
             </div>
             <div class="btn-clear hidden-right">clear</div>
           </div>
@@ -38,7 +38,7 @@
               </div>
             </div>
             <div style="margin-left: auto;margin-right:150px;margin-top:14px;height:60px">
-              <input id="exp" class='input-exp' style="width:100px;text-align: center;margin-right: 60px;margin-top:10px" type="text" placeholder="MM/YY"/>
+              <input id="exp" class='input-exp form-control' style="width:100px;text-align: center;margin-right: 60px;margin-top:10px" type="text" placeholder="MM/YY"/>
             </div>
           </div>
         </div>
@@ -49,8 +49,8 @@
                 CVC / CCV
               </div>
             </div>
-            <div style="margin-left: auto;margin-right:160px;margin-top:14px;height:60px">
-              <input id="cvc" class='input-cvc' style="width:100px;text-align: center;margin-right: 60px;margin-top:10px" type="number" placeholder="XXX"/>
+            <div style="margin-left: auto;margin-right:150px;margin-top:14px;height:60px">
+              <input id="cvc" class='input-cvc form-control' style="width:100px;text-align: center;margin-right: 60px;margin-top:10px" type="number" placeholder="XXX"/>
             </div>
           </div>
         </div>
diff --git a/store/templates/creamer.html b/store/templates/creamer.html
index 5e20bb3..3b343d6 100644
--- a/store/templates/creamer.html
+++ b/store/templates/creamer.html
@@ -1,115 +1,9 @@
-{% extends "base.html" %} {% block title %}Home{% endblock %} {% block page %}
-
-  <div class="container py-4 py-xl-5">
-      <div class="row mb-5">
-          <div class="col-md-8 col-xl-6 text-center mx-auto" style="background: #ffd200;">
-              <h2 style="font-family: RamaGothicEW01;font-weight: bold;letter-spacing: 2px;font-size: 48px;text-shadow: 3px 3px #ffffff;color: #ff2e00;margin-bottom: 0px;">{{ product.name }}</h2>
-          </div>
-      </div>
-      <div>
-        <div class="main-yellow">
-          <div>
-
-          </div>
-        </div>
-      </div>
-
-      <div class="row gy-4 row-cols-1 row-cols-md-1 row-cols-xl-1" style="margin-bottom: 25px;">
-          <div class="col">
-            <div class="card" style="border-radius: 0px;background: #ffd200;border-width: 0px;">
-              <div class="fit-cover product-page-picture" style="display: inline;background: #ffffff;text-align: center;position: relative">
-                <img class="fit-cover" style="height: auto;width: auto;max-height: 400px;max-width: 330px;top: 0;left: 0;bottom: 0;right: 0;margin: auto;position: absolute" src="../static/img/{{ product.shorthand }}.png">
-              </div>
-              <div class="card-body p-4" style="text-align: center">
-                <h4 class="card-title" style="font-family: RamaGothicEW01;font-weight: bold;color: #1728b8;">{{ (product.name).upper() }} - £{{ "{0:.2f}".format(product.price / 100) }}</h4>
-                <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">Some text about {{ product.shorthand }} yada yada yada it is awesome</p>
-                <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">Environmental Impact: {{ product.envImpact }}/10</p>
-                <div class="d-flex" style="text-align: center;">
-                  <div style="margin:auto;font-size: 32px">
-                    <label for="{{ product.shorthand }}"></label>
-                    {% if user.is_authenticated %}
-                      <form method='POST'>
-                       <button class="btn btn-primary red-button" type="submit" name="product" value="{{ product.shorthand }}" style="background: #ff2e00;font-size: 28px;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
-                      </form>
-                    {% else %}
-                      <button class="btn btn-primary red-button" type="button" onclick='addToBasket("{{ product.shorthand }}", "{{ product.price }}", "")' style="background: #ff2e00;font-size: 28px;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
-                    {% endif %}
-                  </div>
-                </div>
-              </div>
-            </div>
-          </div>
-      </div>
-      <div class="row gy-4 row-cols-1 row-cols-md-2 row-cols-xl-3" style="margin-bottom: 25px;">
-      {% for review in product.reviews %}
-        <div class="col">
-          <div class="card" style="border-radius: 0px;background: #ffd200;border-width: 0px;">
-            <h2 style="font-family: RamaGothicEW01;margin-top:10px;text-align: center;font-weight: bold;letter-spacing: 2px;font-size: 24px;text-shadow: 3px 3px #ffffff;color: #ff2e00;margin-bottom: 0px;">
-              Review By:
-              {% if users.query.filter_by(id=review.user_id).first() %}
-                {{ users.query.filter_by(id=review.user_id).first().name }}
-              {% endif %}
-            </h2>
-            <div class="card-body p-4">
-              <h4 class="card-title" style="font-family: RamaGothicEW01;font-weight: bold;color: #1728b8;">{{ (product.name).upper() }} - £{{ "{0:.2f}".format(product.price / 100) }}</h4>
-              <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">Some text about {{ product.shorthand }} yada yada yada it is awesome</p>
-              <div class="d-flex" style="text-align: left;">
-                <label for="{{ product.shorthand }}"></label>
-                {% if user.is_authenticated %}
-                  <form method='POST'>
-                    <button class="btn btn-primary red-button" type="submit" name="product" value="{{ products[0].shorthand }}" style="background: #ff2e00;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
-                  </form>
-                {% else %}
-                  <button class="btn btn-primary red-button" type="button" onclick='addToBasket("{{ product.shorthand }}", "{{ product.price }}", "")' style="background: #ff2e00;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
-                {% endif %}
-                <button class="btn btn-primary red-button" type="button" style="background: #ff2e00;border-style: none;width: 130px;position: absolute;right: 25px;border-radius: 0px;">VIEW ITEM&nbsp;<img src="../static/img/arrow_w.svg" style="width: 20%;margin-bottom: 2px;"></button>
-              </div>
-            </div>
-          </div>
-        </div>
-      {% endfor %}
-      </div>
-  </div>
-
-
-
-
-    {% for review in product.reviews %}
-        <li>
-        Review by
-            {% if users.query.filter_by(id=review.user_id).first() %}
-                {{ users.query.filter_by(id=review.user_id).first().name }}
-            {% endif %}
-        <br/>
-        Rating: {{ review.rating }}
-        <br/>
-        {{ review.description }}
-        </li>
-    {% endfor %}
-    <br/>
-    <form method="POST">
-    <h3 align="center">Write a review:</h3>
-    <div class="form-group">
-        <label for="rating">Rating:</label>
-        <input 
-                type="rating" 
-                class="form-control" 
-                id="rating" 
-                name="rating" 
-                placeholder="Give a number to rate this product"
-        />
-    </div>
-    <div class="form-group">
-        <label for="review">Review:</label>
-        <input 
-                type="review" 
-                class="form-control" 
-                id="review" 
-                name="review" 
-                placeholder="Write about this product"
-        />
-    </div>
-    <br />
-    <button type="submit" class="btn btn-primary">Submit</button>
-    </form>
-{% endblock %}
+{% extends "product.html" %} {% block title %}CREAMER{% endblock %}
+
+{% block description %}
+  NEED TO ADD SOME CREAM TO YOUR MEAL? DO YOU NOT WANT TO CONSUME MILK?<br>
+  WELL BOY DO WE HAVE THE PRODUCT FOR YOU!<br>
+  INTRODUCING ALPHAMART REAL COW DAIRY-FREE CREAMER! MADE WITH REAL COWS!<br>
+  NEVER HAVE A NON CREAMED DRINK EVER AGAIN!<br>
+  GOES ESPECIALLY WELL WITH ALPHAMART'S OFFICIAL COFFEE FROM HELL!
+{% endblock %}
\ No newline at end of file
diff --git a/store/templates/home.html b/store/templates/home.html
index d10d86f..0fee7a5 100644
--- a/store/templates/home.html
+++ b/store/templates/home.html
@@ -60,7 +60,9 @@
                                   {% else %}
                                     <button class="btn btn-primary red-button" type="button" onclick='addToBasket("{{ product.shorthand }}", "{{ product.price }}", "")' style="background: #ff2e00;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
                                   {% endif %}
-                                <button class="btn btn-primary red-button" type="button" style="background: #ff2e00;border-style: none;width: 130px;position: absolute;right: 25px;border-radius: 0px;">VIEW ITEM&nbsp;<img src="../static/img/arrow_w.svg" style="width: 20%;margin-bottom: 2px;"></button>
+                                <button class="btn btn-primary red-button" onclick="location.href = '/{{ product.shorthand }}';" type="submit" style="background: #ff2e00;border-style: none;width: 130px;position: absolute;right: 25px;border-radius: 0px;">
+                                  VIEW ITEM&nbsp;<img src="../static/img/arrow_w.svg" style="width: 20%;margin-bottom: 2px;">
+                                </button>
                             </div>
                         </div>
                     </div>
diff --git a/store/templates/product.html b/store/templates/product.html
new file mode 100644
index 0000000..67cf138
--- /dev/null
+++ b/store/templates/product.html
@@ -0,0 +1,96 @@
+{% extends "base.html" %} {% block title %}PRODUCT PAGE{% endblock %} {% block page %}
+
+  <div class="container py-4 py-xl-5">
+      <div class="row mb-5">
+          <div class="col-md-8 col-xl-6 text-center mx-auto" style="background: #ffd200;">
+              <h2 style="font-family: RamaGothicEW01;font-weight: bold;letter-spacing: 2px;font-size: 48px;text-shadow: 3px 3px #ffffff;color: #ff2e00;margin-bottom: 0px;">{{ (product.name).upper() }}</h2>
+          </div>
+      </div>
+
+      <div class="row gy-4 row-cols-1 row-cols-md-1 row-cols-xl-1" style="margin-bottom: 25px;">
+          <div class="col">
+            <div class="card" style="border-radius: 0px;background: #ffd200;border-width: 0px;">
+              <div class="fit-cover product-page-picture" style="display: inline;background: #ffffff;text-align: center;position: relative">
+                <img class="fit-cover" style="height: auto;width: auto;max-height: 400px;max-width: 330px;top: 0;left: 0;bottom: 0;right: 0;margin: auto;position: absolute" src="../static/img/{{ product.shorthand }}.png">
+              </div>
+              <div class="card-body p-4" style="text-align: center">
+                <h4 class="card-title" style="font-family: RamaGothicEW01;font-weight: bold;color: #1728b8;">{{ (product.name).upper() }} - £{{ "{0:.2f}".format(product.price / 100) }}</h4>
+                <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">{% block description %} description {% endblock %}</p>
+                <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">Environmental Impact: {{ product.envImpact }}/10</p>
+                <div class="d-flex" style="text-align: center;">
+                  <div style="margin-left:auto;margin-right:auto;margin-top:-50px;font-size: 32px">
+                    <label for="{{ product.shorthand }}"></label>
+                    {% if user.is_authenticated %}
+                      <form method='POST'>
+                       <button class="btn btn-primary red-button" type="submit" name="product" value="{{ product.shorthand }}" style="background: #ff2e00;font-size: 28px;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
+                      </form>
+                    {% else %}
+                      <button class="btn btn-primary red-button" type="button" onclick='addToBasket("{{ product.shorthand }}", "{{ product.price }}", "")' style="background: #ff2e00;font-size: 28px;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;">ADD&nbsp;<img src="../static/img/cart_w.svg" style="width: 20%;"></button>
+                    {% endif %}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+      </div>
+      <div class="row gy-4 row-cols-1 row-cols-md-2 row-cols-xl-3" style="margin-bottom: 25px;">
+      {% for review in product.reviews %}
+        <div class="col">
+          <div class="card" style="border-radius: 0px;background: #ffd200;border-width: 0px;">
+            <h2 style="font-family: RamaGothicEW01;margin-top:10px;text-align: center;font-weight: bold;letter-spacing: 2px;font-size: 24px;text-shadow: 3px 3px #ffffff;color: #ff2e00;margin-bottom: 0px;">
+              REVIEW BY:
+              {{ (review.user[0].username).upper() }}
+            </h2>
+            <div class="card-body p-4">
+              <h4 class="card-title" style="font-family: RamaGothicEW01;font-weight: bold;color: #1728b8;">RATED: {{ review.rating }}/10</h4>
+              <p class="card-text" style="font-family: RamaGothicEW01;letter-spacing: 0px;font-size: 20px;">{{ (review.description).upper() }}</p>
+              <div class="d-flex" style="text-align: left;">
+                <label for="{{ product.shorthand }}"></label>
+                {% if user == review.user[0] %}
+                  <form method='POST'>
+                    <button class="btn btn-primary red-button" type="submit" name="delete" value="delete" style="background: #ff2e00;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;margin: auto">DELETE</button>
+                  </form>
+                {% endif %}
+                </div>
+            </div>
+          </div>
+        </div>
+      {% endfor %}
+      </div>
+      <div class="row mb-5">
+        <div class="cold-md-8 cold-xl-6 text-center mx-auto" style="background: #ffd200;">
+        <div style="max-width: 455px;">
+          {% if user.is_authenticated %}
+            <form method="POST">
+              <h3 align="center">Write a review:</h3>
+              <div class="form-group">
+                <label for="rating">Rating:</label>
+                <input
+                  type="rating"
+                  class="form-control"
+                  id="rating"
+                  name="rating"
+                  placeholder="Give a number to rate this product"
+                />
+              </div>
+              <div class="form-group">
+                <label for="review">Review:</label>
+                <input
+                 type="review"
+                 class="form-control"
+                 id="review"
+                 name="review"
+                 placeholder="Write about this product"
+                />
+              </div>
+              <button class="btn btn-primary red-button" type="submit" name="submit" value="submit" style="background: #ff2e00;border-radius: 0px;width: 130px;padding: 5px 5px;border-style: none;margin: auto">POST REVIEW</button>
+            </form>
+          {% else %}
+          {% endif %}
+        </div>
+        </div>
+      </div>
+  </div>
+
+
+{% endblock %}
diff --git a/store/views.py b/store/views.py
index eec6908..8b72794 100644
--- a/store/views.py
+++ b/store/views.py
@@ -7,6 +7,13 @@ import json
 
 views = Blueprint('views', __name__)
 
+def searchReviews(item):
+    reviews = getProducts(item)().reviews
+    for review in reviews:
+        if review.user[0] == current_user:
+            return True
+    return False
+
 
 def checkItem(user, item):
     for basket in user.basket:
@@ -65,19 +72,26 @@ def checkout():
 def creamer():
     if request.method == 'POST':
 
-        if request.form.values():
-            if request.method == 'POST':
+        if request.form.get('delete'):
+            creamer = getCreamer()
+            for review in creamer.reviews:
+                if review.user[0] == current_user:
+                    db.session.delete(review)
+                    db.session.commit()
+
+        elif request.form.values():
+
+            if not searchReviews(getCreamer().shorthand):
                 rating = request.form.get('rating')
                 description = request.form.get('review')
 
-                review = Review.query.filter_by(user_id=current_user.id).first()
-
-                if not review:
-                    new_review = Review(user_id=current_user.id, item_id=getCreamer().id, description=description,
-                                        rating=rating)
-                    db.session.add(new_review)
-                else:
-                    flash("You have already reviewed this product!", category='error')
+                creamer = getCreamer()
+                new_review = Review(user=[current_user], description=description, rating=rating)
+                creamer.reviews.append(new_review)
+                db.session.commit()
+                flash(new_review.user[0].name, category='success')
+            else:
+                flash("You have already reviewed this product!", category='error')
 
         else:
             product = getCreamer()
-- 
GitLab