From e27b6588b22f6330b11bb765023358536d80a1b8 Mon Sep 17 00:00:00 2001 From: nataly Date: Tue, 12 Sep 2023 16:58:36 +0300 Subject: [PATCH] New changes. --- osinaweb/db.sqlite3 | Bin 290816 -> 290816 bytes .../__pycache__/admin.cpython-311.pyc | Bin 1073 -> 2214 bytes .../__pycache__/models.cpython-311.pyc | Bin 8821 -> 10328 bytes .../__pycache__/views.cpython-311.pyc | Bin 7479 -> 7905 bytes .../0012_projectrequirement.cpython-311.pyc | Bin 0 -> 1323 bytes .../0013_projectfile.cpython-311.pyc | Bin 0 -> 1433 bytes ...014_alter_projectfile_file.cpython-311.pyc | Bin 0 -> 862 bytes .../0015_projectcredentials.cpython-311.pyc | Bin 0 -> 1442 bytes ...dentials_projectcredential.cpython-311.pyc | Bin 0 -> 789 bytes osinaweb/osinacore/views.py | 15 ++- .../osinaweb/__pycache__/urls.cpython-311.pyc | Bin 3264 -> 3485 bytes osinaweb/osinaweb/urls.py | 4 +- osinaweb/static/dist/output.css | 12 ++- osinaweb/static/js/pop-modals.js | 27 ++++++ osinaweb/templates/addcredentials-modal.html | 40 ++++++++ osinaweb/templates/addfile-modal.html | 91 ++++++++++++++++++ osinaweb/templates/create-project.html | 26 +++-- osinaweb/templates/project-details.html | 58 ++++++++--- 18 files changed, 244 insertions(+), 29 deletions(-) create mode 100644 osinaweb/osinacore/migrations/__pycache__/0012_projectrequirement.cpython-311.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0013_projectfile.cpython-311.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0014_alter_projectfile_file.cpython-311.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0015_projectcredentials.cpython-311.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0016_rename_projectcredentials_projectcredential.cpython-311.pyc create mode 100644 osinaweb/templates/addcredentials-modal.html create mode 100644 osinaweb/templates/addfile-modal.html diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index bc0204c605ebe1b1e3d7ed3523a82f8846a2c3e1..1d181ab665fd8ddf17da35af1f15fc13b827144f 100644 GIT binary patch delta 443 zcmZp8AlUFgaDp_W=tLQ3R#67MtP2}c1oasuHkawgIPe=9Ss9vG8JOxBni?CLnQeZU zudE=#!FGXx?-oxVcLtXe?-ouO_HS$#HXADJVAE()=4AD44s|rFs7T5)FiAHv$+Sqz zFE=PJ%1J9RFiA73Ff%X7Fi)O5VfGfUbR!QxtBUl<%z)qw%M#a61JAU`(BN{j&`66) z_juFFoWRU-mnhTR^ojzrlFA$dBLgF2T?0#9BQpggXPKIsT5SF{osWZqgYPB-zX#vV z&0Gu4@~NsY`!W)8250lXb=&`~V`Os_;o#?F;D5xwguj(PjsGyeJHG}$=Vrlzk9^ZL z{xk9mpjpV-4iw$4@t^6=1!i&XNz>UcFl(}L|KdKzJqZ{PG2Bc>64U$dFe?ih8e5r| zSs7aBnOPc|7+M;MPmjL~5jL{4GB(mPH#9djGc*zdtL6u)1_~RQ>RFhZTN+tz*So`f fjhR`Tzi&GG21b3Lb0YYsckXA5+y3S~vq%E~ZAyk; delta 184 zcmV;p07w6T;1Ph}5s(`J50M;01rGo&S4y#D5ibE1vvx0BKo2lEIyE&qG&n9cH#0Oi zGqd4uBOnq72lfCC+6;~hXbM6NvZ6v{z0@9E!?`6EmB*aT{7e*7js)=9`^wXJ_*vpU(k~&(DDWNC12z zB^p|Ha_|;C@4y6;+0bBB#=uONNjtFu30MX*^#)9hvyEgFxQDY(hgvnIP-#SEPC;o3 zl||IhDX6qUEcJCUdn~!!?^W z&GlOCWz(>`o{7i8-QaaUwu;mc%WbLg*S;`5!U56w{k;6lyZ;`_>u9zE!v+kB1{z~axRn1@V)eflc3SL$_zq+|4=mID~6Ym^~?Zc<77q*w$ zdVYI}9x)n02dGo-j%D+s1rk|Wk1m;@`z43FwIHO>$($!KLPDh;quE3x2+_y)Y#(33 z55RZqw%{h#*D~zWS&w&F_wXlkpC;}kXeWK#XZyGl^a%GP8fYBQImLUDr?|GBtfozd zU73)2m()$_?@BRqtkj)DSCym`GGnRE^^Vt?vIr7W_<841#CjuN*v$o(uLt^#?PYp8 zXGG{qaY~MKTJLJzb$ns13SutPs0%@m3T2o_n4gz1{SDx4{K&eGNNE>Q8-RZ7tHG=33d>pY-At$ z#d|G0cj+fNe)YU3fp@0E@%iK6Z2zJv(M~fwTj~Qdwy+QVV&_^odGRMXe)YU*VCgrx zuQ2%qCU@?&pb$bKfI=IzL+jlZ%!V)h$)uHD6E*m63n2<`VtfrnvAzt6H{_C^In3&2FPR7^3&v-EXF1`Ihn0say)Z_ z*e?#7-29Z%oK(9aF`ycdy5f%vlYg+OGcz!i%oPTi3k))oBRM=- HM1ZOQc&bOy diff --git a/osinaweb/osinacore/__pycache__/models.cpython-311.pyc b/osinaweb/osinacore/__pycache__/models.cpython-311.pyc index 19f13efbcd75d3fd0645b2ff9908303e5e0f971f..e3fd9f9e744201be375b06e8bd3be58aac268f80 100644 GIT binary patch delta 969 zcmZuvO=uHA6rSCrNt;b~ZMJTIve{@0kD9G)Js8e-Zn@nJHvd;H}8AQeDBTgiRO&B z+uiL$Yf8I z?K3y0(qC#9_jr@PPH)OXm-P-7@K}KvQe48B@?HF_k|Vf)m&-pFIfMw@eveEsoR0cv zIxsM3c{9c3G82#mc1l(NW&z&OMo6afVR1OgsPTU`MQtr>iduEJF2)*S%oJlrif*ex z!AKb?qCoC0{jLsBMY}}H|(NO(D3JFoj@42$@32m^kBf51exEH~FjdzFXxy^p5)?&1o8a z5tK*U-RNn*{}#bID|9ZMKkeeA8GdNS6-&Z}bS_^cl@cb)=>jGX*uyL@qk6VT98E0j zg9(65F!6-Jsb(pWjjX9eJ`LBEL_rHzIFG4-v$UY;2vN-&x%X+2JkE Nj^80kq~k-^{sDwv{2KrO delta 90 zcmcZ+@YRKHIWI340}$-{@;@a?WFnsgW6wtQZbr5g@n8l`iOpI}p)#9Ym3wtVlATEB)xcQRmM#jnV8kPXRTN$SS diff --git a/osinaweb/osinacore/__pycache__/views.cpython-311.pyc b/osinaweb/osinacore/__pycache__/views.cpython-311.pyc index dba2f5187552651963267bcd6797c1c2550179d3..f01a2e8a861f72a10a6548b805ba1172f321d31f 100644 GIT binary patch delta 870 zcmYLHT}TvB6rQUyYtFjk?5;cR&W@|4t8Kp$C1IGW683AEgk+%(J5#Q^{@vXk42c2@ zdMK0wMGrxc7-oMaltfR_OXY)tFFi%iK^ajI^w2r8Ru|64Ip;g)-g|zY*MDqK?s+`2 zfah&eu;2S8l_0w^SCe2Ht?;55vB4k1=PKh1u**$mwA zY$>0~=Ms{92SGl`zBY|i|fHMC3GHZz^G3oZ-cZ%v33YOjR6?c3|j05v(uo$R=K7WIB3PYyw zV>-O{gWQeQeH7=l38@#=Cl09wZpjI>o)Kx%SAb~^vW@0Ta-DWuH?-EmvuM6T$<_B; zt1&h(Dq&3MM{n*}ER{zZKL?GaKeREylBUry>o|$Py>LM?xZBl^MywDX1UDJ94l!45 z9a54tV%4x1T4-;f zL|Oz+GtbSJhRJDYoaV)8RL%f6HIq}TICY5k5>PuhHGosed<5Rd{)=A8 vv;x++Dj_ zIe1Xe&cTWx2olk>XbiMoJbLh!LQdX1c($HIFFLcSI`F=o`R03X-kaGk!&`%{mrkd| z&|Lk@$SaRrKH+vPnim3wq^o6C!AzCXrcL(gfpMk<>+gi04nc!;=b^A>6Jrj_hScb*$FMWZ-Vm_K}jFV7kI;*smc#RWb{nlwVeg3#N`1Niyu`7fW| zmGg6$STQTlx+h>mQL)-5B_f_jzJ&aScmcgKJonVZG4$?3wbKuKJeNW3N{SbeS;ZXP zdmjvVV>>Hj2$L+FN7Pi7*H{31*?}-!IW!wr~}mLfwDo zfSt*{HT$+Z+;oQD(JT27%?XJUH&@$JPrR|?EU3(Qp5J@(=FNNGd-Ln^ zvW;Lozm3=oBlMRN%2Am!r`y0hMif!aM}gMY0^G-%lCiJ%4UE1(RR0N4gK4Ak44Uc) zJ%v?_eud&a)UN!k#5R_8;0=Wndm)dc8HAMi(XKnU&3{XC;dBPfW5iHjqo|LmHq`n$ zM$9<7iDIfW=BQdapa#qeHIJ)P1EPRcjD1XNxn-@?Q0v&9YG4CvVY8ImSfvK?vPWe+ zXk?c9QGLNJmmIAhFaJ05eLU2USEhjNQ&`1-99HNm;L(uQ%@PPe#R?;jJ8meL{P@b1 zt5*pRV@9Y0#PMS$3fT?)Q2bjFvj;J8I3@0O@SOOW@aMmmX_)Gym|ChW+UsJpY62v_H6CapKEU<&Gkq3(&qXzWb(ppelg5u()i}SBRjQW#0s(ocNTyro%%kgSig(Mv+orS%6gqT} z*Q_Yhn+s*9c>bNT4B|q0R$NkC?&>|@Uez{>#`sLEgQ#9?Gysz6nx+97T024Szy8h8 cg{1s4b5%1l^g4NDr;Up*)W*yI+0A442SOfpI{*Lx literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/migrations/__pycache__/0013_projectfile.cpython-311.pyc b/osinaweb/osinacore/migrations/__pycache__/0013_projectfile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1648bdee0cf65a621cf986c6b1c6796015d9497 GIT binary patch literal 1433 zcmZux&5zqe6dyZ|H+HgHr)-IgqQap_c(M@IQyE*c_JU3)~W(DuE6$*zxy6YLFh+w`@X3ujG%-%U_oz^E@`VI=fR zA|ld@o3MzvMjo#e4zL8XjOF>tOoAw2W#d4^mDI9QXs|L@XK=#_tffsgwNVNUuFY4^ z*{r2DDR$g$2J56afZ(1B>3+3P0XDU9krNurg?_xYtB(K`@F<@v>#2zS8B z2H>FK*8tOXrra#R1Y{LIusv(&Q^Fe8u3dlEoKSyEh9M<)r#2-n@j_PpI@9%RhcMB` zw|Y$cylY6TW=%ui98zM11heXd+O9&zz>M&SuSA`r}no1 zpdmnAt?x~Tc%$$RlMc9hu2rTJ$G5N<`b@&$nyutPJ*Y3EZRIMX1Rkf31BrMh^aTNP zG4u_QYLGaS4{YM#V9%(tikSvrnoKoK=%J}YfUlY6-Kpj9ptyv|gm{>ELz@JYw+%;1=cPyH-9H5--Lfjdv_5fUao&ZVxd0{6V~an@6x&^Czt{}2p-Bqc!*06D>k&^za! eQ}k9;Jc(QvLrvq@~BhC)@;Ln-14HWfWCf*=({_oC||2tzhAE!ifSHOW$Y+k*$e zOK<%LRk1(7AK(wDu!m)?p1h@OPd)i2yQ!5rlf1m|y*GK^`;yO#iw@xW(FOjA0Q^#* zUX8gkZKHDl3>b+aAwEeoUn8KwGho^WU^*v#y*_k^-nVn)>&$ost;TPaZfVjc_VX+m(Twb{d3>A7U)ijM> z9Hcwa9u8s=Fj|O~juWb>Xc{D38kKEqMLcF5>}b&{PN{S##kyh4(O;nS-7tt%twM|s zc*=MhMm*1ykkWY)7d+ckZ^;Z5us4xHg{30~d@kr$n5vo2-h17gXSs(H6`@GHry?9C zJS}ps6BI$brxIy!pY?-uTX-qot?(RH{x0v$ij*GS-%sYDGLLAW*j&_yDn-@@dzp#t zE2Esei)M7bOB3vSrLHZTqZg$E_U(_(*t#`YS({v4nYgR_cgF7Om*wy7vD^OXw#RO} zY#O$60%%T^DRt8|N6*#HuGf7!EkoKf=Ig9isZ}X7V{%QERkb(JJG0s|$scDo5#rAd m`5QE)P6$DEq;(8;FJGm(K+F;@n|)`zw05Err~k=Teg6P?JmXUU literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/migrations/__pycache__/0015_projectcredentials.cpython-311.pyc b/osinaweb/osinacore/migrations/__pycache__/0015_projectcredentials.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fa53aa2aa2ade410e92f4db9d630fdd2d5e3d02 GIT binary patch literal 1442 zcma)6J#5=X6h4v?B~r32xe0_eQX2#+8U>b=0#1Meb^u3;ivGkX;3R`kl%RAcg(^j= zM=Gv^y717UW431Osjo@7?3O_rCXz zzpbq32*$I!h}={V`bP-KNH3VPHZZ>+jId;*vDB5ua#xmwEZa&qC8JLfR(?V_MWj*k z4LSyIPhiEPo5u1Us->R`u_kkUYz?XDTdw1Ab?jndd%OLGZS-1M2xk{1aW+9+38Suz zrJ>YSWJFT0Pr@=58g-OO9N-kpG*(YC$0>*cRy+nW&PJBmM1!>x{TNPo0&8iLdkdTV zTiC2bHd^8t@X<%PL>j3}F2CfGtPx&4S^F=719_M}DICiXE39|`7OS`jxUO^Ub^<7% ztGS-#n0=QLe&OoXk2ej|_6ap6)E$w&Kd@|K2*TIDiZv}tFmZg#v^_3c_)dq*pS5c# zo;RnyYxF5GeS&#zLanh$4~%cg0oOc2!QOgEc>V#QJ=Y_KV~z=5BV*IDT{;B=p|HLI zXloKw-2C3Ki8J)?^X$a*ynUBqo&hsFa4F9$f_qq8#@<+{Y6?#|Q`?5L90NLq_=L;8 z3wfrZ6V-u5Z0zmU)_B&4f-nrO8wRx16f!k<-Y~wKnzk?&5+)PkK)!v8cvN&K&jA3C z;%(7~RCEi^-?WB1kbFnD=348%Nn=*;0IJr|`2sLd@yK+BE|+nSXQRNNpLwRWv)9^b z-{QJEA&VaW9i54az4DuP0T! zHY?nk7ca0%{qen^Qa^o%Rkml9?Vz&F3ODA(_gH!3aVIEmoGPrmH7jog+7I}ne_uJAI{2$LHUpsehhQ!xz#YOY5EHUI<>)@_%-t82$xIs*o-K literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/migrations/__pycache__/0016_rename_projectcredentials_projectcredential.cpython-311.pyc b/osinaweb/osinacore/migrations/__pycache__/0016_rename_projectcredentials_projectcredential.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15ca8a8c2d90eabad09a5f382b37fbf3d6f5657 GIT binary patch literal 789 zcmZuv&ui2`6n>LzVv<_Wwbh$Hz=Jv1vNXAtviZW?i z%%|4|^XCW-fy0n6z|CYthPDN~H|_>ON@oA;9UQged8IONHOL~l}OHbQKfNKs{T%sdwnH$dm)F1c_L%9h;y#Ig6|tN2yZBl8c3-M zD9r_%W*qTNN3CXb@L%cAyJI{FII3Vk9CQ$i!`E@IK#bn)Lmn|H4P8#3q%7{u)6R zQ)`n0spU7$MNqy%H@jT53;srJTPyDDeI0=R;7f4g-9KFoPgkGRj_n6$fbLwo+IITx z?44fnPIu%Ww3XjXzQ*>9JPlu8cbK*nL>JzRM&6h5E{6E0Lb-#kwh19P19|it9$tNF XcZs+)EV^&O$*sp{x^R9?)iC}8BKXx1 literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index d375bccd..66fa26a5 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -148,6 +148,19 @@ def add_status_modal(request, *args, **kwargs): } return render(request, 'addstatus-modal.html', context) +def add_file_modal(request, *args, **kwargs): + context = { + + } + return render(request, 'addfile-modal.html', context) + +def add_credentials_modal(request, *args, **kwargs): + context = { + + } + return render(request, 'addcredentials-modal.html', context) + + def add_point_modal(request, *args, **kwargs): context = { @@ -202,6 +215,6 @@ def save_note(request): note.save() - return redirect('home') # Redirect to a success page or another view + # return redirect('home') # Redirect to a success page or another view return render(request, 'addnote-modal.html') \ No newline at end of file diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc index 0cb661dbd47c591af0c6d6e6a304012a3251ff41..e4a855a79243169a47385644134ca28b980727f7 100644 GIT binary patch delta 377 zcmX>gIagYJIWI340}$*_W=NIgWMFs<;=q73l<|4nM)geQ$qyJ=`3+LpvgBd%DTb3T zFp6p#0mT&HV#aGYmoYOitOjBTNEeS%Ofd;&&@|mVi+MV;j7)M-YGO%hNn&xfzD;pS zkySxaepYI7NqlCC-DGEWUssOAl$5;ul2rX$>`+z}NGL5c2Py<&Rq+FbfF`A+=9Oe7 z<`nDS;zJRb+{Z3I`2c%6qta#%4sOQD8JzqIU?uS&-SN5kDTz6^M1fl35r$0m=9FP7 z5}#bjd4bCc=y*mTE}ptMm@9=*NPUIq6-~zr9?=(AVlJ}8Tw#fse3IL2vKWsz5Q~Xi t;FOx-dPT&pj`7n>z VWKP~zetijkrUq^hEHVLV1OSfcFnj<2 diff --git a/osinaweb/osinaweb/urls.py b/osinaweb/osinaweb/urls.py index ffeb6ec4..1b8cabfd 100644 --- a/osinaweb/osinaweb/urls.py +++ b/osinaweb/osinaweb/urls.py @@ -33,8 +33,10 @@ urlpatterns = [ path('createtaskepic/', views.createtask_epic, name='createtaskepic'), path('addstatus/', views.add_status_modal, name='addstatus'), - path('updatestatus/', views.update_status_modal, name='updatestatus'), path('addnote/', views.add_note_modal, name='addnote'), + path('addfile/', views.add_file_modal, name='addfile'), + path('addcredentials/', views.add_credentials_modal, name='addcredentials'), + path('updatestatus/', views.update_status_modal, name='updatestatus'), path('save_note/', views.save_note, name='save_note'), path('addpoint/', views.add_point_modal, name='addpoint'), diff --git a/osinaweb/static/dist/output.css b/osinaweb/static/dist/output.css index a724cd5c..ad45f071 100644 --- a/osinaweb/static/dist/output.css +++ b/osinaweb/static/dist/output.css @@ -795,6 +795,10 @@ video { height: 45px; } +.h-\[48px\] { + height: 48px; +} + .h-\[500px\] { height: 500px; } @@ -924,6 +928,10 @@ video { width: 45px; } +.w-\[48px\] { + width: 48px; +} + .w-\[5\%\] { width: 5%; } @@ -948,10 +956,6 @@ video { width: 60px; } -.w-\[70\%\] { - width: 70%; -} - .w-\[70px\] { width: 70px; } diff --git a/osinaweb/static/js/pop-modals.js b/osinaweb/static/js/pop-modals.js index e0d0c0db..2efbf722 100644 --- a/osinaweb/static/js/pop-modals.js +++ b/osinaweb/static/js/pop-modals.js @@ -81,6 +81,33 @@ document.addEventListener("DOMContentLoaded", function () { iframe.style.width = "400px" }); + //ADD FILE MODAL (in the inner project page) + const addFileButton = document.getElementById("addFileButton"); + + addFileButton.addEventListener("click", () => { + const modalUrl = addFileButton.getAttribute("data-modal-url"); + + openModal(modalUrl); + + const iframe = document.getElementById("popupModalFrame"); + iframe.style.height = "320px" + iframe.style.width = "500px" + }); + + + //ADD CREDENTIALS MODAL (in the inner project page) + const addCredentialsButton = document.getElementById("addCredentialsButton"); + + addCredentialsButton.addEventListener("click", () => { + const modalUrl = addCredentialsButton.getAttribute("data-modal-url"); + + openModal(modalUrl); + + const iframe = document.getElementById("popupModalFrame"); + iframe.style.height = "300px" + iframe.style.width = "500px" + }); + //SHOW TASK MODALS //Show the update status modal diff --git a/osinaweb/templates/addcredentials-modal.html b/osinaweb/templates/addcredentials-modal.html new file mode 100644 index 00000000..63cd6b20 --- /dev/null +++ b/osinaweb/templates/addcredentials-modal.html @@ -0,0 +1,40 @@ +{% load static %} + + + + + + + + Osina + + + + + + + + +
+

