From c463de0ada5b39534acd2a887245482b7be39210 Mon Sep 17 00:00:00 2001 From: Kumi Date: Sat, 16 Mar 2024 11:07:58 +0100 Subject: [PATCH] feat: add user permissions management Implemented user permissions management functionality across the system, enhancing control over category access and operations. This includes a new DataTable in the user area for permissions, updated model relations with explicit related names for better query readability, and a migration to enforce these changes at the database level. Additionally, the UI now features options for ending category membership, deleting categories, inviting users, and transferring ownership based on user roles and permissions. This comprehensive update aims at providing more granular access control and operational flexibility for category owners and system administrators. --- assets/js/userarea.js | 3 +- ...er_categorypermission_category_and_more.py | 26 +++++++ quackscape/tours/models.py | 10 ++- .../users/templates/users/category.html | 69 ++++++++++++++++++- 4 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 quackscape/tours/migrations/0016_alter_categorypermission_category_and_more.py diff --git a/assets/js/userarea.js b/assets/js/userarea.js index 0881720..2a8ba53 100644 --- a/assets/js/userarea.js +++ b/assets/js/userarea.js @@ -5,4 +5,5 @@ import { Tab } from 'bootstrap'; import DataTable from 'datatables.net-dt'; let mediaTable = new DataTable('#mediaTable'); -let scenesTable = new DataTable('#scenesTable'); \ No newline at end of file +let scenesTable = new DataTable('#scenesTable'); +let permissionsTable = new DataTable('#permissionsTable'); \ No newline at end of file diff --git a/quackscape/tours/migrations/0016_alter_categorypermission_category_and_more.py b/quackscape/tours/migrations/0016_alter_categorypermission_category_and_more.py new file mode 100644 index 0000000..fde0d17 --- /dev/null +++ b/quackscape/tours/migrations/0016_alter_categorypermission_category_and_more.py @@ -0,0 +1,26 @@ +# Generated by Django 5.0.3 on 2024-03-16 09:54 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tours', '0015_alter_originalmedia_category_alter_scene_category'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='categorypermission', + name='category', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='permissions', to='tours.category'), + ), + migrations.AlterField( + model_name='categorypermission', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='category_permissions', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/quackscape/tours/models.py b/quackscape/tours/models.py index 21c6dc2..28d5fd4 100644 --- a/quackscape/tours/models.py +++ b/quackscape/tours/models.py @@ -49,8 +49,14 @@ class Category(models.Model): class CategoryPermission(models.Model): - category = models.ForeignKey(Category, on_delete=models.CASCADE) - user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) + category = models.ForeignKey(Category, related_name="permissions", on_delete=models.CASCADE) + user = models.ForeignKey(get_user_model(), related_name="category_permissions", on_delete=models.CASCADE) + + # TODO: Permission levels + + @property + def role(self) -> str: + return "Content Editor" class Element(PolymorphicModel): diff --git a/quackscape/users/templates/users/category.html b/quackscape/users/templates/users/category.html index 249ba41..1aed6e5 100644 --- a/quackscape/users/templates/users/category.html +++ b/quackscape/users/templates/users/category.html @@ -1,5 +1,13 @@ {% extends "users/base.html" %} {% block content %} -

{{ category.title }}

+
+

{{ category.title }}

+ {% if category in request.user.category_memberships %} + + {% endif %} + {% if request.user.is_superuser or request.user == category.owner %} + + {% endif %} +
@@ -100,13 +124,54 @@ {{ media.title }} - + {% endfor %} + {% if request.user.is_superuser or request.user == category.owner %} +
+
+
User permissions
+
+ + +
+
+ + + + + + + + + + + + + + + {% for permission in category.permissions.all %} + + + + + + {% endfor %} + +
UserRoleActions
{{ category.owner }}Owner
{{ permission.user }}{{ permission.role }} + +
+
+ {% endif %} {% endblock %}