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
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
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
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)
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))