Skip to content
Snippets Groups Projects
Commit dd155df6 authored by quido.zientek's avatar quido.zientek
Browse files

[FEATURE] ajax filtering

parent 2d9910c8
No related branches found
No related tags found
3 merge requests!607Pirati.cz,!593Feature/5 ajax content na homepage,!575Feature/pirati cz
...@@ -124,6 +124,7 @@ REGION_CHOICES = [(code, name) for code, slug, name, name2 in REGION_DATA] ...@@ -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_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_SLUGS = {slug: code for code, slug, name, name2 in REGION_DATA}
REGION_OPTIONS = [(slug, name) 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" PIRATES = "pirati"
STAN = "stan" STAN = "stan"
......
# 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'),
),
]
...@@ -2,8 +2,9 @@ from datetime import timedelta ...@@ -2,8 +2,9 @@ from datetime import timedelta
from functools import cached_property from functools import cached_property
from django.conf import settings from django.conf import settings
from django.core.paginator import Paginator
from django.db import models from django.db import models
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect, JsonResponse
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone from django.utils import timezone
from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.contrib.taggit import ClusterTaggableManager
...@@ -22,7 +23,7 @@ from wagtail.core.fields import RichTextField, StreamField ...@@ -22,7 +23,7 @@ from wagtail.core.fields import RichTextField, StreamField
from wagtail.core.models import Page from wagtail.core.models import Page
from wagtailmetadata.models import MetadataPageMixin 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.const import RICH_TEXT_DEFAULT_FEATURES
from shared.forms import SubscribeForm from shared.forms import SubscribeForm
from shared.models import ( # MenuMixin, from shared.models import ( # MenuMixin,
...@@ -46,6 +47,8 @@ class ARTICLE_TYPES(models.IntegerChoices): ...@@ -46,6 +47,8 @@ class ARTICLE_TYPES(models.IntegerChoices):
class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, Page): class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, Page):
max_items = models.IntegerField("Počet tweetů na stránce", default=4)
# header # header
contact_newcomers = models.URLField( contact_newcomers = models.URLField(
...@@ -157,9 +160,28 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, ...@@ -157,9 +160,28 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin,
def get_context(self, request, *args, **kwargs): def get_context(self, request, *args, **kwargs):
context = super().get_context(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 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 @cached_property
def newsletter_subscribe_url(self): def newsletter_subscribe_url(self):
return self.url + self.reverse_subpage("newsletter_subscribe") return self.url + self.reverse_subpage("newsletter_subscribe")
......
...@@ -13,9 +13,9 @@ ...@@ -13,9 +13,9 @@
<div class="select"> <div class="select">
<select class="select__control form-field__control" value=""> <select class="select__control form-field__control" value="">
<option>Všechny kraje</option> <option>Všechny kraje</option>
<option>Option 2</option>{# TODO REGION choices from models #} {% for region in regions %}
<option>Option 3</option> <option>{{ region }}</option>
<option>Option 4</option> {% endfor %}
</select> </select>
</div> </div>
......
...@@ -2,32 +2,48 @@ ...@@ -2,32 +2,48 @@
<h2 class="head-7xl text-center mb-6 xl:mb-28"> <h2 class="head-7xl text-center mb-6 xl:mb-28">
{{ self.title }} {{ self.title }}
</h2> </h2>
<div class="flex flex-wrap justify-center mb-8 lg:mb-24"> <div class="tweets-list">
{% for tweet in tweet_list %} {% include 'main/includes/twitter_widget.html' with tweet_list=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> </div>
{% endfor %} {% if tweet_list.has_next %}
</div> <div class="text-center">
<div class="flex justify-center"> <a id="load-more-tweets"
{% include 'main/includes/button_animated.html' with btn_text="Zobrazit další" %} 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> </div>
{% endif %}
</div> </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
<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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment