Skip to content
Snippets Groups Projects
Commit 98c9d091 authored by jarmil's avatar jarmil Committed by jan.bednarik
Browse files

WIP: zaklad profilu lidi

parent cee4428a
No related branches found
No related tags found
2 merge requests!173Release,!134Weby pro MS
......@@ -71,6 +71,8 @@ class DistrictHomePage(MetadataPageMixin, Page):
### RELATIONS
subpage_types = [
"shared.Article",
"shared.PersonPage",
"shared.PeoplePage",
"DistrictArticles",
]
......
<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>
......@@ -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">
......
{% 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 %}
{% 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 %}
# 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",),
),
]
# 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,
),
),
]
# 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",
),
),
]
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment