-
Tomáš Valenta authoredTomáš Valenta authored
models.py 2.36 KiB
import datetime
import logging
import mimetypes
import uuid
from django.conf import settings
from django.db import models
logger = logging.getLogger()
def get_current_datetime() -> datetime.datetime:
return datetime.datetime.now(tz=datetime.timezone.utc)
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()
service.perform_update()
except Exception:
logger.error("Instagram post update failed", exc_info=True)
super().save(*args, **kwargs)
class Meta:
abstract = True