Exemple #1
0
    def post(self, request):
        # 获取到当前用户的id
        user = request.user
        # 获取到传入的参数
        dict_data = json.loads(request.body.decode())

        house_id = dict_data.get('house_id')
        start_date_str = dict_data.get('start_date')
        end_date_str = dict_data.get('end_date')

        # 校验参数
        if not all([house_id, start_date_str, end_date_str]):
            return http.JsonResponse({"errno": RET.PARAMERR, "errmsg": "参数错误"})

        try:
            start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")
            end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d")
            assert start_date < end_date, Exception('开始日期大于结束日期')
            # 计算出入住天数
            days = (end_date - start_date).days
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({"errno": RET.PARAMERR, "errmsg": "参数错误"})

        # 判断房屋是否存在
        try:
            house = House.objects.get(id=house_id)
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({"errno": RET.NODATA, "errmsg": "房屋不存在"})

        # 判断房屋是否是当前登录用户的
        if user.id == house.user.id:
            return http.JsonResponse({
                "errno": RET.ROLEERR,
                "errmsg": "不能订购自己的房间"
            })

        # 查询是否存在冲突的订单
        try:
            filters = {
                "house": house,
                "begin_date__lt": end_date,
                "end_date__gt": start_date
            }
            count = Order.objects.filter(**filters).count()
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({"errno": RET.DBERR, "errmsg": "数据库查询错误"})

        if count > 0:
            return http.JsonResponse({
                "errno": RET.DATAERR,
                "errmsg": "房间已经被预定"
            })

        amount = days * house.price
        # 生成订单的模型
        order = Order()
        order.user = user
        order.house = house
        order.begin_date = start_date
        order.end_date = end_date
        order.days = days
        order.house_price = house.price
        order.amount = amount

        try:
            order.save()
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({"errno": RET.DBERR, "errmsg": "数据库保存失败"})

        return http.JsonResponse({
            "errno": RET.OK,
            "errmsg": "发布成功",
            "data": {
                "order_id": order.pk
            }
        })