def delete_reservation(request): if request.method =="DELETE" : status = "DELETE" r_id = request.DELETE.get('reservation_id', 'default_id') r = Reservation.objects.get(id=r_id) status = 'fail' except_type = '' try : CM = CalendarManager() delete_result = CM.delete_event(r.master.master_id, r.event_id) except Exception as e: except_type = str(type(e)) finally: try: Reservation.objects.filter(id=r_id).delete() except Exception as e: except_type = str(type(e)) else: status = 'success' result = {'status' : status, 'info' : {'master' : r.master.master_id, 'line_id' : r.customer.line_id, 'datetime' : r.datetime, 'name' : r.name, 'phone' : r.phone, 'reservation_id' : r.id, 'exception' : except_type } } return JsonResponse(result)
def inner_delete_reservation(self, reservation_id): r = Reservation.objects.get(id=reservation_id) status = 'fail' except_type = '' error = '' tztaipei = timezone(timedelta(seconds=28800)) now_time = datetime.now().astimezone(tztaipei) if r.datetime.astimezone(tztaipei) > now_time + timedelta(hours=48): try: CM = CalendarManager() delete_result = CM.delete_event(r.master.master_id, r.event_id) Reservation.objects.filter(id=reservation_id).update( is_cancelled=True) Reservation.objects.filter(id=reservation_id).update( cancel_time=now_time) reservation_datetime_str = datetime.strftime( r.datetime.astimezone(tztaipei), '%Y%m%d%H%M') print(r.master.master_id) if redis_manager.get_occupied_reservation( r.master.master_id, reservation_datetime_str): redis_manager.delete_occupied_reservation( r.master.master_id, reservation_datetime_str) status = 'success' except Exception as e: status = 'failure' error = "此筆預約似乎已取消過囉!如有問題請與客服聯繫" except_type = "google calendar 無法刪除 event" else: error = '48小時內無法取消預約,請聯絡真人客服喔。' result = { 'status': status, 'info': { 'master': r.master.master_id, 'line_id': r.customer.line_id, 'datetime': r.datetime, 'name': r.name, 'phone': r.phone, 'reservation_id': r.id, 'exception': except_type, 'error': error } } return result
def post_reservation(request): if request.method =="POST" : status = "POST" master_id = request.POST.get('master_id', 'default_mid') dt_str = request.POST.get('dt', 'default_time') line_id = request.POST.get('line_id', 'default_lineid') name = request.POST.get('name', 'default_name') phone = request.POST.get('phone', 'default_phone') m = Master.objects.get(master_id=master_id) c, created = Customer.objects.get_or_create( line_id=line_id, defaults={'name': name, 'phone': phone}, ) dt = datetime.strptime(dt_str, '%Y%m%d%H%M') dt.replace(tzinfo=pytz.timezone('Asia/Taipei')) obj, created = Reservation.objects.get_or_create( master=m, datetime=dt, defaults={'customer': c, 'name': name, 'phone': phone}, ) if created: CM = CalendarManager() event = CM.write_event(m.master_id, dt, (name + phone)) if event: obj, created = Reservation.objects.update_or_create( master=m, datetime=dt, defaults={'event_id': event['id']}, ) return JsonResponse({'status':'success' , 'info' : {'master' : m.master_id, 'line_id' : line_id, 'datetime' : dt_str, 'name' : name, 'phone' : phone, 'reservation_id' : obj.id, 'event_id' : event['id']} }) return JsonResponse({'status':'fail', 'info' : {}})
def get_freetime(request): if request.method =="GET" : status = "GET" interval = 3 delay = timedelta(days=0) now_time = datetime.now() tztaipei = timezone(timedelta(seconds=28800)) start_date = request.GET.get('start_date', None) if start_date is None: start_date = now_time.strftime('%Y%m%d') start_time = start_date + now_time.strftime('%H') start_time = datetime.strptime(start_time, '%Y%m%d%H') start_time = start_time.astimezone(tztaipei).replace(minute=0, second=0, microsecond=0) + delay end_time = start_time + timedelta(days=interval) #generate the working time set even_worktime_set = set() odd_worktime_set = set() all_time_set = set() for index in range(interval): d = start_time.date() + timedelta(days=1)*index for hour in range(8, 22): t = time(hour, 0) tmp = datetime.combine(d, t, tzinfo=tztaipei) all_time_set.add(tmp) #trim the time that before current time for date_time in [i for i in all_time_set if i > start_time]: if date_time.hour%2: odd_worktime_set.add(date_time) elif date_time.hour != 12: even_worktime_set.add(date_time) group_name = request.GET.get('group_name', 'A') g = MasterGroup.objects.get(name=group_name) m_list = Master.objects.filter(group=g) m_id = [m.master_id for m in m_list] m_name = [m.name for m in m_list] m_id_name = dict(zip(m_id,m_name)) CM = CalendarManager() busy_result = CM.get_busy(start_time, end_time, *m_id) #all_working_time set - busy_time set = free_time_set free_result = {} for m in m_list: if m.work_type == 1: free_result[m.master_id] = odd_worktime_set - busy_result[m.master_id] else: free_result[m.master_id] = even_worktime_set - busy_result[m.master_id] #reconstruct the data structure date_time = [] for index in range(interval): d = start_time.date() + timedelta(days=1)*index date_time.append({'date' : d.strftime('%Y%m%d'), 'time_list' : list()}) for master_id, freetime_list in free_result.items(): for freetime in freetime_list: if freetime.date() == d: date_time[index]['time_list'].append({'master_id' : master_id, 'master_name': m_id_name[master_id], 'time' : freetime.strftime('%H%M')}) date_time = sorted(date_time, key = lambda x : x['date']) for index in range(len(date_time)): time_list = date_time[index]['time_list'] date_time[index]['time_list'] = sorted(time_list, key = lambda x : x['time']) result = {'status' : 'success', "infos" : {'datetime' : date_time}} return JsonResponse(result)
def post_reservation(request): if request.method == "POST": status = "POST" master_id = request.POST.get('master_id', 'default_mid') dt_str = request.POST.get('dt', 'default_time') print(f"\n\n\n{dt_str}\n\n\n") if redis_manager.get_occupied_reservation(master_id, dt_str) is None: redis_manager.set_occupied_reservation(master_id, dt_str) line_id = request.POST.get('line_id', 'default_lineid') name = request.POST.get('name', 'default_name') phone = request.POST.get('phone', 'default_phone') gender = request.POST.get('gender', 'default_gender') age = request.POST.get('age', 'default_age') city = request.POST.get('city', 'default_city') district = request.POST.get('district', 'default_district') introducer = request.POST.get('introducer', '無') m = Master.objects.get(master_id=master_id) c, created = Customer.objects.get_or_create( line_id=line_id, defaults={ 'name': name, 'phone': phone, 'gender': gender, 'age': age, 'city': city, 'district': district, 'introducer': introducer, 'register_time': datetime.now() }, ) dt = datetime.strptime(dt_str, '%Y%m%d%H%M') dt.replace(tzinfo=pytz.timezone('Asia/Taipei')) # obj, created = Reservation.objects.get_or_create( # master=m, # datetime=dt, # appointment_time = datetime.now(), # is_cancelled = False, # defaults={'customer': c, 'name': name, 'phone': phone}, # ) # if created: CM = CalendarManager() try: event = CM.write_event(m.master_id, dt, (name + phone)) if event: obj, created = Reservation.objects.update_or_create( master=m, datetime=dt, appointment_time=datetime.now(), is_cancelled=False, defaults={ 'customer': c, 'name': name, 'phone': phone, 'event_id': event['id'] } # defaults={'event_id': event['id']}, ) # obj, created = Reservation.objects.get_or_create( # master=m, # datetime=dt, # appointment_time = datetime.now(), # is_cancelled = False, # defaults={'customer': c, 'name': name, 'phone': phone}, # ) return JsonResponse({ 'status': 'success', 'info': { 'master': m.master_id, 'line_id': line_id, 'datetime': dt_str, 'name': name, 'phone': phone, 'reservation_id': obj.id, 'event_id': event['id'] } }) except: redis_manager.delete_occupied_reservation(master_id, dt_str) return JsonResponse({ 'status': 'fail', 'error_code': 'F01', 'error_message': '此時段無法預約,請洽詢櫃檯服務。' }) #只要 status 是 fail 的話,就打 send fail reservation api return JsonResponse({ 'status': 'fail', 'error_code': 'F02', 'error_message': '此時段剛被預約,請選擇其他時段。' })
from django.db import models from datetime import datetime from test_app.google_calendar import CalendarManager CM = CalendarManager() class Customer(models.Model): line_id = models.CharField(max_length=128, primary_key=True) name = models.CharField(max_length=10) phone = models.CharField(max_length=10) is_black = models.BooleanField(default=False) def __str__(self): return "{}_{}".format(self.name, self.phone) class MasterGroup(models.Model): name = models.CharField(max_length=10) descript = models.CharField(max_length=30, default='') image = models.CharField(max_length=50, default='') def __str__(self): return "{}{}".format('group ', self.name) class Master(models.Model): master_id = models.CharField(max_length=10, primary_key=True) group = models.ForeignKey(MasterGroup, on_delete=models.CASCADE) name = models.CharField(max_length=10) work_type = models.IntegerField(