diff --git a/src/README.md b/src/README.md index f853623adcdb9a2f888dc757fe050f2526e57e89..f421390dd2d71810a817dc832d00b2e40a8135e0 100644 --- a/src/README.md +++ b/src/README.md @@ -78,32 +78,6 @@ $ python3 manage.py create_user provider@polaris.com polaris321 -p -m -a $ python3 manage.py create_user user1@polaris.com polaris321 ``` -## Create fixtures (seeds) - -```console -$ python3 manage.py dumpdata --natural-foreign --natural-primary --indent 4 > fixtures/initial_db.json -``` - -```console -$ python3 manage.py dumpdata --indent 4 > fixtures/initial_db.json -``` - -| E-Mail | Password | Superuser | Provider | Provider Manage | Analyst | -| -------------------- | ---------- | --------- | -------- | --------------- | ------- | -| admin@polaris.com | polaris321 | x | x | x | x | -| provider@polaris.com | polaris321 | - | x | x | x | -| user1@polaris.com | polaris321 | - | - | - | - | -| user2@polaris.com | polaris321 | - | - | - | - | -| user3@polaris.com | polaris321 | - | - | - | - | -| user4@polaris.com | polaris321 | - | - | - | - | -| user5@polaris.com | polaris321 | - | - | - | - | - -## Load fixtures - -```console -$ python3 manage.py loaddata fixtures/initial_db.json -``` - ## Clear database ```console diff --git a/src/backend/management/commands/check_and_apply_migrations.py b/src/backend/management/commands/check_and_apply_migrations.py new file mode 100644 index 0000000000000000000000000000000000000000..c8733cd5e4b1c4d0ce3541888462f9e9cbf4989a --- /dev/null +++ b/src/backend/management/commands/check_and_apply_migrations.py @@ -0,0 +1,79 @@ +from django.core.management.base import BaseCommand +from django.core.management import call_command +from django.db import connections +from django.db.migrations.executor import MigrationExecutor +from django.contrib.auth.models import Permission, ContentType, Group +from rolepermissions.roles import get_roles +from users.models import CustomUser # Adjust this import based on your actual user model + +class Command(BaseCommand): + help = 'Check and apply necessary migrations and ensure roles, permissions, and groups are set up correctly' + + def handle(self, *args, **kwargs): + self.stdout.write(self.style.NOTICE('Checking for pending migrations...')) + + connection = connections['default'] + executor = MigrationExecutor(connection) + targets = executor.loader.graph.leaf_nodes() + + if executor.migration_plan(targets): + self.stdout.write(self.style.WARNING('Pending migrations found. Applying migrations...')) + call_command('migrate') + self.stdout.write(self.style.SUCCESS('All migrations applied successfully.')) + else: + self.stdout.write(self.style.SUCCESS('No pending migrations found.')) + + self.stdout.write(self.style.NOTICE('Checking roles and permissions...')) + + # Ensure necessary permissions exist + permissions = { + "create_user": "Create User", + "edit_user": "Edit User" + "create_provider": "Create Provider", + "manage_provider_keys": "Manage Provider Keys", + "manage_analytics_tokens": "Manage Analytics Tokens", + "create_user_consent": "Create User Consent", + "request_user_data": "Request User Data" + } + + content_type, created = ContentType.objects.get_or_create(app_label='users', model='customuser') + + permission_objects = {} + for codename, name in permissions.items(): + permission, created = Permission.objects.get_or_create( + codename=codename, + content_type=content_type, + defaults={'name': name} + ) + permission_objects[codename] = permission + if created: + self.stdout.write(self.style.SUCCESS(f'Permission created: {name}')) + else: + self.stdout.write(self.style.NOTICE(f'Permission already exists: {name}')) + + # Ensure roles exist + for role in get_roles(): + self.stdout.write(self.style.SUCCESS(f'Role found: {role.__name__} with permissions: {role.available_permissions}')) + + # Ensure auth groups exist and assign permissions + groups_permissions = { + "polaris_administrator": ["create_user","edit_user","create_provider","change_provider","manage_provider_keys","manage_analytics_tokens","create_user_consent","request_user_data"] + "provider": ["manage_provider_keys"],‚ + "analyst": ["manage_analytics_tokens"], + "user": ["create_user_consent"] + } + + for group_name, perms in groups_permissions.items(): + group, created = Group.objects.get_or_create(name=group_name) + if created: + self.stdout.write(self.style.SUCCESS(f'Group created: {group_name}')) + else: + self.stdout.write(self.style.NOTICE(f'Group already exists: {group_name}')) + + # Assign permissions to group + for perm in perms: + if perm in permission_objects: + group.permissions.add(permission_objects[perm]) + self.stdout.write(self.style.SUCCESS(f'Assigned permission {perm} to group {group_name}')) + + self.stdout.write(self.style.SUCCESS('Roles, permissions, and groups check completed.')) diff --git a/src/backend/roles.py b/src/backend/roles.py index c6857b335ba0b569b8e49d0be8fb8737e6112a49..d31aebab3e4a9fc9b8383d7a50b62f4160a2461a 100644 --- a/src/backend/roles.py +++ b/src/backend/roles.py @@ -4,18 +4,23 @@ from strenum import StrEnum class Roles(StrEnum): CREATE_USER = 'create_user', + EDIT_USER = 'edit_user', CREATE_PROVIDER = 'create_provider', CHANGE_PROVIDER = 'change_provider', MANAGE_PROVIDER_KEYS = 'manage_provider_keys', MANAGE_ANALYTICS_TOKENS = 'manage_analytics_tokens', - CREATE_USER_CONSENT = 'create_user_consent' + CREATE_USER_CONSENT = 'create_user_consent', + REQUEST_USER_DATA = 'request_user_data', -class Provider(AbstractUserRole): +class PolarisAdministrator(AbstractUserRole): available_permissions = { Roles.CREATE_PROVIDER: True, Roles.CHANGE_PROVIDER: True, Roles.CREATE_USER: True, + Roles.MANAGE_PROVIDER_KEYS: True, + Roles.MANAGE_ANALYTICS_TOKENS: True, + Roles.REQUEST_USER_DATA: True, } class ProviderManager(AbstractUserRole): diff --git a/src/fixtures/initial_db.json b/src/fixtures/initial_db.json deleted file mode 100644 index 4c28364e1e4797b336ad39526bcf0c2f8303755f..0000000000000000000000000000000000000000 --- a/src/fixtures/initial_db.json +++ /dev/null @@ -1,1597 +0,0 @@ -[ - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"admin", - "model":"logentry" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"auth", - "model":"permission" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"auth", - "model":"group" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"contenttypes", - "model":"contenttype" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"sessions", - "model":"session" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_results", - "model":"taskresult" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_results", - "model":"chordcounter" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_results", - "model":"groupresult" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"crontabschedule" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"intervalschedule" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"periodictask" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"periodictasks" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"solarschedule" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"django_celery_beat", - "model":"clockedschedule" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"users", - "model":"customuser" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"consents", - "model":"userconsents" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"providers", - "model":"provider" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"providers", - "model":"providerschema" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"providers", - "model":"providerauthorization" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"providers", - "model":"analyticstoken" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"data_disclosure", - "model":"datadisclosure" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"data_removal", - "model":"dataremovaljob" - } - }, - { - "model":"contenttypes.contenttype", - "fields":{ - "app_label":"ssoauth", - "model":"usermapping" - } - }, - { - "model":"providers.provider", - "pk":1, - "fields":{ - "definition_id":"provider_1", - "name":"Example Provider", - "description":"An example provider for data collection.", - "updated":"2023-03-16T09:02:08.898Z", - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.providerschema", - "pk":1, - "fields":{ - "provider":1, - "superseded_by":null, - "additional_lrs":[ - - ], - "updated":"2023-03-16T09:02:08.898Z", - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.providerverbgroup", - "pk":1, - "fields":{ - "provider":1, - "provider_schema":1, - "group_id":"general_data_collection", - "label":"General data collection", - "description":"We would like to collect the following data to understand and support our users' behavior.", - "purpose_of_collection":"The data collected generally helps us to better understand the behavior of our users.", - "requires_consent":true, - "updated":"2023-03-16T09:02:08.898Z", - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.verb", - "pk":1, - "fields":{ - "provider":1, - "provider_schema":1, - "verb_id":"https://xapi.elearn.rwth-aachen.de/definitions/lms/verbs/accepted", - "label":"Accepted", - "description":"Accepted", - "default_consent":false, - "active":true, - "essential":false, - "allow_anonymized_collection":false - } - }, - { - "model":"providers.verbobject", - "pk":1, - "fields":{ - "verb":1, - "object_id":"https://xapi.elearn.rwth-aachen.de/definitions/lms/activities/assign", - "object_type":"assignment", - "matching":"definitionType", - "label":"Assignment", - "definition":{ - "type":"https://xapi.elearn.rwth-aachen.de/definitions/lms/activities/assign", - "name":{ - "enUS":"An assignment object. Provides the students with a task description and further needed materials and allows to upload a submission." - } - } - } - }, - { - "model":"providers.providerauthorization", - "pk":1, - "fields":{ - "provider":1, - "key":"example-key-123", - "updated":"2023-03-16T09:02:08.898Z", - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.analyticstoken", - "pk":1, - "fields":{ - "name":"Example Token", - "description":"This is a sample analytics token.", - "creator":1, - "key":"analytics-key-123", - "expires":null, - "image_path":null, - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.analyticstokenverb", - "pk":1, - "fields":{ - "verb":"https://xapi.elearn.rwth-aachen.de/definitions/lms/verbs/accepted", - "analytics_token":1, - "provider":1, - "created":"2023-03-16T09:02:08.898Z" - } - }, - { - "model":"providers.providerauthorization", - "pk":1, - "fields":{ - "provider":1, - "key":"27dd35314d73c7618945af9ac3152ecfcb9d1992ead2bdc562409d01ed456f6d", - "updated":"2023-03-16T09:02:08.893Z", - "created":"2023-03-16T09:02:08.893Z" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add log entry", - "content_type":[ - "admin", - "logentry" - ], - "codename":"add_logentry" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change log entry", - "content_type":[ - "admin", - "logentry" - ], - "codename":"change_logentry" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete log entry", - "content_type":[ - "admin", - "logentry" - ], - "codename":"delete_logentry" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view log entry", - "content_type":[ - "admin", - "logentry" - ], - "codename":"view_logentry" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add permission", - "content_type":[ - "auth", - "permission" - ], - "codename":"add_permission" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change permission", - "content_type":[ - "auth", - "permission" - ], - "codename":"change_permission" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete permission", - "content_type":[ - "auth", - "permission" - ], - "codename":"delete_permission" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view permission", - "content_type":[ - "auth", - "permission" - ], - "codename":"view_permission" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add group", - "content_type":[ - "auth", - "group" - ], - "codename":"add_group" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change group", - "content_type":[ - "auth", - "group" - ], - "codename":"change_group" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete group", - "content_type":[ - "auth", - "group" - ], - "codename":"delete_group" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view group", - "content_type":[ - "auth", - "group" - ], - "codename":"view_group" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add content type", - "content_type":[ - "contenttypes", - "contenttype" - ], - "codename":"add_contenttype" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change content type", - "content_type":[ - "contenttypes", - "contenttype" - ], - "codename":"change_contenttype" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete content type", - "content_type":[ - "contenttypes", - "contenttype" - ], - "codename":"delete_contenttype" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view content type", - "content_type":[ - "contenttypes", - "contenttype" - ], - "codename":"view_contenttype" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add session", - "content_type":[ - "sessions", - "session" - ], - "codename":"add_session" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change session", - "content_type":[ - "sessions", - "session" - ], - "codename":"change_session" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete session", - "content_type":[ - "sessions", - "session" - ], - "codename":"delete_session" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view session", - "content_type":[ - "sessions", - "session" - ], - "codename":"view_session" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add task result", - "content_type":[ - "django_celery_results", - "taskresult" - ], - "codename":"add_taskresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change task result", - "content_type":[ - "django_celery_results", - "taskresult" - ], - "codename":"change_taskresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete task result", - "content_type":[ - "django_celery_results", - "taskresult" - ], - "codename":"delete_taskresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view task result", - "content_type":[ - "django_celery_results", - "taskresult" - ], - "codename":"view_taskresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add chord counter", - "content_type":[ - "django_celery_results", - "chordcounter" - ], - "codename":"add_chordcounter" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change chord counter", - "content_type":[ - "django_celery_results", - "chordcounter" - ], - "codename":"change_chordcounter" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete chord counter", - "content_type":[ - "django_celery_results", - "chordcounter" - ], - "codename":"delete_chordcounter" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view chord counter", - "content_type":[ - "django_celery_results", - "chordcounter" - ], - "codename":"view_chordcounter" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add group result", - "content_type":[ - "django_celery_results", - "groupresult" - ], - "codename":"add_groupresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change group result", - "content_type":[ - "django_celery_results", - "groupresult" - ], - "codename":"change_groupresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete group result", - "content_type":[ - "django_celery_results", - "groupresult" - ], - "codename":"delete_groupresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view group result", - "content_type":[ - "django_celery_results", - "groupresult" - ], - "codename":"view_groupresult" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add crontab", - "content_type":[ - "django_celery_beat", - "crontabschedule" - ], - "codename":"add_crontabschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change crontab", - "content_type":[ - "django_celery_beat", - "crontabschedule" - ], - "codename":"change_crontabschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete crontab", - "content_type":[ - "django_celery_beat", - "crontabschedule" - ], - "codename":"delete_crontabschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view crontab", - "content_type":[ - "django_celery_beat", - "crontabschedule" - ], - "codename":"view_crontabschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add interval", - "content_type":[ - "django_celery_beat", - "intervalschedule" - ], - "codename":"add_intervalschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change interval", - "content_type":[ - "django_celery_beat", - "intervalschedule" - ], - "codename":"change_intervalschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete interval", - "content_type":[ - "django_celery_beat", - "intervalschedule" - ], - "codename":"delete_intervalschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view interval", - "content_type":[ - "django_celery_beat", - "intervalschedule" - ], - "codename":"view_intervalschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add periodic task", - "content_type":[ - "django_celery_beat", - "periodictask" - ], - "codename":"add_periodictask" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change periodic task", - "content_type":[ - "django_celery_beat", - "periodictask" - ], - "codename":"change_periodictask" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete periodic task", - "content_type":[ - "django_celery_beat", - "periodictask" - ], - "codename":"delete_periodictask" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view periodic task", - "content_type":[ - "django_celery_beat", - "periodictask" - ], - "codename":"view_periodictask" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add periodic tasks", - "content_type":[ - "django_celery_beat", - "periodictasks" - ], - "codename":"add_periodictasks" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change periodic tasks", - "content_type":[ - "django_celery_beat", - "periodictasks" - ], - "codename":"change_periodictasks" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete periodic tasks", - "content_type":[ - "django_celery_beat", - "periodictasks" - ], - "codename":"delete_periodictasks" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view periodic tasks", - "content_type":[ - "django_celery_beat", - "periodictasks" - ], - "codename":"view_periodictasks" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add solar event", - "content_type":[ - "django_celery_beat", - "solarschedule" - ], - "codename":"add_solarschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change solar event", - "content_type":[ - "django_celery_beat", - "solarschedule" - ], - "codename":"change_solarschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete solar event", - "content_type":[ - "django_celery_beat", - "solarschedule" - ], - "codename":"delete_solarschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view solar event", - "content_type":[ - "django_celery_beat", - "solarschedule" - ], - "codename":"view_solarschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add clocked", - "content_type":[ - "django_celery_beat", - "clockedschedule" - ], - "codename":"add_clockedschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change clocked", - "content_type":[ - "django_celery_beat", - "clockedschedule" - ], - "codename":"change_clockedschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete clocked", - "content_type":[ - "django_celery_beat", - "clockedschedule" - ], - "codename":"delete_clockedschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view clocked", - "content_type":[ - "django_celery_beat", - "clockedschedule" - ], - "codename":"view_clockedschedule" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add user", - "content_type":[ - "users", - "customuser" - ], - "codename":"add_customuser" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change user", - "content_type":[ - "users", - "customuser" - ], - "codename":"change_customuser" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete user", - "content_type":[ - "users", - "customuser" - ], - "codename":"delete_customuser" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view user", - "content_type":[ - "users", - "customuser" - ], - "codename":"view_customuser" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add user consents", - "content_type":[ - "consents", - "userconsents" - ], - "codename":"add_userconsents" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change user consents", - "content_type":[ - "consents", - "userconsents" - ], - "codename":"change_userconsents" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete user consents", - "content_type":[ - "consents", - "userconsents" - ], - "codename":"delete_userconsents" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view user consents", - "content_type":[ - "consents", - "userconsents" - ], - "codename":"view_userconsents" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add provider", - "content_type":[ - "providers", - "provider" - ], - "codename":"add_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change provider", - "content_type":[ - "providers", - "provider" - ], - "codename":"change_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete provider", - "content_type":[ - "providers", - "provider" - ], - "codename":"delete_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view provider", - "content_type":[ - "providers", - "provider" - ], - "codename":"view_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add provider schema", - "content_type":[ - "providers", - "providerschema" - ], - "codename":"add_providerschema" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change provider schema", - "content_type":[ - "providers", - "providerschema" - ], - "codename":"change_providerschema" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete provider schema", - "content_type":[ - "providers", - "providerschema" - ], - "codename":"delete_providerschema" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view provider schema", - "content_type":[ - "providers", - "providerschema" - ], - "codename":"view_providerschema" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add provider authorization", - "content_type":[ - "providers", - "providerauthorization" - ], - "codename":"add_providerauthorization" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change provider authorization", - "content_type":[ - "providers", - "providerauthorization" - ], - "codename":"change_providerauthorization" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete provider authorization", - "content_type":[ - "providers", - "providerauthorization" - ], - "codename":"delete_providerauthorization" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view provider authorization", - "content_type":[ - "providers", - "providerauthorization" - ], - "codename":"view_providerauthorization" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add analytics token", - "content_type":[ - "providers", - "analyticstoken" - ], - "codename":"add_analyticstoken" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change analytics token", - "content_type":[ - "providers", - "analyticstoken" - ], - "codename":"change_analyticstoken" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete analytics token", - "content_type":[ - "providers", - "analyticstoken" - ], - "codename":"delete_analyticstoken" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view analytics token", - "content_type":[ - "providers", - "analyticstoken" - ], - "codename":"view_analyticstoken" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add data disclosure", - "content_type":[ - "data_disclosure", - "datadisclosure" - ], - "codename":"add_datadisclosure" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change data disclosure", - "content_type":[ - "data_disclosure", - "datadisclosure" - ], - "codename":"change_datadisclosure" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete data disclosure", - "content_type":[ - "data_disclosure", - "datadisclosure" - ], - "codename":"delete_datadisclosure" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view data disclosure", - "content_type":[ - "data_disclosure", - "datadisclosure" - ], - "codename":"view_datadisclosure" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add data removal job", - "content_type":[ - "data_removal", - "dataremovaljob" - ], - "codename":"add_dataremovaljob" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change data removal job", - "content_type":[ - "data_removal", - "dataremovaljob" - ], - "codename":"change_dataremovaljob" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete data removal job", - "content_type":[ - "data_removal", - "dataremovaljob" - ], - "codename":"delete_dataremovaljob" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view data removal job", - "content_type":[ - "data_removal", - "dataremovaljob" - ], - "codename":"view_dataremovaljob" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can add user mapping", - "content_type":[ - "ssoauth", - "usermapping" - ], - "codename":"add_usermapping" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can change user mapping", - "content_type":[ - "ssoauth", - "usermapping" - ], - "codename":"change_usermapping" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can delete user mapping", - "content_type":[ - "ssoauth", - "usermapping" - ], - "codename":"delete_usermapping" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Can view user mapping", - "content_type":[ - "ssoauth", - "usermapping" - ], - "codename":"view_usermapping" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"superuser (SSO)", - "content_type":[ - "users", - "customuser" - ], - "codename":"superuser" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"staff (SSO)", - "content_type":[ - "users", - "customuser" - ], - "codename":"staff" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Create User Consent", - "content_type":[ - "users", - "customuser" - ], - "codename":"create_user_consent" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Create Provider", - "content_type":[ - "users", - "customuser" - ], - "codename":"create_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Create User", - "content_type":[ - "users", - "customuser" - ], - "codename":"create_user" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Change Provider", - "content_type":[ - "users", - "customuser" - ], - "codename":"change_provider" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Manage Provider Keys", - "content_type":[ - "users", - "customuser" - ], - "codename":"manage_provider_keys" - } - }, - { - "model":"auth.permission", - "fields":{ - "name":"Manage Analytics Tokens", - "content_type":[ - "users", - "customuser" - ], - "codename":"manage_analytics_tokens" - } - }, - { - "model":"auth.group", - "fields":{ - "name":"user", - "permissions":[ - - ] - } - }, - { - "model":"auth.group", - "fields":{ - "name":"provider", - "permissions":[ - - ] - } - }, - { - "model":"auth.group", - "fields":{ - "name":"provider_manager", - "permissions":[ - - ] - } - }, - { - "model":"auth.group", - "fields":{ - "name":"analyst", - "permissions":[ - - ] - } - }, - { - "model":"users.customuser", - "fields":{ - "password":"pbkdf2_sha256$390000$RfvUY9MTv955237sb0zyXD$adqAFax3+5SSNMSEgnkWF2fWY2ru1iXQ9h7SlnO1kP0=", - "last_login":null, - "is_superuser":false, - "first_name":"", - "last_name":"", - "is_staff":false, - "is_active":true, - "date_joined":"2023-03-16T09:01:04.332Z", - "email":"user1@polaris.com", - "paused_data_recording":false, - "groups":[ - [ - "user" - ] - ], - "user_permissions":[ - [ - "create_user_consent", - "users", - "customuser" - ] - ], - "accepted_provider_schemas":[ - - ] - } - }, - { - "model":"users.customuser", - "fields":{ - "password":"pbkdf2_sha256$390000$hXBDrIi5D33MxcqICL2N5l$o/Hmd9prUCy7QJfq73jzTKAaLrm7nP+5kmN+eHWzSXM=", - "last_login":null, - "is_superuser":false, - "first_name":"", - "last_name":"", - "is_staff":false, - "is_active":true, - "date_joined":"2023-03-16T09:01:08.575Z", - "email":"user2@polaris.com", - "paused_data_recording":false, - "groups":[ - [ - "user" - ] - ], - "user_permissions":[ - [ - "create_user_consent", - "users", - "customuser" - ] - ], - "accepted_provider_schemas":[ - - ] - } - }, - { - "model":"users.customuser", - "fields":{ - "password":"pbkdf2_sha256$390000$Jk0guNI6Il3aDEzrwK6eig$SZBjknBwgIegQqyi2i4FnesKcnvECwNU96mDJVlx+RQ=", - "last_login":null, - "is_superuser":false, - "first_name":"", - "last_name":"", - "is_staff":false, - "is_active":true, - "date_joined":"2023-03-16T09:01:13.276Z", - "email":"user3@polaris.com", - "paused_data_recording":false, - "groups":[ - [ - "user" - ] - ], - "user_permissions":[ - [ - "create_user_consent", - "users", - "customuser" - ] - ], - "accepted_provider_schemas":[ - - ] - } - }, - { - "model":"users.customuser", - "fields":{ - "password":"pbkdf2_sha256$390000$jaNQw9Z2RJCFOjJlDT6oyo$0vF9wpQGqt2sJEI6UnkjIdtHCd3aINOgojXcYcBoXXE=", - "last_login":null, - "is_superuser":false, - "first_name":"", - "last_name":"", - "is_staff":false, - "is_active":true, - "date_joined":"2023-03-16T09:01:18.285Z", - "email":"user4@polaris.com", - "paused_data_recording":false, - "groups":[ - [ - "user" - ] - ], - "user_permissions":[ - [ - "create_user_consent", - "users", - "customuser" - ] - ], - "accepted_provider_schemas":[ - - ] - } - }, - { - "model":"users.customuser", - "fields":{ - "password":"pbkdf2_sha256$390000$SeVl7RR6ReMt9iLJb9Wsx3$1O5xcI1xPGY38AoxogdOuYMYmzLATk0wMa9hmTwWu9g=", - "last_login":null, - "is_superuser":false, - "first_name":"", - "last_name":"", - "is_staff":false, - "is_active":true, - "date_joined":"2023-03-16T09:01:31.051Z", - "email":"provider@polaris.com", - "paused_data_recording":false, - "groups":[ - [ - "user" - ], - [ - "provider" - ], - [ - "provider_manager" - ], - [ - "analyst" - ] - ], - "user_permissions":[ - [ - "change_provider", - "users", - "customuser" - ], - [ - "create_provider", - "users", - "customuser" - ], - [ - "create_user", - "users", - "customuser" - ], - [ - "create_user_consent", - "users", - "customuser" - ], - [ - "manage_analytics_tokens", - "users", - "customuser" - ], - [ - "manage_provider_keys", - "users", - "customuser" - ] - ], - "accepted_provider_schemas":[ - - ] - } - } - ] \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt index 6d74e2f143b0c3c476ec8d2b8c26cfb02fc52f5b..66b80ae5be66e250260714abb68b6ea38472215e 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -54,6 +54,7 @@ kombu==5.3.4 launchpadlib==1.10.16 lazr.restfulclient==0.14.4 lazr.uri==1.0.6 +lxml==5.2.1 Markdown==3.3.7 MarkupSafe==2.1.2 mergedeep==1.3.4 diff --git a/src/users/views.py b/src/users/views.py index 6841e669abb16bf54b7583768942107a54adb745..d4927929d4e8d3cd28e4fb0ae79ff15ed253b100 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -158,12 +158,13 @@ class MergeDataView(APIView): class UserListView(APIView): - permission_classes = (IsAuthenticated, IsAdminUser) + permission_classes = (IsAuthenticated,) def get(self, request): - users = CustomUser.objects.all() - users = UserSerializer(users, many=True).data - return JsonResponse(users, + if has_permission(request.user, Roles.EDIT_USER): + users = CustomUser.objects.all() + users = UserSerializer(users, many=True).data + return JsonResponse(users, safe=False, status=status.HTTP_200_OK) @@ -195,9 +196,12 @@ class PermissionsUpdateView(APIView): """ Save permissions for a user. """ - permission_classes = (IsAuthenticated, IsAdminUser) + permission_classes = (IsAuthenticated,) - def post(self, request, user_id): + def post(self, request, user_id): + if not has_permission(request.user, Roles.EDIT_USER): + return JsonResponse({"status": "error", "message": 'not permissions'}, + status=status.HTTP_401_UNAUTHORIZED) try: user = CustomUser.objects.get(pk=user_id) except ObjectDoesNotExist: