related content

This commit is contained in:
j 2018-08-22 21:59:40 +02:00
parent 2227b04e2c
commit 504d31802e
6 changed files with 89 additions and 2 deletions

View File

@ -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},
}

View File

@ -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'),
),
]

View File

@ -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),
]

View File

@ -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),
]

View File

@ -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):

View File

@ -1,5 +1,5 @@
<div class="large-4 medium-4 columns">
{% include "related.html" with related=content.children.all %}
{% include "related.html" with related=content.related_content.all %}
{% if latest_content_list %}
<h4 class="sidebar-h4">{{section}}</h4>
<div class="row">