|
|
import hashlib
|
|
|
import os
|
|
|
import time
|
|
|
|
|
|
from random import random
|
|
|
|
|
|
from django.db import models
|
|
|
from boards import utils
|
|
|
|
|
|
from boards.models.attachment.viewers import get_viewers, AbstractViewer
|
|
|
|
|
|
|
|
|
FILES_DIRECTORY = 'files/'
|
|
|
FILE_EXTENSION_DELIMITER = '.'
|
|
|
|
|
|
|
|
|
class AttachmentManager(models.Manager):
|
|
|
def create_with_hash(self, file):
|
|
|
file_hash = utils.get_file_hash(file)
|
|
|
existing = self.filter(hash=file_hash)
|
|
|
if len(existing) > 0:
|
|
|
attachment = existing[0]
|
|
|
else:
|
|
|
file_type = file.name.split(FILE_EXTENSION_DELIMITER)[-1].lower()
|
|
|
attachment = Attachment.objects.create(
|
|
|
file=file, mimetype=file_type, hash=file_hash)
|
|
|
|
|
|
return attachment
|
|
|
|
|
|
|
|
|
class Attachment(models.Model):
|
|
|
objects = AttachmentManager()
|
|
|
|
|
|
# TODO Dedup the method
|
|
|
def _update_filename(self, filename):
|
|
|
"""
|
|
|
Gets unique filename
|
|
|
"""
|
|
|
|
|
|
# TODO Use something other than random number in file name
|
|
|
new_name = '{}{}.{}'.format(
|
|
|
str(int(time.mktime(time.gmtime()))),
|
|
|
str(int(random() * 1000)),
|
|
|
filename.split(FILE_EXTENSION_DELIMITER)[-1:][0])
|
|
|
|
|
|
return os.path.join(FILES_DIRECTORY, new_name)
|
|
|
|
|
|
file = models.FileField(upload_to=_update_filename)
|
|
|
mimetype = models.CharField(max_length=50)
|
|
|
hash = models.CharField(max_length=36)
|
|
|
|
|
|
def get_view(self):
|
|
|
file_viewer = None
|
|
|
for viewer in get_viewers():
|
|
|
if viewer.supports(self.mimetype):
|
|
|
file_viewer = viewer
|
|
|
break
|
|
|
if file_viewer is None:
|
|
|
file_viewer = AbstractViewer
|
|
|
|
|
|
return file_viewer(self.file, self.mimetype).get_view()
|
|
|
|
|
|
|
|
|
|