__init__.py
88 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
|
r1590 | import boards | ||
from boards.models import STATUS_ARCHIVE | ||||
from django.core.files.images import get_image_dimensions | ||||
|
r1368 | from django.db import models | ||
|
r1273 | |||
|
r1305 | from boards import utils | ||
|
r1590 | from boards.models.attachment.viewers import get_viewers, AbstractViewer, \ | ||
FILE_TYPES_IMAGE | ||||
from boards.utils import get_upload_filename, get_extension, cached_result | ||||
|
r1273 | |||
class AttachmentManager(models.Manager): | ||||
def create_with_hash(self, file): | ||||
|
r1305 | file_hash = utils.get_file_hash(file) | ||
|
r1273 | existing = self.filter(hash=file_hash) | ||
if len(existing) > 0: | ||||
attachment = existing[0] | ||||
else: | ||||
|
r1372 | # FIXME Use full mimetype here, need to modify viewers too | ||
|
r1382 | file_type = get_extension(file.name) | ||
|
r1371 | attachment = self.create(file=file, mimetype=file_type, | ||
hash=file_hash) | ||||
|
r1273 | |||
return attachment | ||||
|
r1660 | def create_from_url(self, url): | ||
existing = self.filter(url=url) | ||||
if len(existing) > 0: | ||||
attachment = existing[0] | ||||
else: | ||||
attachment = self.create(url=url) | ||||
return attachment | ||||
|
r1590 | def get_random_images(self, count, tags=None): | ||
images = self.filter(mimetype__in=FILE_TYPES_IMAGE).exclude( | ||||
|
r1592 | attachment_posts__thread__status=STATUS_ARCHIVE) | ||
|
r1590 | if tags is not None: | ||
|
r1592 | images = images.filter(attachment_posts__threads__tags__in=tags) | ||
|
r1590 | return images.order_by('?')[:count] | ||
|
r1273 | |||
class Attachment(models.Model): | ||||
objects = AttachmentManager() | ||||
|
r1660 | file = models.FileField(upload_to=get_upload_filename, null=True) | ||
mimetype = models.CharField(max_length=50, null=True) | ||||
hash = models.CharField(max_length=36, null=True) | ||||
|
r1590 | alias = models.TextField(unique=True, null=True, blank=True) | ||
|
r1700 | url = models.TextField(null=True, blank=True) | ||
|
r1273 | |||
def get_view(self): | ||||
file_viewer = None | ||||
|
r1286 | for viewer in get_viewers(): | ||
|
r1273 | if viewer.supports(self.mimetype): | ||
|
r1306 | file_viewer = viewer | ||
|
r1273 | break | ||
if file_viewer is None: | ||||
|
r1306 | file_viewer = AbstractViewer | ||
|
r1273 | |||
|
r1660 | return file_viewer(self.file, self.mimetype, self.hash, self.url).get_view() | ||
|
r1273 | |||
|
r1389 | def __str__(self): | ||
|
r1660 | return self.url or self.file.url | ||
|
r1590 | |||
def get_random_associated_post(self): | ||||
posts = boards.models.Post.objects.filter(attachments__in=[self]) | ||||
return posts.order_by('?').first() | ||||
@cached_result() | ||||
def get_size(self): | ||||
|
r1660 | if self.file: | ||
if self.mimetype in FILE_TYPES_IMAGE: | ||||
return get_image_dimensions(self.file) | ||||
else: | ||||
return 200, 150 | ||||
|
r1590 | |||
def get_thumb_url(self): | ||||
split = self.file.url.rsplit('.', 1) | ||||
w, h = 200, 150 | ||||
return '%s.%sx%s.%s' % (split[0], w, h, split[1]) | ||||
@cached_result() | ||||
def get_preview_size(self): | ||||
if self.mimetype in FILE_TYPES_IMAGE: | ||||
preview_path = self.file.path.replace('.', '.200x150.') | ||||
return get_image_dimensions(preview_path) | ||||
else: | ||||
return 200, 150 | ||||