Move unread chat count to one request

This commit is contained in:
cuom1999 2022-08-31 23:18:38 -05:00
parent a7f7aab444
commit bddb00050a
5 changed files with 40 additions and 48 deletions

View file

@ -1,6 +1,10 @@
from cryptography.fernet import Fernet from cryptography.fernet import Fernet
from django.conf import settings from django.conf import settings
from django.db.models import OuterRef, Count, Subquery, IntegerField
from django.db.models.functions import Coalesce
from chat_box.models import Ignore, Message, UserRoom
secret_key = settings.CHAT_SECRET_KEY secret_key = settings.CHAT_SECRET_KEY
fernet = Fernet(secret_key) fernet = Fernet(secret_key)
@ -18,3 +22,28 @@ def decrypt_url(message_encrypted):
return int(creator_id), int(other_id) return int(creator_id), int(other_id)
except Exception as e: except Exception as e:
return None, None return None, None
def get_unread_boxes(profile):
ignored_users = Ignore.get_ignored_users(profile)
mess = (
Message.objects.filter(room=OuterRef("room"), time__gte=OuterRef("last_seen"))
.exclude(author=profile)
.exclude(author__in=ignored_users)
.order_by()
.values("room")
.annotate(unread_count=Count("pk"))
.values("unread_count")
)
unread_boxes = (
UserRoom.objects.filter(user=profile, room__isnull=False)
.annotate(
unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0),
)
.filter(unread_count__gte=1)
.count()
)
return unread_boxes

View file

@ -502,32 +502,3 @@ def toggle_ignore(request, **kwargs):
Ignore.toggle_ignore(request.profile, other_user) Ignore.toggle_ignore(request.profile, other_user)
next_url = request.GET.get("next", "/") next_url = request.GET.get("next", "/")
return HttpResponseRedirect(next_url) return HttpResponseRedirect(next_url)
@login_required
def get_unread_boxes(request):
if request.method != "GET":
return HttpResponseBadRequest()
ignored_users = Ignore.get_ignored_users(request.profile)
mess = (
Message.objects.filter(room=OuterRef("room"), time__gte=OuterRef("last_seen"))
.exclude(author=request.profile)
.exclude(author__in=ignored_users)
.order_by()
.values("room")
.annotate(unread_count=Count("pk"))
.values("unread_count")
)
unread_boxes = (
UserRoom.objects.filter(user=request.profile, room__isnull=False)
.annotate(
unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0),
)
.filter(unread_count__gte=1)
.count()
)
return JsonResponse({"unread_boxes": unread_boxes})

View file

@ -1036,11 +1036,6 @@ urlpatterns = [
chat.toggle_ignore, chat.toggle_ignore,
name="toggle_ignore", name="toggle_ignore",
), ),
url(
r"^get_unread_boxes$",
chat.get_unread_boxes,
name="get_unread_boxes",
),
] ]
), ),
), ),

View file

@ -16,6 +16,7 @@ from judge.models.choices import ACE_THEMES, MATH_ENGINES_CHOICES, TIMEZONE
from judge.models.runtime import Language from judge.models.runtime import Language
from judge.ratings import rating_class from judge.ratings import rating_class
__all__ = ["Organization", "Profile", "OrganizationRequest", "Friend"] __all__ = ["Organization", "Profile", "OrganizationRequest", "Friend"]
@ -242,6 +243,12 @@ class Profile(models.Model):
} }
return self.notifications.filter(**query).count() return self.notifications.filter(**query).count()
@cached_property
def count_unread_chat_boxes(self):
from chat_box.utils import get_unread_boxes
return get_unread_boxes(self)
_pp_table = [pow(settings.DMOJ_PP_STEP, i) for i in range(settings.DMOJ_PP_ENTRIES)] _pp_table = [pow(settings.DMOJ_PP_STEP, i) for i in range(settings.DMOJ_PP_ENTRIES)]
def calculate_points(self, table=_pp_table): def calculate_points(self, table=_pp_table):

View file

@ -158,20 +158,6 @@
id: '{{ request.user.id|escapejs }}', id: '{{ request.user.id|escapejs }}',
name: '{{ request.user.username|escapejs }}' name: '{{ request.user.username|escapejs }}'
}; };
$(function() {
if ($('#chat-icon').length) {
$.get("{{url('get_unread_boxes')}}")
.done(function(data) {
if (data.unread_boxes) {
var html = `<sub class="unread_boxes">${data.unread_boxes}</sub>`;
$('#chat-icon').append(html);
}
})
.fail(function(data) {
console.log('Fail to get unread boxes');
});
}
});
</script> </script>
{% else %} {% else %}
<script>window.user = {};</script> <script>window.user = {};</script>
@ -230,6 +216,10 @@
<span class="navbar-icons"> <span class="navbar-icons">
<span title="{{_('Chat')}}"> <span title="{{_('Chat')}}">
<a id="chat-icon" href="{{ url('chat', '') }}" class="icofont-wechat navbar-icon" aria-hidden="true"> <a id="chat-icon" href="{{ url('chat', '') }}" class="icofont-wechat navbar-icon" aria-hidden="true">
{% set unread_chat = request.profile.count_unread_chat_boxes %}
{% if unread_chat %}
<sub class="unread_boxes">{{unread_chat}}</sub>
{% endif %}
</a> </a>
</span> </span>