import os import tempfile from wagtail.admin.forms import WagtailAdminPageForm from wagtail.models.media import Collection from shared.forms import JekyllImportForm as SharedJekyllImportForm from shared.forms import ArticlesPageForm as SharedArticlesPageForm from django.forms import ModelMultipleChoiceField, CheckboxSelectMultiple from modelcluster.forms import ClusterForm from .tasks import import_jekyll_articles, import_people_from_group class JekyllImportForm(SharedJekyllImportForm): def handle_import(self): lock_file_name = os.path.join( tempfile.gettempdir(), f".{self.instance.id}.articles-import-lock" ) if os.path.isfile(lock_file_name): return open(lock_file_name, "w").close() import_jekyll_articles.delay( article_parent_page_id=self.instance.id, collection_id=self.cleaned_data["collection"].id, url=self.cleaned_data["jekyll_repo_url"], dry_run=self.cleaned_data["dry_run"], use_git=True, ) class DistrictPeoplePageForm(WagtailAdminPageForm): def save(self, *args, **kwargs): # If anything inside the content field has changed, # sync Octopus profiles just in case. if "content" in self.changed_data: collection_id = self.instance.root_page.image_collection_id if collection_id is None: collection_id = Collection.objects.first().id for shortcut in self.instance.get_syncable_octopus_groups(): import_people_from_group.delay( self.instance.id, collection_id, shortcut, ) return super().save(*args, **kwargs) class DistrictArticlesPageForm(SharedArticlesPageForm, JekyllImportForm): def __init__(self, *args, **kwargs): from .models import DistrictArticleTag from shared.models import SharedTag super().__init__(*args, **kwargs) self.fields["shared_tags"].queryset = SharedTag.objects.order_by("name") if self.instance.pk: valid_tag_ids = list(DistrictArticleTag.objects.filter( content_object__in=self.instance.get_children().specific() ).values_list('tag_id', flat=True).distinct().all()) valid_tag_ids += list(self.instance.shared_tags.all()) self.fields['displayed_tags'].queryset = DistrictArticleTag.objects.filter(id__in=valid_tag_ids).order_by("tag__name").distinct("tag__name")