feat Aceptar/Rehusar invitaciones a participar en proyectos

parent fdbf63a6
......@@ -168,6 +168,11 @@
"pk": "invitado",
"fields": {}
},
{
"model": "indo.tipoparticipacion",
"pk": "invitacion_rehusada",
"fields": {}
},
{
"model": "indo.tipoparticipacion",
"pk": "participante",
......
......@@ -7,6 +7,8 @@ from .views import (
AyudaView,
HomePageView,
InvitacionView,
ParticipanteAceptarView,
ParticipanteDeclinarView,
ParticipanteDeleteView,
ProyectoCreateView,
ProyectoDetailView,
......@@ -19,6 +21,16 @@ urlpatterns = [
path("", HomePageView.as_view(), name="home"),
path("summernote/", include("django_summernote.urls")),
path("ayuda/", AyudaView.as_view(), name="ayuda"),
path(
"participante-proyecto/aceptar_invitacion/<int:proyecto_id>",
ParticipanteAceptarView.as_view(),
name="participante_aceptar",
),
path(
"participante-proyecto/declinar_invitacion",
ParticipanteDeclinarView.as_view(),
name="participante_declinar",
),
path(
"participante-proyecto/invitar/<int:proyecto_id>",
InvitacionView.as_view(),
......
......@@ -5,7 +5,7 @@ from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.forms.models import modelform_factory
from django.http import Http404
from django.shortcuts import redirect
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, RedirectView, TemplateView
......@@ -125,6 +125,58 @@ class InvitacionView(LoginRequiredMixin, ChecksMixin, CreateView):
return self.es_coordinador(self.kwargs["proyecto_id"])
class ParticipanteAceptarView(LoginRequiredMixin, RedirectView):
"""Aceptar la invitación a participar en un proyecto."""
def get_redirect_url(self, *args, **kwargs):
return reverse_lazy("proyectos_usuario_list")
def post(self, request, *args, **kwargs):
proyecto_id = kwargs.get("proyecto_id")
proyecto = get_object_or_404(Proyecto, pk=proyecto_id)
usuario_actual = self.request.user
pp = get_object_or_404(
ParticipanteProyecto,
proyecto_id=proyecto_id,
usuario=usuario_actual,
tipo_participacion="invitado",
)
pp.tipo_participacion_id = "participante"
pp.save()
messages.success(
request,
_(f"Ha pasado a ser participante del proyecto «{proyecto.titulo}»."),
)
return super().post(request, *args, **kwargs)
class ParticipanteDeclinarView(LoginRequiredMixin, RedirectView):
"""Declinar la invitación a participar en un proyecto."""
def get_redirect_url(self, *args, **kwargs):
return reverse_lazy("proyectos_usuario_list")
def post(self, request, *args, **kwargs):
proyecto_id = request.POST.get("proyecto_id")
proyecto = get_object_or_404(Proyecto, pk=proyecto_id)
usuario_actual = self.request.user
pp = get_object_or_404(
ParticipanteProyecto,
proyecto_id=proyecto_id,
usuario=usuario_actual,
tipo_participacion="invitado",
)
pp.tipo_participacion_id = "invitacion_rehusada"
pp.save()
messages.success(
request,
_(f"Ha rehusado ser participante del proyecto «{proyecto.titulo}»."),
)
return super().post(request, *args, **kwargs)
class ParticipanteDeleteView(LoginRequiredMixin, ChecksMixin, DeleteView):
"""Borra un registro de ParticipanteProyecto"""
......@@ -218,8 +270,10 @@ class ProyectoDetailView(LoginRequiredMixin, ChecksMixin, DetailView):
context["participantes"] = participantes
invitados = (
self.object.participantes.filter(tipo_participacion="invitado")
.order_by("usuario__first_name", "usuario__last_name")
self.object.participantes.filter(
tipo_participacion__in=["invitado", "invitacion_rehusada"]
)
.order_by("tipo_participacion", "usuario__first_name", "usuario__last_name")
.all()
)
context["invitados"] = invitados
......
......@@ -180,5 +180,6 @@
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"
></script>
{% block extrajs %}{% endblock extrajs %}
</body>
</html>
......@@ -16,10 +16,14 @@
<form action="" method="post">
{% csrf_token %}
{% if object.tipo_participacion.nombre == "invitado" %}
<p>{% blocktrans with nombre=object.usuario.get_full_name titulo=object.proyecto.titulo%}¿Seguro que desea retirarle a {{ nombre }} la invitación al proyecto «{{ titulo }}»?{% endblocktrans %}</p>
{% if object.tipo_participacion.nombre in "invitado,invitacion_rehusada" %}
<p>{% blocktrans with nombre=object.usuario.get_full_name titulo=object.proyecto.titulo%}
¿Seguro que desea eliminar la invitación a {{ nombre }} al proyecto «{{ titulo }}»?
{% endblocktrans %}</p>
{% else %}
<p>{% blocktrans with nombre=object.usuario.get_full_name titulo=object.proyecto.titulo%}¿Seguro que desea retirarle a {{ nombre }} la participación en el proyecto «{{ titulo }}»?{% endblocktrans %}</p>
<p>{% blocktrans with nombre=object.usuario.get_full_name titulo=object.proyecto.titulo%}
¿Seguro que desea retirarle a {{ nombre }} la participación en el proyecto «{{ titulo }}»?{% endblocktrans %}
</p>
{% endif %}
<div class="btn-group" role="group" aria-label="Botones">
<a href="{% url 'proyecto_detail' object.proyecto.id %}" class="btn btn-info">
......
......@@ -45,13 +45,14 @@
</table>
</div><br />
<h3>{% trans 'Invitados' %}</h3>
<h3>{% trans 'Invitaciones' %}</h3>
{% if invitados %}
<div class="table-responsive">
<table class="table table-hover table-striped table-sm">
{% for invitado in invitados %}
<tr>
<td>{{ invitado.usuario.get_full_name }}</td>
<td>{% if invitado.tipo_participacion_id == "invitado" %}{% trans "Pendiente" %}{% else %}{% trans "Declinada" %}{% endif %}</td>
<td><a href={% url 'participante_delete' invitado.id %} aria-label="{% trans "Eliminar" %}"><i aria-hidden="true" class="fas fa-trash-alt" title="{% trans "Eliminar" %}"></i></a></td>
</tr>
{% endfor %}
......@@ -141,6 +142,8 @@
<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>
<p>{% blocktrans %}Al presentar la solicitud, usted se compromete, en caso de concesión,
a cumplir con las obligaciones establecidas en las bases de la convocatoria."{% endblocktrans %}</p>
</div>
<div class="modal-footer">
<form action="{% url 'proyecto_presentar' pk=proyecto.id %}" id="presentar-form" method="post">
......
......@@ -67,7 +67,7 @@
<br /><br />
<h1>{% trans "Proyectos invitado" %}</h1>
<h1>{% trans "Invitaciones a proyectos" %}</h1>
<hr />
<br />
......@@ -80,6 +80,7 @@
<th>{% trans 'Título' %}</th>
<th>{% trans 'Coordinador' %}</th>
<th>{% trans 'Estado' %}</th>
<th>{% trans 'Acción '%}
</tr>
{% for proyecto in proyectos_invitado %}
<tr>
......@@ -88,6 +89,17 @@
<td><a href="{% url 'proyecto_detail' proyecto.id %}">{{ proyecto.titulo }}</a></td>
<td>{{proyecto.get_usuario_coordinador.get_full_name}}</td>
<td>{{proyecto.get_estado_display}}</td>
<td>
<form action="{% url 'participante_aceptar' proyecto_id=proyecto.id %}" id="aceptar-form" method="post">
{% csrf_token %}
<div class="btn-group" role="group" aria-label="Botones">
<button class="btn btn-secondary btn-sm prepararDeclinar" data-id={{proyecto.id}} data-titulo="{{proyecto.titulo}}" data-toggle="modal" data-target="#declinarModal" type="button">
<i class="fas fa-times"></i> {% trans 'Declinar' %}
</button>
<button type="submit" class="btn btn-primary btn-sm"><i class="fas fa-check"></i> {% trans "Aceptar" %}</button>
</div>
</form>
</td>
</tr>
{% endfor %}
</table>
......@@ -96,4 +108,40 @@
<p>{% trans 'No está invitado a ningún proyecto.' %}</p>
{% endif %}
</div>
<div class="modal fade" id="declinarModal" tabindex="-1" role="dialog" aria-labelledby="declinarModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="declinarModalLabel">{% trans "¿Seguro que desea rehusar la invitación?" %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Cerrar">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="advertencia"></div>
<p>{% trans "Esta acción es irreversible." %}</p>
<p>{% trans "Una vez haya declinado la invitación, ya no podrá echarse atrás y aceptarla." %}</p>
</div>
<div class="modal-footer">
<form action='{% url 'participante_declinar' %}' id='declinar-form' method='post'>
{% csrf_token %}
<div class="campo-oculto"></div>
<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-user-times'></i> {% trans 'Declinar' %}</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extrajs %}
<script type="text/javascript">
// $(document).on('click', '.prepararDeclinar', function() {
$('.prepararDeclinar').click(function (e) {
$('#declinarModal .advertencia').html("<p>¿Seguro que no desea participar en el proyecto «" + $(this).data('titulo') + "»?</p>");
$('#declinarModal .campo-oculto').html("<input type='hidden' id='proyecto_id' name='proyecto_id' value='" + $(this).data('id') + "'>");
});
</script>
{% endblock extrajs %}
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