From a121d1042b5fef9034fb726af09d5ac0b3b8b19e Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Sat, 27 Apr 2024 19:11:03 +0200 Subject: [PATCH] Add feature to install chat on the home screen Signed-off-by: Emmy D'Anello --- chat/static/chat.js | 21 ++++++++++ chat/static/chat.webmanifest | 21 ++++++++++ chat/templates/chat/chat.html | 55 +++---------------------- chat/templates/chat/content.html | 61 ++++++++++++++++++++++++++++ chat/templates/chat/fullscreen.html | 34 ++++++++++++++++ chat/urls.py | 2 + locale/fr/LC_MESSAGES/django.po | 26 ++++++++---- tfjm/static/tfjm-192.png | Bin 0 -> 3942 bytes tfjm/static/tfjm-512.png | Bin 0 -> 10702 bytes tfjm/templates/navbar.html | 9 ++-- 10 files changed, 169 insertions(+), 60 deletions(-) create mode 100644 chat/static/chat.webmanifest create mode 100644 chat/templates/chat/content.html create mode 100644 chat/templates/chat/fullscreen.html create mode 100644 tfjm/static/tfjm-192.png create mode 100644 tfjm/static/tfjm-512.png diff --git a/chat/static/chat.js b/chat/static/chat.js index af028d2..9252ea0 100644 --- a/chat/static/chat.js +++ b/chat/static/chat.js @@ -251,4 +251,25 @@ document.addEventListener('DOMContentLoaded', () => { } setupSocket() + + let deferredPrompt = null + + window.addEventListener("beforeinstallprompt", (e) => { + e.preventDefault() + deferredPrompt = e + let btn = document.getElementById('install-app-home-screen') + let alert = document.getElementById('alert-download-chat-app') + btn.classList.remove('d-none') + alert.classList.remove('d-none') + btn.onclick = function () { + deferredPrompt.prompt() + deferredPrompt.userChoice.then((choiceResult) => { + if (choiceResult.outcome === 'accepted') { + deferredPrompt = null + btn.classList.add('d-none') + alert.classList.add('d-none') + } + }) + } + }) }) diff --git a/chat/static/chat.webmanifest b/chat/static/chat.webmanifest new file mode 100644 index 0000000..afddf74 --- /dev/null +++ b/chat/static/chat.webmanifest @@ -0,0 +1,21 @@ +{ + "background_color": "white", + "description": "Chat pour le TFJM²", + "display": "standalone", + "icons": [ + { + "src": "tfjm-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "tfjm-192.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "name": "Chat TFJM²", + "short_name": "Chat TFJM²", + "start_url": "/chat/fullscreen/", + "theme_color": "black" +} diff --git a/chat/templates/chat/chat.html b/chat/templates/chat/chat.html index a57bb63..a7c5c45 100644 --- a/chat/templates/chat/chat.html +++ b/chat/templates/chat/chat.html @@ -3,59 +3,14 @@ {% load static %} {% load i18n %} +{% block extracss %} + +{% endblock %} + {% block content-title %}{% endblock %} {% block content %} - -
-
-

{% trans "Chat channels" %}

- -
-
- -
-
- -
-
-

- - - -

-
- - -
+ {% include "chat/content.html" %} {% endblock %} {% block extrajavascript %} diff --git a/chat/templates/chat/content.html b/chat/templates/chat/content.html new file mode 100644 index 0000000..4588ef2 --- /dev/null +++ b/chat/templates/chat/content.html @@ -0,0 +1,61 @@ +{% load i18n %} + + +
+
+

{% trans "Chat channels" %}

+ +
+
+ +
+
+ +
+ {% trans "You can install a shortcut to the chat on your home screen using the download button on the header." %} +
+ +
+
+

+ + + {% if not fullscreen %} + + {% endif %} + +

