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);
}