Beispiel #1
0
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        self.before_update(instance)
        serializer = self.get_serializer(instance,
                                         data=request.data,
                                         partial=partial)
        if serializer.is_valid():
            self.perform_update(serializer)
            if getattr(instance, '_prefetched_objects_cache', None):
                # If 'prefetch_related' has been applied to a queryset, we need to
                # forcibly invalidate the prefetch cache on the instance.
                instance._prefetched_objects_cache = {}

            return success_response(self.serializer_classes['retrieve'](
                instance, context=self.get_serializer_context()).data)
        else:
            return error_response(1, self.humanize_errors(serializer))
Beispiel #2
0
 def bulk_create(self, request):
     errors = []
     data = []
     sid = transaction.savepoint()
     for file in get_list(request.data, 'files'):
         serializer = FileModifySerializer(data={'file': file})
         if serializer.is_valid():
             instance = self.perform_create(serializer)
             data.append(
                 FileInlineSerializer(
                     instance, context=self.get_serializer_context()).data)
         else:
             errors.append(self.humanize_errors(serializer))
     if len(errors) == 0:
         transaction.savepoint_commit(sid)
         return success_response(data)
     else:
         transaction.savepoint_rollback(sid)
         return error_response(1, errors)
Beispiel #3
0
def retrieve_access_token(request):
    request_data = get_request_data(request.body)
    if request_data is None:
        return error_response("Invalid or missing fields in request body")

    refresh_token_payload = get_refresh_token_payload_if_active(
        request_data.refresh_token
    )
    if refresh_token_payload is None:
        return error_response("Refresh token is invalid")

    current_time = get_current_utc_time()
    access_token, access_token_payload = generate_access_token_for_user(
        refresh_token_payload["sub"], current_time
    )
    response_data = ResponseData(
        access_token=access_token,
        expiry_time=from_timestamp(access_token_payload["exp"]),
    )
    return success_response(response_data)
Beispiel #4
0
def revoke_refresh_token(request):
    """
    Revokes a refresh token. This revokes the tokens ability to generate new access
    tokens.

    Note: Existing access tokens generated by the revoked refresh token will continue to
    be valid until they expire.
    """
    request_data = get_request_data(request.body)
    if request_data is None:
        return error_response("Invalid or malformed request data")

    payload = get_refresh_token_payload_if_active(request_data.refresh_token)
    if payload is None:
        return error_response("Refresh token is invalid")

    success = delete_refresh_token(token_id=payload["jti"])
    if not success:
        logger.info(
            f"Attempt to delete non-existent token: sub={payload['sub']}, jti={payload['jti']}"
        )

    return success_response(status=204)
Beispiel #5
0
def create_move_handler(request):
    request_data = safe_parse_json(request.body)
    if request_data is None:
        return error_response(message="Could not parse request body as JSON")
    move_model = Move.from_dict(request_data)
    if not move_model.is_valid:
        return validation_error_response(move_model.validation_errors)

    start_location, end_location = get_locations_from_location_ids(
        request.user, move_model.start_location_id, move_model.end_location_id)
    if not start_location or not end_location:
        validation_errors = get_location_not_found_validation_errors(
            start_location_id=move_model.start_location_id,
            end_location_id=move_model.end_location_id,
            start_location=start_location,
            end_location=end_location,
        )
        return validation_error_response(validation_errors)

    db_move = create_move(start_location, end_location)

    response_dict = Move.from_db_model(db_move)
    return success_response(status=201, data=response_dict)
Beispiel #6
0
    def change_tel(self, request):
        try:
            tel = request.data['tel']
            code = request.data['code']
            user = request.user

            if is_tel(tel):
                check_sms_verify(tel, 3, code)
                if user.is_active:
                    if User.objects.filter(tel=tel).exists():
                        return error_response(5, '该手机号码已被他人绑定')
                    user.tel = tel
                    user.save()
                    return success_response('修改成功')
                else:
                    return error_response(4, '该用户未激活')
            else:
                return error_response(3, '请输入合法号码')
        except VerifyError as e:
            return error_response(2, e.message)
        except KeyError as e:
            return error_response(1, '获取参数{}失败'.format(e.__context__))
        except Exception as e:
            return error_response(1, str(e))
Beispiel #7
0
 def check(self, request, pk):
     to_user = self.get_object()
     if Follow.objects.filter(from_user=request.user, to_user=to_user).exists():
         return success_response(True)
     else:
         return success_response(False)
Beispiel #8
0
 def unfollow(self, request, pk):
     to_user = self.get_object()
     Follow.objects.filter(from_user=request.user, to_user=to_user).update(is_abandon=True)
     # 有好友关系则断开
     Friend.objects.filter(from_user=request.user, to_user=to_user).update(is_abandon=True)
     return success_response('取消关注成功')
Beispiel #9
0
 def list(self, request, *args, **kwargs):
     return success_response('')
