From 50b5a695ef989a09a768bc7281fae5c1d6c8f902 Mon Sep 17 00:00:00 2001 From: emile Date: Tue, 16 Jul 2024 16:39:41 +0300 Subject: [PATCH] new --- .DS_Store | Bin 8196 -> 8196 bytes osinaweb/db.sqlite3 | Bin 1568768 -> 1650688 bytes osinaweb/osichat/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 190 bytes .../osichat/__pycache__/admin.cpython-310.pyc | Bin 0 -> 482 bytes .../osichat/__pycache__/apps.cpython-310.pyc | Bin 0 -> 471 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 2108 bytes osinaweb/osichat/admin.py | 11 +++ osinaweb/osichat/apps.py | 6 ++ osinaweb/osichat/migrations/0001_initial.py | 79 ++++++++++++++++++ osinaweb/osichat/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 201 bytes osinaweb/osichat/models.py | 42 ++++++++++ osinaweb/osichat/tests.py | 3 + osinaweb/osichat/views.py | 3 + .../__pycache__/settings.cpython-310.pyc | Bin 3120 -> 3129 bytes osinaweb/osinaweb/settings.py | 1 + osinaweb/static/js/tickets/tickets-room.js | 17 +++- .../__pycache__/consumers.cpython-310.pyc | Bin 7736 -> 8499 bytes .../__pycache__/models.cpython-310.pyc | Bin 8216 -> 8648 bytes .../support/__pycache__/views.cpython-310.pyc | Bin 2536 -> 2594 bytes osinaweb/support/consumers.py | 26 ++++++ osinaweb/support/models.py | 24 ++++++ .../partials/new-ticket-message.html | 2 +- .../partials/ticket-department.html | 11 +++ .../partials/ticket-status.html | 30 +++++++ .../details_templates/ticket-room.html | 52 ++---------- osinaweb/support/views.py | 2 + 29 files changed, 261 insertions(+), 48 deletions(-) create mode 100644 osinaweb/osichat/__init__.py create mode 100644 osinaweb/osichat/__pycache__/__init__.cpython-310.pyc create mode 100644 osinaweb/osichat/__pycache__/admin.cpython-310.pyc create mode 100644 osinaweb/osichat/__pycache__/apps.cpython-310.pyc create mode 100644 osinaweb/osichat/__pycache__/models.cpython-310.pyc create mode 100644 osinaweb/osichat/admin.py create mode 100644 osinaweb/osichat/apps.py create mode 100644 osinaweb/osichat/migrations/0001_initial.py create mode 100644 osinaweb/osichat/migrations/__init__.py create mode 100644 osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 osinaweb/osichat/models.py create mode 100644 osinaweb/osichat/tests.py create mode 100644 osinaweb/osichat/views.py create mode 100644 osinaweb/support/templates/details_templates/partials/ticket-department.html create mode 100644 osinaweb/support/templates/details_templates/partials/ticket-status.html diff --git a/.DS_Store b/.DS_Store index f29bb9ef13d3d9d3692388c781c1ae7cc4d9b14e..cf57988c8d52c7210075d37042ea2b09652fa323 100644 GIT binary patch delta 87 zcmZp1XmQwZMUY8aa`H97JJJ!E$@zJ~nN_Lr0{q1p`Q@HKZa`6LS!QbazVKWtpkv5t%@CaAsBN<|FqPnHu_WR#rjAS}+9wK+m~4G#eCo*5bd diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 42a14def8861785918b1de0e7fec4788c750f22a..1cae88283a8a5f344ed0b56f2b9c5fdb25e7e7b1 100644 GIT binary patch delta 11590 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 D3sTrE delta 3680 zcmZ`+4RjM#7M?dV$>eulCdm-nB9w|iD}?z;GD(z$TA=fxL%QiXa%S?Lj7bt@~l3%cvxN!o5{yGh?o zbMN==z3<+6-+QS!UtV)Q)|BbKe?3K^YHIMsY~MUpF|_{0cbP!T<9#4ebbnP8J8%bO zexwAxj;j-sui?%NWNNO?y&dgsKAtOaS8k}aGC@R2Zx+1Bp5*fm)9BOYlT#&B-2CsU z9q6Xyp=lX3Dr)YYE-^)xvCW)xXL7m3a?MRuoyoD`&pDpKeGrX$9e#sh|!@&C0r(JfZ4dHVXK8M?Jds5i9 z6-P@{gcL~$Op~-}lA0|^(bON!L8)fvTmNU1vn4GmDN#A>*Fs?_641{bbxn3LSq`3X zT`rBx>T(t74PCC;_Mb?hX-YU-4n%{YsH*s-U_?8D@|hi`H>oI^zd7GqP4DM?%T&5{{;G=d_^->> ztxZ&}j;|@JToaEaR+Zf!Ps9dvu~p@<6;fDRsYO-{=!W2sr{Je^^6#0GeP_|^IZLv0 z1|g8QHI+R@nT~TlS*GjMMCpoO#n-N@s=}3P5~)D!!>FF~%^@>x7Ut_EIl?m54wJU^ z>}!1t6d1 z@WMbt2`SgiQ5gL|@w=U;9pBn%+hS{*m9`Xe>)FT5`y65PgZTzr z&fIE0M)JCZJIH4fgx|XC^=J#{tIVfsA4nCQ>~C>r`eNnrs?s%y)$xjiQE5#pkFQVy zTFOYH9D?2#ZY0NA-1h&AJe4hY$`6-Ce5y*lvYgO!!3jL>Jx@HXsq| zDssM9kgi>r%FsxplHAlS?0W6Iz)G+QuTl6Kz69?J_yTOgZan2i*4Sb`mIX;sm}Wql z7=&n(4gTw&aRpxibT76DoME?H^lQ`IHp!8N3k`>t@!xSFahJFc>F<`f*YmLNsiSlK zdSRveaQ3(?TtMNg_#gO7+zVv&0saf_#E0-6{70O?1!Q8A`#JsHCifbiquw�#o&Z zHusTla&5<8`z@nvdDa%R%+h0-Xg*-(O}}I(Gmq03o#P$de1cCviuV9_XP`{pAvSHkG6U)>Uf9el8J0=@w`rsw|ZL16Q_k%mQT=LGPzsGcbMyL zF>Yt1KT`>jyV4g(m7u+NY^>Z0@3kU>xTkMdbWBT&PDU)O@$3wSy2%$OOVoo z_6%}jyJrmPd7fQr%?0XP?TgQ(n~&Lj%{Vv18j~yH>tnIXwR*)iPdfrGLJdO!bWApI zPE-ySEgh1(J|yYh?iojpZuexRg6Kc?*-WlKvHLtOXzlkDoQ0R6wHNV4Xx3RgDI>+6 zp45UUbCHc=87s06X{*t<-UBZ8$JhZNx5eN`bEZwd_KC;V4utS9MM~P?oE&+$c6=R!cfVX(pxgA@)Lobaka2`?Lr@Vr3?dkj8kH|Sue!3M1c8EiJVpuwPm zdV>ibHZfM3+DrcP73~yA;B1M9!m@Mh?K1d#No9-eLPkC38mQ&u(^=+rU zex$dY_CCa*SM&{<`xT_WdDc5~^4J-igTf!e@zRJ_;o000Jf6SGpXOiUf6td4$PrJN z;pQ+!cW~mrrZ7v*&k#-$55i+}!K6PE5=%42IvkA@Zo~KDO#TCYBOi8t=4^Auof93s zjz%bEr9*FADz3YU5$!DDYQ$U`K8tHaqbj0N6|ssVt@R==grmW*UkwFiMd1)daTmzu zdeI|gr%rHq>y82U6*6ZUM3y4Jy$9U?e#xM=Zuv`$$Yciv|OJ2@;nhMpW~~Q7~}i zhWu&(K*1E|jeJx+JXip(2_fSc4QZhisBO3-DXKt0WLSAn4yS|tZWK%aV17vo1%u&~ zpT#3FaJ{LPf__DlBT}kXW_1`yg4;yI$U3aaYJV_1Dn`}dZWEHU)XGd>j)KvmO2n^0 zq;RUarne1D^^j6SFt~X_LNeSu71d~m>6wv^;Nk^Oi58A%;Z(~^)uUjbNQz%mrBEof zFw=d*F&gwVs>s!TH3+xdG)NmABtb%fa3IwVlV=pngjyiJd}JMbZe%4}R-$kllO^NX zk|Rpit+kU=nEZhS8yGoCW^NM4kmx4SZq{Ta90`$?o5X3?DRvJitZBrpwPQ$WgD8?~ zn?MYmn%yvL>hb}_;8YJ;_@wA1$%g)@g9dlnaA|}=NE@aF zkxMU%x7Ww|L_O9wW=|I*S|`EJC*Li=rI#)Gq<4HDo0*?jX2EX=-$u}NaOC_MpF^K_ c*7s-5#yA=%zQ>t#GytVOg`kf?ZD2(m?cM5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_werR!OQL%n% zZe~tuYEDjOWvaeQYH@Z+et~{)VoqkRf=^-rh~rHq+})L vrRPHg%Ttp;jO2{O68-r2%)HE!_;|g7%3B;Zx%nxjIjMFatBaX{1PcQIjo~st literal 0 HcmV?d00001 diff --git a/osinaweb/osichat/__pycache__/admin.cpython-310.pyc b/osinaweb/osichat/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff08f7b4a8e9a055f8a5520670130816444730eb GIT binary patch literal 482 zcmYk2%}xR_6op#`aD+jO#=Toy&=)X9qf1Z&x?y2brdKHThqN_>7jdmiU#VMHBtC&F z+Zj#TrZ?X?ZPIhE?)5q-tnbm=^B5!a6-BzTATGnPA{2%g7D(b5#)vgoCK?Y2@G5(6 zLhB=Vf80)ZFX24l{e(LScO$dr6b)Lt@FN;v-=a)%wF~K@!e_UGVs^k*R4w$d)XEt? zH;r)V+fp+S);BG8;Bx~DZXFn(UoWYfXf1sw(ir4CxZTM2Mz5fBwHSl7bOHXPepQJp z=V-ZbFRxQ->iLQ-!LRoICcz9q7(}RuW?F5kcNT)OXx;7HecWK zx}$hG5f8lF=tQiNLJO&EGS4@&rq-9aRKgwV4!wwbE@G_Yg=Eb283S;md^}|Aso`qZ zITkYGjj9<33YN7Tq3?a7%5S4}zjyT3%F0q%C8wp_wm~PkD{ke=2Yw>Tjj@S&t_XbOmunBeMJU7(ZflE}xWR5-kF5f)$fN(Y Vbr81r$Bx5EOOoq=(u{5h)j52#PzksqmpLX(T?k zS6`EB(wqNDf5TpT^0~L3INJAZ>vs^HbU1$I&b= zL2ZsBj?<)DKR3i}bgsJht-%*Cr$L7K80(zxEKdd13T3(R(fCHhhAd(Vy&}e{tiHiV*Tn!O z17~Mu?2$O&lPqd}DTj%2STZCz4xyZbIA?;&7!xjfcoz|wJ{iib7?8P%MtXa@)4kpO zM_4Lqql!-20!0J0@s}n!U;`pa=>I0^15)cqhFEhw zthtD5l072%lc*Pvwc-PO%VgBw#8LL2R4}X2s4`Hz#E1C2_?Qf3Aoe;xvA5I?W%PYr z7m!xE?%d_cyvVbSv_C}$ltJ+c8Jb<8yK1njnsTNHn%GpNs*f$lxP=;DYHFjVj#P9H zp=r`1miK^vEQS={N31P6%9H?@945s6nEP;&5lcoL~9#v(pJ|m1)vm_Ua1p= z4B=&~wF}crSDQ#tfS=*NanbmODq6y>r}O|B$;1&vhgk*s11P3+_Or(JF$`z1bd5C5Hl)T09?2)&-}SGfAV zbUP()tWlf-XnK>;`)DZMA+?FceT;}=UP*SF3Bo3$o(%M9yu;_}go_92h|chfv7^sp w=^WCxP@e;II;oyjRV+w%l?~-?Qx8c0q5f8V%P0WqsmSoz&>Fhk&$;XV1Knz@4FCWD literal 0 HcmV?d00001 diff --git a/osinaweb/osichat/admin.py b/osinaweb/osichat/admin.py new file mode 100644 index 00000000..a615015f --- /dev/null +++ b/osinaweb/osichat/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from .models import * +# Register your models here. + +admin.site.register(ChatRoom) +admin.site.register(ChatMember) +admin.site.register(ChatProject) +admin.site.register(ChatMessage) +admin.site.register(ChatMessageAttachment) +admin.site.register(ChatMessageReaction) +admin.site.register(ChatMessageSeen) \ No newline at end of file diff --git a/osinaweb/osichat/apps.py b/osinaweb/osichat/apps.py new file mode 100644 index 00000000..20395e7e --- /dev/null +++ b/osinaweb/osichat/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class OsichatConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'osichat' diff --git a/osinaweb/osichat/migrations/0001_initial.py b/osinaweb/osichat/migrations/0001_initial.py new file mode 100644 index 00000000..c7ba5ad5 --- /dev/null +++ b/osinaweb/osichat/migrations/0001_initial.py @@ -0,0 +1,79 @@ +# Generated by Django 4.2.5 on 2024-07-16 10:34 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osinacore', '0097_remove_status_date_remove_status_time'), + ] + + operations = [ + migrations.CreateModel( + name='ChatMessage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.TimeField(blank=True, null=True)), + ('date_sent', models.DateTimeField()), + ('member', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='ChatRoom', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('date_created', models.DateTimeField()), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='ChatProject', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('public', models.BooleanField()), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')), + ('room', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom')), + ], + ), + migrations.CreateModel( + name='ChatMessageSeen', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')), + ], + ), + migrations.CreateModel( + name='ChatMessageReaction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('reaction', models.CharField(max_length=200)), + ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')), + ], + ), + migrations.CreateModel( + name='ChatMessageAttachment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('attachment', models.TextField()), + ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')), + ], + ), + migrations.CreateModel( + name='ChatMember', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_joined', models.DateTimeField()), + ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom')), + ], + ), + ] diff --git a/osinaweb/osichat/migrations/__init__.py b/osinaweb/osichat/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed0a1abf281d49c75290fb9ba442a2584544edc2 GIT binary patch literal 1999 zcmb7FOK;>v5cX?kJkCrWJ4rTK7FeFraF_{52!RkJn@Ip|9w?Jse6c+4%EXTCHr<|0 zCRe!T%9Y(C{{)GD&{t0R0~`<_s@wA-8U)yKtE#&CtE#W7+q7PHG<<$I`2PIYMNRuf zDzlG;$~J!d6C8*}^jJ%DSJ$O%#71JeW@5RP(#^Q!mcP)5MM~dkqy%PE`POtR#O!L# z@*S?%n!2z#bk_vy zMG4AL<)u!HzTw(nMO9)F3!G?y==hdMnN)7AbA#Aut0`Oc)=SBUchSCDgED{}- zqUFemR-y+Ik<@O@bE9vO`mLc*7w4ib;o1gSCM&l(B0ZR3HvSXl>RikOovO1ye0(p`t0P2nQvYjn5nso34f14E|NqCI z^83bI{5O${hl-1T&+x6e2yajJ9!vw^_?uDNp0_T1ogb|W`VSLqTTB7C;a_R*P za2*i~84DAi4ZTYkiYf;d`f+#zqV^nEk8; zg{Ud$ahlFZ@Os0du&)`7Ai%KMpcjXMsAPrVW@W-wYh-E~tbzD!RpwKUSG-ljSzz^ibB5dSTNq0ZVP-`%IrJb|WFTJzw-idd3+}S%oddD6iaHLeV!=bzvnY@QZ?P=KG!A9Aa z`z5NU*inU8?_l3dRc9ajGVG_%uzkuT^3y&Q2I&b~ZN6fqyLajxogEyADpt!1l-g5D zWAM{LtL*M{cXv8_qJEshDaBzN7OwL`bZ7>n`};?YeU2%r;kT@PhE2=ckc2Tn9EU?_ zcYt5!G;4RUm6In2ekPS;9_9f}+NwR;DO@R`$ha_GK~D++wnTgSw`gx|ZN2Y}cy47w zR>Igee*9Vqmf@I&ZvAPM4Sm&E)*bz^Zv2jVRqBiPbVuL7cRK$_YJZ@&U3e>fvRZmi zXB~Y!YyYgWXxi8`it-ko&+}rZt0N2Psir7)b8}*B75~20czf7~l1f?Al+;4nMw_rd TEjsTr9W^e?u3?R~zHa^npszzz literal 0 HcmV?d00001 diff --git a/osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492fc08672d9b63e5e095b8a5c5aef2566b69e7c GIT binary patch literal 201 zcmd1j<>g`kf?ZD2(m?cM5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_cerR!OQL%n% zZe~tuYEDjOWvaeQYH@Z+et~{)VoqkRf=^-rh~rHq+})L zrRPHg%Ttp;jO2{O68+rF^rFO)%>2A!{rLFIyv&mLc)fzkTO2mI`6;D2sdgY&6f*${ G76t$YVm7w` literal 0 HcmV?d00001 diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py new file mode 100644 index 00000000..80a5eab8 --- /dev/null +++ b/osinaweb/osichat/models.py @@ -0,0 +1,42 @@ +from django.db import models +from osinacore.models import * +# Create your models here. + +class ChatRoom(models.Model): + name = models.CharField(max_length=50) + created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL) + date_created = models.DateTimeField() + + +class ChatMember(models.Model): + member = models.ForeignKey(User, on_delete=models.CASCADE) + room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE) + date_joined = models.DateTimeField() + + +class ChatProject(models.Model): + room = models.OneToOneField(ChatRoom, on_delete=models.CASCADE) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + public = models.BooleanField() + + +class ChatMessage(models.Model): + member = models.ForeignKey(User, null=True, on_delete=models.SET_NULL) + content = models.TimeField(null=True, blank=True) + date_sent = models.DateTimeField() + + +class ChatMessageAttachment(models.Model): + message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE) + attachment = models.TextField() + + +class ChatMessageReaction(models.Model): + message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE) + member = models.ForeignKey(User, on_delete=models.CASCADE) + reaction = models.CharField(max_length=200) + + +class ChatMessageSeen(models.Model): + message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE) + member = models.ForeignKey(User, on_delete=models.CASCADE) \ No newline at end of file diff --git a/osinaweb/osichat/tests.py b/osinaweb/osichat/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/osinaweb/osichat/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/osinaweb/osichat/views.py b/osinaweb/osichat/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/osinaweb/osichat/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc index e9f0428538971cd002c24b4706bd148519ff8751..ddc7ebc0afe5fa257e1ead1cae64990feb188393 100644 GIT binary patch delta 43 xcmdlWu~ULKpO=@50SGQQO-tLoke8W@KZ-rSI5RmTv1BtJ^HB~)p~+XcV*mrJ42u8& delta 34 ocmdlfu|a}2pO=@50SMC9Oio*~ke8W}Z?ib_Q4U7I$#=P90Gf0OH2?qr diff --git a/osinaweb/osinaweb/settings.py b/osinaweb/osinaweb/settings.py index a36e9f7e..74450788 100644 --- a/osinaweb/osinaweb/settings.py +++ b/osinaweb/osinaweb/settings.py @@ -40,6 +40,7 @@ LOGIN_URL = 'signin' # Application definition INSTALLED_APPS = [ + 'osichat', 'daphne', 'support', 'rest_framework', diff --git a/osinaweb/static/js/tickets/tickets-room.js b/osinaweb/static/js/tickets/tickets-room.js index 8736bd93..5d372d50 100644 --- a/osinaweb/static/js/tickets/tickets-room.js +++ b/osinaweb/static/js/tickets/tickets-room.js @@ -63,7 +63,7 @@ function app(socket) { function initializeWebSocket() { const ticketId = document.getElementById('ticketId').textContent.trim(); - const wsUrl = `wss://${window.location.host}/ws/ticketroom/${ticketId}/`; + const wsUrl = `ws://${window.location.host}/ws/ticketroom/${ticketId}/`; const socket = new WebSocket(wsUrl); socket.onopen = () => { @@ -118,12 +118,25 @@ function initializeWebSocket() { button.classList.remove('hidden'); } }); - + } else if (data.event_type === 'user_status') { const toponlineUsersDiv = document.getElementById('top-online-users'); const fixedonlineUsersDiv = document.getElementById('fixed-online-users'); toponlineUsersDiv.innerHTML = data.html; fixedonlineUsersDiv.innerHTML = data.html; + + } else if (data.event_type === 'ticket_status') { + const ticketStatusDivs = document.querySelectorAll('.ticket-status'); + ticketStatusDivs.forEach(div => { + div.innerHTML = data.html; + }); + + } else if (data.event_type === 'ticket_department') { + const ticketStatusDivs = document.querySelectorAll('.ticket-department'); + ticketStatusDivs.forEach(div => { + div.innerHTML = data.html; + }); + } else { messagesDiv.insertAdjacentHTML('beforeend', data.html); typingDiv.innerHTML = ''; diff --git a/osinaweb/support/__pycache__/consumers.cpython-310.pyc b/osinaweb/support/__pycache__/consumers.cpython-310.pyc index 82847a456884052b884e146d09c87a453e9d6015..1f0e2ca5313ce58128d4b922cef983061f8f2227 100644 GIT binary patch delta 1183 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 DY{Oa= delta 2265 zcma)7Uu;uV81L!2yY|wprCax}Eo(d2cE>h16_EhC*)f=d4r~E)70adPcI(#NmUHhA zhPWY9BMF4%B#2MGx@6IZ842;#7~_+^_;4S5A~7UNj69g|qThG!C^{qB#-$9bd)!hjQTdj-tE7vs#9H~Mb-$8s{;{`(^zhr>#DoGN zt-5WGF<&aNUQq5mjZ6*01-mXkT`uNzll6h7)Y!hVk)wJ^w{)>r(5r4X2&=4bz0>zC zA;atUWjB#kY0@Ya4V^v1A8uLL`yB4rjnIa$6=5%cE$Qcrre(5ysMN!~b45e5behvF z_B`&|!$0#U$O!-5pJ-MaN}6fqOkFo}R&h>edtisU?ydiVj8!ez!E7-R`pHkaF?YO3bv;NPAC!^;hw-~2!)j7`;8lSAt10y8d}^l=My^Qv!fIG99C0DWv9*sucmS zI1;lw85$zz_|K6juY}Hbs`3;o&sQK&gRV-fdJnU3H{JmyZ9GaY@nh{xywW)O!b#v( zi6}%`@iP_oy@v2Qf*av9fGR)Eid~l)$)rX`53pDHZ;kuONj}&V26V3U@l)Z{;t4#s z2#_ZLkA4ye9{5BsV<51D07?TJN4Z)E7D2UIYW6a!SZ6kY;8Yi-!w5$Z(g>3XaRk25 zDs!c|L0UuY6~4bYIrgui`7>C`Mw`;}4pPi|@jM;(jQfEVJ37F%_RQ*n5JqrBtbGLP6gLRb+_ugOp_hs1E_8 zmEfi_s12FyNcMOpmpU{#o;r|uToxvLT*9Nm(NiGVl4*5l*1X9m@)}ZJjZ%0TXD)1n zf>FTiak;*N&-4R$T^)*ir7Sph~kJQm=MLmOMigx zZ^a1_HV$sgsgJE~Bs=iGO}>G~a|qSMvJX&o+5?UA!H9?a$ah7CYNlN-zHe)+z>2tK z20(GME|dcZafI2blt2le_fIGo2xWu{!dV0pA&wwUi38_Ay^GYFFacuZJeQ+Ma)I|p zpOO}kzR1tEcC^h`D2$NYv}RBkIlth-+X&aHb-5j#IEaZEQ;1zh^@28EvYs>z*mgX> z1OSs)%*>o)gi$^o8)~@@D-Yo_y#UVp2oiQ3{zop-L7>F=cm6c~02LCWJYt_{c2lMthdzWg#cgjHH)yd?&>7DA zTMk!~(J1=}=FVFcypQnE_CghmnJkjZq4SWq_E2 zNrYL6QH)W9k*Pt5Nr+K|iHVts5eC_Q@o*LCZGOsfg^|q&sJF;?@_sfyZXFO4Oz2LQ zV3%Rkn{3Li&*-!{m7SGQR01Ta4kF}0ggl5)nB2o5$>=nB8Hcj7CP;t-MDTzJ7ZBkJ zBHTcPHi$qnAIQDM4-Jvx)RL0Sy!2wX$vm9$j9!y9I_ LWmYvN2|h*unto?U delta 380 zcmZ1^@A19E<2E@)lT+A`?+C#Mz?iAi$#s$17d7Tt@(m`-$(qcDjAE0cnGXp%=jY|6 zCYNO9=M^yl&C}$Z?7*VWdy73eKd&UUqGTmQk=Eo!mQqHY$=_Mzg+!Q`n3)(MknJ}Q zXOYfk9o8$1Yz9EBMTV2v*!{S*Kuj>9Jvp9T2B@)yU7yim^BQ(mMjLUUb4rPNqN;_u_!p-#s|u3@ GA0q%=a#>{n diff --git a/osinaweb/support/consumers.py b/osinaweb/support/consumers.py index 77b3b6de..b2f09388 100644 --- a/osinaweb/support/consumers.py +++ b/osinaweb/support/consumers.py @@ -167,6 +167,32 @@ class TicketRoomConsumer(WebsocketConsumer): 'reaction': new_reaction.reaction if new_reaction else None })) + def new_status_handler(self, event): + last_ticket_status = TicketStatus.objects.filter(ticket=self.ticket).last() + context = { + 'last_ticket_status': last_ticket_status, + 'new': True + } + html = render_to_string("details_templates/partials/ticket-status.html", context=context) + self.send(text_data=json.dumps({ + 'event_type': 'ticket_status', + 'html': html + })) + + + def new_department_handler(self, event): + last_ticket_department = TicketDepartment.objects.filter(ticket=self.ticket).last() + context = { + 'last_ticket_department': last_ticket_department, + 'new': True + } + html = render_to_string("details_templates/partials/ticket-department.html", context=context) + self.send(text_data=json.dumps({ + 'event_type': 'ticket_department', + 'html': html + })) + + def modify_online_user(self): connections = TicketConnection.objects.filter(ticket=self.ticket, terminated_at__isnull=True) event = { diff --git a/osinaweb/support/models.py b/osinaweb/support/models.py index ba4f3a67..eda0dfa9 100644 --- a/osinaweb/support/models.py +++ b/osinaweb/support/models.py @@ -165,6 +165,17 @@ class TicketDepartment(models.Model): date_added = models.DateTimeField() +@receiver(post_save, sender=TicketDepartment) +def new_ticket_department_handler(sender, instance, created, **kwargs): + if created: + channel_layer = get_channel_layer() + event = { + 'type': 'new_department_handler', + } + ticket_number = instance.ticket.ticket_number + async_to_sync(channel_layer.group_send)(ticket_number, event) + + class TicketStaff(models.Model): staff = models.ForeignKey(StaffProfile, on_delete=models.CASCADE) ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) @@ -205,6 +216,19 @@ class TicketStatus(models.Model): date_added = models.DateTimeField() +@receiver(post_save, sender=TicketStatus) +def new_ticket_status_handler(sender, instance, created, **kwargs): + if created: + channel_layer = get_channel_layer() + event = { + 'type': 'new_status_handler', + } + ticket_number = instance.ticket.ticket_number + async_to_sync(channel_layer.group_send)(ticket_number, event) + + + + class TicketTask(models.Model): ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) task = models.ForeignKey(Task, on_delete=models.CASCADE) diff --git a/osinaweb/support/templates/details_templates/partials/new-ticket-message.html b/osinaweb/support/templates/details_templates/partials/new-ticket-message.html index 4ee0b692..bc34258a 100644 --- a/osinaweb/support/templates/details_templates/partials/new-ticket-message.html +++ b/osinaweb/support/templates/details_templates/partials/new-ticket-message.html @@ -1,4 +1,4 @@ -
+
{% include 'details_templates/partials/ticket-message.html' %} diff --git a/osinaweb/support/templates/details_templates/partials/ticket-department.html b/osinaweb/support/templates/details_templates/partials/ticket-department.html new file mode 100644 index 00000000..c8b2108f --- /dev/null +++ b/osinaweb/support/templates/details_templates/partials/ticket-department.html @@ -0,0 +1,11 @@ +{{last_ticket_department.department}} + + diff --git a/osinaweb/support/templates/details_templates/partials/ticket-status.html b/osinaweb/support/templates/details_templates/partials/ticket-status.html new file mode 100644 index 00000000..b0367837 --- /dev/null +++ b/osinaweb/support/templates/details_templates/partials/ticket-status.html @@ -0,0 +1,30 @@ +{% if last_ticket_status.status == 'Open' %} +
+
+

