feat Invitar a participantes

parent 2b9cf13e
from datetime import date
from django import forms
from django.utils.translation import gettext_lazy as _
from .models import Linea, Programa, Proyecto
from .models import Linea, Programa, ParticipanteProyecto, Proyecto, TipoParticipacion
from accounts.models import CustomUser as CustomUser
class InvitacionForm(forms.ModelForm):
usuario_id = forms.IntegerField(help_text="NIP de la persona a invitar")
def __init__(self, *args, **kwargs):
# To get request.user. Do not use kwargs.pop('user', None) due to potential security hole.
current_user = kwargs.pop("current_user")
proyecto_id = kwargs.pop("proyecto_id")
super().__init__(*args, **kwargs)
proyecto = Proyecto.objects.get(id=proyecto_id)
self.fields["proyecto"].initial = proyecto
tipo_participacion = TipoParticipacion.objects.get(nombre="invitado")
self.fields["tipo_participacion"].initial = tipo_participacion
# Se pone porque es un campo requerido, pero se sobrescribirá en clean().
self.fields["usuario"].initial = current_user
def clean(self):
cleaned_data = super().clean()
usuario_id = cleaned_data.get("usuario_id")
cleaned_data["usuario"] = CustomUser.objects.get(username=usuario_id)
# TODO Si el usuario no existe, crearlo
class Meta:
fields = ["proyecto", "tipo_participacion", "usuario", "usuario_id"]
model = ParticipanteProyecto
widgets = {
"proyecto": forms.HiddenInput,
"tipo_participacion": forms.HiddenInput,
"usuario": forms.HiddenInput,
}
class ProyectoForm(forms.ModelForm):
......
......@@ -6,6 +6,7 @@ from django.urls import include, path
from .views import (
AyudaView,
HomePageView,
InvitacionView,
ProyectoCreateView,
ProyectoDetailView,
ProyectoUpdateFieldView,
......@@ -16,6 +17,11 @@ urlpatterns = [
path("", HomePageView.as_view(), name="home"),
path("summernote/", include("django_summernote.urls")),
path("ayuda/", AyudaView.as_view(), name="ayuda"),
path(
"participante-proyecto/invitar/<int:proyecto_id>",
InvitacionView.as_view(),
name="participante_invitar",
),
path("proyecto/new/", ProyectoCreateView.as_view(), name="proyecto_new"),
path("proyecto/<int:pk>/", ProyectoDetailView.as_view(), name="proyecto_detail"),
path(
......
......@@ -17,7 +17,7 @@ from django.views.generic import (
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django_summernote.widgets import SummernoteWidget
from .forms import ProyectoForm
from .forms import InvitacionForm, ProyectoForm
from .models import (
Convocatoria,
Evento,
......@@ -36,6 +36,42 @@ class HomePageView(TemplateView):
template_name = "home.html"
class InvitacionView(LoginRequiredMixin, CreateView):
"""Formulario para invitar a una persona a un proyecto determinado."""
# TODO: Comprobar permisos, estado del proyecto, fecha.
form_class = InvitacionForm
model = ParticipanteProyecto
template_name = "participante-proyecto/invitar.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
proyecto_id = self.kwargs["proyecto_id"]
context["proyecto"] = Proyecto.objects.get(id=proyecto_id)
# context["form"] = self.get_form()
# This sets the initial value for the field:
# context["form"].fields["proyecto_id"].initial = self.kwargs["proyecto_id"]
return context
def get_form_kwargs(self, **kwargs):
kwargs = super().get_form_kwargs()
# Update the kwargs for the form init method with ours
kwargs.update(self.kwargs) # self.kwargs contains all url conf params
# We also send a user object to the form
kwargs.update({'current_user': self.request.user})
return kwargs
def get_success_url(self, **kwargs):
return reverse_lazy('proyecto_detail', kwargs = {'pk': self.kwargs["proyecto_id"]})
def save():
invitado = super.save(commit=False)
invitado.tipo_participacion = TipoParticipacion("invitado")
invitado.save()
class ProyectoCreateView(LoginRequiredMixin, CreateView):
"""Crea una nueva solicitud de proyecto"""
......@@ -105,6 +141,20 @@ class ProyectoDetailView(DetailView):
coordinador = self.object.get_participante_or_none("coordinador")
context["coordinador"] = coordinador
participantes = (
self.object.participantes.filter(tipo_participacion="participante")
.order_by("usuario__first_name", "usuario__last_name")
.all()
)
context["participantes"] = participantes
invitados = (
self.object.participantes.filter(tipo_participacion="invitado")
.order_by("usuario__first_name", "usuario__last_name")
.all()
)
context["invitados"] = invitados
context["campos"] = json.loads(self.object.programa.campos)
return context
......
{% extends 'base.html' %}
{% load crispy_forms_tags i18n %}
{% block title %}{% trans "Invitar a un proyecto" %}{% endblock title %}
{% block description %}{% trans "Invitar a un proyecto" %}{% endblock description %}
{% block content %}
<div class="container-blanco">
<div class="alert alert-info">
<i class="fas fa-info-circle"></i>
<div>
{% trans 'Introduzca el NIP de la persona que desee invitar a su proyecto.' %}<br />
</div>
</div>
<h1>Invitar al proyecto {{ proyecto.titulo }}</h1>
<hr />
<br />
<form action="" method="post">
{% csrf_token %}
{{ form|crispy }}
<div class="btn-group" role="group" aria-label="Botones">
<a href="{% url 'proyecto_detail' proyecto.id %}" class="btn btn-info"
><i class="fas fa-step-backward"></i> {% trans 'Retroceder' %}</a
>
<button class="btn btn-warning" type="submit" title="{% trans 'Invitar' %}">
<i class="fas fa-check"></i> {% trans 'Invitar' %}
</button>
</div>
</form>
</div>
{% endblock content %}
\ No newline at end of file
......@@ -6,8 +6,8 @@
<i class="fas fa-info-circle"></i>
<div>
{% trans 'Puede editar su solicitud tantas veces como desee.' %}<br />
{% trans 'Cuando esté satisfecho, pulse el botón «Presentar».' %} {% trans 'Una vez haya presentado la solicitud,
ya no podrá modificarla.' %}
{% trans 'Cuando esté satisfecho, pulse el botón «Presentar».' %}
{% trans 'Una vez haya presentado la solicitud, ya no podrá modificarla.' %}
</div>
</div>
......@@ -25,37 +25,79 @@
{% if proyecto.linea %}
<p><strong>{% trans 'Línea' %}</strong>: {{ proyecto.linea.nombre }}</p>
{% endif %}
{% if proyecto.centro %}
<p><strong>{% trans 'Centro' %}</strong>: {{ proyecto.centro.nombre }}</p>
{% endif %}
{% if proyecto.estudio %}
<p><strong>{% trans 'Estudio' %}</strong>: {{ proyecto.estudio.nombre }}</p>
{% endif %}
{% if coordinador_principal %}
<p><strong>{{ coordinador_principal.get_cargo }}</strong>: {{ coordinador_principal.usuario.get_full_name }}</p>
<p>
<strong>{{ coordinador_principal.get_cargo }}</strong>:
{{ coordinador_principal.usuario.get_full_name }}
</p>
{% endif %}
{% if coordinador %}
<p><strong>{{ coordinador.get_cargo }}</strong>: {{ coordinador.usuario.get_full_name }}</p>
<p>
<strong>{{ coordinador.get_cargo }}</strong>:
{{ coordinador.usuario.get_full_name }}
</p>
{% endif %}
<p><strong>{% trans 'Invitados' %}</strong>:<br /></p>
<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><i class="fas fa-trash-alt"></i></td>
</tr>
<!-- TODO -->
{% endfor %}
</table>
</div>
<p>
<a href="{% url 'participante_invitar' proyecto.id %}" class="btn btn-info btn-sm" type="submit"
><i class="fas fa-plus" aria-hidden="true"></i>&nbsp; {% trans 'Añadir' %}</a>
</p>
<p><strong>{% trans 'Participantes' %}</strong>:<br /></p>
<div class="table-responsive">
<table class="table table-hover table-striped table-sm">
{% for participante in participantes %}
<tr>
<td>{{ participante.usuario.get_full_name }}</td>
<td><i class="fas fa-trash-alt"></i></td>
</tr>
<!-- TODO -->
{% endfor %}
</table>
</div>
<br />
{# TODO: filtro para HTML procedente de procesador de textos #}
<h3>{% trans 'Descripción' %}</h3>
<p>{{ proyecto.descripcion|safe }}</p>
<p>{{ proyecto.descripcion | safe }}</p>
{% for campo in campos %}
<h3>{{ proyecto|get_attr_verbose_name:campo }}</h3>
<p>{{ proyecto|get_obj_attr:campo|default:""|safe }}</p>
<p>{{ proyecto | get_obj_attr:campo | default:"" | safe }}</p>
<p>
<a href="{% url 'proyecto_update_field' proyecto.id campo %}" class="btn btn-info btn-sm">
<i class="fas fa-pencil-alt" aria-hidden="true"></i> &nbsp; {% trans 'Editar' %}
</a>
<a href="{% url 'proyecto_update_field' proyecto.id campo %}" class="btn btn-info btn-sm">
<i class="fas fa-pencil-alt" aria-hidden="true"></i>&nbsp; {% trans 'Editar' %}
</a>
</p>
{% endfor %}
<h3>{{ proyecto|get_attr_verbose_name:"financiacion"}}</h3>
<p>{{ proyecto.financiacion|default:""|safe }}</p>
<h3>{{ proyecto | get_attr_verbose_name:"financiacion" }}</h3>
<p>{{ proyecto.financiacion | default:"" | safe }}</p>
<h3>{{ proyecto|get_attr_verbose_name:"ayuda"}}</h3>
<p>{{ proyecto.ayuda|default:"" }}</p>
<h3>{{ proyecto | get_attr_verbose_name:"ayuda" }}</h3>
<p>{{ proyecto.ayuda | default:"" }}</p>
<br style="clear: both;" />
<div class="btn-group" role="group" aria-label="Botones">
......
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