Beispiel #10
0
 def destroy(self, request, *args, **kwargs):
     instance = self.get_object()
     self.before_destroy(instance)
     self.perform_destroy(instance)
     return success_response('删除成功')
Beispiel #11
0
 def refresh_im_token(self, request):
     if request.user.refresh_im_token():
         return success_response({'im_token': request.user.get_im_token()})
     else:
         return error_response(1, '刷新失败,请稍后再试。')
Beispiel #12
0
 def logout(self, request):
     logout(request)
     return success_response('退出登陆成功')
Beispiel #13
0
 def unlike(self, request, pk, *args, **kwargs):
     # 范围为我点过赞的帖子
     self.queryset = request.user.post_set.all()
     instance = self.get_object()
     instance.likes.remove(request.user)
     return success_response('取消点赞成功')
Beispiel #14
0
 def destroy(self, request, *args, **kwargs):
     return success_response('禁止删除')
Beispiel #15
0
def health(request):
    """Shallow health check."""
    return success_response({"status": "OK"})
Beispiel #16
0
 def likes_list(self, request, pk, *args, **kwargs):
     instance = self.get_object()
     serializer = UserListSerializer(instance.likes, many=True, context=self.get_serializer_context())
     return success_response(serializer.data)
Beispiel #17
0
def list_trips_handler(request):
    trips = get_trips_for_user(request.user)
    response_trips = [Trip.from_db_model(trip) for trip in trips]
    return success_response(data=response_trips)
Beispiel #18
0
def health_handler(_):
    return success_response(status=200, data={"status": "ok"})
Beispiel #19
0
 def update(self, request, *args, **kwargs):
     friend = self.get_object()
     try:
         if 'remark' in request.data:
             # A->B 只有A有修改备注权限
             if request.user == friend.from_user:
                 friend.remark = request.data['remark']
                 friend.save()
                 return success_response('设置备注成功')
             else:
                 return error_response(3, '无此权限')
         elif 'is_block' in request.data:
             # A->B 只有A有拉黑权限
             if request.user == friend.from_user:
                 is_block = str2bool(request.data['is_block'])
                 if is_block is not None:
                     friend.is_block = is_block
                     friend.save()
                     if is_block:
                         # 在融云上同步拉黑
                         friend.from_user.operate_black_list(
                             friend.to_user.id, 'add')
                         return success_response('拉黑用户成功')
                     else:
                         # 在融云上同步取消拉黑
                         friend.from_user.operate_black_list(
                             friend.to_user.id, 'remove')
                         return success_response('取消拉黑成功')
                 else:
                     return error_response(4, '参数错误(请输入合法布尔值)')
             else:
                 return error_response(3, '无此权限')
         elif 'state' in request.data:
             # A->B 只有B有接受/拒绝请求权限
             if request.user == friend.to_user:
                 if friend.state == FriendState.Pending:
                     if isdigit(request.data['state']):
                         state = int(request.data['state'])
                         # 接受请求
                         if state == FriendState.Agree:
                             friend.state = state
                             friend.agree_time = timezone.now()
                             friend.save()
                             # 反向设置B->A
                             friend_from, is_created = self.get_queryset(
                             ).get_or_create(from_user=friend.to_user,
                                             to_user=friend.from_user)
                             friend_from.state = state
                             friend_from.agree_time = timezone.now()
                             friend_from.remark = friend.from_user.get_full_name(
                             )
                             friend_from.save()
                             # TODO 向用户A推送B通过了他的好友请求
                             try:
                                 jpush.audience(
                                     friend.from_user.id, '请求通过',
                                     '用户{}通过了你的好友请求'.format(
                                         request.user.get_full_name()),
                                     {'operation': 'friend_pass'})
                             except PushError as e:
                                 logging.error('{} {}'.format(
                                     e.code, e.message))
                             return success_response('添加好友成功')
                         # 拒绝请求
                         elif state == FriendState.Reject:
                             friend.state = state
                             friend.save()
                             return success_response('拒绝请求成功')
                         else:
                             return error_response(4, '参数错误')
                     else:
                         return error_response(4, '参数错误(state为数字)')
                 else:
                     return error_response(5, '不可再次处理该请求')
             else:
                 return error_response(3, '无此权限')
         else:
             return error_response(4, '参数错误')
     except Exception as e:
         import traceback
         traceback.print_exc()
         return error_response(1, str(e))
Beispiel #20
0
 def set_post_block(self, request, *args, **kwargs):
     self.get_queryset().filter(
         id__in=get_list(request.data, 'post_block_list')).update(
             is_post_block=True)
     return success_response('设置成功')
Beispiel #21
0
 def retrieve(self, request, *args, **kwargs):
     instance = self.get_object()
     self.before_retrieve(instance)
     serializer = self.get_serializer(instance)
     return success_response(serializer.data)