first commit

This commit is contained in:
bobbyvish
2024-02-26 13:28:32 +05:30
commit 69dbc56374
1010 changed files with 136332 additions and 0 deletions

0
module_iam/__init__.py Normal file
View File

18
module_iam/admin.py Normal file
View 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
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ModuleIamConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'module_iam'

View 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'),
),
]

View 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),
),
]

View 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),
),
]

View File

369
module_iam/models.py Normal file
View 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}"

View 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
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

8
module_iam/urls.py Normal file
View 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
View 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"