def post(cls, request) -> Response:
        """
        Registers a new user
        :return: Response dict with the new user's data
        """
        data = request.data
        login = data['login']
        password = hashlib.sha256(data['password'].encode('utf-8')).hexdigest()
        profile_name = data['profile_name']
        email_address = data['email_address']
        email_notifications_mode = data['email_notifications_mode']

        try:
            existing_user = User.objects.get(login=login)
            if existing_user:
                return Response('User with this login already exists.',
                                status=200)
        except User.DoesNotExist:
            User.create_user(login, password, profile_name, email_address,
                             email_notifications_mode)

        returned_data = dict(
            message='You are registered!',
            login=login,
            profile_name=profile_name,
            email_address=email_address,
        )
        return Response(returned_data, status=200)
Beispiel #2
0
    def post(cls, request):
        """
        Create new user entity using login and password
        @param request:
        @return: user_id and his login as dict
        """
        login: str = request.data['login']
        password: str = request.data['password']

        user, registered = User.register_new_user(
            login=login,
            password=password
        )

        if not registered:
            raise AlreadyExistsError(
                message="User with this login already exists",
                status_code=409,
                payload={'field_name': 'login'}
            )

        return dict(
            id=user.id,
            login=user.login
        )
Beispiel #3
0
    def process_request(self, request):
        auth = request.headers.get('Authorization', '').split()
        if not auth:
            return None

        if len(auth) != 2:
            return custom_middleware_exception(AuthTypeInvalid())

        auth_type = auth[0]
        token = auth[1]

        try:
            decoded_token = JwtTokenAuth.check_token(auth_type, token)
        except AccessTokenInvalid as exc:
            return custom_middleware_exception(exc)

        user_id = decoded_token['user_id']

        if not self.check_token_in_whitelist(user_id, token):
            return custom_middleware_exception(AccessTokenInvalid())

        try:
            user = User.get(id=user_id)
        except User.DoesNotExist:
            return custom_middleware_exception(AccessTokenInvalid())

        setattr(request, 'api_user', user)
        return None
Beispiel #4
0
    def get(cls, request, user_id):
        """
        Get user info. Returns email and email_notification_enabled if token valid for user_id. Else returns
        "following" info
        @param request:
        @param user_id: user's id to get info from
        @return:
        """
        try:
            user = User.get(id=user_id)
        except User.DoesNotExist:
            raise NotFoundError()

        followers_num = user.followers.count()
        following_num = user.targets.count()

        response_dict = user.to_dict()
        response_dict['followers_num'] = followers_num
        response_dict['following_num'] = following_num

        is_my_profile = request.api_user == user
        response_dict['is_my_profile'] = is_my_profile
        response_dict[
            'email'] = user.email if is_my_profile and user.email else None
        response_dict[
            'email_notifications_enabled'] = user.email_notifications_enabled if is_my_profile else None
        response_dict[
            'following'] = None if is_my_profile else Follower.is_following_by(
                user, request.api_user)

        return response_dict
    def get(cls,
            request: Request) -> Dict[str, Union[List[Dict[str, str]], bool]]:
        """Make response containg a list of users"""
        users: QuerySet = User.get_users().values('id', 'login', 'name')

        if 'loginSearchString' in request.query_params:
            users = users.filter(
                login__icontains=request.query_params['loginSearchString'])
            if not users:
                raise exceptions.NotFoundError(
                    f"Users with names containing {request.query_params['loginSearchString']} not found"
                )

        paginator: Paginator = Paginator(users, cls.PAGE_SIZE)
        page_number = request.query_params['page']

        try:
            page: Page = paginator.page(page_number)
        except InvalidPage as invalid_page:
            raise exceptions.UnprocessableEntityError(
                f'Invalid page number: {page_number}') from invalid_page

        users_on_page: List[Dict[str, str]] = list(page)
        has_next_page: bool = page.has_next()

        response: Dict[str, Union[List[Dict[str, str]],
                                  bool]] = dict(users=users_on_page,
                                                hasNextPage=has_next_page)
        return response
Beispiel #6
0
    def check_user_credentials(cls, login, password):
        try:
            user = User.get(login=login)
        except User.DoesNotExist:
            raise InvalidCredentialsError()
        if not user.check_password(password):
            raise InvalidCredentialsError()

        return user
Beispiel #7
0
    def delete(cls, request, user_id, following_user_id) -> Dict:
        """
        Unfollow following user who has following_user_id by user with user_id
        @param request:
        @param user_id:
        @param following_user_id:
        @return:
        """
        if user_id != request.api_user.id:
            raise ForbiddenError()

        try:
            target_user_id = User.get(id=following_user_id)
        except User.DoesNotExist:
            raise NotFoundError()

        Follower.unfollow(target=target_user_id, follower=request.api_user)

        return dict()
    def get(cls, request, user_id):
        """
        Get all followers and following users from this user_id
        @param user_id:
        @param request:
        @return:
        """
        try:
            user = User.get(id=user_id)
        except User.DoesNotExist:
            raise NotFoundError()

        followers = Follower.get_user_followers(user)
        followings = Follower.get_user_following_list(user)

        return dict(
            user_id=user.id,
            followers=[follower.to_dict() for follower in followers],
            following=[following.to_dict() for following in followings],
        )
Beispiel #9
0
    def get(cls, request, user_id):
        """
        Get paginated pitts feed for user
        @param request:
        @param user_id:
        @return:
        """
        user = User.get(id=user_id)
        user_followings = Follower.get_user_following_list(user)
        user_followings.append(user)
        user_pitts_queryset = Pitt.get_users_pitts_queryset(user_followings)

        try:
            pagination = CursorPagination(user_pitts_queryset, request,
                                          ['-created_at'])
        except ValueError:
            raise ValidationError()

        current_page_pitts = [
            pitt.to_dict() for pitt in pagination.get_current_page()
        ]
        return pagination.get_paginated_dict(current_page_pitts)
Beispiel #10
0
    def get(cls, request, user_id):
        """
        Get paginated user pitts
        @param request:
        @param user_id:
        @return:
        """
        try:
            user = User.get(id=user_id)
        except User.DoesNotExist:
            raise NotFoundError()

        user_pitts_queryset = Pitt.get_user_pitts_queryset(user)

        try:
            pagination = CursorPagination(user_pitts_queryset, request,
                                          ['-created_at'])
        except ValueError:
            raise ValidationError()

        current_page_pitts = [
            pitt.to_dict() for pitt in pagination.get_current_page()
        ]
        return pagination.get_paginated_dict(current_page_pitts)
    def post(cls, request, user_id):
        """
        Создание подписки клиентом
        :param user_id:
        :param request:
        :return:
        """
        if user_id != request.api_user.id:
            raise ForbiddenError()

        target_user_id = request.data['following_user_id']
        if user_id == target_user_id:
            raise NotFoundError()

        target_user = User.get(id=target_user_id)

        _, created = Follower.follow(target=target_user,
                                     follower=request.api_user)

        if not created:
            raise AlreadyExistsError()
        if target_user.email_notifications_enabled:
            cls.notify_target_user(request.api_user, target_user)
        return dict()