11
11
from urllib .parse import urlparse
12
12
13
13
from django .apps import apps
14
+ from django .conf import settings
14
15
from django .contrib .auth import get_user_model
15
16
from django .core .cache import cache
16
17
from django .core .exceptions import FieldDoesNotExist
17
18
from django .urls import reverse
18
19
from django .utils import timezone
19
- from django_q .models import Schedule
20
- from django_q .tasks import schedule
21
20
22
21
from appointment .logger_config import get_logger
23
22
from appointment .settings import (
26
25
)
27
26
from appointment .utils .date_time import combine_date_and_time , get_weekday_num
28
27
28
+ logger = get_logger (__name__ )
29
+
30
+ # Check if django-q is installed in settings
31
+ DJANGO_Q_AVAILABLE = 'django_q' in settings .INSTALLED_APPS
32
+
33
+ # Check if django-q is installed as a dependency
34
+ try :
35
+ from django_q .models import Schedule
36
+ from django_q .tasks import schedule
37
+
38
+ DJANGO_Q_AVAILABLE = True
39
+ except ImportError :
40
+ DJANGO_Q_AVAILABLE = False
41
+ Schedule = None
42
+ schedule = None
43
+ logger .warning ("django-q is not installed. Email reminders will not be scheduled." )
44
+
29
45
Appointment = apps .get_model ('appointment' , 'Appointment' )
30
46
AppointmentRequest = apps .get_model ('appointment' , 'AppointmentRequest' )
31
47
WorkingHours = apps .get_model ('appointment' , 'WorkingHours' )
37
53
EmailVerificationCode = apps .get_model ('appointment' , 'EmailVerificationCode' )
38
54
AppointmentRescheduleHistory = apps .get_model ('appointment' , 'AppointmentRescheduleHistory' )
39
55
40
- logger = get_logger (__name__ )
41
-
42
56
43
57
def calculate_slots (start_time , end_time , buffer_time , slot_duration ):
44
58
"""Calculate the available slots between the given start and end times using the given buffer time and slot duration
@@ -112,16 +126,17 @@ def create_and_save_appointment(ar, client_data: dict, appointment_data: dict, r
112
126
logger .info (f"New appointment created: { appointment .to_dict ()} " )
113
127
if appointment .want_reminder :
114
128
logger .info (f"User wants a reminder for appointment { appointment .id } , scheduling it..." )
115
- schedule_email_reminder (appointment , request )
129
+ if DJANGO_Q_AVAILABLE :
130
+ schedule_email_reminder (appointment , request )
131
+ else :
132
+ logger .warning (f"Email reminder requested for appointment { appointment .id } , but django-q is not available." )
116
133
return appointment
117
134
118
135
119
136
def schedule_email_reminder (appointment , request , appointment_datetime = None ):
120
137
"""Schedule an email reminder for the given appointment."""
121
- # Check if the Django-Q cluster is running
122
- from appointment .settings import check_q_cluster
123
- if not check_q_cluster ():
124
- logger .warning ("Django-Q cluster is not running. Email reminder will not be scheduled." )
138
+ if not DJANGO_Q_AVAILABLE :
139
+ logger .warning ("Django-Q is not available. Email reminder will not be scheduled." )
125
140
return
126
141
127
142
# Calculate reminder datetime if not provided
@@ -155,6 +170,9 @@ def update_appointment_reminder(appointment, new_date, new_start_time, request,
155
170
Updates or cancels the appointment reminder based on changes to the start time or date,
156
171
and the user's preference for receiving a reminder.
157
172
"""
173
+ if not DJANGO_Q_AVAILABLE :
174
+ logger .warning ("Django-Q is not available. Appointment reminder cannot be updated." )
175
+ return
158
176
# Convert new date and time strings to datetime objects for comparison
159
177
new_datetime = combine_date_and_time (new_date , new_start_time )
160
178
@@ -179,7 +197,7 @@ def update_appointment_reminder(appointment, new_date, new_start_time, request,
179
197
cancel_existing_reminder (appointment .id_request )
180
198
181
199
# If a reminder is still desired and the appointment is in the future, schedule a new one
182
- if want_reminder and new_datetime > timezone .now () and DJANGO_Q_AVAILABLE :
200
+ if want_reminder and new_datetime > timezone .now ():
183
201
schedule_email_reminder (appointment , request , new_datetime )
184
202
else :
185
203
logger .info (
@@ -195,6 +213,9 @@ def cancel_existing_reminder(appointment_id_request):
195
213
"""
196
214
Cancels any existing reminder for the appointment.
197
215
"""
216
+ if not DJANGO_Q_AVAILABLE :
217
+ logger .warning ("Django-Q is not available. Appointment reminder cannot be updated." )
218
+ return
198
219
task_name = f"reminder_{ appointment_id_request } "
199
220
Schedule .objects .filter (name = task_name ).delete ()
200
221
0 commit comments