diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1d42b80..e2936ae 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,6 +7,7 @@ Changelog - Enh #224: Unifying positions of button on modals for consistency and better UX - Enh #227: Use PHP CS Fixer - Fix: Add autofocus on file or folder edit (for HumHub 1.17 - see https://github.com/humhub/humhub/issues/7136) +- Fix #230: Optimize sql query to get files from the stream - Enh #232: Update Active Form for Bootstrap 5 0.16.6 - March 14, 2024 diff --git a/messages/eu/base.php b/messages/eu/base.php index 15f877f..f5fdbc3 100644 --- a/messages/eu/base.php +++ b/messages/eu/base.php @@ -57,7 +57,7 @@ 'Move to another Space' => '', 'Moving to the same folder is not valid.' => '', 'Moving to this folder is invalid.' => '', - 'Name' => '', + 'Name' => 'izena', 'No file found!' => '', 'Open' => 'Ireki', 'Open file folder' => '', diff --git a/messages/pt-BR/base.php b/messages/pt-BR/base.php index 1e04c69..b020185 100644 --- a/messages/pt-BR/base.php +++ b/messages/pt-BR/base.php @@ -1,100 +1,99 @@ '%filename% possui extensão inválida e foi ignorado.', - '/ (root)' => '/ (raiz)', - 'Confirm delete file' => 'Confirmar exclusão de arquivo', - 'Create folder' => 'Criar pasta', - 'Edit file' => 'Alterar arquivo', - 'Edit folder' => 'Alterar pasta', - 'File download url' => 'Endereço de download do arquivo', - 'File url' => 'Endereço do arquivo', - 'Files module configuration' => 'Configuração do módulo de Arquivos', - 'Folder url' => 'Endereço da pasta', - 'Move files' => 'Mover arquivos', - 'A file with that name already exists in this folder.' => 'Um arquivo com esse nome já existe nessa pasta.', - 'Actions' => 'Ações', - 'Add directory' => 'Adicionar pasta', - 'Add file(s)' => 'Adicionar arquivo(s)', - 'Adds files module to this space.' => 'Adicionar o módulo de arquivos neste espaço.', - 'Adds files module to your profile.' => 'Adicionar o módulo de arquivos no seu perfil.', - 'An error occurred while creating folder {folder}.' => 'Um erro ocorreu na criação da pasta {folder}.', - 'An error occurred while unpacking {filename}.' => 'Um erro ocorreu ao descompactar {filename}', - 'Archive %filename% could not be extracted.' => 'Arquivo %filename% não pôde ser extraído.', - 'Author' => 'Autor', - 'Cannot edit non existing file.' => 'Não é possível editar um arquivo inexistente.', - 'Close' => 'Fechar', - 'Could not find folder with id: %id%' => 'Não foi possível achar a pasta com o id: %id%', - 'Creator' => 'Criador', - 'Delete' => 'Apagar', - 'Destination folder not found!' => 'Pasta de destino não encontrada!', - 'Disable archive (ZIP) support' => 'Desabilitar suporte a arquivos ZIP', - 'Display Url' => 'Exibir endereço', - 'Display a download count column' => 'Exibir uma coluna de contagem de transferência', - 'Do you really want to delete this {number} item(s) with all subcontent?' => 'Você realmente quer apagar {number} item(ns) com todos os seus conteúdos?', - 'Download' => 'Baixar', - 'Download ZIP' => 'Baixar ZIP', - 'Downloads' => 'Transferência', - 'Edit' => 'Alterar', - 'Edit directory' => 'Alterar pasta', - 'File' => 'Arquivo', - 'Files' => 'Arquivos', - 'Files from the stream' => 'Arquivos do mural', - 'Folder' => 'Pasta', - 'Folder should not start or end with blank space.' => 'Nome de pasta não pode iniciar ou terminar com espaço em branco.', - 'Folder {name} can\'t be moved to itself!' => 'Não é possível mover a pasta {name} para dentro dela mesma!', - 'Folder {name} given folder is not editable!' => 'A pasta {name} não é editável!', - 'Import Zip' => 'Importar zip', - 'Likes/Comments' => 'Curtidas/Comentários', - 'Make Private' => 'Tornar privado', - 'Make Public' => 'Tornar público', - 'Move' => 'Mover', - 'Moving to the same folder is not valid.' => 'Não é possível mover para a mesma pasta.', - 'Moving to this folder is invalid.' => 'Não é possível mover para essa pasta.', - 'Name' => 'Nome', - 'Open' => 'Abrir', - 'Open file folder' => 'Abrir essa pasta', - 'Opening archive failed with error code %code%.' => 'Erro ao abrir o arquivo. Código: %code%', - 'Please select a valid destination folder for %title%.' => 'Por favor, selecione uma pasta de destino válida para %title%.', - 'Root' => 'Raiz', - 'Selected items...' => 'Itens selecionados...', - 'Show Post' => 'Exibir Publicação', - 'Size' => 'Tamanho', - 'Size: {size}' => 'Tamanho: {size}', - 'Some files could not be imported: ' => 'Alguns arquivos não puderam ser importados:', - 'Some files could not be moved: ' => 'Alguns arquivos não puderam ser movidos:', - 'The root folder is the entry point that contains all available files.' => 'A pasta raiz é o ponto de entrada que contém todos os arquivos disponíveis.', - 'This file is only visible for you and your friends.' => 'Este arquivo é visível apenas para você e seus amigos.', - 'This file is private.' => 'Esse arquivo é privado.', - 'This file is protected.' => 'Este arquivo está protegido.', - 'This file is public.' => 'Esse arquivo é público.', - 'This folder is empty.' => 'Essa pasta está vazia.', - 'This folder is only visible for you and your friends.' => 'Esta pasta só é visível para você e seus amigos.', - 'This folder is private.' => 'Essa pasta é privada.', - 'This folder is protected.' => 'Esta pasta está protegida.', - 'This folder is public.' => 'Essa pasta é pública.', - 'Unfortunately you have no permission to upload/edit files.' => 'Infelizmente, você não tem permissão para transferir/alterar arquivos.', - 'Updated' => 'Atualizado', - 'Upload files or create a subfolder with the buttons on the top.' => 'Transfira arquivos ou crie uma subpasta usando os botões na parte superior.', - 'Upload files to the stream to fill this folder.' => 'Transfira arquivos para o mural para preencher esta pasta.', - 'You can find all files that have been posted to this stream here.' => 'Você pode encontrar todos os arquivos enviados para esse mural aqui.', - 'ZIP selected' => 'ZIP selecionado', - 'ZIP support is not enabled.' => 'Suporte para arquivos ZIP não habilitado.', - 'File versions' => '', - 'Could not move the item!' => '', - 'Delete this version!' => '', - 'File "{movedItemName}" has been moved into the folder "{targetFolderName}".' => '', - 'File {fileName} has been reverted to version from {fileDateTime}' => '', - 'Folder "{movedItemName}" has been moved into the folder "{targetFolderName}".' => '', - 'Move to another Space' => '', - 'No file found!' => '', - 'Revert to this version' => '', - 'Select what file version you want to switch.' => '', - 'Show older versions' => '', - 'Time' => '', - 'Versions' => '', - 'Wrong moved item!' => '', - 'Wrong target folder!' => '', - 'You cannot move the file "{name}"!' => '', - 'You cannot move the folder "{name}"!' => '', -]; +return array ( + '%filename% has invalid extension and was skipped.' => '%filename% possui extensão inválida e foi ignorado.', + '/ (root)' => '/ (raiz)', + 'Confirm delete file' => 'Confirmar exclusão de arquivo', + 'Create folder' => 'Criar pasta', + 'Edit file' => 'Alterar arquivo', + 'Edit folder' => 'Alterar pasta', + 'File download url' => 'Endereço de download do arquivo', + 'File url' => 'Endereço do arquivo', + 'File versions' => 'Versões do arquivo', + 'Files module configuration' => 'Configuração do módulo de Arquivos', + 'Folder url' => 'Endereço da pasta', + 'Move files' => 'Mover arquivos', + 'A file with that name already exists in this folder.' => 'Um arquivo com esse nome já existe nessa pasta.', + 'Actions' => 'Ações', + 'Add directory' => 'Adicionar pasta', + 'Add file(s)' => 'Adicionar arquivo(s)', + 'Adds files module to this space.' => 'Adicionar o módulo de arquivos neste espaço.', + 'Adds files module to your profile.' => 'Adicionar o módulo de arquivos no seu perfil.', + 'An error occurred while creating folder {folder}.' => 'Um erro ocorreu na criação da pasta {folder}.', + 'An error occurred while unpacking {filename}.' => 'Um erro ocorreu ao descompactar {filename}', + 'Archive %filename% could not be extracted.' => 'Arquivo %filename% não pôde ser extraído.', + 'Author' => 'Autor', + 'Cannot edit non existing file.' => 'Não é possível editar um arquivo inexistente.', + 'Close' => 'Fechar', + 'Could not find folder with id: %id%' => 'Não foi possível achar a pasta com o id: %id%', + 'Could not move the item!' => 'Não foi possível mover o item!', + 'Creator' => 'Criador', + 'Delete' => 'Apagar', + 'Delete this version!' => 'Apague esta versão!', + 'Destination folder not found!' => 'Pasta de destino não encontrada!', + 'Disable archive (ZIP) support' => 'Desabilitar suporte a arquivos ZIP', + 'Display Url' => 'Exibir endereço', + 'Display a download count column' => 'Exibir uma coluna de contagem de transferência', + 'Do you really want to delete this {number} item(s) with all subcontent?' => 'Você realmente quer apagar {number} item(ns) com todos os seus conteúdos?', + 'Download' => 'Baixar', + 'Download ZIP' => 'Baixar ZIP', + 'Downloads' => 'Transferência', + 'Edit' => 'Alterar', + 'Edit directory' => 'Alterar pasta', + 'File' => 'Arquivo', + 'File "{movedItemName}" has been moved into the folder "{targetFolderName}".' => 'O arquivo "{movedItemName}" foi movido para a pasta "{targetFolderName}".', + 'File {fileName} has been reverted to version from {fileDateTime}' => 'O arquivo {fileName} foi revertido para a versão de {fileDateTime}', + 'Files' => 'Arquivos', + 'Files from the stream' => 'Arquivos do fluxo', + 'Folder' => 'Pasta', + 'Folder "{movedItemName}" has been moved into the folder "{targetFolderName}".' => 'A pasta "{movedItemName}" foi movida para a pasta "{targetFolderName}".', + 'Folder should not start or end with blank space.' => 'Nome de pasta não pode iniciar ou terminar com espaço em branco.', + 'Folder {name} can\'t be moved to itself!' => 'Não é possível mover a pasta {name} para dentro dela mesma!', + 'Folder {name} given folder is not editable!' => 'A pasta {name} não é editável!', + 'Import Zip' => 'Importar zip', + 'Likes/Comments' => 'Curtidas/Comentários', + 'Make Private' => 'Tornar privado', + 'Make Public' => 'Tornar público', + 'Move' => 'Mover', + 'Move to another Space' => 'Mover para outro espaço', + 'Moving to the same folder is not valid.' => 'Não é possível mover para a mesma pasta.', + 'Moving to this folder is invalid.' => 'Não é possível mover para essa pasta.', + 'Name' => 'Nome', + 'No file found!' => 'Nenhum arquivo encontrado!', + 'Open' => 'Abrir', + 'Open file folder' => 'Abrir essa pasta', + 'Opening archive failed with error code %code%.' => 'Erro ao abrir o arquivo. Código: %code%', + 'Please select a valid destination folder for %title%.' => 'Por favor, selecione uma pasta de destino válida para %title%.', + 'Revert to this version' => 'Reverter para esta versão', + 'Root' => 'Raiz', + 'Select what file version you want to switch.' => 'Selecione a versão do arquivo que você deseja alternar.', + 'Selected items...' => 'Itens selecionados...', + 'Show Post' => 'Exibir Publicação', + 'Show older versions' => 'Mostrar versões mais antigas', + 'Size' => 'Tamanho', + 'Size: {size}' => 'Tamanho: {size}', + 'Some files could not be imported: ' => 'Alguns arquivos não puderam ser importados:', + 'Some files could not be moved: ' => 'Alguns arquivos não puderam ser movidos:', + 'The root folder is the entry point that contains all available files.' => 'A pasta raiz é o ponto de entrada que contém todos os arquivos disponíveis.', + 'This file is only visible for you and your friends.' => 'Este arquivo é visível apenas para você e seus amigos.', + 'This file is private.' => 'Esse arquivo é privado.', + 'This file is protected.' => 'Este arquivo está protegido.', + 'This file is public.' => 'Esse arquivo é público.', + 'This folder is empty.' => 'Essa pasta está vazia.', + 'This folder is only visible for you and your friends.' => 'Esta pasta só é visível para você e seus amigos.', + 'This folder is private.' => 'Essa pasta é privada.', + 'This folder is protected.' => 'Esta pasta está protegida.', + 'This folder is public.' => 'Essa pasta é pública.', + 'Time' => 'Tempo', + 'Unfortunately you have no permission to upload/edit files.' => 'Infelizmente, você não tem permissão para transferir/alterar arquivos.', + 'Updated' => 'Atualizado', + 'Upload files or create a subfolder with the buttons on the top.' => 'Transfira arquivos ou crie uma subpasta usando os botões na parte superior.', + 'Upload files to the stream to fill this folder.' => 'Transfira arquivos para o mural para preencher esta pasta.', + 'Versions' => 'Versões', + 'Wrong moved item!' => 'Item movido errado!', + 'Wrong target folder!' => 'Pasta de destino errada!', + 'You can find all files that have been posted to this stream here.' => 'Você pode encontrar todos os arquivos enviados para esse mural aqui.', + 'You cannot move the file "{name}"!' => 'Você não pode mover o arquivo "{name}"!', + 'You cannot move the folder "{name}"!' => 'Você não pode mover a pasta "{name}"!', + 'ZIP selected' => 'ZIP selecionado', + 'ZIP support is not enabled.' => 'Suporte para arquivos ZIP não habilitado.', +); diff --git a/messages/pt-BR/models_FileSystemItem.php b/messages/pt-BR/models_FileSystemItem.php index 46333ac..898b0d5 100644 --- a/messages/pt-BR/models_FileSystemItem.php +++ b/messages/pt-BR/models_FileSystemItem.php @@ -1,8 +1,7 @@ 'Transferências', - 'Is Public' => 'É Público', - 'Note: Changes of the folders visibility, will be inherited by all contained files and folders.' => 'Nota: Mudanças na visibilidade das pastas serão herdadas por todos os arquivos e pastas contidas nelas.', - 'Hide in Stream' => '', -]; +return array ( + 'Downloads' => 'Transferências', + 'Hide in Stream' => 'Ocultar no Stream', + 'Is Public' => 'É público', + 'Note: Changes of the folders visibility, will be inherited by all contained files and folders.' => 'Observação: as alterações na visibilidade das pastas serão herdadas por todos os arquivos e pastas contidos.', +); diff --git a/messages/pt-BR/user.php b/messages/pt-BR/user.php index bcf3217..871c115 100644 --- a/messages/pt-BR/user.php +++ b/messages/pt-BR/user.php @@ -1,7 +1,6 @@ '', - 'The version "{versionDate}" could not be deleted!' => '', - 'The version "{versionDate}" has been deleted.' => '', -]; +return array ( + 'Are you really sure to delete this version?' => 'Tem certeza de que deseja excluir esta versão?', + 'The version "{versionDate}" could not be deleted!' => 'A versão "{versionDate}" não pôde ser excluída!', + 'The version "{versionDate}" has been deleted.' => 'A versão "{versionDate}" foi excluída.', +); diff --git a/messages/ru/models_FileSystemItem.php b/messages/ru/models_FileSystemItem.php index 3fbb99e..1f02ce4 100644 --- a/messages/ru/models_FileSystemItem.php +++ b/messages/ru/models_FileSystemItem.php @@ -1,8 +1,7 @@ '', - 'Hide in Stream' => '', - 'Is Public' => '', - 'Note: Changes of the folders visibility, will be inherited by all contained files and folders.' => '', -]; +return array ( + 'Downloads' => 'Скачать', + 'Hide in Stream' => '', + 'Is Public' => 'публичная запись', + 'Note: Changes of the folders visibility, will be inherited by all contained files and folders.' => '', +); diff --git a/models/File.php b/models/File.php index 205d4d9..4cc9851 100644 --- a/models/File.php +++ b/models/File.php @@ -10,6 +10,7 @@ use humhub\modules\file\libs\FileHelper; use humhub\modules\file\models\File as BaseFile; use humhub\modules\file\models\FileUpload; +use humhub\modules\post\models\Post; use humhub\modules\search\events\SearchAddEvent; use humhub\modules\topic\models\Topic; use humhub\modules\user\models\User; @@ -323,7 +324,7 @@ public function getEditUrl() /** * Get the post related to the given file file. */ - public static function getBasePost(\humhub\modules\file\models\File $file = null) + public static function getBasePost(BaseFile $file = null) { if ($file === null) { return null; @@ -386,31 +387,37 @@ public function getFullPath($separator = '/') */ public static function getPostedFiles($contentContainer, $filesOrder = ['file.updated_at' => SORT_ASC, 'file.title' => SORT_ASC]) { - // Get Posted Files - $query = \humhub\modules\file\models\File::find(); - // join comments to the file if available - $query->join('LEFT JOIN', 'comment', '(file.object_id=comment.id AND file.object_model=' . Yii::$app->db->quoteValue(Comment::className()) . ')'); - // join parent post of comment or file - $query->join('LEFT JOIN', 'content', '(comment.object_model=content.object_model AND comment.object_id=content.object_id) OR (file.object_model=content.object_model AND file.object_id=content.object_id)'); + // only accept Posts as the base content, so stuff from sumbmodules like files itsself or gallery will be excluded - $query->andWhere(['content.contentcontainer_id' => $contentContainer->contentContainerRecord->id]); + // Initialise sub queries to get files from Posts and Comments + $subQueries = [ + Post::class => Content::find() + ->select('content.object_id') + ->where(['content.object_model' => Post::class]), + Comment::class => Content::find() + ->select('comment.id') + ->innerJoin('comment', 'comment.object_model = content.object_model AND comment.object_id = content.object_id') + ->where(['comment.object_model' => Post::class]), + ]; - if (!$contentContainer->canAccessPrivateContent()) { - // Note this will cut comment images, but including the visibility of comments is pretty complex... - $query->andWhere(['content.visibility' => Content::VISIBILITY_PUBLIC]); - } + $query = BaseFile::find(); - $query->andWhere(['content.state' => Content::STATE_PUBLISHED]); + foreach ($subQueries as $objectClass => $subQuery) { + // Filter Content records by container and visibility states + $subQuery->andWhere(['content.contentcontainer_id' => $contentContainer->contentContainerRecord->id]) + ->andWhere(['content.state' => Content::STATE_PUBLISHED]); + if (!$contentContainer->canAccessPrivateContent()) { + // Note this will cut comment images, but including the visibility of comments is pretty complex... + $subQuery->andWhere(['content.visibility' => Content::VISIBILITY_PUBLIC]); + } + + $query->orWhere([ + 'AND', + ['file.object_model' => $objectClass], + ['IN', 'file.object_id', $subQuery], + ]); + } - // only accept Posts as the base content, so stuff from sumbmodules like files itsself or gallery will be excluded - $query->andWhere( - ['or', - ['=', 'comment.object_model', \humhub\modules\post\models\Post::className()], - ['=', 'file.object_model', \humhub\modules\post\models\Post::className()], - ], - ); - - // Get Files from comments return $query->orderBy($filesOrder); }