add userRol

This commit is contained in:
Cayo Puigdefabregas 2023-10-17 17:42:48 +02:00
parent d9ec205c4e
commit fcd1316872
36 changed files with 286 additions and 39 deletions

View File

@ -21,3 +21,5 @@ class RolForm(forms.ModelForm):
class ServiceForm(forms.ModelForm): class ServiceForm(forms.ModelForm):
MANDATORY_FIELDS = ['domain', 'rol'] MANDATORY_FIELDS = ['domain', 'rol']
class UserRolForm(forms.ModelForm):
MANDATORY_FIELDS = ['service']

View File

@ -7,13 +7,19 @@ from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.contrib import messages from django.contrib import messages
from idhub.models import Membership, Rol, Service from idhub.models import Membership, Rol, Service, UserRol
from idhub.mixins import AdminView from idhub.mixins import AdminView
from idhub.admin.forms import ProfileForm, MembershipForm, RolForm, ServiceForm from idhub.admin.forms import (
ProfileForm,
MembershipForm,
RolForm,
ServiceForm,
UserRolForm
)
class AdminDashboardView(AdminView, TemplateView): class AdminDashboardView(AdminView, TemplateView):
template_name = "idhub/admin_dashboard.html" template_name = "idhub/admin/dashboard.html"
title = _('Dashboard') title = _('Dashboard')
subtitle = _('Success') subtitle = _('Success')
icon = 'bi bi-bell' icon = 'bi bi-bell'
@ -45,7 +51,7 @@ class ImportExport(AdminView, TemplateView):
class AdminPeopleListView(People, TemplateView): class AdminPeopleListView(People, TemplateView):
template_name = "idhub/admin_people.html" template_name = "idhub/admin/people.html"
subtitle = _('People list') subtitle = _('People list')
icon = 'bi bi-person' icon = 'bi bi-person'
@ -58,7 +64,7 @@ class AdminPeopleListView(People, TemplateView):
class AdminPeopleView(People, TemplateView): class AdminPeopleView(People, TemplateView):
template_name = "idhub/admin_user.html" template_name = "idhub/admin/user.html"
subtitle = _('User Profile') subtitle = _('User Profile')
icon = 'bi bi-person' icon = 'bi bi-person'
model = User model = User
@ -109,14 +115,14 @@ class AdminPeopleDeleteView(AdminPeopleView):
return redirect('idhub:admin_people_list') return redirect('idhub:admin_people_list')
class AdminPeopleEditView(AdminPeopleView, UpdateView): class AdminPeopleEditView(AdminPeopleView, UpdateView):
template_name = "idhub/admin_user_edit.html" template_name = "idhub/admin/user_edit.html"
from_class = ProfileForm from_class = ProfileForm
fields = ('first_name', 'last_name', 'email', 'username') fields = ('first_name', 'last_name', 'email', 'username')
success_url = reverse_lazy('idhub:admin_people_list') success_url = reverse_lazy('idhub:admin_people_list')
class AdminPeopleRegisterView(People, CreateView): class AdminPeopleRegisterView(People, CreateView):
template_name = "idhub/admin_people_register.html" template_name = "idhub/admin/people_register.html"
subtitle = _('People Register') subtitle = _('People Register')
icon = 'bi bi-person' icon = 'bi bi-person'
model = User model = User
@ -133,7 +139,7 @@ class AdminPeopleRegisterView(People, CreateView):
class AdminPeopleMembershipRegisterView(People, CreateView): class AdminPeopleMembershipRegisterView(People, CreateView):
template_name = "idhub/admin_people_membership_register.html" template_name = "idhub/admin/people_membership_register.html"
subtitle = _('People add membership') subtitle = _('People add membership')
icon = 'bi bi-person' icon = 'bi bi-person'
model = Membership model = Membership
@ -164,14 +170,14 @@ class AdminPeopleMembershipRegisterView(People, CreateView):
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_rol_new',
kwargs={"pk": self.user.id} kwargs={"pk": self.user.id}
) )
return self.success_url return self.success_url
class AdminPeopleMembershipEditView(People, CreateView): class AdminPeopleMembershipEditView(People, CreateView):
template_name = "idhub/admin_people_membership_register.html" template_name = "idhub/admin/people_membership_register.html"
subtitle = _('People add membership') subtitle = _('People add membership')
icon = 'bi bi-person' icon = 'bi bi-person'
model = Membership model = Membership
@ -208,9 +214,76 @@ class AdminPeopleMembershipDeleteView(AdminPeopleView):
return redirect('idhub:admin_people_edit', user.id) return redirect('idhub:admin_people_edit', user.id)
class AdminPeopleRolRegisterView(People, CreateView):
template_name = "idhub/admin/people_rol_register.html"
subtitle = _('Add Rol to User')
icon = 'bi bi-person'
model = UserRol
from_class = UserRolForm
fields = ('service',)
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.user = get_object_or_404(User, pk=self.pk)
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.user = get_object_or_404(User, pk=self.pk)
return super().post(request, *args, **kwargs)
def get_form_kwargs(self):
self.object = self.model(user=self.user)
kwargs = super().get_form_kwargs()
return kwargs
def get_success_url(self):
self.success_url = reverse_lazy(
'idhub:admin_people_edit',
kwargs={"pk": self.user.id}
)
return self.success_url
class AdminPeopleRolEditView(People, CreateView):
template_name = "idhub/admin/people_rol_register.html"
subtitle = _('Edit Rol to User')
icon = 'bi bi-person'
model = UserRol
from_class = UserRolForm
fields = ('service',)
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()
return kwargs
def get_success_url(self):
self.success_url = reverse_lazy(
'idhub:admin_people_edit',
kwargs={"pk": self.object.user.id}
)
return self.success_url
class AdminPeopleRolDeleteView(AdminPeopleView):
model = UserRol
def get(self, request, *args, **kwargs):
self.pk = kwargs['pk']
self.object = get_object_or_404(self.model, pk=self.pk)
user = self.object.user
self.object.delete()
return redirect('idhub:admin_people_edit', user.id)
class AdminRolesView(AccessControl): class AdminRolesView(AccessControl):
template_name = "idhub/admin_roles.html" template_name = "idhub/admin/roles.html"
subtitle = _('Roles Management') subtitle = _('Roles Management')
icon = '' icon = ''
@ -222,7 +295,7 @@ class AdminRolesView(AccessControl):
return context return context
class AdminRolRegisterView(AccessControl, CreateView): class AdminRolRegisterView(AccessControl, CreateView):
template_name = "idhub/admin_rol_register.html" template_name = "idhub/admin/rol_register.html"
subtitle = _('Add Rol') subtitle = _('Add Rol')
icon = '' icon = ''
model = Rol model = Rol
@ -233,7 +306,7 @@ class AdminRolRegisterView(AccessControl, CreateView):
class AdminRolEditView(AccessControl, CreateView): class AdminRolEditView(AccessControl, CreateView):
template_name = "idhub/admin_rol_register.html" template_name = "idhub/admin/rol_register.html"
subtitle = _('Edit Rol') subtitle = _('Edit Rol')
icon = '' icon = ''
model = Rol model = Rol
@ -261,7 +334,7 @@ class AdminRolDeleteView(AccessControl):
class AdminServicesView(AccessControl): class AdminServicesView(AccessControl):
template_name = "idhub/admin_services.html" template_name = "idhub/admin/services.html"
subtitle = _('Service Management') subtitle = _('Service Management')
icon = '' icon = ''
@ -273,7 +346,7 @@ class AdminServicesView(AccessControl):
return context return context
class AdminServiceRegisterView(AccessControl, CreateView): class AdminServiceRegisterView(AccessControl, CreateView):
template_name = "idhub/admin_service_register.html" template_name = "idhub/admin/service_register.html"
subtitle = _('Add Service') subtitle = _('Add Service')
icon = '' icon = ''
model = Service model = Service
@ -284,7 +357,7 @@ class AdminServiceRegisterView(AccessControl, CreateView):
class AdminServiceEditView(AccessControl, CreateView): class AdminServiceEditView(AccessControl, CreateView):
template_name = "idhub/admin_service_register.html" template_name = "idhub/admin/service_register.html"
subtitle = _('Edit Service') subtitle = _('Edit Service')
icon = '' icon = ''
model = Service model = Service
@ -312,69 +385,69 @@ class AdminServiceDeleteView(AccessControl):
class AdminCredentialsView(Credentials): class AdminCredentialsView(Credentials):
template_name = "idhub/admin_credentials.html" template_name = "idhub/admin/credentials.html"
subtitle = _('Credentials list') subtitle = _('Credentials list')
icon = '' icon = ''
class AdminIssueCredentialsView(Credentials): class AdminIssueCredentialsView(Credentials):
template_name = "idhub/admin_issue_credentials.html" template_name = "idhub/admin/issue_credentials.html"
subtitle = _('Issuance of Credentials') subtitle = _('Issuance of Credentials')
icon = '' icon = ''
class AdminRevokeCredentialsView(Credentials): class AdminRevokeCredentialsView(Credentials):
template_name = "idhub/admin_revoke_credentials.html" template_name = "idhub/admin/revoke_credentials.html"
subtitle = _('Revoke Credentials') subtitle = _('Revoke Credentials')
icon = '' icon = ''
class AdminWalletIdentitiesView(Credentials): class AdminWalletIdentitiesView(Credentials):
template_name = "idhub/admin_wallet_identities.html" template_name = "idhub/admin/wallet_identities.html"
subtitle = _('Organization Identities (DID)') subtitle = _('Organization Identities (DID)')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
wallet = True wallet = True
class AdminWalletCredentialsView(Credentials): class AdminWalletCredentialsView(Credentials):
template_name = "idhub/admin_wallet_credentials.html" template_name = "idhub/admin/wallet_credentials.html"
subtitle = _('Credentials') subtitle = _('Credentials')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
wallet = True wallet = True
class AdminWalletConfigIssuesView(Credentials): class AdminWalletConfigIssuesView(Credentials):
template_name = "idhub/admin_wallet_issues.html" template_name = "idhub/admin/wallet_issues.html"
subtitle = _('Configure Issues') subtitle = _('Configure Issues')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
wallet = True wallet = True
class AdminSchemesView(Schemes): class AdminSchemesView(Schemes):
template_name = "idhub/admin_schemes.html" template_name = "idhub/admin/schemes.html"
subtitle = _('Schemes List') subtitle = _('Schemes List')
icon = '' icon = ''
class AdminSchemesImportView(Schemes): class AdminSchemesImportView(Schemes):
template_name = "idhub/admin_schemes_import.html" template_name = "idhub/admin/schemes_import.html"
subtitle = _('Import Schemes') subtitle = _('Import Schemes')
icon = '' icon = ''
class AdminSchemesExportView(Schemes): class AdminSchemesExportView(Schemes):
template_name = "idhub/admin_schemes_export.html" template_name = "idhub/admin/schemes_export.html"
subtitle = _('Export Schemes') subtitle = _('Export Schemes')
icon = '' icon = ''
class AdminImportView(ImportExport): class AdminImportView(ImportExport):
template_name = "idhub/admin_import.html" template_name = "idhub/admin/import.html"
subtitle = _('Import') subtitle = _('Import')
icon = '' icon = ''
class AdminExportView(ImportExport): class AdminExportView(ImportExport):
template_name = "idhub/admin_export.html" template_name = "idhub/admin/export.html"
subtitle = _('Export') subtitle = _('Export')
icon = '' icon = ''

View File

@ -0,0 +1,45 @@
# Generated by Django 4.2.5 on 2023-10-17 14:24
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("idhub", "0003_service"),
]
operations = [
migrations.CreateModel(
name="UserRol",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"service",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="users",
to="idhub.service",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="roles",
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View File

@ -97,3 +97,19 @@ class Service(models.Model):
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='services', related_name='services',
) )
def __str__(self):
return "{} -> {}".format(self.domain, self.rol.name)
class UserRol(models.Model):
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='roles',
)
service = models.ForeignKey(
Service,
on_delete=models.CASCADE,
related_name='users',
)

View File

@ -13,8 +13,8 @@
<th scope="col"><button type="button" class="btn btn-green-admin border border-dark">{% trans 'Last name' %}</button></th> <th scope="col"><button type="button" class="btn btn-green-admin border border-dark">{% trans 'Last name' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'First name' %}</button></th> <th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'First name' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">Username</button></th> <th scope="col"><button type="button" class="btn btn-grey border border-dark">Username</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 'Membership' %}</button></th> <th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Membership' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Role' %}</button></th>
<th scope="col"></th> <th scope="col"></th>
</tr> </tr>
</thead> </thead>
@ -24,8 +24,16 @@
<td>{{ user.last_name }}</td> <td>{{ user.last_name }}</td>
<td>{{ user.first_name }}</td> <td>{{ user.first_name }}</td>
<td>{{ user.username }}</td> <td>{{ user.username }}</td>
<td>{{ user.get_membership }}</td> <td>
<td>{{ user.get_role }}</td> {% for m in user.memberships.all %}
{{ m.get_type }}
{% endfor %}
</td>
<td>
{% for r in user.roles.all %}
{{ r.service.rol.name }}
{% endfor %}
</td>
<td><a type="button" class="btn btn-green-admin rounded-pill" href="{% url 'idhub:admin_people' user.id %}">{% trans 'View' %}</td> <td><a type="button" class="btn btn-green-admin rounded-pill" href="{% url 'idhub:admin_people' user.id %}">{% trans 'View' %}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -26,7 +26,7 @@
</div> </div>
</div> </div>
<div class="form-actions-no-box"> <div class="form-actions-no-box">
<a class="btn btn-grey" href="{% url 'idhub:admin_people_list' %}">{% translate "Cancel" %}</a> <a class="btn btn-grey" href="{% url 'idhub:admin_people_edit' form.instance.user.id %}">{% translate "Cancel" %}</a>
<input class="btn btn-green-admin" type="submit" name="submit" value="{% translate 'Save' %}" /> <input class="btn btn-green-admin" type="submit" name="submit" value="{% translate 'Save' %}" />
</div> </div>

View File

@ -0,0 +1,34 @@
{% extends "idhub/base_admin.html" %}
{% load i18n %}
{% block content %}
<h3>
<i class="{{ icon }}"></i>
{{ subtitle }}
</h3>
{% load django_bootstrap5 %}
<form role="form" method="post">
{% csrf_token %}
{% if form.errors %}
<div class="alert alert-danger alert-icon alert-icon-border alert-dismissible" role="alert">
<div class="icon"><span class="mdi mdi-close-circle-o"></span></div>
<div class="message">
{% for field, error in form.errors.items %}
{{ error }}<br />
{% endfor %}
<button class="btn-close" type="button" data-dismiss="alert" aria-label="Close"></button>
</div>
</div>
{% endif %}
<div class="row">
<div class="col-sm-4">
{% bootstrap_form form %}
</div>
</div>
<div class="form-actions-no-box">
<a class="btn btn-grey" href="{% url 'idhub:admin_people_edit' form.instance.user.id %}">{% translate "Cancel" %}</a>
<input class="btn btn-green-admin" type="submit" name="submit" value="{% translate 'Save' %}" />
</div>
</form>
{% endblock %}

View File

@ -47,6 +47,9 @@
</div> </div>
</div> </div>
</div> </div>
<hr />
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="table-responsive"> <div class="table-responsive">
@ -72,6 +75,32 @@
</div> </div>
</div> </div>
<div class="row mt-5">
<div class="col">
<div class="table-responsive">
<table class="table table-striped table-sm">
<thead>
<tr>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Rol' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Description' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Service' %}</button></th>
</tr>
</thead>
<tbody>
{% for rol in object.roles.all %}
<tr>
<td>{{ rol.service.rol.name }}</td>
<td>{{ rol.service.description }}</td>
<td>{{ rol.service.domain }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal --> <!-- Modal -->
<div class="modal" id="confirm-delete" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal" id="confirm-delete" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">

View File

@ -30,6 +30,8 @@
</form> </form>
<hr />
<div class="row mt-5"> <div class="row mt-5">
<div class="col"> <div class="col">
<div class="table-responsive"> <div class="table-responsive">
@ -61,4 +63,36 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row mt-5 mb-3">
<div class="col">
<div class="table-responsive">
<table class="table table-striped table-sm">
<thead>
<tr>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Rol' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Description' %}</button></th>
<th scope="col"><button type="button" class="btn btn-grey border border-dark">{% trans 'Service' %}</button></th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% for rol in object.roles.all %}
<tr>
<td>{{ rol.service.rol.name }}</td>
<td>{{ rol.service.description }}</td>
<td>{{ rol.service.domain }}</td>
<td><a href="{% url 'idhub:admin_people_rol_edit' rol.id %}" title="{% trans 'Edit' %}"><i class="bi bi-pencil-square"></i></a></td>
<td><a href="{% url 'idhub:admin_people_rol_del' rol.id %}" title="{% trans 'Delete' %}"><i class="bi bi-trash"></i></a></td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="form-actions-no-box">
<a class="btn btn-green-admin" href="{% url 'idhub:admin_people_rol_new' object.id %}">{% translate "Add Rol" %} <i class="bi bi-plus"></i></a>
</div>
</div>
</div>
</div>
{% endblock %} {% endblock %}

View File

@ -70,6 +70,12 @@ urlpatterns = [
name='admin_people_membership_edit'), name='admin_people_membership_edit'),
path('admin/membership/<int:pk>/del/', views_admin.AdminPeopleMembershipDeleteView.as_view(), path('admin/membership/<int:pk>/del/', views_admin.AdminPeopleMembershipDeleteView.as_view(),
name='admin_people_membership_del'), name='admin_people_membership_del'),
path('admin/people/<int:pk>/rol/new/', views_admin.AdminPeopleRolRegisterView.as_view(),
name='admin_people_rol_new'),
path('admin/people/<int:pk>/rol/edit/', views_admin.AdminPeopleRolEditView.as_view(),
name='admin_people_rol_edit'),
path('admin/people/<int:pk>/rol/del/', views_admin.AdminPeopleRolDeleteView.as_view(),
name='admin_people_rol_del'),
path('admin/roles/', views_admin.AdminRolesView.as_view(), path('admin/roles/', views_admin.AdminRolesView.as_view(),
name='admin_roles'), name='admin_roles'),
path('admin/roles/new', views_admin.AdminRolRegisterView.as_view(), path('admin/roles/new', views_admin.AdminRolRegisterView.as_view(),

View File

@ -20,7 +20,7 @@ class MyWallet(UserView, TemplateView):
class UserDashboardView(UserView, TemplateView): class UserDashboardView(UserView, TemplateView):
template_name = "idhub/user_dashboard.html" template_name = "idhub/user/dashboard.html"
title = _('Dashboard') title = _('Dashboard')
subtitle = _('Success') subtitle = _('Success')
icon = 'bi bi-bell' icon = 'bi bi-bell'
@ -28,7 +28,7 @@ class UserDashboardView(UserView, TemplateView):
class UserProfileView(MyProfile, UpdateView): class UserProfileView(MyProfile, UpdateView):
template_name = "idhub/user_profile.html" template_name = "idhub/user/profile.html"
subtitle = _('My personal Data') subtitle = _('My personal Data')
icon = 'bi bi-person' icon = 'bi bi-person'
from_class = ProfileForm from_class = ProfileForm
@ -40,36 +40,36 @@ class UserProfileView(MyProfile, UpdateView):
class UserRolesView(MyProfile, TemplateView): class UserRolesView(MyProfile, TemplateView):
template_name = "idhub/user_roles.html" template_name = "idhub/user/roles.html"
subtitle = _('My roles') subtitle = _('My roles')
icon = 'fa-brands fa-critical-role' icon = 'fa-brands fa-critical-role'
class UserGDPRView(MyProfile, TemplateView): class UserGDPRView(MyProfile, TemplateView):
template_name = "idhub/user_gdpr.html" template_name = "idhub/user/gdpr.html"
subtitle = _('GDPR info') subtitle = _('GDPR info')
icon = 'bi bi-file-earmark-medical' icon = 'bi bi-file-earmark-medical'
class UserIdentitiesView(MyWallet): class UserIdentitiesView(MyWallet):
template_name = "idhub/user_identities.html" template_name = "idhub/user/identities.html"
subtitle = _('Identities (DID)') subtitle = _('Identities (DID)')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
class UserCredentialsView(MyWallet): class UserCredentialsView(MyWallet):
template_name = "idhub/user_credentials.html" template_name = "idhub/user/credentials.html"
subtitle = _('Credentials') subtitle = _('Credentials')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
class UserCredentialsRequiredView(MyWallet): class UserCredentialsRequiredView(MyWallet):
template_name = "idhub/user_credentials_required.html" template_name = "idhub/user/credentials_required.html"
subtitle = _('Credentials required') subtitle = _('Credentials required')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'
class UserCredentialsPresentationView(MyWallet): class UserCredentialsPresentationView(MyWallet):
template_name = "idhub/user_credentials_presentation.html" template_name = "idhub/user/credentials_presentation.html"
subtitle = _('Credentials Presentation') subtitle = _('Credentials Presentation')
icon = 'bi bi-patch-check-fill' icon = 'bi bi-patch-check-fill'