You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.3 KiB
Python
127 lines
4.3 KiB
Python
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))
|