diff --git a/README.md b/README.md index 08011d76a5878d086d8c4a08b082c25b52bcfa5b..5925f41b19e03a3f839af94c5c6d2ebebfc9e870 100644 --- a/README.md +++ b/README.md @@ -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 [[:]] ``` -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 diff --git a/indo/admin.py b/indo/admin.py index 660a866ddc10ca0899a0eafa1dcd540838916887..f34cd6c8c325cb9f83803077bd6ce216420d3e83 100644 --- a/indo/admin.py +++ b/indo/admin.py @@ -1,11 +1,34 @@ 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') diff --git a/indo/migrations/0012_auto_20201023_1034.py b/indo/migrations/0012_auto_20201023_1034.py new file mode 100644 index 0000000000000000000000000000000000000000..bd4aa90b7ff6fd71191c857c31f145920c69eefb --- /dev/null +++ b/indo/migrations/0012_auto_20201023_1034.py @@ -0,0 +1,59 @@ +# 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), + ] diff --git a/indo/models.py b/indo/models.py index 63a48a62314390ce159cfc6f96971c004d451053..0f47aeb150d06ebe3b4410cd85509b2821e06385 100644 --- a/indo/models.py +++ b/indo/models.py @@ -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: diff --git a/templates/base.html b/templates/base.html index 8d044367d4d76dcdca0eb410a3132676f174ca2a..6573dccdbb1cc476adfd9d50087c223ea61ea5a5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -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 #}   {% trans "Evaluaciones de los proyectos" %} + + +   {% trans "Administrar convocatorias" %} + + +   {% trans "Administrar criterios de evaluación" %} + + +   {% trans "Administrar opciones de los criterios" %} + {% endif %}