Modélisation de données

This commit is contained in:
Etienne GILLE
2026-02-13 16:04:01 +01:00
parent a9a8256137
commit e3eb424290
19 changed files with 468 additions and 0 deletions

0
compterendu/__init__.py Normal file
View File

3
compterendu/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
compterendu/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class CompterenduConfig(AppConfig):
name = 'compterendu'

View File

@@ -0,0 +1,86 @@
# Generated by Django 6.0.2 on 2026-02-13 15:03
import django.db.models.deletion
import djrichtextfield.models
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Assemblee',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name='PointOrdreDuJour',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ordre', models.PositiveSmallIntegerField()),
('titre', models.CharField(max_length=512)),
('texte', djrichtextfield.models.RichTextField()),
],
options={
'ordering': ['reunion', 'ordre'],
},
),
migrations.CreateModel(
name='PostesBureau',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name='DiscussionPointOrdreDuJour',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('texte', djrichtextfield.models.RichTextField()),
('point', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='compterendu.pointordredujour')),
],
),
migrations.CreateModel(
name='MembreAssemblee',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=255)),
('prenom', models.CharField(max_length=255)),
('assemblee', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='membres', to='compterendu.assemblee')),
('poste_bureau', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='compterendu.postesbureau')),
],
),
migrations.CreateModel(
name='Reunion',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=255)),
('debut', models.DateTimeField()),
('assemblee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reunions', to='compterendu.assemblee')),
],
options={
'ordering': ['assemblee', 'debut'],
},
),
migrations.CreateModel(
name='PresenceReunion',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('presence', models.PositiveSmallIntegerField(choices=[(1, 'Présent'), (2, 'Excusé'), (3, 'Absent')])),
('membre', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='presences_reunions', to='compterendu.reunion')),
('reunion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='presences', to='compterendu.reunion')),
],
),
migrations.AddField(
model_name='pointordredujour',
name='reunion',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='points_ordre_du_jour', to='compterendu.reunion'),
),
]

View File

75
compterendu/models.py Normal file
View File

@@ -0,0 +1,75 @@
from django.db import models
from djrichtextfield.models import RichTextField
# Create your models here.
class PostesBureau(models.Model):
nom = models.CharField(max_length=255)
def __str__(self):
return self.nom
class Assemblee(models.Model):
nom = models.CharField(max_length=255)
def __str__(self):
return self.name
class MembreAssemblee(models.Model):
nom = models.CharField(max_length=255)
prenom = models.CharField(max_length=255)
assemblee = models.ForeignKey(Assemblee, on_delete=models.PROTECT, related_name="membres")
poste_bureau = models.ForeignKey(PostesBureau, on_delete=models.SET_NULL, blank=True, null=True, related_name="+")
@property
def est_au_bureau(self):
return self.poste_bureau is not None
def __str__(self):
return f"{self.prenom} {self.prenom} - {self.assemblee}"
class Reunion(models.Model):
nom = models.CharField(max_length=255)
debut = models.DateTimeField()
assemblee = models.ForeignKey(Assemblee, on_delete=models.CASCADE, related_name="reunions")
def __str__(self):
return f"{self.nom} de {self.assemblee} - {self.debut}"
class Meta:
ordering = ['assemblee', 'debut']
class PresenceReunion(models.Model):
class TypePresence(models.IntegerChoices):
PRESENT = 1, "Présent"
EXCUSE = 2, "Excusé"
ABSENT = 3, "Absent"
reunion = models.ForeignKey(Reunion, on_delete=models.CASCADE, related_name="presences")
membre = models.ForeignKey(Reunion, on_delete=models.CASCADE, related_name="presences_reunions")
presence = models.PositiveSmallIntegerField(choices=TypePresence)
def __str__(self):
return f"{self.membre} - {self.reunion} - {self.presence.label}"
class PointOrdreDuJour(models.Model):
reunion = models.ForeignKey(Reunion, on_delete=models.CASCADE, related_name="points_ordre_du_jour")
ordre = models.PositiveSmallIntegerField()
titre = models.CharField(max_length=512)
texte = RichTextField()
def __str__(self):
return f'{self.reunion} - {self.titre}'
class Meta:
ordering = ['reunion', 'ordre']
class DiscussionPointOrdreDuJour(models.Model):
point = models.OneToOneField(PointOrdreDuJour, on_delete=models.PROTECT)
texte = RichTextField()
def __str__(self):
return self.point

3
compterendu/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
compterendu/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.