Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions chats/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib.auth import get_user_model
from django.db.models import Q

from rest_framework import status
from rest_framework.generics import (
Expand All @@ -12,7 +13,7 @@
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from chats.models import ProjectChat, DirectChat
from chats.models import ProjectChat, DirectChat, DirectChatMessage, ProjectChatMessage
from chats.pagination import MessageListPagination
from chats.permissions import IsProjectChatMember
from chats.serializers import (
Expand Down Expand Up @@ -41,14 +42,15 @@ def get_queryset(self):
def get(self, request, *args, **kwargs):
chats = self.get_queryset()
serialized_chats = []
for chat in chats:
chats_users_ids = [[int(num) for num in chat.pk.split("_")] for chat in chats]
all_chats_users = User.objects.filter(pk__in=sum(chats_users_ids, []))
for user1_id, user2_id in chats_users_ids:
# fixme: move to function like get_user() and get_opponent()
chat_id = chat.id
user1_id, user2_id = map(int, chat_id.split("_"))
chat = chats.get(id=f"{user1_id}_{user2_id}")

try:
user1 = User.objects.get(pk=user1_id)
user2 = User.objects.get(pk=user2_id)
user1 = all_chats_users.get(pk=user1_id)
user2 = all_chats_users.get(pk=user2_id)
except User.DoesNotExist:
# fixme: show deleted profile
continue
Expand Down Expand Up @@ -117,7 +119,9 @@ def get(self, request, *args, **kwargs) -> Response:
except ValueError:
return Response(
status=status.HTTP_400_BAD_REQUEST,
data={"detail": "processed id must contain two integers separated by underscore"},
data={
"detail": "processed id must contain two integers separated by underscore"
},
)
except AssertionError as e:
return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail": str(e)})
Expand Down Expand Up @@ -218,16 +222,18 @@ class HasChatUnreadsView(GenericAPIView):
)
def get(self, request, *args, **kwargs):
user = request.user
# get all user chats
direct_messages = user.direct_chats.all().prefetch_related("messages")
project_chats = user.get_project_chats().prefetch_related("messages")

has_direct_messages_unread = (
direct_messages.filter(messages__is_read=False).distinct().exists()
unread_dir_messages = (
DirectChatMessage.objects.filter(chat__users=user, is_read=False)
.exclude(Q(author=user) | Q(is_deleted=True))
.distinct()
.exists()
)
has_project_messages_unread = (
project_chats.filter(messages__is_read=False).distinct().exists()
)
return Response(
{"has_unreads": has_direct_messages_unread or has_project_messages_unread}

unread_proj_messages = (
ProjectChatMessage.objects.filter(is_read=False)
.exclude(is_deleted=True)
.distinct()
.exists()
)
return Response({"has_unreads": unread_proj_messages or unread_dir_messages})
106 changes: 106 additions & 0 deletions project_rates/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
from datetime import datetime
from unittest import TestCase
from rest_framework.test import APIRequestFactory, force_authenticate

from industries.models import Industry
from partner_programs.models import PartnerProgram
from project_rates.models import Criteria
from project_rates.views import RateProjects, RateProject, RateProjectsDetails
from projects.models import Project
from tests.constants import USER_CREATE_DATA
from users.models import Expert, CustomUser
from users.views import UserList


class ProjectRateTestCase(TestCase):
def setUp(self):
self.factory = APIRequestFactory()
self.project_rate_list_view = RateProjects.as_view()
self.project_rate_detail_view = RateProjectsDetails.as_view()
self.project_rate_create_view = RateProject.as_view()
self.user_list_view = UserList.as_view()

self.program = PartnerProgram.objects.create(
name="Название программы",
tag="Тег программы",
description="Описание программы",
city="Город",
data_schema={"field1": "type1", "field2": "type2"},
datetime_registration_ends=datetime.now(),
datetime_started=datetime.now(),
datetime_finished=datetime.now(),
datetime_created=datetime.now(),
datetime_updated=datetime.now(),
)

self.criteria_numeric = Criteria.objects.create(
name="Тестовое качество",
type="int",
min_value=0,
max_value=100,
partner_program=self.program,
)

self.criteria_comment = Criteria.objects.create(
name="Комментарий", type="str", partner_program=self.program
)

self.user = None
self.project = None

self.project_rate_create_data = [
{"criterion_id": self.criteria_numeric.id, "value": 1},
{"criterion_id": self.criteria_comment.id, "value": "Тестовые слова"},
]

def test_successful_project_rates_creation(self):
self.create_user_project()
request = self.factory.post(
f"rate-project/rate/{self.project.id}",
self.project_rate_create_data,
format="json",
)
force_authenticate(request, user=self.user)

response = self.project_rate_create_view(request, project_id=self.project.id)
self.assertEqual(response.status_code, 201)
self.assertEqual(response.data["success"], True)

# def test_successful_project_rates_list_should_succeed(self):
# self.create_user_project()
# ProjectScore.objects.bulk_create([
# ProjectScore(criteria=self.criteria_numeric, user=self.user, project=self.project, value=1),
# ProjectScore(criteria=self.criteria_comment, user=self.user, project=self.project, value="Test text")
# ])
# request = self.factory.get(f"rate-project/{self.criteria_numeric.partner_program.id}")
# force_authenticate(request, user=self.user)
#
# response = self.project_rate_list_view(request, program_id=self.criteria_numeric.partner_program.id)
# raise ValueError(f"{response.data}, self.")
# self.assertEqual(response.status_code, 200)

def user_create(self):
USER_CREATE_DATA["user_type"] = 3
request = self.factory.post("auth/users/", USER_CREATE_DATA)
response = self.user_list_view(request)
user_id = response.data["id"]
user = CustomUser.objects.get(id=user_id)
user.is_active = True
user.save()
return user

def create_user_project(self):
try:
self.user = self.user_create()
except KeyError:
self.user = CustomUser.objects.get(email="only_for_test@test.test")
self.expert = Expert.objects.get(user=self.user)
self.expert.programs.add(self.program)

self.project = Project.objects.create(
name="Test project",
description="Test desc",
industry=Industry.objects.create(name="Test"),
leader=self.user,
step=1,
)