Opened by {{last_ticket_status.added_by.first_name}} on + {{ last_ticket_status.date_added|date:"d F Y, h:i A" }}

+
+{% elif last_ticket_status.status == 'Working On' %} +
+
+

Updated to 'Working On' by + {{last_ticket_status.added_by.first_name}} on {{ last_ticket_status.date_added|date:"d F Y, h:i A" }} +

+
+{% elif last_ticket_status.status == 'Closed' %} +
+
+

Closed by {{last_ticket_status.added_by.first_name}} on + {{ last_ticket_status.date_added|date:"d F Y, h:i A" }}

+
+{% endif %} + + diff --git a/osinaweb/support/templates/details_templates/ticket-room.html b/osinaweb/support/templates/details_templates/ticket-room.html index fb0332e1..987353df 100644 --- a/osinaweb/support/templates/details_templates/ticket-room.html +++ b/osinaweb/support/templates/details_templates/ticket-room.html @@ -21,8 +21,7 @@

Ticket #{{ticket.ticket_number}} - {{ticket.ticketdepartment_set.all.last.department}}

+ class="font-semibold">#{{ticket.ticket_number}} - {% include 'details_templates/partials/ticket-department.html' %}

@@ -58,29 +57,9 @@
- - - {% if last_ticket_status.status == 'Open' %} -
-
-

Opened by {{last_ticket_status.added_by.first_name}} on - {{ last_ticket_status.date_added|date:"d F Y, h:i A" }}

-
- {% elif last_ticket_status.status == 'Working On' %} -
-
-

Updated to 'Working On' by - {{last_ticket_status.added_by.first_name}} on {{ last_ticket_status.date_added|date:"d F Y, h:i A" }} -

-
- {% elif last_ticket_status.status == 'Closed' %} -
-
-

Closed by {{last_ticket_status.added_by.first_name}} on - {{ last_ticket_status.date_added|date:"d F Y, h:i A" }}

+
+ {% include 'details_templates/partials/ticket-status.html' %}
- {% endif %} -

{{ticket.description}}

@@ -118,30 +97,13 @@