Modelos para las memorias

parent a96a1d5e
Pipeline #609 failed with stage
in 0 seconds
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Convocatoria, Criterio, Opcion
from .models import Convocatoria, Criterio, MemoriaApartado, MemoriaSubapartado, Opcion
# Register your models here.
admin.site.register(Convocatoria)
......@@ -16,13 +16,29 @@ class Criterio(admin.ModelAdmin):
ordering = ('-convocatoria', 'parte', 'peso')
@admin.register(MemoriaApartado)
class MemoriaApartado(admin.ModelAdmin):
list_display = ('numero', 'descripcion')
list_display_links = ('descripcion',)
list_filter = ('convocatoria',)
ordering = ('-convocatoria', 'numero')
@admin.register(MemoriaSubapartado)
class MemoriaSubapartado(admin.ModelAdmin):
list_display = ('numero_apartado', 'peso', 'descripcion')
list_display_links = ('descripcion',)
list_filter = ('apartado__convocatoria',)
ordering = ('apartado__numero', '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')
ordering = ('criterio__peso', 'puntuacion')
def mini_criterio(self, obj):
return obj.criterio.descripcion[:12]
......
This diff is collapsed.
# Generated by Django 3.1.2 on 2020-10-26 09:53
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [('indo', '0012_auto_20201023_1034')]
operations = [
migrations.CreateModel(
name='MemoriaApartado',
fields=[
(
'id',
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
),
),
('numero', models.PositiveSmallIntegerField(verbose_name='número')),
('descripcion', models.CharField(max_length=255, verbose_name='descripción')),
],
options={
'verbose_name': 'apartado de la memoria',
'verbose_name_plural': 'apartados de la memoria',
'ordering': ('convocatoria__id', 'numero'),
},
),
migrations.AlterModelOptions(name='convocatoria', options={'ordering': ('-id',)}),
migrations.AddField(
model_name='proyecto',
name='aceptacion_corrector',
field=models.BooleanField(null=True, verbose_name='Aceptación por el corrector'),
),
migrations.AddField(
model_name='proyecto',
name='observaciones_corrector',
field=models.TextField(
null=True, verbose_name='Observaciones del corrector de la memoria'
),
),
migrations.AlterField(
model_name='criterio',
name='descripcion',
field=models.CharField(max_length=255, verbose_name='descripción'),
),
migrations.CreateModel(
name='MemoriaSubapartado',
fields=[
(
'id',
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
),
),
('peso', models.PositiveSmallIntegerField(verbose_name='peso')),
('descripcion', models.CharField(max_length=255, verbose_name='descripción')),
('ayuda', models.CharField(max_length=255, verbose_name='texto de ayuda')),
(
'tipo',
models.CharField(
choices=[('texto', 'Texto libre'), ('fichero', 'Fichero')],
max_length=15,
verbose_name='tipo',
),
),
(
'apartado',
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name='subapartados',
to='indo.memoriaapartado',
),
),
],
options={
'verbose_name': 'apartado de la memoria',
'verbose_name_plural': 'apartados de la memoria',
'ordering': ('apartado__id', 'peso'),
},
),
migrations.CreateModel(
name='MemoriaRespuesta',
fields=[
(
'id',
models.AutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
),
),
('texto', models.TextField(blank=True, null=True, verbose_name='texto')),
(
'fichero',
models.FileField(
blank=True,
null=True,
upload_to='anexos_memoria',
verbose_name='fichero PDF',
),
),
(
'proyecto',
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name='respuestas_memoria',
to='indo.proyecto',
),
),
(
'subapartado',
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name='respuestas',
to='indo.memoriasubapartado',
),
),
],
options={
'verbose_name': 'respuesta de la memoria',
'verbose_name_plural': 'respuestas de la memoria',
'ordering': ('-proyecto__id', 'subapartado'),
},
),
migrations.AddField(
model_name='memoriaapartado',
name='convocatoria',
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name='apartados_memoria',
to='indo.convocatoria',
),
),
]
......@@ -85,7 +85,7 @@ class Convocatoria(models.Model):
ordering = ('-id',)
def __str__(self):
return str(self.id)
return str(f'{self.id}-{self.id + 1}')
class Criterio(models.Model):
......@@ -489,6 +489,11 @@ class Proyecto(models.Model):
observaciones = models.TextField(_('Observaciones para comunicar al coordinador'), null=True)
# Aceptación por el coordinador de las condiciones decididas por la Comisión
aceptacion_coordinador = models.BooleanField(_('Aceptación por el coordinador'), null=True)
# Aceptación por el corrector/consultor de las memorias
aceptacion_corrector = models.BooleanField(_('Aceptación por el corrector'), null=True)
observaciones_corrector = models.TextField(
_('Observaciones del corrector de la memoria'), null=True
)
class Meta:
permissions = [
......@@ -549,6 +554,81 @@ class Proyecto(models.Model):
return num_invitados >= 1
class MemoriaApartado(models.Model):
"""Apartados de la memoria"""
convocatoria = models.ForeignKey(
'Convocatoria', on_delete=models.PROTECT, related_name='apartados_memoria'
)
numero = models.PositiveSmallIntegerField(_('número'))
descripcion = models.CharField(_('descripción'), max_length=255)
class Meta:
ordering = ('convocatoria__id', 'numero')
verbose_name = _('apartado de la memoria')
verbose_name_plural = _('apartados de la memoria')
def __str__(self):
return self.descripcion
class MemoriaSubapartado(models.Model):
"""Subapartados de la memoria"""
class Tipo(models.TextChoices):
"""Tipo de subapartado.
Los subapartados pueden ser de dos tipos:
* Texto libre - El coordinador puede introducir un texto con sus comentarios.
* Fichero - El coordinador puede adjuntar un fichero PDF.
"""
TEXTO = 'texto', _('Texto libre')
FICHERO = 'fichero', _('Fichero')
apartado = models.ForeignKey(
'MemoriaApartado', on_delete=models.PROTECT, related_name='subapartados'
)
peso = models.PositiveSmallIntegerField(_('peso'))
descripcion = models.CharField(_('descripción'), max_length=255)
ayuda = models.CharField(_('texto de ayuda'), max_length=255)
tipo = models.CharField(_('tipo'), max_length=15, choices=Tipo.choices)
class Meta:
ordering = ('apartado__numero', 'peso')
verbose_name = _('subapartado de la memoria')
verbose_name_plural = _('subapartados de la memoria')
def __str__(self):
return self.descripcion
@property
def numero_apartado(self):
return self.apartado.numero
class MemoriaRespuesta(models.Model):
"""Respuestas a los subapartados de la memoria"""
proyecto = models.ForeignKey(
'Proyecto', on_delete=models.PROTECT, related_name='respuestas_memoria'
)
subapartado = models.ForeignKey(
'MemoriaSubapartado', on_delete=models.PROTECT, related_name='respuestas'
)
texto = models.TextField(_('texto'), blank=True, null=True)
fichero = models.FileField('fichero PDF', upload_to='anexos_memoria', blank=True, null=True)
class Meta:
ordering = ('-proyecto__id', 'subapartado')
verbose_name = _('respuesta de la memoria')
verbose_name_plural = _('respuestas de la memoria')
def __str__(self):
return self.texto
class Opcion(models.Model):
"""Respuestas posibles a los criterios, cada una con una puntuación."""
......
......@@ -88,6 +88,7 @@ TEMPLATES = [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.media',
'django.contrib.messages.context_processors.messages',
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect',
......
......@@ -13,8 +13,11 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
'''
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.storage import staticfiles_storage
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import include, path
from django.views.generic import TemplateView
from django.views.generic.base import RedirectView
......@@ -29,10 +32,22 @@ urlpatterns = [
RedirectView.as_view(url=staticfiles_storage.url('favicons/browserconfig.xml')),
name='browserconfig',
),
path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('favicons/favicon.ico')), name='favicon'),
path(
'robots.txt', TemplateView.as_view(template_name='robots.txt', content_type='text/plain'), name='robots_file'
'favicon.ico',
RedirectView.as_view(url=staticfiles_storage.url('favicons/favicon.ico')),
name='favicon',
),
path(
'robots.txt',
TemplateView.as_view(template_name='robots.txt', content_type='text/plain'),
name='robots_file',
),
path('', include('social_django.urls', namespace='social')),
path('', include('indo.urls')),
]
# Serving the media files in development mode
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
else:
urlpatterns += staticfiles_urlpatterns()
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