pruningpolicymodel.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from datetime import timedelta
  2. from django.core.exceptions import ValidationError
  3. from django.db import models
  4. from django.db.models import Q
  5. from django.utils import timezone
  6. from django.utils.translation import ugettext_lazy as _
  7. class PruningPolicy(models.Model):
  8. name = models.CharField(max_length=255)
  9. email = models.CharField(max_length=255, null=True, blank=True)
  10. posts = models.PositiveIntegerField(default=0)
  11. registered = models.PositiveIntegerField(default=0)
  12. last_visit = models.PositiveIntegerField(default=0)
  13. class Meta:
  14. app_label = 'misago'
  15. def clean(self):
  16. if not (self.email and self.posts and self.registered and self.last_visit):
  17. raise ValidationError(_("Pruning policy must have at least one pruning criteria set to be valid."))
  18. def make_queryset(self):
  19. from misago.models import User
  20. queryset = User.objects
  21. if self.email:
  22. if ',' in self.email:
  23. qs = None
  24. for name in self.email.split(','):
  25. name = name.strip().lower()
  26. if name:
  27. if qs:
  28. qs = qs | Q(email__iendswith=name)
  29. else:
  30. qs = Q(email__iendswith=name)
  31. if qs:
  32. queryset = queryset.filter(qs)
  33. else:
  34. queryset = queryset.filter(email__iendswith=self.email)
  35. if self.posts:
  36. queryset = queryset.filter(posts__lt=self.posts)
  37. if self.registered:
  38. date = timezone.now() - timedelta(days=self.registered)
  39. queryset = queryset.filter(join_date__gte=date)
  40. if self.last_visit:
  41. date = timezone.now() - timedelta(days=self.last_visit)
  42. queryset = queryset.filter(last_date__gte=date)
  43. return queryset