feat Presentar solicitud

parent 56e89916
......@@ -217,6 +217,7 @@ class Proyecto(models.Model):
("BORRADOR", "Solicitud en preparación"),
("SOLICITADO", "Solicitud presentada"),
),
default="BORRADOR",
max_length=63,
)
contexto = models.TextField(
......
import urllib.parse
from django import template
from django.urls import reverse
from django.utils.safestring import mark_safe
register = template.Library()
# DEFAULT_TAGS defined in django.contrib.messages.constants
MESSAGE_ICONS = {
"debug": '<i class="fas fa-bug"></i>',
"info": '<i class="fas fa-info-circle"></i>',
"success": '<i class="fas fa-check-circle"></i>',
"warning": '<i class="fas fa-exclamation-triangle"></i>',
"error": '<i class="fas fa-bomb"></i>',
}
MESSAGE_STYLES = {
"debug": "alert-info",
"info": "alert-info",
"success": "alert-success",
"warning": "alert-warning",
"error": "alert-danger",
}
@register.simple_tag
def alert_icon(tag):
return mark_safe(MESSAGE_ICONS[tag])
@register.simple_tag
def alert_style(tag):
return MESSAGE_STYLES[tag]
@register.simple_tag
def lord_url():
......
......@@ -10,6 +10,7 @@ from .views import (
ParticipanteDeleteView,
ProyectoCreateView,
ProyectoDetailView,
ProyectoPresentarView,
ProyectoUpdateFieldView,
ProyectosUsuarioListView,
)
......@@ -35,6 +36,11 @@ urlpatterns = [
ProyectoUpdateFieldView.as_view(),
name="proyecto_update_field",
),
path(
"proyecto/<int:pk>/presentar",
ProyectoPresentarView.as_view(),
name="proyecto_presentar",
),
path(
"proyecto/", ProyectosUsuarioListView.as_view(), name="proyectos_usuario_list"
),
......
import json
from datetime import date
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.forms.models import modelform_factory
from django.http import HttpResponseRedirect
from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse, reverse_lazy
......@@ -10,9 +12,9 @@ from django.views.generic import (
DetailView,
FormView,
ListView,
RedirectView,
TemplateView,
View,
FormView,
)
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django_summernote.widgets import SummernoteWidget
......@@ -161,6 +163,30 @@ class ProyectoDetailView(DetailView):
return context
class ProyectoPresentarView(LoginRequiredMixin, RedirectView):
"""
Presentar una solicitud de proyecto.
El proyecto pasa de estado «Borrador» a estado «Solicitado».
"""
# TODO: Comprobar permisos, fecha
def get_redirect_url(self, *args, **kwargs):
return reverse_lazy("proyecto_detail", args=[kwargs.get("pk")])
def post(self, request, *args, **kwargs):
proyecto_id = kwargs.get("pk")
proyecto = Proyecto.objects.get(pk=proyecto_id)
# TODO ¿Chequear el estado actual del proyecto?
proyecto.estado = "SOLICITADO"
proyecto.save()
# TODO Enviar correos a invitados y aprobadores
# 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)
class ProyectoUpdateFieldView(LoginRequiredMixin, UpdateView):
# TODO: Comprobar permisos - coordinadores
# Modificar estado, sólo para gestores
......
......@@ -107,6 +107,7 @@
</div>
</nav>
<div class="container">
{% include 'partials/messages.html' %}
{% block content %} {% endblock content %}
</div>
......
{% load custom_tags %}
{% if messages %}
{% for message in messages %}
<div class="alert {% alert_style message.tags %} alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Cerrar">
<span aria-hidden="true">&times;</span>
</button>
{% alert_icon message.tags %}
{{ message }}
</div>
{% endfor %}
{% endif %}
\ No newline at end of file
......@@ -102,7 +102,35 @@
<a href="{% url 'proyectos_usuario_list' %}" class="btn btn-info">
<i class="fas fa-step-backward"></i> {% trans 'Retroceder' %}
</a>
<button class="btn btn-warning" type="submit"><i class="fas fa-check"></i> {% trans 'Presentar' %}</button>
<button class="btn btn-warning" data-toggle="modal" data-target="#presentarModal" type="button">
<i class="fas fa-check"></i> {% trans 'Presentar' %}
</button>
</div>
</div>
{% endblock content %}
<div class="modal fade" id="presentarModal" tabindex="-1" role="dialog" aria-labelledby="presentarModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="presentarModalLabel">{% trans "¿Seguro que desea presentar la solicitud?" %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>{% trans "Una vez presentada ya no podrá hacer ningún cambio." %}</p>
<p>{% trans "Se enviarán mensajes informativos a las personas invitadas y, en su caso, a quien deba dar su visto bueno." %}</p>
</div>
<div class="modal-footer">
<form action="{% url 'proyecto_presentar' pk=proyecto.id %}" id="presentar-form" method="post">
{% csrf_token %}
<button type="button" class="btn btn-info" data-dismiss="modal"><i class="fas fa-times"></i> {% trans "Cancelar" %}</button>
<button type="submit" class="btn btn-warning"><i class="fas fa-check"></i> {% trans "Presentar" %}</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}
\ 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