Projet

Général

Profil

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

Frédéric Péters, 12 juillet 2018 21:37

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
......
1276 1278
    text = models.TextField(blank=True)
1277 1279
    url = models.CharField(_('URL'), max_length=200, blank=True)
1278 1280
    last_update_timestamp = models.DateTimeField(auto_now=True)
1281

  
1282

  
1283
@receiver(pre_save, sender=Page)
1284
def create_redirects(sender, instance, raw, **kwargs):
1285
    if raw or not instance.id or instance.snapshot_id:
1286
        return
1287
    try:
1288
        old_page = Page.objects.get(id=instance.id)
1289
    except Page.DoesNotExist:
1290
        return
1291
    if old_page.slug == instance.slug and old_page.parent_id == instance.parent_id:
1292
        return
1293
    affected_pages = level_pages = [old_page]
1294
    while True:
1295
        level_pages = Page.objects.filter(parent_id__in=[x.id for x in level_pages]).select_related('parent')
1296
        if len(level_pages) == 0:
1297
            break
1298
        affected_pages.extend(level_pages)
1299
    for page in affected_pages:
1300
        Redirect(page=page, old_url=page.get_online_url()).save()
tests/test_public.py
603 603

  
604 604
    assert app.get('/whatever/', status=301).location == '/second/third/'
605 605
    assert app.get('/whatever', status=301).location == '/whatever/'
606

  
607
    # rename page
608
    page3.slug = 'third2'
609
    page3.save()
610
    assert app.get('/second/third2/', status=200)
611
    assert app.get('/second/third/', status=301).location == '/second/third2/'
612

  
613
    page2.slug = 'second2'
614
    page2.save()
615
    assert app.get('/second/third/', status=301).location == '/second2/third2/'
616
    assert app.get('/second/third2/', status=301).location == '/second2/third2/'
617
    assert app.get('/second/', status=301).location == '/second2/'
618

  
619
    # change parent
620
    page3.parent = None
621
    page3.save()
622
    assert app.get('/second/third/', status=301).location == '/third2/'
623
    assert app.get('/second2/third2/', status=301).location == '/third2/'
606
-