import requests from django.db import models from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.fields import ParentalKey from taggit.models import TaggedItemBase from wagtail.admin.edit_handlers import FieldPanel, HelpPanel from wagtail.core.models import Page from wagtail.images.edit_handlers import ImageChooserPanel from wagtailmetadata.models import MetadataPageMixin class ArticleTag(TaggedItemBase): content_object = ParentalKey("shared.Article", on_delete=models.CASCADE) class Article(MetadataPageMixin, Page): """ Univerzalni clanek pro vsechny weby """ ### FIELDS perex = models.CharField("perex", max_length=250, blank=True) text = models.TextField("text článku", blank=True) image = models.ForeignKey( "wagtailimages.Image", on_delete=models.PROTECT, blank=True, null=True, verbose_name="obrázek", ) author = models.TextField("autor článku", blank=True) tags = ClusterTaggableManager(through=ArticleTag, blank=True) ### PANELS content_panels = Page.content_panels + [ FieldPanel("perex"), FieldPanel("text"), HelpPanel( """Text článku lze formátovat s použitím <a href="https://www.markdownguide.org/basic-syntax/">markdown</a>""" ), FieldPanel("author"), ImageChooserPanel("image"), FieldPanel("tags"), ] class Meta: verbose_name = "Článek" class PersonPage(MetadataPageMixin, Page): """ Stranka Pirata. Snaha je zadavat tady minimum informaci o osobe a zbytek vytahovat via API z jinych zdroju, neb nechceme dalsi databazi lidi. """ # ve formatu iapi: https://iapi.pirati.cz/v1/user?username=john.doe pirate_id = models.TextField("Pirate ID osoby", blank=False) perex = models.TextField("Perex osoby", blank=True) content_panels = Page.content_panels + [ FieldPanel("pirate_id"), FieldPanel("perex"), ] def _iapi(self): """ Vrati data o osobe z piratskeho IAPI jako json TODO: neni cacheovano """ return requests.get( "https://iapi.pirati.cz/v1/user?username=%s" % self.pirate_id ).json() def _graph(self): """ Vrati data o osobe z graph.pirati.cz (forum) jako json TODO: neni cacheovano """ return requests.get("https://graph.pirati.cz/user/%s" % self.pirate_id).json() @property def name(self): return self._iapi().get("displayname") @property def email(self): return self._graph().get("email") @property def phone(self): return None # TODO @property def longtext(self): # medailonek return "Lorem ipsum dolor amet" # TODO @property def portrait(self): # profilova fotka return "https://lide.pirati.cz/media/person/61/profile/1312/2.jpg" # TODO @property def facebook(self): return "https://www.facebook.com/ales.fuksa.9" # TODO class Meta: verbose_name = "Člověk" # to zni hrde def get_context(self, request): context = super().get_context(request) # Na strance detailu cloveka se vpravo zobrazuji 3 dalsi nahodne profily # TODO udelat nahodny vyber context["random_people"] = ( self.get_siblings(inclusive=False).type(PersonPage).live().specific()[:2] ) return context class PeoplePage(MetadataPageMixin, Page): """ Stranka se zobrazenim lidi v dane organizaci TOOD: subpagemixin """ settings_panels = [] subpage_types = [ "shared.PersonPage", ] class Meta: verbose_name = "Stránka Lidé" def get_context(self, request): context = super().get_context(request) context["people"] = self.get_children().live().specific() return context