feat: bulk actions API

This commit is contained in:
Markos Gogoulos
2025-08-07 13:21:12 +03:00
committed by GitHub
parent de99d84c18
commit e790795bfd
69 changed files with 3879 additions and 2689 deletions

View File

@@ -11,7 +11,7 @@ from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill
import files.helpers as helpers
from files.models import Category, Media, Tag
from files.models import Category, Media, MediaPermission, Tag
from rbac.models import RBACGroup
@@ -123,7 +123,7 @@ class User(AbstractUser):
Get all categories related to RBAC groups the user belongs to
"""
rbac_groups = RBACGroup.objects.filter(memberships__user=self, memberships__role__in=["member", "contributor", "manager"])
categories = Category.objects.filter(rbac_groups__in=rbac_groups).distinct()
categories = Category.objects.prefetch_related("user").filter(rbac_groups__in=rbac_groups).distinct()
return categories
def has_member_access_to_category(self, category):
@@ -131,8 +131,63 @@ class User(AbstractUser):
return rbac_groups.exists()
def has_member_access_to_media(self, media):
rbac_groups = RBACGroup.objects.filter(memberships__user=self, memberships__role__in=["member", "contributor", "manager"], categories__in=media.category.all()).distinct()
return rbac_groups.exists()
# First check if user is the owner
if media.user == self:
return True
# Then check RBAC permissions
if getattr(settings, 'USE_RBAC', False):
rbac_groups = RBACGroup.objects.filter(memberships__user=self, memberships__role__in=["member", "contributor", "manager"], categories__in=media.category.all()).distinct()
if rbac_groups.exists():
return True
# Then check MediaShare permissions for any access
media_permission_exists = MediaPermission.objects.filter(
user=self,
media=media,
).exists()
return media_permission_exists
def has_contributor_access_to_media(self, media):
# First check if user is the owner
if media.user == self:
return True
# Then check RBAC permissions
if getattr(settings, 'USE_RBAC', False):
rbac_groups = RBACGroup.objects.filter(memberships__user=self, memberships__role__in=["contributor", "manager"], categories__in=media.category.all()).distinct()
if rbac_groups.exists():
return True
# Then check MediaShare permissions for editor or owner access
media_permission_exists = MediaPermission.objects.filter(
user=self,
media=media,
permission__in=["editor", "owner"],
).exists()
return media_permission_exists
def has_owner_access_to_media(self, media):
# First check if user is the owner
if media.user == self:
return True
# Then check RBAC permissions
if getattr(settings, 'USE_RBAC', False):
rbac_groups = RBACGroup.objects.filter(memberships__user=self, memberships__role__in=["manager"], categories__in=media.category.all()).distinct()
if rbac_groups.exists():
return True
# Then check MediaShare permissions for owner access
media_permission_exists = MediaPermission.objects.filter(
user=self,
media=media,
permission="owner",
).exists()
return media_permission_exists
def get_rbac_categories_as_contributor(self):
"""