mirror of
https://github.com/Dadechin/Dashboard-XRoom.git
synced 2025-07-03 00:34:34 +00:00
added team
This commit is contained in:
parent
f53adf9774
commit
991ca1d68a
|
@ -14,6 +14,8 @@ from core.models.AssetBundleRoom import AssetBundleRoom
|
||||||
from core.models.AssignRoomUser import AssignRoomUser
|
from core.models.AssignRoomUser import AssignRoomUser
|
||||||
# from .model import user
|
# from .model import user
|
||||||
from core.models.AssignedRule import AssignedRule
|
from core.models.AssignedRule import AssignedRule
|
||||||
|
from core.models.Meeting import Meeting
|
||||||
|
from core.models.Invitation import Invitation
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Image)
|
admin.site.register(Image)
|
||||||
|
@ -29,3 +31,5 @@ admin.site.register(Space)
|
||||||
admin.site.register(TeamMember)
|
admin.site.register(TeamMember)
|
||||||
admin.site.register(AssetBundleRoom)
|
admin.site.register(AssetBundleRoom)
|
||||||
admin.site.register(AssignRoomUser)
|
admin.site.register(AssignRoomUser)
|
||||||
|
admin.site.register(Meeting)
|
||||||
|
admin.site.register(Invitation)
|
||||||
|
|
18
core/migrations/0006_meeting_code.py
Normal file
18
core/migrations/0006_meeting_code.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 4.2 on 2025-06-02 09:54
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0005_meeting'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='meeting',
|
||||||
|
name='code',
|
||||||
|
field=models.CharField(blank=True, max_length=255, null=True),
|
||||||
|
),
|
||||||
|
]
|
26
core/migrations/0007_invitation.py
Normal file
26
core/migrations/0007_invitation.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Generated by Django 4.2 on 2025-06-02 10:02
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('core', '0006_meeting_code'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Invitation',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('is_admin', models.BooleanField(default=False)),
|
||||||
|
('is_sms_sent', models.BooleanField(default=False)),
|
||||||
|
('meeting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invitations', to='core.meeting')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invitations', to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
13
core/models/Invitation.py
Normal file
13
core/models/Invitation.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# core/models.py
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
class Invitation(models.Model):
|
||||||
|
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='invitations')
|
||||||
|
meeting = models.ForeignKey('core.Meeting', on_delete=models.CASCADE, related_name='invitations')
|
||||||
|
is_admin = models.BooleanField(default=False)
|
||||||
|
is_sms_sent = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Invitation of {self.user.username} to {self.meeting.name}"
|
|
@ -15,6 +15,7 @@ class Meeting(models.Model):
|
||||||
space = models.ForeignKey(Space, on_delete=models.SET_NULL, null=True, blank=True)
|
space = models.ForeignKey(Space, on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
asset_bundle = models.ForeignKey(AssetBundleRoom, on_delete=models.SET_NULL, null=True, blank=True)
|
asset_bundle = models.ForeignKey(AssetBundleRoom, on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
use_space = models.BooleanField(default=False)
|
use_space = models.BooleanField(default=False)
|
||||||
|
code = models.CharField(max_length=255, null=True, blank=True )
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
|
@ -92,6 +92,7 @@ urlpatterns = [
|
||||||
|
|
||||||
re_path('add_team', teamView.addTeam),
|
re_path('add_team', teamView.addTeam),
|
||||||
re_path('get_team', teamView.getTeams),
|
re_path('get_team', teamView.getTeams),
|
||||||
|
re_path('get_all_team_members', teamView.get_all_team_members),
|
||||||
|
|
||||||
path('add_meeting', meetingView. addMeeting, name='add_meeting'),
|
path('add_meeting', meetingView. addMeeting, name='add_meeting'),
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,54 @@ from drf_yasg import openapi
|
||||||
from core.serializers.MeetingSerializer import MeetingSerializer
|
from core.serializers.MeetingSerializer import MeetingSerializer
|
||||||
|
|
||||||
|
|
||||||
|
# @swagger_auto_schema(
|
||||||
|
# method='post',
|
||||||
|
# request_body=openapi.Schema(
|
||||||
|
# type=openapi.TYPE_OBJECT,
|
||||||
|
# required=['name', 'description', 'date_time'],
|
||||||
|
# properties={
|
||||||
|
# 'name': openapi.Schema(type=openapi.TYPE_STRING, default='Sprint Planning'),
|
||||||
|
# 'description': openapi.Schema(type=openapi.TYPE_STRING, default='Discuss the next sprint'),
|
||||||
|
# 'date_time': openapi.Schema(type=openapi.TYPE_STRING, format='date-time', default='2025-06-01T14: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),
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
# )
|
||||||
|
# @api_view(['POST'])
|
||||||
|
# @authentication_classes([SessionAuthentication, TokenAuthentication])
|
||||||
|
# @permission_classes([IsAuthenticated])
|
||||||
|
# def addMeeting(request):
|
||||||
|
# data = request.data.copy()
|
||||||
|
# data['creator_user'] = request.user.id
|
||||||
|
|
||||||
|
# serializer = MeetingSerializer(data=data)
|
||||||
|
# if serializer.is_valid():
|
||||||
|
# meeting = serializer.save()
|
||||||
|
# return Response({
|
||||||
|
# "message": "Meeting created successfully.",
|
||||||
|
# "meeting": serializer.data
|
||||||
|
# }, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from core.models.Invitation import Invitation # Ensure Invitation is imported
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.db import transaction
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
method='post',
|
method='post',
|
||||||
request_body=openapi.Schema(
|
request_body=openapi.Schema(
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['name', 'description', 'date_time'],
|
required=['name', 'description', 'date_time', 'user_ids'],
|
||||||
properties={
|
properties={
|
||||||
'name': openapi.Schema(type=openapi.TYPE_STRING, default='Sprint Planning'),
|
'name': openapi.Schema(type=openapi.TYPE_STRING, default='Sprint Planning'),
|
||||||
'description': openapi.Schema(type=openapi.TYPE_STRING, default='Discuss the next sprint'),
|
'description': openapi.Schema(type=openapi.TYPE_STRING, default='Discuss the next sprint'),
|
||||||
|
@ -20,6 +63,11 @@ from core.serializers.MeetingSerializer import MeetingSerializer
|
||||||
'space': openapi.Schema(type=openapi.TYPE_INTEGER, default=1),
|
'space': openapi.Schema(type=openapi.TYPE_INTEGER, default=1),
|
||||||
'asset_bundle': 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),
|
'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'
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -28,14 +76,39 @@ from core.serializers.MeetingSerializer import MeetingSerializer
|
||||||
@permission_classes([IsAuthenticated])
|
@permission_classes([IsAuthenticated])
|
||||||
def addMeeting(request):
|
def addMeeting(request):
|
||||||
data = request.data.copy()
|
data = request.data.copy()
|
||||||
|
user_ids = data.pop('user_ids', [])
|
||||||
data['creator_user'] = request.user.id
|
data['creator_user'] = request.user.id
|
||||||
|
|
||||||
serializer = MeetingSerializer(data=data)
|
serializer = MeetingSerializer(data=data)
|
||||||
|
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
meeting = serializer.save()
|
try:
|
||||||
return Response({
|
with transaction.atomic():
|
||||||
"message": "Meeting created successfully.",
|
meeting = serializer.save()
|
||||||
"meeting": serializer.data
|
|
||||||
}, status=status.HTTP_201_CREATED)
|
for user_id in user_ids:
|
||||||
|
user = User.objects.get(id=user_id) # will raise exception if not found
|
||||||
|
Invitation.objects.create(
|
||||||
|
user=user,
|
||||||
|
meeting=meeting,
|
||||||
|
is_admin=False,
|
||||||
|
is_sms_sent=False
|
||||||
|
)
|
||||||
|
|
||||||
|
return Response({
|
||||||
|
"message": "Meeting created successfully with invitations.",
|
||||||
|
"meeting": serializer.data
|
||||||
|
}, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
except User.DoesNotExist:
|
||||||
|
return Response(
|
||||||
|
{"error": f"User with id {user_id} does not exist."},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
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)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
@ -5,6 +5,7 @@ from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from core.models.Team import Team
|
from core.models.Team import Team
|
||||||
|
from core.models.TeamMember import TeamMember
|
||||||
from core.serializers.TeamSerializer import TeamSerializer
|
from core.serializers.TeamSerializer import TeamSerializer
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,3 +64,50 @@ def getTeams(request):
|
||||||
return Response({
|
return Response({
|
||||||
"teams": serializer.data
|
"teams": serializer.data
|
||||||
}, status=status.HTTP_200_OK)
|
}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
|
from rest_framework.serializers import ModelSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleUserSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
|
fields = ['id', 'username', 'first_name', 'last_name' ]
|
||||||
|
|
||||||
|
@api_view(['GET'])
|
||||||
|
@authentication_classes([SessionAuthentication, TokenAuthentication])
|
||||||
|
@permission_classes([IsAuthenticated])
|
||||||
|
def get_all_team_members(request):
|
||||||
|
try:
|
||||||
|
# Get all team IDs for current user
|
||||||
|
# team_ids = TeamMember.objects.filter(user=request.user).values_list('team_id', flat=True)
|
||||||
|
# team_ids = Team.objects.filter(Q(members__user=request.user) | Q(admin=request.user)).values_list('id', flat=True).distinct()
|
||||||
|
|
||||||
|
# team_ids = Team.objects.filter(admin_id=7)
|
||||||
|
team_ids = Team.objects.filter(Q(admin_id=request.user.id) | Q(members__user=request.user)).values_list('id', flat=True).distinct()
|
||||||
|
|
||||||
|
|
||||||
|
# Get all members of those teams
|
||||||
|
team_members = TeamMember.objects.filter(team_id__in=team_ids)
|
||||||
|
|
||||||
|
for tm in team_members:
|
||||||
|
print(f" - {tm.user.username} (Team: {tm.team.name})")
|
||||||
|
|
||||||
|
# Extract user objects
|
||||||
|
users = [tm.user for tm in team_members]
|
||||||
|
|
||||||
|
serializer = SimpleUserSerializer(users, many=True)
|
||||||
|
return Response({'members': serializer.data}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
10
test.rest
10
test.rest
|
@ -149,3 +149,13 @@ GET http://127.0.0.1:8000/get_team
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Authorization: token e2792ac06153e10f00949a1924483a07629cc753
|
Authorization: token e2792ac06153e10f00949a1924483a07629cc753
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
GET http://127.0.0.1:8000/get_all_team_members
|
||||||
|
Content-Type: application/json
|
||||||
|
Authorization: token e2792ac06153e10f00949a1924483a07629cc753
|
||||||
|
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user