From fa30c4cc423a53ae0efa1b399cac99a0b86808e6 Mon Sep 17 00:00:00 2001 From: Emilie Date: Thu, 4 Aug 2016 17:40:06 +0200 Subject: [PATCH] Topic is a page and can be added to menu Magazine. New template for topic card. --- app/local_settings.py | 2 +- .../pages/0003_auto_20160804_1451.py | 21 +++++ .../pages/0004_auto_20160804_1547.py | 21 +++++ app/organization/featured/views.py | 3 - app/organization/magazine/admin.py | 8 +- .../magazine/migrations/0001_initial.py | 11 --- .../magazine/migrations/0007_topic.py | 29 ++++++ .../migrations/0007_topic_articles.py | 20 ---- .../migrations/0008_auto_20160729_1233.py | 93 ------------------- .../magazine/migrations/0008_topic_content.py | 22 +++++ .../migrations/0009_article_parent_topic.py | 22 +++++ app/organization/magazine/models.py | 6 +- app/organization/magazine/translation.py | 9 +- app/settings.py | 2 + app/templates/core/inc/home_shutter_card.html | 4 + app/templates/index.html | 10 +- app/templates/pages/menus/admin.html | 3 +- app/templates/pages/menus/magazine.html | 12 +++ 18 files changed, 152 insertions(+), 146 deletions(-) create mode 100644 app/migrations/pages/0003_auto_20160804_1451.py create mode 100644 app/migrations/pages/0004_auto_20160804_1547.py create mode 100644 app/organization/magazine/migrations/0007_topic.py delete mode 100755 app/organization/magazine/migrations/0007_topic_articles.py delete mode 100644 app/organization/magazine/migrations/0008_auto_20160729_1233.py create mode 100644 app/organization/magazine/migrations/0008_topic_content.py create mode 100644 app/organization/magazine/migrations/0009_article_parent_topic.py create mode 100644 app/templates/core/inc/home_shutter_card.html create mode 100644 app/templates/pages/menus/magazine.html diff --git a/app/local_settings.py b/app/local_settings.py index 54d3e6bf..bed65313 100644 --- a/app/local_settings.py +++ b/app/local_settings.py @@ -72,7 +72,7 @@ ADMIN_MENU_ORDER = ( (_('Pages'), ('pages.Page', 'organization-featured.Featured',)), (_('Media'), ('organization-media.Video', 'organization-media.VideoCategory', 'organization-media.Audio', 'organization-media.Playlist', 'organization-media.Photo', (_('Media Library'), 'fb_browse'),)), (_('Events'), ('mezzanine_agenda.Event', 'mezzanine_agenda.EventLocation', 'mezzanine_agenda.EventCategory', 'mezzanine_agenda.EventPrice',)), - (_('Magazine'), ('organization-magazine.Article', 'organization-magazine.Brief', 'organization-magazine.Topic')), + (_('Magazine'), ('organization-magazine.Article', 'organization-magazine.Brief',)), (_('Organization'), ('organization-team.Organization', 'organization-team.Department', 'organization-team.Team', 'organization-team.Person', 'organization-team.Activity', 'organization-team.OrganizationType',)), (_('Projects'), ('organization-project.Project',)), (_('Festival'), ('organization-festival.Artist',)), diff --git a/app/migrations/pages/0003_auto_20160804_1451.py b/app/migrations/pages/0003_auto_20160804_1451.py new file mode 100644 index 00000000..957dcb12 --- /dev/null +++ b/app/migrations/pages/0003_auto_20160804_1451.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-04 12:51 +from __future__ import unicode_literals + +from django.db import migrations +import mezzanine.pages.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0002_auto_20160725_0143'), + ] + + operations = [ + migrations.AlterField( + model_name='page', + name='in_menus', + field=mezzanine.pages.fields.MenusField(blank=True, choices=[(1, 'Action'), (2, 'Departement'), (5, 'Magazine'), (3, 'Footer vertical'), (4, 'Footer horizontal')], max_length=100, null=True, verbose_name='Show in menus'), + ), + ] diff --git a/app/migrations/pages/0004_auto_20160804_1547.py b/app/migrations/pages/0004_auto_20160804_1547.py new file mode 100644 index 00000000..aff97a3e --- /dev/null +++ b/app/migrations/pages/0004_auto_20160804_1547.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-04 13:47 +from __future__ import unicode_literals + +from django.db import migrations +import mezzanine.pages.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0003_auto_20160804_1451'), + ] + + operations = [ + migrations.AlterField( + model_name='page', + name='in_menus', + field=mezzanine.pages.fields.MenusField(blank=True, choices=[(1, 'Action'), (2, 'Departement'), (3, 'Footer vertical'), (4, 'Footer horizontal'), (5, 'Magazine')], max_length=100, null=True, verbose_name='Show in menus'), + ), + ] diff --git a/app/organization/featured/views.py b/app/organization/featured/views.py index 75e1f2db..48863eb2 100644 --- a/app/organization/featured/views.py +++ b/app/organization/featured/views.py @@ -1,13 +1,10 @@ from django.shortcuts import render from django.views.generic import DetailView, ListView, TemplateView -from organization.magazine.models import Topic from organization.core.views import SlugMixin class HomeView(SlugMixin, TemplateView): template_name = 'index.html' - topics = Topic.objects.all() def get_context_data(self, **kwargs): context = super(HomeView, self).get_context_data(**kwargs) - context['topics'] = self.topics return context diff --git a/app/organization/magazine/admin.py b/app/organization/magazine/admin.py index dabf44a8..9b98f011 100644 --- a/app/organization/magazine/admin.py +++ b/app/organization/magazine/admin.py @@ -2,7 +2,8 @@ from django.contrib import admin from django import forms from copy import deepcopy from mezzanine.core.admin import DisplayableAdmin -from organization.magazine.models import Article, Brief, Topic +from mezzanine.pages.admin import PageAdmin +from organization.magazine.models import Article, Brief ,Topic class ArticleAdmin(admin.ModelAdmin): @@ -17,13 +18,10 @@ class BriefAdmin(admin.ModelAdmin): model = Brief - class BriefAdminDisplayable(DisplayableAdmin): fieldsets = deepcopy(BriefAdmin.fieldsets) - - admin.site.register(Article, ArticleAdminDisplayable) admin.site.register(Brief, BriefAdminDisplayable) -admin.site.register(Topic) +admin.site.register(Topic, PageAdmin) diff --git a/app/organization/magazine/migrations/0001_initial.py b/app/organization/magazine/migrations/0001_initial.py index 76757cd3..76743650 100755 --- a/app/organization/magazine/migrations/0001_initial.py +++ b/app/organization/magazine/migrations/0001_initial.py @@ -71,15 +71,4 @@ class Migration(migrations.Migration): 'verbose_name': 'category', }, ), - migrations.CreateModel( - name='Topic', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=512, verbose_name='name')), - ('description', models.TextField(blank=True, verbose_name='description')), - ], - options={ - 'verbose_name': 'topic', - }, - ), ] diff --git a/app/organization/magazine/migrations/0007_topic.py b/app/organization/magazine/migrations/0007_topic.py new file mode 100644 index 00000000..68927fef --- /dev/null +++ b/app/organization/magazine/migrations/0007_topic.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-04 09:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0002_auto_20160725_0143'), + ('organization-magazine', '0006_auto_20160728_1632'), + ] + + operations = [ + migrations.CreateModel( + name='Topic', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pages.Page')), + ('articles', models.ManyToManyField(blank=True, to='organization-magazine.Article', verbose_name='articles')), + ], + options={ + 'verbose_name': 'topic', + 'ordering': ('_order',), + }, + bases=('pages.page',), + ), + ] diff --git a/app/organization/magazine/migrations/0007_topic_articles.py b/app/organization/magazine/migrations/0007_topic_articles.py deleted file mode 100755 index 38e05711..00000000 --- a/app/organization/magazine/migrations/0007_topic_articles.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-28 15:13 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-magazine', '0006_auto_20160728_1632'), - ] - - operations = [ - migrations.AddField( - model_name='topic', - name='articles', - field=models.ManyToManyField(blank=True, to='organization-magazine.Article', verbose_name='articles'), - ), - ] diff --git a/app/organization/magazine/migrations/0008_auto_20160729_1233.py b/app/organization/magazine/migrations/0008_auto_20160729_1233.py deleted file mode 100644 index b4ca3560..00000000 --- a/app/organization/magazine/migrations/0008_auto_20160729_1233.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-29 10:33 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('sites', '0002_alter_domain_unique'), - ('organization-magazine', '0007_topic_articles'), - ] - - operations = [ - migrations.RemoveField( - model_name='topic', - name='name', - ), - migrations.AddField( - model_name='topic', - name='_meta_title', - field=models.CharField(blank=True, help_text='Optional title to be used in the HTML title tag. If left blank, the main title field will be used.', max_length=500, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='topic', - name='created', - field=models.DateTimeField(editable=False, null=True), - ), - migrations.AddField( - model_name='topic', - name='expiry_date', - field=models.DateTimeField(blank=True, help_text="With Published chosen, won't be shown after this time", null=True, verbose_name='Expires on'), - ), - migrations.AddField( - model_name='topic', - name='gen_description', - field=models.BooleanField(default=True, help_text='If checked, the description will be automatically generated from content. Uncheck if you want to manually set a custom description.', verbose_name='Generate description'), - ), - migrations.AddField( - model_name='topic', - name='in_sitemap', - field=models.BooleanField(default=True, verbose_name='Show in sitemap'), - ), - migrations.AddField( - model_name='topic', - name='keywords_string', - field=models.CharField(blank=True, editable=False, max_length=500), - ), - migrations.AddField( - model_name='topic', - name='publish_date', - field=models.DateTimeField(blank=True, db_index=True, help_text="With Published chosen, won't be shown until this time", null=True, verbose_name='Published from'), - ), - migrations.AddField( - model_name='topic', - name='short_url', - field=models.URLField(blank=True, null=True), - ), - migrations.AddField( - model_name='topic', - name='site', - field=models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'), - preserve_default=False, - ), - migrations.AddField( - model_name='topic', - name='slug', - field=models.CharField(blank=True, help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='topic', - name='status', - field=models.IntegerField(choices=[(1, 'Draft'), (2, 'Published')], default=2, help_text='With Draft chosen, will only be shown for admin users on the site.', verbose_name='Status'), - ), - migrations.AddField( - model_name='topic', - name='title', - field=models.CharField(default='title default', max_length=500, verbose_name='Title'), - preserve_default=False, - ), - migrations.AddField( - model_name='topic', - name='updated', - field=models.DateTimeField(editable=False, null=True), - ), - migrations.AlterField( - model_name='topic', - name='description', - field=models.TextField(blank=True, verbose_name='Description'), - ), - ] diff --git a/app/organization/magazine/migrations/0008_topic_content.py b/app/organization/magazine/migrations/0008_topic_content.py new file mode 100644 index 00000000..c18ee88c --- /dev/null +++ b/app/organization/magazine/migrations/0008_topic_content.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-04 12:51 +from __future__ import unicode_literals + +from django.db import migrations +import mezzanine.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0007_topic'), + ] + + operations = [ + migrations.AddField( + model_name='topic', + name='content', + field=mezzanine.core.fields.RichTextField(default='', verbose_name='Content'), + preserve_default=False, + ), + ] diff --git a/app/organization/magazine/migrations/0009_article_parent_topic.py b/app/organization/magazine/migrations/0009_article_parent_topic.py new file mode 100644 index 00000000..de2cba59 --- /dev/null +++ b/app/organization/magazine/migrations/0009_article_parent_topic.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-04 13:47 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-magazine', '0008_topic_content'), + ] + + operations = [ + migrations.AddField( + model_name='article', + name='parent_topic', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='topic_content_type', to='organization-magazine.Topic', verbose_name='topic'), + preserve_default=False, + ), + ] diff --git a/app/organization/magazine/models.py b/app/organization/magazine/models.py index e2d2ce1a..6278452f 100644 --- a/app/organization/magazine/models.py +++ b/app/organization/magazine/models.py @@ -4,15 +4,18 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse, reverse_lazy from mezzanine.core.models import RichText, Displayable, Slugged +from mezzanine.pages.models import Page from mezzanine.blog.models import BlogPost from organization.core.models import Named, Description from organization.media.models import Photo + class Article(BlogPost, Photo): sub_title = models.CharField(_('sub title'), blank=True, max_length=1000) related_articles = models.ManyToManyField("self", verbose_name=_("Related articles"), blank=True) + model_name = _('article') def get_absolute_url(self): return reverse("magazine-article-detail", kwargs={"slug": self.slug}) @@ -32,8 +35,7 @@ class Brief(Displayable, RichText): class Meta: verbose_name = _('brief') - -class Topic(Displayable): +class Topic(Page, RichText): """Topic for magazine menu""" articles = models.ManyToManyField(Article, verbose_name=_('articles'), blank=True) diff --git a/app/organization/magazine/translation.py b/app/organization/magazine/translation.py index ea181b0a..ba8e66be 100644 --- a/app/organization/magazine/translation.py +++ b/app/organization/magazine/translation.py @@ -4,10 +4,9 @@ from modeltranslation.translator import TranslationOptions from mezzanine.core.translation import (TranslatedSlugged, TranslatedDisplayable, TranslatedRichText) -from organization.magazine.models import Article, Brief +from organization.magazine.models import Article, Brief ,Topic @register(Article) -#class ArticleTranslationOptions(TranslatedDisplayable, TranslatedRichText): class ArticleTranslationOptions(TranslationOptions): fields = ('sub_title',) @@ -17,3 +16,9 @@ class ArticleTranslationOptions(TranslationOptions): class BriefTranslationOptions(TranslationOptions): fields = ('text_button', 'local_content') + + +@register(Topic) +class TopicTranslationOptions(TranslationOptions): + + fields = () diff --git a/app/settings.py b/app/settings.py index f491c1c7..784fb7d4 100644 --- a/app/settings.py +++ b/app/settings.py @@ -46,6 +46,8 @@ PAGE_MENU_TEMPLATES = ( (2, _("Departement"), "pages/menus/header.html"), (3, _("Footer vertical"), "pages/menus/footer_vertical.html"), (4, _("Footer horizontal"), "pages/menus/footer_horizontal.html"), + (5, _("Magazine"), "pages/menus/magazine.html"), + ) # A sequence of fields that will be injected into Mezzanine's (or any diff --git a/app/templates/core/inc/home_shutter_card.html b/app/templates/core/inc/home_shutter_card.html new file mode 100644 index 00000000..58a25ba8 --- /dev/null +++ b/app/templates/core/inc/home_shutter_card.html @@ -0,0 +1,4 @@ + +

{{ title }}

+

{{ description|truncatechars:100 }}

+
diff --git a/app/templates/index.html b/app/templates/index.html index ba59b595..7d1b74fb 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load i18n featured_tags %} +{% load i18n featured_tags pages_tags mezzanine_tags %} {% block meta_title %}{% trans "Home" %}{% endblock %} @@ -10,6 +10,7 @@ {% block content_header %}{% endblock %} {% block main %} +{% page_menu "pages/menus/magazine.html" %} -{% if topics %} -
- {% for topic in topics %} - {% include "magazine/topic/inc_list_topic.html" %} - {% endfor %} -
-{% endif %}
diff --git a/app/templates/pages/menus/admin.html b/app/templates/pages/menus/admin.html index b8b802ea..13d48544 100644 --- a/app/templates/pages/menus/admin.html +++ b/app/templates/pages/menus/admin.html @@ -11,7 +11,6 @@ {% endif %} {% endfor %} {% endifchanged %} -
  • {{ page.title.strip|default:" " }} +  | {{ page.content_model }} {% else %} {{ page.title }} + - {{ page.content_model }} {% endif %}