@@ -13,7 +13,7 @@ from django.urls import reverse_lazy
|
||||
from django.views import generic
|
||||
from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_iam.models import IAmPrincipal
|
||||
from module_project import constants, date_utils
|
||||
from module_project.utils import JsonResponseUtil
|
||||
@@ -29,7 +29,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
class BaseView(generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
action = None
|
||||
template_name = None
|
||||
model = None
|
||||
@@ -42,8 +42,9 @@ class BaseView(generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class BaseCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class BaseCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
page_title = None
|
||||
model = None
|
||||
template_name = "module_activity/base_add.html"
|
||||
@@ -156,7 +157,7 @@ class BaseArchiveView(generic.TemplateView):
|
||||
return data
|
||||
|
||||
|
||||
class PopulateFoodIngredientView(generic.View):
|
||||
class PopulateFoodIngredientView(permission.ResourcePermissionRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
resource = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
@@ -481,8 +482,9 @@ class UserActivityRecordView(generic.View):
|
||||
return JsonResponseUtil.error(message="Something went wrong", errors=str(e))
|
||||
|
||||
|
||||
class MealDetialView(generic.TemplateView):
|
||||
class MealDetialView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
template_name = "module_activity/meal_detail.html"
|
||||
model = MealRecord
|
||||
|
||||
@@ -503,8 +505,9 @@ class MealDetialView(generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class MedicationDetailView(generic.TemplateView):
|
||||
class MedicationDetailView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
template_name = "module_activity/medication_detail.html"
|
||||
model = Medication
|
||||
|
||||
@@ -520,8 +523,9 @@ class MedicationDetailView(generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class BowelDetailView(generic.TemplateView):
|
||||
class BowelDetailView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
template_name = "module_activity/bowel_detail.html"
|
||||
model = Bowel
|
||||
|
||||
@@ -538,8 +542,9 @@ class BowelDetailView(generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class MealSymptomDetailView(generic.TemplateView):
|
||||
class MealSymptomDetailView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
template_name = "module_activity/meal_symptom_details.html"
|
||||
model = MealSymptomRecord
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
from module_activity.models import (Bowel, ChronicCondition, Intolerance, MealRecord, MealSymptomRecord, Medication,
|
||||
PastTreatment, PrincipalHealthData,
|
||||
Symptoms)
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_iam.models import IAmPrincipal, IAmPrincipalType
|
||||
from module_project import constants
|
||||
from module_project.mixins import ActionMixin
|
||||
@@ -78,22 +78,22 @@ class CustomPasswordResetDoneView(PasswordResetDoneView):
|
||||
template_name = "module_auth/password_reset_done.html"
|
||||
|
||||
|
||||
class UserDashView(LoginRequiredMixin, generic.TemplateView):
|
||||
class UserDashView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
action = None
|
||||
template_name = "module_auth/users_list.html"
|
||||
model = IAmPrincipal
|
||||
context_objext_name = "obj"
|
||||
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context["page_name"] = self.page_name
|
||||
return context
|
||||
|
||||
class UserCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class UserCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
model = IAmPrincipal
|
||||
form_class = UserForm
|
||||
template_name = "module_auth/user_add.html"
|
||||
@@ -220,9 +220,9 @@ class UserActionView(ActionMixin):
|
||||
|
||||
return JsonResponseUtil.success(message=message)
|
||||
|
||||
class UserRecordView(LoginRequiredMixin, generic.View):
|
||||
class UserRecordView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
action = None
|
||||
model = IAmPrincipal
|
||||
template_name = "module_auth/user_view.html"
|
||||
@@ -250,7 +250,6 @@ class UserRecordView(LoginRequiredMixin, generic.View):
|
||||
principal=id
|
||||
).order_by('-id')[:5]
|
||||
|
||||
|
||||
def get(self, request, id):
|
||||
# Retrieve the IAmPrincipal instance
|
||||
principal_instance = get_object_or_404(IAmPrincipal, id=id)
|
||||
@@ -304,9 +303,9 @@ class UserRecordView(LoginRequiredMixin, generic.View):
|
||||
return render(request, self.template_name, context=context)
|
||||
|
||||
|
||||
class UserArchiveList(LoginRequiredMixin, generic.TemplateView):
|
||||
class UserArchiveList(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_USER
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_USER
|
||||
action = None
|
||||
template_name = "module_auth/users_archive_list.html"
|
||||
model = IAmPrincipal
|
||||
|
||||
@@ -8,7 +8,7 @@ from django.urls import reverse_lazy
|
||||
from django.views import generic
|
||||
from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_iam.models import IAmPrincipal
|
||||
from module_project import constants
|
||||
from module_project.mixins import ActionMixin, DatatablesMixin
|
||||
@@ -20,9 +20,9 @@ from .models import Faqs, Organization
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FaqView(LoginRequiredMixin, generic.TemplateView):
|
||||
class FaqView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
action = None
|
||||
template_name = "module_cms/faq.html"
|
||||
model = Faqs
|
||||
@@ -71,7 +71,7 @@ class FaqListJson(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class FaqCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class FaqCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
resource = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
@@ -139,9 +139,9 @@ class FaqActionView(ActionMixin):
|
||||
model = Faqs
|
||||
|
||||
|
||||
class FaqArchiveView(LoginRequiredMixin, generic.TemplateView):
|
||||
class FaqArchiveView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_FAQS
|
||||
action = None
|
||||
template_name = "module_cms/faq_archive.html"
|
||||
model = Faqs
|
||||
@@ -151,8 +151,9 @@ class FaqArchiveView(LoginRequiredMixin, generic.TemplateView):
|
||||
context["page_name"] = self.page_name
|
||||
return context
|
||||
|
||||
class AboutUsView(LoginRequiredMixin, generic.DetailView):
|
||||
class AboutUsView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.DetailView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_CMS
|
||||
resource = iam_constant.RESOURCE_MANAGE_CMS
|
||||
template_name = "module_cms/about_us_view.html"
|
||||
model = Organization
|
||||
context_object_name = "organization"
|
||||
@@ -166,11 +167,10 @@ class AboutUsView(LoginRequiredMixin, generic.DetailView):
|
||||
return context
|
||||
|
||||
|
||||
class AboutUsCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class AboutUsCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_CMS
|
||||
resource = None
|
||||
|
||||
resource = iam_constant.RESOURCE_MANAGE_CMS
|
||||
# Initialize the action as ACTION_CREATE (can change based on logic)
|
||||
action = None # Default action
|
||||
|
||||
@@ -229,9 +229,9 @@ class AboutUsCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
return redirect(self.success_url)
|
||||
|
||||
|
||||
class TermsConditionView(LoginRequiredMixin, generic.DetailView):
|
||||
class TermsConditionView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.DetailView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_T_C
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_T_C
|
||||
action = None
|
||||
template_name = "module_cms/terms_and_condition_view.html"
|
||||
model = Organization
|
||||
@@ -246,10 +246,10 @@ class TermsConditionView(LoginRequiredMixin, generic.DetailView):
|
||||
return context
|
||||
|
||||
|
||||
class TermsConditionCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class TermsConditionCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_T_C
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_T_C
|
||||
|
||||
# Initialize the action as ACTION_CREATE (can change based on logic)
|
||||
action = None # Default action
|
||||
@@ -309,9 +309,9 @@ class TermsConditionCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
return redirect(self.success_url)
|
||||
|
||||
|
||||
class PrivacyPolicyView(LoginRequiredMixin, generic.DetailView):
|
||||
class PrivacyPolicyView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.DetailView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_PRIVACYPOLICY
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_PRIVACYPOLICY
|
||||
action = None
|
||||
template_name = "module_cms/privacy_policy_view.html"
|
||||
model = Organization
|
||||
@@ -326,10 +326,10 @@ class PrivacyPolicyView(LoginRequiredMixin, generic.DetailView):
|
||||
return context
|
||||
|
||||
|
||||
class PrivacyPolicyCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class PrivacyPolicyCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_PRIVACYPOLICY
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_PRIVACYPOLICY
|
||||
|
||||
# Initialize the action as ACTION_CREATE (can change based on logic)
|
||||
action = None # Default action
|
||||
|
||||
@@ -27,6 +27,8 @@ from .iam_constant import (
|
||||
RESOURCE_IAM_ROLE,
|
||||
)
|
||||
|
||||
from .models import IAmPrincipal
|
||||
|
||||
def iam_constants_context(request):
|
||||
return {
|
||||
'iam_constants_context': {
|
||||
@@ -57,4 +59,15 @@ def iam_constants_context(request):
|
||||
'RESOURCE_IAM_GROUP': RESOURCE_IAM_GROUP,
|
||||
'RESOURCE_IAM_ROLE': RESOURCE_IAM_ROLE,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def resource_permissions(request):
|
||||
if request.user.is_authenticated:
|
||||
resource_permissions = IAmPrincipal.objects.filter(id=request.user.id).values_list('principal_resource__name', flat=True)
|
||||
else:
|
||||
resource_permissions = []
|
||||
|
||||
return {
|
||||
'resource_permissions': resource_permissions,
|
||||
}
|
||||
86
module_iam/permission.py
Normal file
86
module_iam/permission.py
Normal file
@@ -0,0 +1,86 @@
|
||||
from functools import wraps
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from . import models
|
||||
from django.db.models import Q
|
||||
# import logging
|
||||
|
||||
# logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# class CustomPermissionRequiredMixin:
|
||||
# resource = None
|
||||
# action = None
|
||||
|
||||
# def has_custom_permission(self, user, resource, action):
|
||||
# if not self.resource or not self.action:
|
||||
# raise AttributeError("Resource and action attributes must be defined in the view")
|
||||
|
||||
# # if not request.user.is_authenticated:
|
||||
# # return self.handle_no_permission()
|
||||
|
||||
# if user.is_superuser: # will chagne to principal type for admin
|
||||
# return True
|
||||
|
||||
# permission_query = Q(
|
||||
# principal_group__role__app_resource_action__app_resource__name=resource,
|
||||
# principal_group__role__app_resource_action__app_action__name=action
|
||||
# )
|
||||
# return models.IAmPrincipal.objects.filter(permission_query, id=user.id).exists()
|
||||
|
||||
# def dispatch(self, request, *args, **kwargs):
|
||||
# if not self.has_custom_permission(request.user, self.resource, self.action):
|
||||
# # logger.warning(f"Permission denied for user {request.user} accessing {self.resource}:{self.action}")
|
||||
# raise PermissionDenied("You do not have permission to access this resource.")
|
||||
# return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
# @classmethod
|
||||
# def as_decorator(cls, resource, action):
|
||||
# def decorator(view_func):
|
||||
# @wraps(view_func)
|
||||
# def _wrapped_view(request, *args, **kwargs):
|
||||
# instance = cls()
|
||||
# instance.resource = resource
|
||||
# instance.action = action
|
||||
# if not instance.has_custom_permission(request.user, instance.resource, instance.action):
|
||||
# raise PermissionDenied("You do not have permission to access this resource.")
|
||||
# return view_func(request, *args, **kwargs)
|
||||
# return _wrapped_view
|
||||
# return decorator
|
||||
|
||||
|
||||
class ResourcePermissionRequiredMixin:
|
||||
resource = None
|
||||
|
||||
def has_resource_permission(self, user, resource):
|
||||
# if not self.resource or resource:
|
||||
# raise AttributeError("Resource attributes must be defined in the view")
|
||||
|
||||
# if not request.user.is_authenticated:
|
||||
# return self.handle_no_permission()
|
||||
|
||||
if user.is_superuser: # will chagne to principal type for admin
|
||||
return True
|
||||
|
||||
permission_query = Q(
|
||||
principal_resource__name=resource,
|
||||
)
|
||||
return models.IAmPrincipal.objects.filter(permission_query, id=user.id).exists()
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not self.has_resource_permission(request.user, self.resource):
|
||||
# logger.warning(f"Permission denied for user {request.user} accessing {self.resource}:{self.action}")
|
||||
raise PermissionDenied("You do not have permission to access this resource.")
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def as_decorator(cls, resource):
|
||||
def decorator(view_func):
|
||||
@wraps(view_func)
|
||||
def _wrapped_view(request, *args, **kwargs):
|
||||
instance = cls()
|
||||
instance.resource = resource
|
||||
if not instance.has_resource_permission(request.user, instance.resource):
|
||||
raise PermissionDenied("You do not have permission to access this resource.")
|
||||
return view_func(request, *args, **kwargs)
|
||||
return _wrapped_view
|
||||
return decorator
|
||||
27
module_iam/templatetags/resource_permission.py
Normal file
27
module_iam/templatetags/resource_permission.py
Normal file
@@ -0,0 +1,27 @@
|
||||
from django import template
|
||||
from module_iam.permission import ResourcePermissionRequiredMixin
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.filter(name='has_resource_permission')
|
||||
def has_resource_permission(user, resource):
|
||||
"""
|
||||
Check if a user has a specific resource and action permission.
|
||||
|
||||
Args:
|
||||
user (User): The user to check for permission.
|
||||
resource_action (str): The resource and action string (e.g., "resource_name.action_name").
|
||||
|
||||
Returns:
|
||||
bool: True if the user has the specified permission, False otherwise.
|
||||
|
||||
Example usage in a template:
|
||||
{% if user|has_resource_permission:"article" %}
|
||||
<!-- Render content for users with permission -->
|
||||
{% else %}
|
||||
<!-- Render content for users without permission -->
|
||||
{% endif %}
|
||||
"""
|
||||
# resource, action = resource_action.split(".")
|
||||
return ResourcePermissionRequiredMixin().has_resource_permission(user, resource)
|
||||
@@ -14,12 +14,12 @@ from django.urls import reverse_lazy
|
||||
from django.views import generic
|
||||
from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_project import constants
|
||||
from module_project.mixins import ActionMixin, DatatablesMixin
|
||||
from module_project.utils import JsonResponseUtil
|
||||
|
||||
from .forms import (CustomAuthenticationForm, IAmPrincipalForm,IAmPrincipalResourceLinkForm,
|
||||
from .forms import (CustomAuthenticationForm, IAmPrincipalForm, IAmPrincipalResourceLinkForm,
|
||||
IAmPrincipalGroupLinkForm, IAmPrincipalGroupRoleLinkForm,
|
||||
IAmPrincipalRoleAppResourceActionLinkForm, ProfileEditForm)
|
||||
from .models import (IAmAppResourceActionLink, IAmPrincipal, IAmPrincipalGroup,
|
||||
@@ -30,8 +30,9 @@ logger = logging.getLogger(__name__)
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class DashboardView(generic.TemplateView):
|
||||
class DashboardView(LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
resource = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
template_name = "base_structure/layout/dashboard.html"
|
||||
|
||||
def get_user_count(self):
|
||||
@@ -51,8 +52,9 @@ class DashboardView(generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class PrincipalCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class PrincipalCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL
|
||||
resource = iam_constant.RESOURCE_IAM_PRINCIPAL
|
||||
model = IAmPrincipal
|
||||
form_class = IAmPrincipalForm
|
||||
template_name = "module_iam/iam_principal_add.html"
|
||||
@@ -137,10 +139,9 @@ class PrincipalArchiveListJsonView(BaseDatatableView):
|
||||
)
|
||||
return qs
|
||||
|
||||
|
||||
|
||||
class PrincipalResourcePermissionEditView(LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
class PrincipalResourcePermissionEditView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL
|
||||
resource = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
model = IAmPrincipal
|
||||
template_name = "module_iam/iam_principal_resource_permission_edit.html"
|
||||
form_class = IAmPrincipalResourceLinkForm
|
||||
@@ -177,8 +178,9 @@ class PrincipalResourcePermissionEditView(LoginRequiredMixin, generic.View):
|
||||
return redirect(self.success_url)
|
||||
|
||||
|
||||
class PrincipalGroupLinkView(LoginRequiredMixin, generic.TemplateView):
|
||||
class PrincipalGroupLinkView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
resource = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
model = IAmPrincipal
|
||||
template_name = "module_iam/iam_principal_group_link.html"
|
||||
|
||||
@@ -189,7 +191,7 @@ class PrincipalGroupLinkView(LoginRequiredMixin, generic.TemplateView):
|
||||
|
||||
class PrincipalArchiveView(PrincipalGroupLinkView):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_IAM_PRINCIPAL
|
||||
action = None
|
||||
template_name = "module_iam/iam_principal_archive.html"
|
||||
|
||||
@@ -221,7 +223,7 @@ class PrincipalGroupLinkAdminListJsonView(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class PrincipalGroupLinkSubAdminListJsonView(BaseDatatableView):
|
||||
class PrincipalGroupLinkSubAdminListJsonView(permission.ResourcePermissionRequiredMixin, BaseDatatableView):
|
||||
model = IAmPrincipal
|
||||
columns = ["id", "first_name", "email", "is_active"]
|
||||
order_columns = ["id", "first_name", "email", "is_active"]
|
||||
@@ -251,8 +253,9 @@ class PrincipalGroupLinkSubAdminListJsonView(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class PrincipalGroupLinkEditView(LoginRequiredMixin, generic.View):
|
||||
class PrincipalGroupLinkEditView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
resource = iam_constant.RESOURCE_IAM_PRINCIPAL_GROUP
|
||||
model = IAmPrincipal
|
||||
template_name = "module_iam/iam_principal_group_link_edit.html"
|
||||
form_class = IAmPrincipalGroupLinkForm
|
||||
@@ -321,8 +324,9 @@ class PrincipalGroupLinkActionView(generic.View):
|
||||
return JsonResponseUtil.success(message=message)
|
||||
|
||||
|
||||
class PrincipalGroupView(LoginRequiredMixin, generic.TemplateView):
|
||||
class PrincipalGroupView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_IAM_GROUP
|
||||
resource = iam_constant.RESOURCE_IAM_GROUP
|
||||
model = IAmPrincipalGroup
|
||||
template_name = "module_iam/iam_group.html"
|
||||
|
||||
@@ -355,8 +359,9 @@ class PrincipalGroupListJsonView(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class PrincipalGroupCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class PrincipalGroupCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_GROUP
|
||||
resource = iam_constant.RESOURCE_IAM_GROUP
|
||||
page_title = "Principal Group"
|
||||
model = IAmPrincipalGroup
|
||||
template_name = "module_iam/iam_group_add.html"
|
||||
@@ -407,8 +412,9 @@ class PrincipalGroupActionView(ActionMixin):
|
||||
class PrincipalGroupArchiveView(PrincipalGroupView):
|
||||
template_name = "module_iam/iam_group_archive_list.html"
|
||||
|
||||
class AppRoleView(LoginRequiredMixin, generic.TemplateView):
|
||||
class AppRoleView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_IAM_ROLE
|
||||
resource = iam_constant.RESOURCE_IAM_ROLE
|
||||
model = IAmRole
|
||||
template_name = "module_iam/iam_role.html"
|
||||
|
||||
@@ -464,8 +470,9 @@ class AppRoleListJsonView(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class AppRoleCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class AppRoleCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_IAM_ROLE
|
||||
resource = iam_constant.RESOURCE_IAM_ROLE
|
||||
model = IAmRole
|
||||
template_name = "module_iam/iam_role_add.html"
|
||||
form_class = IAmPrincipalRoleAppResourceActionLinkForm
|
||||
@@ -526,8 +533,9 @@ class AppRoleArchiveView(AppRoleView):
|
||||
template_name = "module_iam/iam_role_archive.html"
|
||||
|
||||
|
||||
class PrincipalProfileView(LoginRequiredMixin, generic.TemplateView):
|
||||
class PrincipalProfileView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
resource = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
model = IAmPrincipal
|
||||
template_name = "module_iam/profile_details.html"
|
||||
|
||||
@@ -545,8 +553,9 @@ class PrincipalProfileView(LoginRequiredMixin, generic.TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class PrincipalProfileEditView(generic.View):
|
||||
class PrincipalProfileEditView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
resource = iam_constant.RESOURCE_MANAGE_DASHBOARD
|
||||
model = IAmPrincipal
|
||||
template_name = "module_iam/profile_details_edit.html"
|
||||
form_class = ProfileEditForm
|
||||
|
||||
@@ -12,7 +12,7 @@ from django.urls import reverse_lazy
|
||||
from django.views import generic
|
||||
from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_iam.iam_constant import PRINCIPAL_TYPE_USER
|
||||
from module_iam.models import IAmPrincipal
|
||||
from module_project import constants, date_utils
|
||||
@@ -25,7 +25,7 @@ from .models import PushNotification
|
||||
|
||||
|
||||
# Create your views here.
|
||||
class NotificationView(LoginRequiredMixin, generic.TemplateView):
|
||||
class NotificationView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
resource = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
template_name = "module_notification/notification.html"
|
||||
@@ -77,7 +77,7 @@ class NotificationListJsonView(BaseDatatableView):
|
||||
return qs
|
||||
|
||||
|
||||
class NotificationCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class NotificationCreateOrUpdateView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.View):
|
||||
# Set the page_name and resource
|
||||
page_name = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
resource = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
@@ -145,9 +145,9 @@ class NotificationCreateOrUpdateView(LoginRequiredMixin, generic.View):
|
||||
class NotificationActionView(ActionMixin):
|
||||
model = PushNotification
|
||||
|
||||
class NotificationArchiveView(LoginRequiredMixin, generic.TemplateView):
|
||||
class NotificationArchiveView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_NOTIFICATION
|
||||
action = None
|
||||
template_name = "module_notification/notification_archive.html"
|
||||
model = PushNotification
|
||||
|
||||
@@ -89,7 +89,7 @@ TEMPLATES = [
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'module_iam.iam_context_processors.iam_constants_context',
|
||||
'module_iam.context_processors.iam_constants_context',
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
@@ -285,7 +285,7 @@ SIMPLE_JWT = {
|
||||
}
|
||||
|
||||
CRONJOBS = [
|
||||
('* * * * *', 'manage_notification.cron_job.notification_for_meal_and_medication'),
|
||||
('0 18 * * *', 'manage_notification.cron_job.notification_for_meal_and_medication'),
|
||||
]
|
||||
|
||||
# Additional configuration for cron jobs
|
||||
|
||||
@@ -7,7 +7,7 @@ from django.urls import reverse_lazy
|
||||
from django.views import generic
|
||||
from django_datatables_view.base_datatable_view import BaseDatatableView
|
||||
|
||||
from module_iam import iam_constant
|
||||
from module_iam import iam_constant, permission
|
||||
from module_iam.models import IAmPrincipal
|
||||
from module_project import constants
|
||||
from module_project.mixins import ActionMixin, DatatablesMixin
|
||||
@@ -19,9 +19,9 @@ from .models import ContactUs, Feedback
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class ContactUsView(LoginRequiredMixin, generic.TemplateView):
|
||||
class ContactUsView(LoginRequiredMixin, permission.ResourcePermissionRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_CONTACT_US
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_CONTACT_US
|
||||
action = None
|
||||
template_name = "module_support/contact_us.html"
|
||||
model = ContactUs
|
||||
@@ -84,9 +84,9 @@ class ContactUsListJson(BaseDatatableView):
|
||||
class ContactUsActionView(ActionMixin):
|
||||
model = ContactUs
|
||||
|
||||
class ContactUsArchiveView(LoginRequiredMixin, generic.TemplateView):
|
||||
class ContactUsArchiveView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_CONTACT_US
|
||||
resource = None
|
||||
resource = iam_constant.RESOURCE_MANAGE_CONTACT_US
|
||||
action = None
|
||||
template_name = "module_support/contactus_archive_list.html"
|
||||
model = ContactUs
|
||||
@@ -128,8 +128,7 @@ class ContactUsReplyView(LoginRequiredMixin, generic.View):
|
||||
return JsonResponseUtil.error(message=constants.FAILURE, errors="Missing 'id' or 'message' in the request")
|
||||
|
||||
|
||||
|
||||
class FeedbackView(LoginRequiredMixin, generic.TemplateView):
|
||||
class FeedbackView(permission.ResourcePermissionRequiredMixin, LoginRequiredMixin, generic.TemplateView):
|
||||
page_name = iam_constant.RESOURCE_MANAGE_FEEDBACK
|
||||
resource = iam_constant.RESOURCE_MANAGE_FEEDBACK
|
||||
action = None
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<!-- BEGIN SIDEBAR -->
|
||||
{% load static%}
|
||||
{% load resource_permission %}
|
||||
<div class="sidebar-wrapper sidebar-theme">
|
||||
|
||||
<nav id="sidebar">
|
||||
@@ -23,10 +24,6 @@
|
||||
</div>
|
||||
<div class="shadow-bottom"></div>
|
||||
<ul class="list-unstyled menu-categories" id="accordionExample">
|
||||
{% comment %} example of menu heading dont delete it {% endcomment %}
|
||||
{% comment %} <li class="menu menu-heading">
|
||||
<div class="heading"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-minus"><line x1="5" y1="12" x2="19" y2="12"></line></svg><span>APPLICATIONS</span></div>
|
||||
</li> {% endcomment %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_MANAGE_DASHBOARD %}active{% endif %}">
|
||||
<a href="{% url 'module_iam:dashboard'%}" aria-expanded="false" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -35,6 +32,7 @@
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_IAM %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_IAM_PRINCIPAL or page_name == iam_constants_context.RESOURCE_IAM_PRINCIPAL_GROUP or page_name == iam_constants_context.RESOURCE_IAM_GROUP or page_name == iam_constants_context.RESOURCE_IAM_ROLE %}active{% endif %}">
|
||||
<a href="#iam" data-bs-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -57,6 +55,8 @@
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_USER %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_MANAGE_USER %}active{% endif %}">
|
||||
<a href="{% url 'module_auth:users'%}" aria-expanded="false" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -65,6 +65,8 @@
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_FAQS or user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_T_C or user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_PRIVACYPOLICY %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_MANAGE_CMS or page_name == iam_constants_context.RESOURCE_MANAGE_FAQS or page_name == iam_constants_context.RESOURCE_MANAGE_T_C or page_name == iam_constants_context.RESOURCE_MANAGE_PRIVACYPOLICY %}active{% endif %}">
|
||||
<a href="#manage_cms" data-bs-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -76,18 +78,25 @@
|
||||
</div>
|
||||
</a>
|
||||
<ul class="collapse submenu list-unstyled show" id="manage_cms" data-bs-parent="#accordionExample">
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_FAQS %}
|
||||
<li class="{% if page_name == iam_constants_context.RESOURCE_MANAGE_FAQS %}active{% endif %}">
|
||||
<a href="{% url 'module_cms:faq'%}"> FAQ's</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_T_C %}
|
||||
<li class="{% if page_name == iam_constants_context.RESOURCE_MANAGE_T_C %}active{% endif %}">
|
||||
<a href="{% url 'module_cms:terms_and_condition'%}"> Terms & Condition </a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_PRIVACYPOLICY %}
|
||||
<li class="{% if page_name == iam_constants_context.RESOURCE_MANAGE_PRIVACYPOLICY %}active{% endif %}">
|
||||
<a href="{% url 'module_cms:privacy_policy'%}">Privacy Policy</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_CONTACT_US or user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_FEEDBACK %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_MANAGE_SUPPORT or page_name == iam_constants_context.RESOURCE_MANAGE_CONTACT_US or page_name == iam_constants_context.RESOURCE_MANAGE_FEEDBACK %}active{% endif %}">
|
||||
<a href="#manage_support" data-bs-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -99,14 +108,19 @@
|
||||
</div>
|
||||
</a>
|
||||
<ul class="collapse submenu list-unstyled show" id="manage_support" data-bs-parent="#accordionExample">
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_CONTACT_US %}
|
||||
<li class="{% if page_name == iam_constants_context.RESOURCE_MANAGE_CONTACT_US %}active{% endif %}">
|
||||
<a href="{% url 'module_support:contact_us'%}"> Contact Us</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_FEEDBACK %}
|
||||
<li class="{% if page_name == iam_constants_context.RESOURCE_MANAGE_FEEDBACK %}active{% endif %}">
|
||||
<a href="{% url 'module_support:feedback'%}"> Feedback </a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
@@ -135,6 +149,7 @@
|
||||
</div>
|
||||
</a>
|
||||
</li> -->
|
||||
{% if user|has_resource_permission:iam_constants_context.RESOURCE_MANAGE_NOTIFICATION %}
|
||||
<li class="menu {% if page_name == iam_constants_context.RESOURCE_MANAGE_NOTIFICATION %}active{% endif %}">
|
||||
<a href="{% url 'module_notification:notification'%}" aria-expanded="false" class="dropdown-toggle">
|
||||
<div class="">
|
||||
@@ -143,6 +158,7 @@
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
|
||||
@@ -81,9 +81,9 @@
|
||||
<td><p>Height:</p></td>
|
||||
</tr>
|
||||
<tr class=" d-flex flex-column">
|
||||
<td><p>{{obj.health_data_principal.weight}} kg</p></td>
|
||||
<td><p>{{obj.health_data_principal.weight}} {{obj.health_data_principal.weight_unit}}</p></td>
|
||||
<td><p>{{obj.health_data_principal.ethenicity}}</p></td>
|
||||
<td><p>{{obj.health_data_principal.height}} cm</p></td>
|
||||
<td><p>{{obj.health_data_principal.height}} {{obj.health_data_principal.height_unit}}</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -196,10 +196,10 @@ $(document).ready(function() {
|
||||
};
|
||||
|
||||
dataTableInstance = initializeDataTable(table1Settings);
|
||||
activeSwitchEventListener(dataTableInstance);
|
||||
activeSwitchEventListener(dataTableInstance, table1Settings);
|
||||
|
||||
dataTable2Instance = initialize2DataTable(table2Settings);
|
||||
activeSwitchEventListener(dataTable2Instance);
|
||||
activeSwitchEventListener(dataTable2Instance, table2Settings);
|
||||
});
|
||||
|
||||
// Function to initialize DataTable
|
||||
@@ -490,15 +490,15 @@ function archiveAction(e, dt, node, config, tableSettings) {
|
||||
|
||||
|
||||
// Function to add event listener for switch
|
||||
function activeSwitchEventListener(tableInstance) {
|
||||
function activeSwitchEventListener(tableInstance, tableSettings) {
|
||||
// Add event listener for switch change event
|
||||
tableInstance.on('change', '.switch-input', function() {
|
||||
var rowId = $(this).closest('tr').find('.switch-input').data('id');
|
||||
var isActive = $(this).prop('checked');
|
||||
console.log(rowId, isActive)
|
||||
console.log("calling this data", rowId, isActive)
|
||||
// Perform active toggle action for the current user
|
||||
$.ajax({
|
||||
url: actionUrl, // Replace with your active toggle endpoint
|
||||
url: tableSettings.actionUrl, // Replace with your active toggle endpoint
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: "active",
|
||||
|
||||
Reference in New Issue
Block a user