Add Credential

+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/osinaweb/templates/addfile-modal.html b/osinaweb/templates/addfile-modal.html new file mode 100644 index 00000000..31d42b89 --- /dev/null +++ b/osinaweb/templates/addfile-modal.html @@ -0,0 +1,91 @@ +{% load static %} + + + + + + + + Osina + + + + + + + + +
+

Add File

+ +
+ + +
+ +
+ + + +
+
+ + Upload + Document(s) + +
+
+ +
+ +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/osinaweb/templates/create-project.html b/osinaweb/templates/create-project.html index b030a794..739a4996 100644 --- a/osinaweb/templates/create-project.html +++ b/osinaweb/templates/create-project.html @@ -49,14 +49,23 @@ + class="w-full h-[50px] py-1 px-3 border border-gray-300 outline-none rounded-md"> - +
+ + +
+ + -
@@ -70,7 +79,7 @@ class="w-full p-3 border border-gray-300 rounded-md bg-transparent outline-none mt-1">
-
+ - -->
+ +
+
+

Project Details:

+
+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Deserunt repellendus temporibus et + voluptas! Mollitia error suscipit sint voluptatum perferendis earum nesciunt fuga + laudantium, sapiente ex deleniti velit, quod odio corporis? + Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem perspiciatis + molestias inventore delectus atque praesentium voluptatem itaque, aspernatur et nesciunt + dolorum omnis dolor. Aliquid natus ab laudantium pariatur porro. Consectetur! +

+
+
+
+ - +

Requirements:

@@ -222,6 +241,10 @@
{%endfor%}
+
+ +
@@ -263,6 +286,13 @@ {% endfor %} + +
+ +
+