From 4ab4237be0a74f8567d8f4c9327afd7f80cd93d7 Mon Sep 17 00:00:00 2001 From: Adrian Moennich Date: Thu, 2 Jul 2015 10:43:06 +0200 Subject: [PATCH] Add folder editing Also fix permissions checks for endpoints using a specific folder. --- indico/modules/attachments/blueprint.py | 3 +++ .../attachments/controllers/management/base.py | 28 ++++++++++++++++------ .../attachments/controllers/management/event.py | 14 ++++++++--- indico/modules/attachments/controllers/util.py | 12 ++++++++++ indico/modules/attachments/forms.py | 2 +- .../attachments/templates/_attachments.html | 6 +++-- 6 files changed, 52 insertions(+), 13 deletions(-) diff --git a/indico/modules/attachments/blueprint.py b/indico/modules/attachments/blueprint.py index e1899c726..8bd43a5c0 100644 --- a/indico/modules/attachments/blueprint.py +++ b/indico/modules/attachments/blueprint.py @@ -24,6 +24,7 @@ from indico.modules.attachments.controllers.management.event import (RHManageEve RHAddEventAttachmentLink, RHEditEventAttachment, RHCreateEventFolder, + RHEditEventFolder, RHDeleteEventFolder, RHDeleteEventAttachment) from indico.modules.events import event_management_object_url_prefixes, event_object_url_prefixes @@ -44,6 +45,8 @@ for object_type, prefixes in event_management_object_url_prefixes.iteritems(): RHEditEventAttachment, methods=('GET', 'POST'), defaults={'object_type': object_type}) _bp.add_url_rule(prefix + '/attachments/create-folder', 'create_folder', RHCreateEventFolder, methods=('GET', 'POST'), defaults={'object_type': object_type}) + _bp.add_url_rule(prefix + '/attachments//', 'edit_folder', RHEditEventFolder, + methods=('GET', 'POST'), defaults={'object_type': object_type}) _bp.add_url_rule(prefix + '/attachments//', 'delete_folder', RHDeleteEventFolder, methods=('DELETE',), defaults={'object_type': object_type}) _bp.add_url_rule(prefix + '/attachments///', 'delete_attachment', diff --git a/indico/modules/attachments/controllers/management/base.py b/indico/modules/attachments/controllers/management/base.py index 9dbfc557f..70d804f90 100644 --- a/indico/modules/attachments/controllers/management/base.py +++ b/indico/modules/attachments/controllers/management/base.py @@ -20,8 +20,8 @@ from flask import flash, request, session from werkzeug.utils import secure_filename from indico.core.db import db -from indico.modules.attachments.controllers.util import SpecificAttachmentMixin -from indico.modules.attachments.forms import (AddAttachmentFilesForm, AttachmentLinkForm, CreateFolderForm, +from indico.modules.attachments.controllers.util import SpecificAttachmentMixin, SpecificFolderMixin +from indico.modules.attachments.forms import (AddAttachmentFilesForm, AttachmentLinkForm, AttachmentFolderForm, EditAttachmentFileForm) from indico.modules.attachments.models.folders import AttachmentFolder from indico.modules.attachments.models.attachments import Attachment, AttachmentFile, AttachmentType @@ -119,7 +119,7 @@ class CreateFolderMixin: """Create a new empty folder""" def _process(self): - form = CreateFolderForm() + form = AttachmentFolderForm() if form.validate_on_submit(): folder = AttachmentFolder(linked_object=self.object) form.populate_obj(folder, skip={'acl'}) @@ -131,13 +131,27 @@ class CreateFolderMixin: return jsonify_template('attachments/create_folder.html', form=form) -class DeleteFolderMixin: +class EditFolderMixin(SpecificFolderMixin): + """Edit a folder""" + + def _process(self): + defaults = FormDefaults(self.folder, protected=self.folder.is_protected) + form = AttachmentFolderForm(obj=defaults) + if form.validate_on_submit(): + form.populate_obj(self.folder, skip={'acl'}) + if self.folder.is_protected: + self.folder.acl = form.acl.data + flash(_("Folder \"{name}\" updated").format(name=self.folder.title), 'success') + return jsonify_data(attachment_list=_render_attachment_list(self.object)) + return jsonify_template('attachments/create_folder.html', form=form) + + +class DeleteFolderMixin(SpecificFolderMixin): """Delete a folder""" def _process(self): - folder = AttachmentFolder.get_one(request.view_args['folder_id']) - folder.is_deleted = True - flash(_("Folder \"{name}\" deleted").format(name=folder.title), 'success') + self.folder.is_deleted = True + flash(_("Folder \"{name}\" deleted").format(name=self.folder.title), 'success') return jsonify_data(attachment_list=_render_attachment_list(self.object)) diff --git a/indico/modules/attachments/controllers/management/event.py b/indico/modules/attachments/controllers/management/event.py index 2191b2960..18dd01eda 100644 --- a/indico/modules/attachments/controllers/management/event.py +++ b/indico/modules/attachments/controllers/management/event.py @@ -21,8 +21,8 @@ from werkzeug.exceptions import NotFound, Forbidden from indico.modules.attachments.controllers.management.base import (ManageAttachmentsMixin, AddAttachmentFilesMixin, AddAttachmentLinkMixin, EditAttachmentMixin, - CreateFolderMixin, DeleteFolderMixin, - DeleteAttachmentMixin) + CreateFolderMixin, EditFolderMixin, + DeleteFolderMixin, DeleteAttachmentMixin) from indico.modules.attachments.util import can_manage_attachments from indico.modules.attachments.views import WPEventAttachments from indico.modules.events.util import get_object_from_args @@ -66,8 +66,16 @@ class RHCreateEventFolder(CreateFolderMixin, RHEventAttachmentManagementBase): pass +class RHEditEventFolder(EditFolderMixin, RHEventAttachmentManagementBase): + def _checkParams(self, params): + RHEventAttachmentManagementBase._checkParams(self, params) + EditFolderMixin._checkParams(self) + + class RHDeleteEventFolder(DeleteFolderMixin, RHEventAttachmentManagementBase): - pass + def _checkParams(self, params): + RHEventAttachmentManagementBase._checkParams(self, params) + DeleteFolderMixin._checkParams(self) class RHDeleteEventAttachment(DeleteAttachmentMixin, RHEventAttachmentManagementBase): diff --git a/indico/modules/attachments/controllers/util.py b/indico/modules/attachments/controllers/util.py index 910d45ae8..428798b6e 100644 --- a/indico/modules/attachments/controllers/util.py +++ b/indico/modules/attachments/controllers/util.py @@ -20,6 +20,7 @@ from flask import request from werkzeug.exceptions import NotFound from indico.modules.attachments.models.attachments import Attachment +from indico.modules.attachments.models.folders import AttachmentFolder class SpecificAttachmentMixin: @@ -34,3 +35,14 @@ class SpecificAttachmentMixin: self.attachment = Attachment.find_one(id=request.view_args['attachment_id'], is_deleted=False) if self.attachment.folder.is_deleted: raise NotFound + + +class SpecificFolderMixin: + """Mixin for RHs that reference a specific folder""" + + normalize_url_spec = { + None: lambda self: self.folder.linked_object + } + + def _checkParams(self): + self.folder = AttachmentFolder.find_one(id=request.view_args['folder_id'], is_deleted=False) diff --git a/indico/modules/attachments/forms.py b/indico/modules/attachments/forms.py index 792571003..a083c25e0 100644 --- a/indico/modules/attachments/forms.py +++ b/indico/modules/attachments/forms.py @@ -78,7 +78,7 @@ class AttachmentLinkForm(EditAttachmentFormBase): self.title.description = _("The title of the link") -class CreateFolderForm(IndicoForm): +class AttachmentFolderForm(IndicoForm): title = StringField(_("Name"), [DataRequired()], description=_("The name of the folder.")) description = TextAreaField(_("Description"), description=_("Description of the folder and its content")) protected = BooleanField(_("Protected"), widget=SwitchWidget(), diff --git a/indico/modules/attachments/templates/_attachments.html b/indico/modules/attachments/templates/_attachments.html index 301d2b8e5..844f26adc 100644 --- a/indico/modules/attachments/templates/_attachments.html +++ b/indico/modules/attachments/templates/_attachments.html @@ -42,7 +42,7 @@ + data-title="{% trans name=attachment.title %}Edit attachment: {{ name }}{% endtrans %}"> @@ -64,7 +64,9 @@ This will remove the folder and its contents permanantly. {%- endtrans %}"> - + -- 2.11.4.GIT