Skip to content
Snippets Groups Projects
Select Git revision
  • 4a1ea40466ebd88a7707d59250fcbbb61c366a98
  • test default protected
  • master protected
  • niki_edit_branch
  • feat/custom-css
  • feat/redesign-improvements-10
  • feat/redesign-improvements-8
  • feat/redesign-fixes-3
  • feat/pirstan-changes
  • feat/separate-import-thread
  • feat/dary-improvements
  • features/add-pdf-page
  • features/add-typed-table
  • features/fix-broken-calendar-categories
  • features/add-embed-to-articles
  • features/create-mastodon-feed-block
  • features/add-custom-numbering-for-candidates
  • features/add-timeline
  • features/create-wordcloud-from-article-page
  • features/create-collapsible-extra-legal-info
  • features/extend-hero-banner
21 results

apps.py

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