+
+ + +
\ No newline at end of file diff --git a/chat/templates/chat/fullscreen.html b/chat/templates/chat/fullscreen.html new file mode 100644 index 0000000..8d5053a --- /dev/null +++ b/chat/templates/chat/fullscreen.html @@ -0,0 +1,34 @@ +{% load i18n static %} + + +{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} + + + + + + Chat du TFJM² + + + + {# Favicon #} + + + + {# Bootstrap CSS #} + + + + + {# Bootstrap JavaScript #} + + + + + +{% include "chat/content.html" with fullscreen=True %} + + + + + diff --git a/chat/urls.py b/chat/urls.py index 77d52c2..c47f175 100644 --- a/chat/urls.py +++ b/chat/urls.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.urls import path +from django.views.generic import TemplateView from .views import ChatView @@ -10,4 +11,5 @@ app_name = 'chat' urlpatterns = [ path('', ChatView.as_view(), name='chat'), + path('fullscreen/', TemplateView.as_view(template_name="chat/fullscreen.html"), name='fullscreen'), ] diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 8423487..8e8d78e 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: TFJM\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-27 16:15+0200\n" +"POT-Creation-Date: 2024-04-27 18:49+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Emmy D'Anello \n" "Language-Team: LANGUAGE \n" @@ -143,23 +143,35 @@ msgstr "message" msgid "messages" msgstr "messages" -#: chat/templates/chat/chat.html:10 +#: chat/templates/chat/chat.html:14 msgid "JavaScript must be enabled on your browser to access chat." msgstr "JavaScript doit être activé sur votre navigateur pour accéder au chat." -#: chat/templates/chat/chat.html:14 +#: chat/templates/chat/chat.html:18 msgid "Chat channels" msgstr "Canaux de chat" -#: chat/templates/chat/chat.html:31 +#: chat/templates/chat/chat.html:27 +msgid "" +"You can install a shortcut to the chat on your home screen using the " +"download button on the header." +msgstr "" +"Vous pouvez installer un raccourci vers le chat sur votre écran d'accueil en " +"utilisant le bouton de téléchargement dans l'en-tête." + +#: chat/templates/chat/chat.html:40 msgid "Toggle fullscreen mode" msgstr "Inverse le mode plein écran" -#: chat/templates/chat/chat.html:39 +#: chat/templates/chat/chat.html:44 +msgid "Install app on home screen" +msgstr "Installer l'application sur l'écran d'accueil" + +#: chat/templates/chat/chat.html:52 msgid "Fetch previous messages…" msgstr "Récupérer les messages précédents…" -#: chat/templates/chat/chat.html:51 +#: chat/templates/chat/chat.html:64 msgid "Send message…" msgstr "Envoyer un message…" @@ -3748,7 +3760,7 @@ msgstr "S'inscrire" msgid "My account" msgstr "Mon compte" -#: tfjm/templates/navbar.html:115 +#: tfjm/templates/navbar.html:117 msgid "Log out" msgstr "Déconnexion" diff --git a/tfjm/static/tfjm-192.png b/tfjm/static/tfjm-192.png new file mode 100644 index 0000000000000000000000000000000000000000..09e57f420582db8f8da155cdd1712c1af2400d12 GIT binary patch literal 3942 zcmcIn`9Bkm8{b&wzD1e)$lTH#i77W}$TcRn+}oTXHup_FB+5}KDH*vl$0V`J70I>S zNyD5?h_C*L@AJH#=Xt%}ujlyTIbN?P-Rg!32kUuO006*YW@>12YDxcundwy9%mjh~ z0ARA8fq|8ofq^(C1nuJ&=nVkK<;CXdn)c{JdR<4&jpSJ)xZ&ak0$^fQnrF>59{B>N zCwAa`3wV+&hgn8u#hepn)AP-*xrNu&iPhrFad<5qEohr*`iTXrlE)RTjXq*bE-?~s zrK0|o{XM|0AuCK$*(X%NV^aXg{#39>D8K0CP^FF8ot)a3{rzacW#spjV+h6kyB8iI zoufvnOZ%4oLQ|=9M-N+cUpjfet5s6Lmj2-8btFmJa7$EVa1^*pm{%KTq+eR^ z(>-F$fg33oqlDd-icHSPOZRadgS&_@wtT)|8#&If_KDwp%-l0)&cmjU^_tf|u*~6@ z2#tkZHeeq;v)ZP{exBh54iu{8QWRI~4Dg^ljC>D5M%Y+*HR9WXlf z0N_~_e3o_1b}R#W{SuRsXKz(HG@n_rlbbbB?U$cNmNna=P6j$XO%OJ64+Mk( zL1)?-HE_FV|3`0&J0?pfJ1EmDH=CMTG>JQ3Mk%K}$|3oGCY#ao{Gcx!YrqoDEN}$y zVSG5rghVAZkkEK80oyO7?4TbE!s~ksszb+g_F<-_wY_r~a9vG;Wm_U89_Mre2UAs) zjYo-@Gb`ZLSoL0dPczV*@_yh!v+!;L;Hu=lkkE6t0w);X1bddkf~LbA7V+ERi8cHM zHUUh?;A8o^+dN%Vj=S9EAU=T-n*iAq$t^_2{(8-mS-mlXc__@s@aK*#s^K?@hfh|rMF~P-y~2!T)cok2c@I6>%u?APB1!BYj#B8*02dUaFF5H z=Y$B->Tx#XbOc?=rY4Oswvr1)m>N?xE`#p8w}`bQ5lHj)iF8ZwkBQks#>j=X=7YbN z4kl^f#o%OI@=?&*4yL8IrxP&ab{HqK$?x1OL2nM{0R3kAzyO{+Vcd!LYlidTEwC=Z zeX`8^qOF~)28ukIz*Gi7#*Q`lNQ=+t6`)kjTbl74t@T!Jb$suWpu3_%{iMR3X3em8s?_ zW}^*=>Xc-U*fr>;xm)UR27RYvx3o#2q{d=+#&KIu1~BNo zSzalG(!1m&O~iP&I=XMEZQOXQ)&tsacPM#i{F%|Mdr;&|dms*759vgF{x~WPfQJum zchb|=4gLcGHd0In3F6jgC${}$K(|!pZSl}u_5>G z+WQjQngF!ybwGa5Wa^V@^m)cL^U{WeA!u?ZWNoHvJyw@+5+;F^#*?(q&WDn8jHK~% zpursEaiJ1i#YjJHlIY@kC&4XZ{L4xFl#b_B&xJV*Ia*t-synoR9l4B z&FXp<-kvmx%@I&ZL3WT^`V~@King>%d0#OL)>|^IkX5F1a{_j7>{>#1r2H5F`)4+N z1sg{O>m@D6AGj-8zu3Bf(ws6U*W7PhwdH>AQeRQtHr5U-In)hK`O4gcMWq~3b}u!fG@OgYX*0L@t~!p3--NFrto zR1K?fHfF^X!0b`iR&)(7@c!bARoO7Ma6ob%5!hOAt#X)n*RPUNovg zJHr?ZG%ZxA2%0s-GgrSb?1k%1zRm5anF zzWi>GWykE}#frpIzjxUKEE_*=YEwh<<$|>ev}k}wyQa^GTbflja>7&Y;}FubcG{|3 z-=Z-0WD-`5Ueg1&H5)7QkH1?;a4lZ;s%(PP6N$*`14ejt#o}Le0x}GZ5`%P=k42+Y zKEG7kOVZ-F^~O(x;OVKYj2&On^?-r+;Dk_<2x~)wq>~P3eMp1~q`V%zy(_X23D=MGh~?Y5OmMb&ren7fbS57B!S{!+1eb2LCHm03){HLoQxQ z9dY*co$m-M3bkv?s1>Rv4%q6fBD(@n8%Z{p-5F}4zhV=+C|`}UDG zh|LokUCxf7isup5GHww&baj`|qw3qInJFJe%JebR^4A4Fecc4Kk~u&>Km25Y<3}sF&0U>;r3`IC+NnG z{3t>JIMzH=HB>o_@!r?E%xON%YmLwn)QsS1je~2;;HT(LB4UU6_A`EuJ&7mAGa&vs z;|<^UubHE@IYW9KH`0CbSZ*kSf&FsL*KDe9)6lnV62#C^j zz!0x`-?_BGgPg5iBI@dAYsSh0ZClEonEO6gl%0L1E#vV=HOAE#D;2B&G$pgRg(kO% zEUmo&PA4yz4PWEGf~p0Hds_k?5#6S_{u7fQQQ0oR3&U!&&u`ExKvsH;mdMa{?XNA@4@H;iu|0BxOf4W%I5)sR3{SN?NLfcTEEj?w)D60kUf86*+HHyQW$AJ? zj>{Tg!}4YAk|+vM%Du<0-*bEu{ax0P`%>TMz8}HC_hEV2SswG!75Vf(&BpV037Hpcc1G&rZujfpHHE!?;U zzQrk`r$Y6}`THj+FDirn=n-!U*{qek@l;mG6*;$u{oL7!=u5@Q``ccBW^s6swZv$% zm#Ixgem2FKe%$nH3U?7P7wXI(LFHY;v zyD!F$e#DgBfZhfnz8J#ZIWg4lp6%65suu|cttcv(Szs97R;menLsW`rk~a8Ax$!jT z4_J^$YIM0@Z{h_^gH-}G050-v=s0&gp4U7Q@>Zwc7QoEth9TjaTf+YU9j7#J literal 0 HcmV?d00001 diff --git a/tfjm/static/tfjm-512.png b/tfjm/static/tfjm-512.png new file mode 100644 index 0000000000000000000000000000000000000000..5837e3b9481355f9ca7206f080116365f9cd62df GIT binary patch literal 10702 zcmeHt_gfQN(C|_frPzTh#S*{((vc2&xu6M6iS#Z+Lrf zg_zKb^db@h7%7GlLP_4-_iy;V-`?G4pWSE9*)wy_nVB=~-|Mzl#SZ;-2mk;v$hCj$ z0f3+P$qyV9=DjxV5A6T|-;)4y^Xm|E^D`l#$lC!yZ~(aQI_|Z}wJ(=t+Pwy$7RrYr zkC>e?KY5_x{WIT^zmF>8T;Dnzz*?C-RuqFgf06scHDt~A)2|;ti;Er=ojDkvpl_rP zuD|v#*Xq#4TgLh;Ujc`Tr0{cUx5HF!t)1i(eJA-v3Y+nvH{Tv| zKe;SsdplZk-er1$BQph^_Diq>C2LN7d^YlLf!;;Jy6L@)RM3;{H}@xV4j(fM^@wD@ z4D0uK;Q#ccb#$`6wd$z}=U`t)t(!l=KcBt3i&OXWaMVZMbL?~&Zd5}1TqwJ!evd#u za?H8)oc)orxzELLK4+mtme2pyStgt82_&0YsAamJ_NHZA6;cL~B{&CK8gvh1j|bad z5D#x0-69`6GAZGt4&e8`h$a>iaxm!>IHr4Uim=?YACo^eBhm6A zv_0m*#vpHBgl}10{RiOwcjq(}V0jRckZUes0HAjMzlZNW$t;owJP;1Cu{f|Oc>0LE zfT&uX1rH=0Zs8nmjzl2f!Qp^;DBLF;?soA6bK-R~>o4XD+X>D681{nih^JUp5T>xZ3+hIbtQW48ah z{-3WvE2hHwDA4-t*QAj`9SUQDnN*`BL#l1dgE3+l_f*;xV+? z_JaU+mID!ogkHhuuE!GkgBWiiX)3OOl)4H=<`s>0_U2C2h!A8t%g?A?40wU$(rx3q zpLvcbMximwyT9{H0YF2>P07HRGG{a$7KK4787NRbfO~h!f`<`Veu*F>r8+x|N6he` zlL9*hgbaSj4|qRVPNktzjW&v~GMTh1;1pruDg-87i4E^P^?;~QS7FW%9A+T1pv@&e z(Y}LP8uFc3+cko20-GWF#sn)-{v(InhuUM+1>Y^EG*x-~jQY9pP&YF*!qt zxOj3EU-2>SwFHmp9d%#;i@>*#Bx#@c?@2*<4Qb8%<-vICUGzEiZ(!03t z&scLG<*u|UK!WG`_*y4TibxOl?^~Kx#!unoxQ~SSl=Q;^4Lyc}0m`yH+7lxt8Gv3% zWiI;kooW3B02z-KYHk+xy3*nd)%NMfoI8C46XN3ybN@Cmcwq+a^%zvY(U&V@2}n(r z1`uB@SV59)nU6sX^?~NNnybK?P~tH_n8oB%9tp$zZaBERC1Jv!5Qqt)h48m}o9cQC z#W+A08gJD5@0bYpNgn}(hy0(<$S2>QNh|15)nDW^wa*GBw7CzitHq=rU7bmf`8^>i zDg-2ql}t45NJRi^yK<{j5FWo(xJ@JX0m2WPW%KfJ|w&G8sPfapPY=D&<|Q;2fMOksjBv|rc6W-)>G z6LeZ)n=@kY7|>vES+{^JB!)$f0E#mLF^#O}pqc-0(_;KmSn-MqC7OUn+e!w86w*iM zHl36Ptea~#-|w{))B@g2LEt4X=|zdxWh zYj@GiE;G;J#_Tt=HpnF?LcME~yw%eO#!OBb-S?oKFdX67_YH zslb_Veob>YUfqk`Hi`+tq>HUJ&w!%-p$cA6#)=H+;s<|$yqx}dar^CiDXT5 z4U1D$x<~QAP9jCPm*mp@$Rgu2+V(q0Ys`c~6dKy;oW71VJ_CRH*#(`D6-j33PUMNZ zDX>G1kAchjo0H{dJ^nP{FT}fcGT(vhWOGy_uQ8wC$i8zNLbBUuzSa>%T4RGEr2sn_ z$&VC8o3^ry^eD>*#(tF3C2kw)krJcQ#q6^aSM*ZU!|!1Rv3pu1r8Nt%$zL;L%;{B7 zREM!CqXe>rbm5di;)w&54Gx%zysp*8IpBt4w;oTj1-2>cHj^ zS$soD3B9&O1>1O*l4v*`wp)ohW~d1l?0ApfcI&xQ?OtTC;-ooW(=*N zn?oSbx^Vrcv3?d9_57q^Mko}fL^NA`I&toqS2t6S6?o{A-B6V>MFM81Zd}TqtseWp zWGQu305db|!7+0j4PY3QuuA9`6P=!EA#7pXI*cfTq19yfG7+-&f8*{m#ACc7rV z>^V;lgdf+)#?(!fARNcG2&Wc}W!j%?8_CW@m7R_4XqKJex}U1?>ZgOhWSNcL?5H3J zq!)-fF#@M>Z<7!cvCGFAcg-rvt1HXq+l_O#*-3-2r%ebAh549KV16g{^puWRu^sSH zmC^!VBMTQ{V|7XXizUL7#CsyZZP&7Yi%o~mOF2(X29#EPmVV!Ncg=+6Y#oyb=Ju2C;wTw$|}ryuuGj@A47$zgGtdp@mUKZ@zebdJUU-?k_&-#v_}U*)@}?6bDZPXE~615RO({381mozjIJ-b*EYz&X<|-5|C@sUjq0Sh1}fN8jR2 zU1D)`r8B=c$jhMhWoM&6_85PHtnm9Ej=GX#K1m zkMzsHTF%C5j5ZPY@oI?3F4MJ`-zlrW&8pL-K2CoP5{jIlzpI0hV{C29uZBrRMWy94 zV2bcsE9imZtO=d@y3TXU3#&#erxpsgJmL**lNbHF+jmZaP5J{#=blR46?jtbhRcCHHuBWlZnP*LO z;xv0bzNjW&3oXNif5sW@9iXWb9*qZKwF#@tt+6UGW*i>W48s_mqoz{18}nIWUb z$u)L^#;h`{r8`6_E7l4|HwRC+0v|o0=E%qP zbHCm2RSTcG$5FN6Nh$qy_=7uS*_IdR?1y20cBsq`1bY7z-aY6=ZbDKkxk1vS3sk3{_dD1=nYpiC2(vPXR$AlVde?itxKV z=l@PmA%PCp6_#^)q~lV)GmOqL>I$pml488K8*qPqn`QhA3ptz2sxtZNx%ARn;HFQvBBh>5*{m44 zYmz#@OQLmVoQlZ{&s#23aeVo)+12E2OD>8eDo+f!lFjN>0`v_A)BSvgJh2$%)IZ^| zP*35sv{JdfIHRR_&1LqHVQ6UIiPW(dhQl5Vl+N{ev@=w=y&C^oC~A7s`g?!umK5JPfDUOy59a{rL>$I_)HG)8OQNUz42B;hfUn}aF{ z-)gw^faOz@sh3wF1Q4NdcfIL!rfSy_>8EqO;EIFg;qC-l2DRQNQn=Br-l+Fw!~Ou_ z6lcnoba$TH4C)Q4Yl{z9ch!BkKU#r2+Y=_4Hr)ULJ_@LsB<3}dH_zMmK64GT z#~>v%bEG6acH{4LAo)Mut6xW3cE0T3oEOhp8B+pk^(juWEkb{GaeIJhuSP}5zRpyb zkVae&bk{niLN^8_bOMq6N=yD*UR@j}F{0Sa&``g(GLkw+DyVVi%4g8D&rhb8V1M7w zMVC=jQ-EfgTErE|dmS0|fQR21u%|BKfsLCZCzmlnLU-2R3@KgtwG&qpvFNHa1r8@W zI3<4j{sEQePDOFZH2Qf(TdOG1johQFyA+1pH-C+BS_)dd~h3TT>)HGMvaJP6!P?RH6?e^`|I2Wp}H z%EK)Uf%BUX5(P>fe#1((RCj~HVS*cf8bDkR7d;4pPaJ6?H$cNTx7 zu?Uf0@amo21rd9MIfG*@%XM$?^>8>_BfG5BnzGD!EZvFD87-JTTgU!bl4t#3mx=S7 ze6-^TefY*i88xgfwO+n>D4OSgTq&>`wxeWfhvB|%LO4xP7jfOe8(fCpT2CR@4A57g zG;2Hl0(AeH>F&mlls+e`KXQIOz($_sxdsh%^|@BFOxob{_+R@U>x6r(--Mb=aP&4N zr)MG46XknL5Dr+uU{rrx8D1RSoj90%<=zJe4iUn9l@@W@&)EOLUboo7q$?yD@vrOj z++P~Uh`rrPJ^F^Zlta2p!T8zaedIa=w>Q=R8Y>MD>ofBWcn@d1v6A4pTGaWFNIvey z>ZE`M`ZI<2Lq)Ht_Y^ zZ_CZS@Cb}ohi@i{?h8@7>tdQNx96lcGJHwBC&aQubb<*w5MIoUq~^XPxwFw~aMvkF z7#29wO<_M)JfgutSN2?!zO{kFW%7$@pDqIuNK4}&`S-#0;mp_mH)FhDrogoE-Z%os zvuDG+?Fov2H>M<=xhQyQpiVY*>p__4g>hp;l3izQ?Vu{EX0>}jwlLNYdZ`7%>-laO z%M=y2>_5~;m#&KnO&yaVGQT17=QAfBn;)JR`oOYs9=rL_s=s_vhtdn$@dzF|>j1QZ zq6^P?|8qBW>uG?U#T4A;7nW|UH)XPN6<)o%`2pwSXVrhPgC^BYUee>zN#48Vzr?ZCtCR(7pm{_y=gs8&{>MoD?`8 z=>q*+*%Ii&`kc*o**?EG-qVWFCI=onAgOYkAuwQ4KWpMLuAN$H3lYDhYs~MBX*4}d zcaqV1|K0n}m z2L;It_q%G*CRM9O*;QuHnZG$}ID-SX$Inu7Ew`Jt>@sQZ=|>VhdDxBBC9E?u3NM|d zY(mto-%J{v4Is*Umw{Nn>q=hO-}aGpysYWuL5zr}e$_h&c(+aIQED(UX<7_N{CDsN zXFEstq|qqZlRw=JKMb#w%D?eTKN?H)z|XilwN?!H@F@S=MV*4h#8!RSW3Aj@EyRJ8 z$;y{bL7XHw7o&q2F_8Gl@>my3?O*c>vW!wI$iv3~@bq>R#^@62kGxf8&d<><({{Q8 zm{5{z|5)|iaqM0>oV}CjCc!aR=_IE5%?a(v;qzlWU%D1t&3|m2po%lfvsNvKL)Diq zVt?Z>0l#~e%z}RH;oO&IoGMkzb-^j`r^m`yooHkhk9Jip{jr5guqRU-6 zav1Rb6l31qE57Zl;t(9+U z1G%X?7}U+st@2+@vS> z-NmjLo5A1Zuw83JZ0|PX!1#4JJ|LI%1BBNri^$@xU@#HC4Zwt?=G3+VDUX&qZ3EC$ zMOxbh4`Ourn>ynL?&W#CPYzK3QFa!h-p8CP2xx?-=Y#Cnw$#VU>X1+_2>)LcSFa#x zlh}PYt3mAwF!ytVP++6g+PS9L2h&vZ@2=Kn?Sg^5;j=)SPMg?Ky zd2V}(E#=IG6rs5v4?#rPTco&abI}cG`9#QXLbfiu&7dm?{Qa_dfr!C-_TTS zPNU({=2h%>8bwud?n8I%^l@}#_RuHJd5GFQDIq{ZO${n7fN(yB&56vG%izR0n&N41 z(&iZj4U*{Yut5{<)0qqa=;$fL-R?E#ZS~5dfYr7Z#PM%iCaW`UF06M$&>mKHJ zTCg;60R!N<->WgZR19Aq+I4eTXjdD8LwYeD!A87 z9d;t=6DzOj0M`^8=C<*NJQT)ciCn0kj=4b%!t-Rd*dv2h_56WmWHbhObGVyy0FC(k zHqrm1NaD&X+F4nKgk5H`6mPU9^K%a1IdpP$lq<%DC!0!;_`dSkK9NMv(R&21%xE(K z-X2Ce=4Y$RcC-~>_jnXN1y{Iz?~K_Ez_$**+MI{$ug9GjEwcZIW?stu#uf@wEE1c_WfF?mIaGl3ZBKpstK;KKro& z@yVxEp%uL3F6sCxAWtqLCixfJ*sS@xd+ynhm4F3tA+8j7Yk+CbX;f2Wa5 zHOd*zUdLbdUUqSnY|h$pIm{Emn}WcI%3mE{9c+&D-Bu&;nc)U@bO);;azw4AzDQX# za#5Zi$iD}Mx<$r>5L^V1zwlis=x?qab)Jht}NS%}BG zrnNEbdu@3VpxE;Z=bzo65ao?o_7@b?P%};6y6VWtr)|hPUcRyZZ)L%8O8_{&JcO&v zmjoZ`7%EIQS`&bU3T*so2l;Q^=e`x^;|CJj@7)|%`ZTUdIlpk^dZSM(i=#t9oizKe z^!Mso0C3IP@1cGusLqd-D@7 zt9R--;H@!Z#cWA!{gq=7w7P>c7O1KmUA2N(3i1P&54WBxBCW?oV#Melo0>3_6`|JC zMYTr(;IK5HQJbPzmj`DnLb5LUG_P z^Jyqi=pip>f{jq_EQ9GZmDq;fhfl3ziWj#hCO}cn@F}0?r}%hGD}}tO^q*K)gH!nH zS2z=jM|M0h@+ywPpQ_I#ydKk`WP{gRkXe}a<h%Vdrs-J%_61fZotBvj z<<#=@i~_rXx|Mco8Z8UsX`{5X0uU-H7}`-ij$GLQ$wQZ(ZUX48P7amKScv&wTDCM`fY5$su*#wS3`PTifR`C0?4#qPdJ32nm&z z+v*Y#1v*NEym_wjuV8)4-5o5*tgtwcvFOyfhw>YjS5i$AON=dbcXMfeZPmRY2vohG z#U@IZWF{CrXg8c*=S6T&C7ti>|t=0Y!7HiR6X~dH?C=@_ixpFd3Pq_ zyK!|Lw65Bbvzp~EZEQ6Ey0zA1X7W?{-W$z{-iF?CPOxuv3omwU-pLfh7&9!nr3xZD z)*WT?kY%a8=;R5bit@cutKXKvg#rn#L-Cu&H8Bpoy?D#2RYT(KFRnM6r;qL1m>5$g z5-UquY?w^V-FQ~9su{d%Yn@Y3jQ*Cfyjt}^Y1QDph@hSolSYl{KrGITLskYW&Jnxk zQ_lnpCa+^e4g=Mtszl_i7goxhHLib?V_s01R=l8;nPb|_T@g<9u+7qwsR+H$Q0m@t zSup>TRnqR!uG0hA%ZN$-1Q_{_yi;CfPWYHMW!g8ABa^+AMkQd4D+5GoEjo9+Kx}G8 zTsqmQv}EMcu91^ji7GedJ3CwunAj@5LwCDzk+g8tZBsN^_)i0sxt#uEbtxyAx>Jd> zeZaF8|15WRPwh{GZ8Bz-4k~*ZDb67Am8<}stB>qh)HgPvL<%&n+W1C_85=1WdE?QL zCN{S($w`?$5Ak$xVO4?9+2m?7FBi^N9OtNYZ7v=gMP~%8Pp&*tp4i_zraa-R3}4HO z3R-`giii&s$!<_`p#F@3T$1}yx;dEI(xMD6-EQVIlsDCRUXXYnw0hh(Tr|=)px;&d z2cz3JQrx7G+*}3;Z3h;H-#5MWMH4l85y;`#g=z#*T9#jFJQ@=3Wl)PEEL7L5)Yb;q z|3lq+2$k+CFduSEMU+BA6BWW&rkm}>^WxFG8iE6v|J4GF=rDvoK?dIqR1=hvuK;Uo z>Xx_^*7u_uCM?D=C(u5dm|{gtt-|aTlABXtKZ$S~D+`1dI(0TlJlcxv|AwUCt##3A z$zUq-y1MMZzp!1OIMCos;J(da=W4UEpxvthcFtNav)#dun*Vi~b{^|NtA+v}5y!hK z5lFIy+HM3)uE2flhNioQl|{5=7|Kw*iNdu@0laH84Y<5LnXV1=k~hig9oL|+Wr<-P zu=G1(833a|=RCS#E+O9g8gY}J+^Y{J%~3mGj?E}LW`FYP{##y}LB*&V?SnxFD-#05 z%Q!kXQnVe3JuyHCJ_3^}9APoh1;66@^35U!$l zlCcsI;nh<8ZDB7ToFZX{9r!s?RkkY2^q)~8na^gq@ISCC$g`Qg;t&&dIO@u@0g1dO zMra$Rcxijgr1~C4K!uSk*Kazhq=5e^`(KTKiPrs= zXM-?9&*?R{mHN(^W|2EynV1-wB)FTpa7j;uDAi^V6+p!`_h!z=B_^%OjDje>c*f>( z7NbW^TGg(-kdBI5d&OFk?2c%-ZBfyi($tUqgH!xwR3sv9drVk#gh{_zep{rmnb;07 zuj3}54q`d=d3B3+51kyEzo+en_u-U1Y-~~kL@?L=81Il=}EWP#()?c?o zB==4oV?1Rh>7xarOwpTI&FG{ix273H?;ZQFhrHi(=O}f%QQ>Cu%$ry1oXig>4aVFz zYUH#|V%*N(aJL55Xvef{cf)~{9CxDO(*@eDWw>pG$*KL3quCQP#Gi~#-OP!D_zxeC z_2}Yq>P2a#iDgksmksZ^U}}FWnf-3sErRxs45LI-HkZ!tyqUwk;iVrlaLF%o znd{)@W_JS9Iq|GZ8s=AcwddQxwVnH?{M8;bY1RDc!EWvF+=*PsjlgCzqp4o%h%NJb za_Id9nJxGuDl+7iYLLpnlrN{?yz%Ntuo1XURt$)J4?cAdl5Nj6ErUq+4AYr(eXpS~FFE{xNJu_WXV;~|1uC(T7$HM6 z(cYn;FCj~n+%E0vL!ER}+reP%v6qI+EA`!fYL!V|t>0gS1gi(S;v#LN5tTO-!<<)7 zf(hLCDVg3t0S%DXV(pxM{rtPS02pP2L;nyqnKGv`5fewAnN%VfR5D7JqQo_U$w}L8 zf@=x?{@q|h*v}V6)4QbxD_`PeCnk&L_j!gYD$HL861C3fUEFv-?fJ$4ZZ?;ZXX?n^ z?z(t!dD-6ZSrua4zi!F5r3AAVBaAm*SXBLe-WN^{x+Pv!kYc{4JQmV zT|_F=>jZ%otIXM8R%OcCsIda2FVWETD1F^fcPeU_FTrIGAso{)y}1LUo_|yUJ0@^( zXmpX6pmWRjcLoEhg$V6wte*#V069A>ei9I!@q{!RTb|@vfRBqI7=1wN=Lr+IDa-2A z+kqAx_=(ndZ~*#&!nZy-XLl8hv4%p#swrfp5oqZ=3}dp;MwEZSOV6Fa(LB3v&i4ff zh2(!=q%@{Rii*eMlA{>9TplKA4X`XrE!g!quNuM=6K2mO5Z|;DD*msw3;6$ZC0ML; ZfyCksHTC_yr2lY0ENuTN{oDKD{{XYaC~yD( literal 0 HcmV?d00001 diff --git a/tfjm/templates/navbar.html b/tfjm/templates/navbar.html index ecdb4dc..1bc75f8 100644 --- a/tfjm/templates/navbar.html +++ b/tfjm/templates/navbar.html @@ -111,9 +111,12 @@
  • - - {% trans "Log out" %} - +
    + {% csrf_token %} + +