feat Enviar correo al responsable del centro, en su caso

parent f1aded61
# Proyecto Manhattan
Proyecto Manhattan
==================
> First we take Manhattan, then we take Berlin.
Manhattan es una aplicación web para gestionar los proyectos de Innovación Docente.
Está desarrollada con [Django](https://www.djangoproject.com/) 2, mucho ♥, bastante ☕ y un poco de magia 🧙.
## Requisitos
Requisitos
----------
- Python 3.7 o superior. En Debian se puede instalar con el script `compile_python.sh`. En Ubuntu instalar los paquetes python3.7 libpython3.7-dev.
- [pip](https://pip.pypa.io/en/stable/installing/) (puede venir con la instalación de Python).
......@@ -13,25 +15,30 @@ Está desarrollada con [Django](https://www.djangoproject.com/) 2, mucho ♥, ba
- Paquetes libxmlsec1-dev pkg-config
- Un SGBD aceptado por Django (vg PostgreSQL o MariaDB).
Para MariaDB/MySQL instalar el paquete libmariadbclient-dev o libmysqlclient-dev. La configuración deberá incluir:
```
```ini
innodb_file_per_table
innodb_file_format = Barracuda
innodb_large_prefix
innodb_default_row_format = dynamic
```
## Instalación
Instalación
-----------
```shell
cd manhattan
pipenv --python 3.7 install --dev
```
## Configuración inicial
Configuración inicial
---------------------
1. Configurar la base de datos en la sección `DATABASES` de `manhattan_project/settings.py`.
2. Configurar los datos para el _Single Sign On_ (SAML).
3. Ejecutar
2. Configurar los datos para el correo, y la URL del sitio.
3. Configurar los datos para el _Single Sign On_ (SAML).
4. Ejecutar
```shell
pipenv shell
./manage.py migrate
......@@ -39,7 +46,8 @@ pipenv --python 3.7 install --dev
./manage.py loaddata seed
```
## Servidor web para desarrollo
Servidor web para desarrollo
----------------------------
```shell
pipenv shell
......
......@@ -170,6 +170,7 @@ class ProyectoPresentarView(LoginRequiredMixin, RedirectView):
"""
Presentar una solicitud de proyecto.
El proyecto pasa de estado «Borrador» a estado «Solicitado».
Se envían correos a los agentes involucrados.
"""
# TODO: Comprobar permisos, fecha
......@@ -182,9 +183,20 @@ class ProyectoPresentarView(LoginRequiredMixin, RedirectView):
proyecto = Proyecto.objects.get(pk=proyecto_id)
# TODO ¿Chequear el estado actual del proyecto?
# TODO Enviar mensaje a aprobadores
# Enviar mensaje a los invitados al proyecto
self._enviar_invitaciones(request, proyecto)
if proyecto.programa.nombre_corto in ["PIEC", "PRACUZ"]:
self._enviar_solicitudes_visto_bueno(request, proyecto)
proyecto.estado = "SOLICITADO"
proyecto.save()
# TODO Modificar detail.html para no mostrar botones de edición/presentación
messages.success(request, _("Su solicitud de proyecto ha sido presentada."))
return super().post(request, *args, **kwargs)
def _enviar_invitaciones(self, request, proyecto):
"""Enviar mensaje a los invitados al proyecto"""
for invitado in proyecto.participantes.filter(tipo_participacion="invitado"):
send_templated_mail(
template_name="invitacion",
......@@ -197,15 +209,26 @@ class ProyectoPresentarView(LoginRequiredMixin, RedirectView):
"titulo_proyecto": proyecto.titulo,
"programa_proyecto": f"{proyecto.programa.nombre_corto} ({proyecto.programa.nombre_largo})",
"descripcion_proyecto": proyecto.descripcion,
"site_url": settings.SITE_URL,
},
)
proyecto.estado = "SOLICITADO"
proyecto.save()
# TODO Modificar detail.html para no mostrar botones de edición/presentación
messages.success(request, _("Su solicitud de proyecto ha sido presentada."))
return super().post(request, *args, **kwargs)
def _enviar_solicitudes_visto_bueno(self, request, proyecto):
"""Enviar mensaje al responsable del centro solicitando su visto bueno"""
send_templated_mail(
template_name="solicitud_visto_bueno",
from_email=None, # settings.DEFAULT_FROM_EMAIL
recipient_list=[proyecto.centro.email_decano],
context={
"nombre_coordinador": request.user.get_full_name(),
"nombre_decano": proyecto.centro.nombre_decano,
"tratamiento_decano": proyecto.centro.tratamiento_decano,
"titulo_proyecto": proyecto.titulo,
"programa_proyecto": f"{proyecto.programa.nombre_corto} ({proyecto.programa.nombre_largo})",
"descripcion_proyecto": proyecto.descripcion,
"site_url": settings.SITE_URL,
},
)
class ProyectoUpdateFieldView(LoginRequiredMixin, UpdateView):
......
......@@ -29,6 +29,17 @@ DEBUG = True
ALLOWED_HOSTS = [] # ['*']
DEFAULT_FROM_EMAIL = 'leocricia@manhattan.local'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.manhattan.local'
EMAIL_HOST_USER = 'mls'
EMAIL_HOST_PASSWORD = 'plaff'
EMAIL_PORT = 587
EMAIL_USE_LOCALTIME = True
EMAIL_USE_TLS = True
# Application definition
INSTALLED_APPS = [
......@@ -59,6 +70,8 @@ MIDDLEWARE = [
ROOT_URLCONF = "manhattan_project.urls"
SITE_URL = "http://manhattan.local/"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
......@@ -227,8 +240,8 @@ SUMMERNOTE_CONFIG = {
#'airMode': False,
# Change editor size
"width": '100%',
"height": '480',
"width": "100%",
"height": "480",
# Use proper language setting automatically (default)
"lang": None,
......@@ -246,31 +259,31 @@ SUMMERNOTE_CONFIG = {
"attachment_require_authentication": True,
# Set `upload_to` function for attachments.
#'attachment_upload_to': my_custom_upload_to_func(),
# 'attachment_upload_to': my_custom_upload_to_func(),
# Set custom storage class for attachments.
#'attachment_storage_class': 'my.custom.storage.class.name',
# 'attachment_storage_class': 'my.custom.storage.class.name',
# Set custom model for attachments (default: 'django_summernote.Attachment')
#'attachment_model': 'my.custom.attachment.model', # must inherit 'django_summernote.AbstractAttachment'
# 'attachment_model': 'my.custom.attachment.model', # must inherit 'django_summernote.AbstractAttachment'
# You can disable attachment feature.
#'disable_attachment': False,
# 'disable_attachment': False,
# Set `True` to return attachment paths in absolute URIs.
#'attachment_absolute_uri': False,
# 'attachment_absolute_uri': False,
# You can add custom css/js for SummernoteWidget.
#'css': (),
#'js': (
#),
# 'css': (),
# 'js': (
# ),
# You can also add custom css/js for SummernoteInplaceWidget.
# !!! Be sure to put {{ form.media }} in template before initiate summernote.
#'css_for_inplace': (
#),
#'js_for_inplace': (
#),
# 'css_for_inplace': (
# ),
# 'js_for_inplace': (
# ),
# Codemirror as codeview
# If any codemirror settings are defined, it will include codemirror files automatically.
......@@ -289,12 +302,12 @@ SUMMERNOTE_CONFIG = {
# If you want to initialize summernote at the bottom of page, set this as True
# and call `initSummernote()` on your page.
"lazy": True,
#'lazy': False,
# 'lazy': False,
# To use external plugins,
# Include them within `css` and `js`.
#'js': {
# '/some_static_folder/summernote-ext-print.js',
# '//somewhere_in_internet/summernote-plugin-name.js',
#},
# 'js': {
# '/some_static_folder/summernote-ext-print.js',
# '//somewhere_in_internet/summernote-plugin-name.js',
# },
}
......@@ -5,7 +5,7 @@ Estimada {{nombre_invitado}}:
{% elif sexo_invitado == 'M' %}
Estimado {{nombre_invitado}}:
{% else %}
Invitad@ {{nombre_invitado}}:
Estimad@ {{nombre_invitado}}:
{% endif %}
{{nombre_coordinador}} le ha invitado a participar en el siguiente Proyecto de Innovación Docente:
......@@ -15,7 +15,7 @@ Invitad@ {{nombre_invitado}}:
Descripción: {{descripcion_proyecto}}
Si desea aceptar la invitación, visite la web <http://manhattan.unizar.es>
Si desea aceptar la invitación, visite la web <{{site_url}}>
e inicie sesión con su NIP y contraseña administrativa.
......
{% block subject %}VºBº del proyecto «{{titulo_proyecto}}»{% endblock %}
{% block plain %}
{% if tratamiento_decano in 'Decana,Directora' %}
Estimada {{nombre_decano}}:
{% elif tratamiento_decano in 'Decano,Director' %}
Estimado {{nombre_decano}}:
{% else %}
Estimad@ {{nombre_decano}}:
{% endif %}
{{nombre_coordinador}} ha solicitado el siguiente Proyecto de Innovación Docente:
Título: {{titulo_proyecto}}
Programa: {{programa_proyecto}}
Descripción: {{descripcion_proyecto}}
Los proyectos de este programa deben ser impulsados por el centro.
Por ello, para que solicitud anterior pueda ser evaluada, debe contar con
el visto bueno del responsable del centro.
Para dar su visto bueno a dicha solicitud, visite la web <{{site_url}}>
e inicie sesión con su NIP y contraseña administrativa.
Atentamente,
Vicerrectorado de Política Académica
{% endblock %}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment