From 9bbe577d2f38f4dcc5b84f6ce2066fe8ee8aaf3c Mon Sep 17 00:00:00 2001 From: j Date: Wed, 22 Aug 2018 20:57:03 +0200 Subject: [PATCH 1/4] remove debug --- content/admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/content/admin.py b/content/admin.py index e3a97e8..4397842 100644 --- a/content/admin.py +++ b/content/admin.py @@ -45,7 +45,6 @@ class MaxLengthAdminMarkdownxWidget(AdminMarkdownxWidget): if not attrs: attrs = {} attrs['maxlength'] = 250 - print(dir(self)) return super(MaxLengthAdminMarkdownxWidget, self).get_context(name, value, attrs) class Media: From 2227b04e2cebf68e6377c2d14f6ed899aa31e86d Mon Sep 17 00:00:00 2001 From: j Date: Wed, 22 Aug 2018 20:57:28 +0200 Subject: [PATCH 2/4] migrations --- content/migrations/0011_auto_20180822_1832.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 content/migrations/0011_auto_20180822_1832.py diff --git a/content/migrations/0011_auto_20180822_1832.py b/content/migrations/0011_auto_20180822_1832.py new file mode 100644 index 0000000..b610160 --- /dev/null +++ b/content/migrations/0011_auto_20180822_1832.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.8 on 2018-08-22 18:32 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import markdownx.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0010_auto_20180222_1319'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='photo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='main_photo', to='photologue.Photo'), + ), + migrations.AlterField( + model_name='content', + name='schedule', + field=markdownx.models.MarkdownxField(blank=True, default='', null=True), + ), + migrations.AlterField( + model_name='content', + name='teaser', + field=models.TextField(blank=True, null=True, validators=[django.core.validators.MaxLengthValidator(250)]), + ), + ] From 504d31802e8f3e9dbae599861d76dc016c545cb6 Mon Sep 17 00:00:00 2001 From: j Date: Wed, 22 Aug 2018 21:59:40 +0200 Subject: [PATCH 3/4] 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 %}
From f32546db31fb20170ad14d488ee57b36934ee80d Mon Sep 17 00:00:00 2001 From: j Date: Wed, 22 Aug 2018 22:00:18 +0200 Subject: [PATCH 4/4] remove debug --- content/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/content/models.py b/content/models.py index cc18ed8..0f1295c 100644 --- a/content/models.py +++ b/content/models.py @@ -189,7 +189,6 @@ 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):