1import os.path
2
3from wagtail.admin.views.generic.multiple_upload import AddView as BaseAddView
4from wagtail.admin.views.generic.multiple_upload import \
5    CreateFromUploadView as BaseCreateFromUploadView
6from wagtail.admin.views.generic.multiple_upload import DeleteUploadView as BaseDeleteUploadView
7from wagtail.admin.views.generic.multiple_upload import DeleteView as BaseDeleteView
8from wagtail.admin.views.generic.multiple_upload import EditView as BaseEditView
9from wagtail.search.backends import get_search_backends
10
11from .. import get_document_model
12from ..forms import get_document_form, get_document_multi_form
13from ..models import UploadedDocument
14from ..permissions import permission_policy
15
16
17class AddView(BaseAddView):
18    permission_policy = permission_policy
19    template_name = 'wagtaildocs/multiple/add.html'
20    upload_model = UploadedDocument
21
22    edit_object_url_name = 'wagtaildocs:edit_multiple'
23    delete_object_url_name = 'wagtaildocs:delete_multiple'
24    edit_object_form_prefix = 'doc'
25    context_object_name = 'doc'
26    context_object_id_name = 'doc_id'
27
28    edit_upload_url_name = 'wagtaildocs:create_multiple_from_uploaded_document'
29    delete_upload_url_name = 'wagtaildocs:delete_upload_multiple'
30    edit_upload_form_prefix = 'uploaded-document'
31    context_upload_name = 'uploaded_document'
32    context_upload_id_name = 'uploaded_document_id'
33
34    def get_model(self):
35        return get_document_model()
36
37    def get_upload_form_class(self):
38        return get_document_form(self.model)
39
40    def get_edit_form_class(self):
41        return get_document_multi_form(self.model)
42
43    def save_object(self, form):
44        doc = form.save(commit=False)
45        doc.uploaded_by_user = self.request.user
46        doc.file_size = doc.file.size
47
48        # Set new document file hash
49        doc.file.seek(0)
50        doc._set_file_hash(doc.file.read())
51        doc.file.seek(0)
52
53        doc.save()
54
55        return doc
56
57
58class EditView(BaseEditView):
59    permission_policy = permission_policy
60    pk_url_kwarg = 'doc_id'
61    edit_object_form_prefix = 'doc'
62    context_object_name = 'doc'
63    context_object_id_name = 'doc_id'
64    edit_object_url_name = 'wagtaildocs:edit_multiple'
65    delete_object_url_name = 'wagtaildocs:delete_multiple'
66
67    def get_model(self):
68        return get_document_model()
69
70    def get_edit_form_class(self):
71        return get_document_multi_form(self.model)
72
73    def save_object(self, form):
74        form.save()
75
76        # Reindex the doc to make sure all tags are indexed
77        for backend in get_search_backends():
78            backend.add(self.object)
79
80
81class DeleteView(BaseDeleteView):
82    permission_policy = permission_policy
83    pk_url_kwarg = 'doc_id'
84    context_object_id_name = 'doc_id'
85
86    def get_model(self):
87        return get_document_model()
88
89
90class CreateFromUploadedDocumentView(BaseCreateFromUploadView):
91    edit_upload_url_name = 'wagtaildocs:create_multiple_from_uploaded_document'
92    delete_upload_url_name = 'wagtaildocs:delete_upload_multiple'
93    upload_model = UploadedDocument
94    upload_pk_url_kwarg = 'uploaded_document_id'
95    edit_upload_form_prefix = 'uploaded-document'
96    context_object_id_name = 'doc_id'
97    context_upload_name = 'uploaded_document'
98
99    def get_model(self):
100        return get_document_model()
101
102    def get_edit_form_class(self):
103        return get_document_multi_form(self.model)
104
105    def save_object(self, form):
106        # assign the file content from uploaded_doc to the image object, to ensure it gets saved to
107        # Document's storage
108
109        self.object.file.save(os.path.basename(self.upload.file.name), self.upload.file.file, save=False)
110        self.object.uploaded_by_user = self.request.user
111        self.object.file_size = self.object.file.size
112        self.object.file.open()
113        self.object.file.seek(0)
114        self.object._set_file_hash(self.object.file.read())
115        self.object.file.seek(0)
116        form.save()
117
118        # Reindex the document to make sure all tags are indexed
119        for backend in get_search_backends():
120            backend.add(self.object)
121
122
123class DeleteUploadView(BaseDeleteUploadView):
124    upload_model = UploadedDocument
125    upload_pk_url_kwarg = 'uploaded_document_id'
126