From 5da6a8b71167d98c72da5526437401618cb06d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Sun, 6 Nov 2016 22:57:45 +0100 Subject: [PATCH] workshop attendee: models --- .../migrations/0026_auto_20161106_2319.py | 47 +++++++++++++++++++ proposals/models.py | 29 ++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 proposals/migrations/0026_auto_20161106_2319.py diff --git a/proposals/migrations/0026_auto_20161106_2319.py b/proposals/migrations/0026_auto_20161106_2319.py new file mode 100644 index 0000000..aa91df2 --- /dev/null +++ b/proposals/migrations/0026_auto_20161106_2319.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-11-06 23:19 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('proposals', '0025_event_label'), + ] + + operations = [ + migrations.CreateModel( + name='Attendee', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.CharField(blank=True, default='', max_length=64)), + ('email', models.EmailField(blank=True, default='', max_length=254)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='talk', + name='attendees_limit', + field=models.PositiveIntegerField(default=0, verbose_name='Max. number of attendees'), + ), + migrations.AddField( + model_name='talk', + name='registration_required', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='talk', + name='attendees', + field=models.ManyToManyField(to='proposals.Attendee', verbose_name='Attendees'), + ), + ] diff --git a/proposals/models.py b/proposals/models.py index 340fbfc..f789ece 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -104,6 +104,25 @@ class Event(models.Model): return reverse('list-talks') + '?kind=%d' % self.pk +class Attendee(PonyConfModel): + + user = models.ForeignKey(User, null=True) + name = models.CharField(max_length=64, blank=True, default="") + email = models.EmailField(blank=True, default="") + + def get_name(self): + if user: + return str(user.profile) + else: + return name + + def get_email(self): + if user: + return user.email + else: + return self.email + + class Talk(PonyConfModel): site = models.ForeignKey(Site, on_delete=models.CASCADE) @@ -123,6 +142,9 @@ class Talk(PonyConfModel): duration = models.PositiveIntegerField(default=0, verbose_name=_('Duration (min)')) room = models.ForeignKey(Room, blank=True, null=True, default=None) plenary = models.BooleanField(default=False) + registration_required = models.BooleanField(default=False) + attendees = models.ManyToManyField(Attendee, verbose_name=_('Attendees')) + attendees_limit = models.PositiveIntegerField(default=0, verbose_name=_('Max. number of attendees')) class Meta: ordering = ('title',) @@ -177,6 +199,13 @@ class Talk(PonyConfModel): else: return None + @property + def remaining_attendee(self): + if self.registration_required and self.attendees_limit: + return self.attendees_limit - self.attendees.count() + else: + return None # = infinity \o/ + class Meta: ordering = ('event__id',)