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
Branches
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 ...@@ -6,7 +6,7 @@ from modelcluster.fields import ParentalKey
from taggit.models import TaggedItemBase from taggit.models import TaggedItemBase
from wagtail.admin.edit_handlers import FieldPanel, ObjectList, TabbedInterface from wagtail.admin.edit_handlers import FieldPanel, ObjectList, TabbedInterface
from wagtail.contrib.routable_page.models import RoutablePageMixin, route 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.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
...@@ -82,9 +82,26 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, ...@@ -82,9 +82,26 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin,
max_num=6, 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 ### EDIT HANDLERS
......
...@@ -21,4 +21,4 @@ class Command(BaseCommand): ...@@ -21,4 +21,4 @@ class Command(BaseCommand):
) )
tds.perform_update() tds.perform_update()
self.stdout.write("\nUpdating tweets finished!") self.stdout.write("\nUpdate of tweets finished!")
import logging
from datetime import timedelta from datetime import timedelta
from typing import TYPE_CHECKING
from django.utils import timezone from django.utils import timezone
from tweepy import Client from tweepy import Client
from tweepy.errors import BadRequest
from main.models import MainHomePage
from .models import Tweet from .models import Tweet
if TYPE_CHECKING:
from tweepy import Tweet as TweetResponse
from tweepy import User
logger = logging.getLogger()
class TweetDownloadService: 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 client: Client
days_back: int days_back: int
...@@ -25,7 +42,7 @@ class TweetDownloadService: ...@@ -25,7 +42,7 @@ class TweetDownloadService:
""" """
return Tweet.objects.values_list("twitter_id", flat=True) 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. Vrací list tweetů (objektů) pro daného Twitter uživatele.
""" """
...@@ -40,13 +57,27 @@ class TweetDownloadService: ...@@ -40,13 +57,27 @@ class TweetDownloadService:
return tweets_response.data 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" Vrací informace o daném uživateli.
Tento call není až tak potřeba, pokud bychom zahardcodili ID 49022430
""" """
user_response = self.client.get_user( user_response = self.client.get_user(
username="PiratskaStrana", username=username,
user_fields=["profile_image_url"], # id, name, username enabled by default user_fields=["profile_image_url"], # id, name, username enabled by default
) )
...@@ -56,22 +87,22 @@ class TweetDownloadService: ...@@ -56,22 +87,22 @@ class TweetDownloadService:
""" """
Obaluje celý proces downloadu Tweetů z API do DB. Obaluje celý proces downloadu Tweetů z API do DB.
""" """
user_data_dict = self.get_user_response() user_data_list = self.get_user_list_data()
downloaded_tweets_list = self.get_tweets_response(user_id=user_data_dict["id"])
existing_tweet_id_list = self.get_latest_saved_tweet_id() existing_tweet_id_list = self.get_latest_saved_tweet_id()
tweets_to_save = [] 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: if str(tweet.id) not in existing_tweet_id_list:
tweets_to_save.append( tweets_to_save.append(
Tweet( Tweet(
author_img_url=user_data_dict["profile_image_url"], author_img_url=user_data.profile_image_url,
author_name=user_data_dict["name"], author_name=user_data.name,
author_username=user_data_dict["username"], author_username=user_data.username,
text=tweet.text, text=tweet.text,
twitter_id=tweet.id, twitter_id=tweet.id,
) )
) # zatím nechávám author fieldy jako default @PiratskaStrana )
return Tweet.objects.bulk_create(tweets_to_save) 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