2022-04-20 11:23:53 +02:00

65 lines
3.1 KiB
Python

# This file is part of the Indico plugins.
# Copyright (C) 2002 - 2022 CERN
#
# The Indico plugins are free software; you can redistribute
# them and/or modify them under the terms of the MIT License;
# see the LICENSE file for more details.
import mimetypes
import requests
from flask import flash, session
from flask_pluginengine import render_plugin_template
from indico.core.db import db
from indico.modules.attachments.controllers.management.base import (_get_folders_protection_info,
_render_attachment_list, _render_protection_message)
from indico.modules.attachments.controllers.management.category import RHCategoryAttachmentManagementBase
from indico.modules.attachments.controllers.management.event import RHEventAttachmentManagementBase
from indico.modules.attachments.models.attachments import Attachment, AttachmentFile, AttachmentType
from indico.modules.attachments.models.folders import AttachmentFolder
from indico.util.fs import secure_client_filename
from indico.web.util import jsonify_data, jsonify_template
from indico_owncloud import _
from indico_owncloud.forms import AddAttachmentOwncloudForm
class AddAttachmentOwncloudMixin:
"""Add cloud storage attachment."""
def _process(self):
form = AddAttachmentOwncloudForm(linked_object=self.object)
if form.validate_on_submit():
files = form.data['owncloud_filepicker']['files']
folder = form.data['folder'] or AttachmentFolder.get_or_create_default(linked_object=self.object)
for f in files:
filename = f.split('/')[-1].split('?')[0]
local_filename = secure_client_filename(filename)
attachment = Attachment(folder=folder, user=session.user, title=local_filename,
type=AttachmentType.file, protection_mode=form.data['protection_mode'])
if attachment.is_self_protected:
attachment.acl = form.data['acl']
content_type = mimetypes.guess_type(local_filename)[0] or 'application/octet-stream'
attachment.file = AttachmentFile(user=session.user, filename=local_filename, content_type=content_type)
file_response = requests.get(f)
file_response.raise_for_status()
attachment.file.save(file_response.content)
db.session.add(attachment)
db.session.flush()
flash(_('Attachment added'))
return jsonify_data(attachment_list=_render_attachment_list(self.object))
return jsonify_template('add_owncloud_files.html', _render_func=render_plugin_template, form=form,
protection_message=_render_protection_message(self.object),
folders_protection_info=_get_folders_protection_info(self.object))
class RHAddCategoryAttachmentOwncloud(AddAttachmentOwncloudMixin, RHCategoryAttachmentManagementBase):
pass
class RHAddEventAttachmentOwncloud(AddAttachmentOwncloudMixin, RHEventAttachmentManagementBase):
pass