Coverage for cookbook/views/data.py: 30%
88 statements
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
1import uuid
2from datetime import datetime
4from django.contrib import messages
5from django.http import HttpResponseRedirect
6from django.shortcuts import redirect, render
7from django.urls import reverse
8from django.utils import timezone
9from django.utils.translation import gettext as _
10from django.utils.translation import ngettext
11from django_tables2 import RequestConfig
12from oauth2_provider.models import AccessToken
14from cookbook.forms import BatchEditForm, SyncForm
15from cookbook.helper.permission_helper import (above_space_limit, group_required,
16 has_group_permission)
17from cookbook.models import BookmarkletImport, Recipe, RecipeImport, Sync
18from cookbook.tables import SyncTable
19from recipes import settings
22@group_required('user')
23def sync(request):
24 limit, msg = above_space_limit(request.space)
25 if limit:
26 messages.add_message(request, messages.WARNING, msg)
27 return HttpResponseRedirect(reverse('index'))
29 if request.space.demo or settings.HOSTED:
30 messages.add_message(request, messages.ERROR, _('This feature is not yet available in the hosted version of tandoor!'))
31 return redirect('index')
33 if request.method == "POST":
34 if not has_group_permission(request.user, ['admin']):
35 messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
36 return HttpResponseRedirect(reverse('data_sync'))
37 form = SyncForm(request.POST, space=request.space)
38 if form.is_valid():
39 new_path = Sync()
40 new_path.path = form.cleaned_data['path']
41 new_path.storage = form.cleaned_data['storage']
42 new_path.last_checked = datetime.now()
43 new_path.space = request.space
44 new_path.save()
45 return redirect('data_sync')
46 else:
47 form = SyncForm(space=request.space)
49 monitored_paths = SyncTable(Sync.objects.filter(space=request.space).all())
50 RequestConfig(request, paginate={'per_page': 25}).configure(monitored_paths)
52 return render(request, 'batch/monitor.html', {'form': form, 'monitored_paths': monitored_paths})
55@group_required('user')
56def sync_wait(request):
57 return render(request, 'batch/waiting.html')
60@group_required('user')
61def batch_import(request):
62 imports = RecipeImport.objects.filter(space=request.space).all()
63 for new_recipe in imports:
64 recipe = Recipe(
65 name=new_recipe.name,
66 file_path=new_recipe.file_path,
67 storage=new_recipe.storage,
68 file_uid=new_recipe.file_uid,
69 created_by=request.user,
70 space=request.space
71 )
72 recipe.save()
73 new_recipe.delete()
75 return redirect('list_recipe_import')
78@group_required('user')
79def batch_edit(request):
80 if request.method == "POST":
81 form = BatchEditForm(request.POST, space=request.space)
82 if form.is_valid():
83 word = form.cleaned_data['search']
84 keywords = form.cleaned_data['keywords']
86 recipes = Recipe.objects.filter(name__icontains=word, space=request.space)
87 count = 0
88 for recipe in recipes:
89 edit = False
90 if keywords.__sizeof__() > 0:
91 recipe.keywords.add(*list(keywords))
92 edit = True
93 if edit:
94 count = count + 1
96 recipe.save()
98 msg = ngettext(
99 'Batch edit done. %(count)d recipe was updated.',
100 'Batch edit done. %(count)d Recipes where updated.',
101 count) % {
102 'count': count,
103 }
104 messages.add_message(request, messages.SUCCESS, msg)
106 return redirect('data_batch_edit')
107 else:
108 form = BatchEditForm(space=request.space)
110 return render(request, 'batch/edit.html', {'form': form})
113@group_required('user')
114def import_url(request):
115 limit, msg = above_space_limit(request.space)
116 if limit:
117 messages.add_message(request, messages.WARNING, msg)
118 return HttpResponseRedirect(reverse('index'))
120 if (api_token := AccessToken.objects.filter(user=request.user, scope='bookmarklet').first()) is None:
121 api_token = AccessToken.objects.create(
122 user=request.user,
123 scope='bookmarklet',
124 expires=(
125 timezone.now() +
126 timezone.timedelta(
127 days=365 *
128 10)),
129 token=f'tda_{str(uuid.uuid4()).replace("-","_")}')
131 bookmarklet_import_id = -1
132 if 'id' in request.GET:
133 if bookmarklet_import := BookmarkletImport.objects.filter(id=request.GET['id']).first():
134 bookmarklet_import_id = bookmarklet_import.pk
136 return render(request, 'url_import.html', {'api_token': api_token, 'bookmarklet_import_id': bookmarklet_import_id})