fix restrictions

This commit is contained in:
Cayo Puigdefabregas 2023-11-14 15:55:17 +01:00
parent b178f3460a
commit 4cb5c638a3
6 changed files with 153 additions and 24 deletions

View File

@ -11,6 +11,8 @@ from idhub.models import (
File_datas, File_datas,
Membership, Membership,
Schemas, Schemas,
Service,
UserRol,
VerificableCredential, VerificableCredential,
) )
from idhub_auth.models import User from idhub_auth.models import User
@ -139,19 +141,53 @@ class MembershipForm(forms.ModelForm):
data = super().clean() data = super().clean()
start_date = data['start_date'] start_date = data['start_date']
end_date = data.get('end_date') end_date = data.get('end_date')
members = Membership.objects.filter(
type=data['type'],
user=self.instance.user
)
if self.instance.id:
members = members.exclude(id=self.instance.id)
if (start_date and end_date): if (start_date and end_date):
if start_date > end_date: if start_date > end_date:
msg = _("The end date is less than the start date") msg = _("The end date is less than the start date")
raise forms.ValidationError(msg) raise forms.ValidationError(msg)
members = Membership.objects.filter( members = members.filter(
type=data['type'],
start_date__lte=end_date, start_date__lte=end_date,
end_date__gte=start_date, end_date__gte=start_date,
user=self.instance.user
) )
if members.exists() and not self.instance.id:
if members.exists():
msg = _("This membership already exists!") msg = _("This membership already exists!")
raise forms.ValidationError(msg) raise forms.ValidationError(msg)
return end_date return end_date
class UserRolForm(forms.ModelForm):
class Meta:
model = UserRol
fields = ['service']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.instance.id:
user = self.instance.user
choices = self.fields['service'].choices
choices.queryset = choices.queryset.exclude(users__user=user)
self.fields['service'].choices = choices
def clean_service(self):
data = super().clean()
service = UserRol.objects.filter(
service=data['service'],
user=self.instance.user
)
if service.exists():
msg = _("Is not possible to have a duplicate role")
raise forms.ValidationError(msg)
return data['service']

View File

@ -25,7 +25,12 @@ from idhub_auth.models import User
from idhub_auth.forms import ProfileForm from idhub_auth.forms import ProfileForm
from idhub.mixins import AdminView from idhub.mixins import AdminView
from idhub.email.views import NotifyActivateUserByEmail from idhub.email.views import NotifyActivateUserByEmail
from idhub.admin.forms import ImportForm, SchemaForm, MembershipForm from idhub.admin.forms import (
ImportForm,
MembershipForm,
SchemaForm,
UserRolForm,
)
from idhub.models import ( from idhub.models import (
DID, DID,
Event, Event,
@ -311,12 +316,12 @@ class PeopleMembershipDeleteView(PeopleView):
return redirect('idhub:admin_people_edit', user.id) return redirect('idhub:admin_people_edit', user.id)
class PeopleRolRegisterView(People, CreateView): class PeopleRolRegisterView(People, FormView):
template_name = "idhub/admin/people_rol_register.html" template_name = "idhub/admin/people_rol_register.html"
subtitle = _('Add a user role to access a service') subtitle = _('Add a user role to access a service')
icon = 'bi bi-person' icon = 'bi bi-person'
form_class = UserRolForm
model = UserRol model = UserRol
fields = ('service',)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.pk = kwargs['pk'] self.pk = kwargs['pk']
@ -331,14 +336,13 @@ class PeopleRolRegisterView(People, CreateView):
def get_form_kwargs(self): def get_form_kwargs(self):
self.object = self.model(user=self.user) self.object = self.model(user=self.user)
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
kwargs['instance'] = self.object
return kwargs return kwargs
def get_form(self): def form_valid(self, form):
form = super().get_form() form.save()
choices = form.fields['service'].choices messages.success(self.request, _('Membership created successfully'))
choices.queryset = choices.queryset.exclude(users__user=self.user) return super().form_valid(form)
form.fields['service'].choices = choices
return form
def get_success_url(self): def get_success_url(self):
self.success_url = reverse_lazy( self.success_url = reverse_lazy(
@ -348,20 +352,33 @@ class PeopleRolRegisterView(People, CreateView):
return self.success_url return self.success_url
class PeopleRolEditView(People, CreateView): class PeopleRolEditView(People, FormView):
template_name = "idhub/admin/people_rol_register.html" template_name = "idhub/admin/people_rol_register.html"
subtitle = _('Modify a user role to access a service') subtitle = _('Modify a user role to access a service')
icon = 'bi bi-person' icon = 'bi bi-person'
form_class = UserRolForm
model = UserRol model = UserRol
fields = ('service',)
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.object = get_object_or_404(self.model, pk=self.pk)
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.object = get_object_or_404(self.model, pk=self.pk)
return super().post(request, *args, **kwargs)
def get_form_kwargs(self): def get_form_kwargs(self):
pk = self.kwargs.get('pk')
if pk:
self.object = get_object_or_404(self.model, pk=pk)
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
kwargs['instance'] = self.object
return kwargs return kwargs
def form_valid(self, form):
form.save()
messages.success(self.request, _('Membership updated successfully'))
return super().form_valid(form)
def get_success_url(self): def get_success_url(self):
self.success_url = reverse_lazy( self.success_url = reverse_lazy(
'idhub:admin_people_edit', 'idhub:admin_people_edit',
@ -400,7 +417,7 @@ class RolRegisterView(AccessControl, CreateView):
subtitle = _('Add Role') subtitle = _('Add Role')
icon = '' icon = ''
model = Rol model = Rol
fields = ('name',) fields = ('name', "description")
success_url = reverse_lazy('idhub:admin_roles') success_url = reverse_lazy('idhub:admin_roles')
object = None object = None
@ -411,12 +428,12 @@ class RolRegisterView(AccessControl, CreateView):
return super().form_valid(form) return super().form_valid(form)
class RolEditView(AccessControl, CreateView): class RolEditView(AccessControl, UpdateView):
template_name = "idhub/admin/rol_register.html" template_name = "idhub/admin/rol_register.html"
subtitle = _('Edit Role') subtitle = _('Edit Role')
icon = '' icon = ''
model = Rol model = Rol
fields = ('name',) fields = ('name', "description")
success_url = reverse_lazy('idhub:admin_roles') success_url = reverse_lazy('idhub:admin_roles')
def get_form_kwargs(self): def get_form_kwargs(self):
@ -458,7 +475,7 @@ class ServicesView(AccessControl):
}) })
return context return context
class ServiceRegisterView(AccessControl, CreateView): class ServiceRegisterView(AccessControl, UpdateView):
template_name = "idhub/admin/service_register.html" template_name = "idhub/admin/service_register.html"
subtitle = _('Add service') subtitle = _('Add service')
icon = '' icon = ''
@ -474,7 +491,7 @@ class ServiceRegisterView(AccessControl, CreateView):
return super().form_valid(form) return super().form_valid(form)
class ServiceEditView(AccessControl, CreateView): class ServiceEditView(AccessControl, UpdateView):
template_name = "idhub/admin/service_register.html" template_name = "idhub/admin/service_register.html"
subtitle = _('Modify service') subtitle = _('Modify service')
icon = '' icon = ''

View File

@ -0,0 +1,52 @@
# Generated by Django 4.2.5 on 2023-11-14 09:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('idhub', '0002_event'),
]
operations = [
migrations.AddField(
model_name='rol',
name='description',
field=models.CharField(
max_length=250, null=True, verbose_name='Description'
),
),
migrations.AlterField(
model_name='membership',
name='end_date',
field=models.DateField(
blank=True,
help_text='What date will the membership end?',
null=True,
verbose_name='End date',
),
),
migrations.AlterField(
model_name='membership',
name='type',
field=models.PositiveSmallIntegerField(
choices=[(1, 'Beneficiary'), (2, 'Employee'), (3, 'Member')],
verbose_name='Type of membership',
),
),
migrations.AlterField(
model_name='rol',
name='name',
field=models.CharField(max_length=250, verbose_name='name'),
),
migrations.AlterField(
model_name='service',
name='description',
field=models.CharField(max_length=250, verbose_name='Description'),
),
migrations.AlterField(
model_name='service',
name='domain',
field=models.CharField(max_length=250, verbose_name='Domain'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2023-11-14 09:49
from django.conf import settings
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('idhub', '0003_rol_description_alter_membership_end_date_and_more'),
]
operations = [
migrations.AlterUniqueTogether(
name='userrol',
unique_together={('user', 'service')},
),
]

View File

@ -525,7 +525,8 @@ class Membership(models.Model):
class Rol(models.Model): class Rol(models.Model):
name = models.CharField(max_length=250) name = models.CharField(_("name"), max_length=250)
description = models.CharField(_("Description"), max_length=250, null=True)
def __str__(self): def __str__(self):
return self.name return self.name
@ -557,6 +558,9 @@ class UserRol(models.Model):
related_name='users', related_name='users',
) )
class Meta:
unique_together = ('user', 'service',)
class Organization(models.Model): class Organization(models.Model):
name = models.CharField(max_length=250) name = models.CharField(max_length=250)

View File

@ -13,6 +13,7 @@
<thead> <thead>
<tr> <tr>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Role' %}</button></th> <th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Role' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Description' %}</button></th>
<th scope="col"></th> <th scope="col"></th>
<th scope="col"></th> <th scope="col"></th>
</tr> </tr>
@ -21,6 +22,7 @@
{% for rol in roles.all %} {% for rol in roles.all %}
<tr> <tr>
<td>{{ rol.name }}</td> <td>{{ rol.name }}</td>
<td>{{ rol.description|default:""}}</td>
<td><a href="{% url 'idhub:admin_rol_edit' rol.id %}" title="{% trans 'Edit' %}"><i class="bi bi-pencil-square"></i></a></td> <td><a href="{% url 'idhub:admin_rol_edit' rol.id %}" title="{% trans 'Edit' %}"><i class="bi bi-pencil-square"></i></a></td>
<td><a href="{% url 'idhub:admin_rol_del' rol.id %}" title="{% trans 'Delete' %}"><i class="bi bi-trash"></i></a></td> <td><a href="{% url 'idhub:admin_rol_del' rol.id %}" title="{% trans 'Delete' %}"><i class="bi bi-trash"></i></a></td>
</tr> </tr>