From b27815033d737425fc055921291015f8fdb47235 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 7 Jan 2026 22:24:24 +0000 Subject: [PATCH] Faina app --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1255 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 1706 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1041 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 5744 bytes core/forms.py | 13 + core/management/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 168 bytes core/management/commands/__init__.py | 0 .../commands/send_due_date_reminders.py | 37 ++ core/migrations/0001_initial.py | 31 ++ ..._options_remove_task_completed_and_more.py | 48 ++ .../0003_task_due_date_task_due_time.py | 23 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1710 bytes ...ve_task_completed_and_more.cpython-311.pyc | Bin 0 -> 1923 bytes ...ask_due_date_task_due_time.cpython-311.pyc | Bin 0 -> 1047 bytes core/models.py | 27 +- core/templates/base.html | 5 + core/templates/core/index.html | 456 ++++++++++++------ core/templates/core/task_edit.html | 23 + core/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 170 bytes .../custom_filters.cpython-311.pyc | Bin 0 -> 530 bytes core/templatetags/custom_filters.py | 7 + core/urls.py | 14 +- core/views.py | 111 ++++- static/css/custom.css | 68 ++- staticfiles/css/custom.css | 85 +++- 29 files changed, 766 insertions(+), 182 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/management/__init__.py create mode 100644 core/management/__pycache__/__init__.cpython-311.pyc create mode 100644 core/management/commands/__init__.py create mode 100644 core/management/commands/send_due_date_reminders.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_alter_task_options_remove_task_completed_and_more.py create mode 100644 core/migrations/0003_task_due_date_task_due_time.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_alter_task_options_remove_task_completed_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_task_due_date_task_due_time.cpython-311.pyc create mode 100644 core/templates/core/task_edit.html create mode 100644 core/templatetags/__init__.py create mode 100644 core/templatetags/__pycache__/__init__.cpython-311.pyc create mode 100644 core/templatetags/__pycache__/custom_filters.cpython-311.pyc create mode 100644 core/templatetags/custom_filters.py diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bcb2fbacced8a64c23d6a403697ca4fcbf18d9a GIT binary patch literal 404 zcma)(ze__g5XbX=w3XW8>=xX*yf^72LP5n+adGl3Atu*0^}Qq}d9?K(adQ>_0RNAU z@+QH_P3YFi1k~B%_}m@b_wL}H`~5ER_H?u>UVZ!s#jnLb$>zW(kBFlJ@rcJ|RK-PH zB}G!DMOw9rR)lzRjRxt%*#(pujKvdWu#gT6WlqQ`UI;hCZU*?gq^?v`!SHZ|wNc9z zo)}f((>aw>g_+`zeMWxYAZ@yriqUd78fww(F$2^AF<`Zl7MhNM`x>lk_BjL7X?UczE z%G_B^8RS&tga|1dA(>uncaAH?>k>{(&&$K<_R!-iiK6HYjn`=Wj&9cfa}%EN4X0ar Ad;kCd literal 0 HcmV?d00001 diff --git a/ai/__pycache__/local_ai_api.cpython-311.pyc b/ai/__pycache__/local_ai_api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9977d8c7f6a3dd70fe97b8027d3793d79129e6 GIT binary patch literal 19874 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5ebf5cde507820485ae26602809c6e7fd6d6073 GIT binary patch literal 1255 zcmaJ=y>HV%6ubC0eXa zO9=fD%3!GHLcapS4kCzP7uB(eF(ML?U8ydcGDZ@bK}7k0h)VIQGT6K;BeVy9GE9|d zbEuR$7HSD|b;)CO{}?BlGH?59PU4y1AWZ)O=sSoa6BA@gaViX{q+KAp2Y)h5naB`c z;kt-8q@-pa^0~5 zy6mw{u9J{j1hhm7YIVAm6K6f{c#VL0?y+de*2uKy+eJd(){09uqmN56R~^^(eXcNX z-RIe+Yddtsa|valTXqmIpN)vE**Ka{UFrl}5vfX2Y~f0<*`$Dwvs%h=-Le{Xomv*p zSXSL5p)2H^Wwk=vO)N~@Fs_1;x?EeTQJ45k5QIL`jR2V0T$@W$r7Mu?S)&;SJUtI7 z5;3)2Bg-`Kf1o~WLucdV6|YXq;hV4#gk`!xoiOlNdEH}ceiKS6J07Fu`0`COH@PCt zk%?9bCjK_S`+r~e`mMIwy)hNVv#tFujDC8ty|`cf^(0#KqK8c}3$4RK>!{G`8uve| zo!s}C{nyc>>By)Y8kHlX(ly3ldF0?)^!#Ns@k&f%;m}w(G8X=0>ZR42nH~aYr^LtZ z0x>oUP%SC!wovW}Fb2!4D5Tiyo{+>vjzPR5e-hxLte&K+5d12fh_%xph9t0vSuJT? zBdc};E?e9uE$*G4G%`Ia8Yy01LZApcE=Zl}lgTZZVq;(sFUq$7dNRhii;U>j; V(in(eg?9My-HBK~9b$|L`~?DaIe`EG literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 9aa598b9d5171b2bb0d207f045e07f9fbbb95a64..af9630eecaeb5e13c54f0c9f975915cbcb7f099c 100644 GIT binary patch literal 1706 zcmZuxy>Ht_6hBIoL@AW%#6eo8cA};&Pz8tu6h&L0Mgl>WYy-CBSc;4YMToQREYl`M z_ejc)&_P264*@#5W6{A)5fA+n0(9v}0U89ZnX)Nx(81`?cci4mwU4}a@4b5;$KQL$ z-;>D%g7LHaMC*nTdd-E=hzyz2?|?Z%1Q9_;hENj(6he!Lgq|T1rov8Wcee+i4KL+e}Oqd6x9TRYM}T zXrw}Rb$M}RISU*%w1%!>(8kyD>*Z20yOIZ%GRtgYo%#`C3t6?0UC*~;3piE4jDmGy zxu}*)<+Xgd)J`lnQ)ScIqZW^z$dy*tR`Qi>r3Acb?CI3Tw%Jy4riD|4wzSk1#CQNj zlv|W-nif@?*r0EC?=Vihcn;gNVKO+E=p_t%pz5^Qu(!QfecROP)be74Zed5a*(7(8 zxl^R|1$a)6sP=vZ>?dZd)m_b5`|n`5_kPdFP$-=tt-$ zv;%7}09>I6M~~Q=4e$t_Xioik0 z8O;QpJGb}Li>az*GgWQNyjpWZ=?28II1U}uSEin~U1|E1CqLKgql%y2f}QuhP6QHa zgy6D-Ya+}@aB0rse*9G^gcr2{CdcxmdVuj$Ck_#^wym`^`>$V%>8K~EenC{#OQv@3lQyg`UGm>1Jm*=Mk_&pF`%yvba)l3y&XKUQ-~rR7|{ z>`j!R?;e#$GUHYB;uU&e7c{C9cGH)0+n5FN9UkjbUkQCfeWfQ6hpGfb@YIYCl{ScM zmizD%u`f9pe&eC*N0YAGUhR?H6CU-!8fje{gqOuCm`%_It{HXQ>Z9)n0P;#kD`5{QcOa zx|=k*Nu!rEI)#y^d+)(3;;vU+WuvQX^pp*78wPdn-G5baA3k!GYFDZDlxk;bAPSM2 z12iVlaOCa)T_kV0?%gFD0VEuaBHZ6N*}=_*IY%~wYD8A~pF05SJb-7?e9&$8+1KFA m@07I)WDphvp^s+V^Y1{M7T{nP$>BH8=ihSuyGu6x!~F*fWU}1= delta 154 zcmZ3*dy!FaIWI340}!mp_?2M^q#sXCU>0>00xRD7lj1Gf2%OW&^8V95z5@r8%i~MI1mO ZMj$Sh1ri^a85tRGFvwiMhKksLDgZwuB>DgV diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fae1897c89361c99c5e868a26d00799b73f..e6775df88e176feb523d42cb58b5e9f585df176f 100644 GIT binary patch literal 1041 zcmcJN!A{gb9EYd7|8835Rlgd7525LsVa>0FmT!f&Z-X7N1WY6*^$emYcappqH zE*d%XvDm*bbjQlgAR_cAcLe4KZAt=>yG4`G9u+j7FFKrxHWyeVyxon%z9Lw}|FR%z z^O*N3kMr4^;|Ol=Vn*{i<~&eyMWWr^$0A3}EUh9O(&M^T@YaGzto9E!JXTZicS5I|jB|8f{{0RC zjLH!GkE)JL=VbeI`t+FMs^%T}K zSTDl|a$!Thz!EwsbTa6a@q&ExT)yl|ASsXxNEtWf!&SNIOK7Fg%Ai%o^Mf7vWK+Uc U3R@X$4I6f&a^mWTO{*XD3tyBPJpcdz delta 230 zcmbQpahu6$IWI340}vcY|CNyiq#uJgFu)3Be6|5HrZc24q%h_%LAkkVo=An}2jk&*ERgUkg~^ngM90xJ5z#=y$i;L;(~5i*1A0*m}b W7WpeI@*kL)_?a5GL9mDiXdD39ZZu;6 diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf286a519cf1754ac97038f9f1e4605fbf2..aae512f046ad5794a48ac67ef083948935394a80 100644 GIT binary patch literal 5744 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 M>|4#Ng~v4XUnle4B>(^b literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-V>P{wCAAY(d13PUi1CZpd2jP|m=;Tf`>?u>b^Jcl>DmPH&3kcs{Xj^ji-xhnz+-c!^-fC^H= z#~_-3Q|-a?n}TTR05{Nc3~`sV-|*9BbsO={mbAEho-2XP5XbCV_J`ZZZ(@}g?5F;U0&nE3Tf zS!OA<za39~FRrP{X2^*I)qBUlggub4b(I4aEp`yre! z)Z)kCVd(qUGuUlRTd{PF*er(0vf45nngv8}0UD6kExLJ#VT>iFLlZ(vbeN;wKogqP zXc~lPEIA#jsslNorGB)4dD3z8b=?7GDWtf3HjPTtXi?Q*af@O|v{{F=$U%Oi%Q`VI zEYb>cXFn*XSzHNnuP7|3D9~6fgMgk=lpkBF!M(tW>89>L#aIfHCNUv*noexWo0Sbr z2PK~4ElGLbu+)@ZpM>Jy<7BYi6_xhXMY7@aR44@r)zp+_8ALThD`_=Juh0KP#}E#^ z{-UyCHAtmZYne`~LN}#CRU;M6qNMWX|4WqOTN?Gq`dC~!4>;H z6ma|Wew7~DzVFMzaCCdtkE6tmUy@$D*v;l%Wk=lH*wb|{H?}VyjJj3DHL07kJ2~6S z*>1+^X0N#Uv7Pt4{Mep$5O?$Qo&3C)pLa8ly4j*z8h;k`O5=OZi&6L6np@I3CCw{o zZU%R=*WAMGoyT6`_TJ3C<37S}fpiMQD-bucd}h}Di1Z$d`Urg~PKxk(C@%3&@rig8 z$df?ANcMa2jPu^iiv{<)np@C11r=Y!#-wn^%=kzl$c|X~YLHLp&2!0d^Wf#4F@$sWqg{Y4%il<30 OGkU})PTn#b@csv4tJ^04 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_alter_task_options_remove_task_completed_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_alter_task_options_remove_task_completed_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6947e82272e3be0ee4a913d7678c35854f736a4c GIT binary patch literal 1923 zcmb7E%}*Og6rbI-*SiJ^7#fn2P(Y-r6Dg)&$|Y)K2t*)*5k?%WD%-&`n1%I@GrMa( zF6GcekGb{IL)8OK75Z27(pz1L1Db12xf#JJr@ooBNg5(hW@q2LnfK=R-kbMke(&i? zBWSDtJaNZNgkH)?rzP9W=>uSXMg$SfLp80e)%3EiAsszNME?;HgKC>bXVU?2FV1IW zgCt5Qn|vk3SzV-SZk6NEWqu&c8Y9#TDxIBj>}yX>pKH=2MP-ekvQD(BRyK4*6Pq2U zz%&8ys!o#dnZFo^sRJEM!yh-L4I#x1w5>z?3XSxY8eLavbiY?4^_Cwp4r|lytW*){ z`As7qkzUew*ng0K7~qfFVdnqGsbW$IlX8eDaRF-pum%C^;}6EVrm(u&rV$xBynX;# zcmaRh-u0$xmAlCeNbe`YUg+c%lANe8PDS_R${@r6$5Y2oVpir>`7Bfm}2#~r0fc- z)jb+gqH0anm)g#I!Hno4G^lV_=?aTP)FI%8up_tJCzXo&@N8ZarDE-ow;W>)emMc`xOIAr`9*n1@tC6XlwnPn3q zRoP%}g$5!;=sJ$P5H17WaXji*!wud8x>dg;~H2#-&+n zHoq|UxGPxd-A~LjL%b=rO`{y?X&2fcQ4 z8>~ii(OTq(QI77=N(85!+h%+#sN)LF$gkL&XI_Agc>Am_cmrsWxk_rBVTd;rrwM=A>wG4gG+%L4!$iDqk`pB9%?jJfHzw>;)Id=c= z;bv{8Ik*eGl{D=12?BB^Ny|d^r&4|7c<9z~|IN$ABbSSZKU{oM+8$Q6ZyaaFpM7?e z8E@YGA?_`N=Jk>e!}t1{9G>bsav0dvPZT{n|Eag zgeiSN0+sdef(Cd^0okZ)WN!GxhG4hZ7lde_nq4>rVa_ z;quvJ6Z=(mkF2R$RTUU#_$#TVbiV=awe=t__;2}rn98RwSOwBDG);r7YuP6H{9IqrQm~DL8wNRN4Ix>vHlE literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0003_task_due_date_task_due_time.cpython-311.pyc b/core/migrations/__pycache__/0003_task_due_date_task_due_time.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d0aa54eae5a6ea1b51433677e1825b7ca0482b8 GIT binary patch literal 1047 zcmah{%}>-o6rX9k-L^o4hQ!20Lx?f%g%V9X5fc+4i63}?7`F!}vz_PKr5|fQP&skn z;1N&!1ICZY!9Qh5_CV(9$y*7WI62c&2x4@meSN=q^M3Q*Z~A3o!a`zv9KQ6o6@-3D zP>;r`bF?U&UBnQ>0Sd8;L&a4vQqVGD$~Iyu;J#WXeHPyLGvumFTSe{0FBxtt+zS0( zLNh;(Qm%(FgCOY2A}(Q1jvh_`QXNg*$`>86+g5={kuA zWzQsmFy4S_&5Of902wesBSu1*r^(ISU^x&*Gg#Z4T%sABW&UjHQ3lZ_ZL7S|4QRB^ zwI~k)KE44-H%@^>Gz1Z}N>NKBc8E3Jc;!RDD$>jkVe`tf+fh03uO^=R=yvE9S-n#vV%gM3c}I)k2B6xh9UPTq_>H>79Q=M^fgK zRp)gaf|GaiD9asq2VS1ViSss2*3$v?z>z9C=l_Z$^t@ZCR%>&PWK;8l_lYi;OCz0h zN0_a%S?I`oj0;tn*0-J%7BXi(SR {% endif %} {% load static %} + + + + {% block head %}{% endblock %} {% block content %}{% endblock %} + diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..ae5f473 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,323 @@ {% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% load static custom_filters %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… + + +
+
+ +
+ +
+
+
Roma
+

Il tuo assistente esecutivo

+ +
+
+ + +
+
+
Impostazioni Timer
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
+
+
Aggiungi Attività
+
+ {% csrf_token %} +
{{ form.title.label_tag }}{{ form.title }}
+
{{ form.category.label_tag }}{{ form.category }}
+
+
{{ form.due_date.label_tag }}{{ form.due_date }}
+
{{ form.due_time.label_tag }}{{ form.due_time }}
+
+
+
+
+
+
+ + +
+ {% for category_value, category_display in categories %} +
+

{{ category_display }}

+
+ {% for status_id, status_name in statuses %} +
+
+
{{ status_name }}
+ {% for task in tasks|get_item:status_id|get_item:category_value %} +
+
+
{{ task.title }}
+ {% if task.due_date %}

{{ task.due_date|date:"d M" }}{% if task.due_time %} alle {{ task.due_time|time:"H:i" }}{% endif %}

{% endif %} + +
25:00
+ +
+ {% if status_id != 'COMPLETATO' %} + + Modifica + {% endif %} +
+ +
+ {% if status_id == 'DA_FARE' %} + Sospendi + Completa + {% elif status_id == 'IN_SOSPESO' %} + Da Fare + Completa + {% else %} + Elimina + {% endif %} +
+
+
+ {% endfor %} +
+
+ {% endfor %} +
+
+ {% endfor %} +
+
+
+ + +
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+ + + + {% endblock %} \ No newline at end of file diff --git a/core/templates/core/task_edit.html b/core/templates/core/task_edit.html new file mode 100644 index 0000000..835675a --- /dev/null +++ b/core/templates/core/task_edit.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block title %}Modifica Attività{% endblock %} + +{% block content %} +
+
+
+
+
+

Modifica Attività: {{ task.title }}

+
+ {% csrf_token %} + {{ form.as_p }} + + Annulla +
+
+
+
+
+
+{% endblock %} diff --git a/core/templatetags/__init__.py b/core/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/templatetags/__pycache__/__init__.cpython-311.pyc b/core/templatetags/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8b27f693da72edc8019973b630adb408f7dcf08 GIT binary patch literal 170 zcmZ3^%ge<81n)1zWrFC(AOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFI)YL{M=Oi z(xlS7l2ZNDiqz!NlKdk5^8BLg;)2BFRQ=@qqE!8o)ZBuc#FEsK#PnkQ`1s7c%#!$c oy@JYL95%W6DWy57c15f}(?IqW^8<+w%#4hT9~fXn5i?K>09QXMR{#J2 literal 0 HcmV?d00001 diff --git a/core/templatetags/__pycache__/custom_filters.cpython-311.pyc b/core/templatetags/__pycache__/custom_filters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1567d6a9b96120b15e1263d0951ae20a9db42078 GIT binary patch literal 530 zcmZWmy-UMD6n~erHEk#;=v4XvP608igLH8%MR4n2Ns}|CO`39dK?@x^bPydJ>*!Pw z|Cts#NT!05gHY+#$(ObfKOXmf@AH1|9ru*YW&q`5eD2(#eT#xvq>ZyUMP~>WSi}X7 z)Cd6yC~3xZ7-9V-z6CXz%FRR^TGHTeJ!#2jpe5d;7LA08pkBu{1U0`2u^?}Bae&Sc zdhm$$zx2q6;BeHnATg;TscciBNnyrvOyT%#gLOl>MY}v2Q7SD@^h@8Pde8{kBGBnI zH3Q)@{mN%8-Z4z7n?9p@yqGX-uA2cDzE{6+TtOK>>~uo~XVe{RVrgVeqVipYKFrj; z`|@r1VSl0)rfOlFC@e4!RV@{!tftYneHJ}0+^RSY7Okc*YC9Zx!_=C8#rO;?`W&Vp zER|!=w*r@z**1pJdwB(6E)zmtAvgYgW@_%{XsYHWYJRHb`^t=@2gSKWNO2AbpE5{0 KKNG9$YT6e@H+g~p literal 0 HcmV?d00001 diff --git a/core/templatetags/custom_filters.py b/core/templatetags/custom_filters.py new file mode 100644 index 0000000..4b04b5c --- /dev/null +++ b/core/templatetags/custom_filters.py @@ -0,0 +1,7 @@ +from django import template + +register = template.Library() + +@register.filter +def get_item(dictionary, key): + return dictionary.get(key) diff --git a/core/urls.py b/core/urls.py index 6299e3d..feb6db8 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,17 @@ from django.urls import path -from .views import home +from .views import ( + index, task_edit, task_delete, + task_set_status_completato, task_set_status_in_sospeso, task_set_status_da_fare, + assistant_chat +) urlpatterns = [ - path("", home, name="home"), + path("", index, name="index"), + path("edit//", task_edit, name="task_edit"), + path("delete//", task_delete, name="task_delete"), + path("task/complete//", task_set_status_completato, name="task_set_status_completato"), + path("task/in-sospeso//", task_set_status_in_sospeso, name="task_set_status_in_sospeso"), + path("task/da-fare//", task_set_status_da_fare, name="task_set_status_da_fare"), + path('assistant-chat/', assistant_chat, name='assistant_chat'), ] diff --git a/core/views.py b/core/views.py index c9aed12..20aaf8b 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,98 @@ -import os -import platform +from django.shortcuts import render, redirect, get_object_or_404 +from .models import Task +from .forms import TaskForm +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from ai.local_ai_api import LocalAIApi +import json -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def assistant_chat(request): + if request.method == 'POST': + try: + data = json.loads(request.body) + message = data.get('message') + if not message: + return JsonResponse({'error': 'No message provided'}, status=400) -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + # Call the Local AI API + response = LocalAIApi.create_response( + { + "input": [ + {"role": "system", "content": "You are a helpful assistant named Roma."}, + {"role": "user", "content": message}, + ], + } + ) + + if response.get("success"): + ai_reply = LocalAIApi.extract_text(response) + if not ai_reply: + decoded = LocalAIApi.decode_json_from_response(response) + ai_reply = json.dumps(decoded, ensure_ascii=False) if decoded else str(response.get("data", "")) + return JsonResponse({'reply': ai_reply}) + else: + return JsonResponse({'error': response.get("error", "Unknown AI error")}, status=500) + + except json.JSONDecodeError: + return JsonResponse({'error': 'Invalid JSON'}, status=400) + + return JsonResponse({'error': 'Only POST method is allowed'}, status=405) + +def index(request): + if request.method == 'POST': + form = TaskForm(request.POST) + if form.is_valid(): + form.save() + return redirect('index') + else: + form = TaskForm() + + # Prepara una struttura dati nidificata per il template + tasks_by_status_cat = {status[0]: {cat[0]: [] for cat in Task.CATEGORY_CHOICES} for status in Task.STATUS_CHOICES} + all_tasks = Task.objects.all() + + for task in all_tasks: + tasks_by_status_cat[task.status][task.category].append(task) context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + 'form': form, + 'tasks': tasks_by_status_cat, + 'categories': Task.CATEGORY_CHOICES, + 'statuses': Task.STATUS_CHOICES, } - return render(request, "core/index.html", context) + return render(request, 'core/index.html', context) + +def task_edit(request, pk): + task = get_object_or_404(Task, pk=pk) + if request.method == 'POST': + form = TaskForm(request.POST, instance=task) + if form.is_valid(): + form.save() + return redirect('index') + else: + form = TaskForm(instance=task) + return render(request, 'core/task_edit.html', {'form': form, 'task': task}) + +def task_delete(request, pk): + task = get_object_or_404(Task, pk=pk) + task.delete() + return redirect('index') + +def task_set_status_completato(request, pk): + task = get_object_or_404(Task, pk=pk) + task.status = 'COMPLETATO' + task.save() + return redirect('index') + +def task_set_status_in_sospeso(request, pk): + task = get_object_or_404(Task, pk=pk) + task.status = 'IN_SOSPESO' + task.save() + return redirect('index') + +def task_set_status_da_fare(request, pk): + task = get_object_or_404(Task, pk=pk) + task.status = 'DA_FARE' + task.save() + return redirect('index') diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..b2f94df 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,68 @@ -/* Custom styles for the application */ body { - font-family: system-ui, -apple-system, sans-serif; + font-family: 'Lato', sans-serif; + background-color: #FDFEFE; + color: #5D6D7E; } + +h1, h2, h3, h4, h5, h6 { + font-family: 'Montserrat', sans-serif; + font-weight: 700; + color: #7D9D9C; +} + +.btn-primary { + background-color: #F5B7B1; + border-color: #F5B7B1; + color: #FFFFFF; + font-weight: 700; +} + +.btn-primary:hover { + background-color: #f2a299; + border-color: #f2a299; +} + +.hero { + background: linear-gradient(135deg, #7D9D9C, #A7C7E7); + color: white; + padding: 4rem 2rem; + border-radius: 0 0 30px 30px; +} + +.hero h1 { + color: white; +} + +.card { + border: none; + border-radius: 15px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + background-color: #FFFFFF; +} + +.card-title { + color: #7D9D9C; +} + +.task-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem 0; + border-bottom: 1px solid #E5E0D8; +} + +.task-item:last-child { + border-bottom: none; +} + +.fab-container { + position: fixed; + bottom: 30px; + right: 30px; + z-index: 100; +} + +#assistant-button { + box-shadow: 0 4px 8px rgba(0,0,0,0.2); +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..b2f94df 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,68 @@ - -:root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); -} body { - margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + font-family: 'Lato', sans-serif; + background-color: #FDFEFE; + color: #5D6D7E; } + +h1, h2, h3, h4, h5, h6 { + font-family: 'Montserrat', sans-serif; + font-weight: 700; + color: #7D9D9C; +} + +.btn-primary { + background-color: #F5B7B1; + border-color: #F5B7B1; + color: #FFFFFF; + font-weight: 700; +} + +.btn-primary:hover { + background-color: #f2a299; + border-color: #f2a299; +} + +.hero { + background: linear-gradient(135deg, #7D9D9C, #A7C7E7); + color: white; + padding: 4rem 2rem; + border-radius: 0 0 30px 30px; +} + +.hero h1 { + color: white; +} + +.card { + border: none; + border-radius: 15px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + background-color: #FFFFFF; +} + +.card-title { + color: #7D9D9C; +} + +.task-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem 0; + border-bottom: 1px solid #E5E0D8; +} + +.task-item:last-child { + border-bottom: none; +} + +.fab-container { + position: fixed; + bottom: 30px; + right: 30px; + z-index: 100; +} + +#assistant-button { + box-shadow: 0 4px 8px rgba(0,0,0,0.2); +} \ No newline at end of file