Skip to content

form_views

django_spire.knowledge.collection.views.form_views

form_view

Source code in django_spire/knowledge/collection/views/form_views.py
@permission_required('django_spire_knowledge.add_collection')
def form_view(
    request: WSGIRequest, pk: int = 0, parent_pk: int | None = None
) -> TemplateResponse | HttpResponseRedirect:
    collection = get_object_or_null_obj(Collection, pk=pk)

    nav = CollectionNavigation()
    nav.page_title = 'Collection'
    nav.page_description = 'Edit' if pk else 'Create'

    if collection.parent or parent_pk:
        parent_collection = get_object_or_null_obj(Collection, pk=parent_pk if parent_pk else collection.parent.pk)

        add_collection_chain_breadcrumbs(nav.breadcrumbs, parent_collection)

    if pk:
        nav.breadcrumbs.add(
            name=str(collection),
            view_name='django_spire:knowledge:collection:page:top_level',
            view_kwargs={'pk': pk},
        )

    nav.breadcrumbs.add('Edit' if pk else 'Create')

    if request.method == 'POST':
        form = CollectionForm(request.POST, instance=collection)

        if form.is_valid():
            collection, _ = collection.services.save_model_obj(**form.cleaned_data)

            CollectionGroup.services.factory.replace_groups(
                request=request, group_pks=dict(request.POST).get('groups'), collection=collection
            )

            collection.services.tag.process_and_set_tags()

            if collection.parent:
                return_url = reverse(
                    'django_spire:knowledge:collection:page:top_level',
                    kwargs={'pk': collection.parent.pk},
                )
            else:
                return_url = reverse('django_spire:knowledge:page:home')

            return HttpResponseRedirect(return_url)

        show_form_errors(request, form)
    else:
        form = CollectionForm(
            instance=collection,
            initial={'parent': collection.parent.pk if collection.parent else parent_pk},
        )

    return TemplateResponse(
        request,
        context=nav.as_context() | {
            'form': form,
            'collection': collection,
            'collection_parent_pk': parent_pk,
            'group_ids': (
                list(collection.groups.all().values_list('auth_group_id', flat=True))
                if collection.id
                else []
            ),
        },
        template='django_spire/knowledge/collection/page/form_page.html',
    )