예제 #1
0
def storeCreate(request):


    if request.method == 'GET':
        snippets = ColdStorage.objects.all()
        serializer = ColdStorageSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        print(data['owner'])
        arr = data['yield']
        del data['yield']
        var = 1
        for i in arr:
           tmp = dict()
           tmp = dict()
           tmp['yieldType'] = i[0]
           tmp['space'] = i[1]
           tmp['empty'] = i[2]
           tmp1 = data.copy()
           tmp1.update(tmp)
           print(tmp1)

           serializer = ColdStorageSerializer(data=tmp1)
           if serializer.is_valid():
              serializer.save()
              var*=1
           else:
              var*=0
        if var == 1:
            return JsonResponse("created", status=201,safe=False)
        else :
            return JsonResponse(serializer.errors, status=400)
예제 #2
0
def reservation_new(request):
    token_payload = request.META.get('TOKEN_PAYLOAD')
    if token_payload.get('id'):
        try:
            user = Member.objects.get(id=token_payload.get('id'))
        except Member.DoesNotExist:
            return JsonResponse({'message': 'The member does not exist'},
                                status=status.HTTP_404_NOT_FOUND)
    else:
        return JsonResponse({'message': 'Permission Denied'},
                            status=status.HTTP_403_FORBIDDEN)

    if request.method == 'GET':
        therapist_id = request.GET.get('therapist_id', '')
        duration = request.GET.get('duration', '')
        time = request.GET.get('time', '')
        if duration == '':
            return JsonResponse({'message': 'duration must be given.'},
                                status.HTTP_400_BAD_REQUEST)
        if time == '':
            return JsonResponse({'message': 'time must be given.'},
                                status.HTTP_400_BAD_REQUEST)

        time = int(time)
        time_near = time + (900 - time % 900)
        time_date = time - ((time + 28800) % 86400)
        time_10am = time_date + 3600 * 10
        begin = datetime.fromtimestamp(time_10am)
        end = datetime.fromtimestamp(time_10am + 3600 * 14)

        if therapist_id == '':
            reservations = Reservation.objects(
                __raw__={
                    '$or': [
                        {
                            'start_time': {
                                '$lte': end
                            },
                            'end_time': {
                                '$gte': end
                            }
                        },
                        {
                            'start_time': {
                                '$lte': begin
                            },
                            'end_time': {
                                '$gte': begin
                            }
                        },
                        {
                            'start_time': {
                                '$gte': begin
                            },
                            'end_time': {
                                '$lte': end
                            }
                        },
                        {
                            'start_time': {
                                '$lte': begin
                            },
                            'end_time': {
                                '$gte': end
                            }
                        },
                    ]
                })

            calendars = Calendar.objects(
                __raw__={
                    '$or': [
                        {
                            'time_begin': {
                                '$lte': end
                            },
                            'time_end': {
                                '$gte': end
                            }
                        },
                        {
                            'time_begin': {
                                '$lte': begin
                            },
                            'time_end': {
                                '$gte': begin
                            }
                        },
                        {
                            'time_begin': {
                                '$gte': begin
                            },
                            'time_end': {
                                '$lte': end
                            }
                        },
                        {
                            'time_begin': {
                                '$lte': begin
                            },
                            'time_end': {
                                '$gte': end
                            }
                        },
                    ]
                })
        elif therapist_id != '':
            reservations = Reservation.objects(
                __raw__={
                    '$or': [
                        {
                            'start_time': {
                                '$lte': end
                            },
                            'end_time': {
                                '$gte': end
                            }
                        },
                        {
                            'start_time': {
                                '$lte': begin
                            },
                            'end_time': {
                                '$gte': begin
                            }
                        },
                        {
                            'start_time': {
                                '$gte': begin
                            },
                            'end_time': {
                                '$lte': end
                            }
                        },
                        {
                            'start_time': {
                                '$lte': begin
                            },
                            'end_time': {
                                '$gte': end
                            }
                        },
                    ]
                }).filter(therapist_id=therapist_id)

            calendars = Calendar.objects(
                __raw__={
                    '$or': [
                        {
                            'time_begin': {
                                '$lte': end
                            },
                            'time_end': {
                                '$gte': end
                            }
                        },
                        {
                            'time_begin': {
                                '$lte': begin
                            },
                            'time_end': {
                                '$gte': begin
                            }
                        },
                        {
                            'time_begin': {
                                '$gte': begin
                            },
                            'time_end': {
                                '$lte': end
                            }
                        },
                        {
                            'time_begin': {
                                '$lte': begin
                            },
                            'time_end': {
                                '$gte': end
                            }
                        },
                    ]
                }).filter(therapist_id=therapist_id)
        if time_10am >= time_near:
            n = (3600 * 14 // 900)
        else:
            n = ((time_10am + 3600 * 14) - (time_near - time_10am) // 900)
        avliable_time = []
        if therapist_id == '':
            therapists = Therapist.objects.all()
            for i in range(n + 1):
                if time_10am > time_near:
                    start = time_10am + (i) * 900
                    over = start + int(duration) * 60 + 1800
                else:
                    start = time_near + (i) * 900
                    over = start + int(duration) * 60 + 1800
                start = datetime.fromtimestamp(start)
                over = datetime.fromtimestamp(over)
                if over > end:
                    break
                if len(reservations) == 0:
                    avliable_time.append(int(datetime.timestamp(start)) + 900)

                else:
                    therapists_list = []
                    for reservation in reservations:
                        start_time = reservation['start_time'] - \
                            timedelta(
                            minutes=(reservation['buffer_start']))
                        end_time = reservation['end_time'] + \
                            timedelta(
                            minutes=(reservation['buffer_end']))

                        if (start < start_time and over > start_time) or (
                                start == start_time and over > start_time
                        ) or (start < start_time and over > end_time) or (
                                start > start_time and over < end_time) or (
                                    start < end_time and over == end_time) or (
                                        start < end_time and over > end_time):
                            if reservation[
                                    'therapist_id'] not in therapists_list:
                                therapists_list.append(
                                    reservation['therapist_id'])

                    if len(therapists_list) != len(therapists):
                        avliable_time.append(
                            int(datetime.timestamp(start)) + 900)

            return JsonResponse(avliable_time,
                                safe=False,
                                status=status.HTTP_200_OK)

        elif therapist_id != '':
            for i in range(n):
                c = 0
                if time_10am > time_near:
                    start = time_10am + (i) * 900
                    over = start + int(duration) * 60 + 1800
                else:
                    start = time_near + (i) * 900
                    over = start + int(duration) * 60 + 1800
                start = datetime.fromtimestamp(start)
                over = datetime.fromtimestamp(over)
                if over > end:
                    break
                if len(reservations) == 0:
                    avliable_time.append(int(datetime.timestamp(start)) + 900)

                else:
                    for reservation in reservations:

                        start_time = reservation['start_time'] - \
                            timedelta(
                            minutes=(reservation['buffer_start']))
                        end_time = reservation['end_time'] + \
                            timedelta(
                            minutes=(reservation['buffer_end']))

                        if (start < start_time and over > start_time) or (
                                start == start_time and over > start_time
                        ) or (start < start_time and over > end_time) or (
                                start > start_time and over < end_time) or (
                                    start < end_time and over == end_time) or (
                                        start < end_time and over > end_time):
                            c += 1
                            break

                    if c == 0:
                        avliable_time.append(
                            int(datetime.timestamp(start)) + 900)
                        print(
                            datetime.fromtimestamp(
                                int(datetime.timestamp(start)) + 900))
            return JsonResponse(avliable_time,
                                safe=False,
                                status=status.HTTP_200_OK)

    elif request.method == 'POST':
        reservation_data = JSONParser().parse(request)
        reservation_data["member_id"] = user.id
        total_price = 0
        duration_min = 0
        if user['vip'] is True:
            for service_id in reservation_data["services_id"]:
                try:
                    service = Service.objects.get(id=service_id)
                    service['price'] *= service['vip_per']

                    total_price += service['price']
                    duration_min += service['duration']
                except Service.DoesNotExist:
                    return JsonResponse(
                        {'message': 'The service does not exist'},
                        status=status.HTTP_404_NOT_FOUND)
        else:
            for service_id in reservation_data["services_id"]:
                try:
                    service = Service.objects.get(id=service_id)

                    if service['minus'] != 0:
                        if service['price'] <= service['minus']:
                            service['price'] = 0
                        else:
                            service['price'] -= service['minus']
                    else:
                        service['price'] *= service['nor_per']

                    total_price += service['price']
                    duration_min += service['duration']
                except Service.DoesNotExist:
                    return JsonResponse(
                        {'message': 'The service does not exist'},
                        status=status.HTTP_404_NOT_FOUND)

        reservation_data['total_price'] = int(total_price)

        reservation_data['end_time'] = int(
            reservation_data['start_time']) + int(duration_min) * 60
        time = int(reservation_data['start_time'])
        time_date = time - ((time + 28800) % 86400)
        time_10am = time_date + 3600 * 10

        if not ('therapist_id' in reservation_data.keys()):
            avliable_therapist = []
            begin = datetime.fromtimestamp(time_date)
            end = datetime.fromtimestamp(time_10am + 3600 * 14)
            for therapist in Therapist.objects.all():
                c = 0
                reservations = Reservation.objects(therapist_id=therapist.id,
                                                   __raw__={
                                                       '$or': [
                                                           {
                                                               'start_time': {
                                                                   '$lte': end
                                                               },
                                                               'end_time': {
                                                                   '$gte': end
                                                               }
                                                           },
                                                           {
                                                               'start_time': {
                                                                   '$lte':
                                                                   begin
                                                               },
                                                               'end_time': {
                                                                   '$gte':
                                                                   begin
                                                               }
                                                           },
                                                           {
                                                               'start_time': {
                                                                   '$gte':
                                                                   begin
                                                               },
                                                               'end_time': {
                                                                   '$lte': end
                                                               }
                                                           },
                                                           {
                                                               'start_time': {
                                                                   '$lte':
                                                                   begin
                                                               },
                                                               'end_time': {
                                                                   '$gte': end
                                                               }
                                                           },
                                                       ]
                                                   })

                calendars = Calendar.objects(therapist_id=therapist.id,
                                             __raw__={
                                                 '$or': [
                                                     {
                                                         'time_begin': {
                                                             '$lte': end
                                                         },
                                                         'time_end': {
                                                             '$gte': end
                                                         }
                                                     },
                                                     {
                                                         'time_begin': {
                                                             '$lte': begin
                                                         },
                                                         'time_end': {
                                                             '$gte': begin
                                                         }
                                                     },
                                                     {
                                                         'time_begin': {
                                                             '$gte': begin
                                                         },
                                                         'time_end': {
                                                             '$lte': end
                                                         }
                                                     },
                                                     {
                                                         'time_begin': {
                                                             '$lte': begin
                                                         },
                                                         'time_end': {
                                                             '$gte': end
                                                         }
                                                     },
                                                 ]
                                             })

                if (len(reservations) + len(calendars)) == 0:
                    avliable_therapist.append(therapist.id)

                else:
                    start = datetime.fromtimestamp(
                        int(reservation_data['start_time']) - 900)
                    over = datetime.fromtimestamp(
                        int(reservation_data['end_time']) + 900)
                    for reservation in reservations:
                        start_time = reservation['start_time'] - \
                            timedelta(
                            minutes=(reservation['buffer_start']))
                        end_time = reservation['end_time'] + \
                            timedelta(
                            minutes=(reservation['buffer_end']))

                        if (start < start_time and over > start_time) or (
                                start == start_time and over > start_time
                        ) or (start < start_time and over > end_time) or (
                                start > start_time and over < end_time) or (
                                    start < end_time and over == end_time) or (
                                        start < end_time and over > end_time):
                            c += 1
                            break

                    if c == 0:
                        avliable_therapist.append(str(therapist.id))

            if avliable_therapist != []:
                random.shuffle(avliable_therapist)
                reservation_data['therapist_id'] = avliable_therapist[0]
            else:
                return JsonResponse(avliable_therapist,
                                    safe=False,
                                    status=status.HTTP_201_CREATED)

        begin = datetime.fromtimestamp(time_date)
        end = datetime.fromtimestamp(time_10am + 3600 * 14)

        reservations = Reservation.objects(
            __raw__={
                '$or': [
                    {
                        'start_time': {
                            '$lte': end
                        },
                        'end_time': {
                            '$gte': end
                        }
                    },
                    {
                        'start_time': {
                            '$lte': begin
                        },
                        'end_time': {
                            '$gte': begin
                        }
                    },
                    {
                        'start_time': {
                            '$gte': begin
                        },
                        'end_time': {
                            '$lte': end
                        }
                    },
                    {
                        'start_time': {
                            '$lte': begin
                        },
                        'end_time': {
                            '$gte': end
                        }
                    },
                ]
            }).filter(therapist_id=ObjectId(reservation_data['therapist_id']))

        calendars = Calendar.objects(
            __raw__={
                '$or': [
                    {
                        'time_begin': {
                            '$lte': end
                        },
                        'time_end': {
                            '$gte': end
                        }
                    },
                    {
                        'time_begin': {
                            '$lte': begin
                        },
                        'time_end': {
                            '$gte': begin
                        }
                    },
                    {
                        'time_begin': {
                            '$gte': begin
                        },
                        'time_end': {
                            '$lte': end
                        }
                    },
                    {
                        'time_begin': {
                            '$lte': begin
                        },
                        'time_end': {
                            '$gte': end
                        }
                    },
                ]
            }).filter(therapist_id=ObjectId(reservation_data['therapist_id']))

        if (len(calendars) + len(reservations)) != 0:
            start = datetime.fromtimestamp(
                int(reservation_data['start_time']) - 900)
            over = datetime.fromtimestamp(
                int(reservation_data['end_time']) + 900)
            for reservation in reservations:
                start_time = reservation['start_time'] - \
                    timedelta(
                    minutes=(reservation['buffer_start']))
                end_time = reservation['end_time'] + \
                    timedelta(
                    minutes=(reservation['buffer_end']))

                if (start < start_time and over > start_time) or (
                        start == start_time and over > start_time) or (
                            start < start_time and over > end_time) or (
                                start > start_time and over < end_time) or (
                                    start < end_time and over == end_time) or (
                                        start < end_time and over > end_time):

                    return JsonResponse(
                        {
                            'message':
                            'sorry! time interval had been taken by others.'
                        },
                        status=status.HTTP_400_BAD_REQUEST)

        if user['balance'] >= total_price >= 0:
            user['balance'] -= total_price
            user.save()

        else:
            return JsonResponse({'message': 'User balance not enough.'},
                                status=status.HTTP_402_PAYMENT_REQUIRED)

        reservation_fordb = reservation_data.copy()
        reservation_fordb['start_time'] = datetime.fromtimestamp(
            int(reservation_fordb['start_time']) + 3600 * 8)
        reservation_fordb['end_time'] = datetime.fromtimestamp(
            int(reservation_fordb['end_time']) + 3600 * 8)
        services = []
        for service_id in reservation_data['services_id']:
            try:
                service = Service.objects.get(
                    id=ObjectId(str(service_id))).to_json()

                service = json.loads(service, encoding='utf-8')
                service['id'] = str(service['_id']['$oid'])
                service.pop('_id')
                service.pop('long_description')
                services.append(service)
            except Service.DoesNotExist:
                return JsonResponse({'message': 'Service does not exists.'},
                                    status=status.HTTP_400_BAD_REQUEST)

        reservation_fordb['services_id'] = services
        reservation_data['services_id'] = services
        try:
            address = Address.objects.get(
                id=reservation_fordb['address']).to_json()
            reservation_fordb['address'] = json.loads(address,
                                                      encoding='utf-8')
            reservation_fordb['address']['id'] = str(
                reservation_fordb['address']['_id']['$oid'])
            reservation_fordb['address'].pop('_id')
            reservation_fordb['address'].pop('member_id')
            reservation_data['address'] = reservation_fordb['address']

        except Address.DoesNotExist:
            return JsonResponse({'message': 'Address does not exists'},
                                status=status.HTTP_400_BAD_REQUEST)
        serializer_2 = ReservationSerializer(data=reservation_fordb)

        if serializer_2.is_valid():
            serializer_2.save()
        reservation = Reservation.objects.get(id=serializer_2.data['id'])
        reservation_data['id'] = str(reservation.id)
        reservation_data['member_id'] = str(reservation.member_id)
        reservation_data['therapist_id'] = str(reservation.therapist_id)

        return JsonResponse(reservation_data, status=status.HTTP_201_CREATED)