datadownload.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 ugettext_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/{}/{}/{}.zip'.format(
  10. user_id_hexdigest, get_random_string(64), instance.user.slug)
  11. class DataDownload(models.Model):
  12. STATUS_PENDING = 0
  13. STATUS_PROCESSING = 1
  14. STATUS_READY = 2
  15. STATUS_EXPIRED = 3
  16. STATUS_CHOICES = [
  17. (STATUS_PENDING, _("Pending")),
  18. (STATUS_PROCESSING, _("Processing")),
  19. (STATUS_READY, _("Ready")),
  20. (STATUS_EXPIRED, _("Expired")),
  21. ]
  22. user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
  23. status = models.PositiveIntegerField(
  24. default=STATUS_PENDING,
  25. choices=STATUS_CHOICES,
  26. db_index=True,
  27. )
  28. requester = models.ForeignKey(
  29. settings.AUTH_USER_MODEL,
  30. related_name='+',
  31. null=True,
  32. blank=True,
  33. on_delete=models.SET_NULL,
  34. )
  35. requester_name = models.CharField(max_length=255)
  36. requested_on = models.DateTimeField(default=timezone.now)
  37. expires_on = models.DateTimeField(default=timezone.now)
  38. file = models.FileField(upload_to=get_data_upload_to, max_length=255, null=True, blank=True)
  39. class Meta:
  40. ordering = ['-pk']
  41. def delete(self, *args, **kwargs):
  42. if self.file:
  43. self.file.delete(save=False)
  44. super(DataDownload, self).delete(*args, **kwargs)