@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',
)