Skip to content
Snippets Groups Projects
Select Git revision
  • 476834328181024a8776e597d140d2545622d548
  • master default protected
2 results

CF.pm

Blame
  • models.py 2.48 KiB
    import datetime
    import logging
    import mimetypes
    import uuid
    
    from django.conf import settings
    from django.db import models
    
    
    def get_current_datetime() -> datetime.datetime:
        return datetime.datetime.now(tz=datetime.timezone.utc)
    
    
    logger = logging.getLogger(__name__)
    
    
    def get_instagram_image_path(instance, filename) -> str:
        mimetypes_instance = mimetypes.MimeTypes()
        guessed_type = mimetypes_instance.guess_type(filename, strict=False)[0]
    
        extension = ""
    
        if guessed_type is not None:
            for mapper in mimetypes_instance.types_map_inv:
                if guessed_type not in mapper:
                    continue
    
                extension = mapper[guessed_type]
    
                if isinstance(extension, list):
                    extension = extension[0]
    
                break
    
        return f"instagram/{uuid.uuid4()}{extension}"
    
    
    class InstagramPost(models.Model):
        """
        Model representing an Instgram post obtained from its API through the
        update_instagram management command.
        """
    
        remote_id = models.CharField(
            verbose_name="ID Postu",
            max_length=64,
            unique=True,
        )
        timestamp = models.DateTimeField(
            verbose_name="Datum a čas vytvoření", default=get_current_datetime
        )
    
        author_name = models.CharField(
            verbose_name="Jméno autora",
            max_length=64,
        )
        author_username = models.CharField(
            verbose_name="Username autora",
            max_length=64,
        )
    
        caption = models.TextField(
            verbose_name="Popis",
            blank=True,
            null=True,
        )
        image = models.ImageField(
            verbose_name="Obrázek",
            upload_to=get_instagram_image_path,
        )
        url = models.URLField(
            verbose_name="Odkaz",
            blank=True,
            null=True,
        )
    
        def __str__(self) -> str:
            return f"@{self.author_username} - {self.caption}"
    
        class Meta:
            ordering = ("timestamp",)
    
    
    class InstagramMixin(models.Model):
        def save(self, *args, **kwargs):
            """
            Update Instagram posts when saved, assume they are declared
            """
    
            from .services import InstagramDownloadService
    
            try:
                service = InstagramDownloadService(
                    app_id=settings.INSTAGRAM_APP_ID,
                    app_secret=settings.INSTAGRAM_APP_SECRET,
                )
                service.perform_update()
            except Exception:
                logger.error("Instagram post update failed", exc_info=True)
    
            super().save(*args, **kwargs)
    
        class Meta:
            abstract = True