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

1import uuid 

2from datetime import datetime 

3 

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 

13 

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 

20 

21 

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

28 

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

32 

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) 

48 

49 monitored_paths = SyncTable(Sync.objects.filter(space=request.space).all()) 

50 RequestConfig(request, paginate={'per_page': 25}).configure(monitored_paths) 

51 

52 return render(request, 'batch/monitor.html', {'form': form, 'monitored_paths': monitored_paths}) 

53 

54 

55@group_required('user') 

56def sync_wait(request): 

57 return render(request, 'batch/waiting.html') 

58 

59 

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() 

74 

75 return redirect('list_recipe_import') 

76 

77 

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'] 

85 

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 

95 

96 recipe.save() 

97 

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) 

105 

106 return redirect('data_batch_edit') 

107 else: 

108 form = BatchEditForm(space=request.space) 

109 

110 return render(request, 'batch/edit.html', {'form': form}) 

111 

112 

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

119 

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("-","_")}') 

130 

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 

135 

136 return render(request, 'url_import.html', {'api_token': api_token, 'bookmarklet_import_id': bookmarklet_import_id})