16
16
from django .utils .translation import gettext as _ , gettext_lazy as _
17
17
18
18
from appointment .forms import PersonalInformationForm , ServiceForm , StaffDaysOffForm , StaffWorkingHoursForm
19
+ from appointment .messages_ import appt_updated_successfully
19
20
from appointment .settings import APPOINTMENT_PAYMENT_URL
20
- from appointment .utils .date_time import convert_12_hour_time_to_24_hour_time , convert_str_to_time , get_ar_end_time
21
- from appointment .utils .db_helpers import Appointment , EmailVerificationCode , Service , StaffMember , WorkingHours , \
22
- calculate_slots , calculate_staff_slots , check_day_off_for_staff , create_new_user , day_off_exists_for_date_range , \
23
- exclude_booked_slots , get_all_appointments , get_all_staff_members , get_appointment_by_id , \
24
- get_appointments_for_date_and_time , get_staff_member_appointment_list , get_staff_member_from_user_id_or_logged_in , \
25
- get_times_from_config , get_user_by_email , get_working_hours_for_staff_and_day , working_hours_exist
21
+ from appointment .utils .date_time import (
22
+ convert_12_hour_time_to_24_hour_time , convert_str_to_date , convert_str_to_time , get_ar_end_time )
23
+ from appointment .utils .db_helpers import (
24
+ Appointment , AppointmentRequest , EmailVerificationCode , Service , StaffMember , WorkingHours , calculate_slots ,
25
+ calculate_staff_slots , check_day_off_for_staff , create_and_save_appointment , create_new_user ,
26
+ day_off_exists_for_date_range , exclude_booked_slots , get_all_appointments , get_all_staff_members ,
27
+ get_appointment_by_id , get_appointments_for_date_and_time , get_staff_member_appointment_list ,
28
+ get_staff_member_from_user_id_or_logged_in , get_times_from_config , get_user_by_email ,
29
+ get_working_hours_for_staff_and_day , working_hours_exist )
26
30
from appointment .utils .error_codes import ErrorCode
27
- from appointment .utils .json_context import get_generic_context , json_response
31
+ from appointment .utils .json_context import convert_appointment_to_json , get_generic_context , json_response
28
32
from appointment .utils .permissions import check_entity_ownership
29
33
from appointment .utils .session import handle_email_change
30
34
@@ -65,7 +69,7 @@ def prepare_appointment_display_data(user, appointment_id):
65
69
return None , None , _ ("You are not authorized to view this appointment." ), 403
66
70
67
71
# Prepare the data for display
68
- page_title = _ ("Appointment details: {client_name}" ).format (client_name = appointment .get_client_name ())
72
+ page_title = _ ("Appointment details" ) + _ ( " : {client_name}" ).format (client_name = appointment .get_client_name ())
69
73
if user .is_superuser :
70
74
page_title += f' (by: { appointment .get_staff_member_name ()} )'
71
75
@@ -300,16 +304,9 @@ def get_working_hours_and_days_off_context(request, btn_txt, form_name, form, us
300
304
return context
301
305
302
306
303
- def save_appointment (appt , client_name , client_email , start_time , phone_number , client_address , service_id ):
307
+ def save_appointment (appt , client_name , client_email , start_time , phone_number , client_address , service_id ,
308
+ want_reminder = False , additional_info = None ):
304
309
"""Save an appointment's details.
305
-
306
- :param appt: The appointment to modify.
307
- :param client_name: The name of the client.
308
- :param client_email: The email of the client.
309
- :param start_time: The start time of the appointment.
310
- :param phone_number: The phone number of the client.
311
- :param client_address: The address of the client.
312
- :param service_id: The ID of the service.
313
310
:return: The modified appointment.
314
311
"""
315
312
# Modify and save client details
@@ -335,6 +332,8 @@ def save_appointment(appt, client_name, client_email, start_time, phone_number,
335
332
# Modify and save appointment details
336
333
appt .phone = phone_number
337
334
appt .address = client_address
335
+ appt .want_reminder = want_reminder
336
+ appt .additional_info = additional_info
338
337
appt .save ()
339
338
return appt
340
339
@@ -536,3 +535,81 @@ def handle_service_management_request(post_data, files_data=None, service_id=Non
536
535
return None , False , get_error_message_in_form (form = form )
537
536
except Exception as e :
538
537
return None , False , str (e )
538
+
539
+
540
+ def create_new_appointment (data , request ):
541
+ service = Service .objects .get (id = data .get ("service_id" ))
542
+ staff_member = StaffMember .objects .get (user = request .user )
543
+
544
+ # Convert date and start time strings to datetime objects
545
+ date = convert_str_to_date (data .get ("date" ))
546
+ start_time = convert_str_to_time (data .get ("start_time" ))
547
+ start_datetime = datetime .datetime .combine (date , start_time )
548
+
549
+ appointment_request = AppointmentRequest (
550
+ date = start_datetime .date (),
551
+ start_time = start_datetime .time (),
552
+ end_time = (start_datetime + service .duration ).time (),
553
+ service = service ,
554
+ staff_member = staff_member ,
555
+ )
556
+ appointment_request .full_clean () # Validates the model
557
+ appointment_request .save ()
558
+
559
+ # Prepare client data
560
+ email = data .get ("client_email" , "" )
561
+ name_parts = data .get ("client_name" , "" ).split ()
562
+ first_name = name_parts [0 ] if name_parts else ""
563
+ last_name = name_parts [- 1 ] if len (name_parts ) > 1 else "" # Use an empty string if no last name
564
+
565
+ client_data = {
566
+ 'email' : email ,
567
+ 'first_name' : first_name ,
568
+ 'last_name' : last_name ,
569
+ }
570
+
571
+ # Use your custom user creation logic
572
+ user = get_user_by_email (email )
573
+ if not user :
574
+ create_new_user (client_data )
575
+
576
+ # Create and save the new appointment
577
+ appointment_data = {
578
+ 'phone' : data .get ("client_phone" , "" ),
579
+ 'address' : data .get ("client_address" , "" ),
580
+ 'want_reminder' : data .get ("want_reminder" ) == 'true' ,
581
+ 'additional_info' : data .get ("additional_info" , "" ),
582
+ 'paid' : False
583
+ }
584
+ appointment = create_and_save_appointment (appointment_request , client_data , appointment_data )
585
+ appointment_list = convert_appointment_to_json (request , [appointment ])
586
+
587
+ return json_response ("Appointment created successfully." , custom_data = {'appt' : appointment_list })
588
+
589
+
590
+ def update_existing_appointment (data , request ):
591
+ try :
592
+ appt = Appointment .objects .get (id = data .get ("appointment_id" ))
593
+ print (f"want_reminder: { data .get ('want_reminder' )} " )
594
+ want_reminder = data .get ("want_reminder" ) == 'true'
595
+ appt = save_appointment (
596
+ appt ,
597
+ client_name = data .get ("client_name" ),
598
+ client_email = data .get ("client_email" ),
599
+ start_time = data .get ("start_time" ),
600
+ phone_number = data .get ("client_phone" ),
601
+ client_address = data .get ("client_address" ),
602
+ service_id = data .get ("service_id" ),
603
+ want_reminder = want_reminder ,
604
+ additional_info = data .get ("additional_info" )
605
+ )
606
+ appointments_json = convert_appointment_to_json (request , [appt ])[0 ]
607
+ return json_response (appt_updated_successfully , custom_data = {'appt' : appointments_json })
608
+ except Appointment .DoesNotExist :
609
+ return json_response ("Appointment does not exist." , status = 404 , success = False ,
610
+ error_code = ErrorCode .APPOINTMENT_NOT_FOUND )
611
+ except Service .DoesNotExist :
612
+ return json_response ("Service does not exist." , status = 404 , success = False ,
613
+ error_code = ErrorCode .SERVICE_NOT_FOUND )
614
+ except Exception as e :
615
+ return json_response (str (e .args [0 ]), status = 400 , success = False )
0 commit comments