218 lines
7.7 KiB
Python
218 lines
7.7 KiB
Python
from django.contrib import messages
|
|
from django.db import models
|
|
from django.db.models import ProtectedError
|
|
from django.http import HttpResponseRedirect
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.urls import reverse, reverse_lazy
|
|
from django.utils.translation import gettext as _
|
|
from django.views.generic import DeleteView
|
|
|
|
from cookbook.helper.permission_helper import GroupRequiredMixin, OwnerRequiredMixin, group_required
|
|
from cookbook.models import (Comment, InviteLink, MealPlan, Recipe, RecipeBook, RecipeBookEntry,
|
|
RecipeImport, Space, Storage, Sync, UserSpace, ConnectorConfig)
|
|
from cookbook.provider.dropbox import Dropbox
|
|
from cookbook.provider.local import Local
|
|
from cookbook.provider.nextcloud import Nextcloud
|
|
|
|
|
|
class RecipeDelete(GroupRequiredMixin, DeleteView):
|
|
groups_required = ['user']
|
|
template_name = "generic/delete_template.html"
|
|
model = Recipe
|
|
success_url = reverse_lazy('index')
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
self.object = self.get_object()
|
|
# TODO make this more generic so that all delete functions benefit from this
|
|
if self.get_context_data()['protected_objects']:
|
|
return render(request, template_name=self.template_name, context=self.get_context_data())
|
|
|
|
success_url = self.get_success_url()
|
|
self.object.delete()
|
|
return HttpResponseRedirect(success_url)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RecipeDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Recipe")
|
|
|
|
# TODO make this more generic so that all delete functions benefit from this
|
|
self.object = self.get_object()
|
|
context['protected_objects'] = []
|
|
context['cascading_objects'] = []
|
|
context['set_null_objects'] = []
|
|
for x in self.object._meta.get_fields():
|
|
try:
|
|
related = x.related_model.objects.filter(**{x.field.name: self.object})
|
|
if related.exists() and x.on_delete == models.PROTECT:
|
|
context['protected_objects'].append(related)
|
|
if related.exists() and x.on_delete == models.CASCADE:
|
|
context['cascading_objects'].append(related)
|
|
if related.exists() and x.on_delete == models.SET_NULL:
|
|
context['set_null_objects'].append(related)
|
|
except AttributeError:
|
|
pass
|
|
|
|
return context
|
|
|
|
|
|
@group_required('user')
|
|
def delete_recipe_source(request, pk):
|
|
recipe = get_object_or_404(Recipe, pk=pk, space=request.space)
|
|
|
|
if recipe.storage.method == Storage.DROPBOX:
|
|
# TODO central location to handle storage type switches
|
|
Dropbox.delete_file(recipe)
|
|
if recipe.storage.method == Storage.NEXTCLOUD:
|
|
Nextcloud.delete_file(recipe)
|
|
if recipe.storage.method == Storage.LOCAL:
|
|
Local.delete_file(recipe)
|
|
|
|
recipe.storage = None
|
|
recipe.file_path = ''
|
|
recipe.file_uid = ''
|
|
recipe.save()
|
|
|
|
return HttpResponseRedirect(reverse('edit_recipe', args=[recipe.pk]))
|
|
|
|
|
|
class RecipeImportDelete(GroupRequiredMixin, DeleteView):
|
|
groups_required = ['user']
|
|
template_name = "generic/delete_template.html"
|
|
model = RecipeImport
|
|
success_url = reverse_lazy('list_recipe_import')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RecipeImportDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Import")
|
|
return context
|
|
|
|
|
|
class SyncDelete(GroupRequiredMixin, DeleteView):
|
|
groups_required = ['admin']
|
|
template_name = "generic/delete_template.html"
|
|
model = Sync
|
|
success_url = reverse_lazy('data_sync')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(SyncDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Monitor")
|
|
return context
|
|
|
|
|
|
class StorageDelete(GroupRequiredMixin, DeleteView):
|
|
groups_required = ['admin']
|
|
template_name = "generic/delete_template.html"
|
|
model = Storage
|
|
success_url = reverse_lazy('list_storage')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(StorageDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Storage Backend")
|
|
return context
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
try:
|
|
return self.delete(request, *args, **kwargs)
|
|
except ProtectedError:
|
|
messages.add_message(
|
|
request,
|
|
messages.WARNING,
|
|
_('Could not delete this storage backend as it is used in at least one monitor.') # noqa: E501
|
|
)
|
|
return HttpResponseRedirect(reverse('list_storage'))
|
|
|
|
|
|
class ConnectorConfigDelete(GroupRequiredMixin, DeleteView):
|
|
groups_required = ['admin']
|
|
template_name = "generic/delete_template.html"
|
|
model = ConnectorConfig
|
|
success_url = reverse_lazy('list_connector_config')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = _("Connectors Config Backend")
|
|
return context
|
|
|
|
|
|
class CommentDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = Comment
|
|
success_url = reverse_lazy('index')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(CommentDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Comment")
|
|
return context
|
|
|
|
|
|
class RecipeBookDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = RecipeBook
|
|
success_url = reverse_lazy('view_books')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RecipeBookDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Recipe Book")
|
|
return context
|
|
|
|
|
|
class RecipeBookEntryDelete(OwnerRequiredMixin, DeleteView):
|
|
groups_required = ['user']
|
|
template_name = "generic/delete_template.html"
|
|
model = RecipeBookEntry
|
|
success_url = reverse_lazy('view_books')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(RecipeBookEntryDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Bookmarks")
|
|
return context
|
|
|
|
|
|
class MealPlanDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = MealPlan
|
|
success_url = reverse_lazy('view_plan')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(MealPlanDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Meal-Plan")
|
|
return context
|
|
|
|
|
|
class InviteLinkDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = InviteLink
|
|
success_url = reverse_lazy('list_invite_link')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(InviteLinkDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Invite Link")
|
|
return context
|
|
|
|
|
|
class UserSpaceDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = UserSpace
|
|
success_url = reverse_lazy('view_space_overview')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(UserSpaceDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Space Membership")
|
|
return context
|
|
|
|
|
|
class SpaceDelete(OwnerRequiredMixin, DeleteView):
|
|
template_name = "generic/delete_template.html"
|
|
model = Space
|
|
success_url = reverse_lazy('view_space_overview')
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
self.object = self.get_object()
|
|
self.object.safe_delete()
|
|
return HttpResponseRedirect(self.get_success_url())
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(SpaceDelete, self).get_context_data(**kwargs)
|
|
context['title'] = _("Space")
|
|
return context
|