diff --git a/users/serializers.py b/users/serializers.py index 4bc8ee55..c13754ed 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -379,21 +379,6 @@ class Meta: read_only_fields = ["leader", "collaborator", "is_company"] -class SubscriptionSerializer(serializers.Serializer): - id = serializers.IntegerField() - name = serializers.CharField() - price = serializers.IntegerField() - features_list = serializers.ListField(child=serializers.CharField()) - - -class UserSubscriptionDataSerializer(serializers.Serializer): - is_subscribed = serializers.BooleanField() - last_subscription_date = serializers.CharField() - subscription_date_over = serializers.CharField() - last_subscription_type = SubscriptionSerializer() - is_autopay_allowed = serializers.BooleanField() - - class UserExperienceMixin: """Mixin for Education and WorkExperience with same logic.""" @@ -991,12 +976,6 @@ def validate(self, data): return validate_project(data) -class UserCloneDataSerializer(serializers.ModelSerializer): - class Meta: - model = CustomUser - fields = "__all__" - - class CustomObtainPairSerializer(TokenObtainPairSerializer): def validate(self, attrs): data = super().validate(attrs) @@ -1008,8 +987,3 @@ def get_token(cls, user): token = super().get_token(user) token["email"] = user.email return token - - -class RemoteBuySubSerializer(serializers.Serializer): - subscription_id = serializers.IntegerField() - redirect_url = serializers.CharField(required=False) diff --git a/users/tests.py b/users/tests.py index 3fac35b5..e2cafeb4 100644 --- a/users/tests.py +++ b/users/tests.py @@ -4,7 +4,8 @@ from projects.models import Collaborator, Project from users.models import CustomUser -from users.views import UserLeaderProjectsList, UserList, UserDetail +from users.serializers import UserDetailSerializer +from users.views import CurrentUser, UserLeaderProjectsList, UserList, UserDetail class UserTestCase(TestCase): @@ -13,6 +14,7 @@ def setUp(self): self.user_list_view = UserList.as_view() self.user_detail_view = UserDetail.as_view() self.user_leader_projects_view = UserLeaderProjectsList.as_view() + self.current_user_view = CurrentUser.as_view() def test_user_creation(self): request = self.factory.post("auth/users/", USER_CREATE_DATA) @@ -83,6 +85,22 @@ def test_user_leader_projects_list(self): returned_ids, {leader_project.id, second_leader_project.id} ) + def test_current_user_returns_authenticated_user_profile(self): + user = self._user_create("current@example.com") + + request = self.factory.get("auth/users/current/") + force_authenticate(request, user=user) + response = self.current_user_view(request) + expected_data = UserDetailSerializer(user, context={"request": request}).data + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data, expected_data) + + def test_removed_legacy_routes_return_404(self): + self.assertEqual(self.client.get("/auth/users/clone-data").status_code, 404) + self.assertEqual(self.client.get("/auth/subscription/").status_code, 404) + self.assertEqual(self.client.post("/auth/subscription/buy/").status_code, 404) + def _user_create(self, email): tmp_create_data = USER_CREATE_DATA.copy() tmp_create_data["email"] = email diff --git a/users/urls.py b/users/urls.py index 907a9c15..b5e376c0 100644 --- a/users/urls.py +++ b/users/urls.py @@ -26,9 +26,6 @@ UserSpecializationsNestedView, UserSpecializationsInlineView, UserSkillsApproveDeclineView, - SingleUserDataView, - RemoteViewSubscriptions, - RemoteCreatePayment, UserCVDownload, UserCVMailing, ) @@ -86,9 +83,4 @@ "reset_password/", include("django_rest_passwordreset.urls", namespace="password_reset"), ), - # for skills - path("users/clone-data", SingleUserDataView.as_view()), - # copy from skills - path("subscription/", RemoteViewSubscriptions.as_view()), - path("subscription/buy/", RemoteCreatePayment.as_view()), ] diff --git a/users/views.py b/users/views.py index dfa7fc88..9300d2cd 100644 --- a/users/views.py +++ b/users/views.py @@ -1,7 +1,6 @@ import urllib.parse import jwt -import requests from django.apps import apps from django.conf import settings from django.contrib.auth import get_user_model @@ -54,18 +53,15 @@ AchievementDetailSerializer, AchievementListSerializer, PublicUserSerializer, - RemoteBuySubSerializer, ResendVerifyEmailSerializer, SpecializationSerializer, SpecializationsSerializer, UserApproveSkillResponse, - UserCloneDataSerializer, UserDetailSerializer, UserListSerializer, UserProjectListSerializer, UserSkillConfirmationSerializer, UserSubscribedProjectsSerializer, - UserSubscriptionDataSerializer, VerifyEmailSerializer, ) from users.typing import UserCVDataV2 @@ -261,31 +257,7 @@ class CurrentUser(GenericAPIView): def get(self, request): user = request.user serializer = self.get_serializer(user) - - if settings.DEBUG: - skills_url_name = ( - "https://skills.dev.procollab.ru/progress/subscription-data/" - ) - else: - skills_url_name = ( - "https://api.skills.procollab.ru/progress/subscription-data/" - ) - try: - subscription_data = requests.get( - skills_url_name, - headers={ - "accept": "application/json", - "Authorization": request.META.get("HTTP_AUTHORIZATION"), - }, - ) - subscription_serializer = UserSubscriptionDataSerializer( - subscription_data.json() - ) - subs_data = subscription_serializer.data - except Exception: - subs_data = {} - - return Response(serializer.data | subs_data, status=status.HTTP_200_OK) + return Response(serializer.data, status=status.HTTP_200_OK) class UserTypesView(APIView): @@ -575,82 +547,6 @@ def get_queryset(self): return Specialization.objects.all() -class SingleUserDataView(ListAPIView): - serializer_class = UserCloneDataSerializer - permissions = [AllowAny] - authentication_off = True - - def get_queryset(self) -> User: - return [get_object_or_404(User, email=self.request.data["email"])] - - -class RemoteViewSubscriptions(APIView): - permission_classes = [AllowAny] - - def get(self, request, *args, **kwargs): - try: - subscriptions = self._get_response_from_remote_api() - return Response(subscriptions, status=status.HTTP_200_OK) - except requests.RequestException as e: - return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) - - def _get_link_to_remote_api(self) -> str: - # TODO something to reuse this code - if settings.DEBUG: - subscriptions_url = "https://skills.dev.procollab.ru/subscription/" - else: - subscriptions_url = "https://api.skills.procollab.ru/subscription/" - return subscriptions_url - - def _get_response_from_remote_api(self): - subscriptions_url = self._get_link_to_remote_api() - response = requests.get( - subscriptions_url, - headers={ - "accept": "application/json", - "Authorization": self.request.META.get("HTTP_AUTHORIZATION"), - }, - ) - response.raise_for_status() - return response.json() - - -class RemoteCreatePayment(GenericAPIView): - serializer_class = RemoteBuySubSerializer - permission_classes = [AllowAny] - - def post(self, request, *args, **kwargs): - try: - subscriptions_buy_url = self._get_link_to_remote_api() - data, headers = self._get_data_to_request_remote_api() - response = requests.post(subscriptions_buy_url, json=data, headers=headers) - response.raise_for_status() - return Response(response.json(), status=status.HTTP_200_OK) - except requests.RequestException as e: - return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) - - def _get_link_to_remote_api(self) -> str: - # TODO something to reuse this code - if settings.DEBUG: - subscriptions_buy_url = "https://skills.dev.procollab.ru/subscription/buy/" - else: - subscriptions_buy_url = "https://api.skills.procollab.ru/subscription/buy/" - return subscriptions_buy_url - - def _get_data_to_request_remote_api(self) -> tuple[dict, dict]: - serializer = self.serializer_class(data=self.request.data) - if serializer.is_valid(): - data = serializer.validated_data - headers = { - "accept": "application/json", - "Authorization": self.request.META.get("HTTP_AUTHORIZATION"), - } - return data, headers - - else: - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - class UserCVDownload(APIView): permission_classes = [IsAuthenticated]