Fisrt import

This commit is contained in:
Jose Miguel López Coronado 2022-02-18 12:12:42 +01:00
commit ffe2ea5579
57 changed files with 10319 additions and 0 deletions

22
manage.py Normal file
View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mirri_tools_web.settings")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == "__main__":
main()

View File

16
mirri_tools_web/asgi.py Normal file
View File

@ -0,0 +1,16 @@
"""
ASGI config for mirri_validator_web project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mirri_tools_web.settings")
application = get_asgi_application()

View File

@ -0,0 +1,33 @@
<VirtualHost *:80>
ServerName localhost
ServerAdmin pziarsolo@cect.org
Alias /static /home/webadmin/devel/mirri_tools/static
Alias /media /home/webadmin/devel/mirri_tools/media
WSGIPassAuthorization On
WSGIDaemonProcess tools.mirri.org python-path=/home/webadmin/devel/mirri_tools:/home/webadmin/devel/mirri_utils:/home/webadmin/devel/pyenv/lib/python3.7/site-packages
WSGIProcessGroup tools.mirri.org
WSGIScriptAlias / /home/webadmin/devel/mirri_tools/mirri_tools_web/wsgi.py
<Directory /home/webadmin/devel/mirri_tools/mirri_tools_web/ >
<Files wsgi.py>
Require all granted
</Files>
</Directory>
<Directory /home/webadmin/devel/mirri_tools/static>
Require all granted
</Directory>
<Directory /home/webadmin/devel/mirri_tools/media>
Require all granted
</Directory>
DocumentRoot /var/www/html
CustomLog ${APACHE_LOG_DIR}/validator_access.log combined
ErrorLog ${APACHE_LOG_DIR}/validator_error.log
LogLevel warn
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

150
mirri_tools_web/settings.py Normal file
View File

@ -0,0 +1,150 @@
"""
Django settings for mirri_validator_web project.
Generated by 'django-admin startproject' using Django 3.1.2.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
import os
import socket
from pathlib import Path
try:
from .secrets import SITE_SECRET_ID
except ImportError as error:
raise ImportError('You need a secrets.py file with SITE_SECRET_ID on it') from error
def get_ip_address():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CACHE_DIR = os.path.join(BASE_DIR, 'cache')
SITE_ID = 1
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = SITE_SECRET_ID
# SECURITY WARNING: don't run with debug turned on in production!
HOST_IP = get_ip_address()
DEVELOPMENT_MACHINE = not HOST_IP.startswith('192.168')
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
DEBUG = DEVELOPMENT_MACHINE
ALLOWED_HOSTS = ["192.168.3.2", "localhost"]
# Application definition
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"web_tools",
]
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = "mirri_tools_web.urls"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
WSGI_APPLICATION = "mirri_tools_web.wsgi.application"
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = "/static/"
STATIC_ROOT = str(BASE_DIR / "static")
MEDIA_URL = "/media/"
MEDIA_ROOT = str(BASE_DIR / "media")
WEB_TOOLS_VALID_EXCEL_UPLOAD_DIR = BASE_DIR / 'uploaded'
WEB_TOOLS_NOTIFICATION_RECEIVERS = ['jmlopez@cect.org']

28
mirri_tools_web/urls.py Normal file
View File

@ -0,0 +1,28 @@
"""mirri_validator_web URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.urls.conf import include
from django.conf import settings
from django.conf.urls.static import static
import web_tools.urls
urlpatterns = [
path("admin/", admin.site.urls),
path("", include(web_tools.urls)),
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

19
mirri_tools_web/wsgi.py Normal file
View File

@ -0,0 +1,19 @@
"""
WSGI config for mirri_validator_web project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
import sys
sys.path.append("/home/peio/devel/cect/mirri_utils")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mirri_tools_web.settings")
application = get_wsgi_application()

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
django
xhtml2pdf

0
web_tools/__init__.py Normal file
View File

3
web_tools/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
web_tools/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class WebToolsConfig(AppConfig):
name = "web_tools"

9
web_tools/forms.py Normal file
View File

@ -0,0 +1,9 @@
from django import forms
class ValidationUploadForm(forms.Form):
file = forms.FileField(
max_length=100, label="Add an excel file with the MIRRI specs", required=True
)
do_upload = forms.BooleanField(
label='Check it if you want to uploaad the file', required=False)

View File

3
web_tools/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

27
web_tools/send_mail.py Normal file
View File

@ -0,0 +1,27 @@
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def send_mail(receivers, fname):
subject = "New file uploaded with validator"
body = f"A new file has been uploaded using the validator file: {fname}"
sender_email = "pziarsolo@cect.org"
# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = ", ".join(receivers)
message["Subject"] = subject
# Add body to email
message.attach(MIMEText(body))
text = message.as_string()
# Log in to server using secure context and send email
server = smtplib.SMTP("localhost")
# server.login(sender_email, password)
server.sendmail(sender_email, receivers, text)
server.close()

5
web_tools/settings.py Normal file
View File

@ -0,0 +1,5 @@
from django.conf import settings
VALID_EXCEL_UPLOAD_DIR = getattr(settings, 'WEB_TOOLS_VALID_EXCEL_UPLOAD_DIR')
NUM_ERROR_LIMIT = getattr(settings, 'WEB_TOOLS_NUM_ERROR_LIMIT', 100)
NOTIFICATION_RECEIVERS = getattr(settings, 'WEB_TOOLS_NOTIFICATION_RECEIVERS', [])

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,154 @@
/* CSS Document */
@import url(https://fonts.googleapis.com/css?family=Open+Sans);
@import url(https://fonts.googleapis.com/css?family=Bree+Serif);
body {
background: #ffffff;
font-size: 22px;
line-height: 32px;
color: #567084;
word-wrap: break-word !important;
font-family: "Open Sans", sans-serif;
margin: 0;
padding: 0;
}
#page-container {
margin: 0;
position: relative;
min-height: 100vh;
/* min-height: 100%; */
}
#content-wrap {
padding-bottom: 2.5rem; /* Footer height */
/* display: flex;
flex-direction: column;
justify-content: center;
align-items: center; */
/* text-align: center; */
}
#content {
position: absolute;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
}
#footer {
position: absolute;
bottom: 0;
width: 100%;
height: 2.5rem; /* Footer height */
align-items: center;
text-align: center;
background-color: #000000;
}
h1 {
font-size: 60px;
text-align: center;
color: #fff;
}
h3 {
font-size: 30px;
/* text-align: center; */
color: #567084;
}
h3 a {
color: #ef7c16;
}
a {
color: #ef7c16;
}
h1 {
margin-top: 100px;
text-align: center;
font-size: 60px;
font-family: "Bree Serif", "serif";
}
#header {
margin: 0 auto;
}
p {
/* text-align: center; */
}
nav {
margin: 0 0 50px 0;
background-color: #929292;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
nav ul {
padding: 0;
margin: 0;
list-style: none;
position: relative;
}
nav ul li {
display: inline-block;
background-color: #ffffff;
}
nav a {
display: block;
padding: 0 10px;
color: rgb(68, 68, 68);
font-size: 20px;
line-height: 60px;
text-decoration: none;
}
nav a:hover {
background-color: #9c9c9c;
}
/* Hide Dropdowns by Default */
nav ul ul {
display: none;
position: absolute;
top: 60px; /* the height of the main nav */
}
/* Display Dropdowns on Hover */
nav ul li:hover > ul {
display: inherit;
}
/* Fisrt Tier Dropdown */
nav ul ul li {
width: 170px;
float: none;
display: list-item;
position: relative;
}
/* Second, Third and more Tiers */
nav ul ul ul li {
position: relative;
top: -60px;
left: 170px;
}
/* Change this in order to change the Dropdown symbol */
li > a:after {
content: " +";
}
li > a:only-child:after {
content: "";
}
.strong {
color: #ef7c16;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.elementor-kit-9{--e-global-color-primary:#ea7118;--e-global-color-secondary:#577186;--e-global-color-text:#595f6e;--e-global-color-accent:#61ce70;--e-global-color-3f3a565:#fff;--e-global-typography-primary-font-family:"Rubik";--e-global-typography-primary-font-size:1rem;--e-global-typography-primary-font-weight:400;--e-global-typography-primary-line-height:1.8em;--e-global-typography-secondary-font-family:"Montserrat";--e-global-typography-secondary-font-weight:500;--e-global-typography-secondary-line-height:1.2em;--e-global-typography-text-font-family:"Rubik";--e-global-typography-text-font-size:1rem;--e-global-typography-text-font-weight:400;--e-global-typography-text-line-height:1.8em;--e-global-typography-accent-font-family:"Roboto";--e-global-typography-accent-font-weight:500;color:var(--e-global-color-secondary);font-family:var(--e-global-typography-primary-font-family),Rubik;font-size:var(--e-global-typography-primary-font-size);font-weight:var(--e-global-typography-primary-font-weight);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 a{font-family:"Montserrat",Rubik;font-weight:500;line-height:1.2em}.elementor-kit-9 h1{color:var(--e-global-color-secondary);font-family:"Montserrat",Rubik;font-weight:400}.elementor-kit-9 button,.elementor-kit-9 input[type=button],.elementor-kit-9 input[type=submit],.elementor-kit-9 .elementor-button{font-family:var(--e-global-typography-primary-font-family),Rubik;font-size:var(--e-global-typography-primary-font-size);font-weight:var(--e-global-typography-primary-font-weight);line-height:var(--e-global-typography-primary-line-height);color:var(--e-global-color-primary);background-color:#fff;border-style:solid;border-color:var(--e-global-color-primary);border-radius:9px;padding:8px}.elementor-kit-9 button:hover,.elementor-kit-9 button:focus,.elementor-kit-9 input[type=button]:hover,.elementor-kit-9 input[type=button]:focus,.elementor-kit-9 input[type=submit]:hover,.elementor-kit-9 input[type=submit]:focus,.elementor-kit-9 .elementor-button:hover,.elementor-kit-9 .elementor-button:focus{color:#fff;background-color:var(--e-global-color-primary)}.elementor-kit-9 label{font-family:var(--e-global-typography-primary-font-family),Rubik;font-size:var(--e-global-typography-primary-font-size);font-weight:var(--e-global-typography-primary-font-weight);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 input:not([type=button]):not([type=submit]),.elementor-kit-9 textarea,.elementor-kit-9 .elementor-field-textual{font-family:var(--e-global-typography-primary-font-family),Rubik;font-size:var(--e-global-typography-primary-font-size);font-weight:var(--e-global-typography-primary-font-weight);line-height:var(--e-global-typography-primary-line-height);border-style:solid;border-color:#0201014D;border-radius:6px;padding:7px}.elementor-section.elementor-section-boxed>.elementor-container{max-width:1140px}.elementor-widget:not(:last-child){margin-bottom:20px}{}h1.entry-title{display:var(--page-title-display)}@media(max-width:1024px){.elementor-kit-9{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 button,.elementor-kit-9 input[type=button],.elementor-kit-9 input[type=submit],.elementor-kit-9 .elementor-button{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 label{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 input:not([type=button]):not([type=submit]),.elementor-kit-9 textarea,.elementor-kit-9 .elementor-field-textual{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-section.elementor-section-boxed>.elementor-container{max-width:1025px}}@media(max-width:767px){.elementor-kit-9{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 button,.elementor-kit-9 input[type=button],.elementor-kit-9 input[type=submit],.elementor-kit-9 .elementor-button{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 label{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-kit-9 input:not([type=button]):not([type=submit]),.elementor-kit-9 textarea,.elementor-kit-9 .elementor-field-textual{font-size:var(--e-global-typography-primary-font-size);line-height:var(--e-global-typography-primary-line-height)}.elementor-section.elementor-section-boxed>.elementor-container{max-width:768px}}

View File

@ -0,0 +1 @@
.elementor-1094 .elementor-element.elementor-element-adab34d .elementor-spacer-inner{height:20px}.elementor-1094 .elementor-element.elementor-element-f3c87b8 .elementor-heading-title{color:var(--e-global-color-secondary);font-family:"Rubik",Rubik;font-size:1.3rem;font-weight:600;line-height:1.8em;letter-spacing:0px}.elementor-1094 .elementor-element.elementor-element-f3c87b8>.elementor-widget-container{margin:0}.elementor-1094 .elementor-element.elementor-element-c4057a3 .elementor-heading-title{color:var(--e-global-color-secondary);font-family:"Rubik",Rubik;font-size:1.3rem;font-weight:600;line-height:1.8em;letter-spacing:0px}.elementor-1094 .elementor-element.elementor-element-cfe333f .elementor-text-editor{text-align:justify}.elementor-1094 .elementor-element.elementor-element-0c4ea1a .elementor-heading-title{color:#595f6e;font-family:"Rubik",Rubik;font-size:1rem;font-weight:600;line-height:1.8em;letter-spacing:0px}.elementor-1094 .elementor-element.elementor-element-5f17b5a .elementor-text-editor{text-align:justify}.elementor-1094 .elementor-element.elementor-element-622d409 .elementor-spacer-inner{height:20px}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,304 @@
/* cyrillic-ext */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gTD_u50.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3g3D_u50.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gbD_u50.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gfD_u50.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 100;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1MmgVxIIzI.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,26 @@
.error_table {
font-family: Arial, Helvetica, sans-serif;
width: 100%;
}
.error_table tr th{
font-weight: bold;
border: 5px solid black;
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #838383;
}
.error_table tr td {
border: 1px solid #ddd;
padding: 8px;
}
.error_table tr:nth-child(even){background-color: #525252;}
.error_table tr:hover {background-color: #ddd;}
.strong {
font-weight: bold;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View File

@ -0,0 +1,797 @@
{% load static %}
<!DOCTYPE html>
<head>
<title>{% block title %}{% endblock %}</title>
<link media="all" href="{% static 'web_tools/style/css/autoptimize_a5a452a287dfdad5a08bd44d3a6e3d3e.css' %}" rel="stylesheet">
<title>Tools MIRRI</title>
<link href="https://dev.mirri.org/wp-content/plugins/elementor/assets/lib/font-awesome/webfonts/fa-solid-900.woff2"
rel="preload" as="font" type="font/woff" >
<link href="https://dev.mirri.org/wp-content/plugins/elementor/assets/lib/eicons/fonts/eicons.woff2?5.9.1"
rel="preload" as="font" type="font/woff" >
<link href="https://dev.mirri.org/wp-content/plugins/elementor/assets/lib/font-awesome/webfonts/fa-brands-400.woff2"
rel="preload" as="font" type="font/woff" >
<link href="https://fonts.googleapis.com/" rel="preconnect" >
<link href="https://platform.twitter.com/" rel="preconnect">
<link href="https://fonts.gstatic.com/" rel="preconnect" >
<link href="https://cdn.syndication.twimg.com/" rel="preconnect">
<link href="https://ton.twimg.com/" rel="preconnect">
<link rel="stylesheet" id="mec-google-fonts-css" href="{% static 'web_tools/style/css/mec-google-fonts.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="ed6ad5db9-css" href="{% static 'web_tools/style/css/734e5f942.min.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="jupiterx-css" href="{% static 'web_tools/style/css/autoptimize_single_b9367e9f84eff03e58726166b24efc47.css' %}"
type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-9-css"
href="{% static 'web_tools/style/css/autoptimize_single_ea224e3b8c1f3012917acba775bec7fa.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-global-css"
href="{% static 'web_tools/style/css/autoptimize_single_d18cd62a07caca04e97f6984ad6fee0b.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-1094-css"
href="{% static 'web_tools/style/css/autoptimize_single_fdebd036a6c313b7d17a4571c3a641ff.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-2253-css"
href="{% static 'web_tools/style/css/autoptimize_single_79ccae64b30dcad1e8ae5d5d0add8420.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-495-css"
href="{% static 'web_tools/style/css/autoptimize_single_6bf9e265fba73a1fdb8ab28503184d4b.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-13-css"
href="{% static 'web_tools/style/css/autoptimize_single_3fdc936d7e88fb9e46a15ddaefdd061a.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="google-fonts-1-css" href="{% static 'web_tools/style/css/google-fonts-1.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-879-css" href="{% static 'web_tools/style/css/autoptimize_single_0bdcd8bf82c379b3ec901a408c1117eb.css' %}" type="text/css" media="all">
<script src="{% static 'web_tools/style/css/wp-emoji-release.min.js.transferir' %}" type="text/javascript"></script>
<script src="{% static 'web_tools/style/css/jquery.min.js.transferir' %}" type="text/javascript"></script>
<script data-noptimize="1">window.lazySizesConfig = window.lazySizesConfig || {}; window.lazySizesConfig.loadMode = 1;</script>
<script async="" data-noptimize="1" src="{% static 'web_tools/style/css/lazysizes.min.js.transferir' %}"></script>
<script type="text/javascript" id="jquery-ui-datepicker-js-after">jQuery(document).ready(function (jQuery) { jQuery.datepicker.setDefaults({ "closeText": "Close", "currentText": "Today", "monthNames": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "monthNamesShort": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], "nextText": "Next", "prevText": "Previous", "dayNames": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "dayNamesShort": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "dayNamesMin": ["S", "M", "T", "W", "T", "F", "S"], "dateFormat": "d \\dd\\e MM \\dd\\e yy", "firstDay": 1, "isRTL": false }); });</script>
<script type="text/javascript" id="ed6ad5db9-js-extra">var localize = { "ajaxurl": "https:\/\/dev.mirri.org\/wp-admin\/admin-ajax.php", "nonce": "077dae69bc", "i18n": { "added": "Added ", "compare": "Compare", "loading": "Loading..." } };</script>
<script type="text/javascript" id="ivory-search-scripts-js-extra">var IvorySearchVars = { "is_analytics_enabled": "1" };</script>
<script type="text/javascript" id="elementor-frontend-js-before">var elementorFrontendConfig = { "environmentMode": { "edit": false, "wpPreview": false }, "i18n": { "shareOnFacebook": "Share on Facebook", "shareOnTwitter": "Share on Twitter", "pinIt": "Pin it", "download": "Download", "downloadImage": "Download image", "fullscreen": "Fullscreen", "zoom": "Zoom", "share": "Share", "playVideo": "Play Video", "previous": "Previous", "next": "Next", "close": "Close" }, "is_rtl": false, "breakpoints": { "xs": 0, "sm": 480, "md": 768, "lg": 1025, "xl": 1440, "xxl": 1600 }, "version": "3.0.14", "is_static": false, "legacyMode": { "elementWrappers": true }, "urls": { "assets": "https:\/\/dev.mirri.org\/wp-content\/plugins\/elementor\/assets\/" }, "settings": { "page": [], "editorPreferences": [] }, "kit": { "global_image_lightbox": "yes", "lightbox_enable_counter": "yes", "lightbox_enable_fullscreen": "yes", "lightbox_enable_zoom": "yes", "lightbox_enable_share": "yes", "lightbox_title_src": "title", "lightbox_description_src": "description" }, "post": { "id": 1094, "title": "Expert%20Clusters%20%E2%80%93%20MIRRI", "excerpt": "", "featuredImage": false } };</script>
<script type="text/javascript" id="jet-elements-js-extra">var jetElements = { "ajaxUrl": "https:\/\/dev.mirri.org\/wp-admin\/admin-ajax.php", "isMobile": "false", "templateApiUrl": "https:\/\/dev.mirri.org\/index.php?rest_route=\/jet-elements-api\/v1\/elementor-template", "devMode": "false", "messages": { "invalidMail": "Please specify a valid e-mail" } };</script>
<script type="text/javascript" id="jet-tabs-frontend-js-extra">var JetTabsSettings = { "ajaxurl": "https:\/\/dev.mirri.org\/wp-admin\/admin-ajax.php", "isMobile": "false", "templateApiUrl": "https:\/\/dev.mirri.org\/index.php?rest_route=\/jet-tabs-api\/v1\/elementor-template", "devMode": "false" };</script>
<script type="text/javascript" id="wp-util-js-extra">var _wpUtilSettings = { "ajax": { "url": "\/wp-admin\/admin-ajax.php" } };</script>
<script type="text/javascript" id="jupiterx-core-raven-frontend-js-extra">var ravenFormsTranslations = { "validation": { "required": "Please fill in this field", "invalidEmail": "The value is not a valid email address", "invalidPhone": "The value should only consist numbers and phone characters (-, +, (), etc)", "invalidNumber": "The value is not a valid number", "invalidMaxValue": "Value must be less than or equal to MAX_VALUE", "invalidMinValue": "Value must be greater than or equal to MIN_VALUE" } };</script>
<script type="text/javascript" id="jet-blog-js-extra">var JetBlogSettings = { "ajaxurl": "https:\/\/dev.mirri.org\/wp-admin\/admin-ajax.php" };</script>
<script type="text/javascript" id="jet-engine-frontend-js-extra">var JetEngineSettings = { "ajaxurl": "https:\/\/dev.mirri.org\/wp-admin\/admin-ajax.php", "mapPopupTimeout": "400" };</script>
<script type="text/javascript">(function () { document.body.className = document.body.className.replace('no-js', 'js'); }());</script>
<script defer="" src="{% static 'web_tools/style/css/autoptimize_b879e7e20b057357a98e10b516b0270a.js.transferir' %}"></script>
<script defer="" src="{% static 'web_tools/style_custom.css' %}"></script>
</head>
<body
class="page-template page-template-elementor_header_footer page page-id-1094 js jupiterx elementor-default elementor-kit-9 elementor-page elementor-page-1094 jupiterx-header-sticky">
<div class="jupiterx-site">
<header class="jupiterx-header jupiterx-header-custom jupiterx-header-sticky-custom"
data-jupiterx-settings="{&quot;breakpoint&quot;:&quot;767.98&quot;,&quot;template&quot;:&quot;2253&quot;,&quot;stickyTemplate&quot;:&quot;495&quot;,&quot;behavior&quot;:&quot;sticky&quot;,&quot;offset&quot;:&quot;250&quot;}"
role="banner" itemscope="itemscope" itemtype="http://schema.org/WPHeader">
<!--Normal Menu Start-->
<div data-elementor-type="header" data-elementor-id="2253" class="elementor elementor-2253"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section
class="elementor-section elementor-top-section elementor-element elementor-element-70b213e8 elementor-section-full_width elementor-section-height-default elementor-section-height-default"
data-id="70b213e8" data-element_type="section"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;,&quot;animation&quot;:&quot;none&quot;}">
<div class="elementor-background-overlay"></div>
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-75058f60"
data-id="75058f60" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-6bd950f6 elementor-widget elementor-widget-raven-site-logo"
data-id="6bd950f6" data-element_type="widget"
data-widget_type="raven-site-logo.default">
<div class="elementor-widget-container">
<div class="raven-widget-wrapper">
<div class="raven-site-logo">
<a class="raven-site-logo-link"
href="https://dev.mirri.org/"> <img
src="{% static 'web_tools/style/css/mirri_logo-1.png' %}" alt="MIRRI"
class="raven-site-logo-desktop raven-site-logo-mobile"
data-no-lazy="1"> <img
src="{% static 'web_tools/style/css/MIRRIOrangeNOERIC.png' %}" alt="MIRRI"
class="raven-site-logo-tablet" data-no-lazy="1">
</a></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-37ff9932 elementor-widget elementor-widget-spacer"
data-id="37ff9932" data-element_type="widget"
data-widget_type="spacer.default">
<div class="elementor-widget-container">
<div class="elementor-spacer">
<div class="elementor-spacer-inner"></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-6a8a5e2f raven-breakpoint-tablet raven-nav-menu-align-center raven-nav-menu-stretch elementor-widget elementor-widget-raven-nav-menu"
data-id="6a8a5e2f" data-element_type="widget"
data-settings="{&quot;submenu_space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;full_width&quot;:&quot;stretch&quot;,&quot;mobile_layout&quot;:&quot;dropdown&quot;,&quot;submenu_opening_position&quot;:&quot;bottom&quot;}"
data-widget_type="raven-nav-menu.default">
<div class="elementor-widget-container">
<!-- Browser Menu Init-->
<nav
class="raven-nav-menu-main raven-nav-menu-horizontal raven-nav-menu-tablet-horizontal raven-nav-menu-mobile-horizontal raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile">
<ul id="menu-6a8a5e2f" class="raven-nav-menu"
data-smartmenus-id="16143429460421392">
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">
Home
</a>
</li>
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu"
id="sm-16143429460421392-1" aria-haspopup="true" aria-controls="sm-16143429460421392-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span>
</a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460421392-2" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460421392-1" aria-expanded="false">
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Excel Validator
</a>
</li>
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1238">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item has-submenu"
id="sm-16143429460421392-3" aria-haspopup="true" aria-controls="sm-16143429460421392-4" aria-expanded="false">
Level 1
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460421392-4" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460421392-3" aria-expanded="false">
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
<li
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1266">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
<!-- Browser Menu End-->
<div class="raven-nav-menu-toggle">
<div class="raven-nav-menu-toggle-button ">
<span class="fa fa-bars"></span>
</div>
</div>
<!-- Tablet Menu Init-->
<nav class="raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile raven-nav-menu-mobile raven-nav-menu-dropdown" style="max-height: 912px; width: 1903px; left: 0px; top: 159.688px;">
<div class="raven-container" style="max-width: 1903px;">
<ul id="menu-mobile-6a8a5e2f" class="raven-nav-menu" data-smartmenus-id="16143429460474102">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">
Home
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu" id="sm-16143429460474102-1" aria-haspopup="true" aria-controls="sm-16143429460474102-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span>
</a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460474102-2" role="group" aria-hidden="true" aria-labelledby="sm-16143429460474102-1" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Excel Validator
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1238">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item has-submenu"
id="sm-16143429460474102-3" aria-haspopup="true" aria-controls="sm-16143429460474102-4" aria-expanded="false">
Level 1
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460474102-4" role="group" aria-hidden="true" aria-labelledby="sm-16143429460474102-3" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1266">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</nav>
<!-- Tablet Menu End-->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<!--Normal Menu End-->
<!--Hover Menu Start-->
<div data-elementor-type="header" data-elementor-id="495" class="elementor elementor-495"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section class="elementor-section elementor-top-section elementor-element elementor-element-7bc7b39 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7bc7b39" data-element_type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-b48e6a" data-id="b48e6a" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-7130d07 elementor-widget elementor-widget-spacer" data-id="7130d07" data-element_type="widget" data-widget_type="spacer.default">
<div class="elementor-widget-container">
<div class="elementor-spacer">
<div class="elementor-spacer-inner"></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-36cb1d41 elementor-widget elementor-widget-raven-site-logo" data-id="36cb1d41" data-element_type="widget"data-widget_type="raven-site-logo.default">
<div class="elementor-widget-container">
<div class="raven-widget-wrapper">
<div class="raven-site-logo">
<a class="raven-site-logo-link" href="https://dev.mirri.org/">
<img src="{% static 'web_tools/style/css/MIRRIOrangeNOERIC.png' %}" alt="MIRRI" class="raven-site-logo-desktop" data-no-lazy="1">
<img src="{% static 'web_tools/style/css/MIRRIOrangeNOERIC.png' %}" alt="MIRRI" class="raven-site-logo-tablet raven-site-logo-mobile" data-no-lazy="1">
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-f0fbe73" data-id="f0fbe73" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-7de38754 elementor-widget elementor-widget-spacer" data-id="7de38754" data-element_type="widget" data-widget_type="spacer.default">
<div class="elementor-widget-container">
<div class="elementor-spacer">
<div class="elementor-spacer-inner"></div>
</div>
</div>
</div>
<section class="elementor-section elementor-inner-section elementor-element elementor-element-5fdebe5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5fdebe5" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6ce30a2" data-id="6ce30a2" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-56947eb1 raven-breakpoint-tablet raven-nav-menu-stretch raven-nav-menu-align-left elementor-widget elementor-widget-raven-nav-menu" data-id="56947eb1" data-element_type="widget" data-settings="{&quot;submenu_space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;full_width&quot;:&quot;stretch&quot;,&quot;mobile_layout&quot;:&quot;dropdown&quot;,&quot;submenu_opening_position&quot;:&quot;bottom&quot;}" data-widget_type="raven-nav-menu.default">
<div class="elementor-widget-container">
<!-- Browser Menu Init-->
<nav
class="raven-nav-menu-main raven-nav-menu-horizontal raven-nav-menu-tablet-horizontal raven-nav-menu-mobile-horizontal raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile">
<ul id="menu-56947eb1" class="raven-nav-menu" data-smartmenus-id="16143429460579077">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">
Home
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu"
id="sm-16143429460579077-1" aria-haspopup="true" aria-controls="sm-16143429460579077-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span></a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460579077-2" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460579077-1" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Excel Validator
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1238">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item has-submenu"
id="sm-16143429460579077-3" aria-haspopup="true" aria-controls="sm-16143429460579077-4" aria-expanded="false">
Level 1
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460579077-4" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460579077-3" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1266">
<a href="https://tools.mirri.org" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- Browser Menu End-->
<div class="raven-nav-menu-toggle">
<div
class="raven-nav-menu-toggle-button ">
<span class="fa fa-bars"></span>
</div>
</div>
<!-- Tablet Menu Init-->
<nav class="raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile raven-nav-menu-mobile raven-nav-menu-dropdown" style="max-height: 912px; width: 1903px; left: 0px; top: -1681.17px;">
<div class="raven-container" style="max-width: 1600px;">
<ul id="menu-mobile-56947eb1" class="raven-nav-menu" data-smartmenus-id="16143429460590867">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">Home</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu"
id="sm-16143429460590867-1" aria-haspopup="true" aria-controls="sm-16143429460590867-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span>
</a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460590867-2" role="group" aria-hidden="true" aria-labelledby="sm-16143429460590867-1" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Excel Validator
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1238">
<a href="https://dev.mirri.org/" class="raven-submenu-item raven-link-item has-submenu" id="sm-16143429460590867-3" aria-haspopup="true" aria-controls="sm-16143429460590867-4" aria-expanded="false">
Level 1
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460590867-4" role="group" aria-hidden="true" aria-labelledby="sm-16143429460590867-3" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="https://dev.mirri.org/" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1266">
<a href="https://dev.mirri.org/"class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</nav>
<!-- Tablet Menu End-->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="elementor-section elementor-top-section elementor-element elementor-element-49d35a44 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="49d35a44" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2b4466a3" data-id="2b4466a3" data-element_type="column">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<!--Hover Menu End-->
</header>
<!--Main Content Init-->
<main class="jupiterx-main">
<div data-elementor-type="single" data-elementor-id="879" class="elementor elementor-879"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<!--Main Content Bar Section Title Init-->
<section
class="elementor-section elementor-top-section elementor-element elementor-element-7f2cc9e9 elementor-section-full_width elementor-section-height-default elementor-section-height-default"
data-id="7f2cc9e9" data-element_type="section"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7af24d56 elementor-hidden-phone"
data-id="7af24d56" data-element_type="column"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-17c67231"
data-id="17c67231" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-8c30537 elementor-align-center elementor-widget elementor-widget-raven-post-meta"
data-id="8c30537" data-element_type="widget"
data-widget_type="raven-post-meta.default">
<div class="elementor-widget-container">
<ul class="raven-icon-list-items raven-post-meta">
<li
class="raven-icon-list-item elementor-repeater-item-fc48d0b">
<span
class="raven-icon-list-text raven-post-meta-item raven-post-meta-item-type-custom">
{% block navigator %}{% endblock %} </span></li>
</ul>
</div>
</div>
<div class="elementor-element elementor-element-54237fa1 elementor-widget-divider--separator-type-pattern elementor-widget-divider--no-spacing elementor-widget-divider--view-line elementor-widget elementor-widget-divider"
data-id="54237fa1" data-element_type="widget"
data-widget_type="divider.default">
<div class="elementor-widget-container">
<div class="elementor-divider"
style="--divider-pattern-url: url(&quot;data:image/svg+xml,%3Csvg xmlns=&#39;http://www.w3.org/2000/svg&#39; preserveAspectRatio=&#39;xMidYMid meet&#39; overflow=&#39;visible&#39; height=&#39;100%&#39; viewBox=&#39;0 0 126 26&#39; fill=&#39;black&#39; stroke=&#39;none&#39;%3E%3Cpath d=&#39;M3,10.2c2.6,0,2.6,2,2.6,3.2S4.4,16.5,3,16.5s-3-1.4-3-3.2S0.4,10.2,3,10.2z M18.8,10.2c1.7,0,3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2c-1.7,0-3.2-1.4-3.2-3.2S17,10.2,18.8,10.2z M34.6,10.2c1.5,0,2.6,1.4,2.6,3.2s-0.5,3.2-1.9,3.2c-1.5,0-3.4-1.4-3.4-3.2S33.1,10.2,34.6,10.2z M50.5,10.2c1.7,0,3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2c-1.7,0-3.3-0.9-3.3-2.6S48.7,10.2,50.5,10.2z M66.2,10.2c1.5,0,3.4,1.4,3.4,3.2s-1.9,3.2-3.4,3.2c-1.5,0-2.6-0.4-2.6-2.1S64.8,10.2,66.2,10.2z M82.2,10.2c1.7,0.8,2.6,1.4,2.6,3.2s-0.1,3.2-1.6,3.2c-1.5,0-3.7-1.4-3.7-3.2S80.5,9.4,82.2,10.2zM98.6,10.2c1.5,0,2.6,0.4,2.6,2.1s-1.2,4.2-2.6,4.2c-1.5,0-3.7-0.4-3.7-2.1S97.1,10.2,98.6,10.2z M113.4,10.2c1.2,0,2.2,0.9,2.2,3.2s-0.1,3.2-1.3,3.2s-3.1-1.4-3.1-3.2S112.2,10.2,113.4,10.2z&#39;/%3E%3C/svg%3E&quot;);">
<span class="elementor-divider-separator"> </span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-12514f33 elementor-hidden-phone"
data-id="12514f33" data-element_type="column"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
</div>
</div>
</section>
<!--Main Content Section Title End-->
<!--Main Content Section Data Init-->
<section
class="elementor-section elementor-top-section elementor-element elementor-element-14718c83 elementor-section-full_width elementor-section-height-default elementor-section-height-default"
data-id="14718c83" data-element_type="section">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3d6ff095"
data-id="3d6ff095" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-23e5c116 elementor-widget elementor-widget-raven-post-content"
data-id="23e5c116" data-element_type="widget"
data-widget_type="raven-post-content.default">
<div class="elementor-widget-container">
<div data-elementor-type="wp-page" data-elementor-id="1094"
class="elementor elementor-1094"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section
class="elementor-section elementor-top-section elementor-element elementor-element-a1fedef elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="a1fedef" data-element_type="section">
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d62edfe"
data-id="d62edfe"
data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div
class="elementor-widget-wrap">
<div class="elementor-element elementor-element-adab34d elementor-widget elementor-widget-spacer"
data-id="adab34d"
data-element_type="widget"
data-widget_type="spacer.default">
<div
class="elementor-widget-container">
<div
class="elementor-spacer">
<div
class="elementor-spacer-inner">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section
class="elementor-section elementor-top-section elementor-element elementor-element-9462c4a elementor-section-boxed elementor-section-height-default elementor-section-height-default">
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<h2
class="elementor-heading-title elementor-size-default">
{% block page_title %} {% endblock page_title %}
</h2>
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<p
class="elementor-text-editor elementor-clearfix">
</p>
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
{% block content %}
{% endblock content %}
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<p
class="elementor-text-editor elementor-clearfix">
</p>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--Main Content Section Data End-->
</div>
</div>
</div>
</main>
<!--Main Content End-->
<!--Footer Content Init-->
<footer class="jupiterx-footer" role="contentinfo" itemscope="itemscope" itemtype="http://schema.org/WPFooter">
<div data-elementor-type="footer" data-elementor-id="13" class="elementor elementor-13"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section
class="elementor-section elementor-top-section elementor-element elementor-element-518e4702 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="518e4702" data-element_type="section"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-background-overlay"></div>
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-40c2714"
data-id="40c2714" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-620e8301 elementor-widget elementor-widget-raven-site-logo"
data-id="620e8301" data-element_type="widget"
data-widget_type="raven-site-logo.default">
<div class="elementor-widget-container">
<div class="raven-widget-wrapper">
<div class="raven-site-logo"> <a
class="raven-site-logo-link"
href="https://dev.mirri.org/"> <img
src="{% static 'web_tools/style/css/mirri_logo-1.png' %}" alt="MIRRI"
class="raven-site-logo-desktop raven-site-logo-tablet raven-site-logo-mobile"
data-no-lazy="1"> </a></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-695412ea elementor-widget elementor-widget-text-editor"
data-id="695412ea" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div class="elementor-text-editor elementor-clearfix"></div>
</div>
</div>
<div class="elementor-element elementor-element-25a6a4d0 elementor-grid-3 elementor-shape-rounded elementor-widget elementor-widget-social-icons"
data-id="25a6a4d0" data-element_type="widget"
data-widget_type="social-icons.default">
<div class="elementor-widget-container">
<div class="elementor-social-icons-wrapper elementor-grid">
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-animation-grow elementor-repeater-item-b4d5ec5"
href="https://twitter.com/MIRRI_live"
target="_blank"> <span
class="elementor-screen-only">Twitter</span> <i
class="fab fa-twitter"></i> </a></div>
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-animation-grow elementor-repeater-item-9f6f9a1"
href="http://www.facebook.com/pages/MIRRI-Microbial-Resource-Research-Infrastructure/616409145042593"
target="_blank"> <span
class="elementor-screen-only">Facebook</span> <i
class="fab fa-facebook"></i> </a></div>
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-animation-grow elementor-repeater-item-e396101"
href="https://www.linkedin.com/company/microbial-resource-research-infrastructure/?viewAsMember=true"
target="_blank"> <span
class="elementor-screen-only">Linkedin</span> <i
class="fab fa-linkedin"></i> </a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-66b4451"
data-id="66b4451" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<section
class="elementor-section elementor-inner-section elementor-element elementor-element-b3afed7 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="b3afed7" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7bda5d8"
data-id="7bda5d8" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-267f0f6 elementor-view-default elementor-widget elementor-widget-icon"
data-id="267f0f6" data-element_type="widget"
data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon"> <i
aria-hidden="true"
class="fas fa-map-pin"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-eebb821"
data-id="eebb821" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-8e7ee7d elementor-widget elementor-widget-text-editor"
data-id="8e7ee7d" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div
class="elementor-text-editor elementor-clearfix">
<h5
class="elementor-icon-box-title">
MIRRI European Headquarters</h5>
<p
class="elementor-icon-box-description">
University of Minho Campus of
Gualtar Pedagogic Complex
3,&nbsp;<span
style="font-size: 1rem;">Floor
0&nbsp;</span></p>
<p
class="elementor-icon-box-description">
<span
style="font-size: 1rem;">4710-057
Braga Portugal</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4a8e712"
data-id="4a8e712" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<section
class="elementor-section elementor-inner-section elementor-element elementor-element-2476247 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="2476247" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-f17a0f3"
data-id="f17a0f3" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-afb3c4f elementor-view-default elementor-widget elementor-widget-icon"
data-id="afb3c4f" data-element_type="widget"
data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon"> <i
aria-hidden="true"
class="far fa-envelope"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-f158555"
data-id="f158555" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-6cb5b86 elementor-widget elementor-widget-text-editor"
data-id="6cb5b86" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div
class="elementor-text-editor elementor-clearfix">
<h5
class="elementor-icon-box-title">
Email</h5>
<p
class="elementor-icon-box-description">
info@mirri.org</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</footer>
<!--Footer Content End-->
</div>
</body>
</html>

View File

@ -0,0 +1,633 @@
{% load static %}
<!DOCTYPE html>
<head>
<title>{% block title %}{% endblock %}</title>
<link media="all" href="{% static 'web_tools/style/css/autoptimize_a5a452a287dfdad5a08bd44d3a6e3d3e.css' %}" rel="stylesheet">
<title>Tools MIRRI</title>
<link href="https://www.mirri.org/wp-content/plugins/elementor/assets/lib/font-awesome/webfonts/fa-solid-900.woff2"
rel="preload" as="font" type="font/woff" >
<link href="https://www.mirri.org/wp-content/plugins/elementor/assets/lib/eicons/fonts/eicons.woff2?5.9.1"
rel="preload" as="font" type="font/woff" >
<link href="https://www.mirri.org/wp-content/plugins/elementor/assets/lib/font-awesome/webfonts/fa-brands-400.woff2"
rel="preload" as="font" type="font/woff" >
<link href="https://fonts.googleapis.com/" rel="preconnect" >
<link href="https://platform.twitter.com/" rel="preconnect">
<link href="https://fonts.gstatic.com/" rel="preconnect" >
<link href="https://cdn.syndication.twimg.com/" rel="preconnect">
<link href="https://ton.twimg.com/" rel="preconnect">
<link rel="stylesheet" id="mec-google-fonts-css" href="{% static 'web_tools/style/css/mec-google-fonts.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="ed6ad5db9-css" href="{% static 'web_tools/style/css/734e5f942.min.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="jupiterx-css" href="{% static 'web_tools/style/css/autoptimize_single_b9367e9f84eff03e58726166b24efc47.css' %}"
type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-9-css"
href="{% static 'web_tools/style/css/autoptimize_single_ea224e3b8c1f3012917acba775bec7fa.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-global-css"
href="{% static 'web_tools/style/css/autoptimize_single_d18cd62a07caca04e97f6984ad6fee0b.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-1094-css"
href="{% static 'web_tools/style/css/autoptimize_single_fdebd036a6c313b7d17a4571c3a641ff.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-2253-css"
href="{% static 'web_tools/style/css/autoptimize_single_79ccae64b30dcad1e8ae5d5d0add8420.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-495-css"
href="{% static 'web_tools/style/css/autoptimize_single_6bf9e265fba73a1fdb8ab28503184d4b.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-13-css"
href="{% static 'web_tools/style/css/autoptimize_single_3fdc936d7e88fb9e46a15ddaefdd061a.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="google-fonts-1-css" href="{% static 'web_tools/style/css/google-fonts-1.css' %}" type="text/css" media="all">
<link rel="stylesheet" id="elementor-post-879-css" href="{% static 'web_tools/style/css/autoptimize_single_0bdcd8bf82c379b3ec901a408c1117eb.css' %}" type="text/css" media="all">
<script src="{% static 'web_tools/style/css/wp-emoji-release.min.js.transferir' %}" type="text/javascript"></script>
<script src="{% static 'web_tools/style/css/jquery.min.js.transferir' %}" type="text/javascript"></script>
<script data-noptimize="1">window.lazySizesConfig = window.lazySizesConfig || {}; window.lazySizesConfig.loadMode = 1;</script>
<script async="" data-noptimize="1" src="{% static 'web_tools/style/css/lazysizes.min.js.transferir' %}"></script>
<script type="text/javascript" id="jquery-ui-datepicker-js-after">jQuery(document).ready(function (jQuery) { jQuery.datepicker.setDefaults({ "closeText": "Close", "currentText": "Today", "monthNames": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "monthNamesShort": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], "nextText": "Next", "prevText": "Previous", "dayNames": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "dayNamesShort": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "dayNamesMin": ["S", "M", "T", "W", "T", "F", "S"], "dateFormat": "d \\dd\\e MM \\dd\\e yy", "firstDay": 1, "isRTL": false }); });</script>
<script type="text/javascript" id="ed6ad5db9-js-extra">var localize = { "ajaxurl": "https:\/\/www.mirri.org\/wp-admin\/admin-ajax.php", "nonce": "077dae69bc", "i18n": { "added": "Added ", "compare": "Compare", "loading": "Loading..." } };</script>
<script type="text/javascript" id="ivory-search-scripts-js-extra">var IvorySearchVars = { "is_analytics_enabled": "1" };</script>
<script type="text/javascript" id="elementor-frontend-js-before">var elementorFrontendConfig = { "environmentMode": { "edit": false, "wpPreview": false }, "i18n": { "shareOnFacebook": "Share on Facebook", "shareOnTwitter": "Share on Twitter", "pinIt": "Pin it", "download": "Download", "downloadImage": "Download image", "fullscreen": "Fullscreen", "zoom": "Zoom", "share": "Share", "playVideo": "Play Video", "previous": "Previous", "next": "Next", "close": "Close" }, "is_rtl": false, "breakpoints": { "xs": 0, "sm": 480, "md": 768, "lg": 1025, "xl": 1440, "xxl": 1600 }, "version": "3.0.14", "is_static": false, "legacyMode": { "elementWrappers": true }, "urls": { "assets": "https:\/\/www.mirri.org\/wp-content\/plugins\/elementor\/assets\/" }, "settings": { "page": [], "editorPreferences": [] }, "kit": { "global_image_lightbox": "yes", "lightbox_enable_counter": "yes", "lightbox_enable_fullscreen": "yes", "lightbox_enable_zoom": "yes", "lightbox_enable_share": "yes", "lightbox_title_src": "title", "lightbox_description_src": "description" }, "post": { "id": 1094, "title": "Expert%20Clusters%20%E2%80%93%20MIRRI", "excerpt": "", "featuredImage": false } };</script>
<script type="text/javascript" id="jet-elements-js-extra">var jetElements = { "ajaxUrl": "https:\/\/www.mirri.org\/wp-admin\/admin-ajax.php", "isMobile": "false", "templateApiUrl": "https:\/\/www.mirri.org\/index.php?rest_route=\/jet-elements-api\/v1\/elementor-template", "wwwMode": "false", "messages": { "invalidMail": "Please specify a valid e-mail" } };</script>
<script type="text/javascript" id="jet-tabs-frontend-js-extra">var JetTabsSettings = { "ajaxurl": "https:\/\/www.mirri.org\/wp-admin\/admin-ajax.php", "isMobile": "false", "templateApiUrl": "https:\/\/www.mirri.org\/index.php?rest_route=\/jet-tabs-api\/v1\/elementor-template", "devMode": "false" };</script>
<script type="text/javascript" id="wp-util-js-extra">var _wpUtilSettings = { "ajax": { "url": "\/wp-admin\/admin-ajax.php" } };</script>
<script type="text/javascript" id="jupiterx-core-raven-frontend-js-extra">var ravenFormsTranslations = { "validation": { "required": "Please fill in this field", "invalidEmail": "The value is not a valid email address", "invalidPhone": "The value should only consist numbers and phone characters (-, +, (), etc)", "invalidNumber": "The value is not a valid number", "invalidMaxValue": "Value must be less than or equal to MAX_VALUE", "invalidMinValue": "Value must be greater than or equal to MIN_VALUE" } };</script>
<script type="text/javascript" id="jet-blog-js-extra">var JetBlogSettings = { "ajaxurl": "https:\/\/www.mirri.org\/wp-admin\/admin-ajax.php" };</script>
<script type="text/javascript" id="jet-engine-frontend-js-extra">var JetEngineSettings = { "ajaxurl": "https:\/\/www.mirri.org\/wp-admin\/admin-ajax.php", "mapPopupTimeout": "400" };</script>
<script type="text/javascript">(function () { document.body.className = document.body.className.replace('no-js', 'js'); }());</script>
<script defer="" src="{% static 'web_tools/style/css/autoptimize_b879e7e20b057357a98e10b516b0270a.js.transferir' %}"></script>
<script defer="" src="{% static 'web_tools/style_custom.css' %}"></script>
</head>
<body
class="page-template page-template-elementor_header_footer page page-id-1094 js jupiterx elementor-default elementor-kit-9 elementor-page elementor-page-1094 jupiterx-header-sticky">
<div class="jupiterx-site">
<header class="jupiterx-header jupiterx-header-custom jupiterx-header-sticky-custom"
data-jupiterx-settings="{&quot;breakpoint&quot;:&quot;767.98&quot;,&quot;template&quot;:&quot;2253&quot;,&quot;stickyTemplate&quot;:&quot;495&quot;,&quot;behavior&quot;:&quot;sticky&quot;,&quot;offset&quot;:&quot;250&quot;}"
role="banner" itemscope="itemscope" itemtype="http://schema.org/WPHeader">
<!--Hover Menu Start-->
<div data-elementor-type="header" data-elementor-id="495" class="elementor elementor-495"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section class="elementor-section elementor-top-section elementor-element elementor-element-7bc7b39 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7bc7b39" data-element_type="section" data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-b48e6a" data-id="b48e6a" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-7130d07 elementor-widget elementor-widget-spacer" data-id="7130d07" data-element_type="widget" data-widget_type="spacer.default">
<div class="elementor-widget-container">
<div class="elementor-spacer">
<div class="elementor-spacer-inner"></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-36cb1d41 elementor-widget elementor-widget-raven-site-logo" data-id="36cb1d41" data-element_type="widget"data-widget_type="raven-site-logo.default">
<div class="elementor-widget-container">
<div class="raven-widget-wrapper">
<div class="raven-site-logo">
<a class="raven-site-logo-link" href="https://www.mirri.org/">
<img src="{% static 'web_tools/style/css/MIRRIOrangeNOERIC.png' %}" alt="MIRRI" class="raven-site-logo-desktop" data-no-lazy="1">
<img src="{% static 'web_tools/style/css/MIRRIOrangeNOERIC.png' %}" alt="MIRRI" class="raven-site-logo-tablet raven-site-logo-mobile" data-no-lazy="1">
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-f0fbe73" data-id="f0fbe73" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-7de38754 elementor-widget elementor-widget-spacer" data-id="7de38754" data-element_type="widget" data-widget_type="spacer.default">
<div class="elementor-widget-container">
<div class="elementor-spacer">
<div class="elementor-spacer-inner"></div>
</div>
</div>
</div>
<section class="elementor-section elementor-inner-section elementor-element elementor-element-5fdebe5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5fdebe5" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6ce30a2" data-id="6ce30a2" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-56947eb1 raven-breakpoint-tablet raven-nav-menu-stretch raven-nav-menu-align-left elementor-widget elementor-widget-raven-nav-menu" data-id="56947eb1" data-element_type="widget" data-settings="{&quot;submenu_space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;full_width&quot;:&quot;stretch&quot;,&quot;mobile_layout&quot;:&quot;dropdown&quot;,&quot;submenu_opening_position&quot;:&quot;bottom&quot;}" data-widget_type="raven-nav-menu.default">
<div class="elementor-widget-container">
<!-- Browser Menu Init-->
<nav
class="raven-nav-menu-main raven-nav-menu-horizontal raven-nav-menu-tablet-horizontal raven-nav-menu-mobile-horizontal raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile">
<ul id="menu-56947eb1" class="raven-nav-menu" data-smartmenus-id="16143429460579077">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">
Home
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu"
id="sm-16143429460579077-1" aria-haspopup="true" aria-controls="sm-16143429460579077-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span></a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460579077-2" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460579077-1" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools" class="raven-submenu-item raven-link-item has-submenu"
id="sm-16143429460579077-3" aria-haspopup="true" aria-controls="sm-16143429460579077-4" aria-expanded="false">
Validators
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460579077-4" role="group"
aria-hidden="true" aria-labelledby="sm-16143429460579077-3" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Strain v20200601
</a>
</li>
</ul >
</li>
</ul>
</nav>
<!-- Browser Menu End-->
<div class="raven-nav-menu-toggle">
<div
class="raven-nav-menu-toggle-button ">
<span class="fa fa-bars"></span>
</div>
</div>
<!-- Tablet Menu Init-->
<nav class="raven-nav-icons-hidden-tablet raven-nav-icons-hidden-mobile raven-nav-menu-mobile raven-nav-menu-dropdown" style="max-height: 912px; width: 1903px; left: 0px; top: -1681.17px;">
<div class="raven-container" style="max-width: 1600px;">
<ul id="menu-mobile-56947eb1" class="raven-nav-menu" data-smartmenus-id="16143429460590867">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-72">
<a href="/" class="raven-menu-item raven-link-item raven-menu-item-active">Home</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-675">
<a href="/tools/" class="raven-menu-item raven-link-item has-submenu"
id="sm-16143429460590867-1" aria-haspopup="true" aria-controls="sm-16143429460590867-2" aria-expanded="false">
Tools
<span class="sub-arrow"></span>
</a>
<ul class="0 sub-menu raven-submenu" id="sm-16143429460590867-2" role="group" aria-hidden="true" aria-labelledby="sm-16143429460590867-1" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3931">
<a href="/tools/validator/" class="raven-submenu-item raven-link-item ">
Excel Validator
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1238">
<a href="https://www.mirri.org/" class="raven-submenu-item raven-link-item has-submenu" id="sm-16143429460590867-3" aria-haspopup="true" aria-controls="sm-16143429460590867-4" aria-expanded="false">
Level 1
<span class="sub-arrow"></span>
</a>
<ul class="1 sub-menu raven-submenu" id="sm-16143429460590867-4" role="group" aria-hidden="true" aria-labelledby="sm-16143429460590867-3" aria-expanded="false">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1267">
<a href="https://www.mirri.org/" class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1266">
<a href="https://www.mirri.org/"class="raven-submenu-item raven-link-item ">
Level 2
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</nav>
<!-- Tablet Menu End-->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="elementor-section elementor-top-section elementor-element elementor-element-49d35a44 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="49d35a44" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2b4466a3" data-id="2b4466a3" data-element_type="column">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<!--Hover Menu End-->
</header>
<!--Main Content Init-->
<main class="jupiterx-main">
<div data-elementor-type="single" data-elementor-id="879" class="elementor elementor-879"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<!--Main Content Bar Section Title Init-->
<section
class="elementor-section elementor-top-section elementor-element elementor-element-7f2cc9e9 elementor-section-full_width elementor-section-height-default elementor-section-height-default"
data-id="7f2cc9e9" data-element_type="section"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7af24d56 elementor-hidden-phone"
data-id="7af24d56" data-element_type="column"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-17c67231"
data-id="17c67231" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-8c30537 elementor-align-center elementor-widget elementor-widget-raven-post-meta"
data-id="8c30537" data-element_type="widget"
data-widget_type="raven-post-meta.default">
<div class="elementor-widget-container">
<ul class="raven-icon-list-items raven-post-meta">
<li
class="raven-icon-list-item elementor-repeater-item-fc48d0b">
<span
class="raven-icon-list-text raven-post-meta-item raven-post-meta-item-type-custom">
{% block navigator %}{% endblock %} </span></li>
</ul>
</div>
</div>
<div class="elementor-element elementor-element-54237fa1 elementor-widget-divider--separator-type-pattern elementor-widget-divider--no-spacing elementor-widget-divider--view-line elementor-widget elementor-widget-divider"
data-id="54237fa1" data-element_type="widget"
data-widget_type="divider.default">
<div class="elementor-widget-container">
<div class="elementor-divider"
style="--divider-pattern-url: url(&quot;data:image/svg+xml,%3Csvg xmlns=&#39;http://www.w3.org/2000/svg&#39; preserveAspectRatio=&#39;xMidYMid meet&#39; overflow=&#39;visible&#39; height=&#39;100%&#39; viewBox=&#39;0 0 126 26&#39; fill=&#39;black&#39; stroke=&#39;none&#39;%3E%3Cpath d=&#39;M3,10.2c2.6,0,2.6,2,2.6,3.2S4.4,16.5,3,16.5s-3-1.4-3-3.2S0.4,10.2,3,10.2z M18.8,10.2c1.7,0,3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2c-1.7,0-3.2-1.4-3.2-3.2S17,10.2,18.8,10.2z M34.6,10.2c1.5,0,2.6,1.4,2.6,3.2s-0.5,3.2-1.9,3.2c-1.5,0-3.4-1.4-3.4-3.2S33.1,10.2,34.6,10.2z M50.5,10.2c1.7,0,3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2c-1.7,0-3.3-0.9-3.3-2.6S48.7,10.2,50.5,10.2z M66.2,10.2c1.5,0,3.4,1.4,3.4,3.2s-1.9,3.2-3.4,3.2c-1.5,0-2.6-0.4-2.6-2.1S64.8,10.2,66.2,10.2z M82.2,10.2c1.7,0.8,2.6,1.4,2.6,3.2s-0.1,3.2-1.6,3.2c-1.5,0-3.7-1.4-3.7-3.2S80.5,9.4,82.2,10.2zM98.6,10.2c1.5,0,2.6,0.4,2.6,2.1s-1.2,4.2-2.6,4.2c-1.5,0-3.7-0.4-3.7-2.1S97.1,10.2,98.6,10.2z M113.4,10.2c1.2,0,2.2,0.9,2.2,3.2s-0.1,3.2-1.3,3.2s-3.1-1.4-3.1-3.2S112.2,10.2,113.4,10.2z&#39;/%3E%3C/svg%3E&quot;);">
<span class="elementor-divider-separator"> </span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-12514f33 elementor-hidden-phone"
data-id="12514f33" data-element_type="column"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-column-wrap">
<div class="elementor-widget-wrap"></div>
</div>
</div>
</div>
</div>
</section>
<!--Main Content Section Title End-->
<!--Main Content Section Data Init-->
<section
class="elementor-section elementor-top-section elementor-element elementor-element-14718c83 elementor-section-full_width elementor-section-height-default elementor-section-height-default"
data-id="14718c83" data-element_type="section">
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3d6ff095"
data-id="3d6ff095" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-23e5c116 elementor-widget elementor-widget-raven-post-content"
data-id="23e5c116" data-element_type="widget"
data-widget_type="raven-post-content.default">
<div class="elementor-widget-container">
<div data-elementor-type="wp-page" data-elementor-id="1094"
class="elementor elementor-1094"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section
class="elementor-section elementor-top-section elementor-element elementor-element-a1fedef elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="a1fedef" data-element_type="section">
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d62edfe"
data-id="d62edfe"
data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div
class="elementor-widget-wrap">
<div class="elementor-element elementor-element-adab34d elementor-widget elementor-widget-spacer"
data-id="adab34d"
data-element_type="widget"
data-widget_type="spacer.default">
<div
class="elementor-widget-container">
<div
class="elementor-spacer">
<div
class="elementor-spacer-inner">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section
class="elementor-section elementor-top-section elementor-element elementor-element-9462c4a elementor-section-boxed elementor-section-height-default elementor-section-height-default">
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<h2
class="elementor-heading-title elementor-size-default">
{% block page_title %} {% endblock page_title %}
</h2>
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<p
class="elementor-text-editor elementor-clearfix">
</p>
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
{% block content %}
{% endblock content %}
</div>
</div>
<div
class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<p
class="elementor-text-editor elementor-clearfix">
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--Main Content Section Data End-->
</div>
</div>
</div>
</main>
<!--Main Content End-->
<!--Footer Content Init-->
<footer class="jupiterx-footer" role="contentinfo" itemscope="itemscope" itemtype="http://schema.org/WPFooter">
<div data-elementor-type="footer" data-elementor-id="13" class="elementor elementor-13"
data-elementor-settings="[]">
<div class="elementor-inner">
<div class="elementor-section-wrap">
<section
class="elementor-section elementor-top-section elementor-element elementor-element-518e4702 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="518e4702" data-element_type="section"
data-settings="{&quot;background_background&quot;:&quot;classic&quot;}">
<div class="elementor-background-overlay"></div>
<div class="elementor-container elementor-column-gap-no">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-40c2714"
data-id="40c2714" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-620e8301 elementor-widget elementor-widget-raven-site-logo"
data-id="620e8301" data-element_type="widget"
data-widget_type="raven-site-logo.default">
<div class="elementor-widget-container">
<div class="raven-widget-wrapper">
<div class="raven-site-logo"> <a
class="raven-site-logo-link"
href="https://www.mirri.org/"> <img
src="{% static 'web_tools/style/css/mirri_logo-1.png' %}" alt="MIRRI"
class="raven-site-logo-desktop raven-site-logo-tablet raven-site-logo-mobile"
data-no-lazy="1"> </a></div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-695412ea elementor-widget elementor-widget-text-editor"
data-id="695412ea" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div class="elementor-text-editor elementor-clearfix"></div>
</div>
</div>
<div class="elementor-element elementor-element-25a6a4d0 elementor-grid-3 elementor-shape-rounded elementor-widget elementor-widget-social-icons"
data-id="25a6a4d0" data-element_type="widget"
data-widget_type="social-icons.default">
<div class="elementor-widget-container">
<div class="elementor-social-icons-wrapper elementor-grid">
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-animation-grow elementor-repeater-item-b4d5ec5"
href="https://twitter.com/MIRRI_live"
target="_blank"> <span
class="elementor-screen-only">Twitter</span> <i
class="fab fa-twitter"></i> </a></div>
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-animation-grow elementor-repeater-item-9f6f9a1"
href="http://www.facebook.com/pages/MIRRI-Microbial-Resource-Research-Infrastructure/616409145042593"
target="_blank"> <span
class="elementor-screen-only">Facebook</span> <i
class="fab fa-facebook"></i> </a></div>
<div class="elementor-grid-item"> <a
class="elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-animation-grow elementor-repeater-item-e396101"
href="https://www.linkedin.com/company/microbial-resource-research-infrastructure/?viewAsMember=true"
target="_blank"> <span
class="elementor-screen-only">Linkedin</span> <i
class="fab fa-linkedin"></i> </a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-66b4451"
data-id="66b4451" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<section
class="elementor-section elementor-inner-section elementor-element elementor-element-b3afed7 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="b3afed7" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7bda5d8"
data-id="7bda5d8" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-267f0f6 elementor-view-default elementor-widget elementor-widget-icon"
data-id="267f0f6" data-element_type="widget"
data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon"> <i
aria-hidden="true"
class="fas fa-map-pin"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-eebb821"
data-id="eebb821" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-8e7ee7d elementor-widget elementor-widget-text-editor"
data-id="8e7ee7d" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div
class="elementor-text-editor elementor-clearfix">
<h5
class="elementor-icon-box-title">
MIRRI European Headquarters</h5>
<p
class="elementor-icon-box-description">
University of Minho Campus of
Gualtar Pedagogic Complex
3,&nbsp;<span
style="font-size: 1rem;">Floor
0&nbsp;</span></p>
<p
class="elementor-icon-box-description">
<span
style="font-size: 1rem;">4710-057
Braga Portugal</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4a8e712"
data-id="4a8e712" data-element_type="column">
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<section
class="elementor-section elementor-inner-section elementor-element elementor-element-2476247 elementor-section-boxed elementor-section-height-default elementor-section-height-default"
data-id="2476247" data-element_type="section">
<div class="elementor-container elementor-column-gap-default">
<div class="elementor-row">
<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-f17a0f3"
data-id="f17a0f3" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-afb3c4f elementor-view-default elementor-widget elementor-widget-icon"
data-id="afb3c4f" data-element_type="widget"
data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon"> <i
aria-hidden="true"
class="far fa-envelope"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-f158555"
data-id="f158555" data-element_type="column">
<div
class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-6cb5b86 elementor-widget elementor-widget-text-editor"
data-id="6cb5b86" data-element_type="widget"
data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<div
class="elementor-text-editor elementor-clearfix">
<h5
class="elementor-icon-box-title">
Email</h5>
<p
class="elementor-icon-box-description">
info@mirri.org</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</footer>
<!--Footer Content End-->
</div>
</body>
</html>

View File

@ -0,0 +1,12 @@
{% extends "base.html" %}
{% load static %}
{% block title %} Mirri tools {% endblock title %}
{% block navigator %} Mirri tools {% endblock navigator %}
{% block page_title %} {% endblock page_title %}
{% block content %}
<h2>Here you can find useful tools to deal with MIRRI data</h2>
<!-- <ul>
<li><a href='/validator'>Validator</a></li>
</ul> -->
{% endblock content %}

View File

@ -0,0 +1,47 @@
{% extends "base.html" %}
{% load static %}
{% block title %} MIRRI tools index{% endblock title %}
{% block navigator %} Tool Index {% endblock navigator %}
{% block page_title %} {% endblock page_title %}
{% block content %}
<div class="elementor-column-wrap elementor-element-populated">
<div class="elementor-widget-wrap">
<div class="elementor-element elementor-element-b5feb0c elementor-widget elementor-widget-jet-portfolio"
data-id="b5feb0c" data-element_type="widget" data-widget_type="jet-portfolio.default">
<div class="elementor-widget-container">
<div class="elementor-jet-portfolio jet-elements">
<div class="jet-portfolio layout-type-grid preset-type-1 layout-desktop-column-3 layout-tablet-column-2 layout-mobile-column-1"
data-settings="{&quot;layoutType&quot;:&quot;grid&quot;,&quot;columns&quot;:&quot;3&quot;,&quot;columnsTablet&quot;:&quot;2&quot;,&quot;columnsMobile&quot;:&quot;1&quot;,&quot;perPage&quot;:6}">
<div class="jet-portfolio__list">
<article class="jet-portfolio__item visible-status item-loaded"
data-slug="{&quot;0&quot;:&quot;all&quot;}">
<div class="jet-portfolio__inner" style="opacity: 1; transform: scale(1);"> <a
class="jet-portfolio__link " href="/tools/validator/">
<div class="jet-portfolio__image"> <noscript><img
class="jet-portfolio__image-instance"
src="{% static 'web_tools/validator.png' %}" width="300"
height="300" alt="R1ZN0XF9"></noscript><img
class="jet-portfolio__image-instance lazyloaded"
src="{% static 'web_tools/validator.png' %}"
data-src="{% static 'web_tools/validator.png' %}" alt="R1ZN0XF9"
width="300" height="300"></div>
</a>
<div class="jet-portfolio__content">
<div class="jet-portfolio__content-inner">
<h4 class="jet-portfolio__title">Validator</h4>
</div>
</div>
</div>
</article>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- <ul>
<li><a href='/validator'>Validator</a></li>
</ul> -->
{% endblock content %}

View File

@ -0,0 +1,86 @@
{% extends "base.html" %}
{% load web_tool_utils %}
{% block title %} MIRRI Validation tool {% endblock title %}
{% block navigator%} MIRRI Validation tool{% endblock navigator%}
{% block page_title %} MIRRI v20200601 specifications validator {% endblock page_title %}
{% block content %}
<div>
{% if not validation_done%}
<div class="info">
<p>Please refer to this instructions to compile your excel file:</p>
<ul>
<li>
<a href="https://synology.mirri.org:5019/d/f/585510897426937562" target="_blank" >HowToCompileTheSheets_v20200601.pdf</a>
</li>
<li>
<a href="https://synology.mirri.org:5019/d/f/585510897965905633" target="_blank">RecommendationsToCollections_v20200601.pdf</a>
</li>
</ul>
<p>You can also contact the MIRRI ICT by email using <a href="mailto:ict-support@mirri.org">ICT Support</a></p>
<br />
</div>
{% endif%}
{% if not validation_done %}
<div>
<form action="" enctype="multipart/form-data" method="post">
{% csrf_token %}
<ul>
<li>{{ form.file.errors }}<label for="name"></label>{{ form.file }}</li>
<li>
{{ form.file.errors }}{{ form.do_upload }}
<label for="name">Check it if you want to upload the file if it complies with the specifications</label>
</li>
</ul>
<input type="submit" value="Validate" />
</form>
</div>
{% endif%}
{% if validation_done %}
{% if valid %}
<h3> Congratulations, Your file <span style='font-weigth: bold'>{{fname}}</span> <span class="strong">complies</span> the mirri specs </h3>
{% if uploaded %}
<p>Your file has been uploaded to MIRRI Storage Correctly. Once an Admin notices it, data will be uploaded into MIRRI-IS</p>
{% endif %}
{% else %}
<p>Dear Curator of Culture Collection {{culture_collection}}:</p>
<p>The ExcelFile <span class="strong">{{fname}}</span> youve provided on {{file_date}} with your collection Strains Data contains errors/inconsistencies/missing data.</p>
<p>Please, see below the list of detected errors/missing data, for you to proceed with the appropriated correction/completion.</p>
<p>If you need help, please refer to the instructions contained in <a href="https://synology.mirri.org:5019/d/f/585510897426937562" target="_blank" >HowToCompileTheSheets_v20200601.pdf</a> and <a href="https://synology.mirri.org:5019/d/f/585510897965905633" target="_blank">RecommendationsToCollections_v20200601.pdf</a>.
<p>You can also contact the MIRRI ICT by email using: <a href="mailto:ict-support@mirri.org">ICT Support</a></p>
<p>You can download the report <a href='{{error_pdf_url}}' target='_blank'>Here</a></p>
<br />
<h4>Check the error and fix them before submitting them again:</h4>
{% for entity, errors in all_errors.items %}
<div style='margin-top:40px;'>
<h3>{{entity}}</h3>
<table class='error_table' style='width:100%;margin-bottom:20px;'>
<tr style='border-bottom: 1px solid black;'>
<th>Identifier</th>
<th>Error Message</th>
<th>Error Code</th>
</tr>
{% for error in errors%}
<tr style='border-bottom: 1px dotted grey;'>
<td style='width:6em'>{% if error.pk is None %} - {% else %} {{error.pk}} {% endif%} </td>
<td>{{error.message|add_span_tag}}</td>
<td style='width:6em'>{{error.code}}</td>
</tr>
{% endfor %}
</table>
</div>
{% endfor %}
{% if total_errors > error_limited_to %}
<h4 style='margin-top: 40px'>You have more than {{error_limited_to}} errors. They have been hidden.</h4>
{% endif %}
<button onclick="javascript:window.history.back();">Try again</button>
{% endif %}
{% endif %}
</div>
{% endblock content %}

View File

@ -0,0 +1,111 @@
{% load web_tool_utils %}
<!DOCTYPE html>
<html>
<head>
<style type='text/css'>
.error_table {
width: 100%;
}
.error_table td, .error_table th {
border: 1px solid #ddd;
padding: 8px;
}
.error_table tr:nth-child{background-color: #f2f2f2;}
.error_table tr:hover {background-color: #ddd;}
.error_table th {
background-color: #ddd;
}
.header_row {
border-bottom: 1px solid black;
}
.id_column {
width: 120px;
}
.error_code_column {
width: 80px;
}
body {
font-size: 1.2em;
}
</style>
</head>
<body>
<div style='width: 100%;padding:10px'>
<p>Dear Curator of Culture Collection {{culture_collection}}:</p>
<p>The ExcelFile <span class="strong">{{fname}}</span> youve provided on {{file_date}} with your collection Strains Data contains errors/ inconsistencies/ missing data.<br>
Please, see below the list of detected errors/missing data, for you to proceed with the appropriated correction/completion.<br>
If you need help, please refer to the instructions contained in <a href="https://synology.mirri.org:5019/d/f/585510897426937562" target="_blank" >HowToCompileTheSheets_v20200601.pdf</a> and <a href="https://synology.mirri.org:5019/d/f/585510897965905633" target="_blank">RecommendationsToCollections_v20200601.pdf</a>.</p>
<p>You can also contact the MIRRI ICT by email using: <a href="mailto:ict-support@mirri.org">ICT Support</a></p>
<h2>Check the error and fix them before submitting them again:</h2>
{% for entity, errors in all_errors.items %}
<h3>{{entity}}</h3>
<table class='error_table'>
<thead>
<tr class='header_row'>
<th class='id_column'>Identifier</th>
<th>Error Message</th>
<th class='error_code_column'>Error Code</th>
</tr>
</thead>
<tbody>
{% for error in errors%}
<tr style='border-bottom: 1px dotted grey;'>
<td class='id_column'>{% if error.pk is None %} - {% else %} {{error.pk}} {% endif%} </td>
<td>{{error.message|add_span_tag}}</td>
<td class='error_code_column'>{{error.code}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endfor %}
</div>
{% comment %}
<h2 style='text-align:center'> MIRRI validator Report for {{ fname }}</h2>
<p>Please refer to this instructions to compile your excel file:</p>
<ul>
<li>
<a href="https://synology.mirri.org:5019/d/f/585510897426937562" target="_blank" >HowToCompileTheSheets_v20200601.pdf</a>
</li>
<li>
<a href="https://synology.mirri.org:5019/d/f/585510897965905633" target="_blank">RecommendationsToCollections_v20200601.pdf</a>
</li>
</ul>
<p>You can also contact the MIRRI ICT by email using <a href="mailto:ict-support@mirri.org">ICT Support</a></p>
<br />
</div>
<h3 style='text-align:center'>The Excel File has errors</h3>
<h4 style='text-align:center'>Check the error and fix them before submitting them again:</h4>
{% for entity, errors in all_errors.items%}
<table id='error_table'>
{{entity}}
<tr style='border-bottom: 1px solid black;'>
<th>Identifier</th>
<th>Error Message</th>
<th>Error Code</th>
</tr>
{% for error in errors%}
<tr>
<td style='width:6em'>{% if error.pk is None %} - {% else %} {{error.pk}} {% endif %} </td>
<td>{{error.message}}</td>
<td style='width:6em'>{{error.code}}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
{% if more_errors != 0%}
<h4>You have more errors that we have hidden</h4>
{% endif %} {% endcomment %}
</body>
</html>

View File

View File

@ -0,0 +1,9 @@
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter()
def add_span_tag(value):
value = value.replace(" '", " <span style='font-weight: bold;'>'")
return mark_safe(value.replace("' ", "'</span> "))

3
web_tools/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

8
web_tools/urls.py Normal file
View File

@ -0,0 +1,8 @@
from django.urls import path
from . import views
urlpatterns = [path("tools/validator/", views.validation_view),
path('tools/', views.tool_list_view),
path("", views.index)]

128
web_tools/views.py Normal file
View File

@ -0,0 +1,128 @@
import string
import random
import os.path
from typing import OrderedDict
import uuid
from datetime import datetime
from django.template.loader import get_template
from django.shortcuts import render
from django.template.context_processors import csrf
from django.conf import settings as global_settings
from xhtml2pdf import pisa
from mirri.validation.excel_validator import validate_mirri_excel
from mirri.validation.error_logging.error import Entity
from web_tools import settings
from web_tools.forms import ValidationUploadForm
from web_tools.send_mail import send_mail
def random_choice():
alphabet = string.ascii_lowercase + string.digits
return ''.join(random.choices(alphabet, k=8))
def render_to_pdf(template_name, context, out_fhand):
template = get_template(template_name)
html = template.render(context)
# print(html)
return pisa.CreatePDF(html.strip(), dest=out_fhand)
def validation_view(request):
context = {}
context.update(csrf(request))
if request.method == "GET":
request_data = request.GET
elif request.method == "POST":
request_data = request.POST
else:
request_data = None
form = None
if request_data:
form = ValidationUploadForm(request_data, request.FILES)
if form.is_valid():
fhand = form.cleaned_data["file"]
fname = fhand.name
do_upload = form.cleaned_data['do_upload']
version = '20200601'
error_log = validate_mirri_excel(fhand, version=version)
all_errors = error_log.get_errors()
total_num_errors = sum(len(errors) for errors in all_errors.values())
errors_filtered_by_size = prepare_dict_to_show(all_errors,
limit=settings.NUM_ERROR_LIMIT)
uploaded = False
valid = not total_num_errors
if valid and do_upload:
out_dir = settings.VALID_EXCEL_UPLOAD_DIR
date_uuid = datetime.now().strftime('%Y%m%d-%H:%M:%S')
path = out_dir / f'{date_uuid}_{fname}'
with path.open('wb') as out_fhand:
fhand.seek(0)
out_fhand.write(fhand.read())
uploaded = True
if settings.NOTIFICATION_RECEIVERS:
send_mail(settings.NOTIFICATION_RECEIVERS, path.name)
context['uploaded'] = uploaded
context['fname'] = fname
context["valid"] = valid
context["all_errors"] = errors_filtered_by_size
context['total_errors'] = total_num_errors
context['error_limited_to'] = settings.NUM_ERROR_LIMIT
if not valid:
_uuid = str(uuid.uuid4())
error_fname = f'out_pdf/{_uuid}mirri_validator_output.pdf'
error_pdf_fpath = os.path.join(global_settings.MEDIA_ROOT,
error_fname)
error_pdf_url = global_settings.MEDIA_URL + error_fname
with open(error_pdf_fpath, 'wb') as out_fhand:
result = render_to_pdf("validation_pdf_output.html", context,
out_fhand)
if result.err == 0:
pdf_creation_error = True
context['error_pdf_url'] = error_pdf_url
context["validation_done"] = True
else:
form = ValidationUploadForm()
context["validation_done"] = False
context["form"] = form
template = "validation_html_output.html"
content_type = None
return render(request, template, context=context, content_type=content_type)
def prepare_dict_to_show(dictionary, limit):
new_dict = OrderedDict()
remaining = limit
for key, values in dictionary.items():
new_values = values[:remaining] if len(values) >= remaining else values
remaining -= len(new_values)
key = Entity(key).name
new_dict[key] = new_values
if remaining <= 0:
break
return new_dict
def index(request):
return render(request, "index.html")
def tool_list_view(request):
return render(request, "tools_index.html")