import os import tempfile from wagtail.admin.forms import WagtailAdminPageForm from wagtail.models.media import Collection from shared.forms import ArticlesPageForm as SharedArticlesPageForm from shared.forms import JekyllImportForm as SharedJekyllImportForm from .tasks import ( import_jekyll_articles, import_manual_person, 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 group in self.instance.get_syncable_octopus_groups(): import_people_from_group.delay( self.instance.id, collection_id, group["shortcut"], group["title"], ) return super().save(*args, **kwargs) class DistrictManualOctopusPersonPageForm(WagtailAdminPageForm): def save(self, *args, **kwargs): # Sync every time this type page is saved, just in case. collection_id = self.instance.root_page.image_collection_id if collection_id is None: collection_id = Collection.objects.first().id import_manual_person.delay( self.instance.id, collection_id, ) return super().save(*args, **kwargs) class DistrictArticlesPageForm(SharedArticlesPageForm, JekyllImportForm): def __init__(self, *args, **kwargs): from shared.models import SharedTag from .models import DistrictArticleTag 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_shared_tag_ids = ( self.instance.shared_tags.values_list("id", flat=True).distinct().all() ) self.fields["displayed_tags"].queryset = ( DistrictArticleTag.objects.filter(id__in=valid_tag_ids) .order_by("tag__name") .distinct("tag__name") ) self.fields["displayed_shared_tags"].queryset = ( SharedTag.objects.filter(id__in=valid_shared_tag_ids) .order_by("name") .distinct("name") ) else: self.fields["displayed_tags"].queryset = DistrictArticleTag.objects.filter( id=-1 ) self.fields["displayed_shared_tags"].queryset = SharedTag.objects.filter( id=-1 )