1from __future__ import absolute_import
2
3from django.http import HttpResponse
4from django.views.generic.edit import UpdateView, DeleteView, CreateView
5
6from rules.contrib.views import permission_required, objectgetter
7from rules.contrib.views import LoginRequiredMixin, PermissionRequiredMixin
8
9from .models import Book
10
11
12class BookMixin(object):
13    def get_object(self):
14        return Book.objects.get(pk=self.kwargs['book_id'])
15
16
17class BookMixinWithError(object):
18    def get_object(self):
19        raise AttributeError('get_object')
20
21
22@permission_required('testapp.change_book', fn=objectgetter(Book, 'book_id'))
23def change_book(request, book_id):
24    return HttpResponse('OK')
25
26
27
28class BookCreateView(LoginRequiredMixin, PermissionRequiredMixin, BookMixin, CreateView):
29    fields = ['title']
30    template_name = 'empty.html'
31    permission_required = 'testapp.create_book'
32
33
34class BookUpdateView(LoginRequiredMixin, PermissionRequiredMixin, BookMixin, UpdateView):
35    fields = ['title']
36    template_name = 'empty.html'
37    permission_required = 'testapp.change_book'
38
39
40class BookUpdateErrorView(LoginRequiredMixin, PermissionRequiredMixin, BookMixinWithError, UpdateView):
41    fields = ['title']
42    template_name = 'empty.html'
43    permission_required = 'testapp.change_book'
44
45
46@permission_required('testapp.delete_book', fn=objectgetter(Book, 'book_id'))
47def delete_book(request, book_id):
48    return HttpResponse('OK')
49
50
51class BookDeleteView(LoginRequiredMixin, PermissionRequiredMixin, BookMixin, DeleteView):
52    template_name = 'empty.html'
53    permission_required = 'testapp.delete_book'
54
55
56@permission_required('testapp.delete_book', fn=objectgetter(Book, 'book_id'), raise_exception=True)
57def view_that_raises(request, book_id):
58    return HttpResponse('OK')
59
60
61class ViewThatRaises(LoginRequiredMixin, PermissionRequiredMixin, BookMixin, DeleteView):
62    template_name = 'empty.html'
63    raise_exception = True
64    permission_required = 'testapp.delete_book'
65
66
67@permission_required(['testapp.change_book', 'testapp.delete_book'], fn=objectgetter(Book, 'book_id'))
68def view_with_permission_list(request, book_id):
69    return HttpResponse('OK')
70
71
72class ViewWithPermissionList(LoginRequiredMixin, PermissionRequiredMixin, BookMixin, DeleteView):
73    template_name = 'empty.html'
74    permission_required = ['testapp.change_book', 'testapp.delete_book']
75
76
77@permission_required('testapp.delete_book', fn=objectgetter(Book, 'book_id'))
78def view_with_object(request, book_id):
79    return HttpResponse('OK')
80