Commit 089dd2f7 by benjaoming

restore lost-and-found auto collection if subtrees are disconnected

parent fa3c9166
...@@ -7,7 +7,7 @@ from django.contrib.sites.models import Site ...@@ -7,7 +7,7 @@ from django.contrib.sites.models import Site
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models, transaction from django.db import models, transaction
from django.db.models.signals import post_save from django.db.models.signals import post_save, pre_delete
from django.utils.translation import ugettext_lazy as _, ugettext from django.utils.translation import ugettext_lazy as _, ugettext
from mptt.fields import TreeForeignKey from mptt.fields import TreeForeignKey
...@@ -249,41 +249,43 @@ def on_article_relation_save(**kwargs): ...@@ -249,41 +249,43 @@ def on_article_relation_save(**kwargs):
post_save.connect(on_article_relation_save, ArticleForObject) post_save.connect(on_article_relation_save, ArticleForObject)
# TODO: When a parent all of its children are purged, they get
# sucked up into the lost and found. It is disabled for now.
def on_article_delete(instance, *args, **kwargs): def on_article_delete(instance, *args, **kwargs):
# If an article is deleted, then throw out its URLPaths # If an article is deleted, then throw out its URLPaths
# But move all descendants to a lost-and-found node. # But move all descendants to a lost-and-found node.
site = Site.objects.get_current() site = Site.objects.get_current()
# Get the Lost-and-found path or create a new one # Get the Lost-and-found path or create a new one
try: # Only create the lost-and-found article if it's necessary and such
lost_and_found = URLPath.objects.get(slug=settings.LOST_AND_FOUND_SLUG, # that the lost-and-found article can be deleted without being recreated!
parent=URLPath.root(), lost_and_found = None
site=site) def get_lost_and_found():
except URLPath.DoesNotExist: if lost_and_found:
article = Article(group_read = True, return lost_and_found
group_write = False, try:
other_read = False, lost_and_found = URLPath.objects.get(slug=settings.LOST_AND_FOUND_SLUG,
other_write = False) parent=URLPath.root(),
article.add_revision(ArticleRevision( site=site)
content=_(u'Articles who lost their parents\n' except URLPath.DoesNotExist:
'===============================\n\n' article = Article(group_read = True,
'The children of this article have had their parents deleted. You should probably find a new home for them.'), group_write = False,
title=_(u"Lost and found"))) other_read = False,
lost_and_found = URLPath.objects.create(slug=settings.LOST_AND_FOUND_SLUG, other_write = False)
parent=URLPath.root(), article.add_revision(ArticleRevision(
site=site, content=_(u'Articles who lost their parents\n'
article=article) '===============================\n\n'
article.add_object_relation(lost_and_found) 'The children of this article have had their parents deleted. You should probably find a new home for them.'),
title=_(u"Lost and found")))
lost_and_found = URLPath.objects.create(slug=settings.LOST_AND_FOUND_SLUG,
parent=URLPath.root(),
site=site,
article=article)
article.add_object_relation(lost_and_found)
return lost_and_found
for urlpath in URLPath.objects.filter(articles__article=instance, site=site): for urlpath in URLPath.objects.filter(articles__article=instance, site=site):
# Delete the children # Delete the children
for child in urlpath.get_children(): for child in urlpath.get_children():
child.move_to(lost_and_found) child.move_to(get_lost_and_found())
# ...and finally delete the path itself # ...and finally delete the path itself
# TODO: This should be unnecessary because of URLPath.article(...ondelete=models.CASCADE)
urlpath.delete()
# pre_delete.connect(on_article_delete, Article) pre_delete.connect(on_article_delete, Article)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment