labelbase/django/knowledge_base/views.py
Xavier Fiechter 2c7a4d0386 .
2024-03-19 09:12:04 +01:00

78 lines
3 KiB
Python

from django.http import JsonResponse
from django.shortcuts import render
import json
from django.views.generic import View, ListView, DetailView
from .models import Category, Article, ExportSnapshot
from .forms import JSONUploadForm
from django.utils.text import slugify
class ExportJSONView(View):
def get(self, request):
categories = Category.objects.all().exclude(exclude_from_export=True)
data = {}
for category in categories:
articles = list(category.article_set.all().exclude(exclude_from_export=True).values())
data[category.name] = articles
ExportSnapshot.objects.create(
exported_data=data
)
return JsonResponse(data)
class ImportJSONView(View):
def get(self, request):
form = JSONUploadForm()
return render(request, 'knowledge_base/import_json.html', {'form': form})
def post(self, request):
form = JSONUploadForm(request.POST, request.FILES)
if form.is_valid():
json_file = request.FILES['json_file']
try:
content = json_file.read().decode('utf-8')
data = json.loads(content)
for category_name, articles in data.items():
try:
category = Category.objects.get(slug=slugify(category_name))
except Category.DoesNotExist:
category = Category.objects.create(name=category_name,
slug=slugify(category_name))
for article_data in articles:
try:
article = Article.objects.get(slug=article_data['slug'])
article.title = article_data['title']
article.content = article_data['content']
article.category = category
article.save()
except Article.DoesNotExist:
Article.objects.create(title=article_data['title'],
content=article_data['content'],
category=category,
slug=article_data['slug'])
return JsonResponse({'message': 'Import successful'})
except json.JSONDecodeError:
return JsonResponse({'error': 'Invalid JSON format'}, status=400)
else:
return JsonResponse({'error': 'Invalid form data'}, status=400)
class IndexView(ListView):
model = Category
template_name = 'knowledge_base/index.html'
context_object_name = 'categories'
class CategoryDetailView(DetailView):
model = Category
template_name = 'knowledge_base/category_detail.html'
context_object_name = 'category'
slug_url_kwarg = 'slug'
class ArticleDetailView(DetailView):
model = Article
template_name = 'knowledge_base/article_detail.html'
context_object_name = 'article'
slug_url_kwarg = 'slug'