save a standar schema
This commit is contained in:
parent
233d8dfcc6
commit
5fbffa873c
|
@ -1,6 +1,9 @@
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
from smtplib import SMTPException
|
from smtplib import SMTPException
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
from django.views.generic.edit import UpdateView, CreateView
|
from django.views.generic.edit import UpdateView, CreateView
|
||||||
|
@ -8,7 +11,7 @@ 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, UserRol
|
from idhub.models import Membership, Rol, Service, UserRol, Schemas
|
||||||
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 (
|
from idhub.admin.forms import (
|
||||||
|
@ -42,9 +45,9 @@ class Credentials(AdminView, TemplateView):
|
||||||
section = "Credentials"
|
section = "Credentials"
|
||||||
|
|
||||||
|
|
||||||
class Schemes(AdminView, TemplateView):
|
class SchemasMix(AdminView, TemplateView):
|
||||||
title = _("Schemes Management")
|
title = _("Templates Management")
|
||||||
section = "Schemes"
|
section = "Templates"
|
||||||
|
|
||||||
|
|
||||||
class ImportExport(AdminView, TemplateView):
|
class ImportExport(AdminView, TemplateView):
|
||||||
|
@ -435,21 +438,69 @@ class AdminWalletConfigIssuesView(Credentials):
|
||||||
wallet = True
|
wallet = True
|
||||||
|
|
||||||
|
|
||||||
class AdminSchemesView(Schemes):
|
class AdminSchemasView(SchemasMix):
|
||||||
template_name = "idhub/admin/schemes.html"
|
template_name = "idhub/admin/schemas.html"
|
||||||
subtitle = _('Schemes List')
|
subtitle = _('Template List')
|
||||||
icon = ''
|
icon = ''
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context.update({
|
||||||
|
'schemas': Schemas.objects,
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
||||||
class AdminSchemesImportView(Schemes):
|
|
||||||
template_name = "idhub/admin/schemes_import.html"
|
class AdminSchemasImportView(SchemasMix):
|
||||||
subtitle = _('Import Schemes')
|
template_name = "idhub/admin/schemas_import.html"
|
||||||
|
subtitle = _('Import Template')
|
||||||
icon = ''
|
icon = ''
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context.update({
|
||||||
|
'schemas': self.get_schemas(),
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
||||||
class AdminSchemesExportView(Schemes):
|
def get_schemas(self):
|
||||||
template_name = "idhub/admin/schemes_export.html"
|
schemas_files = os.listdir(settings.SCHEMAS_DIR)
|
||||||
subtitle = _('Export Schemes')
|
schemas = [x for x in schemas_files
|
||||||
|
if not Schemas.objects.filter(file_schema=x).exists()]
|
||||||
|
return schemas
|
||||||
|
|
||||||
|
|
||||||
|
class AdminSchemasImportAddView(SchemasMix):
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
file_name = kwargs['file_schema']
|
||||||
|
schemas_files = os.listdir(settings.SCHEMAS_DIR)
|
||||||
|
if not file_name in schemas_files:
|
||||||
|
messages.error(self.request, f"The schema {file_name} not exist!")
|
||||||
|
return redirect('idhub:admin_schemas_import')
|
||||||
|
|
||||||
|
self.create_schema(file_name)
|
||||||
|
messages.success(self.request, _("The schema add successfully!"))
|
||||||
|
return redirect('idhub:admin_schemas_import')
|
||||||
|
|
||||||
|
def create_schema(self, file_name):
|
||||||
|
data = self.open_file(file_name)
|
||||||
|
schema = Schemas.objects.create(file_schema=file_name, data=data)
|
||||||
|
schema.save()
|
||||||
|
return schema
|
||||||
|
|
||||||
|
def open_file(self, file_name):
|
||||||
|
data = ''
|
||||||
|
filename = Path(settings.SCHEMAS_DIR).joinpath(file_name)
|
||||||
|
with filename.open() as schema_file:
|
||||||
|
data = schema_file.read()
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
class AdminSchemasExportView(SchemasMix):
|
||||||
|
template_name = "idhub/admin/schemas_export.html"
|
||||||
|
subtitle = _('Export Template')
|
||||||
icon = ''
|
icon = ''
|
||||||
|
|
||||||
|
|
||||||
|
|
29
idhub/migrations/0006_schemas.py
Normal file
29
idhub/migrations/0006_schemas.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Generated by Django 4.2.5 on 2023-10-20 13:49
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("idhub", "0005_remove_service_rol_service_rol"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Schemas",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.BigAutoField(
|
||||||
|
auto_created=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
verbose_name="ID",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("file_schema", models.CharField(max_length=250)),
|
||||||
|
("data", models.TextField()),
|
||||||
|
("created_at", models.DateTimeField(auto_now=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -49,6 +49,12 @@ class VCTemplate(models.Model):
|
||||||
data = models.TextField()
|
data = models.TextField()
|
||||||
|
|
||||||
|
|
||||||
|
class Schemas(models.Model):
|
||||||
|
file_schema = models.CharField(max_length=250)
|
||||||
|
data = models.TextField()
|
||||||
|
created_at = models.DateTimeField(auto_now=True)
|
||||||
|
|
||||||
|
|
||||||
class Membership(models.Model):
|
class Membership(models.Model):
|
||||||
"""
|
"""
|
||||||
This model represent the relation of this user with the ecosystem.
|
This model represent the relation of this user with the ecosystem.
|
||||||
|
|
34
idhub/templates/idhub/admin/schemas_import.html
Normal file
34
idhub/templates/idhub/admin/schemas_import.html
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{% extends "idhub/base_admin.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h3>
|
||||||
|
<i class="{{ icon }}"></i>
|
||||||
|
{{ subtitle }}
|
||||||
|
</h3>
|
||||||
|
<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 'Template available' %}</button></th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for schema in schemas %}
|
||||||
|
<tr style="font-size:15px;">
|
||||||
|
<td>{{ schema }}</td>
|
||||||
|
<td><a class="text-primary" href="{% url 'idhub:admin_schemas_import_add' schema %}" title="{% trans 'Add' %}"><i class="bi bi-plus-circle"></i></a></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="form-actions-no-box">
|
||||||
|
<a class="btn btn-green-admin" href="{# url 'idhub:admin_schemas_new' #}">{% translate "Add template" %} <i class="bi bi-plus"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -1,9 +0,0 @@
|
||||||
{% extends "idhub/base_admin.html" %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h3>
|
|
||||||
<i class="{{ icon }}"></i>
|
|
||||||
{{ subtitle }}
|
|
||||||
</h3>
|
|
||||||
{% endblock %}
|
|
|
@ -152,24 +152,24 @@
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="admin nav-link {% if section == 'Schemes' %}active {% endif %}fw-bold" data-bs-toggle="collapse" data-bs-target="#schemes" aria-expanded="false" aria-controls="schemes" href="javascript:void()">
|
<a class="admin nav-link {% if section == 'Schemas' %}active {% endif %}fw-bold" data-bs-toggle="collapse" data-bs-target="#schemas" aria-expanded="false" aria-controls="schemas" href="javascript:void()">
|
||||||
<i class="bi bi-file-earmark-text icon_sidebar"></i>
|
<i class="bi bi-file-earmark-text icon_sidebar"></i>
|
||||||
Schemes
|
Templates
|
||||||
</a>
|
</a>
|
||||||
<ul class="flex-column mb-2 ul_sidebar accordion-collapse {% if section == 'Schemes' %}expanded{% else %}collapse{% endif %}" id="schemes" data-bs-parent="#sidebarMenu">
|
<ul class="flex-column mb-2 ul_sidebar accordion-collapse {% if section == 'Schemas' %}expanded{% else %}collapse{% endif %}" id="schemas" data-bs-parent="#sidebarMenu">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link{% if path == 'admin_schemes' %} active2{% endif %}" href="{% url 'idhub:admin_schemes' %}">
|
<a class="nav-link{% if path == 'admin_schemas' %} active2{% endif %}" href="{% url 'idhub:admin_schemas' %}">
|
||||||
List of schemes
|
List of Templates
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link{% if path == 'admin_schemes_import' %} active2{% endif %}" href="{% url 'idhub:admin_schemes_import' %}">
|
<a class="nav-link{% if path == 'admin_schemas_import' %} active2{% endif %}" href="{% url 'idhub:admin_schemas_import' %}">
|
||||||
Import scheme
|
Import Templates
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link{% if path == 'admin_schemes_export' %} active2{% endif %}" href="{% url 'idhub:admin_schemes_export' %}">
|
<a class="nav-link{% if path == 'admin_schemas_export' %} active2{% endif %}" href="{% url 'idhub:admin_schemas_export' %}">
|
||||||
Export scheme
|
Export Templates
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -135,12 +135,14 @@ urlpatterns = [
|
||||||
name='admin_wallet_config_issue'),
|
name='admin_wallet_config_issue'),
|
||||||
path('admin/wallet/config/issue/', views_admin.AdminWalletConfigIssuesView.as_view(),
|
path('admin/wallet/config/issue/', views_admin.AdminWalletConfigIssuesView.as_view(),
|
||||||
name='admin_wallet_config_issue'),
|
name='admin_wallet_config_issue'),
|
||||||
path('admin/schemes/', views_admin.AdminSchemesView.as_view(),
|
path('admin/schemas/', views_admin.AdminSchemasView.as_view(),
|
||||||
name='admin_schemes'),
|
name='admin_schemas'),
|
||||||
path('admin/schemes/import', views_admin.AdminSchemesImportView.as_view(),
|
path('admin/schemas/import', views_admin.AdminSchemasImportView.as_view(),
|
||||||
name='admin_schemes_import'),
|
name='admin_schemas_import'),
|
||||||
path('admin/schemes/export/', views_admin.AdminSchemesExportView.as_view(),
|
path('admin/schemas/import/<str:file_schema>', views_admin.AdminSchemasImportAddView.as_view(),
|
||||||
name='admin_schemes_export'),
|
name='admin_schemas_import_add'),
|
||||||
|
path('admin/schemas/export/', views_admin.AdminSchemasExportView.as_view(),
|
||||||
|
name='admin_schemas_export'),
|
||||||
path('admin/import', views_admin.AdminImportView.as_view(),
|
path('admin/import', views_admin.AdminImportView.as_view(),
|
||||||
name='admin_import'),
|
name='admin_import'),
|
||||||
path('admin/export/', views_admin.AdminExportView.as_view(),
|
path('admin/export/', views_admin.AdminExportView.as_view(),
|
||||||
|
|
|
@ -3,3 +3,4 @@ django-bootstrap5==23.3
|
||||||
django-extensions==3.2.3
|
django-extensions==3.2.3
|
||||||
black==23.9.1
|
black==23.9.1
|
||||||
python-decouple==3.8
|
python-decouple==3.8
|
||||||
|
jsonschema==4.19.1
|
||||||
|
|
40
schemas/member.json
Normal file
40
schemas/member.json
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/credentials/v2",
|
||||||
|
"https://www.w3.org/ns/credentials/examples/v2"
|
||||||
|
],
|
||||||
|
"id": "https://example.com/credentials/3734",
|
||||||
|
"type": ["VerifiableCredential", "JsonSchemaCredential"],
|
||||||
|
"issuer": "https://pangea.org/issuers/10",
|
||||||
|
"issuanceDate": "2023-09-01T19:23:24Z",
|
||||||
|
"credentialSchema": {
|
||||||
|
"id": "https://www.w3.org/2022/credentials/v2/json-schema-credential-schema.json",
|
||||||
|
"type": "JsonSchema",
|
||||||
|
"digestSRI": "sha384-S57yQDg1MTzF56Oi9DbSQ14u7jBy0RDdx0YbeV7shwhCS88G8SCXeFq82PafhCrW"
|
||||||
|
},
|
||||||
|
"credentialSubject": {
|
||||||
|
"id": "https://pangea.org/schemas/member-credential-schema.json",
|
||||||
|
"type": "JsonSchema",
|
||||||
|
"jsonSchema": {
|
||||||
|
"$id": "https://pangea.org/schemas/member-credential-schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"name": "MemberCredential",
|
||||||
|
"description": "MemberCredential using JsonSchemaCredential",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "email"
|
||||||
|
},
|
||||||
|
"membershipType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["individual", "organization"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["name", "email", "membershipType"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -159,6 +159,7 @@ MEDIA_URL = '/media/'
|
||||||
STATIC_ROOT = config('STATIC_ROOT')
|
STATIC_ROOT = config('STATIC_ROOT')
|
||||||
MEDIA_ROOT = config('MEDIA_ROOT', default="idhub/upload")
|
MEDIA_ROOT = config('MEDIA_ROOT', default="idhub/upload")
|
||||||
FIXTURE_DIRS = (os.path.join(BASE_DIR, 'fixtures'),)
|
FIXTURE_DIRS = (os.path.join(BASE_DIR, 'fixtures'),)
|
||||||
|
SCHEMAS_DIR = os.path.join(BASE_DIR, 'schemas')
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
||||||
|
|
Loading…
Reference in a new issue