feat: refactor contact message handling and update appointment request model #51
@ -0,0 +1,77 @@
|
|||||||
|
# Generated by Django 5.2.8 on 2025-12-01 16:22
|
||||||
|
|
||||||
|
import meetings.models
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('meetings', '0002_alter_appointmentrequest_jitsi_room_id'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_config',
|
||||||
|
field=models.JSONField(default=dict, help_text='Jitsi meeting configuration and settings'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_created',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_data',
|
||||||
|
field=models.JSONField(default=dict, help_text='Additional meeting data (participants, duration, etc)'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_password',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_moderator_token',
|
||||||
|
field=meetings.models.EncryptedTextField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_participant_token',
|
||||||
|
field=meetings.models.EncryptedTextField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_recording_url',
|
||||||
|
field=models.URLField(blank=True, help_text='URL to meeting recording', null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_duration_actual',
|
||||||
|
field=models.PositiveIntegerField(default=0, help_text='Actual meeting duration in minutes'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_ended_at',
|
||||||
|
field=models.DateTimeField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_started_at',
|
||||||
|
field=models.DateTimeField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_room_id',
|
||||||
|
field=models.CharField(blank=True, help_text='Jitsi room ID', max_length=100, null=True, unique=True),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
index=models.Index(fields=['jitsi_meeting_created', 'scheduled_datetime'], name='meetings_ap_jitsi_m_f3c488_idx'),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
index=models.Index(fields=['meeting_started_at'], name='meetings_ap_meeting_157142_idx'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
# Generated by Django 5.2.8 on 2025-12-01 18:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('meetings', '0003_appointmentrequest_jitsi_meeting_config_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveIndex(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meetings_ap_jitsi_m_f3c488_idx',
|
||||||
|
),
|
||||||
|
migrations.RemoveIndex(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meetings_ap_meeting_157142_idx',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_config',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_created',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_data',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_meeting_password',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_moderator_token',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_participant_token',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_recording_url',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_duration_actual',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_ended_at',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='meeting_started_at',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='appointmentrequest',
|
||||||
|
name='jitsi_room_id',
|
||||||
|
field=models.CharField(blank=True, default=None, help_text='Jitsi room ID', max_length=100, null=True, unique=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -3,7 +3,7 @@ from rest_framework_simplejwt.views import TokenRefreshView
|
|||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('contact/', views.ContactMessageView.as_view(), name='contact-message'),
|
path('contact/', views.contact_message, name='contact-message'),
|
||||||
|
|
||||||
|
|
||||||
path('register/', views.register_user, name='register'),
|
path('register/', views.register_user, name='register'),
|
||||||
|
|||||||
@ -17,6 +17,8 @@ import logging
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class ContactMessageView(APIView):
|
class ContactMessageView(APIView):
|
||||||
|
permission_classes = [AllowAny]
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
serializer = ContactMessageSerializer(data=request.data)
|
serializer = ContactMessageSerializer(data=request.data)
|
||||||
|
|
||||||
@ -44,7 +46,36 @@ class ContactMessageView(APIView):
|
|||||||
'message': 'Please check your input and try again.',
|
'message': 'Please check your input and try again.',
|
||||||
'errors': serializer.errors
|
'errors': serializer.errors
|
||||||
}, status=status.HTTP_400_BAD_REQUEST)
|
}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
@api_view(['POST'])
|
||||||
|
@permission_classes([AllowAny])
|
||||||
|
def contact_message(request):
|
||||||
|
serializer = ContactMessageSerializer(data=request.data)
|
||||||
|
|
||||||
|
if serializer.is_valid():
|
||||||
|
try:
|
||||||
|
contact_message = serializer.save()
|
||||||
|
|
||||||
|
send_email_notifications(contact_message)
|
||||||
|
|
||||||
|
return Response({
|
||||||
|
'success': True,
|
||||||
|
'message': 'Thank you for your message. We will get back to you soon!',
|
||||||
|
'data': serializer.data
|
||||||
|
}, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error processing contact form: {str(e)}")
|
||||||
|
return Response({
|
||||||
|
'success': False,
|
||||||
|
'message': 'There was an error processing your request. Please try again later.'
|
||||||
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
|
|
||||||
|
return Response({
|
||||||
|
'success': False,
|
||||||
|
'message': 'Please check your input and try again.',
|
||||||
|
'errors': serializer.errors
|
||||||
|
}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user