2025-11-26 19:30:26 +00:00
|
|
|
from django import forms
|
2025-11-23 00:19:26 +00:00
|
|
|
from django.contrib import admin
|
|
|
|
|
from .models import AdminWeeklyAvailability, AppointmentRequest
|
|
|
|
|
|
2025-11-26 19:30:26 +00:00
|
|
|
class AdminWeeklyAvailabilityForm(forms.ModelForm):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = AdminWeeklyAvailability
|
|
|
|
|
fields = '__all__'
|
|
|
|
|
widgets = {
|
|
|
|
|
'availability_schedule': forms.HiddenInput()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
for day_num, day_name in AdminWeeklyAvailability.DAYS_OF_WEEK:
|
|
|
|
|
field_name = f'day_{day_num}'
|
|
|
|
|
self.fields[field_name] = forms.MultipleChoiceField(
|
|
|
|
|
choices=AdminWeeklyAvailability.TIME_SLOT_CHOICES,
|
|
|
|
|
required=False,
|
|
|
|
|
label=day_name,
|
|
|
|
|
widget=forms.CheckboxSelectMultiple
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if self.instance.availability_schedule:
|
|
|
|
|
self.fields[field_name].initial = self.instance.availability_schedule.get(str(day_num), [])
|
|
|
|
|
|
|
|
|
|
def save(self, commit=True):
|
|
|
|
|
instance = super().save(commit=False)
|
|
|
|
|
|
|
|
|
|
availability_schedule = {}
|
|
|
|
|
for day_num, day_name in AdminWeeklyAvailability.DAYS_OF_WEEK:
|
|
|
|
|
field_name = f'day_{day_num}'
|
|
|
|
|
time_slots = self.cleaned_data.get(field_name, [])
|
|
|
|
|
if time_slots:
|
|
|
|
|
availability_schedule[str(day_num)] = time_slots
|
|
|
|
|
|
|
|
|
|
instance.availability_schedule = availability_schedule
|
|
|
|
|
|
|
|
|
|
if commit:
|
|
|
|
|
instance.save()
|
|
|
|
|
|
|
|
|
|
return instance
|
|
|
|
|
|
2025-11-23 00:19:26 +00:00
|
|
|
@admin.register(AdminWeeklyAvailability)
|
|
|
|
|
class AdminWeeklyAvailabilityAdmin(admin.ModelAdmin):
|
2025-11-26 19:30:26 +00:00
|
|
|
form = AdminWeeklyAvailabilityForm
|
|
|
|
|
list_display = ['__str__', 'created_at', 'updated_at']
|
2025-11-23 00:19:26 +00:00
|
|
|
|
2025-11-26 19:30:26 +00:00
|
|
|
def has_add_permission(self, request):
|
|
|
|
|
if self.model.objects.count() >= 1:
|
|
|
|
|
return False
|
|
|
|
|
return super().has_add_permission(request)
|
2025-11-23 00:19:26 +00:00
|
|
|
|
|
|
|
|
@admin.register(AppointmentRequest)
|
|
|
|
|
class AppointmentRequestAdmin(admin.ModelAdmin):
|
2025-11-26 19:30:26 +00:00
|
|
|
list_display = ['full_name', 'email', 'status', 'formatted_created_at', 'formatted_scheduled_datetime']
|
|
|
|
|
list_filter = ['status', 'created_at', 'scheduled_datetime']
|
2025-11-23 00:19:26 +00:00
|
|
|
search_fields = ['first_name', 'last_name', 'email']
|
2025-11-26 19:30:26 +00:00
|
|
|
readonly_fields = ['id', 'created_at', 'updated_at', 'formatted_created_at', 'formatted_scheduled_datetime']
|
|
|
|
|
|
|
|
|
|
fieldsets = (
|
|
|
|
|
('Personal Information', {
|
|
|
|
|
'fields': ('first_name', 'last_name', 'email', 'phone', 'reason')
|
|
|
|
|
}),
|
|
|
|
|
('Appointment Preferences', {
|
|
|
|
|
'fields': ('preferred_dates', 'preferred_time_slots')
|
|
|
|
|
}),
|
|
|
|
|
('Scheduling', {
|
|
|
|
|
'fields': ('status', 'scheduled_datetime', 'scheduled_duration', 'rejection_reason')
|
|
|
|
|
}),
|
|
|
|
|
('Video Meeting', {
|
|
|
|
|
'fields': ('jitsi_meet_url', 'jitsi_room_id')
|
|
|
|
|
}),
|
|
|
|
|
('Metadata', {
|
|
|
|
|
'fields': ('id', 'created_at', 'updated_at', 'formatted_created_at', 'formatted_scheduled_datetime'),
|
|
|
|
|
'classes': ('collapse',)
|
|
|
|
|
}),
|
|
|
|
|
)
|
2025-11-23 00:19:26 +00:00
|
|
|
|
2025-11-26 19:30:26 +00:00
|
|
|
def formatted_created_at(self, obj):
|
|
|
|
|
return obj.formatted_created_at
|
|
|
|
|
formatted_created_at.short_description = 'Created At'
|
2025-11-23 00:19:26 +00:00
|
|
|
|
2025-11-26 19:30:26 +00:00
|
|
|
def formatted_scheduled_datetime(self, obj):
|
|
|
|
|
return obj.formatted_scheduled_datetime
|
|
|
|
|
formatted_scheduled_datetime.short_description = 'Scheduled Date Time'
|