feat Anular una solicitud de proyecto

parent c072206a
......@@ -230,6 +230,7 @@ class Proyecto(models.Model):
)
estado = models.CharField(
choices=(
("ANULADO", "Solicitud anulada"),
("BORRADOR", "Solicitud en preparación"),
("SOLICITADO", "Solicitud presentada"),
),
......
......@@ -10,6 +10,7 @@ from .views import (
ParticipanteDeclinarView,
ParticipanteDeleteView,
ParticipanteRenunciarView,
ProyectoAnularView,
ProyectoCreateView,
ProyectoDetailView,
ProyectoPresentarView,
......@@ -54,6 +55,11 @@ urlpatterns = [
ProyectoUpdateFieldView.as_view(),
name="proyecto_update_field",
),
path(
"proyecto/<int:pk>/anular/",
ProyectoAnularView.as_view(),
name="proyecto_anular",
),
path(
"proyecto/<int:pk>/presentar",
ProyectoPresentarView.as_view(),
......
......@@ -307,6 +307,28 @@ class ProyectoCreateView(LoginRequiredMixin, ChecksMixin, CreateView):
return self.es_pas_o_pdi()
class ProyectoAnularView(LoginRequiredMixin, ChecksMixin, RedirectView):
"""
Cambia el estado de una solicitud de proyecto a Anulada.
"""
model = Proyecto
def get_redirect_url(self, *args, **kwargs):
return reverse_lazy("mis_proyectos", kwargs={"anyo": date.today().year})
def post(self, request, *args, **kwargs):
proyecto = Proyecto.objects.get(pk=kwargs.get("pk"))
proyecto.estado = "ANULADO"
proyecto.save()
messages.success(request, _("Su solicitud de proyecto ha sido anulada."))
return super().post(request, *args, **kwargs)
def test_func(self):
return self.es_coordinador(self.kwargs["pk"])
class ProyectoDetailView(LoginRequiredMixin, ChecksMixin, DetailView):
"""Muestra una solicitud de proyecto."""
......@@ -555,6 +577,7 @@ class ProyectosUsuarioView(LoginRequiredMixin, TemplateView):
"coordinador_principal",
],
)
.exclude(estado="ANULADO")
.order_by("programa__nombre_corto", "linea__nombre", "titulo")
.all()
)
......
......@@ -191,6 +191,7 @@
</p>
{% endif %}
<!-- Botones -->
<br style="clear: both;" />
<div class="btn-group" role="group" aria-label="Botones">
<a href="{% url 'mis_proyectos' proyecto.convocatoria_id %}" class="btn btn-info">
......@@ -198,6 +199,9 @@
</a>
{% if permitir_edicion %}
<button class="btn btn-danger" data-toggle="modal" data-target="#anularModal" type="button">
<span class="fas fa-trash-alt"></span> {% trans 'Anular' %}
</button>
<button class="btn btn-warning" data-toggle="modal" data-target="#presentarModal" type="button">
<span class="fas fa-check"></span> {% trans 'Presentar' %}
</button>
......@@ -205,6 +209,44 @@
</div>
</div>
<div
class="modal fade"
id="anularModal"
tabindex="-1"
role="dialog"
aria-labelledby="anularModalLabel"
aria-hidden="true"
>
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="anularModalLabel">{% trans "¿Seguro que desea anular 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>
{% blocktrans %}Si anula esta solicitud de proyecto, perderá todos los
datos introducidos en ella.{% endblocktrans %}
</p>
<p>{% trans "Esta acción es <strong>irreversible</strong>." %}</p>
</div>
<div class="modal-footer">
<form action="{% url 'proyecto_anular' pk=proyecto.id %}" id="eliminar-form" method="post">
{% csrf_token %}
<button type="button" class="btn btn-info" data-dismiss="modal">
<span class="fas fa-times"></span> {% trans "Cancelar" %}
</button>
<button type="submit" class="btn btn-danger">
<span class="fas fa-trash-alt"></span> {% trans "Anular" %}
</button>
</form>
</div>
</div>
</div>
</div>
<div
class="modal fade"
id="presentarModal"
......
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