Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • to/majak
  • b1242/majak
2 results
Show changes
Commits on Source (18)
Showing
with 121578 additions and 11 deletions
......@@ -137,9 +137,15 @@ dmypy.json
# Cython debug symbols
cython_debug/
# Requests-cache
redmine_cache.sqlite
#####################################################
# CUSTOM
# requests cache
instagram_cache.sqlite
# direnv
.envrc
......
......@@ -3,4 +3,4 @@
line_length = 88
multi_line_output = 3
include_trailing_comma = true
known_third_party = PyPDF2,arrow,bleach,bs4,captcha,celery,dateutil,django,environ,faker,fastjsonschema,icalevnt,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,taggit,tweepy,wagtail,wagtailmetadata,weasyprint,yaml
known_third_party = PyPDF2,arrow,bleach,bs4,captcha,celery,dateutil,django,environ,faker,fastjsonschema,icalevents,markdown,modelcluster,pirates,pytest,pytz,requests,requests_cache,sentry_sdk,taggit,wagtail,wagtailmetadata,weasyprint,yaml
......@@ -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ě
......
......@@ -3,7 +3,7 @@ from datetime import date, timedelta
import arrow
from django.db import migrations
from icalevnt import icalevents
from icalevents import icalevents
from calendar_utils.parser import process_event_list
......
......@@ -4,7 +4,7 @@ from datetime import date, timedelta
import arrow
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from icalevnt import icalevents
from icalevents import icalevents
from .parser import process_event_list
......
......@@ -7,7 +7,7 @@ import bleach
from django.conf import settings
if TYPE_CHECKING:
from icalevnt.icalparser import Event
from icalevents.icalparser import Event
EVENT_KEYS = ("start", "end", "all_day", "summary", "description", "location")
......
# Generated by Django 4.1.6 on 2023-02-28 07:51
from django.db import migrations
import wagtail.blocks
import wagtail.fields
import wagtail.images.blocks
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('district', '0105_alter_districtarticlepage_content'),
("district", "0105_alter_districtarticlepage_content"),
]
operations = [
migrations.AlterField(
model_name='districtcrossroadpage',
name='cards_content',
field=wagtail.fields.StreamField([('cards', wagtail.blocks.StructBlock([('headline', wagtail.blocks.CharBlock(label='Titulek bloku', required=False)), ('card_items', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictArticlePage', 'district.DistrictArticlesPage', 'district.DistrictCenterPage', 'district.DistrictContactPage', 'district.DistrictCrossroadPage', 'district.DistrictCustomPage', 'district.DistrictElectionCampaignPage', 'district.DistrictElectionProgramPage', 'district.DistrictElectionRootPage', 'district.DistrictPeoplePage', 'district.DistrictPersonPage', 'district.DistrictPostElectionStrategyPage', 'district.DistrictProgramPage'], required=False)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty s odkazy'))]))], blank=True, use_json_field=True, verbose_name='Karty rozcestníku'),
model_name="districtcrossroadpage",
name="cards_content",
field=wagtail.fields.StreamField(
[
(
"cards",
wagtail.blocks.StructBlock(
[
(
"headline",
wagtail.blocks.CharBlock(
label="Titulek bloku", required=False
),
),
(
"card_items",
wagtail.blocks.ListBlock(
wagtail.blocks.StructBlock(
[
(
"image",
wagtail.images.blocks.ImageChooserBlock(
label="Obrázek"
),
),
(
"title",
wagtail.blocks.CharBlock(
label="Titulek", required=True
),
),
(
"text",
wagtail.blocks.RichTextBlock(
label="Krátký text pod nadpisem",
required=False,
),
),
(
"page",
wagtail.blocks.PageChooserBlock(
label="Stránka",
page_type=[
"district.DistrictArticlePage",
"district.DistrictArticlesPage",
"district.DistrictCenterPage",
"district.DistrictContactPage",
"district.DistrictCrossroadPage",
"district.DistrictCustomPage",
"district.DistrictElectionCampaignPage",
"district.DistrictElectionProgramPage",
"district.DistrictElectionRootPage",
"district.DistrictPeoplePage",
"district.DistrictPersonPage",
"district.DistrictPostElectionStrategyPage",
"district.DistrictProgramPage",
],
required=False,
),
),
(
"link",
wagtail.blocks.URLBlock(
label="Odkaz", required=False
),
),
]
),
label="Karty s odkazy",
),
),
]
),
)
],
blank=True,
use_json_field=True,
verbose_name="Karty rozcestníku",
),
),
]
......@@ -28,7 +28,7 @@
{% endif %}
<div class="card elevation-3">
<div class="card__body">
{% include "shared/person_badge_wide_snippet.html" with person_page=item.value.person title=item.value.position %}
{% include "shared/person_badge_wide_snippet.html" with person_page=item.value.person %}
</div>
</div>
</div>
......
File moved
from django.apps import AppConfig
class TwitterUtilsConfig(AppConfig):
name = "twitter_utils"
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.")
# Generated by Django 4.1.6 on 2023-04-05 17:16
from django.db import migrations, models
import instagram_utils.models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='InstagramPost',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('author_name', models.CharField(max_length=64, verbose_name='Jméno autora')),
('author_username', models.CharField(max_length=64, verbose_name='Username autora')),
('timestamp', models.DateTimeField(default=instagram_utils.models.get_current_datetime, verbose_name='Datum a čas vytvoření')),
('caption', models.TextField(blank=True, null=True, verbose_name='Popis')),
('image', models.ImageField(upload_to='instagram', verbose_name='Obrázek')),
('url', models.URLField(blank=True, null=True, verbose_name='Odkaz')),
],
options={
'ordering': ('timestamp',),
},
),
]
# Generated by Django 4.1.6 on 2023-04-05 17:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('instagram_utils', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='instagrampost',
name='remote_id',
field=models.CharField(default='', max_length=64, verbose_name='ID Postu'),
preserve_default=False,
),
]
# Generated by Django 4.1.6 on 2023-04-05 17:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('instagram_utils', '0002_instagrampost_remote_id'),
]
operations = [
migrations.AlterField(
model_name='instagrampost',
name='remote_id',
field=models.CharField(max_length=64, unique=True, verbose_name='ID Postu'),
),
]
import datetime
from django.db import models
def get_current_datetime() -> datetime.datetime:
return datetime.datetime.now(tz=datetime.timezone.utc)
class InstagramPost(models.Model):
"""
Model representing an Instgram post obtained from its API through the
update_instagram management command.
"""
remote_id = models.CharField(
verbose_name="ID Postu",
max_length=64,
unique=True,
)
timestamp = models.DateTimeField(
verbose_name="Datum a čas vytvoření",
default=get_current_datetime
)
author_name = models.CharField(
verbose_name="Jméno autora",
max_length=64,
)
author_username = models.CharField(
verbose_name="Username autora",
max_length=64,
)
caption = models.TextField(
verbose_name="Popis",
blank=True,
null=True,
)
image = models.ImageField(
verbose_name="Obrázek",
upload_to="instagram",
)
url = models.URLField(
verbose_name="Odkaz",
blank=True,
null=True,
)
def __str__(self) -> str:
return f"@{self.author_username} - {self.caption}"
class Meta:
ordering = ("timestamp",)