You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
8.5 KiB
188 lines
8.5 KiB
from django.db import models
|
|
from django.utils.text import slugify
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
PERMISSION_CATEGORIES = {
|
|
_("Identity & Profiles"): [
|
|
"is_searchable",
|
|
"can_submit_verification",
|
|
"can_view_full_profiles",
|
|
"can_manage_institutions",
|
|
],
|
|
_("Chat & Communications"): [
|
|
"can_send_direct_messages",
|
|
"can_create_group_chats",
|
|
"can_start_video_calls",
|
|
"can_moderate_chat",
|
|
"is_chat_muted",
|
|
],
|
|
_("CMS & Articles"): [
|
|
"can_create_posts",
|
|
"can_publish_posts_directly",
|
|
"can_edit_own_posts",
|
|
"can_delete_own_posts",
|
|
"can_comment",
|
|
],
|
|
_("LMS & Academics"): [
|
|
"can_enroll_courses",
|
|
"can_create_courses",
|
|
"can_publish_courses",
|
|
"can_issue_certificates",
|
|
"can_grade_submissions",
|
|
"has_premium_lms_access",
|
|
],
|
|
_("Meetings"): [
|
|
"can_request_meetings",
|
|
"can_accept_meetings",
|
|
],
|
|
_("Events"): [
|
|
"can_register_events",
|
|
"can_create_events",
|
|
"can_publish_events",
|
|
"can_checkin_attendees",
|
|
"can_export_attendee_list",
|
|
],
|
|
_("Community Projects"): [
|
|
"can_volunteer",
|
|
"can_create_projects",
|
|
"can_manage_project_tasks",
|
|
"can_approve_projects",
|
|
],
|
|
_("Donations & Charity"): [
|
|
"can_make_donations",
|
|
"can_create_donation_campaigns",
|
|
"can_view_donation_reports",
|
|
],
|
|
_("Support & Tickets"): [
|
|
"can_create_tickets",
|
|
"can_reply_tickets",
|
|
"can_manage_tickets",
|
|
],
|
|
_("Dynamic Forms"): [
|
|
"can_submit_forms",
|
|
"can_create_forms",
|
|
"can_export_form_data",
|
|
],
|
|
_("Diplomacy & Institutional"): [
|
|
"can_view_diplomatic_reports",
|
|
"can_create_diplomatic_reports",
|
|
],
|
|
_("Administration & Security"): [
|
|
"can_access_admin_panel",
|
|
"can_manage_users",
|
|
"can_ban_users",
|
|
"can_view_analytics",
|
|
],
|
|
}
|
|
|
|
ALL_PERMISSION_FIELDS = [perm for perms in PERMISSION_CATEGORIES.values() for perm in perms]
|
|
|
|
|
|
class Role(models.Model):
|
|
name = models.CharField(max_length=100, unique=True, verbose_name=_("Role Name"))
|
|
slug = models.SlugField(max_length=100, unique=True, blank=True, verbose_name=_("Slug / Identifier"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
is_default = models.BooleanField(
|
|
default=False,
|
|
verbose_name=_("Default Role for New Users"),
|
|
help_text=_("Automatically assigned to new registrations if no other role is selected.")
|
|
)
|
|
is_system = models.BooleanField(
|
|
default=False,
|
|
verbose_name=_("System Core Role"),
|
|
help_text=_("Marks default system roles. Admins can configure permissions, but deletion is restricted.")
|
|
)
|
|
|
|
# 1. Identity & Profiles
|
|
is_searchable = models.BooleanField(default=True, verbose_name=_("Appear in User Searches / Directory"))
|
|
can_submit_verification = models.BooleanField(default=True, verbose_name=_("Submit Verification Documents"))
|
|
can_view_full_profiles = models.BooleanField(default=True, verbose_name=_("View Full Profiles"))
|
|
can_manage_institutions = models.BooleanField(default=False, verbose_name=_("Manage Institutions"))
|
|
|
|
# 2. Chat & Communications
|
|
can_send_direct_messages = models.BooleanField(default=True, verbose_name=_("Send Direct Messages"))
|
|
can_create_group_chats = models.BooleanField(default=True, verbose_name=_("Create Group Chats"))
|
|
can_start_video_calls = models.BooleanField(default=False, verbose_name=_("Start Video Calls"))
|
|
can_moderate_chat = models.BooleanField(default=False, verbose_name=_("Moderate Chat Rooms"))
|
|
is_chat_muted = models.BooleanField(default=False, verbose_name=_("Chat Muted (Kill-switch)"))
|
|
|
|
# 3. CMS & Articles
|
|
can_create_posts = models.BooleanField(default=True, verbose_name=_("Create Posts"))
|
|
can_publish_posts_directly = models.BooleanField(default=False, verbose_name=_("Publish Posts Directly (Bypass Moderation)"))
|
|
can_edit_own_posts = models.BooleanField(default=True, verbose_name=_("Edit Own Posts"))
|
|
can_delete_own_posts = models.BooleanField(default=True, verbose_name=_("Delete Own Posts"))
|
|
can_comment = models.BooleanField(default=True, verbose_name=_("Comment on Posts"))
|
|
|
|
# 4. LMS & Academics
|
|
can_enroll_courses = models.BooleanField(default=True, verbose_name=_("Enroll in Courses"))
|
|
can_create_courses = models.BooleanField(default=False, verbose_name=_("Create Courses"))
|
|
can_publish_courses = models.BooleanField(default=False, verbose_name=_("Publish Courses Directly"))
|
|
can_issue_certificates = models.BooleanField(default=False, verbose_name=_("Issue Certificates"))
|
|
can_grade_submissions = models.BooleanField(default=False, verbose_name=_("Grade Submissions"))
|
|
has_premium_lms_access = models.BooleanField(default=False, verbose_name=_("Premium LMS Access"))
|
|
|
|
# 5. Meetings
|
|
can_request_meetings = models.BooleanField(default=True, verbose_name=_("Send Meeting Requests"))
|
|
can_accept_meetings = models.BooleanField(default=False, verbose_name=_("Accept / Host Meetings"))
|
|
|
|
# 6. Events
|
|
can_register_events = models.BooleanField(default=True, verbose_name=_("Register for Events"))
|
|
can_create_events = models.BooleanField(default=False, verbose_name=_("Create Events"))
|
|
can_publish_events = models.BooleanField(default=False, verbose_name=_("Publish Events Directly"))
|
|
can_checkin_attendees = models.BooleanField(default=False, verbose_name=_("Check-in Attendees (Scan Tickets)"))
|
|
can_export_attendee_list = models.BooleanField(default=False, verbose_name=_("Export Attendee List"))
|
|
|
|
# 7. Community Projects
|
|
can_volunteer = models.BooleanField(default=True, verbose_name=_("Volunteer for Projects"))
|
|
can_create_projects = models.BooleanField(default=False, verbose_name=_("Create Projects"))
|
|
can_manage_project_tasks = models.BooleanField(default=False, verbose_name=_("Manage Project Tasks"))
|
|
can_approve_projects = models.BooleanField(default=False, verbose_name=_("Approve Projects"))
|
|
|
|
# 8. Donations & Charity
|
|
can_make_donations = models.BooleanField(default=True, verbose_name=_("Make Donations"))
|
|
can_create_donation_campaigns = models.BooleanField(default=False, verbose_name=_("Create Donation Campaigns"))
|
|
can_view_donation_reports = models.BooleanField(default=False, verbose_name=_("View Donation Reports"))
|
|
|
|
# 9. Support & Tickets
|
|
can_create_tickets = models.BooleanField(default=True, verbose_name=_("Create Support Tickets"))
|
|
can_reply_tickets = models.BooleanField(default=True, verbose_name=_("Reply to Support Tickets"))
|
|
can_manage_tickets = models.BooleanField(default=False, verbose_name=_("Manage Support Tickets"))
|
|
|
|
# 10. Dynamic Forms
|
|
can_submit_forms = models.BooleanField(default=True, verbose_name=_("Submit Dynamic Forms"))
|
|
can_create_forms = models.BooleanField(default=False, verbose_name=_("Create Dynamic Forms"))
|
|
can_export_form_data = models.BooleanField(default=False, verbose_name=_("Export Form Responses"))
|
|
|
|
# 11. Diplomacy & Institutional
|
|
can_view_diplomatic_reports = models.BooleanField(default=False, verbose_name=_("View Diplomatic Reports"))
|
|
can_create_diplomatic_reports = models.BooleanField(default=False, verbose_name=_("Create Diplomatic Reports"))
|
|
|
|
# 12. Administration & Security
|
|
can_access_admin_panel = models.BooleanField(default=False, verbose_name=_("Access Admin Panel"))
|
|
can_manage_users = models.BooleanField(default=False, verbose_name=_("Manage Users"))
|
|
can_ban_users = models.BooleanField(default=False, verbose_name=_("Ban / Suspend Users"))
|
|
can_view_analytics = models.BooleanField(default=False, verbose_name=_("View Analytics Dashboard"))
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At"))
|
|
updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At"))
|
|
|
|
class Meta:
|
|
ordering = ('name',)
|
|
verbose_name = _("Role")
|
|
verbose_name_plural = _("Roles")
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def save(self, *args, **kwargs):
|
|
if not self.slug:
|
|
self.slug = slugify(self.name)
|
|
if self.is_default:
|
|
# Ensure only one default role exists
|
|
Role.objects.filter(is_default=True).exclude(pk=self.pk).update(is_default=False)
|
|
super().save(*args, **kwargs)
|
|
|
|
def get_permissions_dict(self):
|
|
"""Returns a dict of all permission flags and their boolean values."""
|
|
return {perm: getattr(self, perm, False) for perm in ALL_PERMISSION_FIELDS}
|