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 |
... | ... | |
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 |
- |