0002-general-keep-a-redirect-on-slug-and-parent-changes-2.patch
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 |
- |