Skip to content
Snippets Groups Projects
Commit 6d40fa2a authored by florimondmanca's avatar florimondmanca
Browse files

add attached file management on visit

parent 0464bd7d
No related branches found
No related tags found
No related merge requests found
...@@ -41,7 +41,7 @@ class VisitTest(ModelTestCase): ...@@ -41,7 +41,7 @@ class VisitTest(ModelTestCase):
'verbose_name': 'fiche sortie', 'verbose_name': 'fiche sortie',
'blank': True, 'blank': True,
'null': True, 'null': True,
} },
} }
model_tests = { model_tests = {
'verbose_name': 'sortie', 'verbose_name': 'sortie',
...@@ -74,6 +74,9 @@ class VisitTest(ModelTestCase): ...@@ -74,6 +74,9 @@ class VisitTest(ModelTestCase):
def test_organizers_group_name_contains_visit_title(self): def test_organizers_group_name_contains_visit_title(self):
self.assertIn(self.obj.title, self.obj.organizers_group_name) self.assertIn(self.obj.title, self.obj.organizers_group_name)
def test_attched_files_relationship(self):
self.assertIsNotNone(getattr(self.obj, 'attached_files', None))
def test_str_is_title(self): def test_str_is_title(self):
self.assertEqual(str(self.obj), str(self.obj.title)) self.assertEqual(str(self.obj), str(self.obj.title))
......
"""VisitAttachedFile model tests."""
from tests.factory import VisitFactory
from tests.utils import ModelTestCase
from visits.models import VisitAttachedFile
class VisitAttachedFileTest(ModelTestCase):
"""Test the VisitAttachedFile model."""
model = VisitAttachedFile
field_tests = {
'name': {
'verbose_name': 'nom',
'max_length': 200,
},
'required': {
'verbose_name': 'requis',
'default': True,
},
'visit': {
'verbose_name': 'sortie',
},
}
model_tests = {
'verbose_name': 'pièce jointe',
'verbose_name_plural': 'pièces jointes',
'ordering': ('visit',),
}
@classmethod
def setUpTestData(cls):
visit = VisitFactory.create()
cls.obj = VisitAttachedFile.objects.create(name='My attached file',
visit=visit,
required=True)
def test_str_is_name(self):
self.assertEqual(str(self.obj), str(self.obj.name))
...@@ -4,7 +4,7 @@ from django import forms ...@@ -4,7 +4,7 @@ from django import forms
from django.contrib import admin from django.contrib import admin
from guardian.admin import GuardedModelAdmin from guardian.admin import GuardedModelAdmin
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from .models import Visit, Place from .models import Visit, Place, VisitAttachedFile
# Register your models here. # Register your models here.
...@@ -62,6 +62,13 @@ class VisitParticipantInline(admin.StackedInline): ...@@ -62,6 +62,13 @@ class VisitParticipantInline(admin.StackedInline):
extra = 0 extra = 0
class VisitAttachedFileInline(admin.TabularInline):
"""Inline for VisitAttachedFile."""
model = VisitAttachedFile
extra = 0
@admin.register(Visit) @admin.register(Visit)
class VisitAdmin(GuardedModelAdmin): class VisitAdmin(GuardedModelAdmin):
"""Admin panel for visits.""" """Admin panel for visits."""
...@@ -70,7 +77,7 @@ class VisitAdmin(GuardedModelAdmin): ...@@ -70,7 +77,7 @@ class VisitAdmin(GuardedModelAdmin):
# https://medium.com/@hakibenita/how-to-turn-django-admin-into-a-lightweight-dashboard-a0e0bbf609ad # https://medium.com/@hakibenita/how-to-turn-django-admin-into-a-lightweight-dashboard-a0e0bbf609ad
form = VisitForm form = VisitForm
inlines = (VisitParticipantInline,) inlines = (VisitParticipantInline, VisitAttachedFileInline,)
list_display = ('__str__', 'place', 'date', 'deadline', list_display = ('__str__', 'place', 'date', 'deadline',
'_registrations_open', 'num_participants') '_registrations_open', 'num_participants')
list_filter = ('date', RegistrationsOpenFilter) list_filter = ('date', RegistrationsOpenFilter)
......
...@@ -92,6 +92,32 @@ class VisitParticipant(models.Model): ...@@ -92,6 +92,32 @@ class VisitParticipant(models.Model):
return '{} participates in {}'.format(self.user, self.visit) return '{} participates in {}'.format(self.user, self.visit)
class VisitAttachedFile(models.Model):
"""Represents a file that a visit requires a participant to provide.
This is only used to manage required files for a visit.
=> This model does not contain an actual file field.
Actual files will be given through
VisitParticipantAttachedFile objects when a user participates in a visit.
"""
name = models.CharField('nom', max_length=200)
required = models.BooleanField('requis', default=True)
visit = models.ForeignKey('Visit',
on_delete=models.CASCADE,
related_name='attached_files',
verbose_name='sortie')
class Meta: # noqa
verbose_name = 'pièce jointe'
verbose_name_plural = 'pièces jointes'
ordering = ('visit',)
def __str__(self):
return str(self.name)
class Visit(models.Model): class Visit(models.Model):
"""Represents a visit that users can attend.""" """Represents a visit that users can attend."""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment