datadownload.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from hashlib import md5
  2. from django.conf import settings
  3. from django.db import models
  4. from django.utils import timezone
  5. from django.utils.crypto import get_random_string
  6. from django.utils.translation import gettext_lazy as _
  7. def get_data_upload_to(instance, filename):
  8. user_id_hexdigest = md5(str(instance.user_id).encode()).hexdigest()
  9. return "data-downloads/%s/%s/%s.zip" % (
  10. user_id_hexdigest,
  11. get_random_string(64),
  12. instance.user.slug,
  13. )
  14. class DataDownload(models.Model):
  15. STATUS_PENDING = 0
  16. STATUS_PROCESSING = 1
  17. STATUS_READY = 2
  18. STATUS_EXPIRED = 3
  19. STATUS_CHOICES = [
  20. (STATUS_PENDING, _("Pending")),
  21. (STATUS_PROCESSING, _("Processing")),
  22. (STATUS_READY, _("Ready")),
  23. (STATUS_EXPIRED, _("Expired")),
  24. ]
  25. user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
  26. status = models.PositiveIntegerField(
  27. default=STATUS_PENDING, choices=STATUS_CHOICES, db_index=True
  28. )
  29. requester = models.ForeignKey(
  30. settings.AUTH_USER_MODEL,
  31. related_name="+",
  32. null=True,
  33. blank=True,
  34. on_delete=models.SET_NULL,
  35. )
  36. requester_name = models.CharField(max_length=255)
  37. requested_on = models.DateTimeField(default=timezone.now, db_index=True)
  38. expires_on = models.DateTimeField(default=timezone.now)
  39. file = models.FileField(
  40. upload_to=get_data_upload_to, max_length=255, null=True, blank=True
  41. )
  42. class Meta:
  43. ordering = ["-pk"]
  44. def delete(self, *args, **kwargs):
  45. if self.file:
  46. self.file.delete(save=False)
  47. super().delete(*args, **kwargs)