Skip to content

Commit 831c9b0

Browse files
authored
Merge pull request #205 from PROCOLLAB-github/dev
add user online metric
2 parents a9fbbd6 + bfb8b34 commit 831c9b0

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

chats/consumers/chat.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
ChatType,
1717
)
1818
from core.constants import ONE_DAY_IN_SECONDS, ONE_WEEK_IN_SECONDS
19-
from core.utils import get_user_online_cache_key
19+
from core.utils import get_user_online_cache_key, get_users_online_cache_key
2020
from projects.models import Collaborator
2121
from users.models import CustomUser
2222
from chats.consumers.event_types import DirectEvent, ProjectEvent
@@ -186,15 +186,22 @@ async def edit_message(self, event: Event):
186186

187187
async def __process_general_event(self, event: Event, room_name: str):
188188
cache_key = get_user_online_cache_key(self.user)
189+
users_online_list_key = get_users_online_cache_key()
189190
if event.type == EventType.SET_ONLINE:
190191
cache.set(cache_key, True, ONE_DAY_IN_SECONDS)
192+
users_online_list = cache.get_or_set(users_online_list_key, set())
193+
users_online_list.add(self.user.pk)
194+
cache.set(users_online_list_key, users_online_list, ONE_DAY_IN_SECONDS)
191195

192196
# sent everyone online event that user X is online
193197
await self.channel_layer.group_send(
194198
room_name, {"type": EventType.SET_ONLINE, "user_id": self.user.pk}
195199
)
196200
elif event.type == EventType.SET_OFFLINE:
197201
cache.delete(cache_key)
202+
users_online_list = cache.get_or_set(users_online_list_key, set())
203+
users_online_list.remove(self.user.pk)
204+
cache.set(users_online_list_key, users_online_list, ONE_DAY_IN_SECONDS)
198205

199206
# sent everyone online event that user X is offline
200207
await self.channel_layer.group_send(

core/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ def send_email(data):
2020

2121
def get_user_online_cache_key(user) -> str:
2222
return f"online_user_{user.pk}"
23+
24+
25+
def get_users_online_cache_key() -> str:
26+
return "online_users"

metrics/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from django.contrib.auth import get_user_model
2+
from core.utils import get_users_online_cache_key
23
from projects.models import Project
34
from rest_framework import permissions
45
from rest_framework.response import Response
56
from rest_framework.views import APIView
67
from users.models import Expert, Investor, Member, Mentor
78
from vacancy.models import Vacancy
9+
from django.core.cache import cache
810

911
User = get_user_model()
1012

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

31+
users_online_list_key = get_users_online_cache_key()
32+
data["current_online_users"] = len(cache.get_or_set(users_online_list_key, set()))
33+
2934
return Response(data)
3035

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

0 commit comments

Comments
 (0)