Skip to content
Snippets Groups Projects
Commit 468ed4b3 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

instagram sync base

parent 685fb489
No related branches found
No related tags found
3 merge requests!787Release,!743Add Redmine datasets to charts, Instagram feed to homepage,!742Add Instagram feed to homepage
Pipeline #12205 passed
Showing
with 147 additions and 12 deletions
......@@ -176,6 +176,7 @@ Přes CRON je třeba na pozadí spouštět Django `manage.py` commandy:
* `update_main_timeline_articles` - aktualizuje články na `pirati.cz` z `https://piratipracuji.cz/api/`
* `update_redmine_issues` - aktualizuje programované body MS a KS stránek napojených na Redmine (několikrát denně)
* `update_tweets` - aktualizuje tweety podle nastavení na Homepage pirati.cz - vyžaduje mít v .env TWITTER_BEARER_TOKEN, parametr --days určuje stáří tweetů (default 1)
* `update_instagram` - aktualizuje Instagramové posty na Homepage pirati.cz - vyžaduje mít v .env `INSTAGRAM_APP_ID` a `INSTAGRAM_APP_SECRET`.
### Fulltextové vyhledávání v češtině
......
from django.apps import AppConfig
class InstagramUtilsConfig(AppConfig):
name = "instagram_utils"
from django.conf import settings
from django.core.management.base import BaseCommand
from ...services import InstagramDownloadService
class Command(BaseCommand):
def handle(self, *args, **options):
service = InstagramDownloadService(
app_id=settings.INSTAGRAM_APP_ID,
app_secret=settings.INSTAGRAM_APP_SECRET,
)
service.perform_update()
self.stdout.write("\nInstagram post update finished.")
from django.db import models
class InstagramPost(models.Model):
"""
Model representing an Instgram post obtained from its API through the
update_instagram management command.
"""
import logging
import requests
from main.models import MainHomePage, MainPersonPage
from .models import InstagramPost
logger = logging.getLogger()
class InstagramDownloadService:
"""
TODO
"""
def __init__(self, app_id: int, app_secret: str):
self.app_id = app_id
self.app_secret = app_secret
# https://www.instagram.com/web/search/topsearch/?context=user&count=1&query=that_snowden
# Useful Instagram username search API
def get_username_list(self) -> list[str]:
instagram_usernames_block = MainHomePage.objects.first().instagram_usernames
person_username_list = (
MainPersonPage.objects.filter(instagram_username__isnull=False)
.values_list("instagram_username", flat=True)
.distinct()
)
homepage_username_list = [
username_data["value"] for username_data in instagram_usernames_block.raw_data
]
# kvůli duplicitám udělám(e) list/set/list konverzi
return list({*person_username_list, *homepage_username_list})
def convert_usernames_to_ids(self, username_list) -> list[str]:
user_ids = []
for username in username_list:
print(username)
return user_ids
def perform_update(self) -> None:
username_list = self.get_username_list()
user_ids = self.convert_usernames_to_ids(username_list)
# Generated by Django 4.1.7 on 2023-04-04 21:34
from django.db import migrations, models
import wagtail.blocks
import wagtail.fields
class Migration(migrations.Migration):
dependencies = [
('main', '0045_alter_mainprogrampage_program'),
]
operations = [
migrations.AddField(
model_name='mainhomepage',
name='instagram_usernames',
field=wagtail.fields.StreamField([('username', wagtail.blocks.CharBlock(label='Instagram uživatelské jméno'))], blank=True, use_json_field=True, verbose_name='Uživatelská jména pro synchronizované Instagram účty'),
),
migrations.AddField(
model_name='mainpersonpage',
name='instagram_username',
field=models.CharField(blank=True, help_text='Uživatelské jméno zadejte bez @ na začátku', max_length=32, null=True, verbose_name='Uživatelské jméno na Instagramu pro získání příspěvků'),
),
migrations.AlterField(
model_name='mainhomepage',
name='twitter_usernames',
field=wagtail.fields.StreamField([('username', wagtail.blocks.CharBlock(label='Twitter uživatelské jméno'))], blank=True, use_json_field=True, verbose_name='Uživatelská jména pro synchronizované Twitter účty'),
),
migrations.AlterField(
model_name='mainpersonpage',
name='twitter_username',
field=models.CharField(blank=True, help_text='Uživatelské jméno zadejte bez @ na začátku', max_length=32, null=True, verbose_name='Uživatelské jméno na Twitteru pro získání příspěvků'),
),
]
......@@ -136,7 +136,15 @@ class MainHomePage(
twitter_usernames = StreamField(
[("username", CharBlock(label="Twitter uživatelské jméno"))],
verbose_name="Uživatelská jména pro synchronizované twitter účty",
verbose_name="Uživatelská jména pro synchronizované Twitter účty",
blank=True,
max_num=64,
use_json_field=True,
)
instagram_usernames = StreamField(
[("username", CharBlock(label="Instagram uživatelské jméno"))],
verbose_name="Uživatelská jména pro synchronizované Instagram účty",
blank=True,
max_num=64,
use_json_field=True,
......@@ -159,6 +167,7 @@ class MainHomePage(
FieldPanel("social_links"),
FieldPanel("matomo_id"),
FieldPanel("twitter_usernames"),
FieldPanel("instagram_usernames"),
]
### EDIT HANDLERS
......@@ -683,7 +692,14 @@ class MainPersonPage(ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin,
text = RichTextField()
twitter_username = models.CharField(
"Uživatelské jméno twitter pro získání příspěvků",
"Uživatelské jméno na Twitteru pro získání příspěvků",
blank=True,
null=True,
max_length=32,
help_text="Uživatelské jméno zadejte bez @ na začátku",
)
instagram_username = models.CharField(
"Uživatelské jméno na Instagramu pro získání příspěvků",
blank=True,
null=True,
max_length=32,
......
......@@ -48,6 +48,7 @@ INSTALLED_APPS = [
"maps_utils",
"redmine_utils",
"twitter_utils",
"instagram_utils",
"users",
"pirates",
"tuning",
......@@ -311,3 +312,6 @@ MAPS_UTILS_MAPPROXY_URL = env.str(
)
TWITTER_BEARER_TOKEN = env.str("TWITTER_BEARER_TOKEN", default="")
INSTAGRAM_APP_ID = env.str("INSTAGRAM_APP_ID", default="")
INSTAGRAM_APP_SECRET = env.str("INSTAGRAM_APP_SECRET", default="")
#
# This file is autogenerated by pip-compile with python 3.10
# To update, run:
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile base.in
#
......@@ -8,8 +8,6 @@ amqp==5.1.1
# via kombu
anyascii==0.3.1
# via wagtail
appnope==0.1.3
# via ipython
arrow==1.2.3
# via
# -r base.in
......
......@@ -13,7 +13,9 @@ class OverwriteStorage(get_storage_class()):
Found at https://djangosnippets.org/snippets/976/
"""
# If the filename already exists, remove it as if it was a true file system
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name
return name
......@@ -2,7 +2,7 @@
from django.db import migrations, models
import twitter_utils.storages
import shared.storages
class Migration(migrations.Migration):
......@@ -20,7 +20,7 @@ class Migration(migrations.Migration):
name="author_img",
field=models.ImageField(
null=True,
storage=twitter_utils.storages.OverwriteStorage,
storage=shared.storages.OverwriteStorage,
upload_to="twitter_accounts",
),
),
......
......@@ -2,7 +2,7 @@
from django.db import migrations, models
import twitter_utils.storages
import shared.storages
class Migration(migrations.Migration):
......@@ -15,7 +15,7 @@ class Migration(migrations.Migration):
model_name="tweet",
name="author_img",
field=models.ImageField(
storage=twitter_utils.storages.OverwriteStorage,
storage=shared.storages.OverwriteStorage,
upload_to="twitter_accounts",
),
),
......
from django.db import models
from twitter_utils.storages import OverwriteStorage
from shared.storages import OverwriteStorage
class TweetQueryset(models.QuerySet):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment