add registar of membership

This commit is contained in:
Cayo Puigdefabregas 2023-10-16 19:08:18 +02:00
parent e3ac939afc
commit a43b522faf
8 changed files with 237 additions and 42 deletions

View File

@ -1,5 +1,6 @@
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from idhub.models import Membership
class ProfileForm(forms.ModelForm): class ProfileForm(forms.ModelForm):
@ -8,3 +9,8 @@ class ProfileForm(forms.ModelForm):
class Meta: class Meta:
model = User model = User
fields = ('first_name', 'last_name', 'email') fields = ('first_name', 'last_name', 'email')
class MembershipForm(forms.ModelForm):
MANDATORY_FIELDS = ['type']

View File

@ -7,8 +7,9 @@ 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
from idhub.mixins import AdminView from idhub.mixins import AdminView
from idhub.admin.forms import ProfileForm from idhub.admin.forms import ProfileForm, MembershipForm
class AdminDashboardView(AdminView, TemplateView): class AdminDashboardView(AdminView, TemplateView):
@ -123,6 +124,45 @@ class AdminPeopleRegisterView(People, CreateView):
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')
def get_success_url(self):
# import pdb; pdb.set_trace()
self.success_url = reverse_lazy(
'idhub:admin_people_membership_new',
kwargs={"pk": self.object.id}
)
return self.success_url
class AdminPeopleMembershipRegisterView(People, CreateView):
template_name = "idhub/admin_people_membership_register.html"
subtitle = _('People add membership')
icon = 'bi bi-person'
model = Membership
from_class = MembershipForm
fields = ('type', 'start_date', 'end_date')
success_url = reverse_lazy('idhub:admin_people_list')
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(self):
form = super().get_form()
form.fields['start_date'].widget.input_type = 'date'
form.fields['end_date'].widget.input_type = 'date'
return form
def get_form_kwargs(self):
self.object = self.model(user=self.user)
kwargs = super().get_form_kwargs()
return kwargs
class AdminRolesView(AccessControl): class AdminRolesView(AccessControl):
template_name = "idhub/admin_roles.html" template_name = "idhub/admin_roles.html"

View File

@ -1,4 +1,4 @@
# Generated by Django 4.2.5 on 2023-10-03 15:28 # Generated by Django 4.2.5 on 2023-10-16 09:41
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -6,7 +6,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -15,42 +14,118 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='DID', name="VCTemplate",
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), (
('did_string', models.CharField(max_length=250)), "id",
], models.BigAutoField(
options={ auto_created=True,
'abstract': False, primary_key=True,
}, serialize=False,
verbose_name="ID",
), ),
migrations.CreateModel( ),
name='Event', ("wkit_template_id", models.CharField(max_length=250)),
fields=[ ("data", models.TextField()),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('timestamp', models.DateTimeField()),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='VerifiableCredential', name="VerifiableCredential",
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), (
('id_string', models.CharField(max_length=250)), "id",
('data', models.TextField()), models.BigAutoField(
('verified', models.BooleanField()), auto_created=True,
('created_on', models.DateTimeField()), primary_key=True,
('did_issuer', models.CharField(max_length=250)), serialize=False,
('did_subject', models.CharField(max_length=250)), verbose_name="ID",
),
),
("id_string", models.CharField(max_length=250)),
("verified", models.BooleanField()),
("created_on", models.DateTimeField()),
("did_issuer", models.CharField(max_length=250)),
("did_subject", models.CharField(max_length=250)),
("data", models.TextField()),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="vcredentials",
to=settings.AUTH_USER_MODEL,
),
),
], ],
options={
'abstract': False,
},
), ),
migrations.CreateModel( migrations.CreateModel(
name='AppUser', name="Membership",
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), (
('django_user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), "id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"type",
models.PositiveSmallIntegerField(
choices=[(1, "Beneficiary"), (2, "Employee"), (3, "Partner")],
verbose_name="Type of membership",
),
),
(
"start_date",
models.DateField(
blank=True,
help_text="What date did the membership start?",
null=True,
verbose_name="Start date",
),
),
(
"end_date",
models.DateField(
blank=True,
help_text="What date did the membership end?",
null=True,
verbose_name="End date",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="memberships",
to=settings.AUTH_USER_MODEL,
),
),
],
),
migrations.CreateModel(
name="DID",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("did_string", models.CharField(max_length=250)),
("label", models.CharField(max_length=50)),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="dids",
to=settings.AUTH_USER_MODEL,
),
),
], ],
), ),
] ]

View File

@ -1,27 +1,32 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User as DjangoUser from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import User
class AppUser(models.Model): # class AppUser(models.Model):
# Ya incluye "first_name", "last_name", "email", y "date_joined" heredando de la clase User de django. # Ya incluye "first_name", "last_name", "email", y "date_joined" heredando de la clase User de django.
# Falta ver que más información hay que añadir a nuestros usuarios, como los roles etc. # Falta ver que más información hay que añadir a nuestros usuarios, como los roles etc.
django_user = models.OneToOneField(DjangoUser, on_delete=models.CASCADE) # django_user = models.OneToOneField(DjangoUser, on_delete=models.CASCADE)
# Extra data, segun entidad/organizacion # Extra data, segun entidad/organizacion
pass # pass
class Event(models.Model): # class Event(models.Model):
# Para los "audit logs" que se requieren en las pantallas. # Para los "audit logs" que se requieren en las pantallas.
timestamp = models.DateTimeField() # timestamp = models.DateTimeField()
# Los eventos no tienen relación con otros objetos a nivel de BBDD. # Los eventos no tienen relación con otros objetos a nivel de BBDD.
event_data = models.CharField(max_length=250) # event_data = models.CharField(max_length=250)
class DID(models.Model): class DID(models.Model):
did_string = models.CharField(max_length=250) did_string = models.CharField(max_length=250)
label = models.CharField(max_length=50) label = models.CharField(max_length=50)
owner = models.ForeignKey(AppUser, on_delete=models.CASCADE) user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='dids',
)
# kind = "KEY|WEB" # kind = "KEY|WEB"
@ -31,7 +36,11 @@ class VerifiableCredential(models.Model):
created_on = models.DateTimeField() created_on = models.DateTimeField()
did_issuer = models.CharField(max_length=250) did_issuer = models.CharField(max_length=250)
did_subject = models.CharField(max_length=250) did_subject = models.CharField(max_length=250)
owner = models.ForeignKey(AppUser, on_delete=models.CASCADE) user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='vcredentials',
)
data = models.TextField() data = models.TextField()
@ -40,3 +49,31 @@ class VCTemplate(models.Model):
data = models.TextField() data = models.TextField()
class Membership(models.Model):
"""
This model represent the relation of this user with the ecosystem.
"""
class Types(models.IntegerChoices):
BENEFICIARY = 1, _('Beneficiary')
EMPLOYEE = 2, _('Employee')
PARTNER = 3, _('Partner')
type = models.PositiveSmallIntegerField(_('Type of membership'), choices=Types.choices)
start_date = models.DateField(
_('Start date'),
help_text=_('What date did the membership start?'),
blank=True,
null=True
)
end_date = models.DateField(
_('End date'),
help_text=_('What date did the membership end?'),
blank=True,
null=True
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='memberships',
)

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_list' %}">{% translate "Cancel" %}</a>
<input class="btn btn-green-admin" type="submit" name="submit" value="{% translate 'Save' %}" />
</div>
</form>
{% endblock %}

View File

@ -64,6 +64,8 @@ urlpatterns = [
name='admin_people_activate'), name='admin_people_activate'),
path('admin/people/new/', views_admin.AdminPeopleRegisterView.as_view(), path('admin/people/new/', views_admin.AdminPeopleRegisterView.as_view(),
name='admin_people_new'), name='admin_people_new'),
path('admin/people/<int:pk>/membership/new/', views_admin.AdminPeopleMembershipRegisterView.as_view(),
name='admin_people_membership_new'),
path('admin/roles/', views_admin.AdminRolesView.as_view(), path('admin/roles/', views_admin.AdminRolesView.as_view(),
name='admin_roles'), name='admin_roles'),
path('admin/services/', views_admin.AdminServicesView.as_view(), path('admin/services/', views_admin.AdminServicesView.as_view(),

View File

@ -10,7 +10,7 @@ class LoginView(auth_views.LoginView):
'success_url': reverse_lazy('idhub:user_dashboard'), 'success_url': reverse_lazy('idhub:user_dashboard'),
} }
def get(self, request): def get(self, request, *args, **kwargs):
if request.GET.get('next'): if request.GET.get('next'):
self.extra_context['success_url'] = request.GET.get('next') self.extra_context['success_url'] = request.GET.get('next')
return super().get(request) return super().get(request, *args, **kwargs)

View File

@ -1,3 +1,4 @@
django==4.2.5 django==4.2.5
django-bootstrap5==23.3 django-bootstrap5==23.3
django-extensions==3.2.3 django-extensions==3.2.3
black==23.9.1