Example #1
0
    def get_for_linked_object(cls, linked_object, preload_event=False):
        """Gets the attachments for the given object.

        This only returns attachments that haven't been deleted.

        :param linked_object: A category, event, session, contribution or
                              subcontribution.
        :param preload_event: If all attachments for the same event should
                              be pre-loaded and cached in the app context.
                              This must not be used when ``linked_object``
                              is a category.
        """
        from indico.modules.attachments.api.util import get_event

        event = get_event(linked_object)

        if event and event in g.get("event_attachments", {}):
            return g.event_attachments[event].get(linked_object, [])
        elif not preload_event or not event:
            return (
                linked_object.attachment_folders.filter_by(is_deleted=False)
                .order_by(AttachmentFolder.is_default.desc(), db.func.lower(AttachmentFolder.title))
                .options(joinedload(AttachmentFolder.attachments))
                .all()
            )
        else:
            if "event_attachments" not in g:
                g.event_attachments = {}
            g.event_attachments[event] = defaultdict(list)
            query = (
                event.all_attachment_folders.filter_by(is_deleted=False)
                .order_by(AttachmentFolder.is_default.desc(), db.func.lower(AttachmentFolder.title))
                .options(
                    joinedload(AttachmentFolder.attachments),
                    joinedload(AttachmentFolder.linked_event),
                    joinedload(AttachmentFolder.session),
                    joinedload(AttachmentFolder.contribution),
                    joinedload(AttachmentFolder.subcontribution),
                )
            )

            # populate cache
            for obj in query:
                g.event_attachments[event][obj.object].append(obj)

            return g.event_attachments[event].get(linked_object, [])
Example #2
0
    def get_for_linked_object(cls, linked_object, preload_event=False):
        """Gets the attachments for the given object.

        This only returns attachments that haven't been deleted.

        :param linked_object: A category, event, session, contribution or
                              subcontribution.
        :param preload_event: If all attachments for the same event should
                              be pre-loaded and cached in the app context.
                              This must not be used when ``linked_object``
                              is a category.
        """
        from indico.modules.attachments.api.util import get_event

        event = get_event(linked_object)

        if event and event in g.get('event_attachments', {}):
            return g.event_attachments[event].get(linked_object, [])
        elif not preload_event or not event:
            return (linked_object.attachment_folders.filter_by(
                is_deleted=False).order_by(
                    AttachmentFolder.is_default.desc(),
                    db.func.lower(AttachmentFolder.title)).options(
                        joinedload(AttachmentFolder.attachments)).all())
        else:
            if 'event_attachments' not in g:
                g.event_attachments = {}
            g.event_attachments[event] = defaultdict(list)
            query = (event.all_attachment_folders.filter_by(
                is_deleted=False).order_by(
                    AttachmentFolder.is_default.desc(),
                    db.func.lower(AttachmentFolder.title)).options(
                        joinedload(AttachmentFolder.attachments),
                        joinedload(AttachmentFolder.linked_event),
                        joinedload(AttachmentFolder.session),
                        joinedload(AttachmentFolder.contribution),
                        joinedload(AttachmentFolder.subcontribution)))

            # populate cache
            for obj in query:
                g.event_attachments[event][obj.object].append(obj)

            return g.event_attachments[event].get(linked_object, [])