attachmenttypemodel.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django.core.cache import cache
  2. from django.db import models
  3. from django.utils.translation import ugettext_lazy as _
  4. from floppyforms import ValidationError
  5. from misago.thread import local
  6. _thread_local = local()
  7. class AttachmentTypeManager(models.Manager):
  8. def flush_cache(self):
  9. cache.delete('attachment_types')
  10. def make_cache(self):
  11. attachment_types = cache.get('attachment_types', 'nada')
  12. if attachment_types == 'nada':
  13. attachment_types = []
  14. for attachment_type in AttachmentType.objects.order_by('name').iterator():
  15. attachment_type.roles_pks = [r.pk for r in attachment_type.roles.iterator()]
  16. attachment_types.append(attachment_type)
  17. cache.set('attachment_types', attachment_types, None)
  18. result_dict = {}
  19. for attachment_type in attachment_types:
  20. result_dict[attachment_type.pk] = attachment_type
  21. return result_dict
  22. def all_types(self):
  23. try:
  24. return _thread_local.misago_attachment_types
  25. except AttributeError:
  26. _thread_local.misago_attachment_types = self.make_cache()
  27. return _thread_local.misago_attachment_types
  28. def find_type(self, filename):
  29. for attachment_type in self.all_types().values():
  30. if attachment_type.file_of_type(filename):
  31. return attachment_type
  32. return None
  33. class AttachmentType(models.Model):
  34. name = models.CharField(max_length=255, db_index=True)
  35. extensions = models.CharField(max_length=255)
  36. size_limit = models.PositiveIntegerField(default=0)
  37. roles = models.ManyToManyField('Role')
  38. objects = AttachmentTypeManager()
  39. class Meta:
  40. app_label = 'misago'
  41. def update_roles(self, new_roles):
  42. self.roles.clear()
  43. for role in new_roles:
  44. self.roles.add(role)
  45. def normalize_extension(self, extension):
  46. extension = extension.lower()
  47. try:
  48. while extension[0] == '.':
  49. extension = extension[1:]
  50. except IndexError:
  51. return None
  52. return extension
  53. def has_extension(self, extension):
  54. extension = self.normalize_extension(extension)
  55. if extension:
  56. return extension in self.extensions.split(',')
  57. return False
  58. def file_of_type(self, filename):
  59. filename = filename.strip().lower()
  60. for extension in self.extensions.split(','):
  61. if filename[(len(extension) + 1) * -1:] == '.%s' % extension:
  62. return True
  63. return False
  64. def allow_file_upload(self, user, acl_limit, filesize):
  65. filesize /= 1024
  66. if self.roles_pks:
  67. user_roles = set(r.pk for r in user.roles.iterator())
  68. if not list(user_roles & self.roles_pks):
  69. raise ValidationError(_("You are not allowed to upload files of this type."))
  70. if acl_limit != 0:
  71. if self.size_limit and self.size_limit < acl_limit:
  72. size_limit = self.size_limit
  73. else:
  74. size_limit = acl_limit
  75. if filesize > size_limit:
  76. raise ValidationError(_("You are not allowed to upload files of this type that are larger than %(size)sKB.") % {'size': filesize})