]> git.parisson.com Git - mezzo.git/commitdiff
Add Event trainings and related data
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Wed, 5 Oct 2016 13:18:23 +0000 (15:18 +0200)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Wed, 5 Oct 2016 13:18:23 +0000 (15:18 +0200)
app/local_settings.py
app/organization/agenda/admin.py
app/organization/agenda/migrations/0008_auto_20161005_1455.py [new file with mode: 0644]
app/organization/agenda/models.py
app/organization/agenda/translation.py
app/organization/core/models.py
app/organization/projects/migrations/0018_auto_20161005_1424.py [new file with mode: 0644]
app/templates/agenda/event_detail.html
app/templates/agenda/includes/event_metainfo.html

index 4f643841e85f7484e775880ddec161cbfa467a04..4b76b14ac75ef4ea30b6d563ab6bccd551e3ee69 100644 (file)
@@ -82,6 +82,8 @@ ADMIN_MENU_ORDER = (
                   'mezzanine_agenda.EventLocation',
                   'mezzanine_agenda.EventPrice',
                   'mezzanine_agenda.EventCategory',
+                  'organization-agenda.EventPublicType',
+                  'organization-agenda.EventTrainingLevel',
                   'generic.Keyword',
                   )),
     (_('Magazine'), ('organization-magazine.Article',
@@ -94,7 +96,8 @@ ADMIN_MENU_ORDER = (
                     'organization-network.OrganizationType',
                     'organization-network.PersonListBlock',
                     )),
-    (_('Activity'), ('organization-network.ActivityStatus',
+    (_('Activity'), ('organization-network.PersonActivity',
+                    'organization-network.ActivityStatus',
                     'organization-network.ActivityGrade',
                     'organization-network.ActivityFramework',
                     'organization-network.ActivityFunction',
index 34a77cf65e92abd3b23e8a10d3c0f94e87e264b8..f5a4d565962307d96ebb788d08b89ba03ee2f5e5 100644 (file)
@@ -37,21 +37,31 @@ class EventVideoInline(StackedDynamicInlineAdmin):
     model = EventVideo
 
 
-class EventDepartmentInline(StackedDynamicInlineAdmin):
+class EventDepartmentInline(TabularDynamicInlineAdmin):
 
     model = EventDepartment
 
 
-class EventPersonInline(StackedDynamicInlineAdmin):
+class EventPersonInline(TabularDynamicInlineAdmin):
 
     model = EventPerson
 
 
-class EventLinkInline(StackedDynamicInlineAdmin):
+class EventLinkInline(TabularDynamicInlineAdmin):
 
     model = EventLink
 
 
+class EventTrainingInline(StackedDynamicInlineAdmin):
+
+    model = EventTraining
+
+
+class EventPeriodInline(TabularDynamicInlineAdmin):
+
+    model = EventPeriod
+
+
 class CustomEventAdmin(EventAdmin):
     """
     Admin class for events.
@@ -63,8 +73,8 @@ class CustomEventAdmin(EventAdmin):
     if settings.EVENT_USE_FEATURED_IMAGE:
         list_display.insert(0, "admin_thumb")
     list_filter = deepcopy(DisplayableAdmin.list_filter) + ("location", "category")
-    inlines = [EventBlockInline, EventImageInline, EventDepartmentInline, EventPersonInline,
-                EventLinkInline, EventAudioInline, EventVideoInline]
+    inlines = [EventPeriodInline, EventBlockInline, EventImageInline, EventDepartmentInline, EventPersonInline,
+                EventLinkInline, EventAudioInline, EventVideoInline, EventTrainingInline]
 
     def save_form(self, request, form, change):
         """
@@ -74,5 +84,18 @@ class CustomEventAdmin(EventAdmin):
         return DisplayableAdmin.save_form(self, request, form, change)
 
 
+class EventPublicTypeAdmin(BaseTranslationModelAdmin):
+
+    model = EventPublicType
+
+
+class EventTrainingLevelAdmin(BaseTranslationModelAdmin):
+
+    model = EventTrainingLevel
+
+
+
 admin.site.unregister(Event)
+admin.site.register(EventPublicType, EventPublicTypeAdmin)
+admin.site.register(EventTrainingLevel, EventTrainingLevelAdmin)
 admin.site.register(Event, CustomEventAdmin)
diff --git a/app/organization/agenda/migrations/0008_auto_20161005_1455.py b/app/organization/agenda/migrations/0008_auto_20161005_1455.py
new file mode 100644 (file)
index 0000000..a07cdbc
--- /dev/null
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-05 12:55
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('mezzanine_agenda', '0010_remove_event_language'),
+        ('organization-agenda', '0007_auto_20160929_1300'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='EventPeriod',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('date_from', models.DateTimeField(blank=True, null=True, verbose_name='begin date')),
+                ('date_to', models.DateTimeField(blank=True, null=True, verbose_name='end date')),
+                ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='periods', to='mezzanine_agenda.Event', verbose_name='event')),
+            ],
+            options={
+                'verbose_name_plural': 'periods',
+                'verbose_name': 'period',
+            },
+        ),
+        migrations.CreateModel(
+            name='EventPublicType',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=512, verbose_name='name')),
+                ('name_fr', models.CharField(max_length=512, null=True, verbose_name='name')),
+                ('name_en', models.CharField(max_length=512, null=True, verbose_name='name')),
+                ('description', models.TextField(blank=True, verbose_name='description')),
+            ],
+            options={
+                'verbose_name_plural': 'public types',
+                'verbose_name': 'public type',
+            },
+        ),
+        migrations.CreateModel(
+            name='EventTraining',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('language', models.CharField(blank=True, choices=[('fr', 'French'), ('en', 'English')], max_length=64, null=True, verbose_name='Language')),
+                ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='trainings', to='mezzanine_agenda.Event', verbose_name='event')),
+            ],
+            options={
+                'verbose_name_plural': 'trainings',
+                'verbose_name': 'training',
+            },
+        ),
+        migrations.CreateModel(
+            name='EventTrainingLevel',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=512, verbose_name='name')),
+                ('name_fr', models.CharField(max_length=512, null=True, verbose_name='name')),
+                ('name_en', models.CharField(max_length=512, null=True, verbose_name='name')),
+                ('description', models.TextField(blank=True, verbose_name='description')),
+            ],
+            options={
+                'verbose_name_plural': 'training levels',
+                'verbose_name': 'training level',
+            },
+        ),
+        migrations.AddField(
+            model_name='eventtraining',
+            name='level',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='trainings', to='organization-agenda.EventTrainingLevel', verbose_name='level'),
+        ),
+        migrations.AddField(
+            model_name='eventtraining',
+            name='public_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='trainings', to='organization-agenda.EventPublicType', verbose_name='public type'),
+        ),
+    ]
index 2ad946ea6c32a07427ceb9f1ab1a1ea62975b1e5..4972904e3476b74de06514e445acf934c4d7147c 100644 (file)
@@ -3,6 +3,7 @@ from future.builtins import str
 
 from django.utils.translation import ugettext_lazy as _
 
+from mezzanine.conf import settings
 from mezzanine_agenda.models import *
 from organization.core.models import *
 from organization.network.models import *
@@ -74,3 +75,38 @@ class EventVideo(Video):
         verbose_name = _("video")
         verbose_name_plural = _("videos")
         order_with_respect_to = "event"
+
+
+class EventPeriod(PeriodDateTime):
+
+    event = models.ForeignKey(Event, verbose_name=_('event'), related_name='periods', blank=True, null=True, on_delete=models.SET_NULL)
+
+    class Meta:
+        verbose_name = _("period")
+        verbose_name_plural = _("periods")
+
+
+class EventPublicType(Named):
+
+    class Meta:
+        verbose_name = _("public type")
+        verbose_name_plural = _("public types")
+
+
+class EventTrainingLevel(Named):
+
+    class Meta:
+        verbose_name = _("training level")
+        verbose_name_plural = _("training levels")
+
+
+class EventTraining(models.Model):
+
+    event = models.ForeignKey(Event, verbose_name=_('event'), related_name='trainings', blank=True, null=True, on_delete=models.SET_NULL)
+    language = models.CharField(_('Language'), max_length=64, blank=True, null=True, choices=settings.LANGUAGES)
+    public_type = models.ForeignKey(EventPublicType, verbose_name=_('public type'), related_name='trainings', blank=True, null=True, on_delete=models.SET_NULL)
+    level = models.ForeignKey(EventTrainingLevel, verbose_name=_('level'), related_name='trainings', blank=True, null=True, on_delete=models.SET_NULL)
+
+    class Meta:
+        verbose_name = _("training")
+        verbose_name_plural = _("trainings")
index 335ae253b01ffa5216763dd72de0ec9b189d7899..7d45af7fb9e5950f0b0dec51aa5f352e8450b7da 100644 (file)
@@ -40,6 +40,30 @@ class EventPersonTranslationOptions(TranslationOptions):
 
 
 @register(EventLink)
-class EventPersonTranslationOptions(TranslationOptions):
+class EventLinkTranslationOptions(TranslationOptions):
+
+    fields = ()
+
+
+@register(EventPeriod)
+class EventPeriodTranslationOptions(TranslationOptions):
 
     fields = ()
+
+
+@register(EventTraining)
+class EventTrainingTranslationOptions(TranslationOptions):
+
+    fields = ()
+
+
+@register(EventTrainingLevel)
+class EventTrainingLevelTranslationOptions(TranslationOptions):
+
+    fields = ('name',)
+
+
+@register(EventPublicType)
+class EventPublicTypeTranslationOptions(TranslationOptions):
+
+    fields = ('name',)
index abd98b7a6c92db061b5a40cd4067087a8953907e..eab41f7b08db346ba61bd6ebffed2ef6726b37b0 100644 (file)
@@ -196,6 +196,15 @@ class Period(models.Model):
         abstract = True
 
 
+class PeriodDateTime(models.Model):
+
+    date_from = models.DateTimeField(_('begin date'), null=True, blank=True)
+    date_to = models.DateTimeField(_('end date'), null=True, blank=True)
+
+    class Meta:
+        abstract = True
+
+
 class AdminThumbRelatedMixin(object):
     """
     Provides a thumbnail method on models for admin classes to
diff --git a/app/organization/projects/migrations/0018_auto_20161005_1424.py b/app/organization/projects/migrations/0018_auto_20161005_1424.py
new file mode 100644 (file)
index 0000000..6b54ffb
--- /dev/null
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-05 12:24
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-projects', '0017_auto_20160928_1858'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='project',
+            options={'ordering': ['-date_from', '-date_to'], 'verbose_name': 'project'},
+        ),
+    ]
index 0e5a9729f929061c608d894852552db864ecd3b3..a84615413ce5aac09c1a89040f5eafd40cb98822 100644 (file)
         {% endblock %}
     {% endcomment %}
 
-    {% block event_related %}
-        {% if event.artists.all or event.videos.all or event.blog_posts.all %}
-        <h2 class="section__title">{% trans "Also discover" %}</h2>
-        <div class="msry__container">
-         <div class="msry__sizer"></div>
-        {% if event.artists.all %}
-            {% for artist in event.artists.all %}
-                {% include "festival/inc/artist_card.html" %}
-            {% endfor %}
-        {% endif %}
-        {% if event.videos.all %}
-            {% for video in event.videos.all %}
-                {% include 'festival/inc/video_card.html' %}
-            {% endfor %}
-        {% endif %}
-        {% if event.blog_posts.all %}
-            {% for post in event.blog_posts.all %}
-                {% include 'blog/includes/post_card.html' %}
-            {% endfor %}
-        {% endif %}
-        </div>
-        {% endif %}
-    {% endblock %}
-
 {% endblock %}
 
 {% block page_link %}
 {% endblock %}
 
 {% block page_person_list %}
-    {% for page_custom_person_list_block_inline in event.persons.all  %}
-        <!-- TODO: Add persons -->
-    {% endfor %}
+    {% if event.persons.all %}
+        {% if event.trainings.all %}
+            {% trans "Trainers" %}<br>
+        {% else %}
+            {% trans "Persons" %}<br>
+        {% endif %}
+        {% for person in event.persons.all %}
+            {{ person.person.title }}<br>
+            {{ person.person.bio|safe }}<br>
+        {% endfor %}
+    {% endif %}
 {% endblock %}
 
 {% block page_sub_content %}
             {% endeditable %}
         {% endblock %}
 
-        {% if event.language %}
-            <div class="page__meta-separator"></div>
-            <p>
-                {% trans "Language" %}: {{event.language}}
-            </p>
-        {% endif %}
-
         {% set_short_url_for event %}
         {% with event as object %}
             {% with True as is_event %}
index 99e99f9838d328524513b113a83234b39b3ac70e..f73e138dffa378286716a1eb182fb430bb7f69e8 100644 (file)
 {% endif %}
 
 {% if unit_booking %}
-
     {% if event.prices.all.0|floatformat != '0' and event.prices.all|length > 0 %}
         {% for price in event.prices.all %}
             {% if forloop.first %}
-                <div class="page__meta-title">Tarifs</div>
+                <div class="page__meta-title">{% trans "Tarifs" %}</div>
                 <p>
             {% endif %}
             {{ price.value|floatformat:"-2" }} €{% if not forloop.last %} <br /> {% endif %}
                 {% trans "Reserve" %}
             </a>
         </p>
-
     {% else %}
         <p>
             {% trans "Free entry. Limited seats available" %}
         </p>
     {% endif %}
-
 {% endif %}
+
+{% with event.trainings.all.0 as training %}
+    {% if training %}
+        <div class="page__meta-title">{% trans "Language" %}
+            <p>{{ training.language }}</p>
+        </div>
+        <div class="page__meta-title">{% trans "Public type" %}
+            <p>{{ training.public_type }}</p>
+        </div>
+        <div class="page__meta-title">{% trans "Level" %}
+            <p>{{ training.level }}</p>
+        </div>
+    {% endif %}
+{% endwith %}