Skip to content

Commit

Permalink
Merge pull request #205 from PROCOLLAB-github/dev
Browse files Browse the repository at this point in the history
add user online metric
  • Loading branch information
VeryBigSad authored Oct 13, 2023
2 parents a9fbbd6 + bfb8b34 commit 831c9b0
Showing 3 changed files with 17 additions and 1 deletion.
9 changes: 8 additions & 1 deletion chats/consumers/chat.py
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@
ChatType,
)
from core.constants import ONE_DAY_IN_SECONDS, ONE_WEEK_IN_SECONDS
from core.utils import get_user_online_cache_key
from core.utils import get_user_online_cache_key, get_users_online_cache_key
from projects.models import Collaborator
from users.models import CustomUser
from chats.consumers.event_types import DirectEvent, ProjectEvent
@@ -186,15 +186,22 @@ async def edit_message(self, event: Event):

async def __process_general_event(self, event: Event, room_name: str):
cache_key = get_user_online_cache_key(self.user)
users_online_list_key = get_users_online_cache_key()
if event.type == EventType.SET_ONLINE:
cache.set(cache_key, True, ONE_DAY_IN_SECONDS)
users_online_list = cache.get_or_set(users_online_list_key, set())
users_online_list.add(self.user.pk)
cache.set(users_online_list_key, users_online_list, ONE_DAY_IN_SECONDS)

# sent everyone online event that user X is online
await self.channel_layer.group_send(
room_name, {"type": EventType.SET_ONLINE, "user_id": self.user.pk}
)
elif event.type == EventType.SET_OFFLINE:
cache.delete(cache_key)
users_online_list = cache.get_or_set(users_online_list_key, set())
users_online_list.remove(self.user.pk)
cache.set(users_online_list_key, users_online_list, ONE_DAY_IN_SECONDS)

# sent everyone online event that user X is offline
await self.channel_layer.group_send(
4 changes: 4 additions & 0 deletions core/utils.py
Original file line number Diff line number Diff line change
@@ -20,3 +20,7 @@ def send_email(data):

def get_user_online_cache_key(user) -> str:
return f"online_user_{user.pk}"


def get_users_online_cache_key() -> str:
return "online_users"
5 changes: 5 additions & 0 deletions metrics/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from django.contrib.auth import get_user_model
from core.utils import get_users_online_cache_key
from projects.models import Project
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from users.models import Expert, Investor, Member, Mentor
from vacancy.models import Vacancy
from django.core.cache import cache

User = get_user_model()

@@ -26,6 +28,9 @@ def get(self, request, format=None):
for model in models:
data = self._update_total_counts(data, model)

users_online_list_key = get_users_online_cache_key()
data["current_online_users"] = len(cache.get_or_set(users_online_list_key, set()))

return Response(data)

def _update_total_counts(self, data, model) -> dict[str, int]:

0 comments on commit 831c9b0

Please sign in to comment.