diff --git a/district/models.py b/district/models.py index bad8198cb1788b16555c176fb4e423499dab89d5..028c59a2d8f8d9899f989953e61a7394bfd9fd4e 100644 --- a/district/models.py +++ b/district/models.py @@ -71,6 +71,8 @@ class DistrictHomePage(MetadataPageMixin, Page): ### RELATIONS subpage_types = [ "shared.Article", + "shared.PersonPage", + "shared.PeoplePage", "DistrictArticles", ] diff --git a/district/templates/district/_social_icons.html b/district/templates/district/_social_icons.html new file mode 100644 index 0000000000000000000000000000000000000000..89a6083578fef4e7113d9790536395d3df629e88 --- /dev/null +++ b/district/templates/district/_social_icons.html @@ -0,0 +1,5 @@ +<a href="https://www.twitter.com/PiratskaStrana" rel="noopener noreferrer" target="_blank" title="Náš účet na Twitteru" class="social-icon "><i class="ico--twitter"></i></a> +<a href="/feed.xml" rel="noopener noreferrer" target="_blank" title="Články tohoto webu v RSS" class="social-icon "><i class="ico--feed"></i></a> +<a href=https://www.instagram.com/pirati.cz/ rel="noopener noreferrer" target="_blank" title="Instagram - Česká pirátská strana" class="social-icon "><i class="ico--instagram"></i></a> +<a href=https://www.flickr.com/photos/pirati/ rel="noopener noreferrer" target="_blank" title="Flickr - Česká pirátská strana" class="social-icon "><i class="ico--flickr"></i></a> +<a href="mailto:{{ page.root_page.contact_email|default:"info@pirati.cz" }}" class="social-icon "><i class="ico--envelope"></i></a> diff --git a/district/templates/district/base.html b/district/templates/district/base.html index d0f4b7ce69883463189a29e8688531314cd7e645..a7a65a51679e796f041dc4c990672307882ce4e8 100644 --- a/district/templates/district/base.html +++ b/district/templates/district/base.html @@ -35,31 +35,89 @@ <body> - <nav class="navbar navbar--simple __js-root"> - <ui-app inline-template> - <ui-navbar inline-template> - <div> - <div class="container container--wide navbar__content max-w-screen-xl" :class="{'navbar__content--initialized': true}"> - <div class="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0"> - <a href="/"> - <img src="{% static "uniweb/assets/images/logo-round-white.svg" %}" class="w-8" /> + <nav class="navbar __js-root"> + + <ui-app inline-template> + <ui-navbar inline-template> + <div> + <div class="container container--wide navbar__content" :class="{'navbar__content--initialized': true}"> + + <div class="navbar__brand my-4 flex items-center lg:block lg:pr-8 lg:my-0"> + <a href="https://roznov.pirati.cz/"> + <img src="https://styleguide.pir-test.eu/latest//images/logo-round-white.svg" class="w-8 lg:w-full lg:border-r lg:border-grey-300 lg:pr-8" /> + </a> + <span class="lg:hidden pl-4 font-bold text-xl">Pirátská strana</span> + </div> + + <div class="navbar__menutoggle my-4 flex justify-end lg:hidden"> + <a href="#" @click="show = !show" class="no-underline hover:no-underline"> + <i class="ico--menu text-3xl"></i> + </a> + </div> + + <div v-if="show || isLgScreenSize" class="navbar__external navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto lg:flex lg:space-x-8 lg:pb-2"> + + <div class="text-grey-200 text-sm lg:space-x-8 leading-loose lg:leading-normal"> + + <a href="https://www.pirati.cz" class="contact-line icon-link content-block--nostyle block lg:inline-block" target="_blank" rel="noopener noreferrer"> + <i class="ico--home"></i> + <span>pirati.cz</span> + </a> + + <a href="https://piratskyobchod.cz" class="contact-line icon-link content-block--nostyle block lg:inline-block" target="_blank" rel="noopener noreferrer"> + <i class="ico--cart"></i> + <span>piratskyobchod.cz</span> </a> + + <a href="http://www.piratskelisty.cz" class="contact-line icon-link content-block--nostyle block lg:inline-block" target="_blank" rel="noopener noreferrer"> + <i class="ico--newspaper"></i> + <span>Pirátské listy</span> + </a> + </div> - <div v-if="show || isLgScreenSize" class="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto"> + + <div class="social-icon-group space-x-2 text-grey-200 py-4 lg:py-0"> + {% include "district/_social_icons.html" %} + </div> + + </div> + + <div v-if="show || isLgScreenSize" class="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto"> <ul class="navbar-menu text-white"> - {% comment "Misto pro menu items " %} - <li class="navbar-menu__item"> - <a href="{% pageurl item.value.page %}" data-href="{% pageurl item.value.page %}" class="navbar-menu__link">{{ item.value.name }}</a> - </li> - {% endcomment %} + <li class="navbar-menu__item"><a href="/aktuality/" class="navbar-menu__link">Aktuality</a></li> + <li class="navbar-menu__item"><a href="/lide/" class="navbar-menu__link">Lidé</a></li> + {% comment %} + <li class="navbar-menu__item"><a href="/komunalni-program/" class="navbar-menu__link">Komunální program</a></li> + <li class="navbar-menu__item"><a href="/kontakt/" class="navbar-menu__link">Kontakt</a></li> + {% endcomment %} </ul> - </div> + </div> + + <div v-if="show || isLgScreenSize" class="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-col sm:flex-row lg:flex-col sm:space-x-4 space-y-2 sm:space-y-0 lg:space-y-2 xl:flex-row xl:space-x-2 xl:space-y-0"> + <a href="https://dary.pirati.cz/projekty-kampane/zlk-potrebuje-peci/" rel="noopener noreferrer" target="_blank" class="btn btn--icon btn--cyan-200 btn--hoveractive btn--condensed btn--fullwidth md:btn--autowidth lg:text-sm xl:text-base"> + <div class="btn__body-wrap"> + <div class="btn__body ">Přispěj</div> + <div class="btn__icon "> + <i class="ico--pig"></i> + </div> + </div> + </a> + <a href="https://nalodeni.pirati.cz" rel="noopener noreferrer" target="_blank" class="btn btn--icon btn--blue-300 btn--hoveractive btn--condensed btn--fullwidth md:btn--autowidth lg:text-sm xl:text-base"> + <div class="btn__body-wrap"> + <div class="btn__body ">Naloď se</div> + <div class="btn__icon "> + <i class="ico--anchor"></i> + </div> + </div> + </a> </div> </div> - </ui-navbar> - </ui-app> - </nav> + </div> + </ui-navbar> + </ui-app> +</nav> + {% block subheader %}{% endblock %} <div class="container container--default lg:py-4"> {% block content %}{% endblock %} </div> @@ -114,40 +172,33 @@ <section class="footer__social lg:text-right"> <div class="mb-4"> <div class="social-icon-group space-x-2 text-white pb-4"> - <a href="https://www.twitter.com/PiratskaStrana" rel="noopener noreferrer" target="_blank" title="Náš účet na Twitteru" class="social-icon "><i class="ico--twitter"></i></a> - <a href="/feed.xml" rel="noopener noreferrer" target="_blank" title="Články tohoto webu v RSS" class="social-icon "><i class="ico--feed"></i></a> - <a href=https://www.instagram.com/pirati.cz/ rel="noopener noreferrer" target="_blank" title="Instagram - Česká pirátská strana" class="social-icon "><i class="ico--instagram"></i></a> - <a href=https://www.flickr.com/photos/pirati/ rel="noopener noreferrer" target="_blank" title="Flickr - Česká pirátská strana" class="social-icon "><i class="ico--flickr"></i></a> - <a href="mailto:{{ page.root_page.contact_email|default:"info@pirati.cz" }}" class="social-icon "><i class="ico--envelope"></i></a> + {% include "district/_social_icons.html" %} </div> <a href="mailto:{{ page.root_page.contact_email|default:"info@pirati.cz" }}" class="contact-line icon-link content-block--nostyle " ><i class="ico--envelope"></i><span>Dejte nám vědět</span></a> </div> <div class="flex flex-col md:flex-row lg:flex-col lg:items-end space-y-2 lg:space-x-0 mr-0 pr-0"> + <a href="{{ page.root_page.donation_page|default:"https://dary.pirati.cz" }}" rel="noopener noreferrer" target="_blank" class="btn btn--icon btn--cyan-200 btn--hoveractive text-lg btn--fullwidth sm:btn--autowidth px-0 mx-0"> <div class="btn__body-wrap"> <div class="btn__body ">Přispěj</div> - <div class="btn__icon "> - <i class="ico--pig"></i> - </div> + <div class="btn__icon "><i class="ico--pig"></i></div> </div> </a> <a href="https://nalodeni.pirati.cz" rel="noopener noreferrer" target="_blank" class="btn btn--icon btn--blue-300 btn--hoveractive text-lg btn--fullwidth sm:btn--autowidth mt-0 px-0 mx-0"> <div class="btn__body-wrap"> <div class="btn__body ">Naloď se</div> - <div class="btn__icon "> - <i class="ico--anchor"></i> - </div> + <div class="btn__icon "><i class="ico--anchor"></i></div> </div> </a> + </div> + </section> </div> - - <section class="bg-black py-4 lg:py-12"> <div class="container container--default"> <div class="grid gap-4 grid-cols-1 md:grid-cols-2 xl:grid-cols-3"> diff --git a/district/templates/shared/people_page.html b/district/templates/shared/people_page.html new file mode 100644 index 0000000000000000000000000000000000000000..6fd3844398f5cea41e9f3eaa7c3edf178c23a265 --- /dev/null +++ b/district/templates/shared/people_page.html @@ -0,0 +1,47 @@ +{% extends "district/base.html" %} +{% load wagtailcore_tags wagtailimages_tags shared_filters %} + +{% block content %} + +<div class="container container--default py-8 lg:py-24"> + + <header> + <h1 itemprop="headline" class="head-alt-md md:head-alt-lg max-w-5xl mb-8">{{ page.title }}</h1> + </header> + + <h2 class="head-heavy-base mb-4">Členové a příznivci</h2> + + <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 row-gap-8 col-gap-8"> + {% for person in people %} + + <div class="badge "> + + <a href="/{{ person.slug }}" class="avatar badge__avatar avatar--md"> + <img src="{{ person.portrait }}" alt="{{ person.name }}" /> + </a> + + <div class="badge__body"> + <h2 class="head-heavy-xs badge__title"> + <a href="/{{person.slug}}" title="{{ person.name }}" class="content-block--nostyle"> + {{ person.name }} + </a> + </h2> + <p class="badge__occupation">{{ person.perex|linebreaksbr }}</p> + {% if person.phone %} + <a href="tel:person.phone" class="contact-line icon-link content-block--nostyle contact-line--responsive badge__link" > + <i class="ico--phone"></i> + <span>{{ person.phone }}</span> + </a> + {% endif %} + <a href="mailto:{{person.email}}" class="contact-line icon-link content-block--nostyle contact-line--responsive badge__link" > + <i class="ico--envelope"></i><span>{{person.email}}</span> + </a> + </div> + </div> + + {% endfor %} + </div> + +</div> + +{% endblock %} diff --git a/district/templates/shared/person_page.html b/district/templates/shared/person_page.html new file mode 100644 index 0000000000000000000000000000000000000000..dc960dc320f101bba78a97f5307e7d82f2655007 --- /dev/null +++ b/district/templates/shared/person_page.html @@ -0,0 +1,113 @@ +{% extends "district/base.html" %} +{% load wagtailcore_tags wagtailimages_tags shared_filters %} + +{% block subheader %} +<header class="hero hero--image pt-16 pb-24 lg:pt-32 pb-24 candidate-detail__hero" + style="--image-url: url(https://roznov.pirati.cz/assets/articles/2020/kampan20/zahajenikampan1-067fb446ec8933ae14591cbc29fc53ebb3009e4185900838bfb94752addbfa7b.jpg)" +> + + <div class="container container--default py-2"> + <h1 class="head-alt-md md:head-alt-lg max-w-2xl text-left lg:text-left px-4"> + <span class="academic-title-name">{{ page.name }}</span> + </h1> + <h2 class="head-xs mt-2 max-w-xl mx-auto text-center lg:text-left"></h2> + </div> +</header> + +{% endblock %} + +{% block content %} + +<div class="container container--default py-8 lg:pb-24"> + + <main> + <div class="flex flex-col lg:flex-row lg:space-x-8 xl:space-x-16"> + + <section class="lg:w-3/5 xl:w-2/3"> + <div class="content-block w-full"> + {{ page.longtext }} + </div> + </section> + + <section class="lg:w-2/5 xl:w-1/3 pt-8 lg:pt-0 order-first lg:order-last candidate-detail__sidebar"> + <aside class="container-padding--zero lg:container-padding--auto lg:card lg:elevation-10"> + <div class="lg:card__body p-4 lg:p-8"> + + <div class="text-center mb-8"> + <div class="avatar avatar--2xl lg:avatar--3xl avatar--bordered candidate-detail__avatar"> + <img src="{{ page.portrait }}" alt="" /> + </div> + </div> + + {% if page.facebook %} + <div class="flex flex-wrap item-center"> + <div class="social-icon-group space-x-0/5"> + <a class="social-icon" target="_blank" rel="noreferrer noopener" href="{{ page.facebook }}"><i class="ico--facebook"></i></a> + </div> + </div> + {% endif %} + + <div class="content-block"> + <hr /> + <div class="space-y-4"> + {% if page.phone %} + <div> + <h4>Telefon</h4> + <a href="tel:{{ page.phone }}" class="contact-line icon-link content-block--nostyle " > + <i class="ico--phone"></i><span>{{ page.phone }}</span> + </a> + </div> + {% endif %} + <div> + <h4>Email</h4> + <a href="mailto:{{ page.email }}" class="contact-line icon-link content-block--nostyle " > + <i class="ico--envelope"></i><span>{{ page.email }}</span> + </a> + </div> + </div> + </div> + + <hr /> + + <div class="hidden lg:block"> + + <div class="content-block"> + <h2>Lidé</h2> + </div> + + <div class="space-y-4"> + {% for person in random_people %} + <div class="badge "> + <a href="/{{ person.slug }}" class="avatar badge__avatar avatar--sm"> + <img src="{{ person.portrait }}" alt="{{ person.name }}" /> + </a> + <div class="badge__body"> + <h2 class="head-heavy-2xs badge__title"> + <a href="/{{ person.slug }}" title="{{ person.name }}" class="content-block--nostyle">{{ person.name }}</a> + </h2> + <p class="badge__occupation">{{ person.perex|linebreaksbr }}</p> + </div> + </div> + {% endfor %} + </div> + + <a href="/lide/" class="btn btn--icon btn--violet-500 btn--fullwidth btn--hoveractive pt-4" > + <div class="btn__body-wrap"> + <div class="btn__body ">Poznejte celý náš tým</div> + <div class="btn__icon "> + <i class="ico--chevron-right"></i> + </div> + </div> + </a> + + </div> + + </div> +</aside> + </section> + + </div> + </main> +</div> + +{% endblock %} diff --git a/shared/migrations/0006_personpage.py b/shared/migrations/0006_personpage.py new file mode 100644 index 0000000000000000000000000000000000000000..eaf40c5056af25b1348b0591d7ff5f9db85d1d04 --- /dev/null +++ b/shared/migrations/0006_personpage.py @@ -0,0 +1,35 @@ +# Generated by Django 3.1.1 on 2020-10-14 07:32 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wagtailcore", "0052_pagelogentry"), + ("shared", "0005_auto_20201007_1028"), + ] + + operations = [ + migrations.CreateModel( + name="PersonPage", + fields=[ + ( + "page_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="wagtailcore.page", + ), + ), + ("pirate_id", models.TextField(verbose_name="Pirate ID osoby")), + ("perex", models.TextField(blank=True, verbose_name="Perex osoby")), + ], + options={"verbose_name": "Člověk",}, + bases=("wagtailcore.page",), + ), + ] diff --git a/shared/migrations/0007_peoplepage.py b/shared/migrations/0007_peoplepage.py new file mode 100644 index 0000000000000000000000000000000000000000..154b35ddc42e72278aa48f7b5a6164a4db5e13f8 --- /dev/null +++ b/shared/migrations/0007_peoplepage.py @@ -0,0 +1,50 @@ +# Generated by Django 3.1.1 on 2020-10-14 07:54 + +import django.db.models.deletion +import wagtailmetadata.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wagtailimages", "0022_uploadedimage"), + ("wagtailcore", "0052_pagelogentry"), + ("shared", "0006_personpage"), + ] + + operations = [ + migrations.CreateModel( + name="PeoplePage", + fields=[ + ( + "page_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="wagtailcore.page", + ), + ), + ( + "search_image", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.image", + verbose_name="Search image", + ), + ), + ], + options={"verbose_name": "Stránka Lidé",}, + bases=( + wagtailmetadata.models.MetadataMixin, + "wagtailcore.page", + models.Model, + ), + ), + ] diff --git a/shared/migrations/0008_personpage_search_image.py b/shared/migrations/0008_personpage_search_image.py new file mode 100644 index 0000000000000000000000000000000000000000..d52ef3ffa403328e4537dd68a60318a1ff71f600 --- /dev/null +++ b/shared/migrations/0008_personpage_search_image.py @@ -0,0 +1,27 @@ +# Generated by Django 3.1.1 on 2020-10-14 08:55 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wagtailimages", "0022_uploadedimage"), + ("shared", "0007_peoplepage"), + ] + + operations = [ + migrations.AddField( + model_name="personpage", + name="search_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.image", + verbose_name="Search image", + ), + ), + ] diff --git a/shared/models.py b/shared/models.py index 4239110ad29e6d10926eb2fc3969e516dea43660..2956bcb271e9753ff38ecbfd4bbb30498b4f0726 100644 --- a/shared/models.py +++ b/shared/models.py @@ -1,3 +1,4 @@ +import requests from django.db import models from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.fields import ParentalKey @@ -42,7 +43,91 @@ class Article(MetadataPageMixin, Page): FieldPanel("tags"), ] - ### OTHERS - 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] + ) + print(context) + return context + + +class PeoplePage(MetadataPageMixin, Page): + """ Stranka se zobrazenim lidi v dane organizaci + TOOD: subpagemixin + """ + + settings_panels = [] + + class Meta: + verbose_name = "Stránka Lidé" + + def get_context(self, request): + context = super().get_context(request) + context["people"] = ( + self.get_siblings(inclusive=False).type(PersonPage).live().specific() + ) + return context