mirror of
https://github.com/Dadechin/Dashboard-XRoom.git
synced 2025-07-05 01:34:34 +00:00
added asset bundle rooms and assigned rooms
This commit is contained in:
parent
255441ad61
commit
8984d6e542
|
@ -8,6 +8,8 @@ from core.models.video import Video
|
||||||
from core.models.glb import Glb
|
from core.models.glb import Glb
|
||||||
from core.models.pdf import Pdf
|
from core.models.pdf import Pdf
|
||||||
from core.models.TeamMember import TeamMember
|
from core.models.TeamMember import TeamMember
|
||||||
|
from core.models.AssetBundleRoom import AssetBundleRoom
|
||||||
|
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
|
||||||
|
|
||||||
|
@ -21,3 +23,5 @@ admin.site.register(AssignedRule)
|
||||||
admin.site.register(Customer)
|
admin.site.register(Customer)
|
||||||
admin.site.register(Subscription)
|
admin.site.register(Subscription)
|
||||||
admin.site.register(TeamMember)
|
admin.site.register(TeamMember)
|
||||||
|
admin.site.register(AssetBundleRoom)
|
||||||
|
admin.site.register(AssignRoomUser)
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 10:36
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0002_teammember'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='subscription',
|
||||||
|
name='adminUser',
|
||||||
|
field=models.ForeignKey(blank=True, default=None, on_delete=django.db.models.deletion.CASCADE, related_name='admin_subscriptions', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='subscription',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='subscriptions', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
17
core/migrations/0004_remove_subscription_adminuser.py
Normal file
17
core/migrations/0004_remove_subscription_adminuser.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 10:51
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0003_subscription_adminuser_alter_subscription_user'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='subscription',
|
||||||
|
name='adminUser',
|
||||||
|
),
|
||||||
|
]
|
24
core/migrations/0005_assetbundleroom.py
Normal file
24
core/migrations/0005_assetbundleroom.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 12:12
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0004_remove_subscription_adminuser'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='AssetBundleRoom',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('url', models.TextField()),
|
||||||
|
('name', models.CharField(max_length=255)),
|
||||||
|
('description', models.TextField(blank=True)),
|
||||||
|
('maxPerson', models.PositiveIntegerField()),
|
||||||
|
('img', models.TextField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 12:14
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0005_assetbundleroom'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='assetbundleroom',
|
||||||
|
name='img',
|
||||||
|
field=models.FileField(blank=True, null=True, upload_to='user_imgs/'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='assetbundleroom',
|
||||||
|
name='url',
|
||||||
|
field=models.FileField(blank=True, null=True, upload_to='user_files/'),
|
||||||
|
),
|
||||||
|
]
|
18
core/migrations/0007_assetbundleroom_private.py
Normal file
18
core/migrations/0007_assetbundleroom_private.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 13:08
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0006_alter_assetbundleroom_img_alter_assetbundleroom_url'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='assetbundleroom',
|
||||||
|
name='Private',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
]
|
27
core/migrations/0008_assignroomuser.py
Normal file
27
core/migrations/0008_assignroomuser.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Generated by Django 5.0 on 2025-05-24 13:26
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0007_assetbundleroom_private'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='AssignRoomUser',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('assetbundle_room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.assetbundleroom')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'unique_together': {('user', 'assetbundle_room')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
13
core/models/AssetBundleRoom.py
Normal file
13
core/models/AssetBundleRoom.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class AssetBundleRoom(models.Model):
|
||||||
|
url = models.FileField(upload_to='user_files/', blank=True, null=True)
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
description = models.TextField(blank=True)
|
||||||
|
maxPerson = models.PositiveIntegerField()
|
||||||
|
img = models.FileField(upload_to='user_imgs/', blank=True, null=True)
|
||||||
|
|
||||||
|
Private = models.BooleanField(default=True) # New boolean field
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.name} (Max: {self.maxPerson})"
|
13
core/models/AssignRoomUser.py
Normal file
13
core/models/AssignRoomUser.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.conf import settings
|
||||||
|
from core.models.AssetBundleRoom import AssetBundleRoom # Adjust import path if needed
|
||||||
|
|
||||||
|
class AssignRoomUser(models.Model):
|
||||||
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
||||||
|
assetbundle_room = models.ForeignKey(AssetBundleRoom, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('user', 'assetbundle_room') # Prevent duplicate assignments
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.user.username} assigned to {self.assetbundle_room.name}"
|
|
@ -4,21 +4,20 @@ from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
class Subscription(models.Model):
|
class Subscription(models.Model):
|
||||||
# uid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
user = models.ForeignKey(
|
||||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, on_delete=models.CASCADE)
|
settings.AUTH_USER_MODEL,
|
||||||
|
blank=True,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='subscriptions' # For user subscriptions
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
license_number = models.CharField(max_length=100)
|
license_number = models.CharField(max_length=100)
|
||||||
user_count = models.PositiveIntegerField(default = 0,blank=True) # changed from license_number CharField
|
user_count = models.PositiveIntegerField(default=0, blank=True)
|
||||||
|
|
||||||
startTime = models.DateTimeField()
|
startTime = models.DateTimeField()
|
||||||
endTime = models.DateTimeField()
|
endTime = models.DateTimeField()
|
||||||
price = models.DecimalField(max_digits=30, decimal_places=2)
|
price = models.DecimalField(max_digits=30, decimal_places=2)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"Subscription {self.user_count} - License: {self.license_number}"
|
return f"Subscription {self.user_count} - License: {self.license_number}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ urlpatterns = [
|
||||||
|
|
||||||
re_path('add_subscription', userView.addSubscription),
|
re_path('add_subscription', userView.addSubscription),
|
||||||
re_path('add_teamMember', userView.addTeamMember),
|
re_path('add_teamMember', userView.addTeamMember),
|
||||||
|
re_path('get_team_member_info', userView.get_team_member_info),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ from core.models.video import Video
|
||||||
from core.models.pdf import Pdf
|
from core.models.pdf import Pdf
|
||||||
from core.models.glb import Glb
|
from core.models.glb import Glb
|
||||||
from core.models.Subscription import Subscription
|
from core.models.Subscription import Subscription
|
||||||
|
from core.models.TeamMember import TeamMember
|
||||||
|
|
||||||
from django.core.mail import EmailMultiAlternatives
|
from django.core.mail import EmailMultiAlternatives
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
@ -330,6 +331,12 @@ def getInfo(request):
|
||||||
|
|
||||||
subscription_serializer = SubscriptionSerializer(user_subscriptions, many=True)
|
subscription_serializer = SubscriptionSerializer(user_subscriptions, many=True)
|
||||||
|
|
||||||
|
first_subscription = subscription_serializer.data[0] if subscription_serializer.data else None
|
||||||
|
|
||||||
|
user_subscription_data = first_subscription.get('user_count') if first_subscription else None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
user_data = {
|
user_data = {
|
||||||
'id': user.id,
|
'id': user.id,
|
||||||
'first_name': user.first_name,
|
'first_name': user.first_name,
|
||||||
|
@ -345,7 +352,7 @@ def getInfo(request):
|
||||||
'pdfs': pdf_serializer.data,
|
'pdfs': pdf_serializer.data,
|
||||||
'videos': video_serializer.data,
|
'videos': video_serializer.data,
|
||||||
'glbs': glb_serializer.data,
|
'glbs': glb_serializer.data,
|
||||||
'subscription': subscription_serializer.data,
|
'subscription': user_subscription_data,
|
||||||
},
|
},
|
||||||
'message': 'موفق'
|
'message': 'موفق'
|
||||||
}, status=status.HTTP_200_OK)
|
}, status=status.HTTP_200_OK)
|
||||||
|
@ -496,12 +503,7 @@ def submitSmsVerification(request):
|
||||||
@authentication_classes([SessionAuthentication, TokenAuthentication])
|
@authentication_classes([SessionAuthentication, TokenAuthentication])
|
||||||
@permission_classes([IsAuthenticated])
|
@permission_classes([IsAuthenticated])
|
||||||
def test_token(request):
|
def test_token(request):
|
||||||
if not user_has_role(request.user, 'admin'):
|
|
||||||
return Response({
|
|
||||||
"status": 403,
|
|
||||||
"data": {},
|
|
||||||
"message": "دسترسی غیرمجاز"
|
|
||||||
}, status=status.HTTP_403_FORBIDDEN)
|
|
||||||
|
|
||||||
return Response({
|
return Response({
|
||||||
"status": 200,
|
"status": 200,
|
||||||
|
@ -1120,3 +1122,28 @@ def addTeamMember(request):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(['GET'])
|
||||||
|
@authentication_classes([SessionAuthentication, TokenAuthentication])
|
||||||
|
@permission_classes([IsAuthenticated])
|
||||||
|
def get_team_member_info(request):
|
||||||
|
user = request.user
|
||||||
|
|
||||||
|
# Count team members where this user is the admin
|
||||||
|
team_member_count = TeamMember.objects.filter(adminUser=user).count()
|
||||||
|
|
||||||
|
# Get subscriptions where this user is the actual subscriber
|
||||||
|
user_subscriptions = Subscription.objects.filter(user=user)
|
||||||
|
subscription_serializer = SubscriptionSerializer(user_subscriptions, many=True)
|
||||||
|
|
||||||
|
# Extract user_count from the first subscription
|
||||||
|
first_subscription = subscription_serializer.data[0] if subscription_serializer.data else None
|
||||||
|
user_subscription_data = first_subscription.get('user_count') if first_subscription else None
|
||||||
|
|
||||||
|
return Response({
|
||||||
|
'status': 200,
|
||||||
|
'data': {
|
||||||
|
'team_member_capacity': team_member_count,
|
||||||
|
'subscriptionCount': user_subscription_data,
|
||||||
|
},
|
||||||
|
'message': 'موفق'
|
||||||
|
}, status=status.HTTP_200_OK)
|
BIN
media/user_files/newbundle_RjuXfe2
Normal file
BIN
media/user_files/newbundle_RjuXfe2
Normal file
Binary file not shown.
BIN
media/user_imgs/image-1745664489613.png
Normal file
BIN
media/user_imgs/image-1745664489613.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 146 KiB |
17
test.rest
17
test.rest
|
@ -10,7 +10,7 @@ Content-Type: application/json
|
||||||
POST http://127.0.0.1:8000/login
|
POST http://127.0.0.1:8000/login
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
|
|
||||||
{ "mobile_number":"09140086509", "password": "123456728" }
|
{ "mobile_number":"09140086509", "password": "13245678" }
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ Authorization: token d3f1b03996140c8f7561d67221953ff704b482cb
|
||||||
|
|
||||||
GET http://127.0.0.1:8000/test_token
|
GET http://127.0.0.1:8000/test_token
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Authorization: token 224648840820ad0948ddee5b00d53ae67c040c49
|
Authorization: token 8dcae0063521ca707a9d0ab6ce3d4794a90064ca
|
||||||
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ Authorization: token 224648840820ad0948ddee5b00d53ae67c040c49
|
||||||
|
|
||||||
GET http://127.0.0.1:8000/getInfo
|
GET http://127.0.0.1:8000/getInfo
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Authorization: token 224648840820ad0948ddee5b00d53ae67c040c49
|
Authorization: token 8dcae0063521ca707a9d0ab6ce3d4794a90064ca
|
||||||
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,3 +94,14 @@ Content-Type: application/json
|
||||||
Authorization: token 8dcae0063521ca707a9d0ab6ce3d4794a90064ca
|
Authorization: token 8dcae0063521ca707a9d0ab6ce3d4794a90064ca
|
||||||
|
|
||||||
{ "mobile_number": "09140086608", "first_name":"mahdi", "last_name":"arabi", "semat":"modir", "password": "12345678", "isAdmin":"true" }
|
{ "mobile_number": "09140086608", "first_name":"mahdi", "last_name":"arabi", "semat":"modir", "password": "12345678", "isAdmin":"true" }
|
||||||
|
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GET http://127.0.0.1:8000/get_team_member_info
|
||||||
|
Content-Type: application/json
|
||||||
|
Authorization: token 8dcae0063521ca707a9d0ab6ce3d4794a90064ca
|
||||||
|
# Authorization: token 53e2b003a92e22aca85c95088a438ece8d9a5dfb
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user