From b190fe0675b6a5e1f11b8219d6ad33dbfaf8e271 Mon Sep 17 00:00:00 2001 From: Hojat Shafiee Date: Mon, 9 Jun 2025 16:24:30 +0330 Subject: [PATCH] edit meeting --- core/settings.py | 2 +- core/urls.py | 1 + core/utils/sms.py | 61 ++++++++++++++---------- core/views/meetingView.py | 99 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 136 insertions(+), 27 deletions(-) diff --git a/core/settings.py b/core/settings.py index c7392a8..d38649b 100644 --- a/core/settings.py +++ b/core/settings.py @@ -125,7 +125,7 @@ else: 'USER': 'root', 'PASSWORD': '', 'HOST': 'localhost', - 'PORT': '3306', + 'PORT': '3309', } } diff --git a/core/urls.py b/core/urls.py index d245cde..ae567bb 100644 --- a/core/urls.py +++ b/core/urls.py @@ -98,6 +98,7 @@ urlpatterns = [ re_path('get_all_team_members', teamView.get_all_team_members), path('add_meeting', meetingView. addMeeting, name='add_meeting'), + path('edit_meeting', meetingView. editMeeting, name='edit_meeting'), path('get_user_meetings', meetingView. get_user_meetings, name='get_user_meetings'), diff --git a/core/utils/sms.py b/core/utils/sms.py index deab5cc..a10a253 100644 --- a/core/utils/sms.py +++ b/core/utils/sms.py @@ -1,33 +1,46 @@ - import requests -import json - - - +from datetime import datetime +def send_sms(to_number, name, date_time, title): + # Try multiple datetime formats + dt = None + for fmt in ("%Y-%m-%dT%H:%M:%S.%f%z", "%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%d %H:%M:%S%z"): + try: + dt = datetime.strptime(date_time, fmt) + break + except ValueError: + continue -def send_sms(to_number, code): - username = "09399112092" + if dt is None: + return "Invalid datetime format" + + # Format for SMS + date_str = dt.strftime("%Y/%m/%d") + time_str = dt.strftime("%H:%M") + + # Message content + msg = f"""جناب {name} +شما در تاریخ {date_str} +ساعت {time_str} +به جلسه ی {title} +در متاورسی دعوت شده اید +my.xroomapp.com""" + + # SMS service credentials + uname = "09399112092" password = "Dadechin123!@##!" - from_number = "+983000505" - pattern_code = "lgfrblbdppyn202" + from_number = "+983000505" # Replace with your SMS line number - url = "https://ippanel.com/patterns/pattern" - to = [to_number] - input_data = {"code": code} - - params = { - "username": username, - "password": password, - "from": from_number, - "to": json.dumps(to), - "input_data": json.dumps(input_data), - "pattern_code": pattern_code - } + # Request URL + url = ( + f"https://sms.farazsms.com/class/sms/webservice/send_url.php" + f"?from={from_number}&to={to_number}&msg={msg}&uname={uname}&pass={password}" + ) + + print(url) try: - response = requests.post(url, params=params, data=input_data) + response = requests.get(url) return response.text except Exception as e: - return f"Error: {e}" - + return str(e) diff --git a/core/views/meetingView.py b/core/views/meetingView.py index 845c2fb..2ccc378 100644 --- a/core/views/meetingView.py +++ b/core/views/meetingView.py @@ -101,7 +101,12 @@ def addMeeting(request): ) # Send SMS to user.username (which is a phone number) - sms_result = send_sms(to_number=user.username, code="1111") + sms_result = send_sms( + to_number=user.username, + name=user.get_full_name() or user.username, + date_time=str(meeting.date_time), + title=meeting.name + ) print(f"SMS sent to {user.username}: {sms_result}") @@ -154,4 +159,94 @@ def get_user_meetings(request): return Response({"meetings": serializer.data}, status=status.HTTP_200_OK) except Exception as e: - return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + + + + + + + + + + +@swagger_auto_schema( +method='post', +request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + required=['meeting_id', 'name', 'description', 'date_time', 'user_ids'], + properties={ + 'meeting_id': openapi.Schema(type=openapi.TYPE_INTEGER, default=1), + 'name': openapi.Schema(type=openapi.TYPE_STRING, default='Updated Meeting'), + 'description': openapi.Schema(type=openapi.TYPE_STRING, default='Updated description'), + 'date_time': openapi.Schema(type=openapi.TYPE_STRING, format='date-time', default='2025-06-01T16:00:00Z'), + 'space': openapi.Schema(type=openapi.TYPE_INTEGER, default=1), + 'asset_bundle': openapi.Schema(type=openapi.TYPE_INTEGER, default=1), + 'use_space': openapi.Schema(type=openapi.TYPE_BOOLEAN, default=False), + 'user_ids': openapi.Schema( + type=openapi.TYPE_ARRAY, + items=openapi.Items(type=openapi.TYPE_INTEGER), + description='List of user IDs to invite' + ), + } +) +) +@api_view(['POST']) +@authentication_classes([SessionAuthentication, TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def editMeeting(request): + data = request.data.copy() + user_ids = data.pop('user_ids', []) + meeting_id = data.get('meeting_id') + + try: + meeting = Meeting.objects.get(id=meeting_id) + except Meeting.DoesNotExist: + return Response({"error": "Meeting not found"}, status=status.HTTP_404_NOT_FOUND) + + serializer = MeetingSerializer(meeting, data=data, partial=True) + + if serializer.is_valid(): + try: + with transaction.atomic(): + updated_meeting = serializer.save() + + # Remove old invitations and add new ones + Invitation.objects.filter(meeting=meeting).delete() + + for user_id in user_ids: + try: + user = User.objects.get(id=user_id) + Invitation.objects.create( + user=user, + meeting=meeting, + is_admin=False, + is_sms_sent=True + ) + + # Send SMS notification + sms_result = send_sms( + to_number=user.username, + name=user.get_full_name() or user.username, + date_time=str(meeting.date_time), + title=meeting.name + ) + + print(f"SMS sent to {user.username}: {sms_result}") + + except User.DoesNotExist: + return Response( + {"error": f"User with id {user_id} does not exist."}, + status=status.HTTP_400_BAD_REQUEST + ) + + return Response({ + "message": "Meeting updated successfully with new invitations and SMS sent.", + "meeting": serializer.data + }, status=status.HTTP_200_OK) + + except Exception as e: + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)