53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from django.contrib.contenttypes.models import ContentType
|
|
from django.contrib.contenttypes import generic
|
|
from django.db import models
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
class TrashedItemManager(models.Manager):
|
|
def is_in_trash(self, obj):
|
|
content_type = ContentType.objects.get_for_model(obj)
|
|
try:
|
|
self.model.objects.get(content_type=content_type, object_id=obj.id)
|
|
except self.model.DoesNotExist:
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
def ids(self):
|
|
return [trash_item.object_id for trash_item in self.model.objects.all()]
|
|
|
|
|
|
class TrashedItem(models.Model):
|
|
#trashed_at = models.DateTimeField(_('Trashed at'), editable=False, blank=True, null=True)
|
|
content_type = models.ForeignKey(ContentType)
|
|
object_id = models.PositiveIntegerField()
|
|
content_object = generic.GenericForeignKey('content_type', 'object_id')
|
|
|
|
objects = TrashedItemManager()
|
|
|
|
def __unicode__(self):
|
|
return unicode(self.content_object)
|
|
|
|
def restore(self):
|
|
self.delete()
|
|
|
|
|
|
def new_delete_method(old_delete_method):
|
|
def delete(self, *args, **kwargs):
|
|
trash = kwargs.pop('trash', True)
|
|
|
|
if trash==False:
|
|
return old_delete_method(self, *args, **kwargs)
|
|
else:
|
|
trashed_item = TrashedItem.objects.create(content_object=self)#, trashed_at=datetime.now())
|
|
|
|
return delete
|
|
|
|
|
|
class TrashableModelManager(models.Manager):
|
|
def get_query_set(self):
|
|
print 'excluded', TrashedItem.objects.items()
|
|
query_set = super(TrashableModelManager, self).get_query_set().exclude(pk__in=TrashedItem.objects.ids())
|
|
return query_set
|