def validate(self, value): super(AttachmentsField, self).validate(value) if self.max_count is not None and len(value) > self.max_count: msg = _(u'attachments:AttachmentsField:error:max_count') raise ValidationError(msg.format(max_count=self.max_count, count=len(value))) if self.max_size is not None: for attachment in value: if attachment.size > self.max_size: msg = _(u'attachments:AttachmentsField:error:max_size') raise ValidationError(msg.format( max_size=filesize(self.max_size), size=filesize(attachment.size), attachment=attachment, )) if self.max_total_size is not None: total_size = sum(a.size for a in value) if total_size > self.max_total_size: msg = _(u'attachments:AttachmentsField:error:max_total_size') raise ValidationError(msg.format( max_total_size=filesize(self.max_total_size), total_size=filesize(total_size), ))
def test_supported_sizes(self): self.assertEqual(filesize(1023), u'1023 bytes') self.assertEqual(filesize(1024), u'1.0 kB') self.assertEqual(filesize(1024*1024), u'1.0 MB') self.assertEqual(filesize(1024*1024*1024), u'1.0 GB') self.assertEqual(filesize(1024*1024*1024*1024), u'1.0 TB') self.assertEqual(filesize(1024*1024*1024*1024*1024), u'1.0 PB')
def test_supported_sizes(self): self.assertEqual(filesize(1023), u'1023 bytes') self.assertEqual(filesize(1024), u'1.0 kB') self.assertEqual(filesize(1024 * 1024), u'1.0 MB') self.assertEqual(filesize(1024 * 1024 * 1024), u'1.0 GB') self.assertEqual(filesize(1024 * 1024 * 1024 * 1024), u'1.0 TB') self.assertEqual(filesize(1024 * 1024 * 1024 * 1024 * 1024), u'1.0 PB')
def size_field(self, attachment): return filesize(attachment.size) if attachment.size is not None else u'--'
def size_column(self, attachment): return filesize(attachment.size)
class AttachmentAdmin(admin.ModelAdmin): date_hierarchy = u'created' list_display = [ u'id', decorate( lambda o: admin_obj_format(o.generic_object), short_description=u'Generic Object', admin_order_field=u'generic_type__name', ), decorate( lambda o: admin_obj_format(o, u'{obj.file.name}', link=u'download' ), short_description=u'File', admin_order_field=u'file', ), u'name', u'content_type', u'created', decorate( lambda o: filesize(o.size), short_description=u'Size', admin_order_field=u'size', ), ] list_filter = [ u'created', u'content_type', u'generic_type', ] search_fields = [ u'=id', u'=generic_id', u'generic_type__name', u'file', u'name', u'content_type', ] ordering = [ u'-id', ] exclude = [ u'file', ] readonly_fields = [] raw_id_fields = [] inlines = [] def get_queryset(self, request): queryset = super(AttachmentAdmin, self).get_queryset(request) queryset = queryset.prefetch_related(u'generic_object') return queryset def download_view(self, request, attachment_pk): attachment = Attachment.objects.get_or_404(pk=attachment_pk) return download(request, attachment) def get_urls(self): info = self.model._meta.app_label, self.model._meta.model_name download_view = self.admin_site.admin_view(self.download_view) urls = patterns( '', url(r'^(.+)/download/$', download_view, name=u'{}_{}_download'.format(*info)), ) return urls + super(AttachmentAdmin, self).get_urls()
def size_field(self, attachment): return filesize( attachment.size) if attachment.size is not None else u'--'
def test_negative_sizes(self): self.assertEqual(filesize(-47), u'-47 bytes') self.assertEqual(filesize(-3847), u'-3.8 kB')
def test_random_sizes(self): self.assertEqual(filesize(3847), u'3.8 kB') self.assertEqual(filesize(3834547), u'3.7 MB') self.assertEqual(filesize(49573834547), u'46.2 GB') self.assertEqual(filesize(344749573834547), u'313.5 TB')
def test_too_big_sizes(self): self.assertEqual(filesize(1024 * 1024 * 1024 * 1024 * 1024 * 1024), u'1024.0 PB') self.assertEqual( filesize(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024), u'1048576.0 PB')
def test_zero_bytes(self): self.assertEqual(filesize(0), u'0 bytes')
def test_too_big_sizes(self): self.assertEqual(filesize(1024*1024*1024*1024*1024*1024), u'1024.0 PB') self.assertEqual(filesize(1024*1024*1024*1024*1024*1024*1024), u'1048576.0 PB')