diff --git a/elections2021/constants.py b/elections2021/constants.py index c39b48e1d94d19d4a555c6316b680c7707c7d550..f927563a1c3012ff0774f0d2b20196813e52f9c1 100644 --- a/elections2021/constants.py +++ b/elections2021/constants.py @@ -124,6 +124,7 @@ REGION_CHOICES = [(code, name) for code, slug, name, name2 in REGION_DATA] REGION_NAME_VARIANT = {code: name2 for code, slug, name, name2 in REGION_DATA} REGION_SLUGS = {slug: code for code, slug, name, name2 in REGION_DATA} REGION_OPTIONS = [(slug, name) for code, slug, name, name2 in REGION_DATA] +REGION_NAMES = [name for code, slug, name, name2 in REGION_DATA] PIRATES = "pirati" STAN = "stan" diff --git a/main/migrations/0023_mainhomepage_max_items.py b/main/migrations/0023_mainhomepage_max_items.py new file mode 100644 index 0000000000000000000000000000000000000000..371a532379959f4b81621b55481c43a487e8d27c --- /dev/null +++ b/main/migrations/0023_mainhomepage_max_items.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.7 on 2022-08-25 09:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0022_alter_mainarticlepage_region'), + ] + + operations = [ + migrations.AddField( + model_name='mainhomepage', + name='max_items', + field=models.IntegerField(default=4, verbose_name='Počet tweetů na stránce'), + ), + ] diff --git a/main/models.py b/main/models.py index a11db72b22b886baea2bf211e0acef0fc0e7a24c..f124bf7f07812e6c70fd1b68cc25e70c44ac9c7c 100644 --- a/main/models.py +++ b/main/models.py @@ -2,8 +2,9 @@ from datetime import timedelta from functools import cached_property from django.conf import settings +from django.core.paginator import Paginator from django.db import models -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, JsonResponse from django.shortcuts import render from django.utils import timezone from modelcluster.contrib.taggit import ClusterTaggableManager @@ -22,7 +23,7 @@ from wagtail.core.fields import RichTextField, StreamField from wagtail.core.models import Page from wagtailmetadata.models import MetadataPageMixin -from elections2021.constants import REGION_CHOICES # pozor, import ze sousedního modulu +from elections2021.constants import REGION_CHOICES, REGION_NAMES # pozor, import ze sousedního modulu from shared.const import RICH_TEXT_DEFAULT_FEATURES from shared.forms import SubscribeForm from shared.models import ( # MenuMixin, @@ -46,6 +47,8 @@ class ARTICLE_TYPES(models.IntegerChoices): class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, Page): + + max_items = models.IntegerField("Počet tweetů na stránce", default=4) # header contact_newcomers = models.URLField( @@ -157,9 +160,28 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, def get_context(self, request, *args, **kwargs): context = super().get_context(request, args, kwargs) - context["tweet_list"] = Tweet.objects.order_by("-twitter_id")[:4] + tweets_page = request.GET.get('page', 1) + tweet_paginator = Paginator(Tweet.objects.order_by("-twitter_id"), self.max_items) + context["tweet_list"] = tweet_paginator.get_page(tweets_page) + context["regions"] = REGION_NAMES return context + def serve(self, request, *args, **kwargs): + + if not request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest': + return super().serve(request, *args, **kwargs) + tweet_paginator = Paginator(Tweet.objects.order_by("-twitter_id"), self.max_items) + tweet_page = tweet_paginator.get_page(request.GET.get('page', 1)) + context = { + "tweet_list": tweet_page.object_list + } + html_content = render(request, 'main/includes/twitter_widget.html', context).content + data = { + 'html': html_content.decode("utf-8"), + 'last_page': tweet_page.paginator.num_pages, + } + return JsonResponse(data=data, safe=False) + @cached_property def newsletter_subscribe_url(self): return self.url + self.reverse_subpage("newsletter_subscribe") diff --git a/main/templates/main/blocks/regions_block.html b/main/templates/main/blocks/regions_block.html index 0b50ce791ea0a7b1fff93d318d40a92bb020e751..319fc11753d62b7c7d2e643ca1611afe006f54bb 100644 --- a/main/templates/main/blocks/regions_block.html +++ b/main/templates/main/blocks/regions_block.html @@ -13,9 +13,9 @@ <div class="select"> <select class="select__control form-field__control" value=""> <option>Všechny kraje</option> - <option>Option 2</option>{# TODO REGION choices from models #} - <option>Option 3</option> - <option>Option 4</option> + {% for region in regions %} + <option>{{ region }}</option> + {% endfor %} </select> </div> diff --git a/main/templates/main/blocks/twitter_block.html b/main/templates/main/blocks/twitter_block.html index 613125509db2b584dc3e664fecbcc9604266e898..213901c57493c47b9644c554943830ba55155ede 100644 --- a/main/templates/main/blocks/twitter_block.html +++ b/main/templates/main/blocks/twitter_block.html @@ -2,32 +2,48 @@ <h2 class="head-7xl text-center mb-6 xl:mb-28"> {{ self.title }} </h2> - <div class="flex flex-wrap justify-center mb-8 lg:mb-24"> - {% for tweet in tweet_list %} - <div class="w-full flex max-w-xs"> - <div class="p-4 flex flex-col items-center text-center border border-grey-100"> - <img - class="rounded-full shadow-sm w-12 mb-2" - src="{{ tweet.author_img_url }}" - alt="user image" - /> - <h5 class="font-alt mb-2"> - {{ tweet.author_name }} - </h5> - <small class="mb-4 text-turquoise-400"> - {{ tweet.author_username }} - </small> - <p class="text-base leading-6 mb-2"> - {{ tweet.text }} - </p> - <a href="" class="hover:no-underline"> - <i class="ico--twitter text-turquoise-400 text-xl"></i> - </a> - </div> + <div class="tweets-list"> + {% include 'main/includes/twitter_widget.html' with tweet_list=tweet_list %} + </div> + {% if tweet_list.has_next %} + <div class="text-center"> + <a id="load-more-tweets" + href="#" + data-url="{{ page_url }}?page=" + data-page="{{ tweet_list.next_page_number }}" + class="btn btn__slide__wrap"> + <span class="btn text-sm bg-black text-white w-32 lg:text-base"> + Zobrazit další + </span> + <span class="btn text-sm bg-white text-black w-32 lg:text-base"> + Zobrazit další + </span> + </a> </div> - {% endfor %} - </div> - <div class="flex justify-center"> - {% include 'main/includes/button_animated.html' with btn_text="Zobrazit další" %} - </div> + {% endif %} </div> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> +<script type="text/javascript"> + $('#load-more-tweets').click(function (e) { + + e.preventDefault(); + + let $btn = $(this); + let $tweetsList = $(".tweets-list"); + + $.ajax({ + method: "GET", + processData: false, + contentType: false, + url: $(this).attr('data-url') + $(this).attr('data-page'), + }).then(function (data) { + $tweetsList.append(data.html); + + if ($(this).attr('data-page') === data.last_page) + $btn.hide(); + + $btn.attr('data-page', parseInt($btn.attr('data-page')) + 1); + + }); + }); +</script> \ No newline at end of file diff --git a/main/templates/main/includes/twitter_widget.html b/main/templates/main/includes/twitter_widget.html new file mode 100644 index 0000000000000000000000000000000000000000..87c4a77e85843d4ddcb451f059ad5c1fbcacea02 --- /dev/null +++ b/main/templates/main/includes/twitter_widget.html @@ -0,0 +1,25 @@ +<div class="flex flex-wrap justify-center mb-8 lg:mb-24"> +{% for tweet in tweet_list %} + <div class="w-full flex max-w-xs"> + <div class="p-4 flex flex-col items-center text-center border border-grey-100"> + <img + class="rounded-full shadow-sm w-12 mb-2" + src="{{ tweet.author_img_url }}" + alt="user image" + /> + <h5 class="font-alt mb-2"> + {{ tweet.author_name }} + </h5> + <small class="mb-4 text-turquoise-400"> + {{ tweet.author_username }} + </small> + <p class="text-base leading-6 mb-2"> + {{ tweet.text }} + </p> + <a href="" class="hover:no-underline"> + <i class="ico--twitter text-turquoise-400 text-xl"></i> + </a> + </div> + </div> +{% endfor %} +</div> \ No newline at end of file