From ce037f9e7719a581c9f0e46556160913c7ff646a Mon Sep 17 00:00:00 2001 From: Emilie Date: Fri, 7 Oct 2016 13:04:37 +0200 Subject: [PATCH] CustomPage : add dynamic content --- app/organization/pages/admin.py | 14 +++++++- app/organization/pages/forms.py | 19 ++++++++++- .../migrations/0005_dynamiccontentpage.py | 33 +++++++++++++++++++ app/organization/pages/models.py | 8 +++++ app/organization/pages/translation.py | 6 ++++ app/organization/pages/urls.py | 1 + app/organization/pages/views.py | 23 +++++++++++++ app/templates/core/inc/related_content.html | 26 +++++++++++++++ app/templates/pages/custompage.html | 4 +++ app/templates/pages/page.html | 3 ++ 10 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 app/organization/pages/migrations/0005_dynamiccontentpage.py create mode 100644 app/templates/core/inc/related_content.html diff --git a/app/organization/pages/admin.py b/app/organization/pages/admin.py index fde7064f..ff35c3b7 100644 --- a/app/organization/pages/admin.py +++ b/app/organization/pages/admin.py @@ -64,6 +64,17 @@ class PageProductListInline(TabularDynamicInlineAdmin): model = PageProductList +class DynamicContentPageInline(TabularDynamicInlineAdmin): + + model = DynamicContentPage + form = DynamicContentPageForm + + class Media: + js = ( + static("mezzanine/js/admin/dynamic_inline.js"), + ) + + class CustomPageAdmin(PageAdmin): inlines = [PageBlockInline, @@ -72,7 +83,8 @@ class CustomPageAdmin(PageAdmin): PageVideoInline, PageLinkInline, PersonListBlockAutocompleteInlineAdmin, - PageProductListInline + PageProductListInline, + DynamicContentPageInline ] diff --git a/app/organization/pages/forms.py b/app/organization/pages/forms.py index 69247ffb..ec1b91aa 100644 --- a/app/organization/pages/forms.py +++ b/app/organization/pages/forms.py @@ -9,7 +9,7 @@ from django.forms import ModelForm from mezzanine.core.models import Orderable from organization.magazine.models import Article, Topic, Brief from organization.pages.models import CustomPage -from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody +from organization.pages.models import * from organization.agenda.models import Event class DynamicContentHomeSliderForm(autocomplete.FutureModelForm): @@ -45,3 +45,20 @@ class DynamicContentHomeBodyForm(autocomplete.FutureModelForm): class Meta: model = DynamicContentHomeBody fields = ('content_object',) + + +class DynamicContentPageForm(autocomplete.FutureModelForm): + + content_object = dal_queryset_sequence.fields.QuerySetSequenceModelField( + queryset=autocomplete.QuerySetSequence( + Article.objects.all(), + CustomPage.objects.all(), + Event.objects.all() + ), + required=False, + widget=dal_select2_queryset_sequence.widgets.QuerySetSequenceSelect2('dynamic-content-page'), + ) + + class Meta: + model = DynamicContentPage + fields = ('content_object',) diff --git a/app/organization/pages/migrations/0005_dynamiccontentpage.py b/app/organization/pages/migrations/0005_dynamiccontentpage.py new file mode 100644 index 00000000..bfafc945 --- /dev/null +++ b/app/organization/pages/migrations/0005_dynamiccontentpage.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.10 on 2016-10-07 10:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mezzanine.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('pages', '0005_auto_20160923_1219'), + ('organization-pages', '0004_auto_20160928_1858'), + ] + + operations = [ + migrations.CreateModel( + name='DynamicContentPage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')), + ('object_id', models.PositiveIntegerField(editable=False, null=True, verbose_name='related object')), + ('content_type', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='content type')), + ('page', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dynamic_content_pages', to='pages.Page', verbose_name='page')), + ], + options={ + 'ordering': ('_order',), + 'verbose_name': 'Dynamic Content Page', + }, + ), + ] diff --git a/app/organization/pages/models.py b/app/organization/pages/models.py index f1afc8dd..b33e78b2 100644 --- a/app/organization/pages/models.py +++ b/app/organization/pages/models.py @@ -63,6 +63,14 @@ class PageLink(Link): order_with_respect_to = "page" +class DynamicContentPage(DynamicContent, Orderable): + + page = models.ForeignKey(Page, verbose_name=_('page'), related_name='dynamic_content_pages', blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = 'Dynamic Content Page' + + class LinkImage(models.Model): link = models.ForeignKey(MezzanineLink, verbose_name=_('link'), related_name='link_images', blank=True, null=True, on_delete=models.SET_NULL) diff --git a/app/organization/pages/translation.py b/app/organization/pages/translation.py index 5cae7e87..2b00ae34 100644 --- a/app/organization/pages/translation.py +++ b/app/organization/pages/translation.py @@ -58,6 +58,12 @@ class PageLinkTranslationOptions(TranslationOptions): pass +@register(DynamicContentPage) +class DynamicContentPageTranslationOptions(TranslationOptions): + + pass + + @register(LinkImage) class LinkImageTranslationOptions(TranslationOptions): diff --git a/app/organization/pages/urls.py b/app/organization/pages/urls.py index b061a701..559de368 100644 --- a/app/organization/pages/urls.py +++ b/app/organization/pages/urls.py @@ -14,6 +14,7 @@ urlpatterns = [ url("^$", HomeView.as_view(), name="home"), url("^dynamic-content-home-slider/$", permission_required('home.can_edit')(DynamicContentHomeSliderView.as_view()), name='dynamic-content-home-slider'), url("^dynamic-content-home-body/$", permission_required('home.can_edit')(DynamicContentHomeBodyView.as_view()), name='dynamic-content-home-body'), + url("^dynamic-content-page/$", permission_required('page.can_edit')(DynamicContentPageView.as_view()), name='dynamic-content-page'), url("^home/$", HomeView.as_view(), name='organization-home'), url("^newsletter/$", NewsletterView.as_view(), name='organization-newsletter'), ] diff --git a/app/organization/pages/views.py b/app/organization/pages/views.py index b7ca516d..e2bb796d 100644 --- a/app/organization/pages/views.py +++ b/app/organization/pages/views.py @@ -87,3 +87,26 @@ class DynamicContentHomeBodyView(Select2QuerySetSequenceView): class NewsletterView(TemplateView): template_name = "pages/newsletter.html" + + +class DynamicContentPageView(Select2QuerySetSequenceView): + + def get_queryset(self): + + articles = Article.objects.all() + custompage = CustomPage.objects.all() + events = Event.objects.all() + + if self.q: + articles = articles.filter(title__icontains=self.q) + custompage = custompage.filter(title__icontains=self.q) + events = events.filter(title__icontains=self.q) + + qs = autocomplete.QuerySetSequence(articles, custompage, events) + + if self.q: + qs = qs.filter(title__icontains=self.q) + + qs = self.mixup_querysets(qs) + + return qs diff --git a/app/templates/core/inc/related_content.html b/app/templates/core/inc/related_content.html new file mode 100644 index 00000000..ce869ede --- /dev/null +++ b/app/templates/core/inc/related_content.html @@ -0,0 +1,26 @@ +{% load i18n mezzanine_tags keyword_tags organization_tags pages_tags %} +{% if dynamic_content.all %} +
+
+
+
+
+

{% trans "Also discover" %}

+
+
+
+ {% for content in dynamic_content %} + {% if content.content_model == "article" %} +
+ {% include 'magazine/article/includes/article_card.html' %} +
+ {% else %} +
+ {% include "core/inc/generic_card.html" %} +
+ {%endif%} + {% endfor %} +
+
+
+{% endif %} diff --git a/app/templates/pages/custompage.html b/app/templates/pages/custompage.html index 56a5b6d5..ef0235d8 100644 --- a/app/templates/pages/custompage.html +++ b/app/templates/pages/custompage.html @@ -114,6 +114,10 @@ {% endwith %} {% endblock %} +{% block page_related_content %} + {{ block.super }} +{% endblock %} + {% block products %} {% for page_product_list in page.custompage.product_lists.all %} {% with page_product_list.list as list %} diff --git a/app/templates/pages/page.html b/app/templates/pages/page.html index cc2a3a4a..1b927040 100644 --- a/app/templates/pages/page.html +++ b/app/templates/pages/page.html @@ -105,6 +105,9 @@ {% endwith %} {% endblock %} {% block page_related_content %} + {% with page.dynamic_content_pages.all as dynamic_content %} + {% include "core/inc/related_content.html" %} + {% endwith %} {% endblock %} {% block related_project %} {% endblock %} -- 2.39.5