mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-06-21 01:48:21 +02:00
Compare commits
2 Commits
7ce18f2d27
...
permission
Author | SHA1 | Date | |
---|---|---|---|
17be896a99 | |||
a69573ccdb
|
@ -4,7 +4,7 @@
|
||||
from django.contrib import admin
|
||||
from note_kfet.admin import admin_site
|
||||
|
||||
from .models import Permission, PermissionMask, Role
|
||||
from .models import Permission, PermissionVar, PermissionMask, Role
|
||||
|
||||
|
||||
@admin.register(PermissionMask, site=admin_site)
|
||||
@ -15,6 +15,14 @@ class PermissionMaskAdmin(admin.ModelAdmin):
|
||||
list_display = ('description', 'rank', )
|
||||
|
||||
|
||||
@admin.register(PermissionVar, site=admin_site)
|
||||
class PermissionVarAdmin(admin.ModelAdmin):
|
||||
"""
|
||||
Admin customisation for PermissionVar
|
||||
"""
|
||||
list_display = ('name', 'description',)
|
||||
|
||||
|
||||
@admin.register(Permission, site=admin_site)
|
||||
class PermissionAdmin(admin.ModelAdmin):
|
||||
"""
|
||||
|
@ -2928,7 +2928,7 @@
|
||||
"application"
|
||||
],
|
||||
"query": "{\"user\": [\"user\"]}",
|
||||
"type": "create",
|
||||
"type": "add",
|
||||
"mask": 1,
|
||||
"field": "",
|
||||
"permanent": true,
|
||||
@ -3114,10 +3114,10 @@
|
||||
187,
|
||||
188,
|
||||
189,
|
||||
190,
|
||||
191,
|
||||
195,
|
||||
196
|
||||
190,
|
||||
191,
|
||||
195,
|
||||
196
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -3159,8 +3159,8 @@
|
||||
159,
|
||||
160,
|
||||
179,
|
||||
189,
|
||||
190
|
||||
189,
|
||||
190
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -3310,10 +3310,10 @@
|
||||
176,
|
||||
177,
|
||||
178,
|
||||
188,
|
||||
188,
|
||||
183,
|
||||
186,
|
||||
187
|
||||
186,
|
||||
187
|
||||
]
|
||||
}
|
||||
},
|
||||
@ -3508,13 +3508,13 @@
|
||||
187,
|
||||
188,
|
||||
189,
|
||||
190,
|
||||
191,
|
||||
192,
|
||||
193,
|
||||
194,
|
||||
195,
|
||||
196
|
||||
190,
|
||||
191,
|
||||
192,
|
||||
193,
|
||||
194,
|
||||
195,
|
||||
196
|
||||
]
|
||||
}
|
||||
},
|
||||
|
22
apps/permission/migrations/0002_permissionvar.py
Normal file
22
apps/permission/migrations/0002_permissionvar.py
Normal file
@ -0,0 +1,22 @@
|
||||
# Generated by Django 2.2.28 on 2022-10-10 17:37
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('permission', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='PermissionVar',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.SlugField(unique=True, verbose_name='name')),
|
||||
('query', models.TextField(verbose_name='query')),
|
||||
('description', models.CharField(blank=True, max_length=255, verbose_name='description')),
|
||||
],
|
||||
),
|
||||
]
|
@ -118,6 +118,25 @@ class PermissionMask(models.Model):
|
||||
verbose_name_plural = _("permission masks")
|
||||
|
||||
|
||||
class PermissionVar(models.Model):
|
||||
|
||||
name = models.SlugField(
|
||||
unique=True,
|
||||
blank=False,
|
||||
verbose_name=_("name"),
|
||||
)
|
||||
|
||||
query = models.TextField(
|
||||
verbose_name=_("query"),
|
||||
)
|
||||
|
||||
description = models.CharField(
|
||||
max_length=255,
|
||||
blank=True,
|
||||
verbose_name=_("description"),
|
||||
)
|
||||
|
||||
|
||||
class Permission(models.Model):
|
||||
|
||||
PERMISSION_TYPES = [
|
||||
@ -139,6 +158,7 @@ class Permission(models.Model):
|
||||
# query -> ["AND", query, …] AND multiple queries
|
||||
# | ["OR", query, …] OR multiple queries
|
||||
# | ["NOT", query] Opposite of query
|
||||
# | ["VAR", query] A var name as defined in PermissionVar
|
||||
# query -> {key: value, …} A list of fields and values of a Q object
|
||||
# key -> string A field name
|
||||
# value -> int | string | bool | null Literal values
|
||||
@ -150,6 +170,7 @@ class Permission(models.Model):
|
||||
# | ["MUL", oper, …] Multiply F objects or literals
|
||||
# | int | string | bool | null Literal values
|
||||
# | ["F", string] A field
|
||||
# | ["VAR", string] A var name as defined in PermissionVar
|
||||
#
|
||||
# Examples:
|
||||
# Q(is_superuser=True) := {"is_superuser": true}
|
||||
@ -215,6 +236,8 @@ class Permission(models.Model):
|
||||
return functools.reduce(operator.mul, [Permission.compute_f(oper, **kwargs) for oper in oper[1:]])
|
||||
elif oper[0] == 'F':
|
||||
return F(oper[1])
|
||||
elif oper[0] == 'VAR':
|
||||
return compute_f(json.loads(PermissionVar.objects.get(name=oper[1]).query), **kwargs)
|
||||
else:
|
||||
field = kwargs[oper[0]]
|
||||
for i in range(1, len(oper)):
|
||||
@ -289,6 +312,8 @@ class Permission(models.Model):
|
||||
return functools.reduce(operator.or_, [Permission._about(query, **kwargs) for query in query[1:]])
|
||||
elif query[0] == 'NOT':
|
||||
return ~Permission._about(query[1], **kwargs)
|
||||
elif query[0] == 'VAR':
|
||||
return Permission._about(json.loads(PermissionVar.objects.get(name=query[1]).query), **kwargs)
|
||||
else:
|
||||
return Q(pk=F("pk")) if Permission.compute_param(query, **kwargs) else ~Q(pk=F("pk"))
|
||||
elif isinstance(query, dict):
|
||||
|
Reference in New Issue
Block a user