feat Administración de convocatorias, criterios y opciones

parent 05f8b2b1
Pipeline #607 failed with stage
in 1 second
......@@ -10,7 +10,8 @@ Requisitos
----------
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.
Se puede instalar con `sudo -H pip3 install pipenv`.
......@@ -72,6 +73,12 @@ Configuración inicial
./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
----------------------------
......@@ -80,9 +87,7 @@ pipenv shell
./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`.
También podemos indicar que el superusuario pertenece al colectivo PAS, para que pueda crear proyectos:
Podemos indicar que el superusuario pertenece al colectivo PAS, para que pueda crear proyectos:
```sql
UPDATE accounts_customuser
......
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Criterio, Opcion
from .models import Convocatoria, Criterio, Opcion
# Register your models here.
admin.site.register(Criterio)
admin.site.register(Opcion)
admin.site.register(Convocatoria)
@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_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):
class Convocatoria(models.Model):
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 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 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 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 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,
null=True,
)
......@@ -79,6 +81,9 @@ class Convocatoria(models.Model):
_('fecha límite para incorporar los gastos'), blank=True, null=True
)
class Meta:
ordering = ('-id',)
def __str__(self):
return str(self.id)
......@@ -101,7 +106,7 @@ class Criterio(models.Model):
convocatoria = models.ForeignKey('Convocatoria', on_delete=models.PROTECT)
parte = models.PositiveSmallIntegerField(_('parte'))
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)
class Meta:
......
......@@ -11,7 +11,7 @@
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous"
>
/>
{# SubResource Integrity: openssl dgst -sha384 -binary FICHERO | openssl base64 #}
<link
rel="stylesheet"
......@@ -101,6 +101,16 @@
<a class="dropdown-item" href="{% url 'evaluaciones_table' anyo_actual %}">
<span class="fas fa-gavel"></span>&nbsp; {% trans "Evaluaciones de los proyectos" %}
</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>
</li>
{% 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