137 lines
4.8 KiB
Python
137 lines
4.8 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from django.contrib import messages
|
|
from django.http import HttpResponseRedirect
|
|
from django.shortcuts import redirect, render
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
from django.utils.translation import gettext as _
|
|
from django.utils.translation import ngettext
|
|
from django_tables2 import RequestConfig
|
|
from oauth2_provider.models import AccessToken
|
|
|
|
from cookbook.forms import BatchEditForm, SyncForm
|
|
from cookbook.helper.permission_helper import (above_space_limit, group_required,
|
|
has_group_permission)
|
|
from cookbook.models import BookmarkletImport, Recipe, RecipeImport, Sync
|
|
from cookbook.tables import SyncTable
|
|
from recipes import settings
|
|
|
|
|
|
@group_required('user')
|
|
def sync(request):
|
|
limit, msg = above_space_limit(request.space)
|
|
if limit:
|
|
messages.add_message(request, messages.WARNING, msg)
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
if request.space.demo or settings.HOSTED:
|
|
messages.add_message(request, messages.ERROR, _('This feature is not yet available in the hosted version of tandoor!'))
|
|
return redirect('index')
|
|
|
|
if request.method == "POST":
|
|
if not has_group_permission(request.user, ['admin']):
|
|
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
|
|
return HttpResponseRedirect(reverse('data_sync'))
|
|
form = SyncForm(request.POST, space=request.space)
|
|
if form.is_valid():
|
|
new_path = Sync()
|
|
new_path.path = form.cleaned_data['path']
|
|
new_path.storage = form.cleaned_data['storage']
|
|
new_path.last_checked = datetime.now()
|
|
new_path.space = request.space
|
|
new_path.save()
|
|
return redirect('data_sync')
|
|
else:
|
|
form = SyncForm(space=request.space)
|
|
|
|
monitored_paths = SyncTable(Sync.objects.filter(space=request.space).all())
|
|
RequestConfig(request, paginate={'per_page': 25}).configure(monitored_paths)
|
|
|
|
return render(request, 'batch/monitor.html', {'form': form, 'monitored_paths': monitored_paths})
|
|
|
|
|
|
@group_required('user')
|
|
def sync_wait(request):
|
|
return render(request, 'batch/waiting.html')
|
|
|
|
|
|
@group_required('user')
|
|
def batch_import(request):
|
|
imports = RecipeImport.objects.filter(space=request.space).all()
|
|
for new_recipe in imports:
|
|
recipe = Recipe(
|
|
name=new_recipe.name,
|
|
file_path=new_recipe.file_path,
|
|
storage=new_recipe.storage,
|
|
file_uid=new_recipe.file_uid,
|
|
created_by=request.user,
|
|
space=request.space
|
|
)
|
|
recipe.save()
|
|
new_recipe.delete()
|
|
|
|
return redirect('list_recipe_import')
|
|
|
|
|
|
@group_required('user')
|
|
def batch_edit(request):
|
|
if request.method == "POST":
|
|
form = BatchEditForm(request.POST, space=request.space)
|
|
if form.is_valid():
|
|
word = form.cleaned_data['search']
|
|
keywords = form.cleaned_data['keywords']
|
|
|
|
recipes = Recipe.objects.filter(name__icontains=word, space=request.space)
|
|
count = 0
|
|
for recipe in recipes:
|
|
edit = False
|
|
if keywords.__sizeof__() > 0:
|
|
recipe.keywords.add(*list(keywords))
|
|
edit = True
|
|
if edit:
|
|
count = count + 1
|
|
|
|
recipe.save()
|
|
|
|
msg = ngettext(
|
|
'Batch edit done. %(count)d recipe was updated.',
|
|
'Batch edit done. %(count)d Recipes where updated.',
|
|
count) % {
|
|
'count': count,
|
|
}
|
|
messages.add_message(request, messages.SUCCESS, msg)
|
|
|
|
return redirect('data_batch_edit')
|
|
else:
|
|
form = BatchEditForm(space=request.space)
|
|
|
|
return render(request, 'batch/edit.html', {'form': form})
|
|
|
|
|
|
@group_required('user')
|
|
def import_url(request):
|
|
limit, msg = above_space_limit(request.space)
|
|
if limit:
|
|
messages.add_message(request, messages.WARNING, msg)
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
if (api_token := AccessToken.objects.filter(user=request.user, scope='bookmarklet').first()) is None:
|
|
api_token = AccessToken.objects.create(
|
|
user=request.user,
|
|
scope='bookmarklet',
|
|
expires=(
|
|
timezone.now() +
|
|
timezone.timedelta(
|
|
days=365 *
|
|
10)),
|
|
token=f'tda_{str(uuid.uuid4()).replace("-","_")}')
|
|
|
|
bookmarklet_import_id = -1
|
|
if 'id' in request.GET:
|
|
if bookmarklet_import := BookmarkletImport.objects.filter(id=request.GET['id']).first():
|
|
bookmarklet_import_id = bookmarklet_import.pk
|
|
|
|
return render(request, 'url_import.html', {'api_token': api_token, 'bookmarklet_import_id': bookmarklet_import_id})
|