Move unread chat count to one request
This commit is contained in:
parent
a7f7aab444
commit
bddb00050a
5 changed files with 40 additions and 48 deletions
|
@ -1,6 +1,10 @@
|
|||
from cryptography.fernet import Fernet
|
||||
|
||||
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
|
||||
fernet = Fernet(secret_key)
|
||||
|
@ -18,3 +22,28 @@ def decrypt_url(message_encrypted):
|
|||
return int(creator_id), int(other_id)
|
||||
except Exception as e:
|
||||
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
|
||||
|
|
|
@ -502,32 +502,3 @@ def toggle_ignore(request, **kwargs):
|
|||
Ignore.toggle_ignore(request.profile, other_user)
|
||||
next_url = request.GET.get("next", "/")
|
||||
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})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue