From cd97b1c2e395bb16c4c4d2439256fc4f3af94a1e Mon Sep 17 00:00:00 2001 From: Emilie Date: Fri, 26 Aug 2016 18:32:05 +0200 Subject: [PATCH] Task #105 #106: adding Video and Audio inlines to DepartmentPage / TeamPage / CustomPage and Project --- app/organization/core/models.py | 3 - .../migrations/0011_auto_20160826_1708.py | 20 +++ app/organization/magazine/models.py | 2 +- .../migrations/0002_auto_20160826_1805.py | 149 ++++++++++++++++++ .../migrations/0003_auto_20160826_1806.py | 49 ++++++ app/organization/media/models.py | 27 +++- app/organization/media/translation.py | 11 ++ app/organization/network/admin.py | 15 +- app/organization/pages/admin.py | 14 +- app/organization/projects/admin.py | 14 +- 10 files changed, 292 insertions(+), 12 deletions(-) create mode 100644 app/organization/magazine/migrations/0011_auto_20160826_1708.py create mode 100644 app/organization/media/migrations/0002_auto_20160826_1805.py create mode 100644 app/organization/media/migrations/0003_auto_20160826_1806.py diff --git a/app/organization/core/models.py b/app/organization/core/models.py index 3122be9d..c77628b8 100644 --- a/app/organization/core/models.py +++ b/app/organization/core/models.py @@ -170,7 +170,6 @@ class Link(URL): return self.url - class Period(models.Model): date_begin = models.DateField(_('begin date'), null=True, blank=True) @@ -180,7 +179,6 @@ class Period(models.Model): abstract = True - class CustomDisplayable(Displayable): class Meta: @@ -217,7 +215,6 @@ class DisplayableLink(Link): order_with_respect_to = "displayable" - class CustomModel(models.Model): class Meta: diff --git a/app/organization/magazine/migrations/0011_auto_20160826_1708.py b/app/organization/magazine/migrations/0011_auto_20160826_1708.py new file mode 100644 index 00000000..4b6956ae --- /dev/null +++ b/app/organization/magazine/migrations/0011_auto_20160826_1708.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.10 on 2016-08-26 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0010_auto_20160825_1843'), + ] + + operations = [ + migrations.AlterField( + model_name='article', + name='topics', + field=models.ManyToManyField(blank=True, related_name='articles', to='organization-magazine.Topic', verbose_name='topics'), + ), + ] diff --git a/app/organization/magazine/models.py b/app/organization/magazine/models.py index a926c66c..647c47ef 100644 --- a/app/organization/magazine/models.py +++ b/app/organization/magazine/models.py @@ -19,7 +19,7 @@ class Article(BlogPost, SubTitled): related_articles = models.ManyToManyField("self", verbose_name=_("Related articles"), blank=True) department = models.ForeignKey(Department, verbose_name=_('department'), related_name='articles', limit_choices_to=dict(id__in=Department.objects.all()), blank=True, null=True, on_delete=models.SET_NULL) - topics = models.ManyToManyField("Topic", verbose_name=_('topics'), related_name="articles", blank=True, null=True) + topics = models.ManyToManyField("Topic", verbose_name=_('topics'), related_name="articles", blank=True) def get_absolute_url(self): return reverse("magazine-article-detail", kwargs={"slug": self.slug}) diff --git a/app/organization/media/migrations/0002_auto_20160826_1805.py b/app/organization/media/migrations/0002_auto_20160826_1805.py new file mode 100644 index 00000000..e3969653 --- /dev/null +++ b/app/organization/media/migrations/0002_auto_20160826_1805.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.10 on 2016-08-26 16:05 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-core', '0003_auto_20160825_1232'), + ('organization-media', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='audio', + name='_meta_title', + ), + migrations.RemoveField( + model_name='audio', + name='created', + ), + migrations.RemoveField( + model_name='audio', + name='description', + ), + migrations.RemoveField( + model_name='audio', + name='expiry_date', + ), + migrations.RemoveField( + model_name='audio', + name='gen_description', + ), + migrations.RemoveField( + model_name='audio', + name='id', + ), + migrations.RemoveField( + model_name='audio', + name='in_sitemap', + ), + migrations.RemoveField( + model_name='audio', + name='keywords_string', + ), + migrations.RemoveField( + model_name='audio', + name='publish_date', + ), + migrations.RemoveField( + model_name='audio', + name='short_url', + ), + migrations.RemoveField( + model_name='audio', + name='site', + ), + migrations.RemoveField( + model_name='audio', + name='slug', + ), + migrations.RemoveField( + model_name='audio', + name='status', + ), + migrations.RemoveField( + model_name='audio', + name='title', + ), + migrations.RemoveField( + model_name='audio', + name='updated', + ), + migrations.RemoveField( + model_name='video', + name='_meta_title', + ), + migrations.RemoveField( + model_name='video', + name='created', + ), + migrations.RemoveField( + model_name='video', + name='description', + ), + migrations.RemoveField( + model_name='video', + name='expiry_date', + ), + migrations.RemoveField( + model_name='video', + name='gen_description', + ), + migrations.RemoveField( + model_name='video', + name='id', + ), + migrations.RemoveField( + model_name='video', + name='in_sitemap', + ), + migrations.RemoveField( + model_name='video', + name='keywords_string', + ), + migrations.RemoveField( + model_name='video', + name='publish_date', + ), + migrations.RemoveField( + model_name='video', + name='short_url', + ), + migrations.RemoveField( + model_name='video', + name='site', + ), + migrations.RemoveField( + model_name='video', + name='slug', + ), + migrations.RemoveField( + model_name='video', + name='status', + ), + migrations.RemoveField( + model_name='video', + name='title', + ), + migrations.RemoveField( + model_name='video', + name='updated', + ), + migrations.AddField( + model_name='audio', + name='customdisplayable_ptr', + field=models.OneToOneField(auto_created=True, default=1, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='organization-core.CustomDisplayable'), + preserve_default=False, + ), + migrations.AddField( + model_name='video', + name='customdisplayable_ptr', + field=models.OneToOneField(auto_created=True, default=1, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='organization-core.CustomDisplayable'), + preserve_default=False, + ), + ] diff --git a/app/organization/media/migrations/0003_auto_20160826_1806.py b/app/organization/media/migrations/0003_auto_20160826_1806.py new file mode 100644 index 00000000..b26a6a37 --- /dev/null +++ b/app/organization/media/migrations/0003_auto_20160826_1806.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.10 on 2016-08-26 16:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0004_auto_20160804_1547'), + ('organization-media', '0002_auto_20160826_1805'), + ] + + operations = [ + migrations.CreateModel( + name='PageAudio', + fields=[ + ('audio_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='organization-media.Audio')), + ('page', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='audios', to='pages.Page', verbose_name='page')), + ], + options={ + 'verbose_name_plural': 'audios', + 'verbose_name': 'audio', + }, + bases=('organization-media.audio',), + ), + migrations.CreateModel( + name='PageVideo', + fields=[ + ('video_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='organization-media.Video')), + ('page', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='videos', to='pages.Page', verbose_name='page')), + ], + options={ + 'verbose_name_plural': 'videos', + 'verbose_name': 'video', + }, + bases=('organization-media.video',), + ), + migrations.AlterOrderWithRespectTo( + name='pagevideo', + order_with_respect_to='page', + ), + migrations.AlterOrderWithRespectTo( + name='pageaudio', + order_with_respect_to='page', + ), + ] diff --git a/app/organization/media/models.py b/app/organization/media/models.py index 4945a486..c182aaff 100644 --- a/app/organization/media/models.py +++ b/app/organization/media/models.py @@ -1,12 +1,15 @@ from __future__ import unicode_literals +from pyquery import PyQuery as pq + from django.db import models from django.utils.translation import ugettext_lazy as _ from mezzanine.core.models import RichText, Displayable, Slugged from mezzanine.core.fields import RichTextField, OrderField, FileField from mezzanine.utils.models import AdminThumbMixin, upload_to - +from organization.core.models import CustomDisplayable +from organization.pages.models import Page from mezzanine_agenda.models import Event from django.conf import settings @@ -14,7 +17,7 @@ from django.conf import settings MEDIA_BASE_URL = getattr(settings, 'MEDIA_BASE_URL', 'http://medias.ircam.fr/embed/media/') -class Media(Displayable, RichText): +class Media(CustomDisplayable, RichText): """Media""" media_id = models.CharField(_('media id'), max_length=128) @@ -64,6 +67,16 @@ class Audio(Media): return reverse("festival-video-detail", kwargs={"slug": self.slug}) +class PageAudio(Audio): + + page = models.ForeignKey(Page, verbose_name=_('page'), related_name='audios', blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = _("audio") + verbose_name_plural = _("audios") + order_with_respect_to = "page" + + class Video(Media): """Video""" @@ -83,6 +96,16 @@ class Video(Media): return reverse("festival-video-detail", kwargs={"slug": self.slug}) +class PageVideo(Video): + + page = models.ForeignKey(Page, verbose_name=_('page'), related_name='videos', blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = _("video") + verbose_name_plural = _("videos") + order_with_respect_to = "page" + + class VideoCategory(Slugged): """Video Category""" diff --git a/app/organization/media/translation.py b/app/organization/media/translation.py index bd097142..2567061f 100644 --- a/app/organization/media/translation.py +++ b/app/organization/media/translation.py @@ -13,3 +13,14 @@ class VideoTranslationOptions(TranslationOptions): class AudioTranslationOptions(TranslationOptions): fields = ('title', 'description', 'content') + + +@register(PageVideo) +class PageVideoTranslationOptions(TranslationOptions): + + pass + +@register(PageAudio) +class PageAudioTranslationOptions(TranslationOptions): + + pass diff --git a/app/organization/network/admin.py b/app/organization/network/admin.py index db5685c0..0078351d 100644 --- a/app/organization/network/admin.py +++ b/app/organization/network/admin.py @@ -7,6 +7,17 @@ from mezzanine.pages.admin import PageAdmin from organization.network.models import * from organization.pages.models import * from organization.core.admin import * +from organization.media.models import PageAudio, PageVideo + + +class PageAudioInline(StackedDynamicInlineAdmin): + + model = PageAudio + + +class PageVideoInline(StackedDynamicInlineAdmin): + + model = PageVideo class OrganizationImageInline(TabularDynamicInlineAdmin): @@ -32,7 +43,7 @@ class DepartmentPageImageInline(TabularDynamicInlineAdmin): class DepartmentPageAdmin(PageAdmin): - inlines = [DepartmentPageImageInline, DepartmentPageBlockInline] + inlines = [DepartmentPageImageInline, DepartmentPageBlockInline, PageAudioInline, PageVideoInline, ] class DepartmentAdmin(BaseTranslationModelAdmin): @@ -56,7 +67,7 @@ class TeamPageBlockInline(StackedDynamicInlineAdmin): class TeamPageAdmin(PageAdmin): - inlines = [TeamPageImageInline, TeamPageBlockInline] + inlines = [TeamPageImageInline, TeamPageBlockInline, PageAudioInline, PageVideoInline, ] class PersonAdminBase(BaseTranslationModelAdmin): diff --git a/app/organization/pages/admin.py b/app/organization/pages/admin.py index 1e342399..6c614222 100644 --- a/app/organization/pages/admin.py +++ b/app/organization/pages/admin.py @@ -8,7 +8,7 @@ from mezzanine.pages.admin import PageAdmin from organization.pages.models import * from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody, Home from organization.pages.forms import DynamicContentHomeSliderForm, DynamicContentHomeBodyForm - +from organization.media.models import PageAudio, PageVideo class PageBlockInline(StackedDynamicInlineAdmin): @@ -20,9 +20,19 @@ class PageImageInline(TabularDynamicInlineAdmin): model = PageImage +class PageAudioInline(StackedDynamicInlineAdmin): + + model = PageAudio + + +class PageVideoInline(StackedDynamicInlineAdmin): + + model = PageVideo + + class CustomPageAdmin(PageAdmin): - inlines = [PageBlockInline, PageImageInline] + inlines = [PageBlockInline, PageImageInline, PageAudioInline, PageVideoInline, ] class DynamicContentHomeSliderInline(TabularDynamicInlineAdmin): diff --git a/app/organization/projects/admin.py b/app/organization/projects/admin.py index e9ce207b..8131f0fc 100644 --- a/app/organization/projects/admin.py +++ b/app/organization/projects/admin.py @@ -7,7 +7,7 @@ from mezzanine.core.admin import * from organization.projects.models import * from organization.pages.models import * - +from organization.media.models import Video, Audio class ProjectLinkInline(StackedDynamicInlineAdmin): @@ -24,6 +24,16 @@ class ProjectBlockInline(StackedDynamicInlineAdmin): model = DisplayableBlock +class ProjectAudioInline(StackedDynamicInlineAdmin): + + model = Audio + + +class ProjectVideoInline(StackedDynamicInlineAdmin): + + model = Video + + class ProjectAdmin(admin.ModelAdmin): model = Project @@ -32,7 +42,7 @@ class ProjectAdmin(admin.ModelAdmin): class ProjectAdminDisplayable(DisplayableAdmin): fieldsets = deepcopy(ProjectAdmin.fieldsets) - inlines = [ProjectImageInline, ProjectBlockInline, ProjectLinkInline, ] + inlines = [ProjectImageInline, ProjectBlockInline, ProjectAudioInline, ProjectVideoInline] filter_horizontal = ['persons', 'teams', 'organizations'] -- 2.39.5