diff --git a/src/newsreader/news/collection/choices.py b/src/newsreader/news/collection/choices.py index 47e304e..8a129de 100644 --- a/src/newsreader/news/collection/choices.py +++ b/src/newsreader/news/collection/choices.py @@ -6,3 +6,9 @@ class RuleTypeChoices(TextChoices): feed = "feed", _("Feed") subreddit = "subreddit", _("Subreddit") twitter = "twitter", _("Twitter") + + +class TwitterPostTypeChoices(TextChoices): + photo = "photo", _("Poto") + video = "video", _("Video") + animated_gif = "animated_gif", _("GIF") diff --git a/src/newsreader/news/collection/tests/twitter/builder/mocks.py b/src/newsreader/news/collection/tests/twitter/builder/mocks.py index bacaabb..6c17fef 100644 --- a/src/newsreader/news/collection/tests/twitter/builder/mocks.py +++ b/src/newsreader/news/collection/tests/twitter/builder/mocks.py @@ -286,7 +286,7 @@ image_mock = [ "retweet_count": 427, "retweeted": False, "source": 'Twitter for iPhone', - "text": "_ https://t.co/VjEeDrL1iA", + "full_text": "_ https://t.co/VjEeDrL1iA", "truncated": False, "user": { "contributors_enabled": False, diff --git a/src/newsreader/news/collection/tests/twitter/builder/tests.py b/src/newsreader/news/collection/tests/twitter/builder/tests.py index c27edb0..e941a36 100644 --- a/src/newsreader/news/collection/tests/twitter/builder/tests.py +++ b/src/newsreader/news/collection/tests/twitter/builder/tests.py @@ -9,7 +9,10 @@ from django.utils.html import format_html import pytz from newsreader.news.collection.tests.factories import TwitterProfileFactory -from newsreader.news.collection.tests.twitter.builder.mocks import simple_mock +from newsreader.news.collection.tests.twitter.builder.mocks import ( + image_mock, + simple_mock, +) from newsreader.news.collection.twitter import TWITTER_URL, TwitterBuilder from newsreader.news.core.models import Post @@ -67,9 +70,43 @@ class TwitterBuilderTestCase(TestCase): # Note that only one media type can be uploaded to an Tweet # see https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/extended-entities-object - @skip("Not implemented") def test_images_in_post(self): - pass + builder = TwitterBuilder + + profile = TwitterProfileFactory(screen_name="RobertsSpaceInd") + mock_stream = MagicMock(rule=profile) + + with builder((image_mock, mock_stream)) as builder: + builder.save() + + posts = {post.remote_identifier: post for post in Post.objects.all()} + + self.assertCountEqual(("1269039237166321664",), posts.keys()) + + post = posts["1269039237166321664"] + + full_text = "_ https://t.co/VjEeDrL1iA" + + self.assertEquals(post.rule, profile) + self.assertEquals(post.title, full_text) + + self.assertEquals(post.author, "RobertsSpaceInd") + self.assertEquals( + post.url, f"{TWITTER_URL}/RobertsSpaceInd/1269039237166321664" + ) + self.assertEquals( + post.publication_date, pytz.utc.localize(datetime(2020, 6, 5, 22, 51, 46)) + ) + + self.assertIn(full_text, post.body) + self.assertIn( + f"
1269039233072689152
", + post.body, + ) + self.assertIn( + f"
1269039233068527618
", + post.body, + ) @skip("Not implemented") def test_videos_in_post(self): diff --git a/src/newsreader/news/collection/twitter.py b/src/newsreader/news/collection/twitter.py index a33fc84..76e2457 100644 --- a/src/newsreader/news/collection/twitter.py +++ b/src/newsreader/news/collection/twitter.py @@ -6,7 +6,7 @@ from django.utils.html import format_html import pytz from newsreader.news.collection.base import Builder, Client, Collector, Stream -from newsreader.news.collection.choices import RuleTypeChoices +from newsreader.news.collection.choices import RuleTypeChoices, TwitterPostTypeChoices from newsreader.news.core.models import Post @@ -37,11 +37,27 @@ class TwitterBuilder(Builder): publication_date = pytz.utc.localize( datetime.strptime(post["created_at"], "%a %b %d %H:%M:%S +0000 %Y") ) + body = "" + + if "extended_entities" in post: + media_entities = post["extended_entities"]["media"] + + for media_entity in media_entities: + media_type = media_entity["type"] + media_url = media_entity["media_url_https"] + title = media_entity["id_str"] + + if media_type == TwitterPostTypeChoices.photo: + html_fragment = f"
{title}
" + + body += format_html(html_fragment) + + body += format_html(post["full_text"]) data = { "remote_identifier": remote_identifier, "title": truncatechars(post["full_text"], 40), - "body": format_html(post["full_text"]), + "body": body, "author": rule.screen_name, "publication_date": publication_date, "url": (f"{TWITTER_URL}/{rule.screen_name}/{remote_identifier}"),