Skip to content

Commit 05dbfd7

Browse files
authored
Merge branch 'main' into dependabot/pip/pillow-10.3.0
2 parents aff7ad0 + 271829d commit 05dbfd7

File tree

11 files changed

+480
-267
lines changed

11 files changed

+480
-267
lines changed

appointment/forms.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,46 @@ class Meta:
117117
}
118118

119119

120+
class StaffMemberForm(forms.ModelForm):
121+
class Meta:
122+
model = StaffMember
123+
fields = ['user', 'services_offered', 'slot_duration', 'lead_time', 'finish_time',
124+
'appointment_buffer_time', 'work_on_saturday', 'work_on_sunday']
125+
widgets = {
126+
'user': forms.Select(attrs={'class': 'form-control'}),
127+
'service_offered': forms.Select(attrs={'class': 'form-control'}),
128+
'slot_duration': forms.NumberInput(attrs={
129+
'class': 'form-control',
130+
'placeholder': _('Example value: 30, 60, 90, 120... (in minutes)')
131+
}),
132+
'lead_time': forms.TimeInput(attrs={
133+
'class': 'form-control',
134+
'placeholder': _('Example value: 08:00:00, 09:00:00... (24-hour format)')
135+
}),
136+
'finish_time': forms.TimeInput(attrs={
137+
'class': 'form-control',
138+
'placeholder': _('Example value: 17:00:00, 18:00:00... (24-hour format)')
139+
}),
140+
'appointment_buffer_time': forms.NumberInput(attrs={
141+
'class': 'form-control',
142+
'placeholder': _('Example value: 15, 30, 45, 60... (in minutes)')
143+
}),
144+
'work_on_saturday': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
145+
'work_on_sunday': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
146+
}
147+
148+
def __init__(self, *args, **kwargs):
149+
super(StaffMemberForm, self).__init__(*args, **kwargs)
150+
# Exclude users who are already staff members
151+
existing_staff_user_ids = StaffMember.objects.values_list('user', flat=True)
152+
# Filter queryset for user field to include only superusers or users not already staff members
153+
self.fields['user'].queryset = get_user_model().objects.filter(
154+
is_superuser=True
155+
).exclude(id__in=existing_staff_user_ids) | get_user_model().objects.exclude(
156+
id__in=existing_staff_user_ids
157+
)
158+
159+
120160
class StaffDaysOffForm(forms.ModelForm):
121161
class Meta:
122162
model = DayOff

appointment/services.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,8 @@ def handle_service_management_request(post_data, files_data=None, service_id=Non
561561

562562
def create_new_appointment(data, request):
563563
service = Service.objects.get(id=data.get("service_id"))
564+
print(f"service id {data.get('service_id')}")
565+
print(f"Service: {service}")
564566
staff_id = data.get("staff_id")
565567
if staff_id:
566568
staff_member = StaffMember.objects.get(id=staff_id)

appointment/static/css/app_admin/staff_member.css

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
/* staff_form.css */
22
.staff-form-wrapper {
3-
margin: 30px auto;
4-
padding: 20px 0;
3+
margin: 15px auto;
4+
padding: 10px 0;
55
}
66

77
.staff-form-content {
88
padding: 20px;
99
border: 1px solid #ddd;
1010
border-radius: 5px;
11-
max-width: 800px;
11+
max-width: 1100px;
1212
margin: 0 auto;
1313
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
1414
}
1515

16-
h2 {
16+
h3 {
1717
border-bottom: 1px solid #e0e0e0;
1818
padding-bottom: 15px;
19-
margin-bottom: 30px;
20-
font-weight: 600;
19+
margin-bottom: 20px;
20+
font-weight: 500;
2121
}
2222

2323
.form-group {
@@ -27,12 +27,12 @@ h2 {
2727
.form-group label {
2828
display: block;
2929
margin-bottom: 8px;
30-
font-weight: 600;
30+
font-weight: 500;
3131
}
3232

3333
.form-control {
3434
width: 100%;
35-
padding: 10px;
35+
padding: 2px 10px;
3636
border: 1px solid #ccc;
3737
border-radius: 5px;
3838
transition: border 0.3s;
@@ -44,7 +44,7 @@ h2 {
4444
}
4545

4646
.form-check {
47-
margin-bottom: 20px;
47+
margin-bottom: 10px;
4848
}
4949

5050
.form-check label {
@@ -65,3 +65,28 @@ h2 {
6565
.btn:hover {
6666
background-color: #0056b3;
6767
}
68+
69+
/* ############################### */
70+
.user-not-found {
71+
margin-top: 2px;
72+
margin-bottom: 20px;
73+
padding: 5px;
74+
background-color: #f9f9f9;
75+
border-radius: 4px;
76+
font-size: 0.9rem;
77+
}
78+
79+
.user-not-found a {
80+
color: #007bff;
81+
text-decoration: underline;
82+
}
83+
84+
.user-not-found small {
85+
color: #666;
86+
}
87+
88+
small {
89+
color: #3d3d3d;
90+
font-size: 12px;
91+
}
92+

appointment/templates/administration/manage_staff_member.html

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,51 @@
1010
<section class="content content-wrapper">
1111
<div class="staff-form-wrapper">
1212
<div class="staff-form-content">
13-
<h2>{% trans 'Staff Appointment Information' %}</h2>
13+
<h3>{% trans 'Staff Appointment Information' %}</h3>
1414
<form method="post">
1515
{% csrf_token %}
16+
{% if form.user %}
17+
<div class="form-group">
18+
{{ form.user.label_tag }}
19+
{{ form.user.errors }}
20+
{{ form.user }}
21+
</div>
22+
<div class="user-not-found">
23+
<small>
24+
{% translate 'User not found' %} ? <a href="{% url 'appointment:add_staff_member_personal_info' %}">{% translate 'Create staff member manually' %}</a>
25+
</small>
26+
</div>
27+
{% endif %}
1628

1729
<div class="form-group">
1830
{{ form.services_offered.label_tag }}
1931
{{ form.services_offered.errors }}
2032
{{ form.services_offered }}
33+
<br><small>{% trans 'Hold down “Control”, or “Command” on a Mac, to select more than one.' %}</small>
2134
</div>
2235

2336
<div class="form-group">
24-
{{ form.slot_duration.label_tag }}
37+
{{ form.slot_duration.label_tag }}
2538
{{ form.slot_duration }}
39+
<small>{{ form.slot_duration.help_text }}</small>
2640
</div>
2741

2842
<div class="form-group">
2943
{{ form.lead_time.label_tag }}
3044
{{ form.lead_time }}
45+
<small>{{ form.lead_time.help_text }}</small>
3146
</div>
3247

3348
<div class="form-group">
3449
{{ form.finish_time.label_tag }}
3550
{{ form.finish_time }}
51+
<small>{{ form.finish_time.help_text }}</small>
3652
</div>
3753

3854
<div class="form-group">
3955
{{ form.appointment_buffer_time.label_tag }}
4056
{{ form.appointment_buffer_time }}
57+
<small>{{ form.appointment_buffer_time.help_text }}</small>
4158
</div>
4259

4360
<div class="form-check">

appointment/templates/administration/manage_staff_personal_info.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<section class="content content-wrapper">
1111
<div class="staff-form-wrapper">
1212
<div class="staff-form-content">
13-
<h2>{% trans 'Staff Personal Information' %}</h2>
13+
<h3>{% trans 'Staff Personal Information' %}</h3>
1414
<form id="updatePersonalInfoForm" method="post" action="">
1515
{% csrf_token %}
1616

appointment/templates/administration/staff_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ <h2 class="section-header-itm">{% trans 'Staff Members' %}</h2>
2525
class="modify-btn button-color-purple">
2626
{{ btn_staff_me }}
2727
</a>
28-
<a href="{% url 'appointment:add_staff_member_personal_info' %}"
28+
<a href="{% url 'appointment:add_staff_member_info' %}"
2929
class="modify-btn button-color-green">
3030
<i class="fas fa-add"></i>
3131
</a>

appointment/tests/base/base_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,27 @@ def create_appointment_reschedule_for_user1(self, appointment_request=None, reas
5555
staff_member=appointment_request.staff_member,
5656
reason_for_rescheduling=reason_for_rescheduling,
5757
)
58+
59+
def need_normal_login(self):
60+
self.client.force_login(self.create_user_())
61+
62+
def need_staff_login(self, user=None):
63+
if user is not None:
64+
user.is_staff = True
65+
user.save()
66+
self.client.force_login(user)
67+
self.user1.is_staff = True
68+
self.user1.save()
69+
self.client.force_login(self.user1)
70+
71+
def need_superuser_login(self):
72+
self.user1.is_superuser = True
73+
self.user1.save()
74+
self.client.force_login(self.user1)
75+
76+
def clean_staff_member_objects(self, user=None):
77+
"""Delete all AppointmentRequests and Appointments linked to the StaffMember instance of self.user1."""
78+
if user is None:
79+
user = self.user1
80+
self.clean_appointment_for_user(user)
81+
self.clean_appt_request_for_user(user)

appointment/tests/mixins/base_mixin.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,28 @@ def create_appointment_request_(cls, service, staff_member, date_=date.today(),
6161
staff_member=staff_member
6262
)
6363

64+
@classmethod
65+
def clean_appt_request_for_user(cls, user):
66+
AppointmentRequest.objects.filter(staff_member__user=user).delete()
67+
6468

6569
class AppointmentMixin:
6670
def __init__(self):
6771
pass
6872

6973
@classmethod
70-
def create_appointment_(cls, user, appointment_request, phone="1234567890", address="Some City, Some State"):
74+
def create_appointment_(cls, user, appointment_request, phone="1234567890", address="Some City, Some State"):
7175
return Appointment.objects.create(
7276
client=user,
7377
appointment_request=appointment_request,
7478
phone=phone,
7579
address=address
7680
)
7781

82+
@classmethod
83+
def clean_appointment_for_user(cls, user):
84+
Appointment.objects.filter(client=user).delete()
85+
7886

7987
class AppointmentRescheduleHistoryMixin:
8088
def __init__(self):

0 commit comments

Comments
 (0)