From 186def8b07e7ce8320bd027fbf7d549aaa103d98 Mon Sep 17 00:00:00 2001 From: Salim Elliye Date: Wed, 25 Jun 2025 09:18:41 +0300 Subject: [PATCH] new --- .DS_Store | Bin 8196 -> 8196 bytes osinaweb/.DS_Store | Bin 14340 -> 12292 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 184 -> 184 bytes .../__pycache__/admin.cpython-313.pyc | Bin 688 -> 688 bytes .../__pycache__/apps.cpython-313.pyc | Bin 558 -> 558 bytes .../__pycache__/models.cpython-313.pyc | Bin 4659 -> 4659 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 925 -> 925 bytes .../0002_country_addressbook.cpython-313.pyc | Bin 1803 -> 1803 bytes .../__pycache__/0003_contact.cpython-313.pyc | Bin 1419 -> 1419 bytes .../0004_socialmedia.cpython-313.pyc | Bin 1241 -> 1241 bytes ...05_socialmedia_addressbook.cpython-313.pyc | Bin 1037 -> 1037 bytes ...nglist_prospectinglistitem.cpython-313.pyc | Bin 2842 -> 2842 bytes ...ospectinglistitem_comments.cpython-313.pyc | Bin 899 -> 899 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 195 -> 195 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 187 -> 187 bytes .../__pycache__/models.cpython-313.pyc | Bin 962 -> 962 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 180 -> 180 bytes .../billing/__pycache__/admin.cpython-313.pyc | Bin 1019 -> 1019 bytes .../billing/__pycache__/apps.cpython-313.pyc | Bin 546 -> 546 bytes .../__pycache__/models.cpython-313.pyc | Bin 11372 -> 11372 bytes .../billing/__pycache__/urls.cpython-313.pyc | Bin 1179 -> 1179 bytes .../billing/__pycache__/views.cpython-313.pyc | Bin 3593 -> 3593 bytes .../add/__pycache__/urls.cpython-313.pyc | Bin 1351 -> 1351 bytes .../add/__pycache__/views.cpython-313.pyc | Bin 12123 -> 12123 bytes .../delete/__pycache__/urls.cpython-313.pyc | Bin 566 -> 566 bytes .../delete/__pycache__/views.cpython-313.pyc | Bin 1346 -> 1346 bytes .../edit/__pycache__/urls.cpython-313.pyc | Bin 625 -> 625 bytes .../edit/__pycache__/views.cpython-313.pyc | Bin 2347 -> 2347 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2197 -> 2197 bytes ...vice_cancelled_at_and_more.cpython-313.pyc | Bin 1203 -> 1203 bytes ...003_payment_servicepayment.cpython-313.pyc | Bin 1827 -> 1827 bytes ...rename_payment_paymenttype.cpython-313.pyc | Bin 733 -> 733 bytes ...05_service_recurring_cycle.cpython-313.pyc | Bin 1052 -> 1052 bytes ...ervice_created_at_and_more.cpython-313.pyc | Bin 1097 -> 1097 bytes ...er_service_recurring_cycle.cpython-313.pyc | Bin 1113 -> 1113 bytes .../0008_alter_service_type.cpython-313.pyc | Bin 1104 -> 1104 bytes ...cepayment_service_and_more.cpython-313.pyc | Bin 1806 -> 1806 bytes .../0010_charge_amount.cpython-313.pyc | Bin 890 -> 890 bytes .../__pycache__/0011_invoice.cpython-313.pyc | Bin 1300 -> 1300 bytes ...nt_charge_receipt_and_more.cpython-313.pyc | Bin 1447 -> 1447 bytes ...alter_invoice_date_created.cpython-313.pyc | Bin 839 -> 839 bytes ...014_servicepayment_comment.cpython-313.pyc | Bin 835 -> 835 bytes .../__pycache__/0015_order.cpython-313.pyc | Bin 1537 -> 1537 bytes .../0016_alter_order_status.cpython-313.pyc | Bin 919 -> 919 bytes .../0017_service_order.cpython-313.pyc | Bin 1026 -> 1026 bytes .../0018_alter_order_status.cpython-313.pyc | Bin 927 -> 927 bytes ..._service_customer_and_more.cpython-313.pyc | Bin 4413 -> 4413 bytes .../0020_orderitem.cpython-313.pyc | Bin 1362 -> 1362 bytes ...m_recurring_cycle_and_more.cpython-313.pyc | Bin 1153 -> 1153 bytes ...e_item_created_at_and_more.cpython-313.pyc | Bin 1155 -> 1155 bytes ...em_project_alter_item_type.cpython-313.pyc | Bin 1391 -> 1391 bytes .../0024_remove_item_active.cpython-313.pyc | Bin 727 -> 727 bytes ...item_project_item_customer.cpython-313.pyc | Bin 1205 -> 1205 bytes ...tem_type_remove_order_paid.cpython-313.pyc | Bin 873 -> 873 bytes .../0027_item_type.cpython-313.pyc | Bin 896 -> 896 bytes ...0028_remove_order_due_date.cpython-313.pyc | Bin 708 -> 708 bytes .../0029_invoice_pdf.cpython-313.pyc | Bin 825 -> 825 bytes .../0030_alter_invoice_order.cpython-313.pyc | Bin 1019 -> 1019 bytes ...ter_invoice_invoice_number.cpython-313.pyc | Bin 846 -> 846 bytes .../0032_order_business.cpython-313.pyc | Bin 1103 -> 1103 bytes .../0033_alter_order_status.cpython-313.pyc | Bin 944 -> 944 bytes .../0034_alter_invoice_pdf.cpython-313.pyc | Bin 847 -> 847 bytes .../0035_alter_invoice_pdf.cpython-313.pyc | Bin 829 -> 829 bytes ...ter_invoice_invoice_number.cpython-313.pyc | Bin 855 -> 855 bytes .../0037_recurringcycle_item.cpython-313.pyc | Bin 1035 -> 1035 bytes .../0038_alter_invoice_pdf.cpython-313.pyc | Bin 847 -> 847 bytes ...recurringcycle_cycle_price.cpython-313.pyc | Bin 824 -> 824 bytes ..._orderitem_end_at_and_more.cpython-313.pyc | Bin 968 -> 968 bytes .../0041_orderitem_active.cpython-313.pyc | Bin 843 -> 843 bytes .../0042_order_due_date.cpython-313.pyc | Bin 809 -> 809 bytes .../0043_alter_invoice_pdf.cpython-313.pyc | Bin 845 -> 845 bytes ...044_alter_orderitem_active.cpython-313.pyc | Bin 825 -> 825 bytes ...ter_orderpayment_date_paid.cpython-313.pyc | Bin 983 -> 983 bytes ...t_order_orderpayment_order.cpython-313.pyc | Bin 1163 -> 1163 bytes ...cription_paymenttype_image.cpython-313.pyc | Bin 1024 -> 1024 bytes ...e_order_status_orderstatus.cpython-313.pyc | Bin 1572 -> 1572 bytes ...rename_due_date_order_date.cpython-313.pyc | Bin 760 -> 760 bytes ...ent_type_orderpayment_type.cpython-313.pyc | Bin 954 -> 954 bytes ..._alter_orderpayment_amount.cpython-313.pyc | Bin 844 -> 844 bytes ...2_alter_orderstatus_status.cpython-313.pyc | Bin 974 -> 974 bytes .../0053_item_photo.cpython-313.pyc | Bin 827 -> 827 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 191 -> 191 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 185 -> 185 bytes .../__pycache__/admin.cpython-313.pyc | Bin 229 -> 229 bytes .../__pycache__/apps.cpython-313.pyc | Bin 561 -> 561 bytes .../__pycache__/decorators.cpython-313.pyc | Bin 1336 -> 1336 bytes .../__pycache__/models.cpython-313.pyc | Bin 183 -> 183 bytes .../__pycache__/urls.cpython-313.pyc | Bin 2721 -> 2721 bytes .../__pycache__/views.cpython-313.pyc | Bin 14245 -> 14242 bytes .../add/__pycache__/urls.cpython-313.pyc | Bin 418 -> 418 bytes .../add/__pycache__/views.cpython-313.pyc | Bin 4022 -> 4022 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 4113 -> 4113 bytes ...02_alter_ticket_department.cpython-313.pyc | Bin 1120 -> 1120 bytes ...mer_ticket_status_and_more.cpython-313.pyc | Bin 1553 -> 1553 bytes ...ket_ticket_number_and_more.cpython-313.pyc | Bin 1280 -> 1280 bytes .../0005_ticketstatusupdate.cpython-313.pyc | Bin 1863 -> 1863 bytes .../0006_ticketupdate_read.cpython-313.pyc | Bin 833 -> 833 bytes ...ead_ticketupdatereadstatus.cpython-313.pyc | Bin 1774 -> 1774 bytes ...pdatereadstatus_ticketread.cpython-313.pyc | Bin 959 -> 959 bytes ...er_ticketattachment_ticket.cpython-313.pyc | Bin 1099 -> 1099 bytes ...ction_ticketupdatereaction.cpython-313.pyc | Bin 782 -> 782 bytes ...ketupdatereaction_customer.cpython-313.pyc | Bin 1254 -> 1254 bytes ...0012_ticket_ticket_members.cpython-313.pyc | Bin 1069 -> 1069 bytes ...lter_ticket_ticket_members.cpython-313.pyc | Bin 940 -> 940 bytes ...partment_ticket_department.cpython-313.pyc | Bin 1013 -> 1013 bytes ...artment_ticket_departments.cpython-313.pyc | Bin 802 -> 802 bytes ...tstatusupdate_ticketstatus.cpython-313.pyc | Bin 944 -> 944 bytes .../0017_tickettask.cpython-313.pyc | Bin 1413 -> 1413 bytes ...lter_ticketattachment_file.cpython-313.pyc | Bin 846 -> 846 bytes .../__pycache__/0019_file.cpython-313.pyc | Bin 1124 -> 1124 bytes ...lter_ticketattachment_file.cpython-313.pyc | Bin 846 -> 846 bytes .../0021_file_ticket.cpython-313.pyc | Bin 1054 -> 1054 bytes .../0022_remove_file_ticket.cpython-313.pyc | Bin 714 -> 714 bytes ...etattachment_file_and_more.cpython-313.pyc | Bin 1038 -> 1038 bytes ...attachment_ticket_and_more.cpython-313.pyc | Bin 1968 -> 1968 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 196 -> 196 bytes .../payment/__pycache__/urls.cpython-313.pyc | Bin 1331 -> 1331 bytes .../payment/__pycache__/views.cpython-313.pyc | Bin 15197 -> 15194 bytes osinaweb/osichat/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 190 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 185 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 180 -> 0 bytes .../osichat/__pycache__/admin.cpython-310.pyc | Bin 652 -> 0 bytes .../osichat/__pycache__/admin.cpython-311.pyc | Bin 1100 -> 0 bytes .../osichat/__pycache__/admin.cpython-312.pyc | Bin 1322 -> 0 bytes .../osichat/__pycache__/admin.cpython-313.pyc | Bin 1405 -> 0 bytes .../osichat/__pycache__/apps.cpython-310.pyc | Bin 471 -> 0 bytes .../osichat/__pycache__/apps.cpython-311.pyc | Bin 563 -> 0 bytes .../osichat/__pycache__/apps.cpython-312.pyc | Bin 493 -> 0 bytes .../osichat/__pycache__/apps.cpython-313.pyc | Bin 546 -> 0 bytes .../__pycache__/consumers.cpython-310.pyc | Bin 21386 -> 0 bytes .../__pycache__/consumers.cpython-311.pyc | Bin 8091 -> 0 bytes .../__pycache__/consumers.cpython-312.pyc | Bin 35435 -> 0 bytes .../__pycache__/consumers.cpython-313.pyc | Bin 46359 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 12746 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 5841 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 17699 -> 0 bytes .../__pycache__/models.cpython-313.pyc | Bin 23373 -> 0 bytes .../__pycache__/routing.cpython-310.pyc | Bin 569 -> 0 bytes .../__pycache__/routing.cpython-311.pyc | Bin 587 -> 0 bytes .../__pycache__/routing.cpython-312.pyc | Bin 842 -> 0 bytes .../__pycache__/routing.cpython-313.pyc | Bin 820 -> 0 bytes .../osichat/__pycache__/urls.cpython-310.pyc | Bin 476 -> 0 bytes .../osichat/__pycache__/urls.cpython-311.pyc | Bin 543 -> 0 bytes .../osichat/__pycache__/urls.cpython-312.pyc | Bin 599 -> 0 bytes .../osichat/__pycache__/urls.cpython-313.pyc | Bin 582 -> 0 bytes .../osichat/__pycache__/views.cpython-310.pyc | Bin 1627 -> 0 bytes .../osichat/__pycache__/views.cpython-311.pyc | Bin 1311 -> 0 bytes .../osichat/__pycache__/views.cpython-312.pyc | Bin 2933 -> 0 bytes .../osichat/__pycache__/views.cpython-313.pyc | Bin 2969 -> 0 bytes osinaweb/osichat/admin.py | 16 - .../__pycache__/serializers.cpython-310.pyc | Bin 1849 -> 0 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 843 -> 0 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 2378 -> 0 bytes .../__pycache__/serializers.cpython-313.pyc | Bin 2663 -> 0 bytes .../api/__pycache__/urls.cpython-310.pyc | Bin 407 -> 0 bytes .../api/__pycache__/urls.cpython-311.pyc | Bin 398 -> 0 bytes .../api/__pycache__/urls.cpython-312.pyc | Bin 448 -> 0 bytes .../api/__pycache__/urls.cpython-313.pyc | Bin 529 -> 0 bytes .../api/__pycache__/views.cpython-310.pyc | Bin 3266 -> 0 bytes .../api/__pycache__/views.cpython-311.pyc | Bin 1060 -> 0 bytes .../api/__pycache__/views.cpython-312.pyc | Bin 2444 -> 0 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 6548 -> 0 bytes osinaweb/osichat/api/serializers.py | 37 - osinaweb/osichat/api/urls.py | 10 - osinaweb/osichat/api/views.py | 126 --- osinaweb/osichat/apps.py | 6 - osinaweb/osichat/consumers.py | 973 ------------------ osinaweb/osichat/migrations/0001_initial.py | 79 -- ...sion_alter_chatroom_created_by_and_more.py | 31 - ...roomguest_remove_chatroom_guest_session.py | 26 - .../migrations/0004_chatroomguest_room.py | 19 - .../0005_alter_chatmessage_member.py | 21 - .../0006_alter_chatmessage_content.py | 18 - .../migrations/0007_chatmessage_room.py | 19 - .../migrations/0008_alter_chatmessage_room.py | 19 - osinaweb/osichat/migrations/0009_visitor.py | 23 - ...10_visitor_left_date_visitor_visit_date.py | 23 - .../migrations/0011_visitor_country.py | 18 - .../0012_alter_visitor_reference.py | 18 - .../0013_rename_reference_visitor_referrer.py | 18 - ...014_alter_chatmessageattachment_message.py | 19 - ...seen_guest_alter_chatmessageseen_member.py | 26 - .../0016_chatmessageseen_seen_date.py | 18 - ..._date_terminated_chatroom_terminated_by.py | 26 - ...ve_chatroomguest_mobile_number_and_more.py | 72 -- .../migrations/0019_visitorlog_visitor.py | 19 - .../osichat/migrations/0020_chatroomreview.py | 22 - .../migrations/0021_chatroomreview_details.py | 18 - .../migrations/0022_visitorlog_title.py | 18 - ...23_visitor_browser_name_visitor_os_name.py | 23 - .../migrations/0024_chatotification.py | 23 - ...rename_chatotification_chatnotification.py | 17 - .../osichat/migrations/0026_visitor_region.py | 18 - .../migrations/0027_chatnotification_type.py | 18 - .../0028_chatnotification_type_id.py | 18 - .../0029_chatnotification_session_id.py | 18 - .../migrations/0030_chatnotification_users.py | 20 - .../0031_alter_chatnotification_users.py | 20 - ...otification_users_chatnotification_user.py | 25 - .../osichat/migrations/0033_chatconnection.py | 27 - .../0034_chatroom_group_chatroom_visitor.py | 23 - ..._group_remove_chatroom_visitor_and_more.py | 26 - osinaweb/osichat/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 1999 -> 0 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 4332 -> 0 bytes .../__pycache__/0001_initial.cpython-312.pyc | Bin 4896 -> 0 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 4687 -> 0 bytes ...atroom_created_by_and_more.cpython-310.pyc | Bin 1024 -> 0 bytes ...atroom_created_by_and_more.cpython-311.pyc | Bin 1544 -> 0 bytes ...atroom_created_by_and_more.cpython-312.pyc | Bin 1530 -> 0 bytes ...atroom_created_by_and_more.cpython-313.pyc | Bin 1533 -> 0 bytes ...ove_chatroom_guest_session.cpython-310.pyc | Bin 945 -> 0 bytes ...ove_chatroom_guest_session.cpython-311.pyc | Bin 1343 -> 0 bytes ...ove_chatroom_guest_session.cpython-312.pyc | Bin 1278 -> 0 bytes ...ove_chatroom_guest_session.cpython-313.pyc | Bin 1279 -> 0 bytes .../0004_chatroomguest_room.cpython-310.pyc | Bin 782 -> 0 bytes .../0004_chatroomguest_room.cpython-311.pyc | Bin 1042 -> 0 bytes .../0004_chatroomguest_room.cpython-312.pyc | Bin 1019 -> 0 bytes .../0004_chatroomguest_room.cpython-313.pyc | Bin 1056 -> 0 bytes ...5_alter_chatmessage_member.cpython-310.pyc | Bin 856 -> 0 bytes ...5_alter_chatmessage_member.cpython-311.pyc | Bin 1204 -> 0 bytes ...5_alter_chatmessage_member.cpython-312.pyc | Bin 1194 -> 0 bytes ...5_alter_chatmessage_member.cpython-313.pyc | Bin 1229 -> 0 bytes ..._alter_chatmessage_content.cpython-310.pyc | Bin 660 -> 0 bytes ..._alter_chatmessage_content.cpython-311.pyc | Bin 863 -> 0 bytes ..._alter_chatmessage_content.cpython-312.pyc | Bin 798 -> 0 bytes ..._alter_chatmessage_content.cpython-313.pyc | Bin 835 -> 0 bytes .../0007_chatmessage_room.cpython-310.pyc | Bin 760 -> 0 bytes .../0007_chatmessage_room.cpython-311.pyc | Bin 1019 -> 0 bytes .../0007_chatmessage_room.cpython-312.pyc | Bin 996 -> 0 bytes .../0007_chatmessage_room.cpython-313.pyc | Bin 1033 -> 0 bytes ...008_alter_chatmessage_room.cpython-310.pyc | Bin 756 -> 0 bytes ...008_alter_chatmessage_room.cpython-311.pyc | Bin 1015 -> 0 bytes ...008_alter_chatmessage_room.cpython-312.pyc | Bin 992 -> 0 bytes ...008_alter_chatmessage_room.cpython-313.pyc | Bin 1029 -> 0 bytes .../__pycache__/0009_visitor.cpython-310.pyc | Bin 812 -> 0 bytes .../__pycache__/0009_visitor.cpython-311.pyc | Bin 1195 -> 0 bytes .../__pycache__/0009_visitor.cpython-312.pyc | Bin 1138 -> 0 bytes .../__pycache__/0009_visitor.cpython-313.pyc | Bin 1152 -> 0 bytes ...ft_date_visitor_visit_date.cpython-310.pyc | Bin 689 -> 0 bytes ...ft_date_visitor_visit_date.cpython-311.pyc | Bin 974 -> 0 bytes ...ft_date_visitor_visit_date.cpython-312.pyc | Bin 907 -> 0 bytes ...ft_date_visitor_visit_date.cpython-313.pyc | Bin 928 -> 0 bytes .../0011_visitor_country.cpython-310.pyc | Bin 666 -> 0 bytes .../0011_visitor_country.cpython-311.pyc | Bin 870 -> 0 bytes .../0011_visitor_country.cpython-312.pyc | Bin 805 -> 0 bytes .../0011_visitor_country.cpython-313.pyc | Bin 842 -> 0 bytes ...12_alter_visitor_reference.cpython-310.pyc | Bin 646 -> 0 bytes ...12_alter_visitor_reference.cpython-311.pyc | Bin 848 -> 0 bytes ...12_alter_visitor_reference.cpython-312.pyc | Bin 782 -> 0 bytes ...12_alter_visitor_reference.cpython-313.pyc | Bin 819 -> 0 bytes ...reference_visitor_referrer.cpython-310.pyc | Bin 624 -> 0 bytes ...reference_visitor_referrer.cpython-311.pyc | Bin 781 -> 0 bytes ...reference_visitor_referrer.cpython-312.pyc | Bin 721 -> 0 bytes ...reference_visitor_referrer.cpython-313.pyc | Bin 766 -> 0 bytes ...tmessageattachment_message.cpython-310.pyc | Bin 796 -> 0 bytes ...tmessageattachment_message.cpython-312.pyc | Bin 1030 -> 0 bytes ...tmessageattachment_message.cpython-313.pyc | Bin 1067 -> 0 bytes ...ter_chatmessageseen_member.cpython-310.pyc | Bin 988 -> 0 bytes ...ter_chatmessageseen_member.cpython-312.pyc | Bin 1516 -> 0 bytes ...ter_chatmessageseen_member.cpython-313.pyc | Bin 1535 -> 0 bytes ..._chatmessageseen_seen_date.cpython-310.pyc | Bin 685 -> 0 bytes ..._chatmessageseen_seen_date.cpython-312.pyc | Bin 822 -> 0 bytes ..._chatmessageseen_seen_date.cpython-313.pyc | Bin 859 -> 0 bytes ...ted_chatroom_terminated_by.cpython-310.pyc | Bin 1004 -> 0 bytes ...ted_chatroom_terminated_by.cpython-312.pyc | Bin 1437 -> 0 bytes ...ted_chatroom_terminated_by.cpython-313.pyc | Bin 1456 -> 0 bytes ...est_mobile_number_and_more.cpython-310.pyc | Bin 1488 -> 0 bytes ...est_mobile_number_and_more.cpython-312.pyc | Bin 2556 -> 0 bytes ...est_mobile_number_and_more.cpython-313.pyc | Bin 2444 -> 0 bytes .../0019_visitorlog_visitor.cpython-310.pyc | Bin 789 -> 0 bytes .../0019_visitorlog_visitor.cpython-312.pyc | Bin 1026 -> 0 bytes .../0019_visitorlog_visitor.cpython-313.pyc | Bin 1063 -> 0 bytes .../0020_chatroomreview.cpython-310.pyc | Bin 975 -> 0 bytes .../0020_chatroomreview.cpython-312.pyc | Bin 1340 -> 0 bytes .../0020_chatroomreview.cpython-313.pyc | Bin 1358 -> 0 bytes ...021_chatroomreview_details.cpython-310.pyc | Bin 648 -> 0 bytes ...021_chatroomreview_details.cpython-312.pyc | Bin 786 -> 0 bytes ...021_chatroomreview_details.cpython-313.pyc | Bin 823 -> 0 bytes .../0022_visitorlog_title.cpython-310.pyc | Bin 663 -> 0 bytes .../0022_visitorlog_title.cpython-312.pyc | Bin 803 -> 0 bytes .../0022_visitorlog_title.cpython-313.pyc | Bin 840 -> 0 bytes ...owser_name_visitor_os_name.cpython-310.pyc | Bin 726 -> 0 bytes ...owser_name_visitor_os_name.cpython-312.pyc | Bin 952 -> 0 bytes ...owser_name_visitor_os_name.cpython-313.pyc | Bin 973 -> 0 bytes .../0024_chatotification.cpython-310.pyc | Bin 890 -> 0 bytes .../0024_chatotification.cpython-312.pyc | Bin 1227 -> 0 bytes .../0024_chatotification.cpython-313.pyc | Bin 1233 -> 0 bytes ...ification_chatnotification.cpython-310.pyc | Bin 611 -> 0 bytes ...ification_chatnotification.cpython-312.pyc | Bin 707 -> 0 bytes ...ification_chatnotification.cpython-313.pyc | Bin 752 -> 0 bytes .../0026_visitor_region.cpython-310.pyc | Bin 667 -> 0 bytes .../0026_visitor_region.cpython-312.pyc | Bin 806 -> 0 bytes .../0026_visitor_region.cpython-313.pyc | Bin 843 -> 0 bytes ...0027_chatnotification_type.cpython-310.pyc | Bin 700 -> 0 bytes ...0027_chatnotification_type.cpython-312.pyc | Bin 849 -> 0 bytes ...0027_chatnotification_type.cpython-313.pyc | Bin 886 -> 0 bytes ...8_chatnotification_type_id.cpython-310.pyc | Bin 653 -> 0 bytes ...8_chatnotification_type_id.cpython-313.pyc | Bin 826 -> 0 bytes ...hatnotification_session_id.cpython-310.pyc | Bin 678 -> 0 bytes ...hatnotification_session_id.cpython-313.pyc | Bin 853 -> 0 bytes ...030_chatnotification_users.cpython-310.pyc | Bin 766 -> 0 bytes ...030_chatnotification_users.cpython-313.pyc | Bin 1028 -> 0 bytes ...ter_chatnotification_users.cpython-310.pyc | Bin 778 -> 0 bytes ...ter_chatnotification_users.cpython-313.pyc | Bin 1042 -> 0 bytes ...sers_chatnotification_user.cpython-310.pyc | Bin 945 -> 0 bytes ...sers_chatnotification_user.cpython-313.pyc | Bin 1352 -> 0 bytes .../0033_chatconnection.cpython-310.pyc | Bin 1125 -> 0 bytes .../0033_chatconnection.cpython-313.pyc | Bin 1685 -> 0 bytes ...oom_group_chatroom_visitor.cpython-310.pyc | Bin 687 -> 0 bytes ...oom_group_chatroom_visitor.cpython-313.pyc | Bin 926 -> 0 bytes ..._chatroom_visitor_and_more.cpython-310.pyc | Bin 845 -> 0 bytes ..._chatroom_visitor_and_more.cpython-313.pyc | Bin 1104 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 201 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 191 -> 0 bytes osinaweb/osichat/models.py | 395 ------- osinaweb/osichat/routing.py | 11 - osinaweb/osichat/templates/chat-room.html | 177 ---- osinaweb/osichat/templates/chat-widget.html | 131 --- osinaweb/osichat/templates/ended-chat.html | 409 -------- .../partials/message-attachment.html | 63 -- .../osichat/templates/partials/message.html | 80 -- .../templates/partials/submitted-review.html | 232 ----- .../osichat/templates/partials/typing.html | 13 - .../templates/partials/unread-messages.html | 63 -- osinaweb/osichat/templates/start-chat.html | 72 -- osinaweb/osichat/tests.py | 3 - osinaweb/osichat/urls.py | 9 - osinaweb/osichat/views.py | 50 - .../__pycache__/__init__.cpython-313.pyc | Bin 182 -> 182 bytes .../__pycache__/admin.cpython-313.pyc | Bin 4279 -> 4279 bytes .../__pycache__/apps.cpython-313.pyc | Bin 552 -> 552 bytes .../__pycache__/consumers.cpython-313.pyc | Bin 9860 -> 9860 bytes .../__pycache__/decorators.cpython-313.pyc | Bin 1319 -> 1319 bytes .../__pycache__/forms.cpython-313.pyc | Bin 1363 -> 1363 bytes .../__pycache__/models.cpython-313.pyc | Bin 32090 -> 32090 bytes .../__pycache__/routing.cpython-313.pyc | Bin 628 -> 628 bytes .../__pycache__/urls.cpython-313.pyc | Bin 6735 -> 6735 bytes .../__pycache__/views.cpython-313.pyc | Bin 42978 -> 42949 bytes .../add/__pycache__/urls.cpython-313.pyc | Bin 4304 -> 4304 bytes .../add/__pycache__/views.cpython-313.pyc | Bin 39513 -> 39513 bytes .../__pycache__/serializers.cpython-313.pyc | Bin 1710 -> 1710 bytes .../api/__pycache__/urls.cpython-313.pyc | Bin 544 -> 544 bytes .../api/__pycache__/utils.cpython-313.pyc | Bin 2635 -> 2635 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 4928 -> 4928 bytes osinaweb/osinacore/custom_context.py | 4 +- .../delete/__pycache__/urls.cpython-313.pyc | Bin 1901 -> 1901 bytes .../delete/__pycache__/views.cpython-313.pyc | Bin 7655 -> 7655 bytes .../edit/__pycache__/urls.cpython-313.pyc | Bin 3510 -> 3510 bytes .../edit/__pycache__/views.cpython-313.pyc | Bin 35080 -> 35080 bytes .../__pycache__/urls.cpython-313.pyc | Bin 404 -> 404 bytes .../__pycache__/views.cpython-313.pyc | Bin 638 -> 638 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 3617 -> 3617 bytes ...ions_staffprofile_and_more.cpython-313.pyc | Bin 3793 -> 3793 bytes .../0003_milestone.cpython-313.pyc | Bin 1514 -> 1514 bytes .../__pycache__/0004_epic.cpython-313.pyc | Bin 1456 -> 1456 bytes .../0005_staffprofile_image.cpython-313.pyc | Bin 816 -> 816 bytes .../__pycache__/0006_note.cpython-313.pyc | Bin 1698 -> 1698 bytes ...ct_id_alter_project_status.cpython-313.pyc | Bin 1079 -> 1079 bytes ...8_alter_project_project_id.cpython-313.pyc | Bin 869 -> 869 bytes ...9_alter_project_project_id.cpython-313.pyc | Bin 858 -> 858 bytes .../0010_remove_note_date.cpython-313.pyc | Bin 717 -> 717 bytes ...r_alter_note_text_and_more.cpython-313.pyc | Bin 1797 -> 1797 bytes .../0012_projectrequirement.cpython-313.pyc | Bin 1313 -> 1313 bytes .../0013_projectfile.cpython-313.pyc | Bin 1416 -> 1416 bytes ...014_alter_projectfile_file.cpython-313.pyc | Bin 827 -> 827 bytes .../0015_projectcredentials.cpython-313.pyc | Bin 1416 -> 1416 bytes ...dentials_projectcredential.cpython-313.pyc | Bin 767 -> 767 bytes ...e_alter_project_start_date.cpython-313.pyc | Bin 987 -> 987 bytes .../0018_epic_status.cpython-313.pyc | Bin 903 -> 903 bytes ...date_alter_epic_start_date.cpython-313.pyc | Bin 945 -> 945 bytes .../__pycache__/0020_task.cpython-313.pyc | Bin 1912 -> 1912 bytes ...rprofile_business_and_more.cpython-313.pyc | Bin 2747 -> 2747 bytes ...ustomerprofile_customer_id.cpython-313.pyc | Bin 884 -> 884 bytes .../0023_task_assigned_to.cpython-313.pyc | Bin 1042 -> 1042 bytes .../0024_task_task_id.cpython-313.pyc | Bin 830 -> 830 bytes .../__pycache__/0025_status.cpython-313.pyc | Bin 1574 -> 1574 bytes ...e_status_user_status_staff.cpython-313.pyc | Bin 1157 -> 1157 bytes .../0027_alter_status_staff.cpython-313.pyc | Bin 1083 -> 1083 bytes ...8_remove_projecttype_color.cpython-313.pyc | Bin 727 -> 727 bytes .../0029_alter_reference_date.cpython-313.pyc | Bin 828 -> 828 bytes .../__pycache__/0030_tag.cpython-313.pyc | Bin 946 -> 946 bytes ...1_alter_staffprofile_image.cpython-313.pyc | Bin 834 -> 834 bytes .../__pycache__/0032_point.cpython-313.pyc | Bin 1438 -> 1438 bytes ...nt_date_workingon_and_more.cpython-313.pyc | Bin 1208 -> 1208 bytes ...nt_date_completed_and_more.cpython-313.pyc | Bin 1264 -> 1264 bytes .../0035_business_business_id.cpython-313.pyc | Bin 866 -> 866 bytes ...lter_staffprofile_position.cpython-313.pyc | Bin 1171 -> 1171 bytes ...move_staffprofile_position.cpython-313.pyc | Bin 759 -> 759 bytes ...taffprofile_staff_position.cpython-313.pyc | Bin 1066 -> 1066 bytes ...taffprofile_staff_position.cpython-313.pyc | Bin 1091 -> 1091 bytes ...0040_staffprofile_staff_id.cpython-313.pyc | Bin 866 -> 866 bytes .../0041_dailyreport.cpython-313.pyc | Bin 1467 -> 1467 bytes ...omerprofile_email_and_more.cpython-313.pyc | Bin 1162 -> 1162 bytes .../0043_businesstype.cpython-313.pyc | Bin 982 -> 982 bytes ...ove_business_business_type.cpython-313.pyc | Bin 731 -> 731 bytes .../0045_business_type.cpython-313.pyc | Bin 1056 -> 1056 bytes .../0046_task_requirement.cpython-313.pyc | Bin 1052 -> 1052 bytes .../0047_task_status_date.cpython-313.pyc | Bin 957 -> 957 bytes ...r_customerprofile_business.cpython-313.pyc | Bin 1111 -> 1111 bytes ...r_customerprofile_business.cpython-313.pyc | Bin 1079 -> 1079 bytes ...by_projectrequirement_date.cpython-313.pyc | Bin 1393 -> 1393 bytes ...051_alter_task_requirement.cpython-313.pyc | Bin 1082 -> 1082 bytes .../0052_note_project.cpython-313.pyc | Bin 1035 -> 1035 bytes .../0053_pointactivity.cpython-313.pyc | Bin 1310 -> 1310 bytes ...nt_date_completed_and_more.cpython-313.pyc | Bin 947 -> 947 bytes .../0055_alter_point_status.cpython-313.pyc | Bin 958 -> 958 bytes ...ter_pointactivity_end_time.cpython-313.pyc | Bin 843 -> 843 bytes ...otal_time_minutes_and_more.cpython-313.pyc | Bin 1110 -> 1110 bytes ..._total_time_hours_and_more.cpython-313.pyc | Bin 933 -> 933 bytes ...059_alter_task_requirement.cpython-313.pyc | Bin 1087 -> 1087 bytes ...0_pointactivity_total_time.cpython-313.pyc | Bin 843 -> 843 bytes ...date_alter_task_start_date.cpython-313.pyc | Bin 948 -> 948 bytes .../0062_connection.cpython-313.pyc | Bin 1579 -> 1579 bytes ...0063_alter_connection_date.cpython-313.pyc | Bin 810 -> 810 bytes .../__pycache__/0064_reaction.cpython-313.pyc | Bin 1603 -> 1603 bytes ...ter_customerprofile_status.cpython-313.pyc | Bin 946 -> 946 bytes ...business_business_customer.cpython-313.pyc | Bin 1194 -> 1194 bytes ..._customerprofile_confirmed.cpython-313.pyc | Bin 885 -> 885 bytes ...profile_confirmed_and_more.cpython-313.pyc | Bin 1082 -> 1082 bytes ..._projectfile_file_and_more.cpython-313.pyc | Bin 1183 -> 1183 bytes ...le_staff_position_and_more.cpython-313.pyc | Bin 1750 -> 1750 bytes ...jecttype_department_ticket.cpython-313.pyc | Bin 2328 -> 2328 bytes ...treaction_ticketattachment.cpython-313.pyc | Bin 2670 -> 2670 bytes ...073_alter_ticket_regarding.cpython-313.pyc | Bin 964 -> 964 bytes ...ed_ticketupdate_date_added.cpython-313.pyc | Bin 785 -> 785 bytes ...attachment_ticket_and_more.cpython-313.pyc | Bin 1315 -> 1315 bytes .../0076_alter_reference_date.cpython-313.pyc | Bin 825 -> 825 bytes ...oject_active_projectstatus.cpython-313.pyc | Bin 1728 -> 1728 bytes ...alter_projectstatus_status.cpython-313.pyc | Bin 970 -> 970 bytes ...e_alter_project_start_date.cpython-313.pyc | Bin 950 -> 950 bytes .../0080_project_logo.cpython-313.pyc | Bin 859 -> 859 bytes .../0081_status_task.cpython-313.pyc | Bin 1067 -> 1067 bytes .../0082_pinnedproject.cpython-313.pyc | Bin 1515 -> 1515 bytes ...ition_jobposition_and_more.cpython-313.pyc | Bin 866 -> 866 bytes .../0084_staffposition.cpython-313.pyc | Bin 1499 -> 1499 bytes ...sition_start_date_and_more.cpython-313.pyc | Bin 966 -> 966 bytes ...s_connection_terminated_at.cpython-313.pyc | Bin 979 -> 979 bytes ...087_remove_connection_date.cpython-313.pyc | Bin 755 -> 755 bytes .../0088_connection_date.cpython-313.pyc | Bin 814 -> 814 bytes .../0089_connection_connected.cpython-313.pyc | Bin 819 -> 819 bytes ...ed_at_connection_last_seen.cpython-313.pyc | Bin 783 -> 783 bytes ...0091_alter_connection_user.cpython-313.pyc | Bin 1219 -> 1219 bytes ...onnected_connection_online.cpython-313.pyc | Bin 770 -> 770 bytes ...93_connection_disconnected.cpython-313.pyc | Bin 845 -> 845 bytes .../0094_customuser.cpython-313.pyc | Bin 1094 -> 1094 bytes .../0095_delete_customuser.cpython-313.pyc | Bin 687 -> 687 bytes .../0096_status_date_time.cpython-313.pyc | Bin 822 -> 822 bytes ...us_date_remove_status_time.cpython-313.pyc | Bin 792 -> 792 bytes ...ojectcredential_identifier.cpython-313.pyc | Bin 821 -> 821 bytes ...redential_usedfor_and_more.cpython-313.pyc | Bin 979 -> 979 bytes ...ojectcredential_date_added.cpython-313.pyc | Bin 860 -> 860 bytes ...ate_projectfile_date_added.cpython-313.pyc | Bin 777 -> 777 bytes ...ctfile_date_added_and_more.cpython-313.pyc | Bin 1442 -> 1442 bytes ...rojectfilealbum_date_added.cpython-313.pyc | Bin 854 -> 854 bytes ...0104_projectfilealbum_file.cpython-313.pyc | Bin 851 -> 851 bytes ...ojectfile_project_and_more.cpython-313.pyc | Bin 2048 -> 2048 bytes ...106_alter_projectfile_file.cpython-313.pyc | Bin 888 -> 888 bytes ...remove_staffprofile_active.cpython-313.pyc | Bin 735 -> 735 bytes ...status_type_status_type_id.cpython-313.pyc | Bin 1057 -> 1057 bytes .../0109_remove_status_task.cpython-313.pyc | Bin 723 -> 723 bytes ...ojectrequirement_milestone.cpython-313.pyc | Bin 1055 -> 1055 bytes ...irement_userstory_and_more.cpython-313.pyc | Bin 1059 -> 1059 bytes ...ename_title_milestone_name.cpython-313.pyc | Bin 780 -> 780 bytes ...pleted_userstory_confirmed.cpython-313.pyc | Bin 959 -> 959 bytes ...114_alter_project_end_date.cpython-313.pyc | Bin 849 -> 849 bytes ...jectstatus_default_created.cpython-313.pyc | Bin 844 -> 844 bytes ...jectstatus_default_created.cpython-313.pyc | Bin 762 -> 762 bytes .../0117_task_milestone.cpython-313.pyc | Bin 1064 -> 1064 bytes ..._at_business_uuid_and_more.cpython-313.pyc | Bin 7811 -> 7811 bytes ...ove_business_uuid_and_more.cpython-313.pyc | Bin 4487 -> 4487 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 193 -> 193 bytes .../templates/chat_templates/chat-room.html | 135 --- .../templates/chat_templates/chat-widget.html | 87 -- .../chat_templates/partials/message.html | 73 -- .../partials/new-chat-room.html | 21 - .../chat_templates/partials/new-visitor.html | 30 - .../chat_templates/partials/rooms.html | 31 - .../chat_templates/partials/typing.html | 13 - .../chat_templates/partials/visitors.html | 47 - .../osinacore/templates/dashboard-main.html | 6 - osinaweb/osinacore/templates/main.html | 5 - osinaweb/osinacore/views.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 181 -> 181 bytes .../osinaweb/__pycache__/asgi.cpython-313.pyc | Bin 3160 -> 3160 bytes .../__pycache__/routing.cpython-313.pyc | Bin 439 -> 364 bytes .../__pycache__/settings.cpython-313.pyc | Bin 4205 -> 4196 bytes .../osinaweb/__pycache__/urls.cpython-313.pyc | Bin 1580 -> 1523 bytes osinaweb/osinaweb/routing.py | 3 +- osinaweb/osinaweb/settings.py | 1 - osinaweb/osinaweb/urls.py | 1 - osinaweb/static/js/.DS_Store | Bin 10244 -> 10244 bytes .../static/js/osichat-admin/chat-toggle.js | 27 - .../js/osichat-admin/inner-conversation.js | 163 --- osinaweb/static/js/osichat-admin/osichat.js | 224 ---- osinaweb/static/js/osichat-admin/textarea.js | 84 -- .../osichat-admin/update-visitors-duration.js | 27 - osinaweb/static/js/osichat/chat-toggle.js | 87 -- osinaweb/static/js/osichat/conversation.js | 345 ------- osinaweb/static/js/osichat/end-chat.js | 28 - osinaweb/static/js/osichat/send-review.js | 57 - osinaweb/static/js/osichat/textarea.js | 82 -- osinaweb/static/js/osichat/upload-file.js | 131 --- osinaweb/static/js/osichat/visitors.js | 128 --- .../__pycache__/__init__.cpython-313.pyc | Bin 180 -> 180 bytes .../support/__pycache__/admin.cpython-313.pyc | Bin 1062 -> 1062 bytes .../support/__pycache__/apps.cpython-313.pyc | Bin 546 -> 546 bytes .../__pycache__/consumers.cpython-313.pyc | Bin 15976 -> 15976 bytes .../__pycache__/decorators.cpython-313.pyc | Bin 1456 -> 1456 bytes .../__pycache__/models.cpython-313.pyc | Bin 15820 -> 15820 bytes .../__pycache__/routing.cpython-313.pyc | Bin 634 -> 634 bytes .../support/__pycache__/urls.cpython-313.pyc | Bin 1492 -> 1492 bytes .../support/__pycache__/views.cpython-313.pyc | Bin 4850 -> 4850 bytes .../add/__pycache__/urls.cpython-313.pyc | Bin 681 -> 681 bytes .../add/__pycache__/views.cpython-313.pyc | Bin 2335 -> 2335 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 6674 -> 6674 bytes ...icket_departments_and_more.cpython-313.pyc | Bin 2227 -> 2227 bytes .../0003_remove_ticket_status.cpython-313.pyc | Bin 731 -> 731 bytes ...ened_date_ticketconnection.cpython-313.pyc | Bin 1961 -> 1961 bytes ...er_ticketconnection_ticket.cpython-313.pyc | Bin 1056 -> 1056 bytes ...etconnection_type_and_more.cpython-313.pyc | Bin 938 -> 938 bytes ...07_alter_ticketstaff_staff.cpython-313.pyc | Bin 1118 -> 1118 bytes ...08_alter_tickettask_ticket.cpython-313.pyc | Bin 1025 -> 1025 bytes ...etconnection_terminated_at.cpython-313.pyc | Bin 852 -> 852 bytes ...icketconnection_terminated.cpython-313.pyc | Bin 755 -> 755 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 191 -> 191 bytes osinaweb/tailwind.config.js | 2 +- 531 files changed, 4 insertions(+), 5562 deletions(-) delete mode 100644 osinaweb/osichat/__init__.py delete mode 100644 osinaweb/osichat/__pycache__/__init__.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/__init__.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/__init__.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/__init__.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/admin.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/admin.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/admin.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/admin.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/apps.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/apps.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/apps.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/apps.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/consumers.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/consumers.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/consumers.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/consumers.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/models.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/models.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/models.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/models.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/routing.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/routing.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/routing.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/routing.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/urls.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/urls.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/urls.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/urls.cpython-313.pyc delete mode 100644 osinaweb/osichat/__pycache__/views.cpython-310.pyc delete mode 100644 osinaweb/osichat/__pycache__/views.cpython-311.pyc delete mode 100644 osinaweb/osichat/__pycache__/views.cpython-312.pyc delete mode 100644 osinaweb/osichat/__pycache__/views.cpython-313.pyc delete mode 100644 osinaweb/osichat/admin.py delete mode 100644 osinaweb/osichat/api/__pycache__/serializers.cpython-310.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/serializers.cpython-311.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/serializers.cpython-312.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/serializers.cpython-313.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/urls.cpython-311.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/urls.cpython-312.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/urls.cpython-313.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/views.cpython-310.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/views.cpython-311.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/views.cpython-312.pyc delete mode 100644 osinaweb/osichat/api/__pycache__/views.cpython-313.pyc delete mode 100644 osinaweb/osichat/api/serializers.py delete mode 100644 osinaweb/osichat/api/urls.py delete mode 100644 osinaweb/osichat/api/views.py delete mode 100644 osinaweb/osichat/apps.py delete mode 100644 osinaweb/osichat/consumers.py delete mode 100644 osinaweb/osichat/migrations/0001_initial.py delete mode 100644 osinaweb/osichat/migrations/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.py delete mode 100644 osinaweb/osichat/migrations/0003_chatroomguest_remove_chatroom_guest_session.py delete mode 100644 osinaweb/osichat/migrations/0004_chatroomguest_room.py delete mode 100644 osinaweb/osichat/migrations/0005_alter_chatmessage_member.py delete mode 100644 osinaweb/osichat/migrations/0006_alter_chatmessage_content.py delete mode 100644 osinaweb/osichat/migrations/0007_chatmessage_room.py delete mode 100644 osinaweb/osichat/migrations/0008_alter_chatmessage_room.py delete mode 100644 osinaweb/osichat/migrations/0009_visitor.py delete mode 100644 osinaweb/osichat/migrations/0010_visitor_left_date_visitor_visit_date.py delete mode 100644 osinaweb/osichat/migrations/0011_visitor_country.py delete mode 100644 osinaweb/osichat/migrations/0012_alter_visitor_reference.py delete mode 100644 osinaweb/osichat/migrations/0013_rename_reference_visitor_referrer.py delete mode 100644 osinaweb/osichat/migrations/0014_alter_chatmessageattachment_message.py delete mode 100644 osinaweb/osichat/migrations/0015_chatmessageseen_guest_alter_chatmessageseen_member.py delete mode 100644 osinaweb/osichat/migrations/0016_chatmessageseen_seen_date.py delete mode 100644 osinaweb/osichat/migrations/0017_chatroom_date_terminated_chatroom_terminated_by.py delete mode 100644 osinaweb/osichat/migrations/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.py delete mode 100644 osinaweb/osichat/migrations/0019_visitorlog_visitor.py delete mode 100644 osinaweb/osichat/migrations/0020_chatroomreview.py delete mode 100644 osinaweb/osichat/migrations/0021_chatroomreview_details.py delete mode 100644 osinaweb/osichat/migrations/0022_visitorlog_title.py delete mode 100644 osinaweb/osichat/migrations/0023_visitor_browser_name_visitor_os_name.py delete mode 100644 osinaweb/osichat/migrations/0024_chatotification.py delete mode 100644 osinaweb/osichat/migrations/0025_rename_chatotification_chatnotification.py delete mode 100644 osinaweb/osichat/migrations/0026_visitor_region.py delete mode 100644 osinaweb/osichat/migrations/0027_chatnotification_type.py delete mode 100644 osinaweb/osichat/migrations/0028_chatnotification_type_id.py delete mode 100644 osinaweb/osichat/migrations/0029_chatnotification_session_id.py delete mode 100644 osinaweb/osichat/migrations/0030_chatnotification_users.py delete mode 100644 osinaweb/osichat/migrations/0031_alter_chatnotification_users.py delete mode 100644 osinaweb/osichat/migrations/0032_remove_chatnotification_users_chatnotification_user.py delete mode 100644 osinaweb/osichat/migrations/0033_chatconnection.py delete mode 100644 osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py delete mode 100644 osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py delete mode 100644 osinaweb/osichat/migrations/__init__.py delete mode 100644 osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0019_visitorlog_visitor.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0019_visitorlog_visitor.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0019_visitorlog_visitor.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0024_chatotification.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0024_chatotification.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0024_chatotification.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0027_chatnotification_type.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0027_chatnotification_type.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0027_chatnotification_type.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0028_chatnotification_type_id.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0028_chatnotification_type_id.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0029_chatnotification_session_id.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0029_chatnotification_session_id.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0030_chatnotification_users.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0030_chatnotification_users.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0031_alter_chatnotification_users.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0031_alter_chatnotification_users.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0032_remove_chatnotification_users_chatnotification_user.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0032_remove_chatnotification_users_chatnotification_user.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0033_chatconnection.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0033_chatconnection.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-313.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/__init__.cpython-311.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/__init__.cpython-312.pyc delete mode 100644 osinaweb/osichat/migrations/__pycache__/__init__.cpython-313.pyc delete mode 100644 osinaweb/osichat/models.py delete mode 100644 osinaweb/osichat/routing.py delete mode 100644 osinaweb/osichat/templates/chat-room.html delete mode 100644 osinaweb/osichat/templates/chat-widget.html delete mode 100644 osinaweb/osichat/templates/ended-chat.html delete mode 100644 osinaweb/osichat/templates/partials/message-attachment.html delete mode 100644 osinaweb/osichat/templates/partials/message.html delete mode 100644 osinaweb/osichat/templates/partials/submitted-review.html delete mode 100644 osinaweb/osichat/templates/partials/typing.html delete mode 100644 osinaweb/osichat/templates/partials/unread-messages.html delete mode 100644 osinaweb/osichat/templates/start-chat.html delete mode 100644 osinaweb/osichat/tests.py delete mode 100644 osinaweb/osichat/urls.py delete mode 100644 osinaweb/osichat/views.py delete mode 100644 osinaweb/osinacore/templates/chat_templates/chat-room.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/chat-widget.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/message.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/new-visitor.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/rooms.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/typing.html delete mode 100644 osinaweb/osinacore/templates/chat_templates/partials/visitors.html delete mode 100644 osinaweb/static/js/osichat-admin/chat-toggle.js delete mode 100644 osinaweb/static/js/osichat-admin/inner-conversation.js delete mode 100644 osinaweb/static/js/osichat-admin/osichat.js delete mode 100644 osinaweb/static/js/osichat-admin/textarea.js delete mode 100644 osinaweb/static/js/osichat-admin/update-visitors-duration.js delete mode 100644 osinaweb/static/js/osichat/chat-toggle.js delete mode 100644 osinaweb/static/js/osichat/conversation.js delete mode 100644 osinaweb/static/js/osichat/end-chat.js delete mode 100644 osinaweb/static/js/osichat/send-review.js delete mode 100644 osinaweb/static/js/osichat/textarea.js delete mode 100644 osinaweb/static/js/osichat/upload-file.js delete mode 100644 osinaweb/static/js/osichat/visitors.js diff --git a/.DS_Store b/.DS_Store index d871cc6ba9473a4a3fbf5e9278bd7f9d3fe68ed1..42d79eafbac0845906b159798b3b6cb5d4ae98a2 100644 GIT binary patch delta 179 zcmZp1XmQw3D9CPPs-s|RZZNq*Fq-k~&a6s} z7vL|>$S?NI(4uE-_A$j?Eshr9V0T9W_ z?!t=Jl8j1>+KeWQwv6_S9*lvEL5#_aIgGiCMU2G|RZNT!nn4aqLn+3Z$qR*dZB7%J G#|;3)943eW diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index 3d883be03a3fdd47f33270f675eae149b6d7aa68..23864b77897d6f7c8f8c43f62b3fe9f1f99a0b54 100644 GIT binary patch delta 292 zcmZoEXh~3DU|?W$DortDV9)?EIe-{M3-ADmHUz}M5EWBAsAeNs|bTW^^bXh)z zM21p^5{3+*33)&|lOY)>0;2O7@+SK!$ZuY(kjH4q0u;_?C}K$U%*jtq%E?axIR@xN zSsL?hS8%+KsX3xknSx;4bv!GHl%j6Jo6&avnR*nMB%*)Hg00cYuBNlSA0{|@;1SbFh delta 19 ZcmeC?>*nMB%*)Hg00c{Rhb`o02LLbh1ib(N diff --git a/osinaweb/addressbook/migrations/__pycache__/0003_contact.cpython-313.pyc b/osinaweb/addressbook/migrations/__pycache__/0003_contact.cpython-313.pyc index 138ae219a384de7dbbcc4eed57387d6f878d449a..2bb550106ac69fdbba752f735b8f543bb0a01dd5 100644 GIT binary patch delta 20 acmeC??&jwH%*)Hg00cYuBQ|n3umS)w3IwkJ delta 20 acmeC??&jwH%*)Hg00c{Rhi&9;U=;h%4%*)Hg00cYuBQ|m~u>b%t?F23W delta 20 acmeC>=;h%4%*)Hg00c{Rhi&9$VgUd&Uj)Pe diff --git a/osinaweb/addressbook/migrations/__pycache__/0006_comment_prospectinglist_prospectinglistitem.cpython-313.pyc b/osinaweb/addressbook/migrations/__pycache__/0006_comment_prospectinglist_prospectinglistitem.cpython-313.pyc index 5553b1751436faba765f55dc5ab9c265e86d92b6..cdcacb7fcad6f1842787eaa6a1573355c1d89fe5 100644 GIT binary patch delta 20 acmbOwHcO2AGcPX}0}$-skJ!k~&kX=H^aOYS delta 20 acmbOwHcO2AGcPX}0}w3P9k!91pBn%;W(5ua diff --git a/osinaweb/addressbook/migrations/__pycache__/0007_prospectinglistitem_comments.cpython-313.pyc b/osinaweb/addressbook/migrations/__pycache__/0007_prospectinglistitem_comments.cpython-313.pyc index 9324e5fde16f501a878a499edfcb068385b3cfcd..8de71f5db8cd7e8663aba71b766676aeb8a6dddc 100644 GIT binary patch delta 20 acmZo>Z)WHI%*)Hg00cYuBQ|nZFarQEI0TIV delta 20 acmZo>Z)WHI%*)Hg00c{Rhi&ApU1s(tZ delta 19 ZcmX@ic$ksGcPX}0}$-skJ!k)of!Z+5CuvA delta 20 acmX@aeu$m>GcPX}0}x2=4co}Qof!Z*!39?U diff --git a/osinaweb/billing/__pycache__/__init__.cpython-313.pyc b/osinaweb/billing/__pycache__/__init__.cpython-313.pyc index 280a4a0bec25d34800f87387e5f28ebe796bdd59..8499f1c0e0a712574479a8c45323ead2e7b0563e 100644 GIT binary patch delta 19 ZcmdnOxP_7XGcPX}0}$-skC@245&$uj1n~d> delta 19 ZcmdnOxP_7XGcPX}0}w3P9X64BB>*&V1&06t diff --git a/osinaweb/billing/__pycache__/admin.cpython-313.pyc b/osinaweb/billing/__pycache__/admin.cpython-313.pyc index 605505fe7f70ff0a100e5aaf6e46cb02a5ac592e..6ff77493e73a288907f3437ede68baa727728d79 100644 GIT binary patch delta 20 acmey({+pfqGcPX}0}$-skJ!llff)co_yzR< delta 20 acmey({+pfqGcPX}0}w3P9k!AC12X_dY6gn{ diff --git a/osinaweb/billing/__pycache__/apps.cpython-313.pyc b/osinaweb/billing/__pycache__/apps.cpython-313.pyc index 072715e627be6083d1a8d587f6c9b5cfe75fee66..36b6bc9b66674f5e726448d0351f4ff90f3118ef 100644 GIT binary patch delta 20 acmZ3)vWSKIGcPX}0}$-skJ!j9&IAB6qXc6B delta 20 acmZ3)vWSKIGcPX}0}w3P9k!8MoCyFo6$JSJ diff --git a/osinaweb/billing/__pycache__/models.cpython-313.pyc b/osinaweb/billing/__pycache__/models.cpython-313.pyc index bd1ca39035a0015313894cb20a393c881107a453..41e074048f8b373ce4d32d7d2928e293b4e75259 100644 GIT binary patch delta 20 acmaD8@g{=%GcPX}0}$-skJ!kar~?2?Ed~<+ delta 20 acmaD8@g{=%GcPX}0}w3P9k!7>Q3n7{p9ZM_ diff --git a/osinaweb/billing/__pycache__/urls.cpython-313.pyc b/osinaweb/billing/__pycache__/urls.cpython-313.pyc index f815be50645c0716b22274c9b16d39e162abe27f..bf5ffb9e969c4ed2dc3aa5ec118228008fb65b60 100644 GIT binary patch delta 20 acmbQuIh&LFGcPX}0}$-skJ!jPfdv3GK?K?W delta 20 acmbQuIh&LFGcPX}0}w3P9k!8s0t)~)vjuPf diff --git a/osinaweb/billing/__pycache__/views.cpython-313.pyc b/osinaweb/billing/__pycache__/views.cpython-313.pyc index 2715135f1c0e97a989279a49765d7d8975048105..ba49113c34a55951d3692aa5fef2693e36b7f142 100644 GIT binary patch delta 20 acmeB_>6GFA%*)Hg00cYuBQ|pX;{^aUCIwRf delta 20 acmeB_>6GFA%*)Hg00c{Rhi&Bk#|r>Bm<8zo diff --git a/osinaweb/billing/add/__pycache__/urls.cpython-313.pyc b/osinaweb/billing/add/__pycache__/urls.cpython-313.pyc index df930d9ab4e772954936129d5e7cbe7e244251e9..f77a2157c791a02dc94b6d9f42da8e63cca38d3b 100644 GIT binary patch delta 20 acmX@kb)1X)GcPX}0}$-skJ!jKpy~1(guY9 diff --git a/osinaweb/billing/delete/__pycache__/urls.cpython-313.pyc b/osinaweb/billing/delete/__pycache__/urls.cpython-313.pyc index c5f7bc28820071c96b933814e44f1e0103333c79..67eeecde88f68d645f3539d54cf2d840c636bc38 100644 GIT binary patch delta 20 acmdnSvW)28!vvoI delta 20 acmdnSvWjR^olZ3X54 diff --git a/osinaweb/billing/edit/__pycache__/views.cpython-313.pyc b/osinaweb/billing/edit/__pycache__/views.cpython-313.pyc index ef86aaec81ce2bafb265bd34fdafddba433a5db2..6c1ea01f1ef91b0945646d217d9bdf87dc76b283 100644 GIT binary patch delta 20 acmZ22v|5P!GcPX}0}$-skJ!kqzzG013Iw45 delta 20 acmZ22v|5P!GcPX}0}w3P9k!8MffE2ad<8cE diff --git a/osinaweb/billing/migrations/__pycache__/0001_initial.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0001_initial.cpython-313.pyc index 5537cf1e793f7720e327d1d83c194b44a9416efe..c1ccefbd0ded2b4028d779bad22519874b442d0c 100644 GIT binary patch delta 20 acmbO#I8~7QGcPX}0}$-skJ!lF#Q^{`bp+f1 delta 20 acmbO#I8~7QGcPX}0}w3P9k!9Xivs{R=LK>A diff --git a/osinaweb/billing/migrations/__pycache__/0002_service_active_service_cancelled_at_and_more.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0002_service_active_service_cancelled_at_and_more.cpython-313.pyc index 83f180bf3c66b2677f4d6d40d86f41ff01b64a58..7de67eb7a6d828ea8029a8fa47ce073bc1571ba4 100644 GIT binary patch delta 20 acmdnYxtWvuGcPX}0}$-skJ!k)f&~CL0Ra|O5n diff --git a/osinaweb/billing/migrations/__pycache__/0003_payment_servicepayment.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0003_payment_servicepayment.cpython-313.pyc index 158b80231465181801bdd6db12f640823f3e489d..cf35373461b5a61448ff9fdc67a87aee42213e15 100644 GIT binary patch delta 20 acmZ3?x0sLnGcPX}0}$-skJ!j9!43d5I0SzH delta 20 acmZ3?x0sLnGcPX}0}w3P9k!8Mf*k-jss$AQ diff --git a/osinaweb/billing/migrations/__pycache__/0004_rename_payment_paymenttype.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0004_rename_payment_paymenttype.cpython-313.pyc index 3011f2e55e68fe69f6dbb950523ceac52e67566f..18828cd0e01936a5b77244061dc4a2e601c3c409 100644 GIT binary patch delta 20 acmcc1dY6^^GcPX}0}$-skJ!k4i3tEb{{@x+ delta 20 acmcc1dY6^^GcPX}0}w3P9k!AC5)%MHaRw{^ diff --git a/osinaweb/billing/migrations/__pycache__/0005_service_recurring_cycle.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0005_service_recurring_cycle.cpython-313.pyc index f389696f1081a609fa8c3836fd26af580be6d610..f2f3c7e2d21bfc2e9ae55f5397a7494c3d5447b4 100644 GIT binary patch delta 20 acmbQkF^7ZuGcPX}0}$-skJ!j9$N~T}MFd*_ delta 20 acmbQkF^7ZuGcPX}0}w3P9k!8MkOcrXw*>J3 diff --git a/osinaweb/billing/migrations/__pycache__/0006_alter_service_cancelled_at_alter_service_created_at_and_more.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0006_alter_service_cancelled_at_alter_service_created_at_and_more.cpython-313.pyc index f222827398f22ca30a42ec6485d330c51e25897e..2a868ba796b825c8b44de20d182720460fe36725 100644 GIT binary patch delta 20 acmX@fagu}kGcPX}0}$-skJ!j<#{vL4O$6cq delta 20 acmX@fagu}kGcPX}0}w3P9k!9%js*ZczXf;z diff --git a/osinaweb/billing/migrations/__pycache__/0007_alter_service_recurring_cycle.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0007_alter_service_recurring_cycle.cpython-313.pyc index a4931d3c34b3cecef6dc07ec252846c86c235cd7..48c19da6577b27c3b6f8929307209bd057e38af2 100644 GIT binary patch delta 20 acmcb~ag&4lGcPX}0}$-skJ!lV#{vL6%>@zw delta 20 acmcb~ag&4lGcPX}0}w3P9k!9%j|BigKLw}& diff --git a/osinaweb/billing/migrations/__pycache__/0008_alter_service_type.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0008_alter_service_type.cpython-313.pyc index 2dec751fab922a8b8ed0f5195b2c17e5e924591f..4c41a62b2822f28b712d22964f3056fa84b9f984 100644 GIT binary patch delta 20 acmcb>ae;&TGcPX}0}$-skJ!lV$^rm8Wd!#C delta 20 acmcb>ae;&TGcPX}0}w3P9k!9%l?4Dk*9DCL diff --git a/osinaweb/billing/migrations/__pycache__/0009_remove_service_due_at_remove_servicepayment_service_and_more.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0009_remove_service_due_at_remove_servicepayment_service_and_more.cpython-313.pyc index e23e45ffa4afedb1ed681ed72de1f477d849d9a6..bdffa91358ca16b9b5f0f0becefd2e4686fe9f23 100644 GIT binary patch delta 20 acmeC<>*M48%*)Hg00cYuBQ|m~vjYGz@B}~r delta 20 acmeC<>*M48%*)Hg00c{Rhi&9$W(NQ@Vg%Lz diff --git a/osinaweb/billing/migrations/__pycache__/0010_charge_amount.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0010_charge_amount.cpython-313.pyc index 69a10c99e59694e2cf651e40d6d3d37cbf8726b0..4dd33f8b2f1dead86079dd9d88e0dba930377abf 100644 GIT binary patch delta 20 acmeyx_KS`CGcPX}0}$-skJ!ka&kO)TtOalY delta 20 acmeyx_KS`CGcPX}0}w3P9k!7>pBVr}9tH*g diff --git a/osinaweb/billing/migrations/__pycache__/0011_invoice.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0011_invoice.cpython-313.pyc index 7153eea2285212ac9d3f6550209ca234adbc70f1..848708fb3719e8d35c2d6d29da95731829a6db68 100644 GIT binary patch delta 20 acmbQjHHC}&GcPX}0}$-skJ!k~$qE26P6S8* delta 20 acmbQjHHC}&GcPX}0}w3P9k!91lNA6pzy#g^ diff --git a/osinaweb/billing/migrations/__pycache__/0012_remove_servicepayment_charge_receipt_and_more.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0012_remove_servicepayment_charge_receipt_and_more.cpython-313.pyc index 8333611b35ef592215b11b422a1c96d15412373e..313ea81c1c7afad9147be18dc9e1047e0c6ca751 100644 GIT binary patch delta 20 acmZ3^y_}o-GcPX}0}$-skJ!jPhZO)eY6SxT delta 20 acmZ3^y_}o-GcPX}0}w3P9k!8s4l4jT+y$8c diff --git a/osinaweb/billing/migrations/__pycache__/0013_alter_invoice_date_created.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0013_alter_invoice_date_created.cpython-313.pyc index 2b3d4fcc9028bbc07f2a7c5aee26726ebed8518d..1c518f75dc72ed0bff0ce14df0c55eda5f09dc32 100644 GIT binary patch delta 20 acmX@kcASm-GcPX}0}$-skJ!jov delta 20 acmX@ic9@O(GcPX}0}w3P9k!9%f*Aljh6P~& diff --git a/osinaweb/billing/migrations/__pycache__/0015_order.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0015_order.cpython-313.pyc index 739de1ec3397c775d1e7ff50dce514e65ba8ae4f..c0cbebf25d7fe1de1b5746e0bdf2fc7b305c1f2b 100644 GIT binary patch delta 20 acmZqVY2@Ml%*)Hg00cYuBQ|n>V+8;)o&^&C delta 20 acmZqVY2@Ml%*)Hg00c{Rhi&Bk#tHy65Cy3K diff --git a/osinaweb/billing/migrations/__pycache__/0016_alter_order_status.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0016_alter_order_status.cpython-313.pyc index a0a4c58a69297882f9f5ebdc090b476a55e6c022..65e6660bab631560f5ab00d65b3cb96a780f390d 100644 GIT binary patch delta 20 acmbQvKAoNWGcPX}0}$-skJ!lF!wdj3SOm!c delta 20 acmbQvKAoNWGcPX}0}w3P9k!9XhZz7i$^~Bl diff --git a/osinaweb/billing/migrations/__pycache__/0017_service_order.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0017_service_order.cpython-313.pyc index 98041bd4ad2dbce2899a4b8c6fe1e4c6949fe21c..d9960933d84daf77670e5ec793ab137fcf03b9ad 100644 GIT binary patch delta 20 acmZqTXyV}h%*)Hg00cYuBQ|n>X9fTb%tF$9bN delta 20 acmZqVY~g%top_yz9( diff --git a/osinaweb/billing/migrations/__pycache__/0024_remove_item_active.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0024_remove_item_active.cpython-313.pyc index 3ad4f393d9685133e5bd1cd481311edcfd49285f..2a2cbcdc82aff52db9ec598749c6f3d4793ff196 100644 GIT binary patch delta 20 acmcc4dYzT~GcPX}0}$-skJ!k4h6w;Y4+Vq( delta 20 acmcc4dYzT~GcPX}0}w3P9k!AC3=;rAfd(1? diff --git a/osinaweb/billing/migrations/__pycache__/0025_remove_item_project_item_customer.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0025_remove_item_project_item_customer.cpython-313.pyc index 28febf1f5109f00f17c4919808ada6dd6c6ba8a7..7c867900d1e3de9539445b06bc2803069c1b48ee 100644 GIT binary patch delta 20 acmdnWxs{XqGcPX}0}$-skJ!k)iUj~TQ3WUf delta 20 acmdnWxs{XqGcPX}0}w3P9k!8s6$=16!v($o diff --git a/osinaweb/billing/migrations/__pycache__/0026_rename_type_item_item_type_remove_order_paid.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0026_rename_type_item_item_type_remove_order_paid.cpython-313.pyc index 5330299463fbd09f694d98ab0cbba85123c9b2e2..428d03cc21441cf5b0838de2a9d1bf692dfedc46 100644 GIT binary patch delta 20 acmaFK_L7bJGcPX}0}$-skJ!i^#|!{J1O+_+ delta 20 acmaFK_L7bJGcPX}0}w3P9k!7>ju`+#b_LS_ diff --git a/osinaweb/billing/migrations/__pycache__/0027_item_type.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0027_item_type.cpython-313.pyc index ed9eef90e7b38bbe37bf2c63c37df62a2cd5a724..e43784735aeff6243b3aa40ec104769d0d96ff0f 100644 GIT binary patch delta 20 acmZo*Z(!&C%*)Hg00cYuBQ|oEG6MiFzyyQ< delta 20 acmZo*Z(!&C%*)Hg00c{Rhi&98Wd;Bas~1L diff --git a/osinaweb/billing/migrations/__pycache__/0041_orderitem_active.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0041_orderitem_active.cpython-313.pyc index ebf82cfabbaef0a880ea761e5c180a53932df740..a5ceb0e3264f7924b4d1f71b124b9ac0ea79923e 100644 GIT binary patch delta 20 acmX@jcAAa*GcPX}0}$-skJ!lVzzhI7R0QJy delta 20 acmX@jcAAa*GcPX}0}w3P9k!9%ff)cj#szr* diff --git a/osinaweb/billing/migrations/__pycache__/0042_order_due_date.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0042_order_due_date.cpython-313.pyc index 3c80d129e8ad024bb3d670f4b7b8f21d07507c90..7da625721b42704590bd72f732327fce121cf321 100644 GIT binary patch delta 20 acmZ3g$_5_* diff --git a/osinaweb/billing/migrations/__pycache__/0046_remove_orderpayment_order_orderpayment_order.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0046_remove_orderpayment_order_orderpayment_order.cpython-313.pyc index 8f19c6d0894ac5ab0d44734d84271489f35efd1c..56e82993eb4a9b42f3159c495bf2ddfde63ad897 100644 GIT binary patch delta 20 acmeC??B?YD%*)Hg00cYuBQ|n3umAut!33%R delta 20 acmeC??B?YD%*)Hg00c{Rhi&9;U;zL%GX+2Z diff --git a/osinaweb/billing/migrations/__pycache__/0047_paymenttype_description_paymenttype_image.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0047_paymenttype_description_paymenttype_image.cpython-313.pyc index ba95358a4a4bb11bbec78164ca7ba8aba3f6c16c..c5ef20275611bdf06e7d1e14fccd533e2f37d7b1 100644 GIT binary patch delta 20 acmZqRXyD-f%*)Hg00cYuBQ|n>Wd;B+F8 delta 20 acmdnRzKfmvGcPX}0}w3P9k!8sJu?72LIubG diff --git a/osinaweb/billing/migrations/__pycache__/0051_alter_orderpayment_amount.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0051_alter_orderpayment_amount.cpython-313.pyc index c8d1a4882095ecc97e2f5fe40c533303fbb3e827..65c020cd9052d48ffb0b7759f69bb50ec6f25d44 100644 GIT binary patch delta 20 acmX@Zc7~1nGcPX}0}$-skJ!lV$P55Fd<5nI delta 20 acmX@Zc7~1nGcPX}0}w3P9k!9%kr@Cz?ge}R diff --git a/osinaweb/billing/migrations/__pycache__/0052_alter_orderstatus_status.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0052_alter_orderstatus_status.cpython-313.pyc index 99d7e24c7ffdad3cb10942a1498e3b471b5f1324..d5cac9cae1c908ed17734feff86112dc2da9a550 100644 GIT binary patch delta 20 acmX@devX~{GcPX}0}$-skJ!k4m>B>&@C9xF delta 20 acmX@devX~{GcPX}0}w3P9k!ACFf#x@Vg>{N diff --git a/osinaweb/billing/migrations/__pycache__/0053_item_photo.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/0053_item_photo.cpython-313.pyc index d5be92e19415b93ba4d45f7317089325f6e3cc60..4ab3bb735ec08f6b5d6929b06bc92930baad3895 100644 GIT binary patch delta 20 acmdnZwwsOnGcPX}0}$-skJ!jU# diff --git a/osinaweb/billing/migrations/__pycache__/__init__.cpython-313.pyc b/osinaweb/billing/migrations/__pycache__/__init__.cpython-313.pyc index 439a11430e2c7a71eee9082c761facb75a892be2..1d613178dd3116cfa9a84a6483d073389adac00e 100644 GIT binary patch delta 19 ZcmdnbxSx^xGcPX}0}$-skC@241pqTE1rh)N delta 19 ZcmdnbxSx^xGcPX}0}w3P9X64B3jj6;1*iZ3 diff --git a/osinaweb/customercore/__pycache__/__init__.cpython-313.pyc b/osinaweb/customercore/__pycache__/__init__.cpython-313.pyc index 7123fa3eedba8d50469c8357d29dc8ae4edc4236..0e3014bb85302e00f7c7db208dd58ab78ce31179 100644 GIT binary patch delta 19 ZcmdnVxRa6lGcPX}0}$-skC@244gfMu1poj5 delta 19 ZcmdnVxRa6lGcPX}0}w3P9X64B9RM{c1(pB+ diff --git a/osinaweb/customercore/__pycache__/admin.cpython-313.pyc b/osinaweb/customercore/__pycache__/admin.cpython-313.pyc index 1431d24fb7574746852e49f65560c244a12064c4..3cec3840ec85fdd133f2eabbce4673fa41a3c683 100644 GIT binary patch delta 19 ZcmaFL_>__RGcPX}0}$-skC@1P3jjE&1%v__RGcPX}0}w3P9X65s763bi1{weW diff --git a/osinaweb/customercore/__pycache__/apps.cpython-313.pyc b/osinaweb/customercore/__pycache__/apps.cpython-313.pyc index 357eeadf32363ee9c4a634a30652a5ff576aa34d..b811945989200baa59038d28369a24814fe3ff29 100644 GIT binary patch delta 20 acmdnUvXO=RGcPX}0}$-skJ!kq#smO0`vi~x delta 20 acmdnUvXO=RGcPX}0}w3P9k!8MjR^obZ3QL( diff --git a/osinaweb/customercore/__pycache__/decorators.cpython-313.pyc b/osinaweb/customercore/__pycache__/decorators.cpython-313.pyc index d2cd780ede3c39ba8bbd74d312e478b22690148f..d53ca4961ae5484e7fe449c9c858b3a02cbd5651 100644 GIT binary patch delta 20 acmdnNwS$ZMGcPX}0}$-skJ!kq%L)KD?gX>| delta 20 acmdnNwS$ZMGcPX}0}w3P9k!8MmlXgzU$UBjRQEBpg7BN=6g2eRH$$MF11oT!^t;pG-xWjpe P=>f(ITuz%cS!;{{PM#E1 delta 63 zcmZ3KzciosGcPX}0}w3P9hT9xk#`~sqw3`OEMgo5iRr0&$@#gHcd^6>7;ezoAhRQI TNAZr-1BMs4TsNz+)))Z*s7Mw` diff --git a/osinaweb/customercore/add/__pycache__/urls.cpython-313.pyc b/osinaweb/customercore/add/__pycache__/urls.cpython-313.pyc index 8860f9de644cb3a987986ee2b1e79b88094620e3..515b5f2f694ac48798ddc099b910faf90b41168c 100644 GIT binary patch delta 20 acmZ3)yoj0mGcPX}0}$-skJ!jPoe=;uegxnE delta 20 acmZ3)yoj0mGcPX}0}w3P9k!8sIwJr#@C9}N diff --git a/osinaweb/customercore/add/__pycache__/views.cpython-313.pyc b/osinaweb/customercore/add/__pycache__/views.cpython-313.pyc index ae0e457f92fae3079da3c522456f5e7a9b5dfd7d..e5b561af1e8255c5a7c057f654dc398b474b7da8 100644 GIT binary patch delta 20 acmdlczfGR|GcPX}0}$-skJ!k)njZi=oCRV4 delta 20 acmdlczfGR|GcPX}0}w3P9k!8sH9r794h8rC diff --git a/osinaweb/customercore/migrations/__pycache__/0001_initial.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0001_initial.cpython-313.pyc index 4b3d7d5c8722cf6b15050cdc54d0822b0ab8b119..1f2c205ed122850121869fbdd1044308a683159d 100644 GIT binary patch delta 20 acmbQJFj0Z~GcPX}0}$-skJ!k~CIA35`2=lm!4mR|UNQ diff --git a/osinaweb/customercore/migrations/__pycache__/0003_ticket_customer_ticket_status_and_more.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0003_ticket_customer_ticket_status_and_more.cpython-313.pyc index 1e3ade0f4c4550279a927376c9d8113e62d22b71..5ca3b150cca84f011be153e157b8f6c55a9859de 100644 GIT binary patch delta 20 acmbQpGm(e;GcPX}0}$-skJ!k~#s&Z~9|S}I delta 20 acmbQpGm(e;GcPX}0}w3P9k!91jST=bkp$WR diff --git a/osinaweb/customercore/migrations/__pycache__/0004_ticket_ticket_number_and_more.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0004_ticket_ticket_number_and_more.cpython-313.pyc index ba9d478954010716a31b2975cf7a19594c27fca3..6bd4d428a10787792b49841f1646f4dfb3cb674a 100644 GIT binary patch delta 20 acmZqRYT)Aj%*)Hg00cYuBQ|n>WdQ&&Ed>hz delta 20 acmZqRYT)Aj%*)Hg00c{Rhi&Bk$^rm1p9P@+ diff --git a/osinaweb/customercore/migrations/__pycache__/0005_ticketstatusupdate.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0005_ticketstatusupdate.cpython-313.pyc index 952a996d42a3af89eb9d383e0d8ba24aa84c070e..c630fe978efdd5a8461073ef851fc87cdcf36840 100644 GIT binary patch delta 20 acmX@kcbt#=GcPX}0}$-skJ!jto~o%*)Hg00cYuBQ|m~GXnrH%mgd| delta 20 acmeBU>to~o%*)Hg00c{Rhi&9$W(EK>J_N!5 diff --git a/osinaweb/customercore/migrations/__pycache__/0011_ticketupdatereaction_customer.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0011_ticketupdatereaction_customer.cpython-313.pyc index e96589af19bf25aa9fda932e049807bd7d7fffbe..14f9aa6450160b55adb8ccd69f0d87e1b6770de9 100644 GIT binary patch delta 20 acmaFH`HYkMGcPX}0}$-skJ!k4n*{(r`31WG delta 20 acmaFH`HYkMGcPX}0}w3P9k!ACHVXhlYX(sO diff --git a/osinaweb/customercore/migrations/__pycache__/0012_ticket_ticket_members.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0012_ticket_ticket_members.cpython-313.pyc index 214d2116fc57b62724b206163c1794d29ded574a..b7cb67f902c11313206e93d7a5dd07e978030bd6 100644 GIT binary patch delta 20 acmZ3>v6h4TGcPX}0}$-skJ!kq!~y^{?F5bh delta 20 acmZ3>v6h4TGcPX}0}w3P9k!8Mi3I>TUj-xp diff --git a/osinaweb/customercore/migrations/__pycache__/0013_alter_ticket_ticket_members.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0013_alter_ticket_ticket_members.cpython-313.pyc index fa82a4ad74e71ae05a2279545b4ff36c9a28cced..86f6b8979229db0ddc532b1d4b24f8a1ccfa2799 100644 GIT binary patch delta 20 acmZ3(zJ{IqGcPX}0}$-skJ!k)kQo3rpalp3 delta 20 acmZ3(zJ{IqGcPX}0}w3P9k!8sAu|9v5(S;z~4 delta 20 acmZ3)wup`UGcPX}0}w3P9k!8MoEZQ&UIhLC diff --git a/osinaweb/customercore/migrations/__pycache__/0016_rename_ticketstatusupdate_ticketstatus.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0016_rename_ticketstatusupdate_ticketstatus.cpython-313.pyc index dfcde2cd54fbdbc3554c4feed20d3b00e042769e..139e1ea2ad38b32145f5541259c747b5e8626d47 100644 GIT binary patch delta 20 acmdnMzJZt@w8U&pH delta 20 acmZqWZsq3w%*)Hg00c{Rhi&ApVg&#+j0H0Q diff --git a/osinaweb/customercore/migrations/__pycache__/0018_alter_ticketattachment_file.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0018_alter_ticketattachment_file.cpython-313.pyc index 402929c69bcd0a4eb859788593b292773ab42bcb..9e3c06ff00ad7f57633d4ea89c473b93d204257f 100644 GIT binary patch delta 20 acmX@dc8-nvGcPX}0}$-skJ!lV%nSfJ%mnNJ delta 20 acmX@dc8-nvGcPX}0}w3P9k!9%nHc~+J_UjR diff --git a/osinaweb/customercore/migrations/__pycache__/0019_file.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0019_file.cpython-313.pyc index afae7c01a431a72f5bd571a65151d0be3ccff8c4..f0256c79454af28294233abae3d28c5c567e1034 100644 GIT binary patch delta 20 acmaFD@q~l>GcPX}0}$-skJ!i^$pQdAg#|MJ delta 20 acmaFD@q~l>GcPX}0}w3P9k!7>k_7-k_XWuS diff --git a/osinaweb/customercore/migrations/__pycache__/0020_alter_ticketattachment_file.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0020_alter_ticketattachment_file.cpython-313.pyc index 15c96ed3afbe94bac52d03a28aa824d68050f889..5d59a0afde11b6ebdb0bafc0430d51b66788d788 100644 GIT binary patch delta 20 acmX@dc8-nvGcPX}0}$-skJ!lV%nSfJ%mnNJ delta 20 acmX@dc8-nvGcPX}0}w3P9k!9%nHc~+J_UjR diff --git a/osinaweb/customercore/migrations/__pycache__/0021_file_ticket.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0021_file_ticket.cpython-313.pyc index 89a88383c99972bc6e11b128a8331bfd4dd9fbb8..3130e197284dddeee5f0518fcba0968dbe61a109 100644 GIT binary patch delta 20 acmbQoF^_}$GcPX}0}$-skJ!j9%mM&2l>}h` delta 20 acmbQoF^_}$GcPX}0}w3P9k!8Mm<0eg2L$&3 diff --git a/osinaweb/customercore/migrations/__pycache__/0022_remove_file_ticket.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0022_remove_file_ticket.cpython-313.pyc index 56189b73054dd461cae30b391671b2e582de11c4..a74dfa12a934c19426464d59455994f4f07ef421 100644 GIT binary patch delta 20 acmX@bdWx0%GcPX}0}$-skJ!k)p9ugv2L)XK delta 20 acmX@bdWx0%GcPX}0}w3P9k!8sKNA2xc?I(T diff --git a/osinaweb/customercore/migrations/__pycache__/0023_delete_file_remove_ticketattachment_file_and_more.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0023_delete_file_remove_ticketattachment_file_and_more.cpython-313.pyc index a1d398acf20fd97eda1e2cc82e2faefa703bf504..3f3225a3df9a6999734866da90453628495952af 100644 GIT binary patch delta 20 acmeC<=;Pr2%*)Hg00cYuBQ|m~vj6}w6$CK= delta 20 acmeC<=;Pr2%*)Hg00c{Rhi&9$W&r>+hXls} diff --git a/osinaweb/customercore/migrations/__pycache__/0024_remove_ticketattachment_ticket_and_more.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/0024_remove_ticketattachment_ticket_and_more.cpython-313.pyc index 3961b78a28276719b47c07d06fc7a78c39791b4e..4e12ed9cdbdc9fcab65564201fa3f5eb7643a3a5 100644 GIT binary patch delta 20 acmdnMzk#3oGcPX}0}$-skJ!k)lpO##WCbVy delta 20 acmdnMzk#3oGcPX}0}w3P9k!8sDLVi=)&;%* diff --git a/osinaweb/customercore/migrations/__pycache__/__init__.cpython-313.pyc b/osinaweb/customercore/migrations/__pycache__/__init__.cpython-313.pyc index e0b77b5e4126f21e2b38012b00a9138aed33fce8..285758dff365a3f8baa164e5125d6884029fb4d7 100644 GIT binary patch delta 19 ZcmX@Yc!ZJrGcPX}0}$-skC@24696;h1t9g`kf_Hq+})L vrRPHg%Ttp;jO2{O68-r2%)HE!_;|g7%3B;Zx%nxjIjMFatBaX{1PcQIsr)i% diff --git a/osinaweb/osichat/__pycache__/__init__.cpython-311.pyc b/osinaweb/osichat/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 157a8d07cdb3e9e51df06e9d7457329d0b874904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmZ3^%ge<81f|i7(?IlN5CH>>P{wCAAY(d13PUi1CZpd?1OlWax zQE`l4Vo737jDKFLOHpQ7YK%*2adt_5K}>#eW?o`UUTQg*k&=~|m!1z1EKf}WF_JS9 yOJd^VGxIV_;^XxSDt~d<x%XxuKXJNPJ*sWMurn03(W+fnoqx&oUeU diff --git a/osinaweb/osichat/__pycache__/__init__.cpython-312.pyc b/osinaweb/osichat/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 11e7539ff48a34d8c1e7a0517c6a72b11a500534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmX@j%ge<81dU&grGezmoLW?@pI@9= zlANEb?~TZlX-=wL5i8IlMj$Q*F+MUgGBOr116cqexH6ys diff --git a/osinaweb/osichat/__pycache__/__init__.cpython-313.pyc b/osinaweb/osichat/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 923951ec8a6e8e66a4e956c36daa5270dc1e2665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmey&%ge<81WR^@Wq|0%AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkqYU{m|mnqGJ8x z#GK6B)SR5m%2a)q{N&Qy)Vz{n{qX#vZ2kP=%)CVXywq|qBPA;_FFhY3Se}{$VkBoI umgvXFXXa&=#K-FuRNmsS$<0qG%}KQ@Vg=d(azinQ@sXL4k+Fyw$N~Vl&M+bX diff --git a/osinaweb/osichat/__pycache__/admin.cpython-310.pyc b/osinaweb/osichat/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index 6bd5fecb67615f900f386fda6b7ad83f69bb49b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmZvY%}xR_6op%UM;Lz8ure`jalyQRF&a$V02)viEKJJGWhhQtGA$Aw!gtW6dmqAQ z=++gl;KJB4m~>&A-hAhzGxzq0TCIZ2`h5AB9_0}Fvcg??BQDI5AErbo!Uy7oucOOQ%etn34um_Jo5-=<=2KFUNNq$DxuR(5MEE|ntT zi~(2r(6NU=vQ`bp90Blb7TbFW&lFa=X)g?fqEi|YJKZ}34DU-Mo1VKKLYrh&&?%{3X8>EAYkJL}x^%*}JVqrC#@zk_ zdO2b~hC-J`AW>I2P68p3>y@X0aTwRt?PFISG8XB2R_)GENL{mXh|$<|uiE+%XH)cK zDuyV8J3+mkb}hsMDP8Y4LMnA5XCI>L$$(LPD`y@d(vNUu$GIMD-*uh{{h4!ES6P0A%A493Xncmo*=`K21X>DO^PIaELpy=Cf_B~=#?VcmtDu{A z_haZJ&{5FIyANa7NES=@r>mO%7zPOp6by3Bs(B}dUIIM@y_|h^5W{8yn<`7*G*kZq D+nMNz diff --git a/osinaweb/osichat/__pycache__/admin.cpython-312.pyc b/osinaweb/osichat/__pycache__/admin.cpython-312.pyc deleted file mode 100644 index 7f16a1229a5fd101ff5272957a31060d4e24f5c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmbV~&ubGw6vy8rO`2{^T1kosibX3m1-t)15u`#zO_WGIc$@6LrWq!osocV9tM0MJH{hL@hc|mz=1w6IF4dmYk^N88w)z7f#G_)rl(5Fp1I=vu)aujb{C_s)SvdcGzaX zQjtaN%q+JmCM?95t2rJCRHY0%5f_-L`4^E+Sf;#*c)~iWw7pM7i?KwNr)sB%Tqw`j z1}1GyE*kwTV_giy*ffxH+CjB4t{R#9LeOA8!BnW~xwwTi5D`n&(z)8~CF+ZoV3vmA3SxdNJP1uIesku>6;P{LT|XzQgJ_Sor~k*WRJ`1*)H* zdbA_q+E*)iB;kggJd|+VP8t$!+Q~)gv4mB-=0Y;8)g^3LMZ?;k|si+~LvPD_CIL^blV&9=Vho~bH zYZv|l7XAkQi69wKoj^ij>V}ksk-NB2YGvYXu)pu?_j&L9bT_G1ZBXmemxICe0>Ez_ z%vSMSOitC8kKlo4wPDZVRujB}S8Nv^7MgHqx#bx!f4eJlJyVCJ2Ue#4iz*vY%SKei zh*~kCY$Iybh`MA%RgI{c5w&JSts7C7=Tx}VDxK*=*|KEG@5h9m=`*S#YpdJ3B5VC4 zpN4EZU^L;R$Muzv<(Ty`5^_n91Z9O|NJN5ME*}u(FfQ$L@tlRSwlnaP9Y!ez31L)L zbnG$~%j!(+4pAi1)?o+Zo~pE}^*(1u3d({G3gL$+H?pj0@FYq6U=SlsWc`BeqMx-| zyI^{VG~0{r?czIvBe|{Y_4EG#3`qQS diff --git a/osinaweb/osichat/__pycache__/apps.cpython-310.pyc b/osinaweb/osichat/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index dcfb36a768aa2c72e48fb4fcf48835aa379b76e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmYjNy-ve05VqqKLVp(26{%~Mcw$4S1q2H!L&XvaS#Ir=fD@ZIQ3WeJ0dK)eu<{OG znRo>z&PgSDlF#?^`SW+DN25Lh`#k>2-r@fC$*zTvOySrGIDrIKsK6=4=n9EIkT)cV z#IGa`M7Th4?*~vQ#_nKd%(*VJe7*9OUBi$};n*=aiBc>Oyv8XJK^h7IETJ3S*nD-* z>yF~(NIdXztrM|K3N56v$yvUhHMPFXr4nvmcj$TCa}i@DFC=5G&lrFk<>Mh^PYqYw z&Y_SQZ&b}VP_V4!2z~DZRel?-`@N&LR#ukEB3Du>l|M^*A?;(W4P9`R7n5sld;(hQ zl`bf#C^;?VrVTpDU2!9qKJXJ!Zj4RLb4B1Izg)WqEPuu$3JN zg!nTZtE^0HMP=%Qouo(z&i478@A>(BFREGsZt?k(^~m>k5zMWSgQ?EJ5GYXOKo1!R zfdq#@rF)<-w?D}0DhL&?&f@7F!ovb&v}k!~mtrd1Axz`#Hh_+4bk zR5BDQa}6a?TcO>#AWSrD2{5)sF2xvUY` zH_U9X@GA0rlRxMZ(`Ee>WYuMdebyF06mJsW4|V@G5dBP@!a-Q$Ztye4wXKm-9hcVz z4KV_B&TVRPQqKP^gaXm&OsXPKN?hh>R@}+{xf`tTP&7C^=58V*gvPKr`aLHL5?Y_Y QU-xkIDNeusNu`f{160eBjQ{`u diff --git a/osinaweb/osichat/__pycache__/apps.cpython-312.pyc b/osinaweb/osichat/__pycache__/apps.cpython-312.pyc deleted file mode 100644 index e6929573bb11ed9ba3fb0cb8a9452dce9f71491f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmXv~u};G<5VeyOO4}fW3K9bY3sMG>l>s3YDiBLqV98>+u~UMQIK+vnuvO{@AeMdu z;y+ke7^_H3Ol(LkODF6&c({Ad@7?L{-c7Rw#G5SN{AZEBB>8`h8Y~V4m;nL^3_%24 z2!RGJ0nw&_=oG%{%I9i@VKu%bv0%B;OOkUI`@zUlvWl=Ki>?4OK!FPha5Vy5ooKF6 z=$28M*F5mQx4Lm|IZe4E`eq)BoIdmNh{hRr1~|iE zA%z$psi~Zpjw@c%3Xkbfn&b`+P7-b>MJkV31w#OCiZBK9z2gsKci!$!`l^ns<9 y?RsTdoXYd6@{UB6aZ{jG^F*z9nr;ayFU#dse{=}pCpcKHX>jN1>KBMqRs8`q8iQH@ diff --git a/osinaweb/osichat/__pycache__/apps.cpython-313.pyc b/osinaweb/osichat/__pycache__/apps.cpython-313.pyc deleted file mode 100644 index 606f7a8ef1dc510c85d407d731a1b8bf314c4e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmXw0O=}x55S4b1-nIuf9?6a_CzORr~q#A>N2vsEqU z%0@2PY*DH-(_%=O)*uG8=895i*}i6OEOVNERvc8Sm=t3!rMTp2w;a}EUTBqmE#Z4= z`zu&l@QXR{!}!k&K5)PdoU*D?Np%VC0(0YLR~>6^(CyCt-)Q@`y?Nb*)hE6eho-$) vjT3{riI=izKR*3O*3DIq9>kM{ diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc deleted file mode 100644 index b0553d597eb101a811e3d65d2dbe1d2e43a33a7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21386 zcmd6Pdz2g3c^@zs3r zw~i%J>hJg6c>q`}<+T4~_spF;b02f(-tT_j?|TgT#bP0azZZW$bMBj0Q>kz8V)W0% z#X~r}Uq|Am+;k_^P1n-tlxw(|j`0-lnVn26gLAfHcC)oC%2KY?vAVfhPV%{q-ObnX zlD9jB?o4e)^7)R_E!K*XFLX-Xa;@C0)GFQC+H7~OHrJi6%}d!#XQ8`TTa>)nS*k6) zKjk`Z@uieoY^E<~YRkATxn*3J<$52kEAA|=XXSc7uIJo&T+hq(ifcZZsxG{OH%e90 z!R#~5GhTn=xu$=*-}AP*P4!Azm!$7rM|njxdu~(J{eIo^RjYRn_lgbgQg1_U;ml6X zHT`=3OuM;(ld9i$?|rP*?YqqmYq_lrpS2!sH+tv#A9(VK_4oBQP^hZez&zdXnt}Pu z`DQOjKNe&jZ@dr`A8q)}r&`_SW36V#MavmqHF{oS!*BI_8yxuPpMi^qaCpa%G*h*- zo2nUZ+BIHEVPP_^iL>cuT?^-|o5Rc7LFoyvFaLm&+C4@s--OS5EM7gH+ntH zMyGM9se=4D)!*8zH(WPxqLN;t+YGG6#zu3~4{~7#*VBRNH9Kdor__G*^Xi$CKj<}; zce2@Sb(+mir*)}$^3kUEoZsI(`DCNh>aKmLvB`_@{Z3*)y~fF2^P*&2Spa?WV)G0$ zc)WjdBV2m##O9?ShpQe|vcmW0{wSoawE2deDWnHWVZY(Lod~OLa1EkA=HvOh4;PrT zlq&h@9pf7FnYzhzC(HTsE#z};JDl4*=a#dnX3?-(P)j%kwhMajK@UNu*S{FdY-}k| zrC;y#&jtBT^Q>QI1ls+awdWwQ(oVX7e=BXjG1xyb2TA?0X~?2o9*2<8*O2j3JLzHiT6)_U8ap6R z6%y4JJz+7x^wal2rk!KmAm%Pl$P0RX*pZrITxPo z@SMMvb_-W9)%Bd8NB=e_U0Te9HJtEVyq5M0J2Th7Q?6uD-{E5LsFv4*Li2e}yMJl3 zS#v@Pt#5)S1O>0@dDxuwmU}&|xM_m?MyJKvt<72~%x?6zdcL|;D~8vqc@Av?=ZxxK z1X87fRC#k#nI9oN(HbE9D$oeh615(*iooZGH zNS$D{lT7Yq-GYo=h^AT$%(jO?WIO$a>jfEbvLF|dcaYOO%?qrvt&Wer%}xVcP>9mn zP)$-@A*}qN{yDYEM;v5w2nn7p#FqD)F9?Y?f>NBV^Qr1~*5zwz0u)jdD$J?oMzi&N zll^%2AR+nLIOftzY0EH>kN;n_@@9AiLVeBr=B{lTcD7!%0=q7=TdxO&dL0~ktJ6f@ zsn;)TH9A~?dR-mhfXGeNdzd5}Bp#n4b138RY$SFHW63!=xx0ZIV}CJ!{tLMM=KR^U z!KW=Z?-p>*xihYVv+Wk$63%(I>{f6txU=pY&NJ@3yMVLfE`mgtf*kfHIocRQ=Kv_l zWhV}h0rf+c?4DtJeg{ z={KlWf-LyZW>XiJPUEdkYqo?vquznW>YYsPM*@D96g|otPQsO%u3BTocQK(f67Hzx znIlhBi%2jGq1E~33oXybmIiMWDZqy%1VGvp@;HTz#}-a{A#IW|;vacK3kxSRD2Gci zRYp)g#7pu4T#z|ZI@G}!F>wba)9947usaM#) zdLNQ%DcO{e71+IXui5OW?`MS{V6uiJ$ouE9n_aT9EP;m#mN(8fH=YA@iG%^*Ps88x zuqu8-`6Cl~n7wc!s~MR?b(B3ilvjXF((mL9a&LVQhsSNC_jL*L7YdlUXy%fK@1keE z;A!^oAQE5T38&3XgN6Z2NW<-{I*5BBU_r^8z?@KUPE&Bq*)!{kT|EYI`+l59Xp1B& z1g59zL%fukBaO+-g><9uPSD8{sPuz4M1(GYM);HcH_k_lH! z)tGz)$#pHi)Vq-nOhBxLewnPmfJvIBs33<=q?O^MO~ZVnlmU1$Y=iki#?FkMOBwS< z!YM*AHMaUQ=#n5*i2ct2n`>hCLF$*&zUgOO!v~uN7cj3dm&M)OWvF0RGH&jQ(Y9UN z&0|wQo@nUxXzJNKf!B`k55S&G-MMhsof#T>4ckT6!K!}YTxvTzG*J74+m>Gf{^ ze01K<5A*E>9E&)Xa4h54hhsmE6&wfL*{e4Cm_zT`oz)>gT{?B)er)H1{-O45?))(8 zE?hPIHFxof;VxZ4De2EY>@EXF?z>`a^G#8Ahjk0?{;LMyU|g@dvK}mvq`E*@jdPIy z1k>P>J^v|)5#}}0ajzS-dEua2n{vC}@_JjHPGI^}-eyLMt{XwlZJupxb^O5TZ~2>B ze*G+UIpFUzSj-^bS5zvWYhHQ`>fItAuloJ&xveG`blC5!h2wE82sl)!vyK-y-ToP< zKTw~#tsXTb-VQ3gt?n80**{y~>XDfTj*KXLEm6Uehd>83TCPTzMr%_MVyWXCniFEo z`q@t7Twn?&g(@pg)Q`}Z@@Z7Y>kz>O^4vRvBU0=)yPF+Mr+0D_ z0;JXGcqiq3PMr6<9kig{MR*u>YVv;dNMN7FtA7};D2zF2ikhm3z7_X|;wDj4 zR8)xxaY10~$vbl?DC_yChcn>`qEJ27T7OKP#5IRH@t@LE49g*#JuVP z6M?I5VJ?}p5+|$P>XLqdyOq!4EhNxrH#cEHpc>nAh3N!YcdNVUDJn;bT2ggJ%gtwb zqs^qtWXR+q5~vc<;;TNcYkAI_Otc=>Cs=br_>h%-5{LIgNSw3*!2>N8!pD5WG|d~9 zY22`_iZG~xN%%a61J|f$8_a`Ev3~qt_!FmK19%&0^K~Ory6I$XB-h^8gAv9pT!mf=(MrZSb1HRVeQ2sr z;pryYTCNi^N6BH_`~4NLx*|$SU}mds8O*E_GqZ#4EZE#!$jnf8hjk5%%v8THG~2T} zZO`$^U~=xjwq=@%N-C0ww~2(l6N2n*cWp`0!8RZQUsjyS=80L z<~io#T>&x4zJkKpmIC(@hM|!rvr6E2R<=fv)17&mjLR^~2)WcXL&YP;dPqE zU*O}Yw+!xKUr$spC=lUO<%lfZRb#9VP_HT zZ1fB^0(NpcP)L4fX;^44qbH{OB*j+d87zVK4ycdob9*((wGT?qCCyGQd~BE>=7_C^ zCi;V^3ux$GjOCDjTYJr|0Q1a(fgC2YaOWciA||Ybbwz3Ll&T|De~}5%h}vLs772FX zd7Oed%>@KcgbYBnSV^RlY=3eNn5cxhMcPSE((wItL#zuz=VAM2nv1&hxZhcQYfA6n@|sKS{dV}nWeIzH`rV(iwmsx zD!179wky15+YaP*BAw0O8!SgkCOHlirD#)+Z7<>v3x}u|E;4>B2Qvk1tOeMAOg9HYoZ;4^3Zh}T5Mp5+a5T2Bz-X#I zhevBAn$%Uz1UXuXSR$%6c~EVh{6d?F>hy&?-|{a-GNU}wo$$JZ%pA?_MYR{ok>!7c z4;0FYA25yIhBizk*zEh+M%Mdhm>XZw;J}pOMRN|fSjszsMj_&ol@&ae#+qkG*6q84 zqtUwEqQ9{<vt1yBZCLJxnNab|yB5~B zhxNrhu&f7wo(iJo<)E_7fa&DGbgZ_6oGrN`azIc}4{5WvU}J|$7_+>}b^+}RKw&dr zYULrAEn4M)sbF;n(>g7T3^-_*#XZf)j)Hz>eW-^(H(5bK3lm6a5lF}sB;@G2JFM#f z@ldUc5fczkH65&mW&n6f>e?hgND=CI!P4|nw1esdMJ2Q%42s7`F9SQWEhy4zkZ*Y* zRl-rTr5be71tt{&=s#2&&>J2f7sZ|f-1XE)Q6VDYV$|^@?zw$0+!HlOAdlK+hf9G? z``e)3Yl=Ny%ok1dc9bPxN4>~PVY&%h6;}CkD1faVYE~y6xB3y*et^j@GLc=hCqgME zDh(VGeYbH*{VZF_?)h8H>6r;%K)>+c#Qk74y2a^{`#}cTz?MlQjG2O9#Avh3O?C=> zI6xxW%A)-O^c{e8V$;z|TY#O`hHYk)T{>2*%&bP+Z<^g`Y~OLJcnI(O*T_ur&M{4e zmUWoqVlxX&HP~%W`0ztvhrrYV0}GtA*bPQIj~w@!(Jmmzy_Qj@P!nbzK#>ggqSjmh zOWXoVVRQG3?GlVQS?E&^^r_<2j9-Qi%fRjlIj>*Q-~c*APPf=$3j<(A+F&owiPjLe zsLsRZ6)i`^q<;Y~s?|r8&02}vU;gxiJ7Hb*WN^`Rv*y}aBc*E1TO{~b2` zM@(X-J-BNxibr?H!|oEIk8u7!h)H4vwifc{`vm1=4m5F3q1s?&_vAzp<2@v1j<*7^9hwYGqYGIPW%>TfWq zG5N<#5+NwL72bOo2@O9U_qaI6%67rd*+=cS+V|L1d(OE->TIBR?9af}LpZ$qko@Ug zW$-UK652rGd3uk~1`}P&j(r*#>;v(Hxd!%3Mtj6u)2GS+^Xf7kG8r0Kc^&(>xO?n& z9*`X#2ONda%LT8o#yC}LJ;=ih1RZt@9#ZSMiwy-U$aZRD*){ z){D-ZW08<8XK=*VGSABeCW}m#nItP9lg}kQL*k(+Yyo;2H8sG+H{g?E_`=BCOm$6h z4Kg@5N8e(PN%%+jzGmcVx}IJKJ|gtcF15qV{VEd~BJs}T=tx`7VRYYODcSDUE%kM;*kx1Z+a6b25z&psAC%S0Z*0jR&r zeq1Z6I>}0FIURJKTV|?P3W~7f$-lRM9eqjL1Gt;WMJsq8bcB!9Ufz= z2<(oaE8#F$Q6P4c2m&(>myfJ3^e(Ir)`G;$^+XO4F|H}OJaSyMjJgj&Mnn!k^@1me zF&JS(gaH!>j2%Unku+&H4=z{$asV#CD#G|NqO-x3C(E{%)K?+^{~_K&%kr->mn>je zOUVa#H(9Lvd6}%NEb5z!Vb~p#RTOHFXUls2GJBj@Knkjtxqx>dW5EnX#=~VBk)@ED zi7Yk0GpJ6m%3Fz1dv7tyU9Lz#drQl&p|ru#Imn2#%-dPJf z>)zo5)xAq-%b!PRKuKz3U@AvV=>w$SE~{x%p)BYE?_2+jM zuBEVT@Md+^a@1#CmOAalFQvZB5iRv7e^|ccFC(|FyM;TWH_J&B4%d|hY4n28FR)8?$a=1Beic@7F=Nly!RSE(WEv?|8EMQ)Ia4g z{~40qKig;C6)EQV)AZ`0II}T_cMxiSiDzez+u#2k?L^;$e z*0JN-MY`DlA6Ns?2`G<6X5Z2#>pPuDvhXg<-8^@9A1FH?{ZC;DiuV-OozckKn{-QoSWJ zYQb!XHD`K*sh1{!_G=!XS$k zd1UB>uJCt~ej&^6iX+GFm$f_NzAIWS_kmkb-MgjsSN&={Dy$P{2v7N`-FLV3t~+%t zjq=aP6ObRy*6)`5d*uEXqCD=uWjL#OQ?DYu<>MW~cBCh?aUTTr&bsd%&SH-|wAW~< z@`&2=a2WfRXJobbxdrJ44)nOt_knQBISHp^v?*fu5pM#!*dYJp*5+nk`46lOoKS^W zBiw=%_bDpG%k~suk&M}I?$#>?h8o%b+iapc0VuHYYoLt<&%ui|K4&3 z2i~VtU#&?q#D}hpjx?|kxyPW|Kh~@31`2iBJ-BIvZ!B zF8JY1SQfy=I@dg~K#)EkY^x)J~)3qfav+((&@gM3hqk8m$S)sJ3k3V8Z{|gCYxk+ucQW$g) z2C}hN4r{Di=^|L2_9oFRMGMYItzchhPaTit!o1XM5&`=UDp4-(L9b^>j^5UpZVQCn ze7@DZ$PXs88JeMbexubPh0136-+ZC}!-p=8HJRv@^vj+whUz`jEJDF-yz`@`s?2V! zhTreDHb&gvf_nvTC*W81tk1EmG1+4Bub4>0hs7M>o;u7V0h8j>6o~vUP!Qzb_X5AD zqE9NjiSO5ZLF|Fa@2DjBC0Nv8T(-@_G39Dw%3os_<&g?cA|@!XBuL&XTW0SSClslUbe9O8dK6^%RranTRDu-sm^kJl)hZ$~%n%liCg2ky+ zp`(;Ymw_D-UCj}44lnru4cBfGbyHpcO>89ZhmdH)4uf|ka2MWn2B`CZrQl{ETSA^5 zd3^^e!|SWxwkq1#TFL0Mf!I2R%+RD)$}FVq7mYVyw}(Oj1p|FR)!21iFy*5HgU`{5 zh;_rrMg3qbW93j+Zd&jlqrcaUtTswnHwqSep2O2kC^_&Tz+kmclp1ZQG7)27;py7y zVcj%ew6e#HL+~^(3h+&8T8A=+Bp3+M2zZBr!S~T`$Q7iZE(JJp+3hY@5-!&3HRp!+4<2 z&XC&Y`c-EPN4b~pg z2K(@K9wUO60q_$MhxiZ($`3s02$J4*hK~9&z!hK?!lePSaO_t+o!bW_Y{4n!IP^t$_S2WpG@L$q3nTJ=_j zRAlgVVEYdB8cGhtB}H7V##a`u4n|kEdRFz&x)y(w(U7iUp^(@n9bFjl1_gyKrG5jI zw4s{ZEQ)RNcvtL_iaFuO!iveBH_$Hr196Hw_(`0_KY=ApJ$pnxMS%?rRwo$RC520g zXDmMNW!0KKx2+`C&dK7XuVz1QTrgmKGuGA1=or2SfgZx;KaU#{RX8nrscHnqiFAQ$VV5{NajMhbKp^*n$V5Hr zxI+nP59c?5G1pBUa+3`F$N36;BM9IBhErg}SR}!s0(In``ggiqYZ9#U*^Ex!9?88pJEPsEEJzYdZZg=GkJ-Lh*T1pp0Xcd zPU!G0%q4XAZ+HnC2n>K2Cgxh{HBaXFOROOieJ^vIW`*zWHJH409EW@x6O;uuBjO(4 z8_<3SZ%kr;7ujvIJK04;_AZMQiEu^{daA@4Uq>N6UkE?6K(7rw8X@T^4s!KfH27(f zD2$<8F}YBwqqh-l^^HPtf!;eSJH(W zCPLtO$GK@+4nEIeZ|F~a=>?01L0(s0FG0>*sEHUo1NFkYgTrsSImYA|OmT^ahk$l6 zRs=EZWDhV9LoQ{+&jU{mc;r#s%lZ~R0fhesl7-wf7kOrUn6_~jJ~yh@aXoyhHD0d@ zAKZVyQ?>6oqiIs`rjVZabpAccf#7AA$tn)mV2(&G^Xo26s=+y==NM9XbNsV~aq{9D|8F z@L~`~@KRtx=}`N$Tp@^2E&2E?HoD?>RojNx&mfw(Ksex93l|9?J81j3h8F5QaJ9uw zIR)DWzwM9C?L2vU?0D0TQv=si9H(4NiB0an8RuY$ix>sL3R>+r_?QtN5~269^vFOt zj5~3=qD^^fo8jJV;=b|Y87@k^-v3zbxp{KjOKbsMpxM& z=Em(wbe}~ z$tV*(JHZ$y2sqDXq+%WLGwO2`ekG(VZ#a#f|05bMk)9tzhB^ZHmSG6zB30|iUIfew zKha_G#Pz)9*E*G(I-W=8Z6N2;8-qiWbU$u&8KZR$oX2S#-Y+2;qxB~u>i)Ap>$H}| z)Q9igC#VmOXIgvIe`0ct38_yllQ9Y764ADgmkFr}QOrg}5u1`Ax$a}*|6jToV{8-D zFb=lVf5!9POF}q-%=bnJ=4HcBA#0A{mOX?F1dJg92H}X{U5^5d zMm#GE9+Oq~!56|W9{3#tf)d+#b%JTT5S`mIf=;tgEldW2VD)qWA_Eb~&C26pASllW zH)|pYG2&+QAE6b35D`2A6bx?=y{^L1_z~1NN2|mfZL;0PTeYiJ*46J}O0?iJREA`d zFe`_bvVOmdN}==%W`#wK!IXrugoz#7i;0De5-z6p;}L_!m~)L*sLpCayvza0pc39B zgSxHOf>B&V8YZ5`uRl+6UcLc3oDhdDuS6U6j&R!L|umW5-XH}ZBuTL<`_)5z)-^z%uQ)ji0NtVm88)@jkl-$gKQ z7}?Tm4q!Y(aKf*|Zl5Hfsh0FzG(nGLPZh17zEm*pRxG(o*ukzl3wt|m;mpQ&s}JCg8mLE_DzgPQwJ3QPzO(n zpN5QZr2omH5I#wHvi=9-_18x5<00{QBa1H}y)Yu=F7p}5T2CzV^mUbi%D7~4r>*NB zquZb4y55Bh!>FKML4}IeRzj&JJ`=XHgL`(bsi>A?j*O|IjZh|D+E3#G3yANARdJF{ zXrS&JI~mxx0MzRUNRTtdhRH985iWq759WYqI6`@T4Kt$ylMu-$z#egoh?!$3k?2(= zzr0gnjGUX7mVgyxa>Bna_#JD2*T{Xy`(1%&Lc+Q;nu_C9A`YE}=_R)B!` zi+&!0Tk(-mYvTkBZt_El3I-cEx#Z^$J+TM`OZu1hPDBQ{6XH!(qFx0~!#mf)&zGIx zuPREMS5OJ-d*|T>-`Mg!S(acvynVK>y55QK0YnYKYFGl7aq|RRTljg2)&O>=6Y?`- zc~*(~bk9UB3%EV<+Yv=xmRL0(_U4`uhn;$yB^4$QGx-`5&e*i64D3_-XT=`Gbn1`( d9R5BSIArv{iX7Z5X5}9IM8hX5cP%{je*yM=*Lwf} diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-311.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-311.pyc deleted file mode 100644 index 5f1762226acfa500122168bdb8101a0556bd10ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8091 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 diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-312.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-312.pyc deleted file mode 100644 index 1512137ebe8a2a88ef3801c07a8ff6d4633da918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35435 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 S`J~ diff --git a/osinaweb/osichat/__pycache__/models.cpython-310.pyc b/osinaweb/osichat/__pycache__/models.cpython-310.pyc deleted file mode 100644 index d45615d9aee002618601b93fae0915073e00e9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12746 zcmbVSX^b4%UGF-&y1J*kr>8wW*ID=OxZ%pjj#hwjpk_D-h<61-s%FaagpyDQl!5G(?S`v{055(0q`AQ7Yz-}rzm@d0W1fE=>R@ArSz z*La){=~n&gz5hGv9sm2iUZIdn;rH}ct@Rf^luG>vGm}3XnbUZ}zL84#Dc@+PI)-N$ zOq*?Ug>S2Ed6v9w&&Jzsr#p`4NS$;$({Vjl(oQ?u$$2?RXWBEJyqE73yh5kw6+5%u zY^UUvI&Kl81pg=pO>+P=YxI%whis zFh>$h1(=8YqredY$ANjoe-xNU6U+%A6Y;e8V2&!(JxfFz9eLaW^XS%-XHT|VtcdfY|=gvI8d?iWGF#UXe ztKF;nv3q7CJkt(T6kABe`;unMy{Ng?Y}BJ>uN&tlbNphbuCCR>`dZKc<&1tVQW-o; zc*6ez7^GUM$N)5N8ou$mxy`iYo7YUW-?z3+-`=+T^tRn~dF}G+t2S9+v&)OGLai)Cu{h|jyW*>!j9<|cMN|P^_(ad%}mz8m-Ff(Vb}0M zJv&xZK(2UG#)QGrfKdz)$GMTT= zFIUYt9W|qN5ZkLge=D|^uGXV|ska%0O+Vm9MhiFU*S-8C#8W8TFJ@ znwdbvnWRLOu&QbfplXlPaXRd6cKtXvB$cL*P0DvCwva=sbC=aT8ylWg-yof3HZ&Pj zt;z119Z*o!ip{1U+tJoW5a&XW6-c3mu5EPyeZ;n3kLq5guF1@^>l@whjuG3NA;@&U z?rxS9GaXHm>LKJ5i9{6$vILY+Do-#&K=O%;ljL^(8FiRQD~wc};b1TZb(EEl5jZT& z^j2FzBMM_@t=WzO73agC>(`PGS6vygH#fN=H4a}^!z(0nsL3*VP@ldm4EoSY?9bv8V;Z!p2rSCo`Lz2^TY50kBQiaNf$LZNoMk z!#4RgO%rLyF!8tl&w1O-GNp0$Tc&M)%YGZ!yv7s_``hzrDgR$*=7>=;RTUjK@J#)< z==_C01rVe>aFl2IpsK)brG3-4b_~x6>|2@JDbEEido8xRo9#B4slEw; z+wI+`)qVdiY50z%7VwHQjjKI~-cUUy{mAR?-!g4V1wnwl7J-sl5^rSZC zL!JrQHKa}|pW3z}<0d5Nz-Xoh=2wg_LjDXawLh{3shf!`@>5qZh2^Rpn;X|44K_Ex z0(Mxx4o*Zzz}sQaUW@IzS_h9@yTP~TG{YL`4s*}eYK?Y13~MzZV)afmQXdBRK0F~= z)HTW=ro3Ul-QT}^eHZwl>Vep;)w=agP^-ncS`7rd*=9OltG%>YZ|f2-z4GGo=dLId zUB+2-q|P^kwlBgW&aMP6M>=0Yxn}#q*?JVLG&_M5c)5lOfbeVeNW@8;ztD|>^&siz zINMP+#JTf56*Skop9mm_$&ztq>CBa-GiT3fvBBBJg=F3hFzRsb1*wkrBXe^$~Zq)Yysr00+> z`}-ta_UFM?`-N}rJ^^*Fp2URil1f+9`m6LAAq<)vAGsKcVr0A}X)Rf^s zafs!2~i%pun6T!FN2D)oPontqET?pZgvcr9k>( z@hV3~?kq#9_75b&WMR6}1LveJqa{awcsP1CZ1`On_l@_y=P3?!qr0xIprZODfed9l zo`)tSer@`@YpnkR0R7{`fqjSC4;*E93SH=R_l?`eE%SDY>#pVo28_1UCJYbXyaJa1 zJ7F*1n|V@<66(=l{#hR}*RT#zDcCZ#neF$J#{#+Z4 z!>EQPyCb_Z!ceJ!mnz%ot4+I3#D{S4BXiL|TJZ=_*8?p?yAb(a;5YKY}b7{J2t z!@H#-*o+eEE=ywbsdwKqK3L7EA7sv|x7+H6m~tb?$$qaJ#1=GFoEz^?T!?y6y^U>= z4&y9qLI*|l*zud!A*^Go*^R1M*%oz8`o*TiF3l)bj$MCKX>TBXwYRClIIDtAz1hVU z!@_HJH?fhbj)uE8vZy~jY`%diA&pQQyGikxGs_U9u6fEhVvad$y3ulVpL&LUb4wNF zv8WJrjwvngn;TTk3Z|x_E#x^WSf}q|Q}e(P?XAKft93U!s~B*aLvMTeRn@xz-5`1k zMkMqhD#z}I>Oq4>Tk8AS|BD1Qf=z-kV~)5}gd-U+JOSXQ@}e7x&=JGGY2*ykN}hDl zkQNP8p88Q|@E86lz@*Lys4X1P92WJ%EfgexrEa$_SRP*GvAMKi4oKMA5bDB`$(vZ z8Oj>v5P}Iu@&5lF1udKj zGMl1uZ{t{D)AS8$g_F|blMd*-WeiF6962LqdW{O!3 zjyGpvvc=S@)3>7H60@?5UE_MUWVLDMh0f9Y11A`Po-B8WqmIn~O%mU_e7hKoLs(g9Z*rTj{G6Nc;gLF!iSb_(@j zv`P!3HG?;35)O9W&qDJQu=no3RbLpmt>ShTrN!-BG<&NwK&e_oYL2Pxtl)CMZ3qsj z?c5+Y$R0{<&kSawvY&(dU|h4+tLP&~`rer^nK=SJ)uI-;;4DZxtfZHr^UcJO2`{|1 zxj|i5Lp;WZD-G(WL+fcV+f#5$W2fGbfC)s2_-(QA$*Q4_pqlak?vlZQ;Kr}OtDufk z!3Hc^$hUp0B@#WYZ51K24-rezuegc2EA|rS)>UtF0}>sM|6%b7MciW?le$071TQz* zn-J2UV)IWE2)&YgW0xL4y?Gt}eW!jcsMX;Z1VY8tyr$icvcbmyygcfP8W&~#BWzxP zYdQ{1L8x92y3uf8B6eMP6{6j}SxJpGl2>kQDuwzw=pj~tH%m=Z^P6jH0g4)dI?d0I z#Vpt1m+*v4l*F&Kp*`T;n)Gm;ZMr*mKlgGojGEo`O0wk@ zP-&&!XhzNJ&1kFA>sFrAcJU+q{mDct-TL+BI$ftq)T{L8hiDZPZyY9Y=?IDp)FU+jOYsII~9qU{?rr3nLJr9X^Y8_v6e`ZN`rF?L^;JGn)Qx zvUJps{tCli6404Y#qT8U#{j;LCwv0HHC!smrFiVB0OSomQ_m77+$gNx zXZD8)NZv9Vb&)Ay00F0&mAQTvsaNnMerXxAEn#-FJZNj=3*|=@>oo98{U}EG3;E4S z8w0k&&@XiY`k*etI1JcmE5n8zp?ynQ9778uM?V!M1+gS(SGZnL?1x#%)ofg3uwbbN zDItP!MbRp_V~8OE0hsZFwfbf|QrkeEpVC_tavUr5)|<3Dq7?KJ{E-R0WI``l;wvJk zjPNpa*T8Dg{6@%FbP}bzz3e?iF|NId8bvhOWF*H;EyoKmjgw(A!uUCS5_J6_`K!Lb zau^(Vsgaaa6c&madoR)T@4&xFeXK33yYgAd!z9q<)tP1WFvip8VMc|E zP}vG1&v{OKOfm96kO*pTh5db8C|xJ&0aK|*m3!{V3m-grsd93oe{fv91@ARbNtJ$K zTmb3WpF6o)Iq9?UuxWKhR!robI*HN5Hk+u|kyLLGTqO{*vdt8=UF@R98dYO8Ex{`U z`bVVd71@Dos`zQr))W6u6zPQUpxlVd$&nJY^03{10v}Q|GsFj?6un9DnK&>eqQGB4 z@qMBs10;Xp&j1WX$^B8_RwlqcB5uo|RT`1o93sOra9|kkoh);p=F(mPSRKxCA%1im z7(yrschP;3GeU%~=JeU1R~F&JQ$csad6|n{a@OTuuT!-U(KXLrQon|QR?U0v*-MpY zX+Ej1YD9jh4q03MI*{rT0YhCYcM>;8oS#Ktym{<7TwZEZIn_~U72;gvDYh9^i}NaA ze8U&7Qbe3uW{vLwm|_~rISY?44WmEPOyirdiRlk98dKKH(xrWYL$fGDUl2?)%^s(O z_^sQBnn}uLs+wL#RKezG`?)8@mW8s5)Gd6m@1FFZJlT2jLi657N`SQb$N1pBr9bAz3Vu|$0pyI0Pw)Rtek zcyS!oU)|DH(Ql*ND@?H2>XtVvls3j`BU7xV-(knUPavk#16A3tqRO}MgogkmnxCEr z5giawN4v?*&zp+1?h|%gVgAC80}O>7Y$JPjY^LP~S>Hg31N#Z_c@a(!d=O4Eu$D5f zfD6PzDuB4$c(j(!ZbFx=r~$eMt&Bv;)HaiLDJ;a9r#8FaD1v*9z^!(#)d$#_H8x`6 z17h6@O-#CpsI$wEIgOUP_WuN_l3y>w$n2MgG$7*^t7U4ajP$s8M5diZLi`yWh&5Y0 z{6|zrJSUTWl5Zi(kAr{leqg)fuyppfsrG0AgPmVHso#1hT69hj^@FGCf(Q9;^2&q|O>Ve+K zAEWd!E}768sLU4ER3EH@kr^oAO8|8EfYp967Z~e$Vr}2dE0T`~|q!hv0$oXHub3a6UwFkzC8KeiyT-?gY zkz_83zENLBH_HgtJcIY{;P^<;YV!C!RuO6uLU|ThbV=pi>fw~d-*a+*g<2oO}m)a6crY45R^Qy@3nKBua`+$<7P|J&1*o% z&c^0yyV=-tj^99qbC{$0Ya|qN_sxyMjKA;?(ULmeOlkNH6bfDLHtS|EG6 z%r?m$^F?rzE;8;eqJGjrWIZKa$%mvRQ3ODg!p8RvDDC>JQK%MzPEH9Sci-T^wLVqDsP#i8(YS zxE^RrJdgDb%V<1|-Z^iTY=&uY!9Xr>B-ZEsdL@HKSv*U4!hZso&@0dx>T$_K!?bLk zA5fp@(`4uq#5DAIGU{Ys(=Cb3VLhm4Z0H$_D-g|~U7kHbb{Q?XD8`c%I;A*3d}2F| z=ynk?aNR#6-^JD}`gSE%LMr&TX_M&KooKvWYLTjvC+oO^0XKq5Qbfaq%%7&r8;B5Jk;FKUh)Iv-kw3R78S`dLCx0OJ$uCfpMSI8Y!FiqrqNMODh{P zzn7)jhH07$=zFK-crfofkVctUZu}$+c_xbLjjJ8*_m|P@lu)vO;Io7$)Yj=Ox&3+D zz=^qm@VU_|4iE+6^#b&4F3Yat>Oi&wmyvh-LL47}=E9o3byy#L4L1;J)rB{j(bdFS z^`w=qX(Tt7Mrv8kHst!o7MF}m!T4zZ;fcK+&t(CJ8&Y{{K4>_e4;P)@;w=gGbNt%6 z#+|EP7~325=xXe)*1@tkLRSBX+BoPDqguu^9$1#-E+K&dM`ogC(d-}Fdt9Ts_Zu}6 zicow`A-4*86Prawp#GWJKEb~dj7KsWj{18PT<1XYNKnHw@?%;!qGri=OHI59XfHOljIu<8!ulK)vq(qj3zJ=aH6BxsUrFRVSXE*zqffAqYRM zfVRo4+W%W*iV^eW2Y3K9d33~Ky!+#&pat)xwG4lj>8!*mX!Gs4IRAz^uX1s6NRSkG zJp;=_eDyH|edKcLg1;)H=aq2C*{wHl&u&3qPgVbbit1kgyxE368VnJO!L{{JPA_qb zGF)%s_+x=L*A=Y@Z*Hy8sU;mJy>Q{ZL(mxk*$KBg5Ncb{5*TM*az$9*BBmLjFA&c# zMFQ40i^;3%5rFt$()DHp^Bu;-8ub}_q2VN#BjfZXUb@#F-@AzYEWwuuzCs|foJ%Pd zy;gAFU{*+wOd|9ntF+g$#_oqPF{@;nmwaf1-&zGMlUv}s4 QK7}V&cJO~!dFFug|EBS7`Tzg` diff --git a/osinaweb/osichat/__pycache__/models.cpython-311.pyc b/osinaweb/osichat/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 413ad99cae6aeba3ff144e87238e441541b8cd63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5841 zcmcgwO>7&-72f4Px%`!6vxOZ=mMGcupDagmZP!&~OQsWBrc+CDV_5(}ahEpbC8^G? z4>_=ff$Ct?J_Lo@28s;pAQV2NKn^+PxGOARVow2z9DI`@pMoCx-YkEYvZ5ep zhup{6H*eky-#71P_e-D8!$6zA^^f!#^!|-Em1Zw@w&qxddCKq%&x%Zzonl$+TSUtQ zV__~ay!A7Nw+Za5wK8!9dM~PXQ#LAP2Pwx6Qg$lk1S!`JQVuHR1}V=DQcfzxfs}U# zDHoOUfs}s-DL0i0fK+e?DG!wjfmF*5QXG|P1*x_jq`dr|aVEO=HJUTZ>W*xl7eonq z?BP_!#Q19~-)#K{I!_sanPPcn%3@&z>uhBVFk7>%0DdpvGTIba`bQ+d$_)}$-nM36 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 diff --git a/osinaweb/osichat/__pycache__/models.cpython-313.pyc b/osinaweb/osichat/__pycache__/models.cpython-313.pyc deleted file mode 100644 index 2d7ffc51c5f53638c8238e0feef92e9834230c30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23373 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 diff --git a/osinaweb/osichat/__pycache__/routing.cpython-310.pyc b/osinaweb/osichat/__pycache__/routing.cpython-310.pyc deleted file mode 100644 index b14819691ce0990fde5edf3e12c8aadfb0cd2416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmYjOJx>EM3{Cn$uV26b8xpJqLH4RbNH8LhC?M3OgvON6yQDg&RPD+yU}u1lzjP~8 z{{lz|r&r1)isfg&_&JWP*DH+H;N|E3l{5C~L3RZMj_BYG8O0P2S;RY>GnG^MFn7s- zs{-WT3h(SWM}85COMeAcmVPPY2T)4m{bDCjlRucv2Wj_b{VIJm9<2jWG&~ zy7wTRc+#kyjZsXindo#Y16t_fCIX_irmNMVm~Q`P_oa%o5iM<8(-%w$dqh}PUPxt` zi`<-i)+i@c^(al>9*p7;;~X`blzZ0TD1sO}tLM~W&qmj2t4T>>S7Ki$B}#bB&f0=; zOyI)WXnw_K{;q6};SOzY0Io|CG!6%`!4DSuf0~=GTXBV?CLq!wKp5%?h!enpvqRCA zp^kP=<Y5Z%3O5~D;L1%;rblCvy^NeWeFuU{K4D)7oAG6tUf)*U#pT1#ykI2YU-(YZq;FfU0sY^V1 zL@D70Pq@ZDF^Hg?iNqZnHT{kcNM3#t4+b(kv3+$WMe_fhHRCA7Q+vcre?(Fy4Ozq1 zXCE{sbm?lk2?YsG^~~0V3kMu66%?*=zp`tfRS^V$BmIiQ*9%)_I-KC=wqKLWfpS45 zP%X?qLUS{J&4O1PR9%7l#12?prW;9YumN9eNk4RL7|T->)UUo^i!yi%M*-3Ua_vXl(8uL%IM85!ay!r`BX^-Suf4xU$TO;qMNHTL>Zeuiaj|A4nI^{sY`U&N9tnVRd<(0$;QTi z08B7~s_y*@SXgS^5MjZ@)UBvYnYeT8Qi&zpaDMOm-n;kd^Viwg8KBPV-(OxHLjZni zk{>$*7h?t90w4G=1QFbY5cq~)2#sR{0s~;^o4Bx_t8=&d9%cB*n1EDU#Koz#C0v?X zYyF3|jIC+j?G|^-1KXK7)8jiZF%OW~J5y`Y1TGJ+_qj`X;O!yd9tJ!RlyP@hxl$c2 zULj2`Sc7BE14=r9zwQq2{_U^9Owo?E0Y;rg8M1Y zXo}VImn&wpCj!!4Js6D3&4~KF5U;aqDo6hjeyFbV0)+4fSo{taew9GcKDC!V-Wt`` z;@X<5-Ir$Ln^}Hy^PTmf`o1a`9BD4A!l`}x)6&S&#Ef=4`l`7!T}0|ek# zRLq~Ag4rJl-U1Vta34H{3~m8aF*Ey0P1yoncpI2%H`AG`=hO1Plj0pE0kJmQ%`UCY zb#qH=wg1rOyV^2)QI_Qgy0LN*oo~QUJ+}Peg^VdGU}bWB%n{|-9$G#+!5sUPaWp9` zu#?S&qRD;M;11`Qk{<5wqDkpr_ny`FFhNaB{6@4e5!{u6tIes^qB8Bp;p`mV5!bhINc(`^TPqe9bn4B7F7VlYnfJ03-BG0gxDq6DWQ0m1aQD;7~ zK6YMlY9Bd%Pg=-0e1{SK1%dSa_D0_Y)KbIK@;ZLyn18n@xfvkS6mprXzbYc=eIakh-$(Xyqq88O}*GIATT;c?~N?wQhPUPxV&9 z5xXD}Z8|RscD81sRJL};~_yMCK_XHLF7@{7-J)pVqt9X5^}OD9NsOLy#pc@r6ryACK#iI zKg8llD9E)|bR=|E&T>+a`0dQ>%w!(l?rS=|fdHMGm%A^xzg4h8?9W+9aGnrD4BN=T zRqT)|!H5y2*_uPE6eEH-W)v)8`UoTR4jN%ZAOelBtc!8l(pMQ4|4589r~!@8Ak`R4 zUZL#9OeL};q^{{V!?-2tc8Bqqnw`a=-nDqo>r>OUiv8`jXVsggUx294k+#?0Y;Zqc zw=FLGyyX`A>9rX8sW2U0$;QJJYnh_aUbaa^LsBpylIjCO)mMw=)GRkl!Em7Cb1A$x zw15iqb8&uRTzg!4M#c0^+qe|GB&{wtO5D5m+pYoRglP!gTRPFYDB0t;%2Ct}MZ4fW z{3K4DHtX2@Om4w+^;%DWnQIv1DLM@PlPTH>)@7bRdU8;D+#T)>_k#VSaV9s(c}*#{00Bil}!Ku diff --git a/osinaweb/osichat/__pycache__/urls.cpython-312.pyc b/osinaweb/osichat/__pycache__/urls.cpython-312.pyc deleted file mode 100644 index 6d31909765825681349ac922e5e2046228a7e7bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmZWlJx}965Z$#m*dc_kNQWXML_-nX*((Yp3Pg2RahHl~(nO1Q2}bJ=t!<*Xqoafh zO4?H>?pM%U69iI(C3FQ9T@Y7M-L6dph$&{~&AgpAvwy19Ng(a;-{o!%0&uUu*o>Ft z=~yPGfC36R@L&siT1$g~YE+F%(mdH*7kJ9N5i!Fz{%#STM#A)>%mhX{IJeJnfD{I%~%t}HY5XuBj=RX#k4Ku6I zed2e5e7;aO2_#(x#Doe;pj`;I-7u>Z< zhrb3+;>m3z+$1sKJ=O4uRcKZWN_a9S>qXqx~ diff --git a/osinaweb/osichat/__pycache__/urls.cpython-313.pyc b/osinaweb/osichat/__pycache__/urls.cpython-313.pyc deleted file mode 100644 index be75d634213c9f90c7ce442a6fd08a3e09cedd0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 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 diff --git a/osinaweb/osichat/__pycache__/views.cpython-313.pyc b/osinaweb/osichat/__pycache__/views.cpython-313.pyc deleted file mode 100644 index 5f88aa9b6cc41f2584ef86e89144700baaf5508f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2969 zcmb7GT}&I<6~6Q1neo4Y5C}ooL}Y`T6h|T~NdsMx#n}KG!g{c?5*t~@9>WAPA7Q%jZ&ht z*YdsR-gD2n=iGbFcjn0Jbs=cK`9orHSwQITbYeHQP8@vz#79U*GBbrH8O%(wm<`c6 zJH<`%n73$d%7GoQ#!U%WfRUdPCnYQa&mjv_&S5Gcb|LKgK$4{{G*nlP-3wgU`7ND= zSt4LX%P5$%EGTADpTDo9VZg~Nm#>5w;+ZsbEv6WGT{DzvSa7EeoJ}gL%5vWPmZ2IL z!u%jjDZ7DBh=c#p?_l*K6h|?eb8L*!9WOPRk=dd84a6KTF<~lmL-liHp0Z=&fA6t< z9A*0J%uF{zq5sDUN7D+8=|OXneM-!J9eV-Bb4V8Aj1TU4uwk9X#@U$r*rqyZ+oo}G z?nM73*=hT)@vqq9I=06#=eJLJ|I}TF>>g;?(1&`_oX6&hCjJ6g6Z>zMIzRB5NA54Dw>(B zN!7xY@R^jEY92)x#h?)rsx>kbi5m(wB1S5wE-Sg5x~4?N_4LXzC^8~nfobiL9Z|7gJ{BfvOaYf&3cr(iCb~f`f1v4Fltk&~2cDK*z3U$5Rc2 z%7IX+clb$bB`{JA+$aZbJRPhA-g(B91C!OjOgS)93B;;_wNm0I6K7G_G#QP9gRe5>Ntmv@lQIVk-ANpcq4sffP!ljzFivs8a*vdd7A<& z>p-~zcaTrKMnjt|*BqOc*f5$(AQX21(7EHh55)x^8ss(cHJV?2k7Dy4OCm zpmFyUf-fQa{xa|)S$NSP3c+u>yAHYjX~JjKoI)hpYpG=gL%l-l{t4{?;8G?Ot6?A! z3^Qe_X(Fi0sRhL#Z7cblp2{ehB*ma4l{RLf7)#2kYCr{F!W8QWlU(Nt^B33KonrAgj8)|CS@*$y~J^I;@zlB_?bKMtcA6N)d7X`zy&PURgFl? zsU;<&VuOg#Q@e>|fw!`162Vdj0(xH2h@*g2Qz1N7Qkk$5(_6;9)HciIY3lMNI(4Y< z9kNQi^C?5I{IRq;L7}1<0Q$rOK-^@wGf)};o@qTWoS>kN>!A?tq3YbV3$g_8by%SX z8x&SH&^My@(cRs9JNGK$xxM>O#6Nj{@2R{oe&|12Oq9;QS?V6H_^+0vtKYa=w@0@| zi>J%((8lUrToF5hP6QS=LES8?e;YO6|T%F>x)->2b^!=GII zLVDvn4!O=+MWNJt^;ut|DtzaJ^)H=W-y0O^K6i$qZ*iZ$<+|w=!yXc-)x`m0QO9O_ z#WXPew!;)BiM!6D9|~3=;nS3Nk@C9hyjuCpC}|z1OdT5o^b-?PfF{DSo>6j!RY|Qk z{4F|ybyRy{X$06SIpxRr2CTuuB4ZFbs8|g1H}vM$sP8M}{|Y(3Mpq6|`#)W7<~`LT^k{`}sv-}gQ{Z8qx!z8^1to<27T`Gu4D&w|N5{GRGdt+m6FjS*~VNl4%IQ*tuX`Am^bZGn!O{Qg~|znFph)ZxMM3f z2nJ!ogFw}TAW7L}jN?WSe7y|ge8tK0s2Vu%SlOo$kD0tBq6M34^XJU}1hq?_CsE9K z97osOf5+uTmJak)S(gSuL4*KZ?yy9PQ&^rq=KO9E> z9H)E3Yh_^#Hf%gb;}VOyR6Ky;@vS9XJkSanl#PaGhn$SoaG?eUe`C~-OFXKP63a!) z1iC?EHgYBo)BX~@5qLo8!`59^v&P;8shpgb&gjOVt9}2FERQ)&jy=sSp#ueROGqfh*$`ExU&{rlOj~ zEG*nD_E@6UT|C<&MPOT1vj=SxAnQKLx>^@c!TA|x)D+_ExU-^K`SZ1>-%F`l0+Ix$ z0v_6{R9pz;NUa^=V>+u)OHp4+tt^4;3e0%dy;tt5$z%N*g(LB0a7lxDre}MO=d|s= D8&qm3 diff --git a/osinaweb/osichat/api/__pycache__/serializers.cpython-311.pyc b/osinaweb/osichat/api/__pycache__/serializers.cpython-311.pyc deleted file mode 100644 index 404c5f604f3c9c50d6d2091e899a7e2eb51a87ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 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 diff --git a/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 82a5635f0b096f149fbfa2c597774fed0a8b2ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmYk2zfQw25XSBNX+oMV@B*wIs9yk842%ediX}^B>TBxa#F6bLYS+#@2(N>fvNH7* zDj{)6gw&IK_xmi}=TFv?NkXu`KK%R}=T9dtD@5^t$Ih_{BB&w-%_t?p6Tb2aKl3R8 zDgyAg!O=qsk;0xvNTZ{d`&lHS1)0Vt^dM8(1{HUk6CFfYOK9xjs+LwdZ7e%P*75Zk z;ReCDyOl0$FqS*1OZGgC+p*a4GS{=6QPy~9(-ITl$kH6#^4};+IyHD@*S*#9(yATf zJ|=NsO8ZGnj1GM}bM|WSK?a3X07}U{ut%`(PFHNfl`L+bc-4s)jJ(nX(^i(8mC*Ds rq#G_9c4VoOO%lOUl9jeq|DHw$&t diff --git a/osinaweb/osichat/api/__pycache__/urls.cpython-311.pyc b/osinaweb/osichat/api/__pycache__/urls.cpython-311.pyc deleted file mode 100644 index 77fed568ae96777f45bf45ba728b18a2d3a2968c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmY+8u};G<5QfijQWc`Yz`_6z5Q&r>AqL36RD=*qu~Zps+LR=Y?6eWEbmR?SM*<;U zrbr#CtW4b^b?b!P(4ptE@4wTh`~BHyY=Vx#&HMecuD_;Ph5aw)r&_!M1BN1qQ5zv( z7Q>Mh<2FWM0Y}W{xWD4z!vgr$w~8)mJIuKPuQoFS4;6Mwv)&95UafFhpC(<=9LPvXtkD9bW6D;SXB`7~mT=)}LhsACOw0RHyhGgX&z_zEsE1-bF5Ja#AA)ppT zp%tMPg1`a{Qk$W^n;DPyr?tna#?hKI?btUc({!y?Zj$r!YxC&C#2ygUTf;qZMgbek zsn_Wd)exLV5>E@GKn98niSPV;;?X{dySzCRp%h5F5+KY5Nx92Z+xXh4FDV+HSrbp| zb&z5rmLFiN4Pf_x?skgNP#G#57{k*aza6jZ=Q0DIT*&BQmL& z3<7LE)f`NA?sdfJFl0BPtb@#M@=6~Y1R-33ixoKgbAeNsUA{TXYJFaKmSCnT5y ztSNJ^s6kh38>~5p0g<{U?$JS{Yf_Urgrb2=nNhEEkm7)_J?Kdk<8b217>MMBaTT?Y^s=x13tX z!WSgTcXLe!&la+j3_Zn2f;;^I=Lv_a diff --git a/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc deleted file mode 100644 index 23d05d56f6161f93b64d40c3a6d36ef533f5551a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3266 zcmai0UvC@75x>3vJRK>DvSmAV3!yFA(rqO_7)2YTMO)hlTEtEoIZa9+J)F2p`sm{w zv$wP?;TRN9AFG!>HV!~N_Pw8=A7fwp!unt+OB9S_|zCTJ<}O)YimWGR{uff~|NPyj?Td zQ=rErx8+svHh7Z1j{fV)nYc?&`87tzHg`_gOWr+Uzp+l)GB~v+p=xmtH{+kMWyAwm zc8XiD@j-1@ADr9ZVKbk%{?FVV&6#*~)3EprE7Z<%?bKShV{75n&Ry%n{=!!=&8vML zV_qAhLG4dEXzOTQv<w+yehM@Rx|^?PtLvti9#sIy_~}`bgGp?eWet zd(l!`b?cbHm+KF7RH;-d;}so>g0K8D`0kUe%2X-ya-6`y;LS*~qB1SUaO2=R7u9kx z`Wmgl)x!A?;dD~FOI*m_(P0;>l?{b0M zI{s)beLHAEW9`y*WXFiJS(0)tMOEnz9VN-8=~yIlnMH6@gqDr)Kk8 z*?#F<)z3g;J7%sOGM9xcwBJCx&A#V^HuZZLaWO*w7=Qn>xMe#w^S=x|`D0A}3U+xA zkkbuz{Rxb+CTwDJ#%<)Zb80PJ?huY4?}1au`_~pu?M%FhZ)jj>2-=!NYK?k8Cij`Q zaBF)R*RILzu4)s~A)mbm6!z#d^YT%=pZM>MKE z6EiDGB}CEh=y*@1qtQFEM6e2Z4QG+BfoLbqbNOxJTw2B0l{+-NOXQZ(LGF<7RXiO zFW>eV{X^#eCk{ee{+#sPci!InYLy}9Q!}2LpvoK_E2=bX32&V?H3eR~20s}*M{S`B z0&iIp4?6I~!d1Rft{z1MiQc*vyEI&3RVZ(Z`X|#`l07SpCfhy8Y|9dQ{5ns6kqvLMh{Y zwhB|Y7B%W1Q;!A_h0s(?_k~2L#|_s&&vP3Ngs^w6k|d1+(5oz`Nyd-5cQAi@CC=ayX>{>@;@4mS`9X%``i{hS?r9|bY z4}e}fKzQA{_jD*`RP_35O=3ohl$(4E44hd?Q`ege&sJn))P-n6&p7RPdC#z z4)qe%M!reAcd6!SCSFbEUSn`r7PzR&1jKKlUvUuI?jn^tj3Bz}0)$@xj=yvr_X`(2 z`*Sz!vR)&{n2$00h40%808Q<`e$ep#7ruAKb^VTWgN1+Yu&bc<3;7`ydeGk(Y??wc zETz~%)!3PP9 zm3At`x*E<^C5@NQ#C(5cwRs9`t+dU;I}}*v1#O-YCKUAMN@G;YX>~T29?PZ_8LTs> pxp2i)TcrWb@C_Vco{L}7Yr7%{53LX-joR5iv?CVYMC*0f{{TXEq}Tue diff --git a/osinaweb/osichat/api/__pycache__/views.cpython-311.pyc b/osinaweb/osichat/api/__pycache__/views.cpython-311.pyc deleted file mode 100644 index fcec0d37b89df7e16eab8a935e702290f27f963a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 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 diff --git a/osinaweb/osichat/api/serializers.py b/osinaweb/osichat/api/serializers.py deleted file mode 100644 index fcc331ad..00000000 --- a/osinaweb/osichat/api/serializers.py +++ /dev/null @@ -1,37 +0,0 @@ -from osichat.models import * -from rest_framework import serializers - - -class VisitorSerializer(serializers.ModelSerializer): - class Meta: - model = Visitor - fields = '__all__' - - -class VisitorLogSerializer(serializers.ModelSerializer): - class Meta: - model = VisitorLog - fields = '__all__' - - - -class ChatRoomGuestSerializer(serializers.ModelSerializer): - visitor = VisitorSerializer() - class Meta: - model = ChatRoomGuest - fields = '__all__' - - -class ChatMessageAttachement(serializers.ModelSerializer): - class Meta: - model = ChatMessageAttachment - fields = '__all__' - - -class ChatRoomSerializer(serializers.ModelSerializer): - chatroomguest = ChatRoomGuestSerializer() - class Meta: - model = ChatRoom - fields = '__all__' - - diff --git a/osinaweb/osichat/api/urls.py b/osinaweb/osichat/api/urls.py deleted file mode 100644 index 61659995..00000000 --- a/osinaweb/osichat/api/urls.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.urls import path -from . import views - - -urlpatterns = [ - path('visitors/', views.get_visitors), - path('staffs/', views.get_staffs), - path('start-conversation/', views.start_conversation), - -] \ No newline at end of file diff --git a/osinaweb/osichat/api/views.py b/osinaweb/osichat/api/views.py deleted file mode 100644 index 23fef06e..00000000 --- a/osinaweb/osichat/api/views.py +++ /dev/null @@ -1,126 +0,0 @@ -from osinacore.api.utils import * -from osichat.models import * -from rest_framework.decorators import api_view -from .serializers import * -from django.shortcuts import get_object_or_404 -from django.db.models import Q -from django.utils.dateparse import parse_date -from django.db.models import Count -from django.forms.models import model_to_dict - -@api_view(['GET']) -def get_visitors(request): - start_date = request.query_params.get("start_date") - end_date = request.query_params.get("end_date") - - if start_date: - start_date = parse_date(start_date) - if end_date: - end_date = parse_date(end_date) - - if start_date and end_date: # Range of time - visitors = Visitor.objects.filter(Q(visitorlog__visit_date__date__range=[start_date, end_date]) | Q(visitorlog__left_date__date__range=[start_date, end_date])).distinct().annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit') - - elif start_date and not end_date: # Specific date - visitors = Visitor.objects.filter(Q(visitorlog__visit_date__date=start_date) | Q(visitorlog__left_date__date=start_date)).distinct().annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit') - - else: # Active visitors - visitors = Visitor.objects.filter(visitorlog__left_date__isnull=True).distinct().annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit') - - visitors_count = visitors.count() - visitors_data = [] - for visitor in visitors: - last_log_entry = VisitorLog.objects.filter(visitor=visitor).last() - visitor_data = { - "id": visitor.id, - "ip": visitor.ip_address, - "flag": visitor.flag_image_url, - "is_online": visitor.is_online, - "duration": visitor.total_duration, - "last_log": last_log_entry.title if last_log_entry else None, - "last_log_time": last_log_entry.visit_date if last_log_entry else None, - } - visitors_data.append(visitor_data) - - response_data = { - "count": visitors_count, - "visitors": visitors_data - } - - return successRes(response_data) - - - -@api_view(['GET']) -def get_staffs(request): - staffs = StaffProfile.objects.filter(user__is_active=True).all().order_by('user__first_name') - staffs_data = [] - for staff in staffs: - staff_data = { - "id": staff.user.id, - "first_name": staff.user.first_name, - "last_name": staff.user.last_name, - "image": staff.image.url, - "last_seen": get_chat_last_seen(staff.user) - } - staffs_data.append(staff_data) - - return successRes(staffs_data) - - - - -@api_view(['POST']) -def start_conversation(request): - try: - token_data = verify(request.headers.get("Authorization")) - user_id = token_data['userid'] - user = User.objects.get(id=user_id) - - start_with_id = request.data.get('start_with') - start_with = get_object_or_404(User, id=start_with_id) - - - existing_chat_room = ( - ChatRoom.objects.annotate(member_count=Count('chatmember')) - .filter(member_count=2) - .filter(chatmember__member=user) - .filter(chatmember__member=start_with) - .distinct() - .first() - ) - if existing_chat_room: - return successRes({'room_id': existing_chat_room.id}) - - else: - chat_title = ( - f"Chat created by {user.first_name} {user.last_name} " - f"with {start_with.first_name} {start_with.last_name} " - f"on {timezone.now()}" - ) - - room = ChatRoom.objects.create( - name=chat_title, - created_by=user, - date_created=timezone.now(), - type = 'DM' - ) - - ChatMember.objects.create( - member=user, - room=room, - date_joined=timezone.now() - ) - ChatMember.objects.create( - member=start_with, - room=room, - date_joined=timezone.now() - ) - - return successRes({'room_id': room.id}) - - - except TokenError as terr: - return errorRes(msg=str(terr), status=450) - except Exception as e: - return errorRes(str(e)) diff --git a/osinaweb/osichat/apps.py b/osinaweb/osichat/apps.py deleted file mode 100644 index 20395e7e..00000000 --- a/osinaweb/osichat/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class OsichatConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'osichat' diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py deleted file mode 100644 index 53738015..00000000 --- a/osinaweb/osichat/consumers.py +++ /dev/null @@ -1,973 +0,0 @@ -from channels.generic.websocket import WebsocketConsumer -from .models import * -import json -from django.template.loader import render_to_string -from asgiref.sync import async_to_sync -from django.shortcuts import get_object_or_404 -from django.forms.models import model_to_dict -from django.core.serializers.json import DjangoJSONEncoder -from django.db.models import Case, When, F, Max, DateTimeField -from django.db import transaction -import threading - - - -class OsitcomVisitor(WebsocketConsumer): - def connect(self): - async_to_sync(self.channel_layer.group_add)( - 'ositcom_visitors', self.channel_name - ) - self.accept() - self.visitor = None - - def disconnect(self, close_code): - if self.visitor: - self.current_log.left_date = datetime.now() - self.current_log.save() - async_to_sync(self.channel_layer.group_discard)( - 'ositcom_visitors', self.channel_name - ) - def receive(self, text_data): - text_data_json = json.loads(text_data) - event_type = text_data_json.get('event_type') - if event_type == 'visitor_ping': - session_id = text_data_json.get('session_id') - if Visitor.objects.filter(session_id=session_id).last(): - self.visitor = Visitor.objects.filter(session_id=session_id).last() - else: - self.visitor = Visitor.objects.create( - session_id = session_id, - ip_address = text_data_json.get('client_ip'), - country = text_data_json.get('client_country'), - region = text_data_json.get('client_region'), - browser_name = text_data_json.get('browser_name'), - os_name = text_data_json.get('os_name'), - ) - - self.current_log = VisitorLog.objects.create( - visitor = self.visitor, - referrer = text_data_json.get('referrer'), - title = text_data_json.get('title'), - url = text_data_json.get('url'), - visit_date = datetime.now() - ) - - - - - -class Osichat(WebsocketConsumer): - def connect(self): - self.user = self.scope["user"] - existing_connection = ChatConnection.objects.filter(user=self.user).last() - if existing_connection: - self.connection = existing_connection - self.connection.online = True - self.connection.disconnected = False - self.connection.save() - else: - self.connection = ChatConnection.objects.create(user=self.user, online=True) - async_to_sync(self.channel_layer.group_add)( - 'osichat', self.channel_name - ) - self.accept() - - def disconnect(self, close_code): - self.last_seen = datetime.now() - self.connection.disconnected = True - self.connection.save() - timer_thread = threading.Timer(3, self.check_disconnect_status) - timer_thread.start() - async_to_sync(self.channel_layer.group_discard)( - 'osichat', self.channel_name - ) - - def check_disconnect_status(self): - connection = ChatConnection.objects.filter(user=self.user).last() - if connection.disconnected: - self.connection.last_seen = self.last_seen - self.connection.online = False - self.connection.save() - - def receive(self, text_data): - data = json.loads(text_data) - event_type = data.get('event_type') - - if event_type == 'set_client_type': - self.client_type = data.get('client_type') - event = { - 'type': 'get_chats_handler', - } - if data.get('whereAmI') == 'Chats': - self.get_chats_handler(event) - else: - self.get_visitors_handler(event) - - if event_type == 'get_chats': - event = { - 'type': 'get_chats_handler', - } - self.get_chats_handler(event) - - - if event_type == 'get_dms': - event = { - 'type': 'get_dms_handler', - } - self.get_dms_handler(event) - - - if event_type == 'get_visitors': - event = { - 'type': 'get_visitors_handler', - } - self.get_visitors_handler(event) - - - def get_chats_handler(self, event): - chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'), - order_key=Case( - When(last_update__isnull=True, then=F('date_created')), - default=F('last_update'), - output_field=DateTimeField(),)).filter(chatroomguest__isnull=False).order_by('-order_key') - - for room in chat_rooms: - room.number_of_unread = room.unread_messages(self.user) - context = { - 'chat_rooms': chat_rooms, - } - - if self.client_type == 'mobile_admin': - chat_rooms_data = [] - for chat_room in chat_rooms: - last_message = ChatMessage.objects.filter(room=chat_room).last() - room_data = model_to_dict(chat_room) - room_data['number_of_unread'] = chat_room.unread_messages(self.user) - if last_message: - room_data['last_message'] = model_to_dict(last_message) - else: - room_data['last_message'] = None - if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor: - visitor = chat_room.chatroomguest.visitor - room_data['visitor'] = { - 'id': visitor.id, - 'session_id': visitor.session_id, - 'ip': visitor.ip_address, - 'country': visitor.country, - 'region' : visitor.region, - 'country_flag': visitor.flag_image_url, - 'name': visitor.name, - 'mobile_number': visitor.mobile_number, - } - chat_rooms_data.append(room_data) - - self.send(text_data=json.dumps({ - 'event_type': 'get_chats', - 'chat_rooms_data': chat_rooms_data, - }, cls=DjangoJSONEncoder)) - else: - html = render_to_string("chat_templates/partials/rooms.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'get_chats', - 'html': html, - })) - - - def new_chat_update_handler(self, event): - chat_room = get_object_or_404(ChatRoom, id=event['chatroom_id']) - number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=self.user).exclude(chatmessageseen__member=self.user).count() - last_message = ChatMessage.objects.filter(room=chat_room).last() - - context = { - 'chat_room': chat_room, - 'number_of_unread': number_of_unread - } - if self.client_type == 'mobile_admin': - chat_room_data = model_to_dict(chat_room) - if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor: - chat_room_data['visitor'] = model_to_dict(chat_room.chatroomguest.visitor) - if chat_room.chatmember_set.all(): - members = chat_room - member_data = [] - for member in members: - member_data.append({ - 'id': member.member.id, - 'first_name': member.member.first_name, - 'last_name': member.member.last_name, - 'online': get_chat_last_seen(member.member), - 'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None - - }) - chat_room_data['members'] = member_data - if last_message: - chat_room_data['last_message'] = model_to_dict(last_message) - else: - chat_room_data['last_message'] = None - self.send(text_data=json.dumps({ - 'event_type': 'new_chat_update', - 'chat_room_data': chat_room_data, - }, cls=DjangoJSONEncoder)) - else: - html = render_to_string("chat_templates/partials/new-chat-room.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'new_chat_update', - 'chatroom_id': chat_room.id, - 'user': last_message.member.id if last_message and last_message.member else None, - 'html': html, - })) - - - def get_dms_handler(self, event): - chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'),order_key=Case( - When(last_update__isnull=True, then=F('date_created')), - default=F('last_update'), - output_field=DateTimeField(),)).filter(chatroomguest__isnull=True, chatmember__member=self.user).order_by('-order_key') - context = { - 'chat_rooms': chat_rooms, - } - if self.client_type == 'mobile_admin': - chat_rooms_data = [] - if chat_rooms: - for chat_room in chat_rooms: - last_message = ChatMessage.objects.filter(room=chat_room).last() - chat_room_data = { - 'id': chat_room.id, - 'name': chat_room.name, - 'last_update': chat_room.last_updated, - 'date_created': chat_room.date_created, - 'unread_messages': chat_room.unread_messages(self.user), - 'last_message': model_to_dict(last_message) if last_message else None - } - members = chat_room.chatmember_set.all() - member_data = [] - for member in members: - member_data.append({ - 'id': member.member.id, - 'first_name': member.member.first_name, - 'last_name': member.member.last_name, - 'online': get_chat_last_seen(member.member), - 'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None - }) - - chat_room_data['members'] = member_data - chat_rooms_data.append(chat_room_data) - - self.send(text_data=json.dumps({ - 'event_type': 'get_dms', - 'chat_rooms_data': chat_rooms_data, - }, cls=DjangoJSONEncoder)) - - - def new_online_activity_handler(self, event): - connection = get_object_or_404(ChatConnection, id=event['connection_id']) - context = { - 'connection': connection, - } - if self.client_type == 'mobile_admin': - connection_data =[] - connection_data.append({ - 'user_id': connection.user.id, - 'online': connection.online, - 'last_seen': connection.last_seen - }) - self.send(text_data=json.dumps({ - 'event_type': 'new_online_activity', - 'connection_data': connection_data, - }, cls=DjangoJSONEncoder)) - - - def get_visitors_handler(self, event): - today = timezone.now().date() - visitors = Visitor.objects.filter(visitorlog__visit_date__date=today).annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit') - context = { - 'visitors': visitors, - } - if self.client_type == 'mobile_admin': - visitors_data = [] - for visitor in visitors: - visitor_data = model_to_dict(visitor) - visitor_data['is_online'] = visitor.is_online - visitor_data['duration'] = visitor.total_duration - visitor_data['flag'] = visitor.flag_image_url - - - visitor_logs = VisitorLog.objects.filter(visitor=visitor) - visitor_logs_data = [] - for log in visitor_logs: - log_data = model_to_dict(log) - log_data['log_duration'] = log.log_duration - visitor_logs_data.append(log_data) - - visitor_data['visitor_logs'] = visitor_logs_data - visitors_data.append(visitor_data) - - self.send(text_data=json.dumps({ - 'event_type': 'get_visitors', - 'visitors_data': visitors_data, - }, cls=DjangoJSONEncoder)) - - else: - html = render_to_string("chat_templates/partials/visitors.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'get_visitors', - 'html': html, - })) - - - def new_visitor_update_handler(self, event): - visitor = get_object_or_404(Visitor, id=event['visitor_id']) - latest_log = VisitorLog.objects.filter(visitor=visitor).last() - context = { - 'visitor': visitor, - } - if self.client_type == 'mobile_admin': - visitor_data = model_to_dict(visitor) - visitor_data['is_online'] = visitor.is_online - visitor_data['duration'] = visitor.total_duration - visitor_data['flag'] = visitor.flag_image_url - if latest_log: - latest_log_data = model_to_dict(latest_log) - latest_log_data['log_duration'] = latest_log.log_duration - visitor_data['latest_log'] = latest_log_data - - - - self.send(text_data=json.dumps({ - 'event_type': 'new_visitor_update', - 'visitor_data': visitor_data, - 'action': event['action'], - }, cls=DjangoJSONEncoder)) - else: - html = render_to_string("chat_templates/partials/new-visitor.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'new_visitor_update', - 'visitor_id': visitor.id, - 'action': event['action'], - 'html': html, - })) - - - - - -class OsichatVisitor(WebsocketConsumer): - def connect(self): - self.visitor_id = self.scope['url_route']['kwargs']['visitor_id'] - self.group_name = 'V' + str(self.visitor_id) - self.visitor = get_object_or_404(Visitor, id=self.visitor_id) - async_to_sync(self.channel_layer.group_add)( - self.group_name, self.channel_name - ) - self.accept() - - def disconnect(self, close_code): - async_to_sync(self.channel_layer.group_discard)( - self.group_name, self.channel_name - ) - - def receive(self, text_data): - data = json.loads(text_data) - event_type = data.get('event_type') - - if event_type == 'set_client_type': - self.client_type = data.get('client_type') - event = { - 'type': 'get_visitor_handler', - } - - async_to_sync(self.channel_layer.group_send)( - self.group_name, event - ) - - def get_visitor_handler(self, event): - if self.client_type == 'mobile_admin': - visitor_data = model_to_dict(self.visitor) - visitor_data['online'] = self.visitor.is_online - visitor_data['flag'] = self.visitor.flag_image_url - visitor_logs = VisitorLog.objects.filter(visitor=self.visitor) - visitor_logs_data = [] - for log in visitor_logs: - log_data = model_to_dict(log) - log_data['log_duration'] = log.log_duration - visitor_logs_data.append(log_data) - visitor_data['visitor_logs'] = visitor_logs_data - - self.send(text_data=json.dumps({ - 'event_type': 'get_visitor', - 'visitor_data': visitor_data, - }, cls=DjangoJSONEncoder)) - - def new_visitor_update_handler(self, event): - visitor = self.visitor - latest_log = VisitorLog.objects.filter(visitor=self.visitor).last() - if self.client_type == 'mobile_admin': - visitor_data = model_to_dict(visitor) - visitor_data['is_online'] = visitor.is_online - visitor_data['duration'] = visitor.total_duration - visitor_data['flag'] = visitor.flag_image_url - if latest_log: - latest_log_data = model_to_dict(latest_log) - latest_log_data['log_duration'] = latest_log.log_duration - visitor_data['latest_log'] = latest_log_data - self.send(text_data=json.dumps({ - 'event_type': 'new_visitor_update', - 'visitor_data': visitor_data, - 'action': event['action'], - }, cls=DjangoJSONEncoder)) - - - - - - -class OsitcomChatRoom(WebsocketConsumer): - def connect(self): - self.domain = 'https://osina.ositcom.com' - self.session_id = self.scope['url_route']['kwargs'].get('session_id') - if self.session_id: - self.visitor = Visitor.objects.filter(session_id=self.session_id).last() - if self.session_id and not self.visitor: - self.close() - - if self.scope['url_route']['kwargs'].get('chat_id'): #Case where admin is accessing a specific conversation between the conversations of this visitor - self.chat_room = get_object_or_404(ChatRoom, id=self.scope['url_route']['kwargs'].get('chat_id')) - else: - chat_room_guest = ChatRoomGuest.objects.filter(visitor=self.visitor).last() #Case where the visitor will always acesss his last conversation - if chat_room_guest: - self.chat_room = chat_room_guest.room - else: - self.chat_room = None - - if self.scope["user"].is_authenticated and self.chat_room: #If a user add him as a chat_member - self.chat_member = ChatMember.objects.filter(member=self.scope["user"]).last() - if not self.chat_member: - self.chat_member = ChatMember.objects.create( - room=self.chat_room, - member=self.scope["user"], - date_joined = datetime.now() - ) - - if self.chat_room: - self.group = f"chat_{self.chat_room.id}" - else: - self.group = self.session_id #Visitor hasn't started a chat yet, when he will we will remove him from this group and add it to the chat group - - async_to_sync(self.channel_layer.group_add)( - self.group, self.channel_name - ) - self.accept() - - - def disconnect(self, close_code): - async_to_sync(self.channel_layer.group_discard)( - self.group, self.channel_name - ) - - - - def receive(self, text_data): - text_data_json = json.loads(text_data) - event_type = text_data_json.get('event_type') - - if event_type == 'load_chat': - self.client_type = text_data_json.get('client_type') - event = { - 'reconnecting' : text_data_json.get('reconnecting') - } - self.load_chat_handler(event) - - if event_type == 'start_conversation': - try: - with transaction.atomic(): - chat_room = ChatRoom.objects.create( - name=f"Support: {self.session_id}", - date_created = datetime.now(), - type = 'Visitor Room' - ) - if text_data_json.get('guest_name'): - self.visitor.name = text_data_json.get('guest_name') - self.visitor.save() - if text_data_json.get('guest_mobile_number'): - self.visitor.mobile_number = text_data_json.get('guest_mobile_number') - self.visitor.save() - chat_room_guest = ChatRoomGuest.objects.create( - room=chat_room, - visitor=self.visitor - ) - self.chat_room = chat_room - async_to_sync(self.channel_layer.group_discard)( - self.group, self.channel_name - ) - self.group = f"chat_{self.chat_room.id}" - async_to_sync(self.channel_layer.group_add)( - self.group, self.channel_name - ) - event = { - 'type': 'start_conversation_handler', - 'chat_room_id': chat_room.id - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - except Exception as e: - print('Error starting conversation') - - - if event_type == 'typing': - event = { - 'type': 'typing_handler', - 'user_id': text_data_json.get('user_id'), - 'typing_status': text_data_json.get('typing_status') - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - if event_type == 'recording': - event = { - 'type': 'recording_handler', - 'user_id': text_data_json.get('user_id'), - 'recording_status': text_data_json.get('recording_status') - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - if event_type == 'send_message': - if text_data_json.get('user_id'): - member = get_object_or_404(User, id=text_data_json.get('user_id')) - else: - member = None - chat_message = ChatMessage.objects.create( - member = member, - room = self.chat_room, - content= text_data_json.get('message'), - date_sent = datetime.now() - ) - event = { - 'type': 'send_message_handler', - 'chat_message_id': chat_message.id - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - if event_type == 'uploaded_file': - if text_data_json.get('user_id'): - member = get_object_or_404(User, id=text_data_json.get('user_id')) - else: - member = None - message = ChatMessage.objects.create( - member = member, - room = self.chat_room, - date_sent = datetime.now() - ) - message_attachment = ChatMessageAttachment.objects.create( - message = message, - attachment = text_data_json.get('path'), - ) - event = { - 'type': 'uploaded_file_handler', - 'message_attachment_id': message_attachment.id, - 'file_type': text_data_json.get('file_type'), - 'file_name': text_data_json.get('file_name'), - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - if event_type == 'update_read_messages' and self.chat_room: - latest_unread_message = None - number_of_unread = 0 - if text_data_json.get('user_id'): - member = get_object_or_404(User, id=text_data_json.get('user_id')) - guest = None - if text_data_json.get('chat_state') == 'open': - messages = ChatMessage.objects.filter(room=self.chat_room).exclude(member=member) - for message in messages: - seen_message = ChatMessageSeen.objects.filter( - message=message, - member=member - ).exists() - - if not seen_message: - ChatMessageSeen.objects.create( - message=message, - member=member, - seen_date = datetime.now() - ) - number_of_unread = 0 - else: - number_of_unread = ChatMessage.objects.filter(room=self.chat_room).exclude(member = member).exclude(hatmessageseen__member=member).count() - latest_unread_message = ChatMessage.objects.filter(room=self.chat_room).exclude(chatmessageseen__member=member).last() - else: - member = None - guest = self.chat_room.chatroomguest - if text_data_json.get('chat_state') == 'open': - messages = ChatMessage.objects.filter(room=self.chat_room).exclude(member=None) - for message in messages: - seen_message = ChatMessageSeen.objects.filter( - message=message, - guest=guest - ).exists() - - if not seen_message: - ChatMessageSeen.objects.create( - message=message, - guest=guest, - seen_date = datetime.now() - ) - - number_of_unread = 0 - - else: - number_of_unread = ChatMessage.objects.filter(room=self.chat_room, member__isnull=False).exclude(chatmessageseen__guest=guest).count() - latest_unread_message = ChatMessage.objects.filter(room=self.chat_room, member__isnull=False).exclude(chatmessageseen__guest=guest).last() - - event = { - 'type': 'update_read_messages_handler', - 'number_of_unread': number_of_unread, - 'latest_unread_message_id': latest_unread_message.id if latest_unread_message else None - } - self.update_read_messages_handler(event) - - if event_type == 'end_chat': - event = { - 'type': 'end_chat_handler', - 'user_id': text_data_json.get('user_id') - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - if event_type == 'submit_review': - if ChatRoomReview.objects.filter(room=self.chat_room).last(): - review = ChatRoomReview.objects.filter(room=self.chat_room).last() - if text_data_json.get('reaction'): - review.reaction = text_data_json.get('reaction') - if text_data_json.get('details'): - review.details = text_data_json.get('details') - review.save() - else: - review = ChatRoomReview.objects.create( - room = self.chat_room, - reaction = text_data_json.get('reaction'), - details = text_data_json.get('details'), - ) - event = { - 'type': 'submit_review_handler', - 'review_id': review.id - } - async_to_sync(self.channel_layer.group_send)( - self.group, event - ) - - - - - - - def load_chat_handler(self, event): - if self.chat_room: - chat_room = self.chat_room - chat_room_messages = ChatMessage.objects.filter(room=chat_room).order_by('date_sent') - review = ChatRoomReview.objects.filter(room=chat_room).last() - - else: - chat_room = None - chat_room_messages = None - review = None - - context = { - 'chat_room': chat_room, - 'chat_room_messages': chat_room_messages, - 'review': review, - 'domain': self.domain - } - - if self.client_type == 'mobile_admin': - chat_room_data = model_to_dict(chat_room) - if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor: - chat_room_data['visitor'] = { - 'id': chat_room.chatroomguest.visitor.id, - 'country_flag': chat_room.chatroomguest.visitor.flag_image_url, - 'is_online': chat_room.chatroomguest.visitor.is_online, - 'ip': chat_room.chatroomguest.visitor.ip_address, - 'name': chat_room.chatroomguest.visitor.name, - 'mobile_number': chat_room.chatroomguest.visitor.mobile_number, - } - - chat_members = ChatMember.objects.filter(room=chat_room) - if chat_members.exists(): - chat_room_data['members'] = [ - { - 'id': member.member.id, - 'first_name': member.member.first_name, - 'last_name': member.member.last_name, - 'online': get_chat_last_seen(member.member), - 'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None - - } - for member in chat_members - ] - else: - chat_room_data['members'] = [] - - - - chat_room_messages_data = [] - for message in chat_room_messages: - message_data = model_to_dict(message) - attachment = getattr(message, 'chatmessageattachment', None) - member = message.member - if member: - message_data['member'] = { - 'id': member.id, - 'first_name': member.first_name, - 'last_name': member.last_name, - 'image': member.staffprofile.image.url if member.staffprofile and member.staffprofile.image else None - } - if attachment: - message_data['attachment'] = { - 'attachment': attachment.attachment, - 'is_image': attachment.is_image(), - 'file_name': attachment.file_name, - } - else: - message_data['attachment'] = None - - chat_room_messages_data.append(message_data) - - self.send(text_data=json.dumps({ - 'event_type': 'load_chat', - 'chat_room_data': chat_room_data, - 'chat_room_messages_data': chat_room_messages_data, - }, cls=DjangoJSONEncoder)) - - elif self.client_type == 'website_admin': - html = render_to_string("chat_templates/chat-room.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'load_chat', - 'html': html, - })) - else: - if event.get('reconnecting') == 'False': #Connecting for the first time - html = render_to_string("chat-widget.html", context=context) - else: - if chat_room: - if chat_room.date_terminated: - html = render_to_string("ended-chat.html", context=context) - else: - html = render_to_string("chat-room.html", context=context) - else: - html = render_to_string("start-chat.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'load_chat', - 'html': html, - })) - - - def start_conversation_handler(self, event): - chat_room = get_object_or_404(ChatRoom, id=event['chat_room_id']) - context = { - 'chat_room': chat_room, - 'session_id':self.session_id, - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - self.send(text_data=json.dumps({ - 'event_type': 'start_conversation', - 'context': context, - })) - else: - html = render_to_string("chat-room.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'start_conversation', - 'html': html, - })) - - - def typing_handler(self, event): - if event.get('typing_status') == 'typing': - if event.get('user_id'): - member = get_object_or_404(User, id=event.get('user_id')) - else: - member = None - - context = { - 'member': member, - 'chat_room': self.chat_room, - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - member_data = None - if member: - member_data = model_to_dict(member) - member_data['image'] = member.staffprofile.image.url if member.staffprofile and member.staffprofile.image else None - self.send(text_data=json.dumps({ - 'event_type': 'typing', - 'member_data': member_data, - }, cls=DjangoJSONEncoder)) - elif self.client_type == 'website_admin': - html = render_to_string("chat_templates/partials/typing.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'typing', - 'user': member.id if member else None, - 'html': html, - })) - else: - html = render_to_string("partials/typing.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'typing', - 'user': member.id if member else None, - 'html': html, - })) - else: - self.send(text_data=json.dumps({ - 'event_type': 'stopped_typing', - })) - - - def recording_handler(self, event): - if event.get('recording_status') == 'recording': - if event.get('user_id'): - member = get_object_or_404(User, id=event.get('user_id')) - else: - member = None - - context = { - 'member': member, - 'chat_room': self.chat_room, - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - member_data = None - if member: - member_data = model_to_dict(member) - member_data['image'] = member.staffprofile.image.url if member.staffprofile and member.staffprofile.image else None - self.send(text_data=json.dumps({ - 'event_type': 'recording', - 'member_data': member_data, - }, cls=DjangoJSONEncoder)) - - else: - self.send(text_data=json.dumps({ - 'event_type': 'stopped_recording', - })) - - - def send_message_handler(self, event): - chat_message = get_object_or_404(ChatMessage, id=event['chat_message_id']) - context = { - 'chat_message': chat_message, - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - chat_message_data = model_to_dict(chat_message) - member = chat_message.member - if member: - chat_message_data['member'] = { - 'id': member.id, - 'first_name': member.first_name, - 'last_name': member.last_name, - 'image': member.staffprofile.image.url if member.staffprofile and member.staffprofile.image else None - } - self.send(text_data=json.dumps({ - 'event_type': 'send_message', - 'chat_message_data': chat_message_data, - },cls=DjangoJSONEncoder)) - elif self.client_type == 'website_admin': - html = render_to_string("chat_templates/partials/message.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'send_message', - 'user': chat_message.member.id if chat_message.member else None, - 'html': html, - })) - else: - html = render_to_string("partials/message.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'send_message', - 'user': chat_message.member.id if chat_message.member else None, - 'html': html, - })) - - - def uploaded_file_handler(self, event): - message_attachment = get_object_or_404(ChatMessageAttachment, id=event['message_attachment_id']) - context = { - 'message_attachment': message_attachment, - 'file_type': event['file_type'], - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - message_attachment_data = model_to_dict(message_attachment) - self.send(text_data=json.dumps({ - 'event_type': 'uploaded_file', - 'message_attachment_data': message_attachment_data, - 'user': message_attachment.message.member.id if message_attachment.message.member else None, - 'file_type': event['file_type'] - },cls=DjangoJSONEncoder)) - else: - html = render_to_string("partials/message-attachment.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'uploaded_file', - 'file_name': event['file_name'], - 'user': message_attachment.message.member.id if message_attachment.message.member else None, - 'html': html, - })) - - - def update_read_messages_handler(self, event): - latest_unread_message_id = event.get('latest_unread_message_id') - if latest_unread_message_id: - latest_unread_message = get_object_or_404(ChatMessage, id=latest_unread_message_id) - context = { - 'number_of_unread' : event['number_of_unread'], - 'latest_unread_message': latest_unread_message, - 'domain': self.domain - } - if self.client_type == 'mobile_admin': - self.send(text_data=json.dumps({ - 'event_type': 'update_read_messages', - 'number_of_unread': event['number_of_unread'], - },cls=DjangoJSONEncoder)) - else: - html = render_to_string("partials/unread-messages.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'update_read_messages', - 'html': html, - })) - else: - latest_unread_message = None - - - def end_chat_handler(self, event): - if event['user_id']: - member = get_object_or_404(User, id=event['user_id']) - else: - member = None - self.chat_room.date_terminated = datetime.now() - self.chat_room.terminated_by = member - self.chat_room.save() - context = { - 'chat_room': self.chat_room, - 'chat_room_messages': ChatMessage.objects.filter(room=self.chat_room).order_by('date_sent'), - 'domain': self.domain - } - html = render_to_string("ended-chat.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'ended_chat', - 'html': html, - })) - - def submit_review_handler(self, event): - review = get_object_or_404(ChatRoomReview, id=event['review_id']) - context = { - 'review': review, - 'chat_room': self.chat_room, - } - html = render_to_string("partials/submitted-review.html", context=context) - self.send(text_data=json.dumps({ - 'event_type': 'submit_review', - 'html': html, - })) \ No newline at end of file diff --git a/osinaweb/osichat/migrations/0001_initial.py b/osinaweb/osichat/migrations/0001_initial.py deleted file mode 100644 index c7ba5ad5..00000000 --- a/osinaweb/osichat/migrations/0001_initial.py +++ /dev/null @@ -1,79 +0,0 @@ -# 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/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.py b/osinaweb/osichat/migrations/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.py deleted file mode 100644 index 8151bdcb..00000000 --- a/osinaweb/osichat/migrations/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 08:19 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='chatroom', - name='guest_session', - field=models.CharField(blank=True, max_length=300, null=True), - ), - migrations.AlterField( - model_name='chatroom', - name='created_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='chatroom', - name='name', - field=models.CharField(max_length=300), - ), - ] diff --git a/osinaweb/osichat/migrations/0003_chatroomguest_remove_chatroom_guest_session.py b/osinaweb/osichat/migrations/0003_chatroomguest_remove_chatroom_guest_session.py deleted file mode 100644 index 6c011c6f..00000000 --- a/osinaweb/osichat/migrations/0003_chatroomguest_remove_chatroom_guest_session.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 08:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0002_chatroom_guest_session_alter_chatroom_created_by_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='ChatRoomGuest', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=300)), - ('mobile_number', models.CharField(max_length=100)), - ('session_id', models.CharField(max_length=300)), - ], - ), - migrations.RemoveField( - model_name='chatroom', - name='guest_session', - ), - ] diff --git a/osinaweb/osichat/migrations/0004_chatroomguest_room.py b/osinaweb/osichat/migrations/0004_chatroomguest_room.py deleted file mode 100644 index c8401fcf..00000000 --- a/osinaweb/osichat/migrations/0004_chatroomguest_room.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 08:29 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0003_chatroomguest_remove_chatroom_guest_session'), - ] - - operations = [ - migrations.AddField( - model_name='chatroomguest', - name='room', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom'), - ), - ] diff --git a/osinaweb/osichat/migrations/0005_alter_chatmessage_member.py b/osinaweb/osichat/migrations/0005_alter_chatmessage_member.py deleted file mode 100644 index 2b06a3a8..00000000 --- a/osinaweb/osichat/migrations/0005_alter_chatmessage_member.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 12:36 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0004_chatroomguest_room'), - ] - - operations = [ - migrations.AlterField( - model_name='chatmessage', - name='member', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0006_alter_chatmessage_content.py b/osinaweb/osichat/migrations/0006_alter_chatmessage_content.py deleted file mode 100644 index bb152113..00000000 --- a/osinaweb/osichat/migrations/0006_alter_chatmessage_content.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 12:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0005_alter_chatmessage_member'), - ] - - operations = [ - migrations.AlterField( - model_name='chatmessage', - name='content', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0007_chatmessage_room.py b/osinaweb/osichat/migrations/0007_chatmessage_room.py deleted file mode 100644 index 0b87e7cc..00000000 --- a/osinaweb/osichat/migrations/0007_chatmessage_room.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 13:04 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0006_alter_chatmessage_content'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessage', - name='room', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom'), - ), - ] diff --git a/osinaweb/osichat/migrations/0008_alter_chatmessage_room.py b/osinaweb/osichat/migrations/0008_alter_chatmessage_room.py deleted file mode 100644 index bdf29a24..00000000 --- a/osinaweb/osichat/migrations/0008_alter_chatmessage_room.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-20 13:44 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0007_chatmessage_room'), - ] - - operations = [ - migrations.AlterField( - model_name='chatmessage', - name='room', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom'), - ), - ] diff --git a/osinaweb/osichat/migrations/0009_visitor.py b/osinaweb/osichat/migrations/0009_visitor.py deleted file mode 100644 index 3d3703b5..00000000 --- a/osinaweb/osichat/migrations/0009_visitor.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-21 16:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0008_alter_chatmessage_room'), - ] - - operations = [ - migrations.CreateModel( - name='Visitor', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('session_id', models.CharField(max_length=300)), - ('ip_address', models.CharField(max_length=300)), - ('url', models.URLField()), - ('reference', models.URLField()), - ], - ), - ] diff --git a/osinaweb/osichat/migrations/0010_visitor_left_date_visitor_visit_date.py b/osinaweb/osichat/migrations/0010_visitor_left_date_visitor_visit_date.py deleted file mode 100644 index 7bfd2f64..00000000 --- a/osinaweb/osichat/migrations/0010_visitor_left_date_visitor_visit_date.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-21 16:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0009_visitor'), - ] - - operations = [ - migrations.AddField( - model_name='visitor', - name='left_date', - field=models.DateTimeField(null=True), - ), - migrations.AddField( - model_name='visitor', - name='visit_date', - field=models.DateTimeField(null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0011_visitor_country.py b/osinaweb/osichat/migrations/0011_visitor_country.py deleted file mode 100644 index 6fde18b2..00000000 --- a/osinaweb/osichat/migrations/0011_visitor_country.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-21 17:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0010_visitor_left_date_visitor_visit_date'), - ] - - operations = [ - migrations.AddField( - model_name='visitor', - name='country', - field=models.CharField(max_length=15, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0012_alter_visitor_reference.py b/osinaweb/osichat/migrations/0012_alter_visitor_reference.py deleted file mode 100644 index 1935ef65..00000000 --- a/osinaweb/osichat/migrations/0012_alter_visitor_reference.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-21 17:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0011_visitor_country'), - ] - - operations = [ - migrations.AlterField( - model_name='visitor', - name='reference', - field=models.URLField(blank=True, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0013_rename_reference_visitor_referrer.py b/osinaweb/osichat/migrations/0013_rename_reference_visitor_referrer.py deleted file mode 100644 index e2e6ae48..00000000 --- a/osinaweb/osichat/migrations/0013_rename_reference_visitor_referrer.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-21 19:58 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0012_alter_visitor_reference'), - ] - - operations = [ - migrations.RenameField( - model_name='visitor', - old_name='reference', - new_name='referrer', - ), - ] diff --git a/osinaweb/osichat/migrations/0014_alter_chatmessageattachment_message.py b/osinaweb/osichat/migrations/0014_alter_chatmessageattachment_message.py deleted file mode 100644 index e8806e07..00000000 --- a/osinaweb/osichat/migrations/0014_alter_chatmessageattachment_message.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-29 18:19 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0013_rename_reference_visitor_referrer'), - ] - - operations = [ - migrations.AlterField( - model_name='chatmessageattachment', - name='message', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage'), - ), - ] diff --git a/osinaweb/osichat/migrations/0015_chatmessageseen_guest_alter_chatmessageseen_member.py b/osinaweb/osichat/migrations/0015_chatmessageseen_guest_alter_chatmessageseen_member.py deleted file mode 100644 index 4cdd9f56..00000000 --- a/osinaweb/osichat/migrations/0015_chatmessageseen_guest_alter_chatmessageseen_member.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-31 06:57 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0014_alter_chatmessageattachment_message'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessageseen', - name='guest', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroomguest'), - ), - migrations.AlterField( - model_name='chatmessageseen', - name='member', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0016_chatmessageseen_seen_date.py b/osinaweb/osichat/migrations/0016_chatmessageseen_seen_date.py deleted file mode 100644 index f355b5d2..00000000 --- a/osinaweb/osichat/migrations/0016_chatmessageseen_seen_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-07-31 07:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0015_chatmessageseen_guest_alter_chatmessageseen_member'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessageseen', - name='seen_date', - field=models.DateTimeField(null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0017_chatroom_date_terminated_chatroom_terminated_by.py b/osinaweb/osichat/migrations/0017_chatroom_date_terminated_chatroom_terminated_by.py deleted file mode 100644 index 58229955..00000000 --- a/osinaweb/osichat/migrations/0017_chatroom_date_terminated_chatroom_terminated_by.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-01 16:49 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0016_chatmessageseen_seen_date'), - ] - - operations = [ - migrations.AddField( - model_name='chatroom', - name='date_terminated', - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='chatroom', - name='terminated_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='terminated_chatrooms', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.py b/osinaweb/osichat/migrations/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.py deleted file mode 100644 index 1682ddf3..00000000 --- a/osinaweb/osichat/migrations/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.py +++ /dev/null @@ -1,72 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-02 19:36 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0017_chatroom_date_terminated_chatroom_terminated_by'), - ] - - operations = [ - migrations.CreateModel( - name='VisitorLog', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url', models.URLField()), - ('referrer', models.URLField(blank=True, null=True)), - ('visit_date', models.DateTimeField(null=True)), - ('left_date', models.DateTimeField(null=True)), - ], - ), - migrations.RemoveField( - model_name='chatroomguest', - name='mobile_number', - ), - migrations.RemoveField( - model_name='chatroomguest', - name='name', - ), - migrations.RemoveField( - model_name='chatroomguest', - name='session_id', - ), - migrations.RemoveField( - model_name='visitor', - name='left_date', - ), - migrations.RemoveField( - model_name='visitor', - name='referrer', - ), - migrations.RemoveField( - model_name='visitor', - name='url', - ), - migrations.RemoveField( - model_name='visitor', - name='visit_date', - ), - migrations.AddField( - model_name='chatroomguest', - name='visitor', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.visitor'), - ), - migrations.AddField( - model_name='visitor', - name='email', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='visitor', - name='mobile_number', - field=models.CharField(blank=True, max_length=10, null=True), - ), - migrations.AddField( - model_name='visitor', - name='name', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0019_visitorlog_visitor.py b/osinaweb/osichat/migrations/0019_visitorlog_visitor.py deleted file mode 100644 index a5beeaf0..00000000 --- a/osinaweb/osichat/migrations/0019_visitorlog_visitor.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-02 20:01 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0018_visitorlog_remove_chatroomguest_mobile_number_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='visitorlog', - name='visitor', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.visitor'), - ), - ] diff --git a/osinaweb/osichat/migrations/0020_chatroomreview.py b/osinaweb/osichat/migrations/0020_chatroomreview.py deleted file mode 100644 index e5e00716..00000000 --- a/osinaweb/osichat/migrations/0020_chatroomreview.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-03 08:33 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0019_visitorlog_visitor'), - ] - - operations = [ - migrations.CreateModel( - name='ChatRoomReview', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('reaction', models.CharField(choices=[('Happy', 'Happy'), ('Indifferent', 'Indifferent'), ('Sad', 'Sad')], max_length=50, null=True)), - ('room', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom')), - ], - ), - ] diff --git a/osinaweb/osichat/migrations/0021_chatroomreview_details.py b/osinaweb/osichat/migrations/0021_chatroomreview_details.py deleted file mode 100644 index c15385cd..00000000 --- a/osinaweb/osichat/migrations/0021_chatroomreview_details.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-03 08:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0020_chatroomreview'), - ] - - operations = [ - migrations.AddField( - model_name='chatroomreview', - name='details', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0022_visitorlog_title.py b/osinaweb/osichat/migrations/0022_visitorlog_title.py deleted file mode 100644 index 7f169dab..00000000 --- a/osinaweb/osichat/migrations/0022_visitorlog_title.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-09 08:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0021_chatroomreview_details'), - ] - - operations = [ - migrations.AddField( - model_name='visitorlog', - name='title', - field=models.CharField(blank=True, max_length=500, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0023_visitor_browser_name_visitor_os_name.py b/osinaweb/osichat/migrations/0023_visitor_browser_name_visitor_os_name.py deleted file mode 100644 index 7eb396a9..00000000 --- a/osinaweb/osichat/migrations/0023_visitor_browser_name_visitor_os_name.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-09 09:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0022_visitorlog_title'), - ] - - operations = [ - migrations.AddField( - model_name='visitor', - name='browser_name', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='visitor', - name='os_name', - field=models.CharField(blank=True, max_length=100, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0024_chatotification.py b/osinaweb/osichat/migrations/0024_chatotification.py deleted file mode 100644 index 42ec0d60..00000000 --- a/osinaweb/osichat/migrations/0024_chatotification.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-13 06:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0023_visitor_browser_name_visitor_os_name'), - ] - - operations = [ - migrations.CreateModel( - name='Chatotification', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('message', models.TextField()), - ('image', models.TextField(blank=True, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ], - ), - ] diff --git a/osinaweb/osichat/migrations/0025_rename_chatotification_chatnotification.py b/osinaweb/osichat/migrations/0025_rename_chatotification_chatnotification.py deleted file mode 100644 index 40228beb..00000000 --- a/osinaweb/osichat/migrations/0025_rename_chatotification_chatnotification.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-13 06:49 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0024_chatotification'), - ] - - operations = [ - migrations.RenameModel( - old_name='Chatotification', - new_name='ChatNotification', - ), - ] diff --git a/osinaweb/osichat/migrations/0026_visitor_region.py b/osinaweb/osichat/migrations/0026_visitor_region.py deleted file mode 100644 index 8f6388d7..00000000 --- a/osinaweb/osichat/migrations/0026_visitor_region.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-14 08:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0025_rename_chatotification_chatnotification'), - ] - - operations = [ - migrations.AddField( - model_name='visitor', - name='region', - field=models.CharField(max_length=25, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0027_chatnotification_type.py b/osinaweb/osichat/migrations/0027_chatnotification_type.py deleted file mode 100644 index 36c0817f..00000000 --- a/osinaweb/osichat/migrations/0027_chatnotification_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-08-17 11:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0026_visitor_region'), - ] - - operations = [ - migrations.AddField( - model_name='chatnotification', - name='type', - field=models.CharField(choices=[('Visitor', 'Visitor'), ('Chat', 'Chat')], max_length=8, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0028_chatnotification_type_id.py b/osinaweb/osichat/migrations/0028_chatnotification_type_id.py deleted file mode 100644 index 3676f028..00000000 --- a/osinaweb/osichat/migrations/0028_chatnotification_type_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-09-03 09:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0027_chatnotification_type'), - ] - - operations = [ - migrations.AddField( - model_name='chatnotification', - name='type_id', - field=models.IntegerField(null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0029_chatnotification_session_id.py b/osinaweb/osichat/migrations/0029_chatnotification_session_id.py deleted file mode 100644 index 3a7ede4c..00000000 --- a/osinaweb/osichat/migrations/0029_chatnotification_session_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2024-09-06 06:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0028_chatnotification_type_id'), - ] - - operations = [ - migrations.AddField( - model_name='chatnotification', - name='session_id', - field=models.CharField(max_length=200, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/0030_chatnotification_users.py b/osinaweb/osichat/migrations/0030_chatnotification_users.py deleted file mode 100644 index c5f67cab..00000000 --- a/osinaweb/osichat/migrations/0030_chatnotification_users.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-01 16:25 - -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0029_chatnotification_session_id'), - ] - - operations = [ - migrations.AddField( - model_name='chatnotification', - name='users', - field=models.ManyToManyField(null=True, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0031_alter_chatnotification_users.py b/osinaweb/osichat/migrations/0031_alter_chatnotification_users.py deleted file mode 100644 index 19f65e72..00000000 --- a/osinaweb/osichat/migrations/0031_alter_chatnotification_users.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-01 16:25 - -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0030_chatnotification_users'), - ] - - operations = [ - migrations.AlterField( - model_name='chatnotification', - name='users', - field=models.ManyToManyField(blank=True, null=True, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0032_remove_chatnotification_users_chatnotification_user.py b/osinaweb/osichat/migrations/0032_remove_chatnotification_users_chatnotification_user.py deleted file mode 100644 index d5fb4201..00000000 --- a/osinaweb/osichat/migrations/0032_remove_chatnotification_users_chatnotification_user.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-01 16:40 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0031_alter_chatnotification_users'), - ] - - operations = [ - migrations.RemoveField( - model_name='chatnotification', - name='users', - ), - migrations.AddField( - model_name='chatnotification', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/osinaweb/osichat/migrations/0033_chatconnection.py b/osinaweb/osichat/migrations/0033_chatconnection.py deleted file mode 100644 index 2da68df5..00000000 --- a/osinaweb/osichat/migrations/0033_chatconnection.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-03 12:27 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osichat', '0032_remove_chatnotification_users_chatnotification_user'), - ] - - operations = [ - migrations.CreateModel( - name='ChatConnection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateTimeField(null=True)), - ('online', models.BooleanField(default=True)), - ('last_seen', models.DateTimeField(blank=True, null=True)), - ('disconnected', models.BooleanField(default=False)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py b/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py deleted file mode 100644 index 86678620..00000000 --- a/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-07 07:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0033_chatconnection'), - ] - - operations = [ - migrations.AddField( - model_name='chatroom', - name='group', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='chatroom', - name='visitor', - field=models.BooleanField(default=False), - ), - ] diff --git a/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py b/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py deleted file mode 100644 index f0272d2b..00000000 --- a/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.5 on 2024-10-07 07:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osichat', '0034_chatroom_group_chatroom_visitor'), - ] - - operations = [ - migrations.RemoveField( - model_name='chatroom', - name='group', - ), - migrations.RemoveField( - model_name='chatroom', - name='visitor', - ), - migrations.AddField( - model_name='chatroom', - name='type', - field=models.CharField(choices=[('DM', 'DM'), ('DM Group', 'DM Group'), ('Visitor Room', 'Visitor Room')], max_length=15, null=True), - ), - ] diff --git a/osinaweb/osichat/migrations/__init__.py b/osinaweb/osichat/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 20901b8c3b1fcaf7a9f9e6a5332639c6d8243093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 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 diff --git a/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0001_initial.cpython-312.pyc deleted file mode 100644 index 2c6ed233aa3970a5cc5d28d2bca77893e8264544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4896 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 diff --git a/osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-311.pyc deleted file mode 100644 index d47bd2da1bd6cf3a6ed53d67d6512bcc99849781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1544 zcmah}&2QsG6d!-YvE792no1Rdh23pg8icCSBSMIPfaF2`u|^PqCGrYO9&9_$6DD(Wi*0KOj<~ zO1E4%Isnf{@a4@e6J-$5!c`kEeFAO5C^+H1ZXrnWpm;I*3 z%GoE9h>0RwBFL6y1na5AKw9c*1wMdrNATs1NUm&`v(fs*CKClLMmJ+ZScytXL_OB7 z#(iAAs%Kt`cz_S0XI?53zba8_wfjn;cZ~_UF+tM>x*YSdaR7Tcn(XI)S2nN3Upk(; zy6@{AT*bagDv*ULHy#v}1OMeP@;WP<#HS{!B9@iV={6@XG^%-t%Hon9U9BZgsh4XnK%L5xWD7D zOy_3Zk7uEBeL61d-_RL2MbCe_ z|3Rx6Q5Ll}oY?VO4+FZwyzgjhg+@=}u-}4A1WqfUyBWwA$c?+SEr7^L>*Bn$AY;q8 zNEE)3C+vv0FFG%n$4)?iMn)I=drTbIOo+1)r6BevPpTnf;YTyk-#OHig^y44dZO1y z`dnI4X0-kFw1SK`MEC2X**l|~w@239r}q-;?%~WIbI(?W*4l}+mRM_PSvAa41mawX z)I`RcV%Du})~%5>CuYqZ&i}sk?5jT?Cyi#(_$Fz%Lq9%8aQ8H1i0ai<`81PY0{q`T zXD5+#hSu_lwVYVX*JsR5TiX8T;$d$W6x4J+m6N{M34`staE!5qw6hw^>*KYFaWTKK z7K;jCZx!Cyyg-@rdw`znALga|5qlR@aXm#bh*Xgz37D4d4AJe&?+7gnU-phJ4NJ9I WNlVd-;;ETT&!38p^Oy8yQT+=}?T?!P diff --git a/osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0002_chatroom_guest_session_alter_chatroom_created_by_and_more.cpython-312.pyc deleted file mode 100644 index cb6b3d6fbf03ab6fb7db3f468d66590564a4d558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 zcma)6O>f*p7#@GF?d(Eoq6XBaq}kBMh-TBC5o$ynzS1DI*-G`HBk#_{@#2r|*sHKN zD)qpzH{c%xB?pci%LNWxuqfKqaNy7rw?#>X)DtuIx|^z7i8;(X?}s11exG;zYprGg zw(g(&yn7%4@Pr%XQpVu;CIjC91dtGbP;dl+V=)jz$&o_Yk#k!L6h{@oM*ztW08+5j zd95UxoQLckd^wfAWT}61XbDtHaGLs&mslb-Lf<29>c>$+)i6dlNVeNNuUs=@aQv;n ztHQt$5O72hus3RD(&WTSr#i7pbjY6N3kja+RPtwM3(x5tiAZ8Gy)$>(TVNz31<6Nh z`9(*S66I`Xr#vAdEoXakN=!yFu65489O;--d>5wp7GL&F|MnyOP%d)+SIx#NJD?oR zlzp5qd6ILcU$tsfzflUwRIS8`-`;amT3uUPy9)itPklF_8uyVn4r$Hn;Ut9#P7)^l zj{hDL$dahi3f$-mHWcocFu;+Q?om1F1px~g`EbC<4KefaUD@?um|7#*S^vq#DerAfyI_jJg+KhN}?X>$w4^hmi2L(Ya*b z?RMQ3izD2{5yDZsPxxHZ*VmgnAH(J?`zE~c`G&nktIsohoKS5Yp-o;Q;WvxwAMUv% zx2drnq`1VJF~PnUeTMr~MIATtVk)8*)$-a|bEtO9-htcAtu1QAT|B-l--BaD3Z8w} zXeO8>4c73q9fysLxZMkJlqQXBH+6$P4@B;jg18ak{oEd#Io`)Dp2VeTOfF-C33m;a zdchauf-WzA5}XJC-3YO661>{&lM1UZ-}p66{$Se!Fj9fO^0hJ0E@#^118uN!JzKf{ zyS6^m>LW#(Q@`38Re^qpZufne~I^A9fzy{^ib3cLsJdvzr6^Zf4&d*j{FPzXj>Pfc@NT z@t@*20pN{I@fED|rz>bbHm?J47N_{2|G+FQRGsGapK(Vyv0$LK&DN2$M2h@_8(Fp_MC1H#y(>k$_B6`pke)%Y0 zfb*{;kyR5A$pu7qC89LddRk5Hnyod^)TZXb_lx1mwoG)s*UaSCXI_oss!gN*&gq zK@ZUcQbZ}|_%OW9S+EpVXhj}=!rAw}gb~6)a?DiRiz03^(k_75>maTZbKxjNkv>{jFO6WDN_I=uhc zwzJR5mmVRaOyBbT9g#H=uZopEKK4i|Gh-`CP>y$Eg2Djrp+3|6&pjN(O!iw$Ps`!= z#dOy>ga?iNeP+a6ls}Yf5YmJ{nl|*3goLeLf+){fH0?S60Q=r2{Z?Jan4}I%QUl|vas`mB%xSZN= z4D}ml3pdZME}xl;BeOO%Yp2y;R-SGT%uinw)sitbQop64zLfecrG6_zbLDjP=fkHD zo;~{Q(a32GoW{s`Ja8V5oM7MtzemZx0CXfresQ_X@5oalE=*2t56nB6&%&IkeX~o} z^2#ioUCHipy&dDDtXE1G8o!mcRn`*kUMknK-`;voIuTDiyDY(I7Tn^9=^tk8`w@Ac qi{gJqh3{CAB<%wLih~KiYz%eP@j3RtIydF98?Q7_R`xi+Ga& diff --git a/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-310.pyc deleted file mode 100644 index 71ee9c2362f19786a9ea9590d090991464f73ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmY*YOK;RL5VoD{Bl{@jA*l00XD}i2T>6 zk-@Y=ki(fwOOS;&==z%!x=*1yKGF#V@3)Zq|zI`U?#`DCT;vRrZR?-u5(HMB}vD&6Ih+hjQ=Z|G_5DvW+Djxg$=-i7suZguUK3)R=D^UV5;%i>}1A2Z$>F#rGn diff --git a/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-311.pyc deleted file mode 100644 index 5a791f13ddecb682e9abe471741a1ca760576f33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1343 zcmZuw&2JM&6rWwMH{P|K+G(ieLu+ax)I}9U;S_{On?xY05+uG3uBFl1GcjxS!<|_h z(o+r`dgKPjN|jPo}HJudE@BQA}f2vgz z0gZqAdvm>j&|9hGR6G_AuY&L#5kwRhc}hp|)Q+kk72QBYeTqndDnsziXa}U1Q>{}V z+FfK7-^oi$6{hD5m>oKS&xP&asXquGimDg% z92cy{UXQYO1d0}Bo~J`BmDS{tzUfexa8b%D64etWrIRA3BYiIQ*|5r@gi{@3VPdF@ zjNv6LDj5Ghwq2Q$)Ce6>pHRQ=P|oBait<{D$SoO=$*B;PRcG)slzm;MAq)VAWn%db z^@0h_6f+pn<6-?59fBYF@O14;_dcM)yBl_ByWQJ9U1!dOcGoF?6b7R%G|acVK7E`D zWN7$Ar>1s9;*VuVb<)_Ub080vrq5v$46`>!#{3ZIlq9^D} S_RNfH3-9H{(J8m-yB`6uiFI25 diff --git a/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0003_chatroomguest_remove_chatroom_guest_session.cpython-312.pyc deleted file mode 100644 index 6c1dec4d7b6bbda3cd0885e17621c0148926a522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278 zcmZ`&&1(}u6rbH}*6b#!No@@UH5!YsMZ2Y*6saE-MbRGW$03(tlbNO)_oL2ks_|sO zgW$!R9z81U!DIgd5xi`mkTNI1lea)CLQlTg&Ds`p7T&%$^ZU*FoNvXVj$p0rep#Bz zAoN2R>Bihf!XaGozqmv9wUmvKbvd~m7)pCI z(GN;;l$18gDXJyc_3o%~jBEGPx19cIow*`~SHhFl9%Xe-X3NKil(8og(&#y4swOAKF zp`<>2F7u-6H*5z`9k)T*PXY;Z zJ&n^QhRj4SxVmIhhXg#AX2gq!Qi|tC%uMVq<}4U_p2M+?G1oEVMLOUK^8&_CJC-9t z5*DE=)Faeu+B9HdG3HArrH~3pec6bx8Y`2!m@-9G0m0Me6#iG%<94g$_sf z6WReD+IwR@f|>*-^d)Tiu6fgMc3kR(fw^FXmeUmno^^q=EwAO99(@+uLo?Q&(S`tt z#LfLDVnTl}{%v7W3l@j+ck^)5r&qd6yv0}uCHM&96&k2Wdn^qy@|gPa-atoM^|jv5 zo$BRIZI@4fFONr+skf{B%2cm1wW)lajOsY@*j6QoO5t|75=|KIkM}2x-h}b_!Pdm3 zsB{@ z(Sx2VXW*9IYzFqnM@H4PyXrit-s>GQKQjR_J(p!&_`VaJI`{HO$NSq>ZFbark->kh@92m=XSNGnFY<(@8CW) zc&=kO`4a^lUD_e*a4%tTB%~R}J`F@$9c8091*dNSyhOW*YZ!4IYdnW_SL4QRzFEqg zXDgJF!^ZAhvof<~2+s2GGw~cQG>mU`Y=PfGb~;fNf32iB$2y$oNj0-xr^0Czu z&UjkiN8_jBxV+!vN=)gbfH;KdIU1YDy049Mdd+-xXKW+u?5J>YSh#pxU3pbqd~q`$r&y=|KPz=qhGlS0e@Z^t!@riH;>wb)ocCA z_Hp&X;lXIx9WJ{^R|d;J^eaD(t$c0%ZN6aH`&oe0)`{luH3kdAfvJ-N^fNNIq zj8`HP++(3-7QA5~A^651KwgGlWfp>%v2pmD&akm?NmVSGye&*^T~rxBZI9-D@3zGR z_G#JY>$^rF=%V8OnNqGlCh^{0It|VpcKukS{ZuoA~j5-gD zE#@Ec);%VBqI}pGQ!Q3#Th(A?KH-*BJ!{cgx~Uuem+S(6?&S0Cy5MB9JC-h}S6aKF zsTECzEjrN}qLXe?Rp%8_iud7Jff|m+BNwZVSIQ+yQQk@;#XCx!uX62kJpx=}4Oq_$ zv<*EDbMX}5wXe}g4@bu}o)~f+=OQTcdSRS^Qx|tv@pB9grn7_T;VYMzC9YrLJ8K?L zfzJK;lD@at*c7WmBWhh-VtR=7V{4Y_EZ0T#=xx6A;Mf-J+*Bz^Q0Hll7hTXd?a2!~ z^?}zWy?OJLw12vld96LEIayvd{(lW<*}LRoCS-6Ogn|pc$AiD|b+!IUyU7+Z8e2lm7sUapb@N diff --git a/osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-311.pyc deleted file mode 100644 index f7e26130a61157e3ec9ac5587dc60ef7a7dcc71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1042 zcmZuvOK;Oa5Z<*N$2N^rB1D8J2qYAdON0a`6d_d&<)KmzZ7;^ia=P0P*N@<}TfwOZ zggExrAArO|^apU@M+C`-Xs?{Oxk^txF>A-EqO!Kf^L;xzJM-;+taq3hX>9(}r(p6CoFhb$i3u_#g8SH%B}A3;orpvPqq@~H z0aT*7Wd`J`CGY0F3gliYIZ`=R=W9K#&SThdfoM>@&h-~%+0a8ZWP|NDPR#GYxNi$L z3PZo2P!`(}^}{_nBkh7^lriX;*XDw`BGzrbUz{dvm$NOID?#FUTn_^qG@>!(QXB$p z!5~ zkX4Z*QUt8M4CrPECg-?HTqo#MIE6d%-+z5wsdY<3WL}+`qyYkT5 zVl-mbx)VE|1*y8xV2@f|%68*$XhFAuV+C|ScZ&Q4xlen-5i(fk7sUdZAIub;$_&D_ zhwmbB#JLf7fDteUvnNxL{uF1jbVWT_%M7G1eKJz*`nb^?Uv7-+&BJC|Z+`3kT>bSd z?X0Dpt+exc)Qd;;q%BsbmIhpITa?8)w+7{Ts+Z@a@&^5^`e6|>E(JBDqfqB z?c$cVOYNdYxi(r7UY_bEcxPItIJ8I6ZGad))&rBt7-Q%Kw?^ph#dnNujmkGu7qFV4 Ti{{Ws7w?>iiPQhg<~95SrXn14 diff --git a/osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0004_chatroomguest_room.cpython-312.pyc deleted file mode 100644 index f3a8c05de8b2546b3091048fa7287a15814e39b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmZuw&ui2`6rM@4*(B^rU5Z6oe?eKu!HuBDAe7c>rPhP(!9WSwo$0zul36oZ%X+fV zgU8-MMR^xn^h|c8=A&Xrn7GV%r}ZpI#VuI3eF+oB zqIRG1)K6%{UeHs~&s9!22Zu!Uzht4w_tsxdO$s)OU0W4e+z&%xve*YlX-b8XGLWsz zVLuKc3Mn#{wmLKeB2c_J@V7z>0f z%NmI$Y4veT*BOLN6FTVzahnN+G=-71BIhVCE<9OWSh^=H)}xc#e~XT!uP2GK!D+%B z7%FYC$XQ~oenjJxJ8MB2gaf$|2RHM&PE5BmKA{=jrcIe7-EjVXT@JW?=hWDV+u&cL zH%N3iI16O}{3(Q8G}e*%0FPB=T7R`VwvajZ+8PBI7;m5(bUcXjBlj@*r*yD@S%hwkRrX8NtxKQ3#gHCFYSzVk4-Qk-S$!pz%lkY?s( z?%?H9v625D8ijAkO!00qCs9`FDxed?%`fb3asw!aAHN1+tYVCR>j>N5(e-1!g7rOX PG&Mh*n*W7>WCi{JFHV%6hD8&iA~dnP-tlf3aTo3iIISzQiN2sRP=))#SJW}PELGH4gM&1HdUFB zkeFHeA27hi2x8!0AYD=&BU87afLM8F*9Fv`l zk*~suGF%4b0NKcv*3ha%rB#{AGs2eF6sk_58^~6skgc|)Mp`W|knMMrY^Q~;Y!;4% zVanVHye@TOFA5pgg2*L4+vsG0nanE^L#M3F{UXDvhF`n-CUbN`mM)IR$ZsGQt>8#LNE$b5-PRzNnlOtmR%);cA%pKG&lV z1EnM;T#h4vjg(>>Ist(YAq(3c@!j`m!yMx!oO&?k2F4JX_yqJ3jGrZrFQUO3!+6`H zEcU&SgpqK&WS4|42|FHPR1BGy7F>5(l%=XL%MU}c8G%SKuDMT~up4pNZSzvvow!Dj(gSQM^V*{fudElSF3a;KgZO#p0!+a+bOvjrB_eETK3b_aw6$e zo}1E?mAVcXFV(Y=-lel(O7O93AO?ygNxwBDncvXNPi;if-WdJLY_Br=3xSaq_ye9d B7Rdkr diff --git a/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-310.pyc deleted file mode 100644 index 12893e24b6b17dbe4a33da89c76644f09e887987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmYjP%Wl*#6t(l3Ogg1qRJ=0*E%@V=3 z{{TyVf-V2xEh~NjiN|%)mnC1FdvmON?>SNH>k+~8edov7JBN^;Ho1E|O!n~VT@0LX zDo9BaN-cJTQ@V*;dWqNOuJDuK72zKDKNIeQTl7A;NsqfzG7Ns?VLLV2V8ZF)DLbA` zCMHr9TzT`2)KBnv8-9O`XBui9LzxQzA@UW(2cXXzRmIa(d?p3 z`xE|a8EEoa*KM>=@~l&=e^uf0R@_dOM>oY$_Y;n;^{5}(y=}i+1v>N;YbJcr8TXQ6 OrtL@rXOo8XzWX1H>G!+< diff --git a/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-311.pyc deleted file mode 100644 index cce8c93f27aae0069a30184ad0237dfa935ee882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmZuwzi-n(6h7ODlKMw#J5=2| zFm&wJKLDu|wF5H~1Ajn~GDNpBvAJrePQ0_@P(;u6m+#)a+idRCK^kf|s8=hbSh`^u&IU_4UCUxw*TJ9}4JZ=>w;+L@Ttn;_HU$@s>Gc-1 zNVPD=6dc(xW-7+u*R?3{9LAen!{WXed%O@f;cpq8j?sX1LOawU)M;*e{5;ucsa|`A z>ucp#cx82|Tw%GPM~nJQEm;BemU%>vcN0^WU5~a*=LOwnGHDx*=`xWtm=a|T$Ig_s zat&AOl?qec4juHu7j(wezSw;7K(G7M^Yy9`7?!^3&?T?+f$B@t-w51}4l+81?$E7> z!~tUC7Hx3CRn-4BnGSN_#|Frj`b~ewmsg&5%7NTcL8>WPbj18!mip=?j9<= zg~vaYQco%Mm13BdCghz;m_ymyeEC*?a;|@Usy{xvH{TndJ)HYm`~LdJn_juzE5GZN z%@Zp)M{u*sVu;X&e_$eV{Lze;`p5K4j|fC9qI37WqA h_R+%0Rd4^2TPWuRIYj@%p4uCmJLL=KSFA=^{Q;YkKk5Jg diff --git a/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0005_alter_chatmessage_member.cpython-312.pyc deleted file mode 100644 index 07e3515e355cad849d9554681ebfb16817c8e1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmZuwO-~a+7@qy;cDod*l>|{SAPuw!TMl|N1`-yHmYP6o!X6m6ondX=kGi`J_9h7j zkKFtV7&!P7^r8nZZalOZ4<0;utD(e%lQX+5kiZ;fpZA$}-g)<#XTFV&Du9li{+F#6 zJOIC0FdVS~I9j9NJwO0)Ca^e-;~3^m-V!vy5;ZZ51v92eJa`0AW3ymwoLTBFt zA;Ma`E##y>EXZ+0_OS2QZNtm)M6v3ItNV4w_K0LT2%BE1c2)p@uwP0X0giQrfyN=A z@jRd>%I6a!jAM=DMfQO1Wdm^ruf@Z?sfam0BOVEKEzuZ1&qf%DNW>$J>larV=}Wj9 zmvFZ(a+h~|7&{Q7+(T)opuuTl?RZWmiPfQCRK2+4)oU+xpG+()EZl<(x{hNRE$sP_ zAu_@^3wxe!U@9=Ss@N^(L=vl-y8ViXcFQzL!m%M$9{ZT^zLOK^t+1Pbwr*jX!sggk z9h<0>OA#4{JcLAnkmj{aOmPyz*Dc*-xe&UneKPKC>&>QKrRxYcv5l}@YrD)5WNfKY zehe$?>Ka^qwyYLO@-(B4J)$g`K6Y2wi7s;`QC1um*A4qAZW9SLblY$UkE%otyQbzL z^151vrAo0#6sL&?j`~1dL&wRRLdC9jnm`9iCNX#q0=ttNg$DZr*!1` zK%U>1JK4n`yZA$1>dN_EOc79}4f@99DCu848Qvq3A?@5SinlJ4ZwI06oU{ h1dij5CBV)60@uWr9@Z7|UrEO``IsghK<(GGNV z&PWNyX-CqP6E5fiRSAkBH*kn9Qq6ZAY)5Vw5UTiL6?tT>auoo8t_$Jp4+96F1h8NM zELsAVN^&8t=3jTfGAbz@a}g3hOEg5Rvb)*;?{SG$BUy4uE8Oa6OR+k;3!~R| zsUs3Wj%XLx`G^qPL9D~bFC)CJ%QRK?>|mG5LEZCcCJZ2JJ&F(&qfnO^Eu0D%*gj$| zd{1q=$g92wYkHQdFt$KQH3*q!-9rp_L-?X@d)%8zy%27@m_(i%pdf@0%PeC$NcQYn z%`USGRa8Sk6$O=j%%_C*&KK7o!=hyt;OdhFbA@(adbo&CZQhFzUgSw&KB-h&3^8(@ zU>WUGrTW|soREsuGF9V3*g#R$GS}f+ab<;SVGXsX>?VXHViQ+^b`)W^T#pc8>2U_n z*as*viUeU|5ZiNoddA<&OJDj?VZZZ%D(VLD&E z=r;hqV2Y=g$H1a^nwB$KOH#7R>m{6PXQQjMD=9Bu34`r~smz6@T8>Fg=oq8S%5Z)jA>@$gkkVuC_h2-XZO{fqGQUnboMMC3dwdb82d)ZwZuTLQ@(5B@b zcnMnGVcS%^0ul%8)1z(+_tHNSC!yI%yXr(5ZJ)oFT?~%B9-7uxcm^jc2N$EGR?;oo z4R`^I=*0c2`+rm6xn4eSuG`DZy30O3g9)mCf+i=7CpSsTD5Ecl%IE}-_#e*WIOclW;coxje{TLj1O?U$`1O2{wi zRHHTnlXV0Kgb_v~5>uDPimOnfkY|J`p9oWd_SI_BA)@aWo~ttLHF0Xc<+7s)D-L^U zkcSD+gdQghqO4o(lwV`!Ogsb!1c*x+aTP{;)KwJ%TE8NNrJ0QA{rYSVVH(qpYljLF zz;`;1_5TUsIR>jEB}14mD=tW^o@8NnJIKXSqtRINgD8j8mw_0vEa-tBL)?K>T>B>` z>fMCr!1E0}pw@{3z9Td~j3P(HMrCt84`RTWw6(1eBGz_HVfba-_l4#Am^X|7@tp6! z8wQcgl^%lua0a{^LY7KBh4omHdMZyzH5o8B;6q;e!b%1()Abvf$kxx(Cl9^N4ARVN z2YC>AuQ;^Q@I81f$aeB%;9ezr!&(s*%YeB<`mUf#bqvX_q*ezZ>P=1;ph zvYSO+Gp$pC=1iJG)op$6xt!_Es!rR{ggK?Y$~vV^r8ZM0i!!auy@lx9Sf7ghD7}L& p{_P}tgQid^rO1vtC*=O+r_kr9UXaUX-x^(CIh6}%SFDzG{{St!<-Gs^ diff --git a/osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-312.pyc deleted file mode 100644 index 81b73dffec5dca522502457d0684f9ac1eb31369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 798 zcmZuvziZn-6n-bkvZN*@HG%Y(I~Y^Y(8x;yg_2STEtJ+%x@bAhx{GU9I=MQT#9IRy zI%aDAg_dOKU(uzLpO!pKx2MQF$kf0DHMra@~-~~|Q6sXBi*IqWQ-WTQ^hvvZYOTRSn4e2GFc1H3} z%7wI(l(JYvs~!MnL8dJQ&VfOQD1-(@Z4{aYFsoY#zTN^#2GwVF_vXKO&8S7K%hH80 zKe@D*veZ0hQ1%_^zFsO)^2({`L~lthtBpou2a`Bw8Pn3II5oQ|c#4vT5iccp`iJjT+)Sk?7ortliZ@B1Xy zwVF}ZW1KP`b(qMsqtbh(MLpM3GD|1i19qGjTzYAbE!_PAQ@!%lAb2BKCIYos9;HdJ zpGN&ei4{SUBM7r9Mag)xO0^KWkHvZD5mLRZd{xx0JWJw??u2XSA8iHQ*U YV*~PM_8PL!ywOH|xKaNNiWJ>{0ZcH_;s5{u diff --git a/osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0006_alter_chatmessage_content.cpython-313.pyc deleted file mode 100644 index 3023bc022c8cad064e7bc3fdccdb6015ab9b88be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmZuwJ#W)M7{2pYVmB3OD55F^p(u-&I!lluP$i^_AwY+?z!GtC>}%@wd=7VxN;f1V zW|r~`7+_=PSF}r_Tba5A1;omoohTi8l3zd1`{nn2PM)u?J3yYVKVKhxfdKqcWO>X5 znD0t(4t(Il=b#H2>}pJV2(~~2_}Vt`^*-!b%c9l0trwW-L&G(%6md1-B=L|1S)5WX ztR#&v;o+(V0DD2^ZzVVfeZZg(nC3&K`jedtqv*cTFZHT7#!TPzt&ZlG zI=bv(`(@?~ZPyX@%jGmzY6Cf6Ddll^6l9{_YPH%ZAQ@&zITFlyFvKXq$pAC4cFiYB zVM;Shvjf?{9FTyX2!oCZado+`+7Zzp!P2L!c^G37eFyvQnkb_@f{<_!l9^+IC9WX! zZX6JmE!i!E4r9hM5>rf56^`%-(+JZr#+)gYh4WO+`AjuthH}^k_qAgTNp09XE*4k7$!0qFj*D$x4uOsdU`YV$9UB(MGtv5VeY diff --git a/osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-310.pyc deleted file mode 100644 index 4252414798193260c2f19cfb91364e56075fdeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmY*XJ#W-N5Zw>k=W}vW1X4sAM0<^W4Ic$UIVFJxlHx++X63t`95(CS!|PLYw4}`s z;ZM-=AGW2UqDMku)=tQ=(mu_5J3HffUNagc1lPBx-!FbqLVkF%y#geMxNV9ciKL3u zG^aJo8TFhgo(FG;{Mq)3 zksRW-FA#v_RFa%Yx}-UWpu&ohLsSj0M_di7s7k6G8OrFI%fU6rtX&yn&!HQ>yK9D> z2ga6*4@H|lo=hgsM4?(}gcoYCwpfB#7~O(y^PMfx1&uNF`RBdc%c(!}(wMtIua$B` zqXkX@EjZR1l#^~Mp^F+Y#bbC;f|94>k&8vA3*izWFmJ5@<6R*>tqbLIJ(I8kEkQ3z zunj{8Ts)QXwXe}|Pe*4O&J9ARxky%pUK+>b+{N9epu28xG@Ttyk561;R&eY1SJFJf z0v-I`WbZ9BHiNoU07{h`$d18&Y|Sd06{@VCye(FqoY}Hnm^woXbdhPe?1H{&FJ8jj z2i}|P{{Lp^^Yi~4_Qs{FP2*qE0JnXB5EI6On;>MA(R~{HiEp~|apZ=5k5tY(8~Wi7 o{)uV-eA2s-n}>cjU;BQ_J~}|n#V>oqU*X#(HbU5AG2Q2X0T^o9%K!iX diff --git a/osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0007_chatmessage_room.cpython-311.pyc deleted file mode 100644 index 5ca48714ae4a7da50f631044e69e98bc0299d6e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmZuvO>5LZ7=CAx%_eCV>LL`e7KKvW%d)2mvIwPXMXB}B_7Wo@yE9!A^Rec`qNg52 zJoeTfAozj(0UrDjE99`u)swfB_SBOz$)>f`narE_d1mIFcb<2?G#WbamOlTqi!s1& z0jgG;Iww8u90CD?Jn)f$d~9GOF!m%v#_$M;^d5*zkz4J7&l13QKFVg)2;PEL?T>&h z%yi!wMt0(aLCh3CB-D#H2h+91Pn&|158OEf3I-xzV1kCokT6jB;v|BJU=+7r1>l*e zZWRGsrQ+S>->X$J;ah9k&dyQ#NtF-wY>S62*UfKy;>~uOSmhB}p zvIODNIJSq>8iYYYgM`ieLozuELx20-+;nqW%n7O`F*!&*k7;3GaXn~48BRh@>xDj6 zVEdFW5w^DLP>*c38cekc-m;i(S$tjUQSQ%L*6Y;v#9Dy}9npZ$VBpX=5+z~kDk1A4 zMkEW^coxv@keh;I3UTdV7&1)yOf6F3bz=3k)vdMF-b1E`BRZ|!H#iYGo;hpx&7GJ= zvAJm{wrBECy~ue(%^r{Aw+(DFpnHW=#xKb|+82(H!Mu1BCYSWyB{79Y?a|vv z6tgg*+Oc>u`{zAZKwHTrd|lb!$aT;bKI)lzb27g)xi&v(E*~ss&E>DXAL~CKXWfmg zyOVWajQh#Bnf_{~Su@S+vZfycH>bknlG0T6pNJmas!nYwOe@oGlYSv)DdCNCvRyvs zb|qXiU+s++gja-GljA7`?Ndi)|7VqKXQ&6p*S&9*8rQ#X_oDf{IERXe4B*vYgyCO=SCm?WhV9 zl{zqX>t6uTkpU()78W8Qr8-6?CL$#WsS|g03`Ok?pWl1;-FNrBJAW<~b->5L^waK7 z2*7tivXPsCNu7gZfB}Xc@SzQT$(Eqtk|*1W1Req`9|Eip*iEWs1=8%}B=gy54Xa@)jd(I6&4%&wdhnG#a!Z@(zb7FWfbkPMkALErP3MgxbtM`FUHm~vT9 z+;jrhCp<;O+-`?>c*`g<)k$>6VY=h+yuL>`E;!EfzUzrx!7%BO0F$8AAyFtUkEyE| z*F}v`5w!RuAlsCOL}Lhd-JngGgquuFj>2!1<=0l9uC1;=U^?xQ*-gIz6XD@m&ul~_ zj7;8C+@ij@PFsDSw;q{WZtQvkF%h_T)4FCr_7gs%3En47ktEzO|GgxWJA3axPlZ+0 z-XKJL+a%;Uh@SCq2*wC#D`Q!jLoYYSI?xth=_7Svs4kq&FP~nUKP^{|Dx-2`SgyQY ze_#K&@nK_RZ4Rx?k<}Pljghr8w06EU-o6rX-L)Ohe;aJeiQkDfTWW;I@&X{lmhlD>KG_de$J_htsAk_q^F^Xc*KcL{)R z!pK+QOc^Y5*A${ofIGldCV{IqqkZ!cHz)a?q2Jg9j1R8)yE+Dci5yh2liKvZ2efWGrri)&9 zC&haCQeUBA)WLZt6*Dt{)E@H0c7UvaLpI3NSCD$M$ZPOZJ#>4yvPm4T>|8g;= zL2K7b*v;A5**WNi2_jGc5u(&@f^foy&VfuNaU5+vFP|mXgik=0!c^P|LuSMn za{5q$n4H8MHd8tw_9DbXge>d?DD>Zf4QrI?F!eylObB^oCq!HyhVWU(3q>@yMj_k@ z2u;EOBOD92kMcg{23~jQ3GK{c8}?gx`b~^pb=G%}#M zM_H-c9AmnZ&GSB~a+5!2KyPu;S0qXLtpUmU3Z{Q*!;<#e?3JtCa`hMBMq1zx4=oMM diff --git a/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-310.pyc deleted file mode 100644 index 575c0121964a28435116d6c30ada51304f29d406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmZWny>8S%5Z)i#XFEA5LP{i{p><vGu^U8x&mgIY^a=4|0| z+bhK22)8*z10<)CTYRy51i^2%4PEsHa3t|(JZxPa&E(Z64ca=j;FKZ>B(~&>lNJS{FSs1@N{o} zf6Cq&XiWxnsQ{EJH;|ox`OxWAHY-$FKYCTHT=2$}-9pzHD$o>J1DCxsG#$W8m^;Tw zlij^)hUy-Q!cG34#_4L)x?eQHZSJ873FF?i=QGOa0rmcb*L^+-Y&3LA<-FHo;D7%g mm=0ejy(Ql6JBIG=JFbKG5HTA*9aMjY|C*Qp%^nNs0sjjbAKHch diff --git a/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-311.pyc deleted file mode 100644 index db6108c09ea8c75e529c22630bade272904c103f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015 zcmZuw%}>-o6o1opyW0W@ZcsuZL<2GI!3{UX7!$&Z@e32tOKmdg?hI>dKbC1%f+r5f zc;v<(VB$yQ5Afh0u_iri=IY5?2^M|fFK_NWT8N@6eNAcS1nC}`#{upKs1WHau0k`0ltZ^7*>TS>(HqD zmTp7gX5e<2lekeBb3KR%_2ae9Xl?#ujGV*w0_*_=3lXpsg1X336`_%K6ZC=YW5#8a{mF4x7<<>oJMm;*}*jG4|>K#Wbx9t}(WwE{H zB#v)C4QY$HZ>Zg(@#`e&*`nCcu|v9*gCc%GZqc>`QU&|;D%e8ETiB6Fo|CiL+h($n zxsjcY<$c*Xc`_Z08=0z1={t`z6O6eJW?GvaPA?2EOb_exyVuhC{FkZkmwwEoOApee zXX%nPz?*|Q`&nmcon=+cFb_bOBWW^Kuj@Mx<-=ynQyV%riXxh%ohw?XICDZai>ur$ z($F(~}+wQWf!WI8Kh}*(sDndwP3xanwUmoO2+R6I0O_pkN`&^umv4e0aQD0FQO1RhdLKe zmrAkdPwy1Z>Yc(lTIn2Z?yN>~M<_erQ9eVW!$M!T3~oHi4k=EY52JSTxf}D#)oS%7 zme8kBB-C4>6(h1lai%!E$De3H^Kl5(`Zb&5{E)I6BBXZ`c$OI znA>hsk2I_quH!_#2*ON}fUGn^D{qbsj?JhUNE}h=*TQHW+oxHH0MwCUiI8)pV zeS0lz_Iw(|k=<}(*XzrPz+Fk}+5z27_>?Aimu|@p({n*0KTiBJoo^iF(?K31c zPeNXR=$Q!nV1$6NGE$Widi8K*0%P&DIn>Joy?i{se0*vCxVUt1V^~}o6qnwVKFobu z__#2vZ47D~!`kMcwmGahgPQXd?|dt=NnSI|k&23F?>;MMTUm%3Y3CKPmAIKYxbRP` zq>sLmS;ywHwd{&SNvTDFPW0R9mEB?21r>iOh^~q-QXzzY5P;TqaBYGL5FMDq+2z6P K@^2tWQs6IvTK|6l diff --git a/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0008_alter_chatmessage_room.cpython-313.pyc deleted file mode 100644 index 9fa829be7e349db1e609d15c1620cee8a3fbd822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 zcmZuwy>HV%6u+|_Cw9L==(ki++AJQ3yCATHkgAqSZJ~o*K&m30ocNj={E^%_s>+0f z#LUwFfB`l}5Ci`L>5}Rg5kt42fLOV+YpB$oPI_Ob2|u{ru$M2L#}| zF!EJ6SB4v0IR*}J;5OKT1a3)0S`@alEfZxHECENJ2aZyQc3LejknOkSY$t`5WE9SX zVMt65{T6W(KaMC_{dgO1)r@UQEbz(F^aS zXqT__73!KjdD&x+Ux7_ufz4jV9MvgWvQx5T-qo0+k@1#pj4-4;e9jzczb0bz=Oc3+gwb85mTAVX$K)C~fr#S!AH;RG`&i8-vN zETYH_F%J>4u2O*{-#3Q=_=K3f?ovs^*Xl_j)wC@v|1b&30Shzjh z#*v4krjIERb7cBzkYKVQ3KJy-He!PPR{ zdfdkO%%>2d37>xxxk*C&MmNC}AyVNbhx`MqV?L&sP?NfWAL1bJkFdEOH@hK@5^6q; z$#au)6S-!D4^t&OI|C1KLnwkY^Z$=#a^CMES6tu{`?dBFQTe&45CfyTT)YMY6==5x zvNWl_d^pg7cD-L(I4Lch&QwpY&74+d`<3OB%JRF(kJDe~KF#&5&7QT{x9px}_pQC2 zwf7ZudKL1ssA&2?Rx9eOEwY#&W2j8ax~_SRl-`Wexqo0Sdl|KyOERD5rc7m}ZgPy3 s?qx&0PpaJHPZ`h~TnuCg;U5)1;~QA~rH(@NjovR;d*$kHz>T!PUz|z{fdBvi diff --git a/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-310.pyc deleted file mode 100644 index babdd58b30e5e249299e5f2f3d5141d55898b0dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmY*X&2AGh5VpOWWOtL69uNnRfD=+A)a?ZcB!mjBijdkOQOY3~%gs!-PWKOc(-N+5 z%{#!68&ANMckq=HuK*HdyrF9G%A@Za&yHulaka9NFk0Upe4l(3jQ#NB>I#W$(zf@= z00W-0f{%D1MuM~F3L zT%fE2s|!In6SzhNuDN*cqB1J8S6MwiR*k#0v9a+`s=PrXy`w;DRff`3RpEMXwAD>z zoY3%k$B7r)!_W=Xtf}PKplT3Yzc#v1W-d=~?qZ8Zt6aZFH#kLeR9TdzD$pgC(vl`p zgTBv6C{9ADcQVH^YmQx_YpDPX1-W2mau*w%puuvCRBPC#=uR}|VE2c87s)oOlrE8y zG@j*1cp&B5naX{zXMi=9Kq)j@Lt|#Hztz^f=Z9hf?-@MP*;DFf$ESAj*0C~67#+Ua zU81C_@!veZFms#!YR#`YJ)~xBiiOS*^IXp{-9~%TRCRhl5)^lLRqe@3QgB=qDG6Sx zw8XO(z*Lo4wRE20kq2J=^z!wjG?+*7bUA?adT#u)?9#S3$wW*9;d$5*{JL1>t307k u{0{#_=WX0R%_&~qu?|OV`)$YV;bj*~bcgb}=Co~;q{atI~M(`I|S?Zwx diff --git a/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-311.pyc deleted file mode 100644 index 90671f653fa68054c1b5019729bd6fb441f386e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195 zcma)5y>AmS6!%?{YwnWL1Qmk#XaIE}6>2N7074XK1p>82;%f+zj9WYDwU@hKUjk+7 zz`)2x1~#N1)cyhR7r=OxGE|Rl)`XQ=h zekylGmsZnmaN^sZE2Po%D09SOvQvGd%fNT%7pQlLp{hnvRi|1*tEP0s(#y%E;ApB= zjO78fQ3*}M$WUWrpqGYAz>KA?(`*!(O;)J6Vf8eKfw>=(`;VA>6k{g4dH~iF1Hn0i zhx;3ujUzpvc^zgfP?trAfTDsl=Mrv!r~yydi%Z0przR&SFJt2PjAOOXWI~Vz!`$Ny|KG`yO88jQEVoT#MUH!dLMMTa~6@+$N6wiphM3@dZyX z?2;yvmVmU-6>L-cB9KzipjG50c9`4nm!xI4Frkz~kW96?BTdfgj5BwU!Cli)3Zrf_ zhl=@1PG)hG6=P{(3|($J3~(Of=WXJsU}aI(VlIUgHWOSu7@3=n?mVZS1y|jZ`CE45 zCRB4Cy%+Tf?I==zKbyWz z-)q%?TbI;a_96mwnYaxvUVOn86i`Ih{yxqvDV?k-`ZKq!v`<(tZ8dP!M@}ML(OQK&ALBZcDo(akm z-A=ze@%d6vp4u!=^~+O1;l?43-N`ns4%5z8Ze+$0(9ZvFEomp5u$_Yt<^7#ZY#&`KfKYoe*hq1L3;oI diff --git a/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-312.pyc deleted file mode 100644 index 9a23c27759bcafbdec074957ee0dc05e5c86606d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1138 zcma)5zi-n(6h1qN8#`%}RD~cY4WKNJppMi9BvgL1Dgw0~5M{`6y5=sagMWmxlM*H> zbztm9Du&J|9T@u;AS9MVt(58}Bqp{&F--M#NUe;FUw0AE|D zpDG_^0KN%hv|>YWGS9&~fB}{)U`r**mP@h(Wbg=Jc^lvek!s2)=|5#wAGma+Jz z)F#e3hY&~k6T`~>SSK2~Dl(1-?DQYl>b}yi?<=Nd_tjc*u?Wtl|bscHXD0xdZzDE zCY$)#5|bY<>QR(>$J* z_X?WWyvb$JCEh^v3R=Xe`Ws9$>kwf~If+FY)M6?n6+($qCj73^AcayfiG{sYJ;CBI z$O<9TAmqJoScKywgfAP&5@cavQYQ}PDNN!~F+wb{5Zrl13=0)KWXXqS^#QMDNu*}# z!Um!tjITXi4w2^8$#Bj-fD<9;ud1=e>+}pRp=)Y~uKyv5I_TwZsPp-NH5G zR9(X%n}Izv1H4Jr1xe^_oXxSpTX6?AL&<0BEh>J7U=zT5&$n$bP=Go&h{#jQo8^H9 z)ZAOGAD`*PXO1(Mzh*9UvxS{zKU?T!3kT89`EChz9eR}Yx@rG7bG4f@+Rc8>=;e%q zxue{@Zu~&iB&!AAlP{^l!ApCYJyJ diff --git a/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0009_visitor.cpython-313.pyc deleted file mode 100644 index db88a3e30bc8b08885791378017bf191cf390fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1152 zcmah{&r2IY6rSBpHrY+ojnyjFYAKcyDXw6J28#Wm2({XSTP>8pu*r^b>Si~c*~F%& zLZPP~ya?jOOE10kDD)rbG3p^Qr$SHO(%RB%-)0T=Ah@uz-+S}Dx9`30opyEU2%b-0 zSJ%JD2>l3+&J#Zar!xSyk%cVjDO!-2v>-G21{y>+ktGiyOUX;iYA5LYJFP^RDWzC8 zei9m4S?Fb2Vs=1%j|;WzJH+M1^B9CuXU6F-0NW^!m}DU)TM|<&*_2o;A74)Y9}r?>s%EM3ZEdxf^tnb1i%RhU`A=d`$P2jbe~rJM#n z6Ebz4&kOmXzQ+Sam zm@6<8ZgLn)nYb>k6LZclR?EZ-xcS0o8zxBM*``M}+rW8cdnG?|ZjwR>LS4-BB{xB` z9Ii#uOjPPD)U1vg8|+!g5%8fomz9$JRCLmrw&FRG>nHAx~}f1dp)~7M}yghF@BsG-dWr8 zcm1OgvtdlOQfgoK&$y=PEhW{fzF%Nto${W+_GnRm6HcM6Kzry>1L4df?kzwfc|X#1 mhTR4eb_VfbI9iG%Nq8S%5Z)jA?6Yzb1)-v#LUI$Ef&vMlfFjaBC<2X}m2)$9?6LmA>my1{+ItXQ zf|hsKmWo%1gkW}$%Y~I@^v&$delwrl&1M;+^Zn_M#i3yArw{I)h=OA>`TXQvDV$ZG}?`AUA3m4xV=aMkJ(sY2v&i&QhlTdI>W?zv* zR&ijJ0KVjv#Ap?J0-UT8h#=l@m~3|08zfAtjFr0EX!x= zi?({~2AAx>)Zk)NP>=XN=Pqj3#^jO)_rt2TZjf@`#|w=HTo(F5{TWfED%2?DGNq_z zZIJMRQlHng@qIo5?6C!G=Nj!m8Z(!^1bFS=8>A0sC!St67;-M_di&RFvhDawn0x73Max-~Fh+8vLIzA+rz3rA)}^PZSF-c*djOdz9XU%CkIj)9naH fa1mq(%ZJPTl3R30FS_*kR?rvRlX$j!;(`1Nt`@#l diff --git a/osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-311.pyc deleted file mode 100644 index f7961b6ec0c6a1519cefcce113b815a8aca5ef49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmb7C&5P4O6rV}be7OZT2&?Q09+qN2mh`ABf>;zp>%osh3=G-Mw5H~xCh0C7gdP+; z?rksLgjI3>m=$^`bM@pcOZT)V-=s|!tp}Y+UViV*d-LA=y?n0MO$2NB;#2pAgwPM6 zRI4@z(`^6;h$4zZ6k!)fk}F{(q5FtR?+}$4?#orsA)s#y&6TP01lhHp;@FnB83n!6 z&x0h+xEdvtg;}SH6kmO=Og{oRKn%H2YG0ejAgUbI4l$&M zceaky-^*FLLHpkudXlSC9a=KD@u=zr8q<<2=)ClEzT!B}O|lzgL7t>stAG)*ZceD5 zv!^!ZN<0ihTLwA=1tj((1~wsU-GGIZn`K<---c8=DSZgxCLs_r3>n}RLS7I3P{aw1 zvH^=Ji#q|!QZWIp-=XxLxGznCWltO^)J&4g_7b-F~3t76Pjvf{!GB!S#V|{(Hc5Sk{F|iu^jj`4E(mJ-9->v4@ zY8IMem?sFtsStleT>XcL`UOiJJrFy+T-DXK6>iMB-l97t$tAV3%GZQj>3apxnZ7-n t)a`T~RPj${&p{M2#u&Q6_A$D?{1oacRtvN&_RaCd%@c8O`j^u(?=L3v_Ywo2p&RU4|calp%jFmAexh2_A+cUlel4jq`MnSZY|{C zvA6yUYWsJ1@e~je=IY5?AQ7P_XC~Q3Q3U7k=KJ2fH}l^2=5wWD0bgg!Pu;r;z*j+v zRa%3^AqN*gfS?c}wmBhFNEm17NJl;v)waK*2)B(=)|UnUngYBGBF^;w?ce=^5$&pUiB|qA zy(sD*H&%Bf~bC`LgJYw^>fIp!3Gh*_P|NkMY|e3-TmoVV2C3@ooN;fn^NF%)*%G3`5HC7RJXzKNNX_5jvnT zp>ZdmSt@41j3hyu$vdvQ?-ruq8!2u)n{M|8qg4DY zX#~h9H)ELVU^eEeaz{UXF}J|1zq6)BZDQ1ByANkO^;xxf-kesOlWOyQ>q~WiS=LPJ z&$tJFkE`6O>Sxc>d&RqLTVv*`t37fgwUi33D%%xdGWI@4*T%tWActvU?Z#xg@f|pk**^i_U*gpO diff --git a/osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0010_visitor_left_date_visitor_visit_date.cpython-313.pyc deleted file mode 100644 index 5879df909ee1731922a449a9984f204564627549..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmah{O>fgM7`Br%Uu#8Mn3(856RIZVvSbGimCz)libH`N8a^&XR@%6oAx(;%GVKHs z5@#;EaOMENfnTv*TKURpx1xf$VkgUr&;*w3JkRU*iTysWmz9bQ#Q5~}>A|`Jz&A;X zQ91|9Jpqn^4}AClbRdNtg(_QM1Kb9_as&8k4|erJwEEsrb4=Bd=9JDPaTIQk$%qCi zNn*zJaT4N)4OSWetaGybD8Mo30SbLU6(3U7S6oQ7Ua4FDQ;=hE71h^zMz?zDUdh*6 z&^KD@Kh);`)viJ<-=g-&cGkG{sHo&jRxfHZ5=I6GLCVXX=e5vl!bqA>ZWO?Z@GwPT zkmAP<vivV#Uz}*7EDIrSBP3MQ2n$?B=+!ic zq*Aae2n`8kX+&ZiCvrQ)6C8&)9uUl^>1kfxOMrzvI#(VCDg#RU9~`-EZ2Toy#)2T??hu-i@s(=m=y<~~d4OIMf@2X2fH zGZ4NA;!%ov7Ov;*dWCuD!m^9V%9WkT5tY_wiv;YsSl)w$4y@)vRj%o8 zA1-WQU7eYYQ?oI@zBR9H&g&bq`u1sk`*ZuGzWd$KEc@@Ao0sKO*6RAZ4s8_Y?K>K` z@@jU%er9ZDXMQ8;P@cOf5I67U?b@Ta1chQU8DFRn!e2Uo&JVo?^$+%}+B~T?e*!@= F^=}}?>?!~N diff --git a/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc deleted file mode 100644 index e9ca12157f1411da35f870e04c3c7e209d118ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666 zcmYjPy>8S%5Z)jA>^mg_QG}KX$<6sv&><8AA`OHh(70J`JaczG)<1ZCNvh!8oTj_{|rQzw6-djdT`lnb~sb#m92)h zR|e;U0zKeeCR9SoCA%({l1%*@{*GRHIDWI#eZX$g zcDPgT2kQ^08r+}D{IkX0=2%w-(U@w3`CGJKhPKO3wW;c7?{(+FN7}z^>zrh1bl%`a z2w9{o*kL;WO+ l+<40|g|o0@*en$9x7bEc=^mH9+^Y48-XF7`uAZW$OD zyY&Yk6%ZZZpA;!W z#Q2vGyvL*_P_i=XMa>0>8F3PJ`$3wy&E`gv?1f2~#)3p_CnYpU*&*AQf2k7O!w4Z5w97V1QN0-MXJQy;FN!!>7Sw!1F#Uw?Xkjy3o>c$ZR zyhOGJ@Vfq zOeB6gNQ20K$=S9D_n5!UlHD{O`Jey~e9ra@KnDTu#bt1xbtI7b_hH}%Q$+(y>wCwpq%o!z=OyRkBJ)(#&`owcu>AL*&n z`sK8yPAfMw%RWb7E~Lp--O(q{6gzzT}vz7-OJ^-Ba}N>XqwDSkKW_b7)Vm-#?d$i~nScxqkqqoako& diff --git a/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-312.pyc deleted file mode 100644 index 7fd89ccdf956984f96af5d74a38d1e06589e6582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 805 zcmY*Xy>HV%9Q~c`Tx_d_5+MO?2NYFE9;nm3s#<|SLXZg-FDJ)$NgVkj*cVE+R_egm zts^U_9r!C)m?9x1^2*dLQi6~=ad&YVxZ(WX@9W+@-;ecm8^k)De{X+A0KX(zu1X1J z2LfCG1&Shwk%wZ<(-3Iz5~y|tRA;D%mrbkhrM|$PJ~W)lwIq&K*m2m&d>*DrUf?*T zEXspb4}e*cSxbNmVBjGNo<>mzdAbJ7=qbVfwt$d9We)f5{2!N$8nkkSFSSMHs=AaV z=9xp&u?p+WQjw5XP4h75`n+%&jlBl>5auCIGZL{jC)DTcHli{rR8-5Vq8g-wglEI+ zyW+67>azYv(VKL5w=j}H6gj#uKwg?8e#}Hn?v-}PBH9#EOrqk16gDBEZV)kn*9dt( z@FQ6(8D)KzP?iKC%QNY5VIEQXLe9txNv&sHKU2K0(>^QR{t7c`!A+->^YkA^al_)lriPdcfauw%tbs_-#u$s%c!yZW21Fl_JEp3;fk{xFkI zLv0e|hhjT}DF*8ZO?B-)K6yR0!P@?0kIk)-xixw4cye!ZQmdao8Q1EgTK!Aw8~<6` zpH~gbp6a-UPhVw^mLr>vQCJIYyR@a;P#!D}eJIOR?WRCC=KjLcgKS$+@!BDmV5%d8 Y{$N1P9IqjKZjU#1MjJc7K@ipb7yD_{ga7~l diff --git a/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-313.pyc deleted file mode 100644 index 9713ab6d1986f8167e6c49decc130579be6a0d72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmZuwzi-n(6uz?^J2t5r0*I;wQB_^M)ak%bDXLU~7y@*N`LRTt9Q%^EbIY6Gz-(U1UK>&UzvOJ{) zm>)`T4t(Il$Dj!*Y-&{71{+`p_}V7$^)_so%cRx&zFuIe_YAi*Rm9bVGl+XM;BiWr zFb8Rb6Be#=0I(Ni{z`&#&;}IxfNDOZy03YV8tqc6@^3c*7uBqo@o${pb$CJ`oKj2TtBi}FzvJyK<R(V9$|%Lj-P?>WPic`Qic0Zx*5guRDpm<=%D%zK&A zQ%?#;0*~Oc97HDp>7|A740jYza(b(^ds5i_D;XDx?F~m%Z6LoCU=4YF05cQVM{uTV zH_dlXW)84#jLTb><*mu>?aB4cNo`|X+qtameCd4S7q!Mu%dnl9Zr05AO?qcp?$|Yi zUG%jVb#i%fQHl?$S&P`a5{Yu75dDzelT`i^fT=<=9YXlW1kn9uR-pOO8CQ2Ns=L2| HBzg8T=IL307AyFQtZ~rqOU1ojTe3V1Ix4(aIAU?Og z9jp_LU7NveLU!W_QwIxhU>f*QJ8^p$ z9MzvM)tLw9E9hDcpmn=}>NWWD!S>au)NS|VSoRUT!xUJ%&e&gcBPw@DMsB*%1a-F1%GP*;PzxnkTKPi(i-Ez&; gd>nQha17o}v$Y;!oshrSuI(khHR2=31NNBz0~fioz5oCK diff --git a/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-311.pyc deleted file mode 100644 index 13f85f51fae11612a4d219df4a642818797b6a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmZuv&ui2`6n>Lrvq@+{L!pX4P!KU7{UII}DS}uOq^_W?hZqRio!K?pY_d+WExql* zgU23(Uc3oau?PQ@3VT@Q>d9Nm_SBPavYQpDljP-lZ{C~ty)XGPKW_o9{+rLOPXyqX zbjnqkg7F%H1E4@j1YP2iuHq^L6nF|$c@I=&q@$Kahlsw1#B(N(e!6#5smL=kHvfBYFLrXOqxMT?$ofMWF}*+qB}rgBAo)kh%x4mt2NyW_Hb*Ox8)(Wp5UG z5Kr~Ae?e&v{t7Ri3PP8;dh)igD?(4sWOuuo!^`)*dGFAKU->_;8MUZ&S~)SM zC#QHWOU<+URnL~ri@72tubSm?^g1l$>dwyYE_oN{aghlUWnEr~zO2p?(h;o51mh8V zrMfDOB;;?T#k)!3nQBM97vW*bR8GfAGiC{`dyce8nI}ZLgs8f1!W3R2!xko}R<TAKY_$xJ?_SC#4V5FRtmbvi7<{7xu%cv3uf%qUu^hzOKT^LG_LipG{U)elc+58QPl-+*;3V_Rn diff --git a/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-313.pyc deleted file mode 100644 index a630986a8c596339509c60931d23c3ba865888ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmZuvzi-n(6u$GX*d`TeD58QERj7+4RJRBuBB4r1h@q4YF@+`Kmf#o#D8P@<4hFoVfwqR0(G3)6S5ct1aMPL<&EI$Q5`*3|Jo8KuPZMrG?m?Kv zDdWQGrx8tfXI_JlGbNMf5*(uz0vsUF0t|Yf`526r*{uFsP+~cX9vH1kv-aPZ8JL09 z(1J=smpz=o2Dj&Uu5cdDra4m^$oVQMk2?opCYClgx3gQ2KQ9l`o-UVEixC#~sq`spc4L}EU(lX+LD-~-5F%VcWM-aFiK~RX z%)>-wOLmcvZVWt2Vn$i2!Vw)%7Rd`^%0Wph-1|vJ;h|~_hH}{Z&E0|uHyzNK%9jb@ znN++(!YqThooAF20*kU@A|E8c-{%y#&%-3{(k~9-VT=en;o2F@|0wo?ql zWhjhRu`)r2ZX#$#3ut7k8Vsd1utY7MCA3FvOPQdQVJszGKQTynP0F7q%EX7!1MIK` zYN^q?jCKmo_Aw@RG#UtF+u@Rm8|I!bpnhD{QnuG)A9e^%?zfZ@cP18Qr}8 zs=DZWqs6ASsc7p~RWx1#Fjwu&E`n!x7(wKuS`l9nJMW2)H0M7G{wIo<*yzrkps5C= z{sozmWg>sfi;TyUKa`Itzekjf7F{>sFfE$mtCbcgmI&p?1zVr!S1}*I(OULW`~iMc Bu`B=p diff --git a/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-311.pyc deleted file mode 100644 index 6aa98ced156006075d1bb69807030b0e476cff63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmZuvv2N5r5S_K}e6~p>6eU1`NRVi*i2|WOQACp{NC*xDqB$(BoZHFa!)IUCzC=)6 zks>8sJ^%@X;A1FKMB7r)IZCQj%&zSV5$vwVZ+2$5{Y1YX-0)#FTK*g-jy0!(_7}Oa=DQwaB(Y#7Td5&<1s-?W=HAmZ0tu%{z@4{T& zURk;SfQNC8lJ7-Xl&6wQ+(C&+4^^wWQr_jAYoJ8gwyEz_V9b+nh{{c4QK1C)4eAiB z%MIjQ`J7YwI7Y%VobQgqSQlzf;0O~zlo4i9tE8^ILLJ>K>2~t2DZ4 zX*%syO=#%l(FdtDH^w25ZIGEvcj18du&}LpXY#D@!CO4^kKH>bH?N7PW{goA e?Cwuk`uh~l408(j*L?Diuirb>f%E@F4dWmCfzx&X diff --git a/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-312.pyc deleted file mode 100644 index ec76ce382b9a048fa132b91ba402102a792928f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmY*Xv2N5r5S_JsKHDTxgc6{L5|GlkAU+@!La7i)2(Cb)akFx~lfx&UeOdbwU6+$m zP}1ca5PSy>RjNd8spu@_(xhT`&(6Wh8oxI?vorH{f32>1Kx;Ptd3ekKek;2ou@RY7>_K@8$xB#?ig+0da93!b zyyt)rG6A6>*nowm0cZ_%lmDgwl^3S4estPW6l+gyzgxK<+A6+Lb@L*LKSyP?+3P)f z&ZD$M$&ZsFDRaps9-_o7#;V)6DtGB~G?XZPlRD1@raX&ASUGtr8kFIQMtv&la1A-H zJkBY6k|N<1&W|QhsuC3wIL1s+$pj0jG^*}>M78-Q!BkXUKE_6%Z*Z;Vy`2T03Y0}a zbChvD3SQ^&WQ18+1pTOt(y7|WqNidQWrIARhBR-e#wU27f|Lru@&W?V;{_?8JG&eD ze`#p;-SJea>(Rz0Q1r;0L2ZM(SDVJVefqxkz}^1hT{>GA&eqk#$5$KlZO^-w>(!=x z-=4jb8|@K&64PCDw<`{`1dH?6RfGRqnwT&(Tf01=)27nUT$h5!Hn diff --git a/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0013_rename_reference_visitor_referrer.cpython-313.pyc deleted file mode 100644 index 0a3d41f7486e159ff9a298aca1ca3368c6676ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmY+Czi-n(6vyxE#Ia4PRzO98sua{EOI&^pAcPnYLxB!C0ZXKl8^5Mk96P*oT2*2| zLSkm=f55`uz+VANt6Q161%>Xsvl9X*>-_ybzjycUuiPHV#2w`gxlqv+N@yyzVB8VoqnxVKeMLAO*l|}j0=@#x;M{d z%$u6Y6B5U)%a99(j^OADC*oM^);rCA3o1=5xS}TN!h7ISRzoz<@B6L51TSa%oY|#Y zj%nmt_4eYztZr`Jz9Zwb0F(zxt0G50ORLr zGF2HImg+0prrmv68YxXEB^8WPAl;Pm-6&3NDY-={cNOX)RT*Tt{hYuMvV^)&pwZGZ z7dl|GpD9Qa6XrvhqBF}<>Vh!#WLy-ec18tgDRGgCCYFqOAHC9mI?{2f29T!e2%@KX zZ#00c(9xS5-$ukEiz8~h6v=*^_46ut2s>6-TG9M}Ma1nckt+ND3+I1?#Hc+yLVIn> z$+FjNnm)0y$AWuf*SYL{crgxHaOuQf`{A#hURgg~rsu}5MlA@(u6NPdT1-1!! zQ1#YMc1kMM>h`Er+Er4vy)&Rq26a&ZR8?^S*%6rcooch0sEYdjYtcIA1gTo6Izt8;ku`AM z8$;0nJcqe695vbI!84@(F&D0RzQx*xUA`taZ7;OjHn#`n7OI#q&%g2mMj5?L{Xg+l ze?JNBXegV?dC$$j$KHQ19ab#8Wa73( diff --git a/osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-312.pyc deleted file mode 100644 index 5f441f50ef30bc25a5f28cd565cfabc130dcdbce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1030 zcmZuw&ui2`6rP!6XR~2fbgh-D)gH=14sIIsD21i9LeUEK7vwUeJJW5J{HT-EvYssV z;IX&<4bmRei~oTaFD?jM#-k^13#|w}h%-sn7TO%%eBYPHoA_CUsnG@ z0DdYm`bq^jT##TFP(Wb-Lg>N}xd)-(kgt1MzPhCzvP!=c zv5+uBzr(%MkE2B3Fs3X>mfCq@9*u$=ev)7pFyKN8Tts09x*7sZKW{IJsQQPy7fzST zF*CaLvud|`jy86VHhxy4`hIB-<@!Dz%_;k<_R5waDvw4Z%6ZFi;QS%Z>Mw$36doAg=2 z)maL&6{L(Ws484nLhW(Hp2jj{n!vQ{MV(k6x+09M8F|d2JlA?M*P6dC%y^v@NBjSu6WCq7OLoL1jy4V=Zkvp8^;`_A&W7s2;>cvRLa=1{|RytT-0 zj5e~csN_R5=}P8p?&rjRv6(-O=Ey~^u3_Hkb%nB0lM)>p_woarD;VQ&C=HTLV|Kjv-AW2r>A25Rt9RL6T diff --git a/osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0014_alter_chatmessageattachment_message.cpython-313.pyc deleted file mode 100644 index ad3aadfa8765c48ed6bbb3392fcbc9b2393ef444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmZuwy>HV%6hGUE9a~L5(hr(S6%|yKyu`JDp%SVTwRA|KNH)+V(#eUhsllrI!2~$K>@KL-q{JQ)LQbp_kQ>8ef-|tpjb2zeDA+L+5amc z^g|eO*7j5tL(8M^thVm0gJ{u53v(SI;|R7Y}5* zs0Av~oXM;9>bf&?8F$97z~-*N<}YJz-c{FRS6fq{rlMP*<1O7Zxc*?&-kAo6pkXa$ zL37_r_{!?4eG5|(d2IsA9s#vU@QZ*2NlY_@63S|Q;QjDwqQ!i@8 zT=pBhkk$vI=h{Zq-KcKf<3@ZyM%Q5$W0t_xXkuua28~Wa7{+u8q7L9k{FU{X5y~v) zg+ZHyVQ@sO&A8bS{4i@brq3+kCi1L^9HvT^I|C0%LnwkY>--K{FqGTa6FuMye4g`; zhqPA?j;IPnq(Y3AIUwGmzKZnqz9P@4ukZH_q)+z>izkJ}(`%K}sfE+he6O@}Qd;>m z_oe)~+_S4)yV|pBUAxw^ov!VC+YP&=_D?OR8+}DBsc&lZ`Y4I1ay@IH;x|&VGlI+i z!AkaiDkEBHd2}`peu6Fk;4LeDp%RGeWZI5YOSbOg`1G=#I~?=Cw6i-cAMN0Ufg+WahH2vEbf7mbw4|CmpdaX?EJy|R!Fq3psrJy zsL<9yo+cHm(?TlU$qNob9Zn2xaT$JFxK)M+STW&NY=iU71uyG-C!8d9+{L$iZgU5E zS%B}mu$1+)UbdXw;~wu^y1aYoAZ7(I{#}fjbdADktGtJd1Km5griWa+g-R!9tk%yr zHeS4>Ow>?OQ^-LnmH?}3HaW{d)^uKpR~Fg|Kx!|Uf~t={J)F-P7(i7Nc~cKv?TrPK z=h~H1A#|^h6eWQgv|SgWgK`;(sAM@H#GKw~3WB3{kdL7{4DV~7HhoHUKq=y<0x<4V z`fMx?p9=#@Odjg5)44v&uHDmEp00ae#0HT)!pskXnVM`tAn9Yt+}g%qJ+8kKdkB* zPHK*;uhEHuN=1;T0zim#2GI_v^SUUb5ff>?zRyaN9I3RP6nTVNN)}1DXo8kNTfBg= z35>|m?Uxpzf18WW8Ea_cz+G3HUaRh)oK+su^l_`FO%OOXasRm;o7m(rasRrWiJoBO zUp3g!*Gny01%eN}E(K^<&|GIVg4Z%zq Ma(#Q1_~eoEABFZL3jhEB diff --git a/osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-312.pyc deleted file mode 100644 index c7cb143973f84b34b41b622926976336e993304e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1516 zcmcgsy>HV%6hD8)c3Wse5#_4_TG3=6DH3c58Z`z4v`Ek(HA7EM?vf_;NANkS!UPfn zBVu7?1eJk50Tvh#5*9hdbIt% zh9v;Lb0JwuA8g%W;5k452{v$qvLJ9Q+M*+sB}XpHku2FtSrx%GfaJ#jDOhSANF42c zH`pC~l~WxltN!3HD^QK#AZWOCk`<}pH0r(;G(4A3)$tIv$zqk;C2Ob;wq6K4Dh$d3 z0%cJI>_#my+WlgsIlL<+XoH>Q3kh|xoQlql#?0OwiAZ8Py*a*@jWLpujE9;N`!&t< z0PffT?!V5EnT z8W1x3wv8DchVXvdviTVZeO@IxPS&kf%c?Lv!Y%9~>{dHIZ*qFDP+GbUOLxsXaN%~* zyhVq1EEYFcjHqavzMEsC8@15M2r?#>sACN&B? zYtdP1crDzYmRDelcgUY-`4YiC$+PSPRnN&6y=t2$l;jt!z_L4B;acb7JMu1GkL11> z;dNZ$Mm(+g-D%9Tie21WD_#s3<$Qk~BVC-&T&v@!SYXk{2b6qb+hfpEfu4C{bhVjK zn|Y~qGjm~P?u%B~)UNatXs2$%tlGz-a*i277J=;xBh3To6({GmE z-utlpZnA{1QT!QyxL339bz~^5KDyygCI6Sz=un)>T-9@HaVO|~234Y_i3@&ohs?#VTrR1! z&)ME-;kZqbtjLHMNt;q*6<`3g>Lt7$=fYIH}Z!_nzq IfC-V0zdG}C;s5{u diff --git a/osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0015_chatmessageseen_guest_alter_chatmessageseen_member.cpython-313.pyc deleted file mode 100644 index de53017d1c7583df170fe8eab4b0f2be898da76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 zcmcgs%WoS+7@vK3z1}#abrMKh3L%Y%EhKM|=%EsVTFF)@X^Z5Iiz-&);)T=I0#* z=lh=??hyl_za^8O!i+d+0`VR4k+1EbZH;NGlGb=c-_g4U34UPXSP zZ8TrYfnL40;6LPH#lBIqo=LK%37eBNjcA|Obm0u5J`2()p1C}HMC9j#H(1`=OFHAa$V^K;dhRGo*5qg@`445i8Ntgx$0w(e<^db_6 zFk)oTA?yeAptdM%tSm4V4#wayiV4tVjK3HKvGf9N0pni8cp68P&;(;|&wO+WiE#e6NY`f4b$}6XjEjh;U&y!tkyPg~@dj&fSEOs84su zp|HZw1KLl79(IJS(t)iI#m$Dl+1T=g(~yN!zQRd{B;T54jCl$h)WuL(7Ij7`;SlFC zz@NYmiErH&Cycv1h@%0Cj+;yoUF zk0)Ml?DeJy#oDI+9HGT6{dv(WIa5dBTtBj}E1WC;3Fr5H{*QzLkke<;n<386RjjYK z*}HjGHCxPO1*~@y+RKKbG?RoKH9uMJubc|&*@v&5H=Vtmqp3D#;2R(l_J`S=e#G7b pR({d=8eCID)3lcs(%$(CRsTe*FRY4YJ#i+N*2kCDUm{=>#=rRWdZYjV diff --git a/osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-310.pyc deleted file mode 100644 index 78bebb2b1f81ca06e812e7e71bc8943f3c4b8b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmZWn&2H2%5cW^9n~hk35OC&%6bUuuP`DseqzW!j4yBh|Ebq=Vc(IcZXI1qIT>BtM zJOfwW!B~=oS8QG7WpGV(0W4|J}ZV7>1I{pzkV8AVN zyy8w&g0t5Q1jw%pB=VK~A}a~W0V~oo>ScupxifXI2h%n_Ok4|S{W6xW+l0U_9sigd zvWf$%1n`5ls3+%(~|L%m@coX!1?+YH1W^HXDX{)%2YP3VjMV}rSw6I^y zLZ-&NQXyB0`qmaHzNOTswYIT0BESwCz-DRC_kz|A*-L;|aYipAobN?S<8aJ{yzTH( z#&4{@M;)U(|6Cq=?0t#OSVU{h36^{4KMrkI9%yUa!#BE%;GH+avUMdX)abIo<1v7h zZt8ZEJjO)~q5$R9qm`uO(;I626J@JA>Er*1Pw4NG%b1YKMUo0Gc+QjG*~M7jFOo3Z jux-I&+<4q`EMD!iiSE;!kUigM_kzA8^O56@cp(1($uGn? diff --git a/osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0016_chatmessageseen_seen_date.cpython-312.pyc deleted file mode 100644 index c0b30e40abe9ed7e8852afaf2923fc84ce8f27cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZWnzi-n}5WZ(Sj%_tiB193*SVefCZUx(iiFhYtxRl@5`@%=cTPfpzTy0R_wMf9eZH@iiUaDL%)cCt7{GTTt5aHn z*?|J*z=5*}V&=10^ECz>E!yMnZOd81`id7;#J%KjN?`en5~uGT*_zE$_+?(USwOVf=$5LZ7@kS8*(C1LbyY0g3L>SLOVb{zRHPs*9#*Ze@#C^EWH)cqXg=1NSxRq$ z;Mq(6fd>Wufxn`?>@rtRy{)X`)tRL0igh4wp6C6_JI_mI^}2)P`S|t4!556sH$~>B zat>y@5*#BR`S=m)V2V2$)o!9?bPM^~3i9TmTZZT{g^VI#2I9{3WqR+EQD+j1EWfOVLb@LhpH_#6s@<_6mbfLPdNDy z=Bv0y2;*`s0}^mfRc`tMN+LPL4 zftSHy0m4^77UiY$5c&!zX}rb$J*n}X3p)OhYh!ps)mjRp0J|s6do(qX{S;4i?W+0q z@zg=~m9f=2wOW(wwufgc5cT>iwv&(|RY(X_m7_0lIRFx>P%E_siL{kSa`9zxveRI9y*6G~RnBnj zog*Ci6I}TZd*#Gms03oxZkvdecJyXucjkHCy6E=<1J{pdKhJh8!}z70^<|^8hg-fx z!wg2ak&~DZjZJRmR&3>VY&X8eo!EVCFq=7_4d#HAbv{{fhgoAIbbsT0BP7a`P}iwg z$k0?lo-V4SP75KGn->hYJelir>#K{-9&Y&_4Hz+DMr?xh)dnYXzY#_jX57JE9y6H* zeimSVWN>9N_sY77cQD@7ap-0J%+Ky+1Lo=b%)fHl)7Cjlfiu-#U8A$5+FWyQ>&wuoJe)-3qfve#D3*d6RIdWA`?Y1wx;P2%D~~oV zr7EBlyIycW+@tj4MZ$GwN-LDzP@D2HDa&Mrc?Km224cRfOr09+PbY8abbR=Z9-kf@ zj#TgNL<&-Q`-~lF_LY7ss(*kaCTR{$Oa(_p1?fV(g{5*?mWV~6Og2+q!y1)W-uQ4r zPo|@h3W^eLp2K&e+Qw>)x&9JOB~&tkJmmnKr%Q+qK%Un{8I2R3=G&vB)Xu3)>v@q! zD4Iwj0hbMEySBkgm}#Jg8Lb{)gyOzv#MKJY{{&nm*5sHihvl+zkfRnuZZ#mVOk)4F zU6YukN9;egqtRnT-gR>}^i;Q{Gn^OVtevla6JfJPigt_-?}Eej#~9uYta_veqdTug Z)S@RCQ{HYX^DBa$)Z}{R2Jy%P>mSV1D3JgF diff --git a/osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-312.pyc deleted file mode 100644 index f1c9cc7ae3687e432228eba8f4ac142656265138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmaJ>y>HV%6hD8)b`vP30`VcfTG9rI1_odOM5P)Kv_UEf5*|1?xodFhk6^p1vQeo6 z8*KawMeV?Z7-4~d$pR_SF)%Q(1+@r?i90(c6;#~t?)Tok`@MJfJNrYSpaD8ox8E&Z z76ACloNPz~u(d$JbASNi9N=;$$1%)1yepW3E1F{B3yx&UJh%anxCW4fh1Q;oXgF`s z8f=)kj!=@nF<9b=65=Sby=GYAiRRkPz=~|&3yJLd2s>e=!Sb?^AAqe2$GXD6=fv9oU@<=Ua#WU1{mN#E$L~JN9o3DZ8J2Q{5OSJM5a?!e~b;jSzJ{yMC%g&JXRz zLn|W3&Ye4d5i;oFFtnOD#Mpz0K~{u`!j=NxcgbGn!w3hi?NNlPlt!vMmbXMiZ`pB5 z0#%r)3O&okG{&s7Xk!PF!f+d`cgWZdH{%aWQo!U43e*tQ_aLRhw1a$r9ab-;U169Huezq8l8Z>RkC-cR=o*p zcZ~%&e`nU1Bl$lWHV%n0gV1%>eZcON6lQ4?Rolf$jA+;W0NYLPHtrA^wJfjc6CTxx zl5|bqI8p8zRamLb%@NISy461%?g@WU!oIWHx0GR@#$k_{Jj2vF}#w>v?Oc9j_Rp@pxg zSp$6;s8dh0t}+=blj}-%>RLQ??V~c&Q!ex+VN8BJ*Utm>D9bn!D@S?gmO2 z#jakA_2PQiBAg@Ms#`gR&Y8yNJ$|h>4i-C6#Y^zr?2j6aE7|zw>d>yA#uqZ2;>brO!>xTkDd diff --git a/osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0017_chatroom_date_terminated_chatroom_terminated_by.cpython-313.pyc deleted file mode 100644 index f6c97b63816dd150fec71645b40ba4752f310202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1456 zcmZ`(y>Ht_6hD57qNO^a-NbE*z;TSk9BQUR5*SE>7%+pvUj;-dMFJrQN<1@+DN?)$1mL z_5Cl8p50Rr`dbL)(vF#<1~A_t4|&oCT9>FaFL-%FURS8Hu2MCZl?{#Rb7%p1>W9eF z+DhZSGSKOM8*+$6E1_cRF9mB$++ZZjq9kOt%*|dDQa_8*gmJx>1|(+NU13+Q`Z05K zUlLWd5tTedWly3?TW#dsl%~bLfZF=GwSd1^p6tlf0AH(+&r;|{@zl22xO7%q@NlNV zPhXL}%8JPSE`J03=icStt~Wk<`>Zj0j_&F?y7{+tUiJKbJ#$49l|r`{y(wyiHM`EM zTjh1XG$0fJP)S+TedcHU>aAO!+`)qF5yt$GFhUZXlfcgiH^dQ5(;lA|GR_F?MG0_0 z6T)bn*iUx3nhfIDRsdE3B~JVv0iB@QPDJ8>*H7JWXUJ#Ih-G|cYgC|4#X#|DnqUY; zpn@7DvB+11m9z8*v~ACD1Lq2ixrs649mE9q8pdA^{8;1$X&U35h_Wn>5|X4CQ&q&C zWqW?V?{~l7=Tb|p%Tc5AFo4j^n5fR3X)gX8%8lvLW@cJ6m z)r@*1*KzY_;G9qlu2HGh^fCfpK%+ z7%x2-Ej{?dSUoguPc&s#f3Z2K<>yxpj4OwiuN_`oIJD-*){O(}#(wi>b!2_|s-jlS ziTQu4`P}OIfpvX<@u%jmkA8pr+vBm@8o8~p`*h?!9lPPk4JQcgNn0{(4f%=uuh^c; zuTHj^UAYKepR)9?*6C7NzHRWS;+mGbX|hwmUp>|YoqSRXls`C8E*D>_jI4&R3tiaT;QcLpu)#g(Y~kh>4z_Ts z!Y#7dBX4cWMrXD&tIu|4U3dcyS022%GJ9!35AM+)dlcP$8gKnW)2%db|4Xx9Y2LZh z#O={Oyi2)$PdA_4CYdtckhz##MumQOboBmXZlIDfpl%n<) zD$#+$DJq4EVylglD7(^rwn!2kUK>v~uD+}GsQ$W{;Ixu3`pej;PX#8B>(1>);sxe~ z?xb=o67sW1$JTUco6GuDJ+fsd9p;$l)O=ikZdiX(-RxEw8dQS5S9z!Zs6nwn%?e4< zdmB478-=c68i`~LBqw#(gdC>PS3JQiE-tN=wK-JlpJ{sDKhOcU5pk|V&MCqLh0JxE z^Dh@sV)kbk;2bl+Y$7mM%ouH**gQWo=S6u&(*8)q$5eqclMNlbdU0N&&MDR7rAV=) ztrwWe>xu-&0HruQlL|$geMZ%)!z{{TsTquQV7E*8(T$Vii<9Hik9G6pGE&tlImhbk z{@|#G6o#FC`*!$>DxME9r3zq@h$RkBF~2J0e0V{9kUlt%=7xMu^_|FcNcqm9VTP|Q zDE*hh*Elx7)OL7xQw*tdpYWRtNAX1Cl5l%$LgCTn!re4NZZ= zJpV7h#@rqY-LAVsFZAR|=X>b-e;AvLto=6%ez9@%>$+L)cmQKt-Ljzf pH^M=AEe>vLq0D`2*WTs4M2|?JgAd9+`jGBQC$H1gWr2I>{SDE6td0Nx diff --git a/osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-312.pyc deleted file mode 100644 index 8c52caabf481e55120a4e52328743a3972ca1c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 zcmb7GO-vg{6y9C0m-S)?dvP!XFceTEBNe9!YJ$?HqEK2|!ht3^__A6vW3yy`$n2Wb zIW-oT^B@*s3L4(@UkExLJa#Qcj(jT@xqRk!wq{?|t*lH*emX zncd%GF@+<)$EUv)j%AMfn>wvuI519Di1CyI9N7KBi7az=~xQk?t9e?PAGt05sk8O`qtu$-p`JfsB93K`zGw zE++uK$mc==2gOcv0RhlHY5PLEly3u({KG&x>^l&Bq#yv9vE%322LVJlk!~ESc&Ho* zXKMY7sh(FOyyyXc#*6jFD~1m*wA9H6al4h1wh6!hh#w|;V5vQ^276#7L98cMq$if# z6RZC%)=*mt0+VDS$?`hfp-+Ud?XmOtcC-VQ?to36$H2wIq1N6$Otmalr%ur&!7z(% zs)LdUM#v7i)Y9llE&dL*(f_TczC&%Svsy8lQ_JI-G>+VE9c6N^`yAKU+|oTff91*t z*EMP)$FVe^dr%Fp5YpvgVvlP77TD_1q-Xo84*YIlILif2-3m0 ze+L_77SjG_-B11QgM-WGMA<8>0)NI{?I8;I=mJuvKgdifZh4ZFv-^Zd|GEJ=P z(wSIX86FLis^EwT3jrb!7S)gn1~h?-W37c0OVIUj%yROEN#-e8c_yu}D~!#HX!Tix z6&JcLx#Bbf;665=gB}e88JY`#OemP0@W?d?J%|O*A?T$uoiK|6hoPk#<}n~R>895V zxkmMGG!xoIZ;PoM(+l|cC27_(gILyBM4E;bO(PMONXQzFYTAR6ZqoHp55OI0188p= z&_(pF#{Eky&$sEVjObm7qn{eZMN)wknhh-9-B|Oj*fOcd9m9gY+rI%VXE$)TUz{jX>s{899i1ZQ83Ecfx#Q%C+>tq!M*xE zdzTd3&5{gyn~s%Tb~Z~Ev^_Vwu6w#!rX9BazCT6Qh7Xw^xXgYC^OQuZnSK2R%96c$ zLksF*Iz8nR#E&XvNeyiCpB`=(YBN3&UY>y;$xsjMW4TlIWzm2E5;NzX}NiuI2e6$Nb z)CGU7KSnb)T9ro|G|o#6b$ah|U7fC~(?2GUhJGFSWu(5aT3uMJFKkp7HtGwx>O!uf z?bOr5=nZS1PO7tp-xeWsj50fB&J_1*VNT6+{rh&Q!nOg>K9$OsW-Xpx)y&^ zl^%bIuD7;GM#2$)N6vvfJ8%9G8#x2#{Li7e*6Bc3T4T|N)M8RMi1kYT$UoG#&`sjf n?+f=m(lkRn&;KiNeCAJX@>E*nd1+6n$7ibXnSVIyF^T^G!x&qI diff --git a/osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0018_visitorlog_remove_chatroomguest_mobile_number_and_more.cpython-313.pyc deleted file mode 100644 index 0a0334ac3782ba3b34e6689b108753147d1b2324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2444 zcma)8O-vg{6y9BX*Y;w-Ha6xb7#C0^bHHgr)VgV@C=`{S7`Omz8TS~*S_7gfrt&%lE?GD_ue<(ym>Ql z+TSlS@cHTY&E0mGVct4M@56T|rz}MvaOniMFrhdux33ddx74V>KdoBkpG<7W(X@W zgp*hjkhnZcg4=vCdNIM9J6b?Vs2KD0@e(fyQb-CHg7cgdfw+WU+}$n+G2;7TfQgs- z3LL~lAtvd^0}=fN79s|&i^%iRV1a`@4g2!Mq_~v0(m!;KKY67;B@JBT7q9V0uJK2^ z{*m|WF9j7E^Y!uD1I5f`PjSEp%lcqbmoaHrN*4msNFe|f_g9pXMnTccqHpzxrp`5BbT%p|RaxO@ta@96bnP4ZG_U#i@ zm&qa8!-q6tVWP^K`V`aX0VXBW!pM+yOaoP-(J;X~m=H`r8(-37V~+-ns-{u#z*))F zm1Bu>rD#OMJ6(i>D2GGXQL(02w7<8JN)=l+?bpqcs=+!{z2s7h?z`fyOVYsQ4pg+T zWx>0HRE37z^-S_~uv?+IE|3d!SBE%wo3M>3XPbbIpYian3d&<$R<*X`R60P09Lb_C ze~UD1RP0@srR}_m?bk5;!aT^OXc)Pg5TYVNps@;~5sf1BxGHPT4#65kXh$WMt*Hh! zOvkO@eQYS$D67~a&YMd6mfX_ccV15tbdcy5YGn})WyL8F4L>Swc(eXxIHHHDjyBalVG)Ctiu5c$~Ur6F)62%XxOa)l#GU!7Nw=d{Wbh(3bS**7#!~DQ>1SYb;kGLfNXIMWDcTJed$;;Cl`&Gc*|J$oE{ zJyY94HG|aCRxM_?;=@P6%fT0eZ$@&p*la64ezf@#y+FUtA1n2VrCMwm@{bOhlXn`E zcaD?w$%R_%^H%)E(M~gSyOFtl9IR(PtHl;NeL`~JgpWkTPV#)|^vza0d%_0*4Zn+~ zebI@_XciXpMaO;7VPEte-tk6wyyYkxYb8dSiRngS`sd{F@E@bUjW!Fb^}=eiP^=e< z&B9i_uvJ6*^~B?oP!P7@)znJ|StD-xR3kA3>C>;4>xot0xa`HasaNy$#85Fj} z`E>SPLim1-e9}AhoIoR9lg%k5_g;BdY4i-7^Zq@V>)ir!rO$*%b)GYJD#4ru!&m2W*Fazeu%ew^XE(U-heh4G}r==vRXrS0_J0ny?Py?0#k}vrpndOuFdhC@dLvptaOzy`Tb+ZqhcO!;4*h;k5t$IpJr>hl F?;qno=QRKT diff --git a/osinaweb/osichat/migrations/__pycache__/0019_visitorlog_visitor.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0019_visitorlog_visitor.cpython-312.pyc deleted file mode 100644 index f61c89cf19b2fbe43db4c0a5043782efbf2ea520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1026 zcmZuwJ#W)M7{0R;$F@=^QPrxnd?^)@2ja3}fsm?}qVmz9g#j-oCwC2wY+rhIT7`*9 z9T>ayFM#OC023Pv3z3jg9U~K4q!uA{;?5sXskP+yp69vq`@Z+w`Rmx23BU$M%+ zB(W53hJKrQiBF@LYazuXh*w+L!Ymp&Ir<>LJ|Mt_7`O_CZRn~BAf@waVFk-Mt#jdY zstk+%^iJ)p-l?9WO`M}mp4D*qKr8llP$`h;u-exxgBwqaO^O{?XzaIMdI`TfKY#lU z+VW#Rp)8v%c4)e9X%#}uHlXswJBF{lj~_8;=p-jabbON zVd()kX_w@e;2k)U_MR~Nc}!Sriwz|$8rn;=)eA|K#P+I}ctKxIMBc3|uN{%?l;-o6rZ-c{SsJQ5&1ZX!ljoj9!zXBCIln_l*3juA)8FP+hM7;Gs{d1!IO!J zXD|E*9`xo>)S-O&Nfn zsZp%*P#LTWLTWF`@OQ~tDiqeBN z-av<3^&JZ)7}t9G?6E$3a%2AF>dZ-Xs#l#q zuFij$_&oV-`pb0BS?fA$J*VDv>OE(>>ui6Aoo;pSmsT>&zM@vuH|un+c*jz?k(XTa zn;Ek?pVR-rTK@0U3L@!D5u4GJr@AFDu0P28`H(IMQxcoq6r!(4lJr*vlJx`3{Z>aL S^_|%pU+9i6`~kwq68r-|av5R( diff --git a/osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-310.pyc deleted file mode 100644 index d570f3e18383e30dfc3cbe34e9944e086a46b85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmYjQ&2G~`5MHkx$IefiN>BtRBrf<8rjX+AVHb68``yYH1q9x_M2~ZMYr1`IDWkNIdx4!e(B);urS!cS@h8` z!iN2!sX4aZ5oR*$D`6HGN#lz-ZZJ9`UgH}7As$t&jK?x8xyTD;XM#am z97THV{?I&ja28WEK*k0mW6F%!7@J@vn30)aCrxJI*I+hlURhJh9K@WMF!!6mTDa1_ zG7;?{>LQy~(oXE8lXO{^t?8B6Wb0QHbFQ%-GTcz^;ffmaY>I+MXJM%x4F+2;g9~2p zQpi-qD_5-zars1u>;x`2EEMJJbYIbfJ8}Gx}Y$?}K0F2rPIpfnQNXSdst1)vFGP!~N^|l5~ z)r`&rkDx$}!_Pqqd0d_;E1##SvLy1n?A_MX*M(`sGv!14SGgh&uoF;%qNTv|tcsC6 z<&d)C$Xi!VP>~D*)d~V^+dKvIJ3;Vi9;SM;ju^}!XOKr63Q2Y1_OO!RQ1@Blog%99 zhR3@o&c05qT+~q3ZudBcQ-P)qZI*<2EEHuE#uWD?eT2o)~EE@ tq!OvteQDLL$QODRc{{g-2APfKi diff --git a/osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0020_chatroomreview.cpython-312.pyc deleted file mode 100644 index 6c3ae9242fdfddbcad4796d3e28ee8947f3a6ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1340 zcmZuxL2Tnh6djKpCw9^_S(b)?+6Ac`Qb-(DXr)RBskoHg6=<7dOY`5G`Tq0g{cr!a zw4@^#4=#T0YBEB936hT70-Wyv_!bdFBo7Uwjx@j>ED4T1xuan80V484L=-CZ<7jDs z#GXK0F*><1ZseW`*uY#LxIJb^Zs3Pp9R!4W;jSb0(otN1^A$;)PEki9sDp{rlR7d+ zRQbQN2qt1r?U&OqnI#H5IijBCPn2Y}i%B8&u4G;*>LH?iClQ?}r^WOJ;9rXUFQs0Y zh1=`>m5isTUrJGC`!8iUMg5mklv%QLTF%by$*0RFIN1da%Hv9-%C%dmjG$>g2wmsE zj(DxzerwY@bVD}^m>2X?$jc^d-wuMoZF=a^BaU5iXNTh(+YN=6>`@e04x@HN2`>(r zJFwZ<`jn2j7E5#JhAf%RW4=68ywXC4_vCIoroTO!O-Ljy?Mji!RvaHWWwkMngBXmf8 zLVd@jArqa-i)JjrEzy%qbP6xM=k~ThoE;IGYoH-Z;L=Avy%WHcP?hv;zZY;!_IV-B z4V2+|b8FAs+J2ww!H_Om{s}sV!05Se+y!Yv11=dk!NAxKoY4UE3XNSmvc0j`@a<+2 z*YN34%ojAqM|58}33ZI@lQP=vt8FWljK#%nL1|PtG@kMR!Y432L~|8s#$3ji)vrIC z>qxuujXo=^O$%#h)z|*4zBs9EJUX1!Hm0?WACzC$Cmn0zv!}IiQi;y0uS`~(kMGS^ zo72_i@7Ip!2wlfFF_@3>U3`Ji+C4$4pWw4!&?5VB&5|7%Q6rTO@+G{(Bous%a5DLnHtrV}RN+nAODQt+^lor*~rV_F=TJKJrq3c~U zyG}>|2?>dFFGxLc;=+w15*IkZ(ay!uaH+&8H&+31<;`vukeab~=DqK|nfK;O5FZ5Nba4JPh73Bfzb2nj87z<+%`80^{dD51T>bY=cC^C8%aRno;Vufp1 zwH2;+3!U62-vg`61u`jiYX1YzMX(j%XW$|(we=e+HoI#D`9(`-{sQdE1=uSuVt5`e$f&l4Yi)Vg1zhK~{-U)c%)2>lr$yKZL>8l% zd3$am8m-n_ZL-f|mP9;=`nf3P9WZyIXwaeij2;M;`46^)dVAB-Mb#Z85%D;66Y7h~ zkh6iy56NSCD9o60<_7GDit0Y)y(p$6bO%(Fz}u6RvowfbxaAIqhg{MKTIF`=v)x_F zX_)Y(4AZddb4lLmbqQ#q=`#Hd@^za=?>ZgA-jyn zNx(uHM$+ulAq{;RdW^Yx^Ai?a1 zP>0x#p%Mcc1niL7n~^sf0Ku{SDB_Q8AS-n3kRGH$7CQqEXio}~Mf<<^&2F`>w@6Mc zPn)6%B{U#jI?2w8zlG^*G&7KC&op(}`0|5U8JSDd(&}+(^`!p#v-+hc`_sm?T`rvccfB(q@L6pPhXm@ ztRJte|8V2yo4>YyX-^$Iaq!gXPMq%4@h6TyW}i(~J|EY zZ{`VGhA^{xH~n5(y{up>|ANiz6VuGA!QagHrd(%7*?@`CJ6X@X%VoF1w+F?q!8Fqp eMfux6iuF6X`lqp=7*ER6+S;VH_7?&rJ>VZ7FlVd) diff --git a/osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-310.pyc deleted file mode 100644 index 119b3630dacb4475dec2d1f936ae83f3b92fa892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmZ8f&2H2%5cW^9$*x+2_&ak#%4M@4aYLv`6(wfGZ0Sh1 zBISEZeOhZ9dm{pDu>our27M=Ju#mq3cpdlXWQ5}r{L&9NOk9gsB7JAw1F8<;&qevc zW9Lh(jYYK9oMU;2{;YRxd91CeAHUUY1n<4+7p^X8`bL)xZiWO_x>>s2;s)n2i2{_@ zS5lHnPj9KDu0)x(=Uu$|5xKudA!kA+mq{wP;Cnpzn_mv~qaq389n}=(!>Gf6L-Bf; XUG|Xn3HghiXfNrtF&{bZibwJv+rYG^ diff --git a/osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0021_chatroomreview_details.cpython-312.pyc deleted file mode 100644 index 78444710fc27f7f1108bf02c68f3aac2d5aa94f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmZ8fO=}ZD7=C9zCc8^pYFen8olWl=k4S@Zu>TB+S*5w?HC7PtHs>L_3FfpXdFW_kDK0udZ6a&*|*j(I*7(Q;@~c zOEBH%-~tE`6hVw!6f3TRK!F!PlrtbIMIF2-T7ECpId;{7X6wHMu@z>;VLS7SFimoX z(83R+{E%1bt;kP~ znU?gT$X5BDVmB}GW6FKP>PI1sNYgf%;Yq*eG0XFKUN52?uXx_Oo*#)^!3gcrgwP}i zX`TrwnemK}=b}fZ32GkF_l4xlO1rca^$SeJrq?IVo1A93!}lqIG~;s4cnH!6kU!<-3?>-N z2NPA<#2;QwEHJk}S|g)2G-~6m`{P@8$JP4zy-~G3tkyqoem(e6eLSmZrZrJ<6`#J$ zZZA4EZH<}p33o|LY9f`G-?=5yWbPe~u8k*iVfV8dr~GL{zRk@LWT)xa+1+$zW9&^3 zya`_V4?O72yT78nB+S)QZ;>coo!L#O6bJU*=Xt;OeV^Ic(vl10`TYIG!AA(d4@DNo zoP*i61ScQ>0ek{lkinM5wA)|})Ip%FgFx@VwzVj_c;D9x%=EtDndgdlns8&%XJJOt zgbOQ9BTRYkq6PqGPG+wpH~}5NU;vmFK&A(p51G+1+vR@?3M@y_1EW)FSN2guE97@6%OP{jlKEX8l3U<9K!bW)nA>kqbbuE^Uq^^%QuH1Q zvy74MFvA=nwk%6#@&V$=f6g)EJ`X90F{R`f`#WiG7~>@4{>zjd`cju9^b)vjP2T) zU7Ot4oGhd{lFI)daOI!s5W+tefZi{w46RS@xUz9t+4v14$*cbYoetTR diff --git a/osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-310.pyc deleted file mode 100644 index 7f8b726c674bd1efb82234a64cd1b2728d830c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmYjPJ&)5s5Zw_-GQPeR~?!at-047g=A zFL^CW!PzSY0_0}~68TDglBI;?j7`&@G|Q$U#VCn+MC|uJM)XgPi08wRyP;)aQ#tPY^r`4l4fl!QTZT1 zHM&OX#hjiSv~Ws~$kfnRD&$Jh+}a}5x0L#@);7*Y1lVE&*eneCPLSG=Jp*_d@91QN zljlp_4LIbk#edFyW!)jML;Aff-h1qPfwi%S)|xFAFVJ7~t}V{AHT8qnx{cs1DO|X^ zAVV5mG`JZGSm~y6yXFSxv4|cO`|nhcamQ+JkQ)3sYPVhd6GjyNE~ShKnOrBS;DX=g s$)D_c;7_MXnCzAu!F&)oNE^t#j9qn)?g`nGon24Kf9B(kJK|9O1*3|(d;kCd diff --git a/osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0022_visitorlog_title.cpython-312.pyc deleted file mode 100644 index 501319dd81375ee2b5d9c7278e423ecff7b1bba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 803 zcmY*Xzi-n(6n^Jlv8@)Bs1k*AN-HD})TOMbQbh#aX8z-b{eu#sRLuT zj;tX12QV_RFhxR2bSo2Eqy!;#;_ebFaKrQW-M#nxz3=Y(`nn5Zoz1_Ud_Vv{B`KG= z1hYc{E`b0+3}O_ZSPL`+8ax4_odeM+>RM&d>ibz=;6NW5p7~1>PvdSJwX?8@(j@0r zoD$0N)~W`;S&|tM;1VbVh(Mqb)JB1>0X4cx@V_M>WDt2~b#MH?FBvh2NsKG2lyg-n zk?3d-ZO`G(i&B#iSV{A!)d>q;+uuL9k0s2~G|uR0L@Ycxr?#L z>oY3w8pdz>A(Oe15!#~(p-C&Ec_#hk_7NeEWsl5|)OpkiGsU@^_UO{-PcV~KT=)D} zIn8okj99eN*gsBN{g@_2?l;0BWJ7t7g!f1{OxmfR(1GGhs_=j|Ws-EoU)`iHtUACe zOR#ceuQ$x(yHG)b{78gzm|EaGnCjZ5_3ru91!w!cJGN^hyEeJCGr74nsn##Ik7f79ekKts(2e9dGQ8Hg#xuX>!6j4zSDD9G^SBe-aK_x_mM1T%4A4?>2$+?M%;|sRa(hUiT znWZxe1N;Ld7XCuJwDQW-Eht5-*mp!>z|y^b9={*=zRx?EpO1h!pT0fseS`q~uw;7t zzhJUyzyUx2!AGD01#CFNxd9eI4It+VKyC{*gK5(2zU>xRxLvRApITCPbTpt{ktmvR zse?h55+*yd902lm%){iRF$bUp1VlhM2nrWDF%(|QZ_fRjP+-%Fi@a8;S^2NeM*;Ft zX~RY34cAl&Q7EErR6nP~C)0jT?F^>FQYLAqmnglowzhr~TPU(@AjmEydpIR3p-k#% zmrANK!LqLQ6;+HprDsOLx~u&*OL*T*n!Le`@UH4|V5ymER#E8Lj7{4AR%tjk_9^)M_NFhJ>etcPNpc z>x>43D;dAYL_aoC@g(MCF9+$Xgm<&zagVeuu;~1~T|-=**4wUoIxIR{P20IZxh%yW?X*SgHG_2dP9giIxNfLfCy=(#*o6@O4gjp5 U1#>X?5FJ-m4l66afFXJIAG+J$(*OVf diff --git a/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-310.pyc deleted file mode 100644 index 6621ea1198939f5625f140dab94cd819e57a1583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmZWny^a$x5cbb*vb(xNH2f44R7h!VPlxCbIs^gHh0ot@yW=QB>-6+O_SK!^ zh{L-Q8f^fK(N|Eu1b5lnd3h#{ZXUjs z^8nr>0aM$Q$V)5B7M9UaGuhU5?Oehn7=g8N_mCy>_jt>n*eC0sbF=r+{HhDzXMo}! zpvnm2$)6-;l+jx>`MtBUo0vHsB|cw|aHJ-Yg1C4L?v`9z_wh!bJzbOejD{wm+iiB2 F{{>o%%l!ZV diff --git a/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-312.pyc deleted file mode 100644 index 752edab2f12cfca0f8d8362d4f4e9e19e6731ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmb7CF>ljA7`?L{$2JXWqaviH0u(AF53Q@RqDqJg1cFSkcsV(_tLyY^2iqZJqf!RO zZv6`&Ix#Uau`oqKN^~nzw@3*>>cri}CXo8;_Kmm^cRt5m81h(}eY4QJ{&atcZHM?{nh^;Uy4E)5) zf;dW<9>$o^w6(|qK$gRW=|?`D0RmizfvaHXLswM*(b`4CQWjRQSkv2Am&6=m4VSQX zt{3H;mkacd-HiX=%~xEbZ`u|!pA{YQcFS=Zw2r)tUEAH=+e5E{G|1wF#y-k|j1pGP z6}Hk$;$BJ;6nPP5%gH19Q{B=WN(rbS&!`I05gli^(BNvw1j5Q@c- zQf=5KGmwM`F$*D{(4~aq6@*@PJt~p}!=ytZOrlmm(nMSuGwx&jP;8cHf|?JGyhL(l z#T}Ag-+M3>7GDmW7rgG&;hko!ICKu;RyQP3mO2eD^JrfzMBX-TdyyYI5$Q>uQ;B<| zDT0Jg&f`b32g{?q}qXZjk{Pp#4F)^K&}2jE0z F{{l)V^ZNh* diff --git a/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0023_visitor_browser_name_visitor_os_name.cpython-313.pyc deleted file mode 100644 index 00b2490213fce535458b791aca04baed19e44fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 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 AkN^Mx diff --git a/osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-310.pyc deleted file mode 100644 index 25fa41c105d3736c71198832b04339a945e50bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmZ8fy-ve05VoDPgz`HeX2h1IK?pX4kU(OAB7s=4SZRC|7bgyJs;V=rNW2Cw!OA;$ zW#SbWfU^staFS2ocXv78cd=et>JYT&-IuGB67uTEtc6Gp@R&_>f(WWeK~qY}F%e7z z_e2ChhwLs$nFudP+wkLH@u)66_IaC3u+?V51Vo z9`)im8*vXgw;j$4Ek+6uFLHi6%9Ja2Oh5&tfHIe0YKFq>!a2C)sTQDYM_2Hz{E5`d znD_4eF}XBQn*<7}0F;swNRGhVG`dPIG9`Bl~6n?VKj_ow`NH3jAN+GlunmCkZDWOXXh0@$m=;B2f)7BgbD)@^VW&-4d@pf>BWuzL?0=dBNcwp?DB>y=yi68afcApv zzKUJ|g9uTGEQ$sw!WOX3&@{Q60;)X4zdDyz6IDuQVh4`&4%!-lC09h5CST)9_I7t) zy(SupDm_XQ(}aBZ?p~m)1N|k5y2BM2B|OfVbU8aQs2{9Iml#Nh^a;rY9cN782ZS7t z<4nsnqin=DWjsk)S!he->Sv}84+LeI^u>tH{rCw}J;>d+@Jq>xGE|LMiO9qEA{pn5 zS7q3bt2mqJ10HYFVax|2R1FzErv{&}LoL#?h6}$#WxyUOO!50Z7|xfb-Wg2_{qxP{ zC{S*z?HpCI)I+doK@uf@UOdDSKX~!P{d^a E2TtL=k^lez diff --git a/osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0025_rename_chatotification_chatnotification.cpython-313.pyc deleted file mode 100644 index ee7f9cf41b7cd429b6bdcc2a209eb601a2369df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmZ8f&u`N(82y|yX_Bp41uMUVCO{J?0xc6_2N2o?PJ{K(2#`=ED^0x4kl4jeHSLB# z;>>0L0T=!T{tCEk@|DwWMP+yFWTn-7`10PD_v|mvnYLO1==JT#>;1O~;I|>O<(z}* z6Ag|ah8Vqo9VE~#xCVD1wr)Ud_ffAgGt8e`c8!HKY=q9KAt6#hL5CtKDQ7aBYXSZr zw5_{G&S|$VsV0{+ z-A_ujy1DuA5jK#QbdRRhENbQ1g+|*nx(gD$hsW~_v!o!(W8|Ph-=Q1&%EJ}GSOpjt zJR9dk<7JFLjFa3LG+V)Vj|y4llo7_w>x_&D%Lq#;k-~(fmU_gfcX>u~74Q)`PfB$# zmZhFF#YtHTIvAHkVk}zPG&Mn}Pthw$gp6d8(}LtVJtWa{o{kH`N*TT3;(eq8U`eD0 zuR!)LVMAUw56Hj(lSwqco=69^g+(>d#k?xc7Sh=m9SU=WRWXsv`?`FAi3|RNiEXXA zA74%a@Gl>GYrnj;lg{0f&b>d5?FSRvx#WJ{5m#pJZfGmN9&aNXRKe6+o3E{9S2a@J p(>m#Gaa~jW1jS5cbdh-6@d}MIt&Xq?6EXgcK@-fphOt(B>g1 zc?nwH!7Wu@0SSe%FDPeeM)S>B^UZvAx4%DSbbcQHT72h>{q|t@L?3l(fE(8E zf;XZNoV{isKz?H&k+0-eSxAV^*(|=MyKE-hw9)lYj=F2DOPUVQ*vgl7PfFl~%+ARn zD>$%10Izu=F+F4yK%h5ePI(l-f25id) zmCtmeUg#=J5^%edaOr1l_1FzA8L*~VuOHAP@5A`z7iF-m$EAzfwJ|eEEBQ5)?@T%G zi2^U2UHF2&nEw1aj-cy+8`REFEM|G_T$*~`FUw{^YBgCd+?4HtGXs9VcIfp zaT5Yqm2KT^lN-G7ffp&id##)Ve5!7BAtAji^Zs)1zab&B_sL~U$mk}D1s8meM}M=M oP(PbRZnCAA!$nvzEEbA)OKhV<>f^F!Td|(g2V~ZB+!F`#A4;6O0{{R3 diff --git a/osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-312.pyc b/osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-312.pyc deleted file mode 100644 index b8a235563abc640e8147461854c13a61e49ca83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmY*XF>ljA6ney*>(AlLEiN9zj$_^rrt zRTf}+Ai)_>peTV91t>KF1AzfAff^@3O@_L7S+x3|n{ynP1Iw#iD&iTXo5pPs7IDV& z5~mquNgl0g0PF>sHYGR%1_7cF7!d-zt`>Z~1f&eA&T#j}|8d2rMJpHh+?bzS zRF|@3KYL(%PU*Z^Dw6W5Ssq87uqYqw?LB%-1mj`Kh>B!I+=?TuTyuUcP*y+0d0b?o z#DcZuY?qtzy0?1V@FPhWZx@}?;{7D?Olg4{o2bq*ruIrJW(jRbF*eb0LQ0nqnb%L4 z#A}4S?}v%jA{k{p#wp`b%yOYzF70QOzEC}crKt0~6AH~sH|w#5-``-WOt|9yyPS#K zm!lR@mimWT)K3{Na=#H4VKPt$JbXyIA#Z0sXGfYZsK!UEsgjf}{_21F(y}LH;e@nK z8L`_N2=zAfra=BwZYMCo;2fffY23n}UQb+bwm-WgduwQKjc?x@-`pJ6>ZkWdwfeAD z|JwXs{HpEGs+QwUOkBgquY|H!w`_P;>CC0=(xx^;TQI-$j!M(HcO|;A_velth;2#b fbBA1kiHQ*Uivf8vyoT_pJKES8ZtVO4Np$r;WKz_G diff --git a/osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0026_visitor_region.cpython-313.pyc deleted file mode 100644 index 61aec2c2f7fd2e278a3704ab8b5a508f32c0581d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmZuwzi-n(6uz?^$2O@521H9iR8<#CRb3$!sZvx4Q85JQ5c6Y+I63ykIdIP5&Y^Te zLSkm=AArOF8#{kRyCk}mDO*rLtlZg&(t(qF{=WC_J%8^zdA73R0J*;Wc;5RA0r;uN zVpZl~b|Aqi2tWWIfhJ_IsWEK>tb$DtXg5Kiw_(d%6fNI-dWo5y7+z(fh^GmsPZAd9 zB%@rI{Vc{QkCrt6*mE*_DZwdd0|o=Yv;Zmj1DiRC<6RQ=lZBdznn3ESW}HO5Fc;gqyLa~x!!+z;q#{{Px+E&37o1)Q zi0WIyNuDubGMvcaCTp_Y(_-H69ZE4x@}4m0FikyOdZ6Y;scW@mcp39*k6y`Z2onekSLd=yVGx-2P{AV09?(;AueVnG`1p9|sH0)!V zbN@xgUi;EA8u}C;7a)EW(j+T`$GD?_vd>>$yf3Z2hvtq+i; zQxn*SaH?z9%=eF{4zRC|to3tieSBkMd}VFyu8!Qzb9eJ==X-wUHhxtN+nMU7Ykp|5 zTZ?u_o+0c~)=u0h+$lUMKd446&)$|uSdG&219nGJ`A-0@8clTw;a?L#@3&cl<|k)V O-#V*r{Q;5`)&Br2rr`kq diff --git a/osinaweb/osichat/migrations/__pycache__/0027_chatnotification_type.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0027_chatnotification_type.cpython-310.pyc deleted file mode 100644 index b5e65e2f8e84c93b72056347cd3045297c1fe4f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcmZ8fy>8S%5Z=GL^BE#VK>|uDq-){`@zWp_6a)=~B0%A0<#^_Nd#r!h^^sgd18p9J zm!P2G9k!*)DjNcXr5VjPGv06J^R`=CDWmi4!H@ZO&e+cgt{z2TpUmGS2MoAn zHP3l1a>3aP1_I<41`_#FewMieb;M?)bLwR?5z^XJuINqM_%NPkw8M(#$hTvuX?rs_#_SpT z_kG)CM};-@otH%y!D~{bZ0n4~YKpAElOcd*(Nygwd4k6=hU@29yT5J8;X~^Y@*wAPe>kbG1f&irLW(LRtF*2dU_q6D3Zx1$wG3HKj_;Z{@{eFUlx$S$ zz}T&S1EPNg0}D$cAtkz%savE3A$8)NlPJIq&);|Ny}R$eJAYqaw*bf4?Ays#0`OCk zcmby@6F;0E2?PlW6-rl3f^u3?@S)9;>w@|kz%TyF+{)zA9 zClOlK?{eAqc3zpR;l{|d7g(8;kX#!Wj%-yFy>{$-JVhhi4>aIWD{Bia>IDHNt=teA zxgp0n84D*q4_Mtcg+cRqN`*x!*7X98xJ2o@o*T$o$r$hQi1Entd74Q7h4GBBmvW6n zlhi~-NzR28clqKbKEo7~aMN>+Q=X&_9zXNq&^d^`UdW>?b?R>B27Q@`+#S|&qgL!h z{50nan&VU6ltt1ZXLZvK+W3V2ZyS}a?RNW#d^~xOAU(uz4ig>B?TM<~)jz(TSYU2` zvPMRAXjI1=_W1V3xKg`#FsjssmD=Fp^TENiMz4#b}6C8A$gqw?0U Ly!8u^m8J+P1u3YdhpIhv+Im?SvdMIJYId^DWUajk zf@d%N54`v{c=IpV_R=y}Pra?I;?*~aOGOOi<@@HnH~Hp!$)sNQ5nP|X?DxJJ2z}FJ zdR6{_$vS`&gb_BLp)ErgTc$9V&;n{9Y~DoJY8yMwwCU=3-zu@Nx^_^x)Fd#K-)CJB z4Xj_PbiNWl|s)%xsQ`%Q*SG5O+64P3a0;2prM#_elW*Zdt=i z-iT6g_L6}B`GtW*zLcM3DM6jGJo!PnEEgeb%%ZOb(>fm}O$%s!9YZ%|Lg0v=e?SUZ z$$^yu_=1-b)iQ|Ds}} zO+8MahjoWx?_YPAM!z=jHs?XPm9@E~x#O(bRSl9a>SS)v!bv_0sUH1WhfHhATUjJ~ zN9&KP%EsJ?06TPmt~Tg6l|1h*&aavi^+3S3n;TTjea9`w;PpCN W>kick>60yUPwC4sAA9VHefb-LWVl2C diff --git a/osinaweb/osichat/migrations/__pycache__/0028_chatnotification_type_id.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0028_chatnotification_type_id.cpython-313.pyc deleted file mode 100644 index c5b83166c649784abf6b950bf77db3f3083ffa4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmZuwO^ee&7=9;7(h@N5ZOKCvMGzA1z8Y8u<9NfKQ4tKZKmB>(@C94S$Y!$ zZ-STo2Ojh{_$ziVEpzp>w@MYS&LmqZvIBYZJnvWD_ZhO>*ziD|FW+Aud_n*}G+CX} zIaux~a10@Y=oz#TM{R=}w_y|RKxotq{^e|SLlY}T-!T8-IN_4hjmoXkt zF0zC&!crZM$(XR1us$V%Yk8&fD2|`#w%pRR@|0y{NOJ&GPOh>M_I;c zZ;}y#G1qb})dNxluLR*D5K%%$BuVI$1dr4HWJFjdf;TCD8z^yD6fkm>gZMCF!?bW7 zk)8%xm|%UuffDh-#Ud)PcE(e#WzUTUqNU77SlHn1E==Q^{r>sF1NZ98X`DKZ`3--5 zr9Q81&T8AIwe7EWPioDdWy|#zrd_i?w0V8iYu~q|TTHhT_i~+bb&9X)jf>odLehCy nsK3W=DXM+}5I2=sm3 zG%5He{06sF`3p!WjD4Vsz>-Jv{6>B=&u;hkb4Kg>+Rwjo#(o5FcO?XlX}d=hfC0Cx z<|VI1DL8x0K!ChtAd#=+7g&EgHin;<#RrGIE3h^e(OR>?;w8F|L)#T++M4>|8{Gx)&Y7WV>w;`)bkX2N zOkky(MY}z`!1Is*?Wwsr0~{YB=2#(_ALzX7PI!H@s| diff --git a/osinaweb/osichat/migrations/__pycache__/0029_chatnotification_session_id.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0029_chatnotification_session_id.cpython-313.pyc deleted file mode 100644 index 773002b55b0b2c8dafb6133d0f25c1fc524c0995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmZuwzi-n(6uz?^CpN7J0YpWqKvfqnb%j)k2&jZW3Fw7IOlNZP_iK* zF|%}MV1WMsiGP5#T^ilWlr1PAR^Hi-f`F6!{C)R+_`UDR)5S#}!TIpzarZq&=$j$4 zQ#k?CEdU3IAcF6qZ7lJ&C9NxH39TYxT|~rg;azu@G=Fc}C6;!_2`Xbl0!#Zn-jPwx zGoiHG%MzBVc%FlhcS5F50UV$fl9(WA5iD(Dg;+YR%I?CS2_=SBY~r-4yY>J2D#Rt# zrbTK^8)|sOlYYk!PHFGKtedf!0Q#$DipSk3*DD(vSFce6MV9k6kBg>hKI}8f6J7t? zqkYAcg1Nvu{tCq&7Sl$rXv#z(>eA_@iDFF^7v5}mBP+-G|R7^TAb+Cvbw`LD2Z_161CX|_=q1JrdeZ_&g>-sZ%% z&bhDePkiK^J+3Vu)s{yWg3+0kQDf=2v3k^4{TP3C4jVVWR~^rv*lxppvn?;ps_g`h z_R1F5lf6QzLZ9+`X6!O{1(2@YDD~fxmx03Hfs`pUu`$NKT!e!k?gDn-`N#FO!}{7! I1ffgc5Zw>kaom*lP(F?ow_NI|oTw0Lr4~3etwfTG53C&TCTv*m8n2@$Ck}A! ze}E%@X|J643y7~-r_c&k+NYV>XTO;@W_vq9a9%z9KD$d0`r?z@CxGM_t~~_ch+~CH zoMG%^qDV^g-a`HJBHr` zda0BnjpUJ9st3};d(e$nr_n6-7rT*4UemP$a}W9;oRSDwpQO<_Q{XIFVu zegwXQ>G#c$c}0mLYw1P4EZh+u;6;NVC6 yt7TmDBe%5?J1C5vZ9M5-SNOEGuN}Rm-we2k9>Bj{{A6SOQ|#p;fF9Y!_vmkhdf7Gr diff --git a/osinaweb/osichat/migrations/__pycache__/0030_chatnotification_users.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0030_chatnotification_users.cpython-313.pyc deleted file mode 100644 index 97f47dad60146cdff8b768c8196b08aa3ca4b3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 zcmZuv&2Q5%6nBy)O+(8@*X23jfwR^zL)U|4oahxRGm$h`KdP}#B zbE()0HyMg!Oj^uVxz)xk>cu!Bj2rDJKq2$fGpWp7Dx(ttjzJwz#RXJ#6{^)U*IhXe z>PGeEzbR6@tfafEIx02A+2Yk0*^Fq#s@}QQr(d7hHC9zOyQ(<~&ATQov~sq^b35a{ z&a)z!=rkKK>>qeBpDULitwIS&6yqlLllCD)j0qYb4*2B%POf(uqHJHJ$&hXsay5=@ zO^_!EgT!kiVV6>GViX3S!LEIin=tV}$Snv(WH&?t=OH}odZCOK+6076Oj#Uaf=C1* z&4^<86g%=d9j_q{1gL{ZfQa9ta+Z8zy|(`x*4)i1+}YdM+~)Z|5g0LUt_Q(0Spt=> zh)?Wzq_-bQnOM0Mb_AsCLXV1*p!CiZBYi3ZK=@(09 z#nMUeFEaoaq~$!*r#+}sPc(3X&-8eqFfk2dH5Zaei;SD_-OSf7fvS^E`U&y1it|wvI%?u diff --git a/osinaweb/osichat/migrations/__pycache__/0031_alter_chatnotification_users.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0031_alter_chatnotification_users.cpython-310.pyc deleted file mode 100644 index 716a1e128cff79e46501e26813b9f2ea53b1f5e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778 zcmZ`$O>fgc5Zw>kaokkRp+X=egt+-q2e?+Km0IA?v=T`!zN|LcO>ny2HC{(iP8@(^ z{{tNPOMB(SUqF1#I)zq9thA$ShG2uCQ5zQT7X#V)q8X$rltDRD_zENb2q zMq3w^Mo496o_71hP#nRvhY%#nu|PSI^kX2yW%LOPydZf8q+&q?mEC0`0+5C`5nfRd zUC{;3cSHwTh+TL1M-Rk1#ul^Jyvgqm22Tgfr`j~dyqL8ev6Ypzb^U*F7q$=Ml)7-L zxW06OUMb~BV*pCpDVXM^1l-4PUPvX*)1Hf2i!F=R z^Qz)gco(vgT1Y+H)UXxg_KqjxmuxaReZ__sC#Pqw_m@#f>yl&D$ojcgto_E^-jM6f z*!b9@E-{t7w)``y?*gX{-#%m$KW`?>LP@Dqv60z{w3m&kvJqEB`S6TazPPYOGc#od z?rENBxo#7& zOJ%r>GcYI!Z~#2uDeIu15M^3obzLoJL@Ve-p9Yg)26)mfj>0X97z=QnIx4ptL7n(4h%n`5BdVg1R+5-R4wDW(3jF|-08u9Jp6aT^60x~|&&Xy(D|Yefg+9YGF3#Om<8f#C`(_yOc&PKw--0{|maP!&f+6K@3J`o_w?Uj%r z@EF_@2Lc9fi6Qswx*4(i*cW8C<%SZX;uhvS>y4N?f3G?+vKNI_>j;*QQHK%uZ zvX`6e=JLn6{2}`^`{hCR@rxtzN2v0_Q<=K2DT;Dx0_FBMkpF3B74x0l9h*HGn>__W Hi4*(+ei#oe diff --git a/osinaweb/osichat/migrations/__pycache__/0032_remove_chatnotification_users_chatnotification_user.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0032_remove_chatnotification_users_chatnotification_user.cpython-310.pyc deleted file mode 100644 index 431e3de7784162b85f50a6b5eb56854e3bc066b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmZ`%%Wl*#6pizmOgg25gpi65j|GctCIxl~p^o|hi9V!GyUE7NjPFd7I&p|IRI`R{ z|9}N7`6X{z@e5E8*G^wTV9D3_;cFkCW3jv(S~$+1oKKZ)S>JSUbGR6+nkFk}GO|@z zWV1SLGEqw97lHwodlS9y=Fs@oamoWUU?qfEi4D$Y7rfm6LKvCZNeAx=n9UsKo?$KT zqVGYNFEO9_(94(eFu#?r=nmF7b6IfaU{{}Y5m~6ZyO%H!Q%A^ba-25Fm(I{`40cU&BZ52>+5Tz=l6nUC+K)*-nyLrm>;gr^nZn+~*)2d3xSZ7c{ z$)KDpYSh(IE5oD1H}q(PBbzETB4#*9~M`Bk_rYRG2g zTUaQcTC>08^g^l6^aTj6#Z(|53t*qAD`kQ%~%XY#sN6b77%ZO zJZVG~k5Zl$k9N{Z2m3N>CZdQ@g))sxI5kdtX`4KSv34}|@%8_SQLSgRHjns^T>nlF zszvP~PR+Z#Z=BGviTm62ZDLkeulI=iEBI-4MuA#t0SzXioVN6KFEVUwlxT@ty-E(+ l-#xfwtX|dB=zFh8YQ2Y;Q^Ctt{DPrWrlVIxDVaB2A zZKaj=h}gsa2OQwWoeP|}lI|hZ>|qak;+Co)uFQ;^wt_HH#_#>!%rEb~-?Mke#w@_s z%eVI*GZldUg)>~np0Qiu#^1mLp0Wy76r#)uTU}LGG@`BOM3=s{Y7lc8oCThK5_m>U ztNbz~I(S~yGMnUDnr(g(j;%0Aahis4i`pu)+F^_MX_&;6ne8ON5xv_uAON7a=j@(V zL{>FG6b}&9Q;1g6E3%ry#{ti%W{%8--xteM9hE?Sx0LyZcV3O=>7KEq^7z!@NM_5p zSu0egN5*nqt~ORV{bQ_hYy>tl0-OC28(obDmvk?`r14rNJd2cC1-r=dcZSXU1UV6J zZ!V!>E#RLf;PSUU$He}~fmtsQM`1d$7WI(DUltHoI#!Sz45n8i# zX4E4;Ugu~xida605kH7i%+xfoH8RH2AYw3>(F}1EyaspeNd}RmLWo%ianZXG=5`UG zr(Hi1^xQjwP%|Vnjlvkm2|`2{EK_vD?{xe+zYyRKjsqMwHi?)rcBEWg`wdk+w}S56 zTXt`=;{J&cQ&yS^eCs?kii^_MI4SNF)324BWtVVF*#2gO|kNI$lOZ*76e}N5hMqO_JkD$xTcL z{flpZf`JM0lYKb91?OME{=$vk!i|4mc^m#ZFtjQ2_uGS_jL&SrneF5D_Qdp#q2;Xs zl<27~cuJzjw@cIg(z&hDxmR;<*52L!@bLY^zFY0N)xP_v=RWGY&7Rx*xK6(U5Gl** z&i-T4Rd;eaXDnDH^N$sBewd>TSt0AkVk3#0naKG)B&f@I$mBb*4=!e3kj0^HWOm3V zRmsTbImY0%Z0@d;3)~f-26~on15HtsFD6jV{0A2P1+$;c3B`P2^~dLW<8xmCcO=I* Dtjt&d diff --git a/osinaweb/osichat/migrations/__pycache__/0033_chatconnection.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0033_chatconnection.cpython-310.pyc deleted file mode 100644 index de4b7e707ba69de866edd012f79635850a1b6fa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmZuwO^?$^5Oud5$4Q(_U=b1=5T})*T}?)CK`Vq9lHo&Q7>Sv=_|od6E1@&(?yTEk zl)b_=H+}#dIq--2%89>##6Y#30S;@aTlK2SepRo^rrT`?_FL?DO?a*`3^ZK`M#>QH4X*$l@n~h(zOUAQ})Zns36aDZ=Am5P!kN|a}&*|NYK|oPisREwGpL=Iu%N{u}E|`6r;T=+So>S5Otxq*jcm| z{lyi}C;C2b9*Zj*Iw#pxaTR;}!?g}C8^Nxc#>(j{Ub=gGdw1`!0&?>jnD=N?%9)&2 z9kZ2%!v4S8^+uRIGFrpbtK+B?CyyO{HXcMS<*U-LX#uXGI_NcBznd zS{H(BkuMrET1GRR7L?#H1SM=67~fulCX-IG1q1cN4rvhcFNelE3SMpV+HP8 z;I7$ozFhJN#sw@v3((VbL49av|McW3J3T&l$qtXk2hXvX%M1zDbw-s2hkkDgzo#yJ zByEMM6PZH|(?`ZA;CdT8(r{w%s$nb^T+fZ8V&amjGcS8{w0}I>A0N23 zS;BTvKL*8L$W>im&xfaeibKey0#Hh>VK@eRR+{DT7zdHxe$JO399daTO+Lic(0r)j zyfSLi+IbEWZ}>GC{`xJ3xI%ZUCD{%E%i3M8iw2gE;IX$Vqa9KbT|_Y@*JzLQNFUEl zLcc~A$@eOEkho6Gwu>K{)%v!!9xx)ZipCsgZ_yfPi)&%7`GkAaniI++O%EPDYR9kHA72ASEf`NXkF5&Yu8naThLInCntW%OdUHs zJ1ymegv5Clq#ikNfD78OhyxrsCfUK!0|_Kfy9JdUk@%invr0>ONnXD1^UvSk-+QN{ zqcINFH$Q&x^q&yN{mGPIh0lc3G6-LB3a9W}+$K->IVKBR!e)qsHbo+OdT1+5q)Xfa zr-+w1C0q%W#{x&M|KEieY>`MKl$BmGG0Rig#*U+#4Ld8)SW|Bh)zK}}rc%?=uwg%} zFlAAl?TKKATD2kh_s#J2dRZFp~$B+E1}DHE$go+p#aBuO<=*(n;`4#xXZ24^tv zh-K@wr>a8>H*VZqMg%vl1B{r(v>d&z*E}+ywvCBB+)T%cfG%35iEE5FRM55EdsMhz z%8E3uwjB%A2v!}e(UBI>n<_a%`}l}P!KJPm`e&HN4=|}(Hb$n}#8lJ(47?Q0wqa1o zG7a5idPKu@wQV>wYN)n@Y>Z7PAY3(6bDvB?IW(^6cFj)&qKPbNKtwGQ0g( z5WO%`UB`xIf5$z9#>mKvjS!6?1iWt>800uYpR`qj!9g2GsIC*+VdM2wEh6{3lKWC=}6IQ%Qib@gq?O8zpFRa zpken|W^}X!ec08T*jM9sEz7{FdG>I}#Jd)3zA9-St7gNZf>x!nS1g-Eq`0OO*GlU& zX0>o|tfvsN9hhnjsg6VRYTLm!6qA7jPT|K7wY5zd#aTDyr&$IgFf zk^MZ7##HkrKJ)}Xwr@PdRVFY3cj_Yn_ zxtCc!N&Q^vX6|OUV7lb(z?(Na-}y4wsC?UJ@cZNzsO+A#*>y4q@jU-Z;`sUBxusvZ Wxxb}JUV0XD6N}x%;wugm&&R)Ov$UE3 diff --git a/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc deleted file mode 100644 index fd9ee60d9fcc83ece19c17eb217bd3f9de40a74a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmY*XO>fjN5cNm0$wsY&#K#FFPDr^lmC6yJwnF6sF)%uDR{cEQNL|B&r7!Pu_=?ps1&pWMBm01UWcJ+FB$ zYQfoC1_IB~=H}$eo_@eLHNiRD)I6vzxpm9w&x^EeQeR6k50a?v~ z)dG0SYl+Ds4Fot_WRO65&0%(ZSIz#fwxZ4_Ebn4 zI}F%_seB&rWNq)$cCxGSsN_BaJku+)EG5k!W>$ml(I+vcXB`^w+1Ji>OFJDCU9Mt- zQoc}%F02evzNOTcl{Vp0K!76-fJ4)vn@DHo^85(KC=pQ$31UPhIIDk_Syfwx=lj2Bb*FJ|QKDTSN~nfy&s!38gP@@JFfH?i}$ lO#FP!z5}OGfVg%%-0Zi`9@C3Hf3=qKH4h|#?SXhA{{e{py$ApR diff --git a/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-313.pyc b/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-313.pyc deleted file mode 100644 index 0c651bb84bdfa8453d2326a244947354cc2c3136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmah{&u`N(7`5}ON!E(C15vGj0Bwf|X_>Tfn1m*Q&<+K5Xarn}tSoW6jMOf6$}~<$ zNSwLs!kGj74g3|`rIoLob}K4~D|XVV2u)zgU*5C77yEmkr<~mjcGSQ1Kb9IwgLjZ1KZYIwD{iD3(WMM;hE=(c$#qgNsonD zLJ1dEpT;=l(Lw`&Gb7WF5}bezU@!no3n0@2&4g40-(UMD=sDEk8TWCEMv+3FvA=nR+Fl!oIt$spK{E&&%-q7<1|fG8Qz15 z1)Mt*UAt_(eLQi2vplk!XLfUZ_13u77}p!4`r282?K3{DZ+$Nrj{A4c%0)SqrMmU5 z#hUZ;_B=y4MIr0)er{=QWN{;9PLX>}B4OVv8nwf2NDAfTYJH+Z2!B}sdOxfhv_80_ O>gs8A^(T-dSN{fQ80*0R diff --git a/osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc deleted file mode 100644 index 1327e0f14097259b12b96c91c2c62f89f70a8648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmZ8f&2G~`5Z=Eej++4DzzL)X0g^9uCE$io5fQyKMQVYAFDutOI1aYgtdo|U;hJYa z;>JtxAbaK1CqSyi&#av&5i9NZn;-2r^Nsaz=o35-S3Lc}2>I!p-6POB#9Kc?qllt8 zDQH9s7BNbWh+>L=A&LW?@y|TsN}Q3PbA`1eVAe0P)Wq{lm$mH{T0veXF133c{UP4^ z7!8n!DiSe8QyOs)vyLNBV#U_Dv&LPFccC})Qlfg_sPa@_`75sWa1I{z)d1TV+Wut2 zkInRSoh8$F9z8fXc>F{CpQM34y%%M!@ zQzTjBdBBZ_MW&C&cHU=@tCPUDo@^SC()v=Owu>AP52XCKh;!GR^AuE2Dkzf-YJ=+~ zcJCAleF3lBGuC^dRD%q6x&F&(Y}$;kD_C#tJ27`1zcbfg!?!hQ4e;`)zCc>b%jZ b5u{0Ohi}n6eAjx_+QlVMsUA-Doyh-(*{R z69mtC=r`!a&mj06?4@O{o_gD|ir~qaWW!bwhvd!g{hN97ey?9DnMkbD&wH&e7@==c z$yROv`fCE5AO|_h6SS#-vWWrDqY7F;4xT}dT32d%mNeX#)f9u;)U4d4R4mNRw%-Id z_M?z-y&ZWpV2xo8LdAj7KNa8v)e$HT0_-TDI@ne~tLJK2%(XmGit1=iZUz6xuMhmA z*AfRX${n1 zXxQ*6133=zNdvIQNXYlrkG0p3eDY(}Z^i0(@u z39yHwX$#tx2_&@+=}OuA+d80yxS=OH19Y)-3~~$-AptuQ;yvo=sIb~o@s$2{t7oFZ z}DEU6^I+FDaUJYN2rSU*-asO ds-h@Ab);C|^(jUFV4jaxzm8XbAfY7LzX9fiA&vk5 diff --git a/osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 309abe7c5b69945f8abc4c90cfe5bc427d06f837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmd1j<>g`kf_Hq+})L zrRPHg%Ttp;jO2{O68+rF^rFO)%>2A!{rLFIyv&mLc)fzkTO2mI`6;D2sdgY&6f*${ G76t$$H8$S> diff --git a/osinaweb/osichat/migrations/__pycache__/__init__.cpython-311.pyc b/osinaweb/osichat/migrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2b13832ad9f7b3fa44fd862836e2b32a2aca8796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ3^%ge<81f|i7(?IlN5CH>>P{wCAAY(d13PUi1CZpd#eW?o`UUTQg*k&=~|m!1z1EKf}WF_JS9 zOJZ^}(~A;IGV}9_W8&j8^D;}~6HoLW?@pI@9= zlANEb?~PO4oIE6`3xAT9{m|mnqGJ8x z#GK6B)SR5m%2a)q{N&Qy)Vz{n{qX#vZ2kP=%)CVXywq|qBPA;_FFhY3Se}{$VkBoI zmgwhZrWYlaWaj4;>&M4u=4F<|$LkeT-r}&y%}*)KNwq6t1zHDkPBDn_k(rT^v4|PS F0sue2G?@SZ diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py deleted file mode 100644 index 3687532d..00000000 --- a/osinaweb/osichat/models.py +++ /dev/null @@ -1,395 +0,0 @@ -from django.db import models -from osinacore.models import * -import mimetypes -import os -from channels.layers import get_channel_layer -from asgiref.sync import async_to_sync -from fcm_django.models import FCMDevice -from firebase_admin.messaging import Message,AndroidConfig,APNSConfig,APNSPayload,ApsAlert,Aps,AndroidNotification, Notification as NotificationFB -from django.utils.safestring import mark_safe - - - -def send_notification(notification): - notification_data = { - 'title': notification.title, - 'body': mark_safe(notification.message), - } - - if notification.type == 'Chat': - sound = 'outside_chat.wav' - android_sound = 'outside_chat' - android_channel_id = 'chat' - else: - sound = 'new_visitor.wav' - android_sound = 'new_visitor' - android_channel_id = 'visitor' - - android_config = AndroidConfig( - notification=AndroidNotification( - title=notification_data['title'], - body=notification_data['body'], - sound=android_sound, - channel_id=android_channel_id - ) - ) - - apns_config = APNSConfig( - payload=APNSPayload( - aps=Aps( - alert=ApsAlert( - title=notification_data['title'], - body=notification_data['body'], - ), - sound=sound, - ) - ) - ) - - message = Message( - notification=NotificationFB( - title=notification_data['title'], - body=notification_data['body'], - image=notification.image if notification.image else None, - ), - data={"id": str(notification.type_id), "type": notification.type, "session_id": notification.session_id}, - android=android_config, - apns=apns_config - ) - - if notification.user: - FCMDevice.objects.filter(user=notification.user).send_message(message) - else: - FCMDevice.objects.send_message(message) - - - -# Create your models here. -class ChatNotification(models.Model): - TYPES = ( - ('Visitor', 'Visitor'), - ('Chat', 'Chat') - ) - title = models.CharField(max_length=255) - message = models.TextField() - image = models.TextField(blank=True,null=True) - created_at = models.DateTimeField(auto_now_add=True) - type = models.CharField(max_length=8, choices=TYPES, null=True) - type_id = models.IntegerField(null=True) - session_id = models.CharField(max_length=200, null=True) - user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) - def save(self, *args, **kwargs): - is_new = not self.pk - super().save(*args, **kwargs) - if is_new: - send_notification(self) - - -class Visitor(models.Model): - session_id = models.CharField(max_length=300) - ip_address = models.CharField(max_length=300) - country = models.CharField(max_length=15, null=True) - region = models.CharField(max_length=25, null=True) - name = models.CharField(max_length=200, blank=True, null=True) - mobile_number = models.CharField(max_length=10, null=True, blank=True) - email = models.CharField(max_length=100, null=True, blank=True) - browser_name = models.CharField(max_length=100, null=True, blank=True) - os_name = models.CharField(max_length=100, null=True, blank=True) - @property - def flag_image_url(self): - flag_url = f"https://osina.ositcom.com/static/images/flags/{self.country.lower()}.svg" - return flag_url - @property - def notification_flag_image_url(self): - flag_url = f"https://flagcdn.com/w640/{self.country.lower()}.png" - return flag_url - @property - def is_online(self): - latest_log = self.visitorlog_set.order_by('-visit_date').first() - if latest_log and latest_log.left_date is None: - return True - return False - @property - def total_duration(self): - total_seconds = 0 - for log in self.visitorlog_set.all(): - end_time = log.left_date if log.left_date else timezone.now() - total_seconds += (end_time - log.visit_date).total_seconds() - - duration = timedelta(seconds=total_seconds) - hours, remainder = divmod(duration.total_seconds(), 3600) - minutes, seconds = divmod(remainder, 60) - - if hours >= 1: - return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}" - else: - return f"{int(minutes):02}:{int(seconds):02}" - - - - - -class VisitorLog(models.Model): - visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE, null=True) - url = models.URLField() - title = models.CharField(null=True, blank=True, max_length=500) - referrer = models.URLField(null=True, blank=True) - visit_date = models.DateTimeField(null=True) - left_date = models.DateTimeField(null=True) - @property - def log_duration(self): - end_time = self.left_date if self.left_date else timezone.now() - total_seconds = (end_time - self.visit_date).total_seconds() - - duration = timedelta(seconds=total_seconds) - hours, remainder = divmod(duration.total_seconds(), 3600) - minutes, seconds = divmod(remainder, 60) - - if hours >= 1: - return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}" - else: - return f"{int(minutes):02}:{int(seconds):02}" - - def save(self, *args, **kwargs): - is_first_log = self.visitor.visitorlog_set.count() == 0 - if self.left_date: - action = 'end_log' - else: - action = 'new_log' - super().save(*args, **kwargs) - channel_layer = get_channel_layer() - event = { - 'type': 'new_visitor_update_handler', - 'visitor_id': self.visitor.id, - 'action': action - } - async_to_sync(channel_layer.group_send)("osichat", event) - group_name = f"V{self.visitor.id}" - async_to_sync(channel_layer.group_send)(group_name, event) - if not self.left_date: - if is_first_log: - self.send_visitor_notification() - else: - last_log = self.visitor.visitorlog_set.exclude(id=self.id).order_by('-visit_date').first() - if last_log: - last_visit_date = last_log.visit_date - current_visit_date = self.visit_date - if timezone.is_naive(last_visit_date): - last_visit_date = timezone.make_aware(last_visit_date) - if timezone.is_naive(current_visit_date): - current_visit_date = timezone.make_aware(current_visit_date) - - time_difference = current_visit_date - last_visit_date - - if time_difference > timedelta(minutes=5): - self.send_visitor_notification(is_repeat=True) - - def send_visitor_notification(self, is_repeat=False): - type_id = self.visitor.id - session_id = self.visitor.session_id - if is_repeat: - title = "Existing visitor new acitivity on Ositcom!" - if self.title: - body = f"Visitor navigated to {self.title}" - elif self.url: - body = f"Visitor returned to {self.url}" - else: - title = "New visitor on Ositcom!" - if self.title: - body = f"New visitor navigated to {self.title}" - elif self.url: - body = f"New visitor navigated to {self.url}" - notification = ChatNotification.objects.create( - title=title, - message = body, - image = self.visitor.notification_flag_image_url, - type = "Visitor", - type_id = type_id, - session_id=session_id - - ) - - - -class ChatConnection(models.Model): - date = models.DateTimeField(null=True) - user = models.OneToOneField(User, on_delete=models.CASCADE) - online = models.BooleanField(default=True) - last_seen = models.DateTimeField(null=True, blank=True) - disconnected = models.BooleanField(default=False) - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - channel_layer = get_channel_layer() - event = { - 'type': 'new_online_activity_handler', - 'connection_id': self.id, - } - async_to_sync(channel_layer.group_send)("osichat", event) - - - -def get_chat_last_seen(user): - connection = ChatConnection.objects.filter(user=user).last() - if not connection: - return "Not seen yet" - - if connection.online: - return "Online" - last_seen_time = connection.last_seen - now = timezone.now() - time_diff = now - last_seen_time - if time_diff < timedelta(days=1): - if last_seen_time.date() == now.date(): - return f"last seen today at {last_seen_time.strftime('%I:%M %p')}" - else: - return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}" - else: - return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}" - - - -class ChatRoom(models.Model): - TYPE_CHOICES = ( - ('DM', 'DM'), - ('DM Group', 'DM Group'), - ('Visitor Room', 'Visitor Room'), - ) - name = models.CharField(max_length=300) - created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True) - date_created = models.DateTimeField() - terminated_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True, related_name='terminated_chatrooms') - date_terminated = models.DateTimeField(null=True, blank=True) - type = models.CharField(max_length=15, choices=TYPE_CHOICES, null=True) - @property - def last_updated(self): - last_message = ChatMessage.objects.filter(room=self).order_by('-date_sent').first() - if last_message: - last_updated_time = last_message.date_sent - else: - last_updated_time = self.date_created - - now = datetime.now() - if last_updated_time.date() == now.date(): - return last_updated_time.strftime('%I:%M %p') - else: - return last_updated_time.strftime('%d-%m-%Y') - def unread_messages(self, user): - return ChatMessage.objects.filter(room=self).exclude(member=user).exclude(chatmessageseen__member=user).count() - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - channel_layer = get_channel_layer() - event = { - 'type': 'new_chat_update_handler', - 'chatroom_id': self.id, - } - async_to_sync(channel_layer.group_send)("osichat", event) - - - -class ChatRoomGuest(models.Model): - room = models.OneToOneField(ChatRoom, on_delete=models.CASCADE, null=True) - visitor = models.ForeignKey(Visitor, null=True, on_delete=models.CASCADE) - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - self.send_chat_notification() - def send_chat_notification(self): - type_id = self.room.id - session_id = self.visitor.session_id - title = "New chat on Ositcom!" - body = f"Visitor {self.visitor.ip_address} started a new chat on Ositcom" - notification = ChatNotification.objects.create( - title=title, - message = body, - image = self.visitor.notification_flag_image_url, - type = "Chat", - type_id = type_id, - session_id = session_id - ) - -class ChatRoomReview(models.Model): - REACTION_CHOICES = ( - ('Happy', 'Happy'), - ('Indifferent', 'Indifferent'), - ('Sad', 'Sad'), - ) - room = models.OneToOneField(ChatRoom, on_delete=models.CASCADE, null=True) - reaction = models.CharField(max_length=50, choices=REACTION_CHOICES, null=True) - details = models.TextField(null=True, blank=True) - -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): - room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE, null=True) - member = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True) - content = models.TextField(null=True, blank=True) - date_sent = models.DateTimeField() - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - channel_layer = get_channel_layer() - event = { - 'type': 'new_chat_update_handler', - 'chatroom_id': self.room.id, - } - async_to_sync(channel_layer.group_send)("osichat", event) - if not self.member: - self.send_message_notification() - def send_message_notification(self): - type_id = self.room.id - - if self.room.chatroomguest: - session_id = self.room.chatroomguest.visitor.session_id - notification = ChatNotification.objects.create( - title=f"Visitor {self.room.chatroomguest.visitor.ip_address} sent a new message on Ositcom!", - message = f"{self.content}", - image = self.room.chatroomguest.visitor.notification_flag_image_url, - type = "Chat", - type_id = type_id, - session_id = session_id - ) - - else: - chat_members = ChatMember.objects.filter(room=self.room).exclude(member=self.member) - for chat_member in chat_members: - user = chat_member.member - notification = ChatNotification.objects.create( - title=f"New message from {self.member.first_name} {self.member.last_name}!", - message= f"{self.content}", - image = user.staffprofile.image.url if user.staffprofile and user.staffprofile.image else None, - type="Chat", - type_id=self.room.id, - user=user - ) - - -class ChatMessageAttachment(models.Model): - message = models.OneToOneField(ChatMessage, on_delete=models.CASCADE) - attachment = models.TextField() - def is_image(self): - mime_type, _ = mimetypes.guess_type(self.attachment) - return mime_type and mime_type.startswith('image') - @property - def file_name(self): - return os.path.basename(self.attachment) - - -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, null=True, blank=True) - guest = models.ForeignKey(ChatRoomGuest, on_delete=models.CASCADE, null=True, blank=True) - seen_date = models.DateTimeField(null=True) \ No newline at end of file diff --git a/osinaweb/osichat/routing.py b/osinaweb/osichat/routing.py deleted file mode 100644 index c2db6e69..00000000 --- a/osinaweb/osichat/routing.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path -from .consumers import * - -websocket_urlpatterns = [ - path("ws/osichat/visitors/", OsitcomVisitor.as_asgi()), - path("ws/osichat/", Osichat.as_asgi()), - path("ws/osichat//", OsitcomChatRoom.as_asgi()), - path("ws/osichat-admin//", OsitcomChatRoom.as_asgi()), - path("ws/visitors/osichat-admin//", OsichatVisitor.as_asgi()), - -] \ No newline at end of file diff --git a/osinaweb/osichat/templates/chat-room.html b/osinaweb/osichat/templates/chat-room.html deleted file mode 100644 index 807e0830..00000000 --- a/osinaweb/osichat/templates/chat-room.html +++ /dev/null @@ -1,177 +0,0 @@ -{%load static%} - - - - - \ No newline at end of file diff --git a/osinaweb/osichat/templates/chat-widget.html b/osinaweb/osichat/templates/chat-widget.html deleted file mode 100644 index c30f5d6c..00000000 --- a/osinaweb/osichat/templates/chat-widget.html +++ /dev/null @@ -1,131 +0,0 @@ -{% load static %} - - - - - - -
-
- - - -
- - - - - -

Chat with us

-
- - - - \ No newline at end of file diff --git a/osinaweb/osichat/templates/ended-chat.html b/osinaweb/osichat/templates/ended-chat.html deleted file mode 100644 index a130f88a..00000000 --- a/osinaweb/osichat/templates/ended-chat.html +++ /dev/null @@ -1,409 +0,0 @@ - - -
-
- -
-
-
- - - - - - - - - - - - -
-
-
-

{% if chat_room.chatroomguest.visitor.name %}Hello {{chat_room.chatroomguest.visitor.name}},{% else %}Hello,{% endif %} thank you for contacting us. Please bear with us while we - connect you with the next available agent as soon as possible.

-
-
- -
- {% for message in chat_room_messages %} - - {% if message.member %} -
-
-
- {% if message.member.staffprofile.image %} - - {% else %} -

{{message.member.first_name.0}}{{message.member.last_name.0}}

- {% endif %} -
-
- {% if not message.chatmessageattachment %} -
-

{{message.content}}

-
- {% else %} - {% if message.chatmessageattachment.is_image %} -
- -
- {% else %} -
-
-
- - - - - - -
-
- {{message.chatmessageattachment.file_name}} -
-
-
- {% endif %} - {% endif %} -
- - - {% else %} - {% if not message.chatmessageattachment %} -
-
-

{{message.content}}

-
-
- {% else %} - {% if message.chatmessageattachment.is_image %} -
-
- -
-
- {% else %} -
-
-
-
- - - - - - -
-
- {{message.chatmessageattachment.file_name}} -
-
-
-
- {% endif %} - {% endif %} - {% endif %} - {% endfor %} - - - -
- {% if not chat_room.chatroomreview %} -
-
-
- - - - - - - - - - - - -
-
- -
-

Rate your conversation

- -
- - - - - - -
- - -
- {% csrf_token %} -
- - -
- -
-
-
-
-
- {% else %} - {% include 'partials/submitted-review.html' %} - {% endif %} -
-
-
- - -
- -
- -
- - - -
- - -

Osichat 2.0 by Ositcom

-
-
- -
- - -{% block form %} - -{% endblock form %} \ No newline at end of file diff --git a/osinaweb/osichat/templates/partials/message-attachment.html b/osinaweb/osichat/templates/partials/message-attachment.html deleted file mode 100644 index 48df8823..00000000 --- a/osinaweb/osichat/templates/partials/message-attachment.html +++ /dev/null @@ -1,63 +0,0 @@ -{% if message_attachment.message.member %} -
-
-
- {% if message_attachment.message.member.staffprofile.image %} - - {% else %} -

{{message_attachment.message.member.first_name.0}}{{message_attachment.message.member.last_name.0}}

- {% endif %} -
-
- {% if file_type == 'image' %} -
- -
- {% else %} -
-
-
- - - - - -
-
- {{message_attachment.file_name}} -
-
-
- {% endif %} -
- -{% else %} - {% if file_type == 'image' %} -
-
- -
-
- {% else %} -
-
-
-
- - - - - -
-
- {{message_attachment.file_name}} -
-
-
-
- {% endif %} -{% endif %} \ No newline at end of file diff --git a/osinaweb/osichat/templates/partials/message.html b/osinaweb/osichat/templates/partials/message.html deleted file mode 100644 index 182c11a2..00000000 --- a/osinaweb/osichat/templates/partials/message.html +++ /dev/null @@ -1,80 +0,0 @@ -{% if chat_message.member %} -
-
-
- {% if chat_message.member.staffprofile.image %} - - {% else %} -

{{chat_message.member.first_name.0}}{{chat_message.member.last_name.0}}

- {% endif %} -
-
- {% if not chat_message.chatmessageattachment %} -
-

{{chat_message.content}}

-
- {% else %} - {% if chat_message.chatmessageattachment.is_image %} -
- -
- {% else %} -
-
-
- - - - - -
-
- {{chat_message.chatmessageattachment.file_name}} -
-
-
- {% endif %} - {% endif %} -
- - -{% else %} - {% if not chat_message.chatmessageattachment %} -
-
-

{{chat_message.content}}

-
-
- {% else %} - {% if chat_message.chatmessageattachment.is_image %} -
-
- -
-
- {% else %} -
-
-
-
- - - - - -
-
- {{chat_message.chatmessageattachment.file_name}} -
-
-
-
- {% endif %} - {% endif %} -{% endif %} diff --git a/osinaweb/osichat/templates/partials/submitted-review.html b/osinaweb/osichat/templates/partials/submitted-review.html deleted file mode 100644 index 6c0dc63d..00000000 --- a/osinaweb/osichat/templates/partials/submitted-review.html +++ /dev/null @@ -1,232 +0,0 @@ -
-
-
- - - - - - - - - - - - -
-
- -
-

Thank you for submitting the rating

- -
- - - - - - -
- {% if not review.details %} -
- {% csrf_token %} -
- - -
- -
-
-
- {% endif %} -
-
\ No newline at end of file diff --git a/osinaweb/osichat/templates/partials/typing.html b/osinaweb/osichat/templates/partials/typing.html deleted file mode 100644 index c1819f56..00000000 --- a/osinaweb/osichat/templates/partials/typing.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
- -
-
-
-
-
-
-
-
diff --git a/osinaweb/osichat/templates/partials/unread-messages.html b/osinaweb/osichat/templates/partials/unread-messages.html deleted file mode 100644 index 64a859c2..00000000 --- a/osinaweb/osichat/templates/partials/unread-messages.html +++ /dev/null @@ -1,63 +0,0 @@ - -
-
-
-
-
- {% if latest_unread_message.member.staffprofile.image %} - - {% else %} -

{{latest_unread_message.member.first_name.0}}{{latest_unread_message.member.last_name.0}}

- {% endif %} -
-

{{latest_unread_message.member.first_name}} {{latest_unread_message.member.last_name.0}}. from Ositcom

-
- -
- - - -
-
- - - {% if not latest_unread_message.chatmessageattachment %} -

- {{latest_unread_message.content}} -

- - {% elif latest_unread_message.chatmessageattachment and not latest_unread_message.chatmessageattachment.is_image %} -
- - - - - -

{{latest_unread_message.chatmessageattachment.file_name}}

-
- {% else %} -
- -
- {% endif %} - - -
- - - - -

See {{number_of_unread}} new message{% if not number_of_unread == 1 %}s{% endif %}

-
-
-
\ No newline at end of file diff --git a/osinaweb/osichat/templates/start-chat.html b/osinaweb/osichat/templates/start-chat.html deleted file mode 100644 index b0e56ac6..00000000 --- a/osinaweb/osichat/templates/start-chat.html +++ /dev/null @@ -1,72 +0,0 @@ -{% load static %} - -
-
-
-
-

- We are here 24/7/365 to help with sales or support queries. To start your conversation enter your - name - and mobile number below. -

- - -
-
-
- - - -
- - -
- - -
-
- - - -
- -
- -
-
-
- - -
-
-

We are online

- -

Typically replies in a few minutes

- - -
- -
- - -

Osichat 2.0 by Ositcom

-
-
-
-
\ No newline at end of file diff --git a/osinaweb/osichat/tests.py b/osinaweb/osichat/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/osinaweb/osichat/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/osinaweb/osichat/urls.py b/osinaweb/osichat/urls.py deleted file mode 100644 index 0ca688ea..00000000 --- a/osinaweb/osichat/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path, include -from . import views - - -urlpatterns = [ - path('api/', include('osichat.api.urls')), - path('get-client-ip/', views.get_client_ip, name='get-client-ip'), - path('chat-file-uploader/', views.upload_file, name='chat-file-uploader'), -] diff --git a/osinaweb/osichat/views.py b/osinaweb/osichat/views.py deleted file mode 100644 index c1fe0a81..00000000 --- a/osinaweb/osichat/views.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.shortcuts import render, get_object_or_404 -from django.http import JsonResponse -import requests -import os -from django.views.decorators.csrf import csrf_exempt -from .models import * - - -# Create your views here. - -def get_client_ip(request): - client_ip = request.META.get('HTTP_X_FORWARDED_FOR', '').split(',')[0].strip() or request.META.get('REMOTE_ADDR', '') - - try: - response = requests.get(f'http://ipinfo.io/{client_ip}/json') - data = response.json() - country = data.get('country', 'Unknown') - region = data.get('region', 'Unknown') - except Exception as e: - country = "Unknown" - - return JsonResponse({'ip': client_ip, 'country': country, 'region': region}) - - -@csrf_exempt -def upload_file(request): - if 'file' not in request.FILES or 'filename' not in request.POST: - return JsonResponse({'data': 'Invalid Request'}) - - file = request.FILES['file'] - fileName = request.POST['filename'] - path = os.path.join('static', 'images', 'uploaded_chat_files', fileName) - - # Ensure the directory exists - os.makedirs(os.path.dirname(path), exist_ok=True) - - # If the file already exists, generate a new filename - index = 1 - base_filename, extension = os.path.splitext(fileName) - while os.path.exists(path): - new_filename = f"{base_filename}_{index}{extension}" - path = os.path.join('static', 'images', 'uploaded_chat_files', new_filename) - index += 1 - - # Write the entire file - with open(path, 'wb+') as destination: - destination.write(file.read()) - - - return JsonResponse({'data': 'Uploaded Successfully', 'existingPath': path}) \ No newline at end of file diff --git a/osinaweb/osinacore/__pycache__/__init__.cpython-313.pyc b/osinaweb/osinacore/__pycache__/__init__.cpython-313.pyc index a779432298ede91edc39522aba4b0849bd173c3e..cbc7a059667ac0bf90c5d60787493ff2ebade3a3 100644 GIT binary patch delta 19 ZcmdnSxQ&tfGcPX}0}$-skC@248UQig1or>{ delta 19 ZcmdnSxQ&tfGcPX}0}w3P9X64BH2^fa1&sgz diff --git a/osinaweb/osinacore/__pycache__/admin.cpython-313.pyc b/osinaweb/osinacore/__pycache__/admin.cpython-313.pyc index 49e48c0a563260a74b5cedad9475d2670dca31fc..a03ad41648fc632bf824e15336b77107b858f066 100644 GIT binary patch delta 20 acmdn4xLuL^GcPX}0}$-skJ!k)MgRaj4Fzfd delta 20 acmdn4xLuL^GcPX}0}w3P9k!8sjQ{{Ye+B>m diff --git a/osinaweb/osinacore/__pycache__/apps.cpython-313.pyc b/osinaweb/osinacore/__pycache__/apps.cpython-313.pyc index badf3e5b14d2128ab8062cd45eab63dc3d8c6bb2..54095d0b0975217c8b36e8951f8b46d4f400d5c2 100644 GIT binary patch delta 20 acmZ3%vVw*CGcPX}0}$-skJ!j9%LD*4lLU1D delta 20 acmZ3%vVw*CGcPX}0}w3P9k!8MmI(kj1qBNL diff --git a/osinaweb/osinacore/__pycache__/consumers.cpython-313.pyc b/osinaweb/osinacore/__pycache__/consumers.cpython-313.pyc index 32d06c0ce5e5880aec5d50c4f96611f570a7317d..881f8885ed1b9f307715c665080a352617d456ad 100644 GIT binary patch delta 20 acmZqiZSm#)%*)Hg00cYuBQ|nZssR8xTLnJ= delta 20 acmZqiZSm#)%*)Hg00c{Rhi&ApR09A#%>~r} diff --git a/osinaweb/osinacore/__pycache__/decorators.cpython-313.pyc b/osinaweb/osinacore/__pycache__/decorators.cpython-313.pyc index 6d72e762192f6649c1fa2e11028cffb3babcbfde..15068052908385dc3c2b91d508cc51b95ef64f8a 100644 GIT binary patch delta 20 acmZ3^wVaFlGcPX}0}$-skJ!j9!wLX3Mg)NX delta 20 acmZ3^wVaFlGcPX}0}w3P9k!8Mh7|xfxCIvg diff --git a/osinaweb/osinacore/__pycache__/forms.cpython-313.pyc b/osinaweb/osinacore/__pycache__/forms.cpython-313.pyc index 082af28c17e787cde00b6560468d8ca091e2f14b..9964a0f42beb2fc8c90f6072833cdb861adca209 100644 GIT binary patch delta 20 acmcc2b(xF%GcPX}0}$-skJ!lV!3qF8CItlm delta 20 acmcc2b(xF%GcPX}0}w3P9k!9%gB1Wjm<5{v diff --git a/osinaweb/osinacore/__pycache__/models.cpython-313.pyc b/osinaweb/osinacore/__pycache__/models.cpython-313.pyc index 23847c2bcfe151ce98aa99675c80af6ed59902a4..82d04c2b6a1e411a0e78d892f76b4c865b576b15 100644 GIT binary patch delta 22 ccmcchi}BVkM()qNyj%=Gu!BEhBe#Do0A(2mbN~PV delta 22 ccmcchi}BVkM()qNyj%=Gpt>(?Be#Do0A(ZxjsO4v diff --git a/osinaweb/osinacore/__pycache__/routing.cpython-313.pyc b/osinaweb/osinacore/__pycache__/routing.cpython-313.pyc index 93d6052280dbf1b50e633cfc91897f4600625327..b8d46711dcd2a2f0b9d97d57b2db66eb9514cc16 100644 GIT binary patch delta 20 acmeyu@`Z)_GcPX}0}$-skJ!ka$pipEa|Kxd delta 20 acmeyu@`Z)_GcPX}0}w3P9k!7>lL-Jr|36b9gXqliQXEChAj;u?3>Aq?XX1X`V&W2QM69k4Fi)T;wibdZY$eZN zoyI4ywA8{%@fVAn%kabZbMBeqzBOzw4V(6$5W}t!`Z?7xf_B z)Qj|xj`UI=(x85%j|Px_8bk&voiwBi<8Kj;3RXhoU=G8>%n^8mISP+5$1D_Mtcb(o z%n5jcc?othC*euv6gt+MKQ~Y96ZOIhv%6K@B*_5FESTl7xOagW?q3k zO`gJc)>pu_QvflA%Nc+1K0-w0Nx-)Af+edr-sTOMa1^cXflK=n! delta 760 zcmYk)xl03K5C!o0;!y~Zbei>w_kEkh9GZCKT<`HVUP%NMC9tvIRRy5l}TKz_q#0) z;tGw70j@+2vK=|Z8q&#CNEcTl-CTnl=31mDVdFZDoPR5E8Qz4C9m0ONUU&p<5FUja zH8Kke0w|iqKoD*g9)nwi$Kh7t3Ajyo5^fg`!5zY3xKlI#-ynjbOAJKeZs8c*BOHf& zg>|@3cnaAt#Bff5|<1Y!|5gQytCOF398XYQQ6DKCbi7j|icpDB0?_gtC-;F1Y zWGz+_M|6rSLpcb8Q8Adxe;0jSsdWDH`bXIw%QM-7)c)>C&v7Qbca+V)-8fa*t0KZp U+4IZ3+*-*KRlk?!&vM?PU$%LM{r~^~ diff --git a/osinaweb/osinacore/add/__pycache__/urls.cpython-313.pyc b/osinaweb/osinacore/add/__pycache__/urls.cpython-313.pyc index 3f8e7402d106d51d02b287e8aa1dc60eee5afc7b..698ea04527d56edb4469935679846e60e1bc76e4 100644 GIT binary patch delta 20 acmcbhctMf-GcPX}0}$-skJ!k4Q~&@!^#!#6 delta 20 acmcbhctMf-GcPX}0}w3P9k!ACr~m*%X9i0E diff --git a/osinaweb/osinacore/add/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/add/__pycache__/views.cpython-313.pyc index 78eb626489ce59b01960e6490e26aa8fc7dcc02b..d27e2437be42dff4787a01c1e8ea7cdb1224cc78 100644 GIT binary patch delta 22 ccmcb)h3V!NChpI?yj%=Gu!BEhBe&ly09u9z1ONa4 delta 22 ccmcb)h3V!NChpI?yj%=Guw-}GMsB}Z0A2V8ng9R* diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index ba1456a2c23e9dc608778dfe1b9303e4c3b02171..701fe287c0a95fe51a481894225656fdf3ff3748 100644 GIT binary patch delta 20 acmZ3-yN;LpGcPX}0}$-skJ!k)m<<3o%LN?( delta 20 acmZ3-yN;LpGcPX}0}w3P9k!8sF&h9oJq5D> diff --git a/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc index dea234bb203d9a227fadd19b3f645647b2c08a7c..4344a9e78b56facffd9f0b08ff707dd1904ac290 100644 GIT binary patch delta 20 acmZ3$vVevAGcPX}0}$-skJ!j9$^-y2Qv_WA delta 20 acmZ3$vVevAGcPX}0}w3P9k!8MlnDSf#RT&J diff --git a/osinaweb/osinacore/api/__pycache__/utils.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/utils.cpython-313.pyc index dbfd822ecd7cc6b3e09c9ac6a2c32abe00c15a4d..1c4baaa45391af60babb9b1683d357b72c4f68e2 100644 GIT binary patch delta 20 acmX>ta$1D@GcPX}0}$-skJ!lVzy$z2Qw0V9 delta 20 acmX>ta$1D@GcPX}0}w3P9k!9%feQdX#RZ%I diff --git a/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc index 22308f44d7a33a05018e086191f68b88bce3fffe..4f8101f9ae37ae6a426482328bd4732afe3a38f0 100644 GIT binary patch delta 20 acmX@0c0i5$GcPX}0}$-skJ!ji5&n$ItB9p diff --git a/osinaweb/osinacore/delete/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/delete/__pycache__/views.cpython-313.pyc index c7ed75ad8599101bb0b2db46f88de5ada3f249c2..f733c548d519a40b5c7a65ed0a38d7fb896228b7 100644 GIT binary patch delta 20 acmaEE{oI=SGcPX}0}$-skJ!k4M-~7_LIyhk delta 20 acmaEE{oI=SGcPX}0}w3P9k!ACjw}F5v4P6W09 delta 20 acmbQjJcXJ2GcPX}0}w3P9k!9XlMw(lzy(YI diff --git a/osinaweb/osinacore/knowledge_base/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/knowledge_base/__pycache__/views.cpython-313.pyc index 4c85b1dd5af4c42a1058297f2cccd5030fce6b46..51c1c25522a1891e73288653d40e46bc6299b112 100644 GIT binary patch delta 20 acmeyz@{fi4GcPX}0}$-skJ!jv%me^J0|j>g delta 20 acmeyz@{fi4GcPX}0}w3P9k!9Xmg4=LDPp delta 20 acmZ1|vrvZnGcPX}0}w3P9k!8Mj1K@hSp_lx diff --git a/osinaweb/osinacore/migrations/__pycache__/0002_projecttype_alter_business_options_staffprofile_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0002_projecttype_alter_business_options_staffprofile_and_more.cpython-313.pyc index bd5cc6c0aab7ea756fa5c548ce016899fc97ca0e..05455d2674281b45745d7c5fa0aea33e910f2aae 100644 GIT binary patch delta 20 acmca8dr_AAGcPX}0}$-skJ!k4j1K@miv_L# delta 20 acmca8dr_AAGcPX}0}w3P9k!AC7#{#a{RTt; diff --git a/osinaweb/osinacore/migrations/__pycache__/0003_milestone.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0003_milestone.cpython-313.pyc index 464705870e7745306567d469db271fb512f21733..ad10db4d8574c22457465e3967d926d9c5ff135a 100644 GIT binary patch delta 20 acmaFG{fe9WGcPX}0}$-skJ!k4pA`T=;swkA delta 20 acmaFG{fe9WGcPX}0}w3P9k!ACJ}Ur3R0d)I diff --git a/osinaweb/osinacore/migrations/__pycache__/0004_epic.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0004_epic.cpython-313.pyc index 555139eb356c4403248325c03132a1b10a51e611..8b0e13e662943a7919b5eb5a898862a76b0bd0a9 100644 GIT binary patch delta 20 acmdnMy@8wiGcPX}0}$-skJ!k)lobFs(ghv> delta 20 acmdnMy@8wiGcPX}0}w3P9k!8sDJuXwLje1# delta 20 acmZ3)yNH+jGcPX}0}w3P9k!8sIvW5vT?LN- diff --git a/osinaweb/osinacore/migrations/__pycache__/0007_project_project_id_alter_project_status.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0007_project_project_id_alter_project_status.cpython-313.pyc index 70732411372d0243febf9940638b4727ffec4e5c..b899104de23b48e24087abf4a4b0f508138928eb 100644 GIT binary patch delta 20 acmdnav7LkaGcPX}0}$-skJ!kq!vX*|eFUrk delta 20 acmdnav7LkaGcPX}0}w3P9k!8MhXnvS?*&2t diff --git a/osinaweb/osinacore/migrations/__pycache__/0008_alter_project_project_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0008_alter_project_project_id.cpython-313.pyc index b1c2399067cf682e46ebff4daa575b06c5157527..94d03819017aa7cebc90c4e37f4fb5add515dccf 100644 GIT binary patch delta 20 acmaFL_LPnLGcPX}0}$-skJ!i^#S8#GWCbw* delta 20 acmaFL_LPnLGcPX}0}w3P9k!7>iWvYw)&<7^ diff --git a/osinaweb/osinacore/migrations/__pycache__/0009_alter_project_project_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0009_alter_project_project_id.cpython-313.pyc index e6282556fb5777023777b058e41fe8468bbd51f7..b2fe53e3a526a1ffe4f33c8153ef61cc1636ac07 100644 GIT binary patch delta 20 acmcb`c8iVsGcPX}0}$-skJ!lV&kO)OtOXDN delta 20 acmcb`c8iVsGcPX}0}w3P9k!9%pBVr^9tEZV diff --git a/osinaweb/osinacore/migrations/__pycache__/0010_remove_note_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0010_remove_note_date.cpython-313.pyc index 1ab821e8af4f0430c2990d7ffc8ce0b7b3bbbe31..b02bc20937a35377aaa33372b763a2884551b44a 100644 GIT binary patch delta 20 acmX@hdX|;@GcPX}0}$-skJ!k4hzS5Ye+6a$ delta 20 acmX@hdX|;@GcPX}0}w3P9k!AC5EB4C@df+< diff --git a/osinaweb/osinacore/migrations/__pycache__/0011_note_date_alter_note_color_alter_note_text_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0011_note_date_alter_note_color_alter_note_text_and_more.cpython-313.pyc index dc44a601aceb3738e83f7b28438a1724aae4e2b7..de47a88ffde9a585a8b8ef3f26bc54d1460e82ce 100644 GIT binary patch delta 20 acmZqWYvtqq%*)Hg00cYuBQ|pXVgmp&hXo`6 delta 20 acmZqWYvtqq%*)Hg00c{Rhi&Bk#RdR1`31TF diff --git a/osinaweb/osinacore/migrations/__pycache__/0012_projectrequirement.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0012_projectrequirement.cpython-313.pyc index b38ec7cd012dd1f081c2e364a0283f66f430974d..331138289cbb051f7dd2d2f038079b57d95a42a6 100644 GIT binary patch delta 20 acmZ3;wUCSZGcPX}0}$-skJ!j9#tHy5Rs?SV delta 20 acmZ3;wUCSZGcPX}0}w3P9k!8Mj1>Sk$OQ!e diff --git a/osinaweb/osinacore/migrations/__pycache__/0013_projectfile.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0013_projectfile.cpython-313.pyc index 8c61b3cb4f4af5ce72d6eac4d5d776a4ce00da03..7362cdf0472888b967e9063f009ac571da0e4d43 100644 GIT binary patch delta 20 acmeC+?%?MB%*)Hg00cYuBQ|o^vH}1xk_4sz delta 20 acmeC+?%?MB%*)Hg00c{Rhi&ApWd#5=1O+?* diff --git a/osinaweb/osinacore/migrations/__pycache__/0014_alter_projectfile_file.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0014_alter_projectfile_file.cpython-313.pyc index 8e13e564dae5dcb1e23b7c718d50db1f60494809..80c6d562bbf907648055222b01804f042bc6a937 100644 GIT binary patch delta 20 acmdnZwwsOnGcPX}0}$-skJ!jU# diff --git a/osinaweb/osinacore/migrations/__pycache__/0015_projectcredentials.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0015_projectcredentials.cpython-313.pyc index b8620cfcf21483c1e4c403a8da33cc7056d99f82..1b032f65d7dc55e1f6edefea0794e5f80fd53850 100644 GIT binary patch delta 20 acmeC+?%?MB%*)Hg00cYuBQ|o^vH}1xk_4sz delta 20 acmeC+?%?MB%*)Hg00c{Rhi&ApWd#5=1O+?* diff --git a/osinaweb/osinacore/migrations/__pycache__/0016_rename_projectcredentials_projectcredential.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0016_rename_projectcredentials_projectcredential.cpython-313.pyc index 6e3a1546073dc7569907fae273ccc65c93118684..9e432892c223cc6012bd43351261d7a44b8c725d 100644 GIT binary patch delta 20 acmey*`k$5iGcPX}0}$-skJ!llg$V#dPX+t{ delta 20 acmey*`k$5iGcPX}0}w3P9k!AC3ljiF!3L55 diff --git a/osinaweb/osinacore/migrations/__pycache__/0017_alter_project_end_date_alter_project_start_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0017_alter_project_end_date_alter_project_start_date.cpython-313.pyc index 62402b772a27fd9cfaa94b51ed051d6f4637c2a9..e06555ece139cdab66b80ff6b210561a4d68c7d5 100644 GIT binary patch delta 20 acmcc3ew&^9GcPX}0}$-skJ!k4ff)cj_yv^! delta 20 acmcc3ew&^9GcPX}0}w3P9k!AC0y6+XY6dF+ diff --git a/osinaweb/osinacore/migrations/__pycache__/0018_epic_status.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0018_epic_status.cpython-313.pyc index 65bcb8c064cc83d770e52bb281e980723d27efe7..33dbe9ed12b0501f0d5b62b134b9e56efca863cd 100644 GIT binary patch delta 20 acmZo?Z)fNJ%*)Hg00cYuBQ|o^FarQE*aVpX delta 20 acmZo?Z)fNJ%*)Hg00c{Rhi&ApVFmy+N(CmmL5_@&*(D diff --git a/osinaweb/osinacore/migrations/__pycache__/0021_alter_customerprofile_business_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0021_alter_customerprofile_business_and_more.cpython-313.pyc index e25c0845ff5fb2c4c894b9ba1c96d6f5955a4ddc..a8f7163bfab9c2e3ec9e7c47fa11eea4530c9904 100644 GIT binary patch delta 20 acmdljx?7a{GcPX}0}$-skJ!k)feQdS_XSu0 delta 20 acmdljx?7a{GcPX}0}w3P9k!8s0~Y{3X$9^8 diff --git a/osinaweb/osinacore/migrations/__pycache__/0022_customerprofile_customer_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0022_customerprofile_customer_id.cpython-313.pyc index a824b794e09e41cf63b4532dcf9ff7eb8a2ab975..bdc5178b9f10a086bc858052fcfa73f00f0f30b4 100644 GIT binary patch delta 20 acmeyu_Jxi6GcPX}0}$-skJ!ka$qWEMyaiqW delta 20 acmeyu_Jxi6GcPX}0}w3P9k!7>lNkU+E(P=e diff --git a/osinaweb/osinacore/migrations/__pycache__/0023_task_assigned_to.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0023_task_assigned_to.cpython-313.pyc index 8203a1e349c95f15e32ad01457e71628fa8a7c60..29d42334a76faec620fab6002d9e8723e1669e14 100644 GIT binary patch delta 20 acmbQlF^PlwGcPX}0}$-skJ!k~&H?~2wFEr? delta 20 acmbQlF^PlwGcPX}0}w3P9k!91odp0jCj`>~ diff --git a/osinaweb/osinacore/migrations/__pycache__/0024_task_task_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0024_task_task_id.cpython-313.pyc index 6066de17d0b81e12db8e0bc51f2e1d3179a3652e..78d3fccb1625fa20a916f137a283f54074ef6cd9 100644 GIT binary patch delta 20 acmdnTwvUbbGcPX}0}$-skJ!j<%nSfHOa#0D delta 20 acmdnTwvUbbGcPX}0}w3P9k!9%m>B>&z6DYM diff --git a/osinaweb/osinacore/migrations/__pycache__/0025_status.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0025_status.cpython-313.pyc index 1b8c0ade6eae2ab09f51c375c964b9cd71510046..4c2a595438f1896c388b2746ced563cc9280176f 100644 GIT binary patch delta 20 acmZ3+vy6xPGcPX}0}$-skJ!j9%?1E9X9R-) delta 20 acmZ3+vy6xPGcPX}0}w3P9k!8MnhgLr*##K@ diff --git a/osinaweb/osinacore/migrations/__pycache__/0026_remove_status_user_status_staff.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0026_remove_status_user_status_staff.cpython-313.pyc index df71de89f5f393650309d29e6391810de1d54d72..bab13bd1638cc46dc4cb3b515b1b1de613edf31c 100644 GIT binary patch delta 20 acmZqWY~|$s%*)Hg00cYuBQ|nZu>b%t(FB+P delta 20 acmZqWY~|$s%*)Hg00c{Rhi&ApVgUd&Lj^7X diff --git a/osinaweb/osinacore/migrations/__pycache__/0027_alter_status_staff.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0027_alter_status_staff.cpython-313.pyc index 8667b9aa1553ffc7f3836ccdcec802b9e006699f..29e6391ce6e8c72342a55b9fed6bf822226d53eb 100644 GIT binary patch delta 20 acmdnZv73YYGcPX}0}$-skJ!j;%XF delta 20 acmX@ac8HDpGcPX}0}w3P9k!9%oEZQ-UIktN diff --git a/osinaweb/osinacore/migrations/__pycache__/0032_point.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0032_point.cpython-313.pyc index 7d3d9253fa84a3f6619a9180a531f2cac3fd03de..d0a4b597625a7d2930ae50689df70ddcc3eb66f6 100644 GIT binary patch delta 20 acmbQoJ&&9FGcPX}0}$-skJ!jPnH2yv0tDy) delta 20 acmbQoJ&&9FGcPX}0}w3P9k!8sGAjT$bOn9@ diff --git a/osinaweb/osinacore/migrations/__pycache__/0033_point_date_completed_point_date_workingon_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0033_point_date_completed_point_date_workingon_and_more.cpython-313.pyc index 3aa642288028d8c40b425bac3d41df6929a3cc4e..d547eddbc80de15996531b82bf48857f13c7c809 100644 GIT binary patch delta 20 acmdnNxr3AYGcPX}0}$-skJ!k)mIVMf$ptY0 delta 20 acmdnNxr3AYGcPX}0}w3P9k!8sEeilVI|au8 diff --git a/osinaweb/osinacore/migrations/__pycache__/0034_alter_point_date_completed_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0034_alter_point_date_completed_and_more.cpython-313.pyc index 20a93e056a699d6de8aaee47afecf5f8d43e9905..dc15ba82301c9b062331d533d86913dd2e480fc2 100644 GIT binary patch delta 20 acmeys`GJ%BGcPX}0}$-skJ!lllm!4mi3QmJ delta 20 acmeys`GJ%BGcPX}0}w3P9k!ACDGLBZ`vz|S diff --git a/osinaweb/osinacore/migrations/__pycache__/0035_business_business_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0035_business_business_id.cpython-313.pyc index 69a4fffd377dc039af36e8287b3910eb843a8bcf..5fc0c8a37e655140ae223f1f8e08c475ed071e05 100644 GIT binary patch delta 20 acmaFF_K1!9GcPX}0}$-skJ!i^&I|xO>;)(Q delta 20 acmaFF_K1!9GcPX}0}w3P9k!7>oEZQ?UIo4Y diff --git a/osinaweb/osinacore/migrations/__pycache__/0036_staffposition_alter_staffprofile_position.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0036_staffposition_alter_staffprofile_position.cpython-313.pyc index 39b160b4ef57b2ce085c96a82c36b71d47acc049..4a9d59bd639fd40404fb71ab84cdf6a62ac88985 100644 GIT binary patch delta 20 acmbQtIhm9DGcPX}0}$-skJ!lF!2$p?0R+MT delta 20 acmbQtIhm9DGcPX}0}w3P9k!9Xg9QLKa|Kuc diff --git a/osinaweb/osinacore/migrations/__pycache__/0037_remove_staffprofile_position.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0037_remove_staffprofile_position.cpython-313.pyc index 66a2ae9156ef532de6e2a8421a0e0e5138b3b88f..74c502d7cfef074d8c88444cdf60acbbfde30648 100644 GIT binary patch delta 20 acmey)`kj^gGcPX}0}$-skJ!llh6w;d4+Z1^ delta 20 acmey)`kj^gGcPX}0}w3P9k!AC4HE!Gfd+a2 diff --git a/osinaweb/osinacore/migrations/__pycache__/0038_staffprofile_staff_position.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0038_staffprofile_staff_position.cpython-313.pyc index 9e29d0654c5206b01cc3298a97e3b45e8d1ef989..ae07fcdcc128de8a57a7dbbc3516119b18b6bb5a 100644 GIT binary patch delta 20 acmZ3*v5JHHGcPX}0}$-skJ!j9&jJ87bp(X~ delta 20 acmZ3*v5JHHGcPX}0}w3P9k!8Mo&^9n=LH)8 diff --git a/osinaweb/osinacore/migrations/__pycache__/0039_alter_staffprofile_staff_position.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0039_alter_staffprofile_staff_position.cpython-313.pyc index 04d480c085a25c5405ca123a129ac0cb4923a52c..fd9e6e2da4e669da476f3dcb66959fcba43dac85 100644 GIT binary patch delta 20 acmX@iahQYqGcPX}0}$-skJ!j;)(Q delta 20 acmaFF_K1!9GcPX}0}w3P9k!7>oEZQ?UIo4Y diff --git a/osinaweb/osinacore/migrations/__pycache__/0041_dailyreport.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0041_dailyreport.cpython-313.pyc index b67c8f9e125b3b58d7bde5c01ce68c6c47fd6aab..e06eb2f9b0264ea969c3af19553c05c471b45814 100644 GIT binary patch delta 20 acmdnZy_=i+GcPX}0}$-skJ!k)ffWEbiUmIa delta 20 acmdnZy_=i+GcPX}0}w3P9k!8s11kVL`~}qj diff --git a/osinaweb/osinacore/migrations/__pycache__/0042_remove_customerprofile_email_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0042_remove_customerprofile_email_and_more.cpython-313.pyc index 124f493a3bdd3848c242430afd79f6ca4b1bd6ad..a6aa9b3dc4e471c4360ecfc298866ec38e818293 100644 GIT binary patch delta 20 acmeC;?BeA9%*)Hg00cYuBQ|o^vj6}wnFOZ* delta 20 acmeC;?BeA9%*)Hg00c{Rhi&ApX8`~;3k5v@ diff --git a/osinaweb/osinacore/migrations/__pycache__/0043_businesstype.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0043_businesstype.cpython-313.pyc index 5d52ba5612b1aa742f62c103c183852c346bf62c..3a236ae9f6800fc0568c3e4733cf4eba79002816 100644 GIT binary patch delta 20 acmcb{evO^`GcPX}0}$-skJ!k4ni&8+Fa?GH delta 20 acmcb{evO^`GcPX}0}w3P9k!ACG&2A|q6QoQ diff --git a/osinaweb/osinacore/migrations/__pycache__/0044_remove_business_business_type.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0044_remove_business_business_type.cpython-313.pyc index bd6670385449ed1deba02855bf39f8e37baeec4b..852ae7c4948bef0cd1bfb2a5885683e6446e58d4 100644 GIT binary patch delta 20 acmcc3dYhH|GcPX}0}$-skJ!k4fe8RTuLY0* delta 20 acmcc3dYhH|GcPX}0}w3P9k!AC0uum1AqFM@ diff --git a/osinaweb/osinacore/migrations/__pycache__/0045_business_type.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0045_business_type.cpython-313.pyc index 9895a85e7a512bd7bb4e23a45760437fb4f00cfe..2b867bb3533481f6520e5d31dd32c0ed1dd0a34d 100644 GIT binary patch delta 20 acmZ3$v4Dg7GcPX}0}$-skJ!j9$^rm0J3 diff --git a/osinaweb/osinacore/migrations/__pycache__/0047_task_status_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0047_task_status_date.cpython-313.pyc index abde41e0e6ebbcdc29254a682f43338296a7032f..84c0742f787f1c7a09e70aeec08ffed5d54f582d 100644 GIT binary patch delta 20 acmdnXzL%Z*GcPX}0}$-skJ!k)i5UPnNCi6p delta 20 acmdnXzL%Z*GcPX}0}w3P9k!8s6Egrjx&_ey diff --git a/osinaweb/osinacore/migrations/__pycache__/0048_alter_customerprofile_business.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0048_alter_customerprofile_business.cpython-313.pyc index e419114ff49e95ebcb67eb82331a3244701fa63f..20296735cbfd38754922034f654dae492cd226f5 100644 GIT binary patch delta 20 acmcc4ah-$vGcPX}0}$-skJ!lV!vX+2eFY2v delta 20 acmcc4ah-$vGcPX}0}w3P9k!9%hXnvX?**a& diff --git a/osinaweb/osinacore/migrations/__pycache__/0049_alter_customerprofile_business.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0049_alter_customerprofile_business.cpython-313.pyc index 8262448c290438cf1cc01408d8bba430cda25119..5ca63a5cafcab2d56ef950a9a56a1a14a8642ef0 100644 GIT binary patch delta 20 acmdnav7LkaGcPX}0}$-skJ!kq!vX*|eFUrk delta 20 acmdnav7LkaGcPX}0}w3P9k!8MhXnvS?*&2t diff --git a/osinaweb/osinacore/migrations/__pycache__/0050_projectrequirement_added_by_projectrequirement_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0050_projectrequirement_added_by_projectrequirement_date.cpython-313.pyc index 91ae927e510f7130c7f73a17a2c99d13e655c852..376fda5bd036ad0c275c44ae05d0affc1affeedf 100644 GIT binary patch delta 20 acmey!^^uGFGcPX}0}$-skJ!ka#tHyH)&*Yx delta 20 acmey!^^uGFGcPX}0}w3P9k!7>jTHbyNCou( diff --git a/osinaweb/osinacore/migrations/__pycache__/0051_alter_task_requirement.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0051_alter_task_requirement.cpython-313.pyc index ca64fe360b9106bf11a696341fcb7a5fe665e62e..55a507f788cebcc88df09d5a7aa5a73a172d20c5 100644 GIT binary patch delta 20 acmdnRv5SNIGcPX}0}$-skJ!kq&jJ89^#rv5 delta 20 acmdnRv5SNIGcPX}0}w3P9k!8Mp9KIrX9Y_D diff --git a/osinaweb/osinacore/migrations/__pycache__/0052_note_project.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0052_note_project.cpython-313.pyc index 905c08f9f0599fd1914a4840221c9c128d9f87c2..2e4cd9f373ea2092bbb532226bcd4ccea81f76dc 100644 GIT binary patch delta 19 ZcmeC?=;q-5%*)Hg00cYuBNlSA001mW1Q-AS delta 19 ZcmeC?=;q-5%*)Hg00c{Rhb`o00RS&01g-!8 diff --git a/osinaweb/osinacore/migrations/__pycache__/0053_pointactivity.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0053_pointactivity.cpython-313.pyc index ea87968bba81cda477341ce19a23a89654e3f562..746af18dc52bf38b51eb37405e91103bb008ce06 100644 GIT binary patch delta 20 acmbQoHIIw?GcPX}0}$-skJ!j9%nATA-UMa< delta 20 acmbQoHIIw?GcPX}0}w3P9k!8Mm=ypwPz3w{ diff --git a/osinaweb/osinacore/migrations/__pycache__/0054_remove_point_date_completed_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0054_remove_point_date_completed_and_more.cpython-313.pyc index 5dd3dc8b14f6bcab7fc0741d851a478d3c588b08..6b8f17d345029211b3245dc565cfa1b785fceccd 100644 GIT binary patch delta 20 acmdnYzL}l-GcPX}0}$-skJ!k)f*AlexCI>m delta 20 acmdnYzL}l-GcPX}0}w3P9k!8s1v3CUDh0Cu diff --git a/osinaweb/osinacore/migrations/__pycache__/0055_alter_point_status.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0055_alter_point_status.cpython-313.pyc index 609460ba76aaeffdee06fab8ee252148e3e0d4ad..8b180ffed22e0f8e178497add6627185a965c03d 100644 GIT binary patch delta 20 acmdnTzK@;zGcPX}0}$-skJ!k)nHc~%a0Na9 delta 20 acmdnTzK@;zGcPX}0}w3P9k!8sGcy1@;sw+I diff --git a/osinaweb/osinacore/migrations/__pycache__/0056_alter_pointactivity_end_time.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0056_alter_pointactivity_end_time.cpython-313.pyc index c70f6bfd0e42e3ffd3c4a7cda870313771876f48..f3739c966aa08d7f88d0228e1b5b1254db035727 100644 GIT binary patch delta 20 acmX@jcAAa*GcPX}0}$-skJ!lVzzhI7R0QJy delta 20 acmX@jcAAa*GcPX}0}w3P9k!9%ff)cj#szr* diff --git a/osinaweb/osinacore/migrations/__pycache__/0057_point_total_time_hours_point_total_time_minutes_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0057_point_total_time_hours_point_total_time_minutes_and_more.cpython-313.pyc index 5d4025ada29a1aed9aabf86eafb09f8010097cba..9ea4bbc2d1023e1f38b75a087888e33dcad375a0 100644 GIT binary patch delta 20 acmcb{agBrfGcPX}0}$-skJ!lV%>n>CRRswE delta 20 acmcb{agBrfGcPX}0}w3P9k!9%n*{(r#|57N diff --git a/osinaweb/osinacore/migrations/__pycache__/0058_remove_point_total_time_hours_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0058_remove_point_total_time_hours_and_more.cpython-313.pyc index 574e942468d2cce697312cbdbbdecb7828d2a928..d50326512212a178a15db1a87c3b2f4654a900cc 100644 GIT binary patch delta 20 acmZ3=zLcH&GcPX}0}$-skJ!jPix~hlhy?Qh delta 20 acmZ3=zLcH&GcPX}0}w3P9k!8s7Bc`i`UQyq diff --git a/osinaweb/osinacore/migrations/__pycache__/0059_alter_task_requirement.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0059_alter_task_requirement.cpython-313.pyc index 113e97b239fd1f8009abdc141970b916ab1c7c3c..d105bfe6a8e5f54dd357f5a1ac60b4567b50a0f0 100644 GIT binary patch delta 20 acmdnbv7dwcGcPX}0}$-skJ!j-a diff --git a/osinaweb/osinacore/migrations/__pycache__/0063_alter_connection_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0063_alter_connection_date.cpython-313.pyc index 89d0db53866e996a1adb96ca83266f16597e2c98..44568a9e9b12ded41bbfc7a342fe40e4b21529dc 100644 GIT binary patch delta 20 acmZ3*wu+7WGcPX}0}$-skJ!j9&kO)HEChf6 delta 20 acmZ3*wu+7WGcPX}0}w3P9k!8Mo*4i*o&^>F diff --git a/osinaweb/osinacore/migrations/__pycache__/0064_reaction.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0064_reaction.cpython-313.pyc index 23a92e5340d84217b4268ab3249dac43d2b9919f..2de8b3368134685f0aacf1ea2be4a5016c6907b4 100644 GIT binary patch delta 20 acmX@ibC`$wGcPX}0}$-skJ!j delta 20 acmey$_LYtMGcPX}0}w3P9k!7>ix~h!Rt5I} diff --git a/osinaweb/osinacore/migrations/__pycache__/0068_remove_customerprofile_confirmed_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0068_remove_customerprofile_confirmed_and_more.cpython-313.pyc index e3856bc119f85b06a607fd37367fb8b37b07603e..b3645078f9e272fc8c213ae10b9ab045b102efb4 100644 GIT binary patch delta 20 acmdnRv5SNIGcPX}0}$-skJ!kq&jJ89^#rv5 delta 20 acmdnRv5SNIGcPX}0}w3P9k!8Mp9KIrX9Y_D diff --git a/osinaweb/osinacore/migrations/__pycache__/0069_alter_business_logo_alter_projectfile_file_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0069_alter_business_logo_alter_projectfile_file_and_more.cpython-313.pyc index b30be3f311a23c9363b7f244afb3ff944fa9028f..44293710862fad4a8741ea4e6671accd5880edc4 100644 GIT binary patch delta 20 acmbQwIiHjJGcPX}0}$-skJ!jPg#`dK;RNOY delta 20 acmbQwIiHjJGcPX}0}w3P9k!8s3JU-@Qw4kg diff --git a/osinaweb/osinacore/migrations/__pycache__/0070_department_alter_staffprofile_staff_position_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0070_department_alter_staffprofile_staff_position_and_more.cpython-313.pyc index c5e32f522c57390951f2797b179bff406ee9d567..2aec97f94fc578eaa358ef13c86ec49b66a76a57 100644 GIT binary patch delta 20 acmcb{dySX-GcPX}0}$-skJ!k4nhgLx3k8(` delta 20 acmcb{dySX-GcPX}0}w3P9k!ACG#daxeFiH4 diff --git a/osinaweb/osinacore/migrations/__pycache__/0071_projecttype_department_ticket.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0071_projecttype_department_ticket.cpython-313.pyc index 205c4fa22e434ad33b11e1e99366161badf31bdc..1c1a84c6326ef83b947f5da9f43f5438f8309eec 100644 GIT binary patch delta 20 acmbOsG((8{GcPX}0}$-skJ!k~%LxE95(H=f delta 20 acmbOsG((8{GcPX}0}w3P9k!91mlFUtgarNo diff --git a/osinaweb/osinacore/migrations/__pycache__/0072_ticketupdate_ticketreaction_ticketattachment.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0072_ticketupdate_ticketreaction_ticketattachment.cpython-313.pyc index 6698c15eb566e93e6d644494f921002e8b39fd8a..7978e1544f0dd6a42bd07a30f39dd762a698698a 100644 GIT binary patch delta 20 acmaDS@=k>NGcPX}0}$-skJ!ka%mn~J%LQ)$ delta 20 acmaDS@=k>NGcPX}0}w3P9k!7>nF|0#Jq85; diff --git a/osinaweb/osinacore/migrations/__pycache__/0073_alter_ticket_regarding.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0073_alter_ticket_regarding.cpython-313.pyc index 23de6443293953314552ebff9458204756546ac5..d202813ce684e20c07ab9ecc80669af777212680 100644 GIT binary patch delta 20 acmX@YeuSO-GcPX}0}$-skJ!k)lNkUyUfEfTlMg^$= diff --git a/osinaweb/osinacore/migrations/__pycache__/0081_status_task.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0081_status_task.cpython-313.pyc index 259cf7e4fc635886fb0324404ed47feafaa0c130..596af27d00e05db568988b7f6a8c8ef3d1048a0c 100644 GIT binary patch delta 20 acmZ3@v6_SXGcPX}0}$-skJ!kqzybg@odk#g delta 20 acmZ3@v6_SXGcPX}0}w3P9k!8Mfdv3L4+S0o diff --git a/osinaweb/osinacore/migrations/__pycache__/0082_pinnedproject.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0082_pinnedproject.cpython-313.pyc index 3ee484726871f4d6a2624e4677287c7ccf2d5822..166484220e69c9a2b8f5de3efb6d53bfdb9e6355 100644 GIT binary patch delta 20 acmaFO{hFKmGcPX}0}$-skJ!llfE55i3I)#q delta 20 acmaFO{hFKmGcPX}0}w3P9k!AC0V@DRd;)(Q delta 20 acmaFF_K1!9GcPX}0}w3P9k!7>oEZQ?UIo4Y diff --git a/osinaweb/osinacore/migrations/__pycache__/0084_staffposition.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0084_staffposition.cpython-313.pyc index 951c7e794042f40f4e145e552e63486856b7e6cb..a94f85212b3ebd4784a458e1db65a68db235a989 100644 GIT binary patch delta 20 acmcc3eVd#6GcPX}0}$-skJ!k4ffWEgiUpql delta 20 acmcc3eVd#6GcPX}0}w3P9k!AC0xJMP{021u diff --git a/osinaweb/osinacore/migrations/__pycache__/0085_rename_date_staffposition_start_date_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0085_rename_date_staffposition_start_date_and_more.cpython-313.pyc index 4329657aac7287ffd2f9d5f0522fe8f4e967904f..1c05576323c2420bf7c87ed59a8c02b29f53f116 100644 GIT binary patch delta 20 acmX@cevF;_GcPX}0}$-skJ!k)n;8H)umx5C delta 20 acmX@cevF;_GcPX}0}w3P9k!8sH!}b}A_eRK diff --git a/osinaweb/osinacore/migrations/__pycache__/0086_remove_connection_status_connection_terminated_at.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0086_remove_connection_status_connection_terminated_at.cpython-313.pyc index 548fa954c2bb7ce11e7ec7025b5ca31b0377968b..e173730c21e5caa8e5b33b86663a6468b80ece59 100644 GIT binary patch delta 20 acmcc2ewm&7GcPX}0}$-skJ!k4f*AljxCMOx delta 20 acmcc2ewm&7GcPX}0}w3P9k!AC1Tz3YDh3k( diff --git a/osinaweb/osinacore/migrations/__pycache__/0087_remove_connection_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0087_remove_connection_date.cpython-313.pyc index 91589c64e2d54f276002dbb3b00a3e4689dacd70..77858a3e71be6127b0cd90c83c50529624febbad 100644 GIT binary patch delta 20 acmey&`k9scGcPX}0}$-skJ!llf(ZaYZw1%@ delta 20 acmey&`k9scGcPX}0}w3P9k!AC1rq>7;RbF1 diff --git a/osinaweb/osinacore/migrations/__pycache__/0088_connection_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0088_connection_date.cpython-313.pyc index 6468210fb6469940fb36f772fdd3ccc5ec1015c8..585c10397a030fa534286667ce23de768d991f64 100644 GIT binary patch delta 20 acmZ3-wvLVaGcPX}0}$-skJ!kq%nSfE%mj=8 delta 20 acmZ3-wvLVaGcPX}0}w3P9k!8MnHc~%J_RBG diff --git a/osinaweb/osinacore/migrations/__pycache__/0089_connection_connected.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0089_connection_connected.cpython-313.pyc index bb97e647ce04975cc51665f3d4c1780338e2b30e..262abea5f6c7d855af2224fe39d3f20d845a1632 100644 GIT binary patch delta 20 acmdnYwwaClGcPX}0}$-skJ!kq!3+R4lmwdq delta 20 acmdnYwwaClGcPX}0}w3P9k!8MgBbui1_dzy diff --git a/osinaweb/osinacore/migrations/__pycache__/0090_rename_terminated_at_connection_last_seen.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0090_rename_terminated_at_connection_last_seen.cpython-313.pyc index 6dea5e0ff8c6aed0ae43b43ef216eaaa03b0e2a3..ff09573e98ad1090197ae22831736523eb2def22 100644 GIT binary patch delta 20 acmeBY>u2Ns%*)Hg00cYuBQ|ogFarQE^aL*e delta 20 acmeBY>u2Ns%*)Hg00c{Rhi&9$VFmy+W(36m diff --git a/osinaweb/osinacore/migrations/__pycache__/0091_alter_connection_user.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0091_alter_connection_user.cpython-313.pyc index 2096dd29bfd8c7a7d4694ab11dc74a1db4939b4c..86f7bf2f88553f68bc208b51229ce82c6b9f79cb 100644 GIT binary patch delta 20 acmX@id6<*?GcPX}0}$-skJ!k)g9QLOfdx_k delta 20 acmX@id6<*?GcPX}0}w3P9k!8s2MYi_^9ASt diff --git a/osinaweb/osinacore/migrations/__pycache__/0092_rename_connected_connection_online.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0092_rename_connected_connection_online.cpython-313.pyc index f4e0c33cad6cf651f66682f0797e12070bd0cd9f..38f1a96371298705a483f0b40423ea81e30e2341 100644 GIT binary patch delta 20 acmZo-YhvU6%*)Hg00cYuBQ|n>X955)>jeh@ delta 20 acmZo-YhvU6%*)Hg00c{Rhi&Bk&IAB7T?L&0 diff --git a/osinaweb/osinacore/migrations/__pycache__/0093_connection_disconnected.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0093_connection_disconnected.cpython-313.pyc index 3232c2685378a1cb2421c6601e5651be835df1a7..4e376f052b575b194a5995270c62727c80a3802c 100644 GIT binary patch delta 20 acmX@hc9xC%GcPX}0}$-skJ!lV#0&sBqy*^z delta 20 acmX@hc9xC%GcPX}0}w3P9k!9%i5UPs76pF* diff --git a/osinaweb/osinacore/migrations/__pycache__/0094_customuser.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0094_customuser.cpython-313.pyc index a58e2d8726a031696aaea5c5ec5222ec392c3234..fa68f87bb0f83cbd0f677a098c580fc1c9163c19 100644 GIT binary patch delta 20 acmX@cag2leGcPX}0}$-skJ!j<%>n>9)dbl9 delta 20 acmX@cag2leGcPX}0}w3P9k!9%ngswoM+I*H diff --git a/osinaweb/osinacore/migrations/__pycache__/0095_delete_customuser.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0095_delete_customuser.cpython-313.pyc index 064a27c20e0bb1ac882ad1419be03d817e9b5e3b..53e8e24907f00068f015fdd8ffe139dd029b2845 100644 GIT binary patch delta 20 acmZ3_x}KH$GcPX}0}$-skJ!k)gb4sP&jkzs delta 20 acmZ3_x}KH$GcPX}0}w3P9k!8s2@?Q1K?R}! diff --git a/osinaweb/osinacore/migrations/__pycache__/0096_status_date_time.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0096_status_date_time.cpython-313.pyc index 23bb8ceaa3b3351f5f400aa3b998294e69de67d0..aaeb1d11ec72d2d176342772445eeb17f7240e41 100644 GIT binary patch delta 20 acmdnSwvCPZGcPX}0}$-skJ!kq%?toH3kQo3#ZUw9W diff --git a/osinaweb/osinacore/migrations/__pycache__/0101_rename_date_projectfile_date_added.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0101_rename_date_projectfile_date_added.cpython-313.pyc index e97f544b16a3e535a671f859a60712382570c125..0b2889d3cc4ae57bece5544ea03208edef5139f9 100644 GIT binary patch delta 20 acmeBV>ty5p%*)Hg00cYuBQ|pXV*&s&0|gua delta 20 acmeBV>ty5p%*)Hg00c{Rhi&Bk#{>X1bp^5j diff --git a/osinaweb/osinacore/migrations/__pycache__/0102_remove_projectfile_date_added_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0102_remove_projectfile_date_added_and_more.cpython-313.pyc index 91791ded675174fd73e18868a3b15227b53d56db..9c753e820f3503d58fc011ecdd39bfda1e799724 100644 GIT binary patch delta 20 acmZ3)y@;FpGcPX}0}$-skJ!jPofQBzq6G8+ delta 20 acmZ3)y@;FpGcPX}0}w3P9k!8sIx7G<6a|U^ diff --git a/osinaweb/osinacore/migrations/__pycache__/0103_alter_projectfilealbum_date_added.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0103_alter_projectfilealbum_date_added.cpython-313.pyc index 83e9c11f8e6faf1f10303d40c0e973187c453ec3..926efa884f2dea0a58987d368fdf64204aed3f03 100644 GIT binary patch delta 20 acmcb{c8!huGcPX}0}$-skJ!lV%?toM3Wd{H<2n8Ad delta 20 acmZn=Xb|B3%*)Hg00c{Rhi&Bk$_@ZEdIhim diff --git a/osinaweb/osinacore/migrations/__pycache__/0106_alter_projectfile_file.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0106_alter_projectfile_file.cpython-313.pyc index 58a39532a758fcd9255503da0063ac3b62095d27..f81550e23be264705062f790cbfaada23ccb4f7f 100644 GIT binary patch delta 20 acmeyt_JfW4GcPX}0}$-skJ!ka%M1WPTm@ml*&=&ISMg diff --git a/osinaweb/osinacore/migrations/__pycache__/0107_remove_staffprofile_active.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0107_remove_staffprofile_active.cpython-313.pyc index f4cda0ff595fa19a5a5eb4f216ef4f3a47a11eee..4ef49fec0814884a47481573771fec283bc4e1d3 100644 GIT binary patch delta 20 acmcc5dY_g1GcPX}0}$-skJ!k4g$V#YPX(L+ delta 20 acmcc5dY_g1GcPX}0}w3P9k!AC3KIZ9!3Ht_ diff --git a/osinaweb/osinacore/migrations/__pycache__/0108_status_type_status_type_id.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0108_status_type_status_type_id.cpython-313.pyc index 4aede22344241d6ece5ce8d344004bf4e355183d..fb0f972e319d279ddc8ae0f915919398b9c39c97 100644 GIT binary patch delta 20 acmZ3;v5 diff --git a/osinaweb/osinacore/migrations/__pycache__/0110_projectrequirement_milestone.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0110_projectrequirement_milestone.cpython-313.pyc index 6fefc2ca5c0cbaa12f821fcd431b1d237eb2ab29..5053f644a2b54c170724bb93c827f61c4902ddd7 100644 GIT binary patch delta 20 acmbQwF`t9`GcPX}0}$-skJ!j9!U6y@y#!tW;m%*)Hg00cYuBQ|m~G6MiGd;}%{ delta 20 acmeBS>tW;m%*)Hg00c{Rhi&9$WCj2;?gYF5 diff --git a/osinaweb/osinacore/migrations/__pycache__/0113_userstory_completed_userstory_confirmed.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0113_userstory_completed_userstory_confirmed.cpython-313.pyc index b16eb1590c789704fe3be90acf3f19d4ad8f63f9..a88b276acea20a4e476a4f5f259a906c5b1215ac 100644 GIT binary patch delta 20 acmdnbzMq}@GcPX}0}$-skJ!k)g&6=jm<2%q delta 20 acmdnbzMq}@GcPX}0}w3P9k!8s3o`&c3I*2y diff --git a/osinaweb/osinacore/migrations/__pycache__/0114_alter_project_end_date.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0114_alter_project_end_date.cpython-313.pyc index 05770d936688a4b2d3a5e4cee7686ddbf51aa4f9..6ac42c27a79362400c76f3472e7ab445f7a6bb65 100644 GIT binary patch delta 20 acmcb}c9D(yGcPX}0}$-skJ!lV#tZ;ELO1>je}5 delta 20 acmZp+ZMNn9%*)Hg00c{Rhi&ApkOKfaT?MKD diff --git a/osinaweb/osinacore/migrations/__pycache__/0119_remove_business_created_at_remove_business_uuid_and_more.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/0119_remove_business_created_at_remove_business_uuid_and_more.cpython-313.pyc index 36ebf8c8ee1b489a5bf696cbf100bc6b786cbb71..6f9efbd84715765d4f46c0d95918e08a4dde5ba1 100644 GIT binary patch delta 20 acmZoyZdd01%*)Hg00cYuBQ|o^2m$~!)&$=G delta 20 acmZoyZdd01%*)Hg00c+(gl*)m5d;7^H3gRd diff --git a/osinaweb/osinacore/migrations/__pycache__/__init__.cpython-313.pyc b/osinaweb/osinacore/migrations/__pycache__/__init__.cpython-313.pyc index 147242d03e294f71ba12cffb2030ccd439644777..5c9f3db9ae7a96302c16a308fc23f8fe93130c68 100644 GIT binary patch delta 19 ZcmX@ec#x6%GcPX}0}$-skC@244FEHB1sDJT delta 19 ZcmX@ec#x6%GcPX}0}w3P9X64B8vr&@1+D-9 diff --git a/osinaweb/osinacore/templates/chat_templates/chat-room.html b/osinaweb/osinacore/templates/chat_templates/chat-room.html deleted file mode 100644 index 6ee49f84..00000000 --- a/osinaweb/osinacore/templates/chat_templates/chat-room.html +++ /dev/null @@ -1,135 +0,0 @@ -{% load static %} - - - - -
- -
-
- -
- -

{{chat_room.chatroomguest.visitor.name}}

-
- -
- -
- {% for message in chat_room_messages %} - {% if message.member %} - {% if not message.chatmessageattachment %} -
-
-

{{message.content}}

-
-
- {% else %} - {% if message.chatmessageattachment.is_image %} -
-
- -
-
- {% else %} -
-
-
-
- - - - - -
-
- {{message.chatmessageattachment.file_name}} -
-
-
-
- {% endif %} - {% endif %} - {% else %} -
-
-
- -
-
- {% if not message.chatmessageattachment %} -
-

{{message.content}}

-
- {% else %} - {% if message.chatmessageattachment.is_image %} -
- -
- {% else %} -
-
-
- - - - - -
-
- {{message.chatmessageattachment.file_name}} -
-
-
- {% endif %} - {% endif %} -
- {% endif %} - {% endfor %} - - -
- - -
- {% csrf_token %} -
- -
-
- - - - - -
- -
-
-
-
-
\ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/chat-widget.html b/osinaweb/osinacore/templates/chat_templates/chat-widget.html deleted file mode 100644 index ea969c75..00000000 --- a/osinaweb/osinacore/templates/chat_templates/chat-widget.html +++ /dev/null @@ -1,87 +0,0 @@ -{% load static %} - - - -
- - - - - -

Osichat

-
- - - - - \ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/partials/message.html b/osinaweb/osinacore/templates/chat_templates/partials/message.html deleted file mode 100644 index c2eb22da..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/message.html +++ /dev/null @@ -1,73 +0,0 @@ -{% if chat_message.member %} - {% if not chat_message.chatmessageattachment %} -
-
-

{{chat_message.content}}

-
-
- {% else %} - {% if chat_message.chatmessageattachment.is_image %} -
-
- -
-
- {% else %} -
-
-
-
- - - - - -
-
- {{chat_message.chatmessageattachment.file_name}} -
-
-
-
- {% endif %} - {% endif %} -{% else %} -
-
-
- -
-
- {% if not chat_message.chatmessageattachment %} -
-

{{chat_message.content}}

-
- {% else %} - {% if chat_message.chatmessageattachment.is_image %} -
- -
- {% else %} -
-
-
- - - - - -
-
- {{chat_message.chatmessageattachment.file_name}} -
-
-
- {% endif %} - {% endif %} -
-{% endif %} \ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html b/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html deleted file mode 100644 index d74b8e1f..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/new-chat-room.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
-
- -
-
-

{{chat_room.chatroomguest.visitor.ip_address}}

-

{{chat_room.chatmessage_set.all.last.content}}

- -

{{chat_room.last_updated}}

-
-
- - -
-
\ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/partials/new-visitor.html b/osinaweb/osinacore/templates/chat_templates/partials/new-visitor.html deleted file mode 100644 index d295a5b2..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/new-visitor.html +++ /dev/null @@ -1,30 +0,0 @@ -{% load static %} -
-
-
- {% if not visitor.country == 'Unknown' %} - - {% else %} - - {% endif %} - - {% if visitor.is_online %} -
- {% endif %} -
- -
-

{{visitor.ip_address}}

-

- {% if not visitor.visitorlog_set.all.last.title %} - {{ visitor.visitorlog_set.all.last.url|slice:":26" }}{% if visitor.visitorlog_set.all.last.url|length > 26 %}…{% endif %} - {% else %} - {{ visitor.visitorlog_set.all.last.title|slice:":26" }}{% if visitor.visitorlog_set.all.last.title|length > 26 %}…{% endif %} - {% endif %} -

-
- -
- -

{{visitor.total_duration}}

-
\ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/partials/rooms.html b/osinaweb/osinacore/templates/chat_templates/partials/rooms.html deleted file mode 100644 index 7a621c7c..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/rooms.html +++ /dev/null @@ -1,31 +0,0 @@ - -
- {% for chat_room in chat_rooms %} -
-
-
-
- -
-
-

{{chat_room.chatroomguest.visitor.ip_address}}

-

{{chat_room.chatmessage_set.all.last.content}}

- -

{{chat_room.last_updated}}

-
-
- - -
-
- {% endfor %} -
- - - - - \ No newline at end of file diff --git a/osinaweb/osinacore/templates/chat_templates/partials/typing.html b/osinaweb/osinacore/templates/chat_templates/partials/typing.html deleted file mode 100644 index 9c243255..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/typing.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
- -
-
-
-
-
-
-
-
diff --git a/osinaweb/osinacore/templates/chat_templates/partials/visitors.html b/osinaweb/osinacore/templates/chat_templates/partials/visitors.html deleted file mode 100644 index 4e82a7be..00000000 --- a/osinaweb/osinacore/templates/chat_templates/partials/visitors.html +++ /dev/null @@ -1,47 +0,0 @@ -{% load static %} - -
-
-
-
-
- -

Visitors today

-
- -
- {% for visitor in visitors %} -
-
-
- {% if not visitor.country == 'Unknown' %} - - {% else %} - - {% endif %} - - {% if visitor.is_online %} -
- {% endif %} -
- -
-

{{visitor.ip_address}}

-

- {% if not visitor.visitorlog_set.all.last.title %} - {{ visitor.visitorlog_set.all.last.url|slice:":26" }}{% if visitor.visitorlog_set.all.last.url|length > 26 %}…{% endif %} - {% else %} - {{ visitor.visitorlog_set.all.last.title|slice:":26" }}{% if visitor.visitorlog_set.all.last.title|length > 26 %}…{% endif %} - {% endif %} -

-
- -
- -

{{visitor.total_duration}}

-
- {% endfor %} -
-
- - \ No newline at end of file diff --git a/osinaweb/osinacore/templates/dashboard-main.html b/osinaweb/osinacore/templates/dashboard-main.html index a09fc998..abdcba88 100644 --- a/osinaweb/osinacore/templates/dashboard-main.html +++ b/osinaweb/osinacore/templates/dashboard-main.html @@ -21,9 +21,6 @@ -
- {% include 'chat_templates/chat-widget.html' %} -
@@ -1238,9 +1235,6 @@ - - - diff --git a/osinaweb/osinacore/templates/main.html b/osinaweb/osinacore/templates/main.html index 1a22f926..c9b0df9a 100644 --- a/osinaweb/osinacore/templates/main.html +++ b/osinaweb/osinacore/templates/main.html @@ -21,9 +21,6 @@ -
- {% include 'chat_templates/chat-widget.html' %} -
@@ -1265,8 +1262,6 @@ - - diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 0ba9c94d..e1dacf41 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -23,7 +23,7 @@ from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from support .models import * from django.db.models import Max from django.core.paginator import Paginator -from osichat.models import * + def update_task_statuses(request): diff --git a/osinaweb/osinaweb/__pycache__/__init__.cpython-313.pyc b/osinaweb/osinaweb/__pycache__/__init__.cpython-313.pyc index 75e7fbcad5e6ca664515576872235d93edddffca..1e60b9fc9e7a214e3583f813ee61aaae26f2e851 100644 GIT binary patch delta 19 ZcmdnWxRsInGcPX}0}$-skC@243IH*=1oQv^ delta 19 ZcmdnWxRsInGcPX}0}w3P9X64B6#z7q1&ROw diff --git a/osinaweb/osinaweb/__pycache__/asgi.cpython-313.pyc b/osinaweb/osinaweb/__pycache__/asgi.cpython-313.pyc index 37a5a8eb09e7ae965ab0e91e9f57ad8e8982ad90..3ab2c94d092a2396d15d694a1bb76cd77c3c90d0 100644 GIT binary patch delta 20 acmca1aYKUpGcPX}0}$-skJ!lV%L4#D?FBag delta 20 acmca1aYKUpGcPX}0}w3P9k!9%mj?hsUj@wo diff --git a/osinaweb/osinaweb/__pycache__/routing.cpython-313.pyc b/osinaweb/osinaweb/__pycache__/routing.cpython-313.pyc index 0d4c2376ab148e6f9125a7ac25722172c88c9afe..bfd4600706acf5286ded0861e93271138173556f 100644 GIT binary patch delta 85 zcmdna{Dz75GcPX}0}v=pjLu-1$ScXHHc?%cC59=6Wnz>TBkRQ0%*k?$>6+X?C5%8^ jEDj_-Ff%eT-em~7%MkWJ!t{bg_(h5EiwvSgoIp7MJem`+ delta 140 zcmaFEw4IsvGcPX}0}w3P9hOl#kynz@VxqdNSTI8{qc^J;V-cGILkv?4i!M+_4BJEx zEk^c<#hH?~`16Z1lQR-a^osIJOEUA)Z^=RgCQcNecqiS67pR;Oh>I0~#0O?ZM#j4g hL3bI#faC)S(+d{i7bU_kM3rBZD8I-cTEq=h1ORS1C;@I-<4GcPX}0}v!lh|XBPk@pk}qrm2eEZ3O?g@A&$I7?D<3vv=mQj3d(H=kr* r&d4Y=xscO^QF-$=&J`?-VUy$ede{Ypm>T##scrtmSI)>10@MZo^_3e7 delta 98 zcmaE&@K%BMGcPX}0}w3P9hR|eBkw5|F2P&u`Nf&Z8HpvEZ?Ifv5)=l?-r_7t%`M1D zEJ-ac64`u!eK{ke^yCaq7eIREwPe!eWnd`cN$1n#-yFdBmWiDwzc@2FBXP4CiwYy-{K?U*@sn4x%5m^> P@-sDXe-N8|kyQx*Hwqhu diff --git a/osinaweb/osinaweb/routing.py b/osinaweb/osinaweb/routing.py index 47735a58..98055dfd 100644 --- a/osinaweb/osinaweb/routing.py +++ b/osinaweb/osinaweb/routing.py @@ -1,5 +1,4 @@ from support.routing import websocket_urlpatterns as support_websocket_urlpatterns from osinacore.routing import websocket_urlpatterns as osinacore_websocket_urlpatterns -from osichat.routing import websocket_urlpatterns as osichat_websocket_urlpatterns -websocket_urlpatterns = support_websocket_urlpatterns + osinacore_websocket_urlpatterns + osichat_websocket_urlpatterns \ No newline at end of file +websocket_urlpatterns = support_websocket_urlpatterns + osinacore_websocket_urlpatterns \ No newline at end of file diff --git a/osinaweb/osinaweb/settings.py b/osinaweb/osinaweb/settings.py index be45d255..b77d150e 100644 --- a/osinaweb/osinaweb/settings.py +++ b/osinaweb/osinaweb/settings.py @@ -52,7 +52,6 @@ LOGIN_URL = 'signin' # Application definition INSTALLED_APPS = [ - 'osichat', 'daphne', 'support', 'rest_framework', diff --git a/osinaweb/osinaweb/urls.py b/osinaweb/osinaweb/urls.py index 2d3d9f72..7c7019df 100644 --- a/osinaweb/osinaweb/urls.py +++ b/osinaweb/osinaweb/urls.py @@ -24,7 +24,6 @@ urlpatterns = [ path('', include('customercore.urls')), path('', include('billing.urls')), path('', include('support.urls')), - path('', include('osichat.urls')), path('admin/', admin.site.urls), ] diff --git a/osinaweb/static/js/.DS_Store b/osinaweb/static/js/.DS_Store index 148c37fd7410358be1a5407d03f7ff31d59a7e6e..d7ee40fe985fbd6a13525ce1025f8cd81d1e983f 100644 GIT binary patch delta 38 rcmZn(XbG6$&nUYwU^hRb>}DQ;de+U)#S}O;td@hX`B{N@bT delta 340 zcmZn(XbG6$UDU^hRb;$|L!dRAL@hJ1!%hD?TJh75*8h7!-5{N$vZ{3Hej1_1^J zMp+=P`ws>{5e5b{)ssI6H*gqR80jb&8=6eE5w`b4Q&1LMl$VpAmk!j*2*kXomNDo8 dtxRFa1zMknW^woC8c}`D&Fl&-gW8EYi~!rfQlJ0; diff --git a/osinaweb/static/js/osichat-admin/chat-toggle.js b/osinaweb/static/js/osichat-admin/chat-toggle.js deleted file mode 100644 index ce07f46c..00000000 --- a/osinaweb/static/js/osichat-admin/chat-toggle.js +++ /dev/null @@ -1,27 +0,0 @@ -const openChatButton = document.getElementById('openChatContainer'); -const osichatWidget = document.getElementById('osichatWidget'); -const closeChatButton = document.getElementById('closeChatContainer'); -const conversation = document.getElementById('conversation'); - -function scrollToBottom() { - conversation.scrollTop = conversation.scrollHeight; -} - -openChatButton.addEventListener('click', function () { - osichatWidget.classList.remove('hidden'); - openChatButton.classList.add('hidden'); - closeChatButton.classList.remove('hidden'); - scrollToBottom(); -}); - -function closeChat() { - osichatWidget.classList.add('hidden'); - openChatButton.classList.remove('hidden'); - closeChatButton.classList.add('hidden'); -} - - -closeChatButton.addEventListener('click', closeChat); - - - diff --git a/osinaweb/static/js/osichat-admin/inner-conversation.js b/osinaweb/static/js/osichat-admin/inner-conversation.js deleted file mode 100644 index ce914e00..00000000 --- a/osinaweb/static/js/osichat-admin/inner-conversation.js +++ /dev/null @@ -1,163 +0,0 @@ -(function() { - function handleChatRoomClick(event) { - const chatId = event.currentTarget.getAttribute('data-roomid'); - if (chatId && chatId !== currentChatId) { - showLoader(); - openConversation(chatId); - currentChatId = chatId; - } - } - - document.querySelectorAll('.chat-room').forEach(div => { - div.addEventListener('click', handleChatRoomClick); - }); - - - function markCurrentChatRead(chatid) { - const unreadElement = document.querySelector(`.unread[data-roomid='${chatid}']`); - if (unreadElement) { - unreadElement.classList.add('hidden'); - } - } - - // FUNCTIONS TO SHOW & HIDE THE LOADER - function showLoader() { - const roomLoader = document.getElementById('roomLoader'); - if (roomLoader) { - roomLoader.classList.remove('hidden'); - } - - const widgetLeftSide = document.getElementById('widgetLeftSide'); - widgetLeftSide.classList.remove('overflow-y-auto'); - widgetLeftSide.classList.add('overflow-hidden'); - } - - function hideLoader() { - const roomLoader = document.getElementById('roomLoader'); - if (roomLoader) { - roomLoader.classList.add('hidden'); - } - - const widgetLeftSide = document.getElementById('widgetLeftSide'); - widgetLeftSide.classList.remove('overflow-hidden'); - widgetLeftSide.classList.add('overflow-y-auto'); - } - - function appendTextAreaScript(conversationContainer) { - const textareaScript = document.createElement('script'); - textareaScript.type = 'text/javascript'; - textareaScript.src = `${protocol}://${admin_chat_domain}/static/js/osichat-admin/textarea.js`; - conversationContainer.appendChild(textareaScript); - } - - // function scrollBottom() { - // const conversationContainer = document.getElementById('messages_container'); - // if (conversationContainer) { - // conversationContainer.scrollTo({ - // top: conversationContainer.scrollHeight, - // behavior: 'smooth' - // }); - // } - // } - - function scrollBottom() { - const conversationContainer = document.getElementById('messages_container'); - if (conversationContainer) { - conversationContainer.scrollTop = conversationContainer.scrollHeight; // Instantly scroll to the bottom - } - } - - - function openConversation(chatId) { - if (osichatadminroomSocket) { - osichatadminroomSocket.close(); - } - - osichatadminroomSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat-admin/${chatId}/`); - - osichatadminroomSocket.onopen = function () { - hideLoader(); - markCurrentChatRead(chatId) - console.log('WebSocket connection to osichat established'); - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'load_chat', 'client_type': 'website_admin' })); - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); - }; - - function handleLoadChatEvent(data) { - let chatDiv = document.getElementById('widgetRightSide'); - chatDiv.innerHTML = data.html; - appendTextAreaScript(chatDiv); - - const sendMessageForm = document.querySelector('#sendMessage'); - sendMessageForm.addEventListener('submit', function (event) { - event.preventDefault(); - const message = event.target.elements.message.value; - const eventMessage = { - 'event_type': 'send_message', - 'message': message, - 'user_id': userId - }; - - osichatadminroomSocket.send(JSON.stringify(eventMessage)); - event.target.reset(); - }); - - scrollBottom(); - } - - osichatadminroomSocket.onmessage = function (e) { - const data = JSON.parse(e.data); - const typingDiv = document.getElementById('typing'); - const messagesDiv = document.getElementById('messages_container'); - switch (data.event_type) { - case 'load_chat': - handleLoadChatEvent(data); - break; - case 'typing': - if (!typingDiv && data.user != userId) { - messagesDiv.insertAdjacentHTML('beforeend', data.html); - } - break; - case 'stopped_typing': - if (typingDiv) { - typingDiv.remove(); - } - break; - case 'send_message': - osichatadminroomSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'user_id': userId, 'chat_state': 'open' })); - messagesDiv.insertAdjacentHTML('beforeend', data.html); - if (!data.user){ - if (typingDiv) { - typingDiv.remove(); - } - } - break; - default: - console.log('Unknown event type:', data.event_type); - } - }; - - osichatadminroomSocket.onclose = function () { - console.log('WebSocket connection closed'); - if (currentChatId === chatId) { //Attempt to reconnect only if same chat - setTimeout(() => { - console.log('Attempting to reconnect to WebSocket...'); - openConversation(chatId); - }, 2000); - } - }; - - osichatadminroomSocket.onerror = function (error) { - console.error('WebSocket error:', error); - showLoader(); - }; - } - - window.addEventListener('offline', () => { - showLoader(); - if (osichatadminroomSocket) { - osichatadminroomSocket.close(); - } - }); - -})(); diff --git a/osinaweb/static/js/osichat-admin/osichat.js b/osinaweb/static/js/osichat-admin/osichat.js deleted file mode 100644 index bd31082e..00000000 --- a/osinaweb/static/js/osichat-admin/osichat.js +++ /dev/null @@ -1,224 +0,0 @@ -let admin_chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws"; -let protocol = window.location.protocol === "https:" ? "https" : "http"; -let admin_chat_domain = "osina.ositcom.com"; -let osichatadminroomSocket = null; -let currentChatId = null; -let whereAmI = null; - -// FUNCTIONS TO SHOW & HIDE THE LOADER -function showLoader() { - const roomsLoader = document.getElementById('roomsLoader'); - if (roomsLoader) { - roomsLoader.classList.remove('hidden'); - } -} - -function hideLoader() { - const roomsLoader = document.getElementById('roomsLoader'); - if (roomsLoader) { - roomsLoader.classList.add('hidden'); - } -} - - -function appendInnerConversationScript(div) { - const innerConversationScript = document.createElement('script'); - innerConversationScript.type = 'text/javascript'; - innerConversationScript.src = `${protocol}://${admin_chat_domain}/static/js/osichat-admin/inner-conversation.js`; - div.appendChild(innerConversationScript); -} - - - -function initializeOsichat(){ - osichatroomsSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat/`); - - osichatroomsSocket.onopen = function () { - console.log('WebSocket connection to rooms established'); - osichatroomsSocket.send(JSON.stringify({ - 'event_type': 'set_client_type', - 'client_type': 'website_admin', - 'whereAmI': whereAmI === 'Visitors' ? 'Visitors' : 'Chats' // Default to 'Chats' if not 'Visitors' - })); - }; - - osichatroomsSocket.onmessage = function (e) { - const data = JSON.parse(e.data); - const leftDiv = document.getElementById('widgetLeftSide'); - const leftDynamicDiv = document.getElementById('leftDynamic'); - switch (data.event_type) { - case 'get_chats': - hideLoader(); - leftDynamicDiv.innerHTML = data.html; - appendInnerConversationScript(leftDiv); - break; - - case 'get_visitors': - hideLoader(); - leftDynamicDiv.innerHTML = data.html; - setupDurationUpdater(); - break; - - case 'new_chat_update': - const roomsContainer = document.getElementById('chatrooms'); - const chatRoomDiv = roomsContainer.querySelector(`.chat-room[data-roomid='${data.chatroom_id}']`); - - if (chatRoomDiv) { - chatRoomDiv.remove(); // Remove the existing chat room div - } - // Insert the new chat room HTML at the top of the container - const newChatRoomDiv = document.createElement('div'); - newChatRoomDiv.innerHTML = data.html; - roomsContainer.insertAdjacentElement('afterbegin', newChatRoomDiv.firstElementChild); - - if (parseInt(currentChatId) === parseInt(data.chatroom_id)) { - const unreadIndicator = roomsContainer.querySelector(`.unread[data-roomid='${data.chatroom_id}']`); - if (unreadIndicator) { - unreadIndicator.classList.add('hidden'); - } - if (!data.user) { // If it is sent by a guest play a notification sound for the guest - const notificationSound = document.getElementById('notification-sound'); - notificationSound.play(); - - } - } else { - const unreadIndicator = roomsContainer.querySelector(`.unread[data-roomid='${data.chatroom_id}']`); - if (unreadIndicator) { - unreadIndicator.classList.remove('hidden'); - } - if (!data.user) { // If it is sent by a guest play a notification sound for the guest - const notificationSound = document.getElementById('out-notification-sound'); - notificationSound.play(); - } - } - - setInterval(updateOnlineDurations, 1000); - appendInnerConversationScript(leftDiv); - break; - - case 'new_visitor_update': - const visitorsContainer = document.getElementById('visitors'); - const visitorDiv = visitorsContainer.querySelector(`.visitor[data-visitorid='${data.visitor_id}']`); - if (data.action === 'new_log') { - if (visitorDiv){ - visitorDiv.remove(); - } - const newVisitorDiv = document.createElement('div'); - newVisitorDiv.innerHTML = data.html; - visitorsContainer.insertAdjacentElement('afterbegin', newVisitorDiv.firstElementChild); - const visitorNotificationSound = document.getElementById('visitor-notification-sound'); - visitorNotificationSound.play(); - } else if (data.action === 'end_log') { - const newVisitorDiv = document.createElement('div'); - newVisitorDiv.innerHTML = data.html; - visitorDiv.replaceWith(newVisitorDiv.firstElementChild); - } - - - setupDurationUpdater(); - break; - - default: - console.log('Unknown event type:', data.event_type); - } - }; - - osichatroomsSocket.onclose = function () { - showLoader(); - setTimeout(() => { - console.log('Attempting to reconnect to WebSocket...'); - initializeOsichat(); - }, 2000); - }; - - osichatroomsSocket.onerror = function (error) { - showLoader(); - console.error('WebSocket error:', error); - }; - - window.addEventListener('offline', () => { - showLoader(); - if (osichatroomsSocket) { - osichatroomsSocket.close(); - } - }); - -} - -const chatsTab = document.getElementById('chatsTab'); -const visitorsTab = document.getElementById('visitorsTab'); - -function switchToChats() { - showLoader(); - whereAmI = 'Chats'; - chatsTab.classList.add('bg-white', 'text-secondosiblue', 'shadow-md'); - chatsTab.classList.remove('bg-gray-100', 'text-gray-400'); - visitorsTab.classList.add('bg-gray-100', 'text-gray-400'); - visitorsTab.classList.remove('bg-white', 'text-secondosiblue', 'shadow-md'); - - osichatroomsSocket.send(JSON.stringify({ - event_type: 'get_chats' - })); -} - -function switchToVisitors() { - showLoader(); - whereAmI = 'Visitors'; - visitorsTab.classList.add('bg-white', 'text-secondosiblue', 'shadow-md'); - visitorsTab.classList.remove('bg-gray-100', 'text-gray-400'); - chatsTab.classList.add('bg-gray-100', 'text-gray-400'); - chatsTab.classList.remove('bg-white', 'text-secondosiblue', 'shadow-md'); - - osichatroomsSocket.send(JSON.stringify({ - event_type: 'get_visitors' - })); -} - -chatsTab.addEventListener('click', switchToChats); -visitorsTab.addEventListener('click', switchToVisitors); - - - -let updateInterval; -function updateOnlineDurations() { - document.querySelectorAll('.visitor').forEach(visitorDiv => { - const onlineIndicator = visitorDiv.querySelector('.online'); - if (onlineIndicator) { - const durationElem = visitorDiv.querySelector('.duration'); - const currentText = durationElem.textContent; - const parts = currentText.split(':').map(Number); - - let hours = 0, minutes = 0, seconds = 0; - - if (parts.length === 3) { - [hours, minutes, seconds] = parts; - } else if (parts.length === 2) { - [minutes, seconds] = parts; - } - - const totalSeconds = hours * 3600 + minutes * 60 + seconds; - const updatedTotalSeconds = totalSeconds + 1; - const updatedHours = Math.floor(updatedTotalSeconds / 3600); - const updatedMinutes = Math.floor((updatedTotalSeconds % 3600) / 60); - const updatedSeconds = updatedTotalSeconds % 60; - - const formattedDuration = - (updatedHours > 0 ? `${String(updatedHours).padStart(2, '0')}:` : '') + - `${String(updatedMinutes).padStart(2, '0')}:${String(updatedSeconds).padStart(2, '0')}`; - - durationElem.textContent = formattedDuration; - } - }); -} - -function setupDurationUpdater() { - // Clear any existing interval to avoid multiple intervals - if (updateInterval) { - clearInterval(updateInterval); - } - // Set up a new interval - updateInterval = setInterval(updateOnlineDurations, 1000); -} - - -initializeOsichat(); \ No newline at end of file diff --git a/osinaweb/static/js/osichat-admin/textarea.js b/osinaweb/static/js/osichat-admin/textarea.js deleted file mode 100644 index c8840d12..00000000 --- a/osinaweb/static/js/osichat-admin/textarea.js +++ /dev/null @@ -1,84 +0,0 @@ -(function() { - // FUNCTION TO ADJUST TEXTAREA HEIGHT AND SUBMIT BUTTON VISIBILITY - function adjustTextAreaAndButton(textarea, submitButton) { - // Adjust the height of the textarea - if (textarea.value.trim() === '') { - textarea.style.height = '50px'; - } else { - textarea.style.height = textarea.scrollHeight + 'px'; - } - - // Display and hide the submit button - if (textarea.value.trim() === '') { - submitButton.classList.add('hidden'); - } else { - submitButton.classList.remove('hidden'); - } - } - - function scrollBottom() { - const conversationContainer = document.getElementById('messages_container'); - - if (conversationContainer) { - conversationContainer.scrollTo({ - top: conversationContainer.scrollHeight, - behavior: 'smooth' - }); - } - } - - - // INITIALIZE ELEMENTS - const form = document.querySelector('#sendMessage'); - const textarea = document.querySelector('#dynamicTextarea'); - const submitButton = document.getElementById('submitMessageButton'); - const typingUserId = document.getElementById('userId').textContent.trim(); - let typingTimeout; - let isTyping = false; - - // EVENT LISTENERS - textarea.addEventListener('input', function () { - // Adjust textarea and button - adjustTextAreaAndButton(textarea, submitButton); - if (!isTyping){ - osichatadminroomSocket.send(JSON.stringify({ - 'event_type': 'typing', - 'user_id': typingUserId, - 'typing_status': 'typing' - })); - isTyping = true; - } - - clearTimeout(typingTimeout); - typingTimeout = setTimeout(function() { - osichatadminroomSocket.send(JSON.stringify({ - 'event_type': 'typing', - 'user_id': typingUserId, - 'typing_status': 'stopped_typing' - })); - isTyping = false; - }, 3000); - }); - - - - form.addEventListener('submit', (event) => { - textarea.style.height = '50px'; - submitButton.classList.add('hidden'); - - setTimeout(() => { - scrollBottom(); - }, 100); - }); - - textarea.addEventListener('keydown', (event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - if (!submitButton.classList.contains('hidden')) { - submitButton.click(); - } - scrollBottom(); - } - }); - -})(); diff --git a/osinaweb/static/js/osichat-admin/update-visitors-duration.js b/osinaweb/static/js/osichat-admin/update-visitors-duration.js deleted file mode 100644 index d12c18ef..00000000 --- a/osinaweb/static/js/osichat-admin/update-visitors-duration.js +++ /dev/null @@ -1,27 +0,0 @@ -function updateOnlineDurations() { - document.querySelectorAll('.visitor').forEach(visitorDiv => { - if (visitorDiv.querySelector('.online')) { - const durationElem = visitorDiv.querySelector('.duration'); - const currentText = durationElem.textContent; - const [hours, minutes, seconds] = currentText.split(':').map(Number); - const totalSeconds = hours * 3600 + minutes * 60 + seconds; - - // Increment the duration by 1 second - const updatedTotalSeconds = totalSeconds + 1; - const updatedHours = Math.floor(updatedTotalSeconds / 3600); - const updatedMinutes = Math.floor((updatedTotalSeconds % 3600) / 60); - const updatedSeconds = updatedTotalSeconds % 60; - - // Format the updated duration - const formattedDuration = - (updatedHours > 0 ? `${String(updatedHours).padStart(2, '0') + ':' : ''}` + - `${String(updatedMinutes).padStart(2, '0')}:${String(updatedSeconds).padStart(2, '0')}`); - - // Update the duration element - durationElem.textContent = formattedDuration; - } - }); -} - -// Call this function at intervals to update durations -setInterval(updateOnlineDurations, 1000); // Update every second diff --git a/osinaweb/static/js/osichat/chat-toggle.js b/osinaweb/static/js/osichat/chat-toggle.js deleted file mode 100644 index 6573386b..00000000 --- a/osinaweb/static/js/osichat/chat-toggle.js +++ /dev/null @@ -1,87 +0,0 @@ - -(function() { - const openChatButton = document.getElementById('openChatContainer'); - const openChatButton2 = document.getElementById('openChatContainer2'); - const chatWidget = document.getElementById('chatWidget'); - const closeChatButton = document.getElementById('closeChatContainer'); - const closeMobileChatButton = document.getElementById('closeMobileChatContainer'); - const conversation = document.getElementById('conversation'); - - const unreadMessages = document.getElementById('unreadMessages'); - const closeNewMesagePopup = document.getElementById('closeNewMesagePopup'); - - function scrollToBottom() { - conversation.scrollTop = conversation.scrollHeight; - } - - function toggleBodyScroll(preventScroll) { - if (preventScroll) { - document.body.classList.add('no-scroll'); - } else { - document.body.classList.remove('no-scroll'); - } - } - - function checkScreenSize() { - if (chatWidget.classList.contains('hidden')) { - return; - } - if (window.innerWidth < 798) { - toggleBodyScroll(true); - } else { - toggleBodyScroll(false); - } - } - - function openChat() { - isOpen = true; - chatWidget.classList.remove('hidden'); - openChatButton.classList.add('hidden'); - closeChatButton.classList.remove('hidden'); - if (unreadMessages) { - unreadMessages.classList.add('hidden'); - } - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'open' })); - scrollToBottom(); - checkScreenSize(); - } - - function closeChat() { - isOpen = false; - chatWidget.classList.add('hidden'); - openChatButton.classList.remove('hidden'); - if (closeChatButton) { - closeChatButton.classList.add('hidden'); - } else if (closeMobileChatButton) { - closeMobileChatButton.classList.add('hidden'); - } - toggleBodyScroll(false); - } - - // Attach event listeners - openChatButton.addEventListener('click', openChat); - if (openChatButton2) { - openChatButton2.addEventListener('click', openChat); - } - closeChatButton.addEventListener('click', closeChat); - closeMobileChatButton.addEventListener('click', closeChat); - window.addEventListener('resize', checkScreenSize); - - // CSS class to prevent scrolling - const style = document.createElement('style'); - style.innerHTML = ` - .no-scroll { - overflow: hidden; - } - `; - document.head.appendChild(style); - - // To close the unread messages popup - if (closeNewMesagePopup) { - closeNewMesagePopup.addEventListener('click', function() { - if (unreadMessages) { - unreadMessages.classList.add('hidden') - } - }); - } -})(); diff --git a/osinaweb/static/js/osichat/conversation.js b/osinaweb/static/js/osichat/conversation.js deleted file mode 100644 index 3bd9ee4b..00000000 --- a/osinaweb/static/js/osichat/conversation.js +++ /dev/null @@ -1,345 +0,0 @@ - -let osichatSocket; -let isOpen = false; -let chatLoaded = false; -let newMessageCount = 0; -let atBottom = true; - - -function scrollBottom() { - const conversationContainer = document.getElementById('conversation'); - - if (conversationContainer) { - conversationContainer.scrollTo({ - top: conversationContainer.scrollHeight, - behavior: 'smooth' - }); - } -} - - -function isScrolledToBottom(element) { - return element && (element.scrollHeight - element.scrollTop <= element.clientHeight + 200); -} - - - -function setupScrollEventListener() { - const conversationContainer = document.getElementById('conversation'); - - if (conversationContainer) { - conversationContainer.addEventListener('scroll', () => { - if (isScrolledToBottom(conversationContainer)) { - if (!atBottom) { - hideNewMessageNotification(); - atBottom = true; // Update flag when user scrolls to the bottom - } - } else { - atBottom = false; // Update flag if user is not at the bottom - } - }); - } -} - -function showNewMessageNotification(count) { - const newMessagesPopMessage = document.getElementById('newMessagesPopMessage'); - const newMessagesCounter = document.getElementById('newMessagesCounter'); - if (newMessagesPopMessage && newMessagesCounter) { - newMessagesCounter.textContent = count; - newMessagesPopMessage.classList.remove('hidden'); - } -} - -function hideNewMessageNotification() { - const newMessagesPopMessage = document.getElementById('newMessagesPopMessage'); - if (newMessagesPopMessage) { - newMessagesPopMessage.classList.add('hidden'); - newMessageCount = 0; - const newMessagesCounter = document.getElementById('newMessagesCounter'); - if (newMessagesCounter) { - newMessagesCounter.textContent = newMessageCount; - } - scrollBottom() - } -} - - -function newMessageNotification() { - const notificationSound = document.getElementById('notification-sound'); - notificationSound.play(); - - const conversationContainer = document.getElementById('conversation'); - - if (!isScrolledToBottom(conversationContainer)) { - let count = newMessageCount + 1; - newMessageCount = count; - showNewMessageNotification(count); - } else { - scrollBottom(); - } - -} - - -// FUNCTION TO FETCH THE SESSION ID -async function fetchSessionID() { - let session_id = 'Unknown'; - while (session_id === 'Unknown') { - try { - const response = await fetch(`${protocol}://${ositcomDomain}/get-client-session/`); - const data = await response.json(); - if (data.session_id) { - session_id = data.session_id; - } - } catch (error) { - console.error('Error fetching session ID:', error); - } - } - return session_id; -} - -// FUNCTIONS TO SHOW & HIDE THE LOADER -function showLoader() { - const osichatLoader = document.getElementById('osichatLoader'); - if (osichatLoader) { - osichatLoader.classList.remove('hidden'); - } -} - -function hideLoader() { - const osichatLoader = document.getElementById('osichatLoader'); - if (osichatLoader) { - osichatLoader.classList.add('hidden'); - } -} - - - -// FUNCTION TO APPEND THE TEXTAREA SCRIPT -function appendTextAreaScript(domain, chatDiv) { - const textareaScript = document.createElement('script'); - textareaScript.type = 'text/javascript'; - textareaScript.src = `${protocol}://${domain}/static/js/osichat/textarea.js`; - chatDiv.appendChild(textareaScript); -} - -// FUNCTION TO HANDLE FORM SUBMISSION -function handleFormSubmission(form, eventType, osichatSocket) { - form.addEventListener('submit', function (event) { - event.preventDefault(); - - const formData = new FormData(form); - const eventMessage = { 'event_type': 'start_conversation' }; - - formData.forEach((value, key) => { - eventMessage[key] = value; - }); - - osichatSocket.send(JSON.stringify(eventMessage)); - form.reset(); - }); -} - -// FUNCTION TO HANDLE LOAD CHAT EVENT -function handleLoadChatEvent(data, osichatSocket) { - chatLoaded = true; - hideLoader(); - let chatDiv = document.getElementById('roomContainer'); // CASE WHERE WIDGET IS ALREADY LOADED, DISPLAY THE CHAT PAGES(START/CONVERSATION) IN ROOM CONTAINER - if (!chatDiv) { - chatDiv = document.getElementById('osichat'); // CASE WHERE WIDGET IS NOT LOADED, DISPLAY THE WHOLE CHATWIDGET IN OSICHAT - } - - chatDiv.innerHTML = data.html; - scrollBottom(); - - - if (isOpen) { // If chat widget isOpen mark all messages as read by guest else just return number of unread messages - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'open' })); - } else { - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'closed' })); - } - - - if (!document.querySelector(`script[src="${protocol}://${osinaDomain}/static/js/osichat/chat-toggle.js"]`)) { - const script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = `${protocol}://${osinaDomain}/static/js/osichat/chat-toggle.js`; - chatDiv.appendChild(script); - } - - const startChatContainer = document.getElementById('startChat'); //Case where returned is start-conversation.html - if (startChatContainer) { - handleFormSubmission(startChatContainer, 'start_conversation', osichatSocket); - } - - const sendMessageContainer = document.getElementById('sendMessage'); //Case where returned is chat-room.html - if (sendMessageContainer) { - appendTextAreaScript(osinaDomain, chatDiv); - handleFormSubmission(sendMessageContainer, 'send_message', osichatSocket); - - const uploadScript = document.createElement('script'); - uploadScript.type = 'text/javascript'; - uploadScript.src = `${protocol}://${osinaDomain}/static/js/osichat/upload-file.js`; - chatDiv.appendChild(uploadScript); - - const endChatScript = document.createElement('script'); - endChatScript.type = 'text/javascript'; - endChatScript.src = `${protocol}://${osinaDomain}/static/js/osichat/end-chat.js`; - chatDiv.appendChild(endChatScript); - - const endChatButton = document.getElementById('endChat'); - endChatButton.classList.remove('hidden') - } - - const sendReviewContainer = document.getElementById('reviewContainer'); //Case where returned is ended-chat.html - if (sendReviewContainer) { - const sendReviewScript = document.createElement('script'); - sendReviewScript.type = 'text/javascript'; - sendReviewScript.src = `${protocol}://${osinaDomain}/static/js/osichat/send-review.js`; - chatDiv.appendChild(sendReviewScript); - } -} - - -// FUNCTION TO INITIALIZE WEB SOCKET CONNECTION -async function initializeChatWebSocket() { - const session_id = await fetchSessionID(); - let osichatSocketUrl = `${wsScheme}://${osinaDomain}/ws/osichat/${session_id}/`; - osichatSocket = new WebSocket(osichatSocketUrl); - - osichatSocket.onopen = () => { - if(!chatLoaded){ - osichatSocket.send(JSON.stringify({ 'event_type': 'load_chat', 'client_type': 'website_guest', 'reconnecting': 'False'})); - }else{ - osichatSocket.send(JSON.stringify({ 'event_type': 'load_chat', 'client_type': 'website_guest', 'reconnecting': 'True'})); - } - }; - - osichatSocket.onmessage = function (e) { - const data = JSON.parse(e.data); - const typingDiv = document.getElementById('typing'); - const messagesDiv = document.getElementById('messages'); - switch (data.event_type) { - case 'load_chat': - handleLoadChatEvent(data, osichatSocket); - break; - case 'start_conversation': - handleLoadChatEvent(data, osichatSocket); - break; - case 'typing': - if(!typingDiv && data.user){ - messagesDiv.insertAdjacentHTML('beforeend', data.html); - } - break; - case 'stopped_typing': - if (typingDiv) { - typingDiv.remove(); - } - break; - case 'send_message': - if (isOpen) { // If chat widget isOpen (declared in chat-toggle.js) mark all messages as read by guest else just return number of unread messages - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'open' })); - } else { - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'closed' })); - } - messagesDiv.insertAdjacentHTML('beforeend', data.html); - - const newMessagesPopMessage = document.getElementById('newMessagesPopMessage'); - newMessagesPopMessage.addEventListener('click', hideNewMessageNotification); - - if (data.user) { // If it is sent by an Osina user play a notification sound for the guest - if (typingDiv) { - typingDiv.remove(); - } - newMessageNotification(); - setupScrollEventListener(); - } - break; - case 'uploaded_file': - if (isOpen) { - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'open' })); - } else { - osichatSocket.send(JSON.stringify({ 'event_type': 'update_read_messages', 'chat_state': 'closed' })); - } - const uploadingDiv = document.getElementById(`uploading-${data.file_name}`); - if (uploadingDiv) { - uploadingDiv.outerHTML = data.html; - if (!data.user) { - scrollBottom(); - } else { - newMessageNotification(); - } - } - else{ - document.getElementById('messages').insertAdjacentHTML('beforeend', data.html); - if (!data.user) { - scrollBottom(); - } else { - newMessageNotification(); - } - } - break; - case 'update_read_messages': - const unreadMessages = document.getElementById(`unreadMessages`); - if (!isOpen) { - unreadMessages.classList.remove('hidden'); - unreadMessages.innerHTML = data.html; - const script = document.createElement('script'); - script.src = `${protocol}://${osinaDomain}/static/js/osichat/chat-toggle.js`; - document.body.appendChild(script); - } else { - unreadMessages.classList.add('hidden'); - } - break; - case 'ended_chat': - const currentChat = document.getElementById(`roomContainer`); - if (currentChat) { - currentChat.innerHTML = data.html; - scrollBottom(); - } - document.getElementById(`endChatConfirmationContainer`).classList.add('hidden'); - document.getElementById(`endChat`).classList.add('hidden'); - const sendReviewScript = document.createElement('script'); - sendReviewScript.type = 'text/javascript'; - sendReviewScript.src = `${protocol}://${osinaDomain}/static/js/osichat/send-review.js`; - currentChat.appendChild(sendReviewScript); - break; - case 'submit_review': - const submitReview = document.getElementById(`reviewContainer`); - if (submitReview) { - submitReview.innerHTML = data.html; - } - const reviewScript = document.createElement('script'); - reviewScript.type = 'text/javascript'; - reviewScript.src = `${protocol}://${osinaDomain}/static/js/osichat/send-review.js`; - submitReview.appendChild(reviewScript); - break; - default: - console.log('Unknown event type:', data.event_type); - } - }; - - osichatSocket.onclose = () => { - showLoader(); - setTimeout(() => { - console.log('Attempting to reconnect to WebSocket...'); - initializeChatWebSocket(); - }, 2000); - }; - - osichatSocket.onerror = (error) => { - console.log('WebSocket error:', error); - showLoader(); - }; -} - - -window.addEventListener('offline', () => { - showLoader(); - if (osichatSocket) { - osichatSocket.close(); - } -}); - -// INITIALIZE CHAT WEB SOCKET -initializeChatWebSocket(); diff --git a/osinaweb/static/js/osichat/end-chat.js b/osinaweb/static/js/osichat/end-chat.js deleted file mode 100644 index f27e0367..00000000 --- a/osinaweb/static/js/osichat/end-chat.js +++ /dev/null @@ -1,28 +0,0 @@ -(function() { - const endChat = document.getElementById('endChat'); - const endChatConfirmationContainer = document.getElementById("endChatConfirmationContainer"); - const closeConfirmationMessage = document.getElementById('closeConfirmationMessage'); - const endChatConfirmed = document.getElementById('endChatComfirmed'); - - - endChat.addEventListener("click", function() { - if (endChatConfirmationContainer) { - endChatConfirmationContainer.classList.remove("hidden"); - } - }); - - closeConfirmationMessage.addEventListener("click", function() { - if (closeConfirmationMessage) { - endChatConfirmationContainer.classList.add("hidden"); - } - }); - - endChatConfirmed.addEventListener("click", function() { - const eventMessage = { - event_type: 'end_chat', - }; - osichatSocket.send(JSON.stringify(eventMessage)); - - }); - -})(); diff --git a/osinaweb/static/js/osichat/send-review.js b/osinaweb/static/js/osichat/send-review.js deleted file mode 100644 index c88f776a..00000000 --- a/osinaweb/static/js/osichat/send-review.js +++ /dev/null @@ -1,57 +0,0 @@ -(function () { - const messageInput = document.getElementById('messageInputTag'); - const submitButton = document.getElementById('submitButton'); - if (messageInput){ - messageInput.addEventListener('input', function () { - if (messageInput.value.trim() !== "") { - submitButton.classList.remove('hidden'); - } else { - submitButton.classList.add('hidden'); - } - }); - } - - - document.querySelectorAll('.reaction-button').forEach(button => { - button.addEventListener('click', function() { - const reaction = this.getAttribute('data-reaction'); - const eventMessage = { - event_type: 'submit_review', - reaction: reaction - }; - osichatSocket.send(JSON.stringify(eventMessage)); - }); - }); - - - - if (document.getElementById('sendReview')){ - document.getElementById('sendReview').addEventListener('submit', function(event) { - event.preventDefault(); - - const details = document.getElementById('messageInputTag').value.trim(); - if (details) { - const eventMessage = { - event_type: 'submit_review', - details: details - }; - - osichatSocket.send(JSON.stringify(eventMessage)); - } else { - console.error('Details cannot be empty'); - } - }); - } - - - - document.getElementById("startNewConversation").addEventListener("click", function() { - const eventMessage = { - event_type: "start_conversation" - }; - osichatSocket.send(JSON.stringify(eventMessage)); - }); - - - -})(); \ No newline at end of file diff --git a/osinaweb/static/js/osichat/textarea.js b/osinaweb/static/js/osichat/textarea.js deleted file mode 100644 index b177b473..00000000 --- a/osinaweb/static/js/osichat/textarea.js +++ /dev/null @@ -1,82 +0,0 @@ -(function () { - // FUNCTION TO ADJUST TEXTAREA HEIGHT AND SUBMIT BUTTON VISIBILITY - function adjustTextAreaAndButton(textarea, submitButton) { - // Adjust the height of the textarea - if (textarea.value.trim() === '') { - textarea.style.height = '50px'; - } else { - textarea.style.height = textarea.scrollHeight + 'px'; - } - - // Display and hide the submit button - if (textarea.value.trim() === '') { - submitButton.classList.add('hidden'); - } else { - submitButton.classList.remove('hidden'); - } - } - - function scrollBottom() { - const conversationContainer = document.getElementById('conversation'); - - if (conversationContainer) { - conversationContainer.scrollTo({ - top: conversationContainer.scrollHeight, - behavior: 'smooth' - }); - } - } - - - // INITIALIZE ELEMENTS - const form = document.querySelector('#sendMessage'); - const textarea = document.querySelector('#dynamicTextarea'); - const submitButton = document.getElementById('submitMessageButton'); - let typingTimeout; - let isTyping = false; - - - // EVENT LISTENERS - textarea.addEventListener('input', function () { - // Adjust textarea and button - adjustTextAreaAndButton(dynamicTextarea, submitButton); - - if (!isTyping) { - osichatSocket.send(JSON.stringify({ - 'event_type': 'typing', - 'typing_status': 'typing' - })); - isTyping = true; - } - - clearTimeout(typingTimeout); - typingTimeout = setTimeout(function() { - osichatSocket.send(JSON.stringify({ - 'event_type': 'typing', - 'typing_status': 'stopped_typing' - })); - isTyping = false; - }, 3000); - }); - - - form.addEventListener('submit', (event) => { - textarea.style.height = '50px'; - submitButton.classList.add('hidden'); - - setTimeout(() => { - scrollBottom(); - }, 100); - }); - - textarea.addEventListener('keydown', (event) => { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - if (!submitButton.classList.contains('hidden')) { - submitButton.click(); - } - scrollBottom(); - } - }); - -})(); diff --git a/osinaweb/static/js/osichat/upload-file.js b/osinaweb/static/js/osichat/upload-file.js deleted file mode 100644 index 1dad1c90..00000000 --- a/osinaweb/static/js/osichat/upload-file.js +++ /dev/null @@ -1,131 +0,0 @@ -(function () { - // TO TRIGGER TEH FILE UPLOADER WHEN CLICKING ON THE UPLOAD FILE SVG - document.getElementById('svgFileUpload').addEventListener('click', function () { - document.getElementById('fileupload').click(); - }); - - document.getElementById('fileupload').addEventListener('change', function (event) { - let files = event.target.files; - - for (let file of files) { - let formData = new FormData(); - formData.append('file', file); - formData.append('filename', file.name); - - // Display the file during upload - if (file.type.startsWith('image/')) { - displayImageDuringUpload(file); - } else { - displayDocumentDuringUpload(file); - } - - // Perform the upload - fetch(`${protocol}://${osinaDomain}/chat-file-uploader/`, { - method: 'POST', - body: formData, - }) - .then(response => response.json()) - .then(data => { - if (data.data === 'Uploaded Successfully') { - const fullPath = `${protocol}://${osinaDomain}/${data.existingPath}`; - updateSelectTag(fullPath, file.name); - if (file.type.startsWith('image/')) { - osichatSocket.send(JSON.stringify({ 'event_type': 'uploaded_file', 'path': data.existingPath, 'file_type': 'image', 'file_name': file.name })); - } else { - osichatSocket.send(JSON.stringify({ 'event_type': 'uploaded_file', 'path': data.existingPath, 'file_type': 'document', 'file_name': file.name })); - } - } else { - console.error('Upload failed'); - } - }) - .catch(error => console.error('Error:', error)); - } - event.target.value = ''; - }); - - function displayImageDuringUpload(file) { - let reader = new FileReader(); - reader.onload = function (event) { - let mainDiv = document.createElement('div'); - mainDiv.className = 'w-full flex items-end justify-end gap-2' - let outerDiv = document.createElement('div'); - outerDiv.id = 'uploading-' + file.name; - outerDiv.className = 'max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue'; - - let div = document.createElement('div'); - let img = document.createElement('img'); - img.src = event.target.result; - img.style.opacity = '0.2'; - - div.appendChild(img); - - outerDiv.appendChild(div); - - mainDiv.appendChild(outerDiv); - - document.getElementById('messages').appendChild(mainDiv); - scrollBottom(); - }; - reader.readAsDataURL(file); - } - - - function displayDocumentDuringUpload(file) { - let mainDiv = document.createElement('div'); - mainDiv.className = 'w-full flex items-end justify-end gap-2' - let outerDiv = document.createElement('div'); - outerDiv.id = 'uploading-' + file.name; - outerDiv.className = 'max-w-[80%] p-4 rounded-l-3xl rounded-tr-3xl text-white shadow-md text-sm leading-6 bg-opacity-70 bg-osiblue'; - - let flexContainer = document.createElement('div'); - flexContainer.className = 'w-full flex items-center gap-1'; - - let svg = ` - - - - - - `; - - let svgDiv = document.createElement('div'); - svgDiv.innerHTML = svg; - - let textContainer = document.createElement('div'); - textContainer.className = 'flex flex-col'; - - let uploadingText = document.createElement('span'); - uploadingText.id = 'uploading-' + file.name; - uploadingText.textContent = 'Uploading...'; - - let fileNameDiv = document.createElement('div'); - fileNameDiv.className = 'file-name'; - fileNameDiv.textContent = file.name; - - textContainer.appendChild(uploadingText); - textContainer.appendChild(fileNameDiv); - - flexContainer.appendChild(svgDiv); - flexContainer.appendChild(textContainer); - - outerDiv.appendChild(flexContainer); - - mainDiv.appendChild(outerDiv); - - document.getElementById('messages').appendChild(mainDiv); - - scrollBottom(); - } - - - - - function updateSelectTag(path, fileName) { - let option = document.createElement('option'); - option.value = path; - option.textContent = fileName; - option.selected = true; - document.getElementById('filePathInput').appendChild(option); - } - -})(); diff --git a/osinaweb/static/js/osichat/visitors.js b/osinaweb/static/js/osichat/visitors.js deleted file mode 100644 index 2e3fed1a..00000000 --- a/osinaweb/static/js/osichat/visitors.js +++ /dev/null @@ -1,128 +0,0 @@ -const wsScheme = window.location.protocol === "https:" ? "wss" : "ws"; -const protocol = window.location.protocol === "https:" ? "https" : "http"; -const osinaDomain = "osina.ositcom.com"; -const ositcomDomain = "ositcom.com"; - - -async function fetchClientData() { - let clientData = { client_ip: 'Unknown', client_country: 'Unknown' }; - while (clientData.client_ip === 'Unknown') { - try { - const response = await fetch(`${protocol}://${osinaDomain}/get-client-ip/`); - const data = await response.json(); - if (data.ip) { - clientData = { - client_ip: data.ip, - client_country: data.country || 'Unknown', - client_region: data.region || 'Unknown' - }; - } - } catch (error) { - console.error('Error fetching client data:', error); - } - } - return clientData; -} - - -async function fetchVisitorsSession() { - let session_id = 'Unknown'; - while (session_id === 'Unknown') { - try { - const response = await fetch(`${protocol}://${ositcomDomain}/get-client-session/`); - const data = await response.json(); - if (data.session_id) { - session_id = data.session_id; - } - } catch (error) { - console.error('Error fetching session ID:', error); - } - } - return session_id; -} - - - -const getBrowserInfo = () => { - const userAgent = navigator.userAgent; - let browserName = "Unknown"; - let osName = "Unknown"; - - if (userAgent.indexOf("Firefox") > -1) { - browserName = "Firefox"; - } else if (userAgent.indexOf("SamsungBrowser") > -1) { - browserName = "Samsung Internet"; - } else if (userAgent.indexOf("Opera") > -1 || userAgent.indexOf("OPR") > -1) { - browserName = "Opera"; - } else if (userAgent.indexOf("Trident") > -1) { - browserName = "Internet Explorer"; - } else if (userAgent.indexOf("Edge") > -1) { - browserName = "Edge"; - } else if (userAgent.indexOf("Chrome") > -1) { - browserName = "Chrome"; - } else if (userAgent.indexOf("Safari") > -1) { - browserName = "Safari"; - } - - if (userAgent.indexOf("Win") > -1) { - osName = "Windows"; - } else if (userAgent.indexOf("Mac") > -1) { - osName = "MacOS"; - } else if (userAgent.indexOf("X11") > -1) { - osName = "UNIX"; - } else if (userAgent.indexOf("Linux") > -1) { - osName = "Linux"; - } else if (userAgent.indexOf("Android") > -1) { - osName = "Android"; - } else if (userAgent.indexOf("like Mac") > -1) { - osName = "iOS"; - } - - return { browserName, osName }; -}; - - -async function initializeVisitorsWebSocket() { - - const referrer = document.referrer; - const clientData = await fetchClientData(); - const session_id = await fetchVisitorsSession(); - const browserInfo = getBrowserInfo(); - const visitorsSocketUrl = `${wsScheme}://${osinaDomain}/ws/osichat/visitors/`; - const visitorsSocket = new WebSocket(visitorsSocketUrl); - - visitorsSocket.onopen = () => { - console.log('WebSocket connection to visitors established'); - - const event_message = { - 'event_type': 'visitor_ping', - 'referrer': referrer, - 'url': window.location.href, - 'title': window.document.title, - 'client_ip': clientData.client_ip, - 'client_country': clientData.client_country, - 'client_region': clientData.client_region, - 'browser_name': browserInfo.browserName, - 'os_name': browserInfo.osName, - 'session_id': session_id - }; - visitorsSocket.send(JSON.stringify(event_message)); - }; - - visitorsSocket.onclose = () => { - console.log('WebSocket connection to visitors closed'); - }; - - visitorsSocket.onerror = (error) => { - console.error('WebSocket error:', error); - }; - - window.addEventListener('offline', () => { - if (visitorsSocket) { - visitorsSocket.close(); - } - }); -} - - -initializeVisitorsWebSocket(); \ No newline at end of file diff --git a/osinaweb/support/__pycache__/__init__.cpython-313.pyc b/osinaweb/support/__pycache__/__init__.cpython-313.pyc index 6b85ea66ac1c81669519622a0d4fe6bce761cd6c..3ce43e8ed51424babea7ef4db501f955f384abd0 100644 GIT binary patch delta 19 ZcmdnOxP_7XGcPX}0}$-skC@245&$uj1n~d> delta 19 ZcmdnOxP_7XGcPX}0}w3P9X64BB>*&V1&06t diff --git a/osinaweb/support/__pycache__/admin.cpython-313.pyc b/osinaweb/support/__pycache__/admin.cpython-313.pyc index c12e3e9e3760c81c14b37e5c25c61804a3335073..0bfd6d29b3711294ba191ceb14917c189d84bfba 100644 GIT binary patch delta 20 acmZ3+v5bTJGcPX}0}$-skJ!j9%>n>4)dYC} delta 20 acmZ3+v5bTJGcPX}0}w3P9k!8MngswjM+FZ6 diff --git a/osinaweb/support/__pycache__/apps.cpython-313.pyc b/osinaweb/support/__pycache__/apps.cpython-313.pyc index 507a1a43f5f60db6f54545ac9fb2048d93e9e5cb..15297d2d394de3fb47b8d621c6e8cbf3c08d38cb 100644 GIT binary patch delta 20 acmZ3)vWSKIGcPX}0}$-skJ!j9&IAB6qXc6B delta 20 acmZ3)vWSKIGcPX}0}w3P9k!8MoCyFo6$JSJ diff --git a/osinaweb/support/__pycache__/consumers.cpython-313.pyc b/osinaweb/support/__pycache__/consumers.cpython-313.pyc index 4848f1767255aa57cded14e6c1c46e7a4bfae7d0..bead9f895bae9dcd36864db05521ee430dc6ba9a 100644 GIT binary patch delta 20 acmaD+^P-0PGcPX}0}$-skJ!i^YX<;NuLfZN delta 20 acmaD+^P-0PGcPX}0}w3P9k!7>)(!wuAqMvV diff --git a/osinaweb/support/__pycache__/decorators.cpython-313.pyc b/osinaweb/support/__pycache__/decorators.cpython-313.pyc index 955946bb211ea4d561390c70d35f129cecb1b8ec..1d8c2de1f64e731047b0658df959edc523d037fc 100644 GIT binary patch delta 20 acmdnMy@8wiGcPX}0}$-skJ!k)lobFs(ghv> delta 20 acmdnMy@8wiGcPX}0}w3P9k!8sDJuXwLp9ug&)dm3o diff --git a/osinaweb/support/__pycache__/urls.cpython-313.pyc b/osinaweb/support/__pycache__/urls.cpython-313.pyc index 9c4cd02be951d4bb35bd46b4cdc553ca89934ecc..c1983a0e4c09ad86b76525a77044162db456cc5a 100644 GIT binary patch delta 20 acmcb@eTAF*GcPX}0}$-skJ!k4k`(|was`S2 delta 20 acmcb@eTAF*GcPX}0}w3P9k!ACBr5m<0eq2L-nP diff --git a/osinaweb/support/migrations/__pycache__/0008_alter_tickettask_ticket.cpython-313.pyc b/osinaweb/support/migrations/__pycache__/0008_alter_tickettask_ticket.cpython-313.pyc index 6bbd3c42133baeac1d00d27471fb05d7f7d2f08f..2f5f5da44254a60ccbef7d4e96b7934f6f4711bb 100644 GIT binary patch delta 20 acmZqVXyoAj%*)Hg00cYuBQ|n>V+H^*37;RbF1 diff --git a/osinaweb/support/migrations/__pycache__/__init__.cpython-313.pyc b/osinaweb/support/migrations/__pycache__/__init__.cpython-313.pyc index fd1bf71de71408be64ab2123c9eb455d0317b0b7..7a56c2cb7a1633cc37a1f2ab805d670c798f60f2 100644 GIT binary patch delta 19 ZcmdnbxSx^xGcPX}0}$-skC@241pqTE1rh)N delta 19 ZcmdnbxSx^xGcPX}0}w3P9X64B3jj6;1*iZ3 diff --git a/osinaweb/tailwind.config.js b/osinaweb/tailwind.config.js index bbcf4a2d..ecd8df71 100644 --- a/osinaweb/tailwind.config.js +++ b/osinaweb/tailwind.config.js @@ -7,7 +7,7 @@ module.exports = { "./customercore/templates/**/*.html", "./billing/templates/**/*.html", "./support/templates/**/*.html", - "./osichat/templates/**/*.html", + ], theme: { screens: {