Projet

Général

Profil

0002-general-keep-a-redirect-on-slug-and-parent-changes-2.patch

Frédéric Péters, 13 juillet 2018 08:46

Télécharger (2,95 ko)

Voir les différences:

Subject: [PATCH 2/2] general: keep a redirect on slug and parent changes
 (#20760)

 combo/data/models.py | 22 ++++++++++++++++++++++
 tests/test_public.py | 18 ++++++++++++++++++
 2 files changed, 40 insertions(+)
combo/data/models.py
34 34
from django.core import serializers
35 35
from django.db import models, transaction
36 36
from django.db.models.base import ModelBase
37
from django.db.models.signals import pre_save
37 38
from django.db.models import Max
39
from django.dispatch import receiver
38 40
from django.forms import models as model_forms
39 41
from django import forms
40 42
from django import template
......
1280 1282
    text = models.TextField(blank=True)
1281 1283
    url = models.CharField(_('URL'), max_length=200, blank=True)
1282 1284
    last_update_timestamp = models.DateTimeField(auto_now=True)
1285

  
1286

  
1287
@receiver(pre_save, sender=Page)
1288
def create_redirects(sender, instance, raw, **kwargs):
1289
    if raw or not instance.id or instance.snapshot_id:
1290
        return
1291
    try:
1292
        old_page = Page.objects.get(id=instance.id)
1293
    except Page.DoesNotExist:
1294
        return
1295
    if old_page.slug == instance.slug and old_page.parent_id == instance.parent_id:
1296
        return
1297
    affected_pages = level_pages = [old_page]
1298
    while True:
1299
        level_pages = Page.objects.filter(parent_id__in=[x.id for x in level_pages]).select_related('parent')
1300
        if len(level_pages) == 0:
1301
            break
1302
        affected_pages.extend(level_pages)
1303
    for page in affected_pages:
1304
        Redirect(page=page, old_url=page.get_online_url()).save()
tests/test_public.py
609 609
    redirect = Redirect(old_url='/whatever/', page=page2)
610 610
    redirect.save()
611 611
    assert app.get('/whatever/', status=301).location == '/second/'
612

  
613
    # rename page
614
    page3.slug = 'third2'
615
    page3.save()
616
    assert app.get('/second/third2/', status=200)
617
    assert app.get('/second/third/', status=301).location == '/second/third2/'
618

  
619
    page2.slug = 'second2'
620
    page2.save()
621
    assert app.get('/second/third/', status=301).location == '/second2/third2/'
622
    assert app.get('/second/third2/', status=301).location == '/second2/third2/'
623
    assert app.get('/second/', status=301).location == '/second2/'
624

  
625
    # change parent
626
    page3.parent = None
627
    page3.save()
628
    assert app.get('/second/third/', status=301).location == '/third2/'
629
    assert app.get('/second2/third2/', status=301).location == '/third2/'
612
-