From 504d31802e8f3e9dbae599861d76dc016c545cb6 Mon Sep 17 00:00:00 2001 From: j Date: Wed, 22 Aug 2018 21:59:40 +0200 Subject: [PATCH] related content --- content/admin.py | 2 +- .../0012_content_related_content.py | 21 +++++++++++++++++ content/migrations/0013_related.py | 23 +++++++++++++++++++ content/migrations/0014_migrate_shortname.py | 23 +++++++++++++++++++ content/models.py | 20 ++++++++++++++++ content/templates/latest_content.html | 2 +- 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 content/migrations/0012_content_related_content.py create mode 100644 content/migrations/0013_related.py create mode 100644 content/migrations/0014_migrate_shortname.py diff --git a/content/admin.py b/content/admin.py index 4397842..ec542b0 100644 --- a/content/admin.py +++ b/content/admin.py @@ -69,7 +69,7 @@ class ContentAdmin(admin.ModelAdmin): list_filter = ['datestart', 'type'] search_fields = ['title', 'body', 'header', 'shortname'] raw_id_fields = ['photo'] - inlines = [ContentParentsInline, FileInline, LinkInline] + inlines = [FileInline, LinkInline] formfield_overrides = { models.TextField: {'widget': MaxLengthAdminMarkdownxWidget}, } diff --git a/content/migrations/0012_content_related_content.py b/content/migrations/0012_content_related_content.py new file mode 100644 index 0000000..fe71183 --- /dev/null +++ b/content/migrations/0012_content_related_content.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-08-22 19:08 +from __future__ import unicode_literals + +from django.db import migrations +import sortedm2m.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0011_auto_20180822_1832'), + ] + + operations = [ + migrations.AddField( + model_name='content', + name='related_content', + field=sortedm2m.fields.SortedManyToManyField(help_text=None, to='content.Content'), + ), + ] diff --git a/content/migrations/0013_related.py b/content/migrations/0013_related.py new file mode 100644 index 0000000..ff9ab5a --- /dev/null +++ b/content/migrations/0013_related.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-08-22 19:08 +from __future__ import unicode_literals + +from django.db import migrations + +def migrate_relations(apps, schema_editor): + Content = apps.get_model("content", "Content") + for c in Content.objects.all(): + for r in c.parents.all(): + c.related_content.add(r) + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0012_content_related_content'), + ] + + operations = [ + migrations.RunPython(migrate_relations), + ] + diff --git a/content/migrations/0014_migrate_shortname.py b/content/migrations/0014_migrate_shortname.py new file mode 100644 index 0000000..dd520eb --- /dev/null +++ b/content/migrations/0014_migrate_shortname.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-08-22 19:08 +from __future__ import unicode_literals + +from django.db import migrations + +def migrate_shortname(apps, schema_editor): + Content = apps.get_model("content", "Content") + for c in Content.objects.filter(shortname__contains=' '): + c.shortname = c.shortname.replace(' ', '_') + c.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0013_related'), + ] + + operations = [ + migrations.RunPython(migrate_shortname), + ] + diff --git a/content/models.py b/content/models.py index c99aa72..cc18ed8 100644 --- a/content/models.py +++ b/content/models.py @@ -6,10 +6,14 @@ from django.core.validators import MaxLengthValidator from django.db import models from django.utils.html import mark_safe from django.utils.encoding import python_2_unicode_compatible +from django.db.models.signals import m2m_changed +from django.dispatch import receiver + from photologue.models import Photo, Gallery from markdownx.models import MarkdownxField from markdownx.utils import markdownify +from sortedm2m.fields import SortedManyToManyField import ox # Create your models here. @@ -90,6 +94,8 @@ class Content(models.Model): place = models.CharField(max_length=255, null=True, blank=True) parents = models.ManyToManyField('Content', through='ContentContent', related_name="children") + related_content = SortedManyToManyField('Content', related_name='reverse_related_content') + resources = models.ManyToManyField('Resources', through='ContentResource', related_name="content") gallery = models.ForeignKey(Gallery, null=True, blank=True, related_name="content") @@ -170,6 +176,20 @@ class Content(models.Model): managed = True db_table = 'content' + def reverse(self): + ids = set(self.related_content.all().values_list('id', flat=True)) + for r in self.reverse_related_content.exclude(id__in=ids): + self.reverse_related_content.remove(r) + reverse_ids = set(self.reverse_related_content.all().values_list('id', flat=True)) + for r in self.related_content.filter(id__in=ids - reverse_ids): + self.reverse_related_content.add(r) + +@receiver(m2m_changed, sender='content.Content_related_content') +def post_save_reverse(sender, **kwargs): + if kwargs.get('action') == 'post_add': + c = kwargs['instance'] + c.reverse() + print(c.id, set(c.related_content.all().values_list('id', flat=True)) == set(c.reverse_related_content.all().values_list('id', flat=True))) @python_2_unicode_compatible class ContentContent(models.Model): diff --git a/content/templates/latest_content.html b/content/templates/latest_content.html index 9bc7cb6..fdd428f 100644 --- a/content/templates/latest_content.html +++ b/content/templates/latest_content.html @@ -1,5 +1,5 @@
- {% include "related.html" with related=content.children.all %} + {% include "related.html" with related=content.related_content.all %} {% if latest_content_list %}