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))
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)
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)
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)
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)
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))
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)
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('取消关注成功')
def list(self, request, *args, **kwargs): return success_response('')
def destroy(self, request, *args, **kwargs): instance = self.get_object() self.before_destroy(instance) self.perform_destroy(instance) return success_response('删除成功')
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, '刷新失败,请稍后再试。')
def logout(self, request): logout(request) return success_response('退出登陆成功')
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('取消点赞成功')
def destroy(self, request, *args, **kwargs): return success_response('禁止删除')
def health(request): """Shallow health check.""" return success_response({"status": "OK"})
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)
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)
def health_handler(_): return success_response(status=200, data={"status": "ok"})
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))
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('设置成功')
def retrieve(self, request, *args, **kwargs): instance = self.get_object() self.before_retrieve(instance) serializer = self.get_serializer(instance) return success_response(serializer.data)