first commit
This commit is contained in:
0
module_iam/__init__.py
Normal file
0
module_iam/__init__.py
Normal file
18
module_iam/admin.py
Normal file
18
module_iam/admin.py
Normal file
@@ -0,0 +1,18 @@
|
||||
from django.contrib import admin
|
||||
from . import models
|
||||
|
||||
# Register your models here.
|
||||
|
||||
admin.site.register(models.IAmPrincipal)
|
||||
admin.site.register(models.IAmPrincipalType)
|
||||
admin.site.register(models.IAmPrincipalSource)
|
||||
admin.site.register(models.IAmPrincipalGroup)
|
||||
admin.site.register(models.IAmAppResource)
|
||||
admin.site.register(models.IAmRole)
|
||||
admin.site.register(models.IAmAppAction)
|
||||
admin.site.register(models.IAmPrincipalGroupLink)
|
||||
admin.site.register(models.IAmPrincipalOtp)
|
||||
admin.site.register(models.IAmPrincipalBiometric)
|
||||
admin.site.register(models.IAmAppResourceActionLink)
|
||||
admin.site.register(models.IAmPricipalGroupRoleLink)
|
||||
admin.site.register(models.IAmRoleAppResourceActionLink)
|
||||
6
module_iam/apps.py
Normal file
6
module_iam/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ModuleIamConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'module_iam'
|
||||
291
module_iam/migrations/0001_initial.py
Normal file
291
module_iam/migrations/0001_initial.py
Normal file
@@ -0,0 +1,291 @@
|
||||
# Generated by Django 5.0.2 on 2024-02-11 19:08
|
||||
|
||||
import django.contrib.auth.validators
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='IAmAppAction',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_app_action',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmAppResource',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_app_resource',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalGroup',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_group',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalSource',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_source',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalType',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_type',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmRole',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('label', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('slug', models.SlugField(blank=True, max_length=255, null=True)),
|
||||
('sort_order', models.IntegerField(blank=True, null=True)),
|
||||
('small_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('large_image_url', models.ImageField(blank=True, null=True, upload_to='')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_by', models.SmallIntegerField(blank=True, null=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_role',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipal',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('password', models.CharField(max_length=128, verbose_name='password')),
|
||||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
||||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
|
||||
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
|
||||
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
|
||||
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('email', models.EmailField(max_length=254, unique=True)),
|
||||
('gender', models.CharField(blank=True, max_length=5, null=True)),
|
||||
('date_of_birth', models.DateField(blank=True, null=True)),
|
||||
('phone_no', models.IntegerField()),
|
||||
('address_line1', models.TextField(blank=True, null=True)),
|
||||
('address_line2', models.TextField(blank=True, null=True)),
|
||||
('city', models.CharField(blank=True, max_length=100, null=True)),
|
||||
('state', models.CharField(blank=True, max_length=100, null=True)),
|
||||
('country', models.CharField(blank=True, max_length=100, null=True)),
|
||||
('post_code', models.CharField(blank=True, max_length=100, null=True)),
|
||||
('profile_photo', models.ImageField(blank=True, null=True, upload_to='profile')),
|
||||
('phone_verified', models.BooleanField(default=False)),
|
||||
('email_verified', models.BooleanField(default=False)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('register_complete', models.BooleanField(default=False)),
|
||||
('player_id', models.CharField(blank=True, help_text='OneSignal player id for push notification', max_length=255, null=True)),
|
||||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='creations', to=settings.AUTH_USER_MODEL)),
|
||||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
|
||||
('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modifications', to=settings.AUTH_USER_MODEL)),
|
||||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmAppResourceActionLink',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('app_action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='resource_action_link_app_action', to='module_iam.iamappaction')),
|
||||
('app_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='resource_action_link_app_resource', to='module_iam.iamappresource')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_app_resource_action_link',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamappresource',
|
||||
name='action',
|
||||
field=models.ManyToManyField(related_name='app_resource_action', through='module_iam.IAmAppResourceActionLink', to='module_iam.iamappaction'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalBiometric',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('deleted', models.BooleanField(default=False)),
|
||||
('created_on', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_on', models.DateTimeField(auto_now=True)),
|
||||
('biometric_type', models.CharField(max_length=100)),
|
||||
('biometric_data', models.CharField(max_length=255)),
|
||||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)),
|
||||
('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modified', to=settings.AUTH_USER_MODEL)),
|
||||
('principal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='principal_biometric', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_biometric',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPricipalGroupRoleLink',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('principal_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='role_link_principal_group', to='module_iam.iamprincipalgroup')),
|
||||
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='role_link_role', to='module_iam.iamrole')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_group_role_link',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalGroupLink',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('principal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='principal_group_link_principal', to=settings.AUTH_USER_MODEL)),
|
||||
('principal_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='principal_group_link_group', to='module_iam.iamprincipalgroup')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_principal_group_link',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamprincipal',
|
||||
name='principal_group',
|
||||
field=models.ManyToManyField(related_name='principal_groups', through='module_iam.IAmPrincipalGroupLink', to='module_iam.iamprincipalgroup'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmPrincipalOtp',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('otp_code', models.CharField(max_length=4)),
|
||||
('otp_purpose', models.CharField(blank=True, max_length=50, null=True)),
|
||||
('valid_till', models.DateTimeField()),
|
||||
('is_used', models.BooleanField(default=False)),
|
||||
('principal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='principal_otp', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_principal_otp',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamprincipal',
|
||||
name='principal_source',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='principals_source', to='module_iam.iamprincipalsource'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamprincipal',
|
||||
name='principal_type',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='principals_type', to='module_iam.iamprincipaltype'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamprincipalgroup',
|
||||
name='role',
|
||||
field=models.ManyToManyField(related_name='principal_group_role', through='module_iam.IAmPricipalGroupRoleLink', to='module_iam.iamrole'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IAmRoleAppResourceActionLink',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('app_resource_action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='role_app_resource_action_link_app_resource_action', to='module_iam.iamappresourceactionlink')),
|
||||
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='role_app_resource_action_link_role', to='module_iam.iamrole')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'iam_role_app_resource_action_link',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='iamrole',
|
||||
name='app_resource_action',
|
||||
field=models.ManyToManyField(related_name='role_app_resource_action', through='module_iam.IAmRoleAppResourceActionLink', to='module_iam.iamappresourceactionlink'),
|
||||
),
|
||||
]
|
||||
18
module_iam/migrations/0002_alter_iamprincipal_phone_no.py
Normal file
18
module_iam/migrations/0002_alter_iamprincipal_phone_no.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.0.2 on 2024-02-12 11:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('module_iam', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='iamprincipal',
|
||||
name='phone_no',
|
||||
field=models.CharField(blank=True, max_length=15, null=True),
|
||||
),
|
||||
]
|
||||
18
module_iam/migrations/0003_alter_iamprincipal_gender.py
Normal file
18
module_iam/migrations/0003_alter_iamprincipal_gender.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.0.2 on 2024-02-23 13:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('module_iam', '0002_alter_iamprincipal_phone_no'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='iamprincipal',
|
||||
name='gender',
|
||||
field=models.CharField(blank=True, max_length=6, null=True),
|
||||
),
|
||||
]
|
||||
0
module_iam/migrations/__init__.py
Normal file
0
module_iam/migrations/__init__.py
Normal file
369
module_iam/models.py
Normal file
369
module_iam/models.py
Normal file
@@ -0,0 +1,369 @@
|
||||
from collections.abc import Iterable
|
||||
import datetime
|
||||
import random
|
||||
import string
|
||||
# from manage_wallets.models import Wallet, Transaction, TransactionStatus, TransactionType
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import AbstractUser, BaseUserManager
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.text import slugify
|
||||
# from phonenumber_field.modelfields import PhoneNumberField
|
||||
|
||||
from module_project.utils import RandomGenerator
|
||||
from .resource_action import PRINCIPAL_TYPE_USER, PRINCIPAL_TYPE_ADMIN
|
||||
|
||||
# from .utils import UserContext
|
||||
from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator
|
||||
|
||||
|
||||
class BaseModel(models.Model):
|
||||
active = models.BooleanField(default=True)
|
||||
deleted = models.BooleanField(default=False)
|
||||
created_by = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
related_name="%(class)s_created",
|
||||
on_delete=models.CASCADE,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
created_on = models.DateTimeField(auto_now_add=True)
|
||||
modified_by = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
related_name="%(class)s_modified",
|
||||
on_delete=models.CASCADE,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
modified_on = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
@classmethod
|
||||
def get_deleted(cls):
|
||||
return cls.objects.filter(deleted=True)
|
||||
|
||||
@classmethod
|
||||
def get_all_except_deleted(cls):
|
||||
return cls.objects.filter(deleted=False)
|
||||
|
||||
@classmethod
|
||||
def mark_deleted(cls, pk):
|
||||
try:
|
||||
obj = cls.objects.get(pk=pk)
|
||||
obj.active = False
|
||||
obj.deleted = True
|
||||
obj.save()
|
||||
return obj
|
||||
except cls.DoesNotExist:
|
||||
return None
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
self.active = False # Set active to False when deleting
|
||||
self.deleted = True
|
||||
self.save()
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.deleted:
|
||||
self.active = False # Ensure active is False if record is marked as deleted
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class MasterModel(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
label = models.CharField(max_length=255, null=True, blank=True)
|
||||
slug = models.SlugField(max_length=255, null=True, blank=True)
|
||||
sort_order = models.IntegerField(blank=True, null=True)
|
||||
small_image_url = models.ImageField(blank=True, null=True)
|
||||
large_image_url = models.ImageField(blank=True, null=True)
|
||||
active = models.BooleanField(default=True)
|
||||
deleted = models.BooleanField(default=False)
|
||||
created_by = models.SmallIntegerField(blank=True, null=True)
|
||||
created_on = models.DateTimeField(auto_now_add=True)
|
||||
modified_by = models.SmallIntegerField(blank=True, null=True)
|
||||
modified_on = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# Generate a slug from the name field
|
||||
self.slug = slugify(self.name)
|
||||
return super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class IAmPrincipalType(MasterModel):
|
||||
class Meta:
|
||||
db_table = "iam_principal_type"
|
||||
|
||||
@classmethod
|
||||
def get_principal_type(cls, type):
|
||||
return cls.objects.filter(name=type).first()
|
||||
|
||||
|
||||
class IAmPrincipalSource(MasterModel):
|
||||
class Meta:
|
||||
db_table = "iam_principal_source"
|
||||
|
||||
|
||||
class IAmAppAction(MasterModel):
|
||||
class Meta:
|
||||
db_table = "iam_app_action"
|
||||
|
||||
|
||||
class IAmAppResource(MasterModel):
|
||||
action = models.ManyToManyField(
|
||||
IAmAppAction,
|
||||
through="IAmAppResourceActionLink",
|
||||
related_name="app_resource_action",
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_app_resource"
|
||||
|
||||
|
||||
class IAmRoleAppResourceActionLinkManager(models.Manager):
|
||||
def generate_app_resource_action_data(self):
|
||||
"""
|
||||
Generate a dictionary mapping resource names to associated actions.
|
||||
Returns:
|
||||
dict: A dictionary with resource names as keys and nested dictionaries
|
||||
where action IDs are keys and action names are values.
|
||||
Example:
|
||||
{
|
||||
"res1": {1: "a1", 2: "a2"},
|
||||
"res2": {3: "a1", 4: "a2"}
|
||||
}
|
||||
"""
|
||||
app_resource_action = self.select_related("app_resource", "app_action").all()
|
||||
resource_action_link = {}
|
||||
for item in app_resource_action:
|
||||
resource = item.app_resource.name
|
||||
action = item.app_action.name
|
||||
id = item.id
|
||||
if resource in resource_action_link:
|
||||
resource_action_link[resource][id] = action
|
||||
else:
|
||||
resource_action_link[resource] = {id: action}
|
||||
# print(resource_action_link)
|
||||
return resource_action_link
|
||||
|
||||
|
||||
class IAmAppResourceActionLink(models.Model):
|
||||
app_resource = models.ForeignKey(
|
||||
IAmAppResource,
|
||||
related_name="resource_action_link_app_resource",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
app_action = models.ForeignKey(
|
||||
IAmAppAction,
|
||||
related_name="resource_action_link_app_action",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
objects = IAmRoleAppResourceActionLinkManager()
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_app_resource_action_link"
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.app_resource.name}: {self.app_action.name}"
|
||||
|
||||
|
||||
class IAmRole(MasterModel):
|
||||
app_resource_action = models.ManyToManyField(
|
||||
IAmAppResourceActionLink,
|
||||
through="IAmRoleAppResourceActionLink",
|
||||
related_name="role_app_resource_action",
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_role"
|
||||
|
||||
|
||||
class IAmRoleAppResourceActionLink(models.Model):
|
||||
role = models.ForeignKey(
|
||||
IAmRole,
|
||||
related_name="role_app_resource_action_link_role",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
app_resource_action = models.ForeignKey(
|
||||
IAmAppResourceActionLink,
|
||||
related_name="role_app_resource_action_link_app_resource_action",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_role_app_resource_action_link"
|
||||
|
||||
|
||||
class IAmPrincipalGroup(MasterModel):
|
||||
role = models.ManyToManyField(
|
||||
IAmRole, through="IAmPricipalGroupRoleLink", related_name="principal_group_role"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal_group"
|
||||
|
||||
|
||||
class IAmPricipalGroupRoleLink(models.Model):
|
||||
principal_group = models.ForeignKey(
|
||||
IAmPrincipalGroup,
|
||||
related_name="role_link_principal_group",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
role = models.ForeignKey(
|
||||
IAmRole, related_name="role_link_role", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal_group_role_link"
|
||||
|
||||
|
||||
class IAmPrincipalManager(BaseUserManager):
|
||||
def create_user(self, email, password=None, **extra_fields):
|
||||
if not email:
|
||||
raise ValueError("The Email field must be set")
|
||||
email = self.normalize_email(email)
|
||||
user = self.model(email=email, **extra_fields)
|
||||
user.set_password(password)
|
||||
user.save(using=self._db)
|
||||
return user
|
||||
|
||||
def create_superuser(self, email, password=None, **extra_fields):
|
||||
extra_fields.setdefault("username", email)
|
||||
extra_fields.setdefault("is_staff", True)
|
||||
extra_fields.setdefault("is_superuser", True)
|
||||
extra_fields.setdefault("phone_no", "+919978895465")
|
||||
extra_fields.setdefault("gender", "M")
|
||||
extra_fields.setdefault("date_of_birth", timezone.now())
|
||||
extra_fields.setdefault("created_by", None)
|
||||
extra_fields.setdefault("created_on", timezone.now())
|
||||
extra_fields.setdefault("modified_by", None)
|
||||
extra_fields.setdefault("modified_on", timezone.now())
|
||||
return self.create_user(email, password, **extra_fields)
|
||||
|
||||
|
||||
class IAmPrincipal(AbstractUser):
|
||||
principal_type = models.ForeignKey(
|
||||
IAmPrincipalType,
|
||||
related_name="principals_type",
|
||||
null=True,
|
||||
on_delete=models.PROTECT,
|
||||
)
|
||||
principal_source = models.ForeignKey(
|
||||
IAmPrincipalSource,
|
||||
related_name="principals_source",
|
||||
on_delete=models.CASCADE,
|
||||
null=True,
|
||||
)
|
||||
email = models.EmailField(unique=True)
|
||||
gender = models.CharField(max_length=6, blank=True, null=True)
|
||||
date_of_birth = models.DateField(blank=True, null=True)
|
||||
# phone_no = PhoneNumberField()
|
||||
phone_no = models.CharField(max_length=15, blank=True, null=True)
|
||||
address_line1 = models.TextField(blank=True, null=True)
|
||||
address_line2 = models.TextField(blank=True, null=True)
|
||||
city = models.CharField(max_length=100, blank=True, null=True)
|
||||
state = models.CharField(max_length=100, blank=True, null=True)
|
||||
country = models.CharField(max_length=100, blank=True, null=True)
|
||||
post_code = models.CharField(max_length=100, blank=True, null=True)
|
||||
profile_photo = models.ImageField(upload_to="profile", blank=True, null=True)
|
||||
phone_verified = models.BooleanField(default=False)
|
||||
email_verified = models.BooleanField(default=False)
|
||||
created_by = models.ForeignKey(
|
||||
"self",
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="creations",
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
created_on = models.DateTimeField(auto_now_add=True)
|
||||
modified_by = models.ForeignKey(
|
||||
"self",
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="modifications",
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
modified_on = models.DateTimeField(auto_now=True)
|
||||
deleted = models.BooleanField(default=False)
|
||||
principal_group = models.ManyToManyField(
|
||||
IAmPrincipalGroup,
|
||||
through="IAmPrincipalGroupLink",
|
||||
related_name="principal_groups",
|
||||
)
|
||||
register_complete = models.BooleanField(default=False)
|
||||
player_id = models.CharField(max_length=255, null=True, blank=True, help_text="OneSignal player id for push notification")
|
||||
|
||||
USERNAME_FIELD = "email"
|
||||
REQUIRED_FIELDS = []
|
||||
|
||||
objects = IAmPrincipalManager()
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal"
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.email}"
|
||||
|
||||
|
||||
class IAmPrincipalGroupLink(models.Model):
|
||||
principal = models.ForeignKey(
|
||||
IAmPrincipal,
|
||||
related_name="principal_group_link_principal",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
principal_group = models.ForeignKey(
|
||||
IAmPrincipalGroup,
|
||||
related_name="principal_group_link_group",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal_principal_group_link"
|
||||
|
||||
|
||||
class IAmPrincipalOtp(models.Model):
|
||||
principal = models.ForeignKey(
|
||||
IAmPrincipal, related_name="principal_otp", on_delete=models.CASCADE
|
||||
)
|
||||
otp_code = models.CharField(max_length=4)
|
||||
otp_purpose = models.CharField(max_length=50, null=True, blank=True)
|
||||
valid_till = models.DateTimeField()
|
||||
is_used = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal_otp"
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.principal.phone_no}:{self.otp_code} : {self.otp_purpose}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.pk:
|
||||
self.otp_code = RandomGenerator.random_otp()
|
||||
self.valid_till = timezone.now() + timezone.timedelta(
|
||||
minutes=settings.OTP_EXPIRE_TIME
|
||||
)
|
||||
super(IAmPrincipalOtp, self).save(*args, **kwargs)
|
||||
|
||||
def is_expired(self):
|
||||
return timezone.now() >= self.valid_till
|
||||
|
||||
|
||||
class IAmPrincipalBiometric(BaseModel):
|
||||
principal = models.ForeignKey(
|
||||
IAmPrincipal, related_name="principal_biometric", on_delete=models.CASCADE
|
||||
)
|
||||
biometric_type = models.CharField(max_length=100)
|
||||
biometric_data = models.CharField(max_length=255)
|
||||
|
||||
class Meta:
|
||||
db_table = "iam_principal_biometric"
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.principal.first_name}:{self.biometric_type}"
|
||||
31
module_iam/resource_action.py
Normal file
31
module_iam/resource_action.py
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
PRINCIPAL_TYPE_USER = "user"
|
||||
PRINCIPAL_TYPE_ADMIN = "admin"
|
||||
|
||||
ACTION_CREATE = "create"
|
||||
ACTION_READ = "read"
|
||||
ACTION_UPDATE = "update"
|
||||
ACTION_DELETE = "delete"
|
||||
|
||||
RESOURCE_MANAGE_DASHBOARD = "manage_dashboard"
|
||||
RESOURCE_MANAGE_IAM = "manage_iam"
|
||||
RESOURCE_MANAGE_CUSTOMER = "manage_customer"
|
||||
RESOURCE_MANAGE_WALLET = "manage_wallet"
|
||||
RESOURCE_MANAGE_PAYMENT = "manage_payment"
|
||||
RESOURCE_MANAGE_GAMES = "manage_games"
|
||||
RESOURCE_MANAGE_CONTACT_US = "manage_contact_us"
|
||||
RESOURCE_MANAGE_TICKET = "manage_ticket"
|
||||
RESOURCE_MANAGE_CMS = "manage_cms"
|
||||
RESOURCE_MANAGE_REPORTS = "manage_reports"
|
||||
RESOURCE_MANAGE_COUPON = "manage_coupon"
|
||||
RESOURCE_MANAGE_FEEDBACK = "manage_feedback"
|
||||
RESOURCE_MANAGE_STOCK = "manage_stock"
|
||||
|
||||
|
||||
# These constants are used solely for managing the active and inactive state of pages
|
||||
# and should not be considered as resources in the typical sense.
|
||||
# They are used for page management purposes only.
|
||||
RESOURCE_IAM_PRINCIPAL = "iam_principal"
|
||||
RESOURCE_IAM_PRINCIPAL_GROUP = "iam_principal_group"
|
||||
RESOURCE_IAM_GROUP = "iam_group"
|
||||
RESOURCE_IAM_ROLE = "iam_role"
|
||||
3
module_iam/tests.py
Normal file
3
module_iam/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
8
module_iam/urls.py
Normal file
8
module_iam/urls.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = "module_iam"
|
||||
|
||||
urlpatterns = [
|
||||
path('dashboard/', views.DashboardView.as_view(), name="dashboard")
|
||||
]
|
||||
7
module_iam/views.py
Normal file
7
module_iam/views.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.shortcuts import render
|
||||
from django.views import generic
|
||||
|
||||
# Create your views here.
|
||||
|
||||
class DashboardView(generic.TemplateView):
|
||||
template_name = "base_structure/layout/dashboard.html"
|
||||
Reference in New Issue
Block a user