Skip to content
Snippets Groups Projects
Commit 020fb8ee authored by OndraRehounek's avatar OndraRehounek
Browse files

main: getting tweets via api for usernames specified in hp settings

parent 6ee477c9
No related branches found
No related tags found
2 merge requests!607Pirati.cz,!575Feature/pirati cz
Pipeline #9272 failed
# Generated by Django 4.0.7 on 2022-08-19 10:56
import wagtail.blocks
import wagtail.fields
import wagtail.images.blocks
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("main", "0002_mainarticlepage_remove_mainhomepage_footer_and_more"),
]
operations = [
migrations.AddField(
model_name="mainhomepage",
name="twitter_usernames",
field=wagtail.fields.StreamField(
[("username", wagtail.blocks.CharBlock())],
blank=True,
use_json_field=None,
verbose_name="Uživatelská jména pro synchronizované twitter účty",
),
),
migrations.AlterField(
model_name="mainprogrampage",
name="program",
field=wagtail.fields.StreamField(
[
(
"program_group",
wagtail.blocks.StructBlock(
[
("title", wagtail.blocks.CharBlock()),
(
"point_list",
wagtail.blocks.ListBlock(
wagtail.blocks.StructBlock(
[
(
"icon",
wagtail.images.blocks.ImageChooserBlock(),
),
("title", wagtail.blocks.CharBlock()),
("text", wagtail.blocks.TextBlock()),
]
)
),
),
]
),
)
],
blank=True,
use_json_field=None,
verbose_name="Program",
),
),
]
......@@ -6,7 +6,7 @@ from modelcluster.fields import ParentalKey
from taggit.models import TaggedItemBase
from wagtail.admin.edit_handlers import FieldPanel, ObjectList, TabbedInterface
from wagtail.contrib.routable_page.models import RoutablePageMixin, route
from wagtail.core.blocks import PageChooserBlock
from wagtail.core.blocks import CharBlock, PageChooserBlock
from wagtail.core.fields import RichTextField, StreamField
from wagtail.core.models import Page
from wagtailmetadata.models import MetadataPageMixin
......@@ -82,9 +82,26 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin,
max_num=6,
)
content_panels = Page.content_panels + []
twitter_usernames = StreamField(
[("username", CharBlock())],
verbose_name="Uživatelská jména pro synchronizované twitter účty",
blank=True,
max_num=6,
)
settings_panels = [FieldPanel("matomo_id")]
content_panels = Page.content_panels + [
FieldPanel("content"),
FieldPanel("footer_social_links"),
FieldPanel("footer_other_links"),
FieldPanel("footer_person_list"),
]
settings_panels = [
FieldPanel("contact_newcomers"),
FieldPanel("donation_page"),
FieldPanel("matomo_id"),
FieldPanel("twitter_usernames"),
]
### EDIT HANDLERS
......
......@@ -21,4 +21,4 @@ class Command(BaseCommand):
)
tds.perform_update()
self.stdout.write("\nUpdating tweets finished!")
self.stdout.write("\nUpdate of tweets finished!")
import logging
from datetime import timedelta
from typing import TYPE_CHECKING
from django.utils import timezone
from tweepy import Client
from tweepy.errors import BadRequest
from main.models import MainHomePage
from .models import Tweet
if TYPE_CHECKING:
from tweepy import Tweet as TweetResponse
from tweepy import User
logger = logging.getLogger()
class TweetDownloadService:
"""
Service class starající se o update tweetů z Twitter API, v současné chvíli
bere tweety z účtu nastavených v (první) MainHomePage stránce (HP pirati.cz).
"""
client: Client
days_back: int
......@@ -25,7 +42,7 @@ class TweetDownloadService:
"""
return Tweet.objects.values_list("twitter_id", flat=True)
def get_tweets_response(self, user_id) -> list:
def get_tweets_response(self, user_id) -> list["TweetResponse"]:
"""
Vrací list tweetů (objektů) pro daného Twitter uživatele.
"""
......@@ -40,13 +57,27 @@ class TweetDownloadService:
return tweets_response.data
def get_user_response(self) -> dict:
def get_user_list_data(self) -> list["User"]:
twitter_usernames_block = MainHomePage.objects.first().twitter_usernames
user_data_list = []
for username_data in twitter_usernames_block.raw_data:
try:
user_data_list.append(self.get_user_response(username_data["value"]))
except BadRequest:
logger.error(
"Cannot download tweets for the username",
extra={"username": username_data["value"]},
)
return user_data_list
def get_user_response(self, username) -> "User":
"""
Vrací informace o uživateli "PiratskaStrana"
Tento call není až tak potřeba, pokud bychom zahardcodili ID 49022430
Vrací informace o daném uživateli.
"""
user_response = self.client.get_user(
username="PiratskaStrana",
username=username,
user_fields=["profile_image_url"], # id, name, username enabled by default
)
......@@ -56,22 +87,22 @@ class TweetDownloadService:
"""
Obaluje celý proces downloadu Tweetů z API do DB.
"""
user_data_dict = self.get_user_response()
downloaded_tweets_list = self.get_tweets_response(user_id=user_data_dict["id"])
user_data_list = self.get_user_list_data()
existing_tweet_id_list = self.get_latest_saved_tweet_id()
tweets_to_save = []
for tweet in downloaded_tweets_list:
for user_data in user_data_list:
for tweet in self.get_tweets_response(user_id=user_data.id):
if str(tweet.id) not in existing_tweet_id_list:
tweets_to_save.append(
Tweet(
author_img_url=user_data_dict["profile_image_url"],
author_name=user_data_dict["name"],
author_username=user_data_dict["username"],
author_img_url=user_data.profile_image_url,
author_name=user_data.name,
author_username=user_data.username,
text=tweet.text,
twitter_id=tweet.id,
)
) # zatím nechávám author fieldy jako default @PiratskaStrana
)
return Tweet.objects.bulk_create(tweets_to_save)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment