Enhanced the API root documentation for the appointments system with improved formatting and updated description to include "flexible availability" feature. Restructured the endpoint documentation for better readability and maintainability while preserving all endpoint information including Jitsi meeting integration details.
87 lines
3.3 KiB
Python
87 lines
3.3 KiB
Python
from django import forms
|
|
from django.contrib import admin
|
|
from .models import AdminWeeklyAvailability, AppointmentRequest
|
|
|
|
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
|
|
|
|
@admin.register(AdminWeeklyAvailability)
|
|
class AdminWeeklyAvailabilityAdmin(admin.ModelAdmin):
|
|
form = AdminWeeklyAvailabilityForm
|
|
list_display = ['__str__', 'created_at', 'updated_at']
|
|
|
|
def has_add_permission(self, request):
|
|
if self.model.objects.count() >= 1:
|
|
return False
|
|
return super().has_add_permission(request)
|
|
|
|
@admin.register(AppointmentRequest)
|
|
class AppointmentRequestAdmin(admin.ModelAdmin):
|
|
list_display = ['full_name', 'email', 'status', 'formatted_created_at', 'formatted_scheduled_datetime']
|
|
list_filter = ['status', 'created_at', 'scheduled_datetime']
|
|
search_fields = ['first_name', 'last_name', 'email']
|
|
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',)
|
|
}),
|
|
)
|
|
|
|
def formatted_created_at(self, obj):
|
|
return obj.formatted_created_at
|
|
formatted_created_at.short_description = 'Created At'
|
|
|
|
def formatted_scheduled_datetime(self, obj):
|
|
return obj.formatted_scheduled_datetime
|
|
formatted_scheduled_datetime.short_description = 'Scheduled Date Time' |