feat Limitar la participación a 4 equipos de trabajo

parent 3fdcda9b
Pipeline #363 passed with stage
in 5 seconds
# Generated by Django 2.2.1 on 2019-05-31 12:56
import accounts.models
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [("accounts", "0002_auto_20190314_0819")]
operations = [
migrations.AlterModelManagers(
name="customuser",
managers=[("objects", accounts.models.CustomUserManager())],
)
]
......@@ -6,7 +6,9 @@ from django.utils.translation import gettext_lazy as _
class CustomUserManager(UserManager):
def get_or_none(self, **kwargs):
"""Devuelve el usuario con las propiedades indicadas, o `None` si no se encuentra."""
"""
Devuelve el usuario con las propiedades indicadas, o `None` si no se encuentra.
"""
try:
return self.get(**kwargs)
except CustomUser.DoesNotExist:
......@@ -58,12 +60,25 @@ class CustomUser(AbstractUser):
return self.username
def get_colectivo_principal(self):
"""Devuelve el colectivo del usuario según el orden de prelación PDI>ADS>PAS>EST"""
"""
Devuelve el colectivo del usuario según el orden de prelación PDI>ADS>PAS>EST.
"""
colectivos_del_usuario = json.loads(self.colectivos)
for col in ("PDI", "ADS", "PAS", "EST"):
if col in colectivos_del_usuario:
return col
return None
def get_num_equipos(self):
"""Devuelve el número de equipos de trabajo en los que participa el usuario."""
num_como_participante = self.vinculaciones.filter(
tipo_participacion="participante"
).count()
num_como_coordinador = self.vinculaciones.filter(
tipo_participacion="coordinador", proyecto__estado="SOLICITADO"
).count()
num_equipos = num_como_participante + num_como_coordinador
return num_equipos
# Custom Manager
objects = CustomUserManager()
# Generated by Django 2.2.1 on 2019-06-06 12:12
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [("indo", "0004_auto_20190605_1105")]
operations = [
migrations.AddField(
model_name="convocatoria",
name="num_max_equipos",
field=models.PositiveSmallIntegerField(default=4),
),
migrations.AlterField(
model_name="participanteproyecto",
name="usuario",
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="vinculaciones",
to=settings.AUTH_USER_MODEL,
),
),
]
......@@ -68,6 +68,7 @@ class Centro(models.Model):
class Convocatoria(models.Model):
id = models.PositiveSmallIntegerField(_("año"), primary_key=True)
num_max_equipos = models.PositiveSmallIntegerField(default=4)
fecha_min_solicitudes = models.DateField()
fecha_max_solicitudes = models.DateField()
fecha_max_aceptos = models.DateField()
......@@ -177,7 +178,9 @@ class ParticipanteProyecto(models.Model):
tipo_participacion = models.ForeignKey(
"TipoParticipacion", on_delete=models.PROTECT
)
usuario = models.ForeignKey("accounts.CustomUser", on_delete=models.PROTECT)
usuario = models.ForeignKey(
"accounts.CustomUser", on_delete=models.PROTECT, related_name="vinculaciones"
)
def get_cargo(self):
if self.tipo_participacion.nombre == "coordinador":
......
......@@ -139,9 +139,24 @@ class ParticipanteAceptarView(LoginRequiredMixin, RedirectView):
return reverse_lazy("proyectos_usuario_list")
def post(self, request, *args, **kwargs):
usuario_actual = self.request.user
num_equipos = usuario_actual.get_num_equipos()
num_max_equipos = Convocatoria.objects.order_by("-id").first().num_max_equipos
if num_equipos >= num_max_equipos:
messages.error(
request,
_(
f"""No puede aceptar esta invitación porque ya forma parte del número
máximo de equipos de trabajo permitido ({num_max_equipos}).
Para poder aceptar esta invitación, antes debería renunciar a participar
en algún otro proyecto."""
),
)
return super().post(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,
......@@ -339,6 +354,20 @@ class ProyectoPresentarView(LoginRequiredMixin, ChecksMixin, RedirectView):
# TODO ¿Chequear el estado actual del proyecto?
num_equipos = self.request.user.get_num_equipos()
num_max_equipos = Convocatoria.objects.order_by("-id").first().num_max_equipos
if num_equipos >= num_max_equipos:
messages.error(
request,
_(
f"""No puede presentar esta solicitud porque ya forma parte
del número máximo de equipos de trabajo permitido ({num_max_equipos}).
Para poder presentar esta solicitud de proyecto, antes debería renunciar
a participar en algún otro proyecto."""
),
)
return super().post(request, *args, **kwargs)
if request.user.get_colectivo_principal() == "ADS" and proyecto.ayuda != 0:
messages.error(
request,
......
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