class Image(models.Model):
    """
    This is just for uploaded image
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    image = models.ImageField(upload_to=iso_date_prefix,
                              storage=MinioBackend(bucket_name='images'),
                              verbose_name='Картинка')

    class OrientationType(ChoiceEnum):
        VERTICAL = "Вертикальный"
        HORIZONTAL = "Горизонтальный"

    orientation = models.CharField(max_length=10,
                                   choices=OrientationType.choices(),
                                   verbose_name='Ориентация')

    class FormatType(ChoiceEnum):
        LARGE = "Большой"  # 800×600
        MEDIUM = "Средний"  # 400×300
        SMALL = "Маленький"  # 240×180

    format = models.CharField(max_length=10,
                              choices=FormatType.choices(),
                              verbose_name='Размер')

    class Meta:
        abstract = True

    def __str__(self):
        return f'{self.image.name}: ' \
               f'{getattr(self.OrientationType, self.orientation).value}, ' \
               f'{getattr(self.FormatType, self.format).value}'
    def download(self, filename=None, **options):
        bucket_name = options.pop('bucket_name', None)
        key = options.pop('key', None)

        if bucket_name is None or key is None:
            raise ValueError('You should pass a bucket and key name')

        if filename is None:
            filename = tempfile.NamedTemporaryFile(prefix=basename(key),
                                                   delete=False)
        else:
            filename = open(filename, 'wb')

        try:
            with filename as f:
                storage = MinioBackend(bucket_name=bucket_name)
                file = storage._open(object_name=key)
                for chunk in file.chunks():
                    f.write(chunk)

            logging.info("The " + filename.name + " file was downloaded")
        except Exception as e:
            logging.error(e)
            raise RuntimeError(e)

        return filename.name
Esempio n. 3
0
class VideoFile(models.Model):
    title = models.CharField(max_length=255)
    video = models.FileField(verbose_name="Object Upload",
                             storage=MinioBackend(bucket_name=priv_bucket),
                             upload_to=iso_date_prefix)

    def __str__(self):
        return self.title
Esempio n. 4
0
class Image(models.Model):
    """
    This is just for uploaded image
    """
    objects = models.Manager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    image = models.ImageField(
        upload_to=iso_date_prefix,
        storage=MinioBackend(bucket_name='django-backend-dev-public'))
class News(models.Model):
    title = models.CharField(max_length=300, verbose_name='Заголовок')
    preview_content = RichTextField(verbose_name='Превью')

    content = RichTextField(verbose_name='Содержание')
    image = models.ImageField(upload_to=iso_date_prefix,
                              storage=MinioBackend(bucket_name='news-images'),
                              null=True,
                              verbose_name='Иллюстрация')

    class Meta:
        verbose_name = 'Новость'
        verbose_name_plural = 'Новости'

    def __str__(self):
        return self.title
Esempio n. 6
0
class PrivateAttachment(models.Model):
    def set_file_path_name(self, file_name_ext: str) -> str:
        """
        Defines the full absolute path to the file in the bucket. The original content's type is used as parent folder.
        :param file_name_ext: (str) File name + extension. ie.: cat.png OR images/animals/2019/cat.png
        :return: (str) Absolute path to file in Minio Bucket
        """
        return f"{get_iso_date()}/{self.content_type.name}/{file_name_ext}"

    def delete(self, *args, **kwargs):
        """
        Delete must be overridden because the inherited delete method does not call `self.file.delete()`.
        """
        self.file.delete()
        super(PrivateAttachment, self).delete(*args, **kwargs)

    @property
    def file_name(self):
        try:
            return self.file.name.split("/")[-1]
        except AttributeError:
            return "[Deleted Object]"

    @property
    def file_size(self):
        return self.file.size

    def __str__(self):
        return str(self.file)

    id = models.AutoField(primary_key=True,
                          verbose_name="Public Attachment ID")
    content_type: ContentType = models.ForeignKey(ContentType,
                                                  null=False,
                                                  blank=False,
                                                  on_delete=models.CASCADE,
                                                  verbose_name="Content Type")
    object_id = models.PositiveIntegerField(null=False,
                                            blank=False,
                                            verbose_name="Related Object's ID")
    content_object = GenericForeignKey("content_type", "object_id")

    file: FieldFile = models.FileField(
        verbose_name="Object Upload",
        storage=MinioBackend(  # Configure MinioBackend as storage backend here
            bucket_name='django-backend-dev-private', ),
        upload_to=set_file_path_name)
Esempio n. 7
0
from django.core.files.storage import get_storage_class
from django.db import models
from django.db.models import signals
from django.dispatch import receiver
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django_minio_backend import MinioBackend, iso_date_prefix
import magic
from taggit.managers import TaggableManager
from wand.image import Image
from wand.exceptions import MissingDelegateError

from shark.utils.date import today
from shark.utils.fields import AddressField

document_storage = MinioBackend(bucket_name='documents')


class Document(models.Model):
    title = models.CharField(_('title'), max_length=100)
    sender = AddressField(blank=True)
    recipient = AddressField(blank=True)
    #vendor = models.ForeignKey('vendor.Vendor',
    #        verbose_name=_('vendor'),
    #        on_delete=models.SET_NULL,
    #        blank=True, null=True)
    #customer = models.ForeignKey('customer.Customer',
    #        verbose_name=_('customer'),
    #        on_delete=models.SET_NULL,
    #        blank=True, null=True)
    TYPE_INVOICE = 'invoice'
class Video(models.Model):
    file = models.FileField(
        verbose_name="Object Upload",
        storage=MinioBackend(bucket_name='django-backend-dev-private'),
        upload_to=iso_date_prefix)
    name = models.TextField()
    def upload_directory(self, directory, **options):
        try:
            bucket_name = options.pop('bucket_name', None)

            if bucket_name is None:
                raise ValueError('You should pass a bucket name')

            files = []

            if isdir(directory):

                for f in listdir(directory):

                    if isfile(join(directory, f)):
                        files.append(f)
                    else:
                        pass

                storage = MinioBackend(bucket_name=bucket_name)

                content_type = None

                contentType = {
                    'm3u8': 'application/x-mpegURL',
                    'ts': 'video/MP2T',
                    'mp4': 'video/mp4',
                }

                try:
                    for file in files:

                        try:

                            if file.split('.')[1] == 'ts':
                                content_type = contentType['ts']
                            elif file.split('.')[1] == 'm3u8':
                                content_type = contentType['m3u8']
                            else:
                                continue

                            f = io.BytesIO(b'')

                            with open(os.path.join(directory, file),
                                      'rb') as zip_file:
                                flength = f.write(zip_file.read())

                            metrics = InMemoryUploadedFile(
                                f, None, file, content_type, flength, None)

                            metrics.seek(0)

                            storage._save(file_path_name=join(self.key, file),
                                          content=metrics)
                        except Exception as e:
                            logging.error('file ' + str(e))
                            raise RuntimeError('file', str(e))

                except Exception as e:
                    logging.error('files ' + str(e))
                    raise RuntimeError('files', str(e))

        except Exception as e:
            logging.error('upload_directory ' + str(e))
            raise RuntimeError('upload_directory', str(e))