feat Administración de convocatorias, criterios y opciones

parent 05f8b2b1
Pipeline #607 failed with stage
in 1 second
...@@ -10,7 +10,8 @@ Requisitos ...@@ -10,7 +10,8 @@ Requisitos
---------- ----------
1. Python 3.7 o superior. En Debian o Ubuntu instalar los paquetes `python3.7-dev` y `python3-distutils`. 1. Python 3.7 o superior. En Debian o Ubuntu instalar los paquetes `python3.7-dev` y `python3-distutils`.
2. [pip](https://pip.pypa.io/en/stable/installing/), instalador de paquetes de Python. (Puede venir con la instalación de Python). 2. [pip](https://pip.pypa.io/en/stable/installing/), instalador de paquetes de Python.
(Puede venir con la instalación de Python).
3. [pipenv](https://github.com/pypa/pipenv) para crear un entorno virtual para Python y facilitar el trabajo. 3. [pipenv](https://github.com/pypa/pipenv) para crear un entorno virtual para Python y facilitar el trabajo.
Se puede instalar con `sudo -H pip3 install pipenv`. Se puede instalar con `sudo -H pip3 install pipenv`.
...@@ -72,6 +73,12 @@ Configuración inicial ...@@ -72,6 +73,12 @@ Configuración inicial
./manage.py loaddata seed ./manage.py loaddata seed
``` ```
6. Abrir la URL con el navegador web, autenticarse como superusuario y,
en la interfaz de administración de Django, añadir usuarios al grupo `Gestores`
(incluyendo al superusuario).
7. Activar a los usuarios gestores el atributo `is_staff` para que puedan acceder
a la interfaz de administración.
Servidor web para desarrollo Servidor web para desarrollo
---------------------------- ----------------------------
...@@ -80,9 +87,7 @@ pipenv shell ...@@ -80,9 +87,7 @@ pipenv shell
./manage.py runserver [<IP>[:<puerto>]] ./manage.py runserver [<IP>[:<puerto>]]
``` ```
Abrir la URL con el navegador web, autenticarse como superusuario y, en la interfaz de administración de Django, añadir al superusuario al grupo `Gestores`. Podemos indicar que el superusuario pertenece al colectivo PAS, para que pueda crear proyectos:
También podemos indicar que el superusuario pertenece al colectivo PAS, para que pueda crear proyectos:
```sql ```sql
UPDATE accounts_customuser UPDATE accounts_customuser
......
from django.contrib import admin from django.contrib import admin
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from .models import Criterio, Opcion from .models import Convocatoria, Criterio, Opcion
# Register your models here. # Register your models here.
admin.site.register(Criterio) admin.site.register(Convocatoria)
admin.site.register(Opcion)
@admin.register(Criterio)
class Criterio(admin.ModelAdmin):
fields = ('convocatoria', 'parte', 'peso', 'descripcion', 'tipo')
list_display = ('parte', 'peso', 'descripcion')
list_display_links = ('descripcion',)
list_filter = ('convocatoria',)
ordering = ('-convocatoria', 'parte', 'peso')
@admin.register(Opcion)
class Opcion(admin.ModelAdmin):
fields = ('criterio', 'puntuacion', 'descripcion')
list_display = ('mini_criterio', 'puntuacion', 'descripcion')
list_display_links = ('descripcion',)
list_filter = ('criterio__convocatoria',)
ordering = ('criterio_id', 'puntuacion')
def mini_criterio(self, obj):
return obj.criterio.descripcion[:12]
mini_criterio.short_description = _('Criterio')
admin.site.site_header = _('Administración de Manhattan') admin.site.site_header = _('Administración de Manhattan')
admin.site.site_title = _('Administración de Manhattan') admin.site.site_title = _('Administración de Manhattan')
......
# Generated by Django 3.1.2 on 2020-10-23 08:34
from django.apps import apps as django_apps
from django.contrib.auth.management import create_permissions
from django.db import migrations, models
def migrate_permissions(apps, schema_editor):
"""Create the pending permissions.
Permissions are not actually created during or after an individual migration,
but are triggered by a post-migrate signal which is sent after the
`python manage.py migrate` command completes successfully.
This is necessary so that we can add the permission to a group in this migration.
"""
for app_config in apps.get_app_configs():
app_config.models_module = True
create_permissions(app_config, apps=apps, verbosity=2)
app_config.models_module = None
def add_permission_to_group(apps, schema_editor):
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
gestores = Group.objects.get(name='Gestores')
add_convocatoria = Permission.objects.get(codename='add_convocatoria')
change_convocatoria = Permission.objects.get(codename='change_convocatoria')
gestores.permissions.add(add_convocatoria, change_convocatoria)
add_criterio = Permission.objects.get(codename='add_criterio')
change_criterio = Permission.objects.get(codename='change_criterio')
delete_criterio = Permission.objects.get(codename='delete_criterio')
gestores.permissions.add(add_criterio, change_criterio, delete_criterio)
add_opcion = Permission.objects.get(codename='add_opcion')
change_opcion = Permission.objects.get(codename='change_opcion')
delete_opcion = Permission.objects.get(codename='delete_opcion')
gestores.permissions.add(add_opcion, change_opcion, delete_opcion)
class Migration(migrations.Migration):
dependencies = [('indo', '0011_auto_20201020_1450')]
operations = [
migrations.AlterField(
model_name='convocatoria',
name='num_max_equipos',
field=models.PositiveSmallIntegerField(
default=4,
verbose_name='número máximo de equipos en que puede participar una persona',
),
),
migrations.RunPython(migrate_permissions),
migrations.RunPython(add_permission_to_group),
]
...@@ -49,18 +49,20 @@ class Centro(models.Model): ...@@ -49,18 +49,20 @@ class Centro(models.Model):
class Convocatoria(models.Model): class Convocatoria(models.Model):
id = models.PositiveSmallIntegerField(_('año'), primary_key=True) id = models.PositiveSmallIntegerField(_('año'), primary_key=True)
num_max_equipos = models.PositiveSmallIntegerField(default=4) num_max_equipos = models.PositiveSmallIntegerField(
_('número máximo de equipos en que puede participar una persona'), default=4
)
fecha_min_solicitudes = models.DateField( fecha_min_solicitudes = models.DateField(
'fecha en que se empiezan a aceptar solicitudes', blank=True, null=True _('fecha en que se empiezan a aceptar solicitudes'), blank=True, null=True
) )
fecha_max_solicitudes = models.DateField( fecha_max_solicitudes = models.DateField(
'fecha límite para presentar solicitudes', blank=True, null=True _('fecha límite para presentar solicitudes'), blank=True, null=True
) )
fecha_max_aceptos = models.DateField( fecha_max_aceptos = models.DateField(
'fecha límite para aceptar participar en un proyecto', blank=True, null=True _('fecha límite para aceptar participar en un proyecto'), blank=True, null=True
) )
fecha_max_visto_buenos = models.DateField( fecha_max_visto_buenos = models.DateField(
'fecha límite para que el decano/director dé el visto bueno a un proyecto', _('fecha límite para que el decano/director dé el visto bueno a un proyecto'),
blank=True, blank=True,
null=True, null=True,
) )
...@@ -79,6 +81,9 @@ class Convocatoria(models.Model): ...@@ -79,6 +81,9 @@ class Convocatoria(models.Model):
_('fecha límite para incorporar los gastos'), blank=True, null=True _('fecha límite para incorporar los gastos'), blank=True, null=True
) )
class Meta:
ordering = ('-id',)
def __str__(self): def __str__(self):
return str(self.id) return str(self.id)
...@@ -101,7 +106,7 @@ class Criterio(models.Model): ...@@ -101,7 +106,7 @@ class Criterio(models.Model):
convocatoria = models.ForeignKey('Convocatoria', on_delete=models.PROTECT) convocatoria = models.ForeignKey('Convocatoria', on_delete=models.PROTECT)
parte = models.PositiveSmallIntegerField(_('parte')) parte = models.PositiveSmallIntegerField(_('parte'))
peso = models.PositiveSmallIntegerField(_('peso')) peso = models.PositiveSmallIntegerField(_('peso'))
descripcion = models.CharField(max_length=255) descripcion = models.CharField(_('descripción'), max_length=255)
tipo = models.CharField(_('tipo'), max_length=15, choices=Tipo.choices) tipo = models.CharField(_('tipo'), max_length=15, choices=Tipo.choices)
class Meta: class Meta:
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous" crossorigin="anonymous"
> />
{# SubResource Integrity: openssl dgst -sha384 -binary FICHERO | openssl base64 #} {# SubResource Integrity: openssl dgst -sha384 -binary FICHERO | openssl base64 #}
<link <link
rel="stylesheet" rel="stylesheet"
...@@ -101,6 +101,16 @@ ...@@ -101,6 +101,16 @@
<a class="dropdown-item" href="{% url 'evaluaciones_table' anyo_actual %}"> <a class="dropdown-item" href="{% url 'evaluaciones_table' anyo_actual %}">
<span class="fas fa-gavel"></span>&nbsp; {% trans "Evaluaciones de los proyectos" %} <span class="fas fa-gavel"></span>&nbsp; {% trans "Evaluaciones de los proyectos" %}
</a> </a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'admin:indo_convocatoria_changelist' %}">
<span class="far fa-calendar-alt"></span>&nbsp; {% trans "Administrar convocatorias" %}
</a>
<a class="dropdown-item" href="{% url 'admin:indo_criterio_changelist' %}">
<span class="fas fa-check-double"></span>&nbsp; {% trans "Administrar criterios de evaluación" %}
</a>
<a class="dropdown-item" href="{% url 'admin:indo_opcion_changelist' %}">
<span class="fas fa-list-ol"></span>&nbsp; {% trans "Administrar opciones de los criterios" %}
</a>
</div> </div>
</li> </li>
{% endif %} {% endif %}
......
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