Separa caminho de gravação da URL pública de leitura no MinIO/S3#1015
Open
robertatakenaka wants to merge 12 commits into
Open
Separa caminho de gravação da URL pública de leitura no MinIO/S3#1015robertatakenaka wants to merge 12 commits into
robertatakenaka wants to merge 12 commits into
Conversation
Remove a implementação antiga de files_storage e publication (ISIS/DSM), substituída pela arquitetura atual em files_storage/ e package/.
rondinelisaad
approved these changes
Jun 30, 2026
rondinelisaad
left a comment
Member
There was a problem hiding this comment.
De acordo com a proposta.
…tância no upload Extrai get_minio_config e injeta o cliente minio já resolvido ao longo da cadeia de upload (upload_items/components/zip/xml/article_page), evitando reinstanciar a configuração a cada arquivo enviado à nuvem.
…write_prefix Substitui bucket_root/bucket_app_subdir pelo novo schema bucket/write_prefix no arquivo de exemplo de desenvolvimento.
3ade6fe to
432e14b
Compare
…Storage Por quê: a URI pública salva no banco precisava poder divergir do caminho físico de gravação (prefixo/host interno), o que o antigo bucket_root único não permitia. Como: - Renomeia bucket_root para bucket - Adiciona object_name_prefix (prefixo de escrita) e public_url (base de leitura), com get_full_object_name() centralizando o prefixo - get_uri prioriza public_url; sem ela, cai no presigned URL aplicando o prefixo e removendo a query string assinada - Funde _fput_object em fput, mantendo o retry automático em caso de bucket inexistente (cria bucket + policy e tenta de novo) - remove/fget passam a aplicar get_full_object_name corretamente - Remove build_object_name/register (nomeação de objeto deixa de ser responsabilidade da classe de storage) - Move _create_tmp_file para função de módulo (não dependia de self)
…t/prefix/public_url Por quê: o model precisa expor os três parâmetros que o novo MinioStorage exige (bucket, object_name_prefix, public_url) e permitir configurar leitura via CDN/domínio público distinto do host de escrita. Como: - Renomeia bucket_root para bucket; adiciona host_root_dir e public_base_url - Adiciona properties object_name_prefix e public_url, que derivam os parâmetros passados ao MinioStorage em get_files_storage - Amplia COUNTRY_REGION (China, Rússia, Panamá, República Dominicana) - Corrige bug em FileLocation.get_or_create (mensagem de erro referenciava 'obj' indefinido em vez de 'uri') - Ajusta obrigatoriedade/defaults de access_key, secret_key, bucket e remove índices obsoletos de host/bucket_root
Por quê: refletir no banco a renomeação bucket_root -> bucket e os novos campos host_root_dir / public_base_url introduzidos no model. Como: remove os índices obsoletos de host e bucket_root e aplica as alterações de campo correspondentes (gerada via makemigrations).
Por quê: list_display/search_fields ainda referenciavam bucket_root, o que quebraria o admin após a renomeação do campo no model. Como: atualiza MinioConfigurationViewSet para usar bucket em vez de bucket_root em list_display e search_fields.
…o leitura/escrita Por quê: a suíte antiga testava bucket_root/build_object_name/register, que não existem mais; era preciso cobrir o novo comportamento de prefixo de escrita vs. URL pública de leitura. Como: - Cobre get_full_object_name com e sem prefixo - Cobre get_uri com public_url (sem chamar presigned) e sem public_url (presigned com prefixo aplicado e query string removida) - Cobre fput: grava sob object_name_prefix, retry em NoSuchBucket (cria bucket + policy) e propagação de outros S3Error sem conversão - Cobre fput_content, remove e fget aplicando o prefixo - Adiciona helper make_s3_error para instanciar S3Error 'congelado' via construtor oficial, já que code é uma property sem setter
Por quê: o model não tinha cobertura para get_or_create e para as properties que derivam object_name_prefix/public_url a partir de host_root_dir e public_base_url, usadas por get_files_storage. Como: cobre get_or_create, os cálculos de object_name_prefix/public_url nos cenários com e sem host_root_dir/public_base_url, e a instanciação correta de MinioStorage via get_files_storage.
Member
Author
|
@rondinelisaad revisar novamente, fiz ajustes após nossa reunião |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Refatora a camada de armazenamento de arquivos (
files_storage) para desacoplar onde o arquivo é gravado de qual URL é usada para lê-lo, e propaga essa mudança para quem consome o storage (package/models.py).files_storage/minio.py:MinioStoragepassa a receberbucket,object_name_prefixepublic_url(em vez de um únicobucket_root).get_uripriorizapublic_url; sem ela, cai no presigned URL do próprio provedor, aplicando o prefixo viaget_full_object_name.fputabsorve o antigo_fput_object, mantendo o retry automático em caso de bucket inexistente. Removebuild_object_name/register(responsabilidade de nomeação não é mais da classe de storage).files_storage/models.py:MinioConfigurationganhahost_root_dir,bucket(renomeado debucket_root) epublic_base_url, com propertiesobject_name_prefix/public_urlque derivam os parâmetros passados aoMinioStorage. Corrige bug no log de erro deFileLocation.get_or_create(referenciavaobjem vez deuri) e ampliaCOUNTRY_REGION.0005_...): aplica a renomeação de campo e os novos campos no banco, removendo índices obsoletos.files_storage/wagtail_hooks.py: ajustalist_display/search_fieldspara o campobucket.package/models.py:SPSPkgdeixa de buscar a configuração do Minio internamente em cada chamada (MinioConfiguration.get_files_storagerepetido); agora a configuração é obtida uma única vez (get_minio_config()) e injetada como parâmetro em toda a cadeia de upload (upload_items_to_the_cloud,upload_to_the_cloud,upload_zip_content_to_the_cloud,upload_components_to_the_cloud,upload_xml_to_the_cloud,upload_article_page_to_the_cloud).files_storage/test_minio.pyefiles_storage/test_models.py(novo): suíte reescrita/criada cobrindo o novo contrato (prefixo de escrita, URL pública de leitura, retry emNoSuchBucket, propagação de outrosS3Error, properties deMinioConfiguration, fallback de configuração).libs/dsm/: módulo legado (storage antigo, publicação direta no OPAC via mongoengine) que não é mais referenciado pelo fluxo atual.Onde a revisão poderia começar?
files_storage/minio.py— é a base de todo o resto; entenderget_full_object_name,get_urie o retry emfput.files_storage/models.py— comoobject_name_prefix/public_urlsão derivados dehost_root_dir/public_base_url.package/models.py— como ominiopassou a ser injetado em vez de buscado a cada chamada (ponto com maior superfície de mudança de assinatura de métodos).0005_...ewagtail_hooks.py— conferência de que tudo aponta parabucket.Como este poderia ser testado manualmente?
python manage.py migrate files_storage).MinioConfigurationno admin do Wagtail preenchendobucket,host_root_direpublic_base_url(testar com e sempublic_base_urlpreenchido).SPSPkg.upload_to_the_cloud/fluxo completo) e confirmar:host_root_direstiver configurado);FileLocation/SPSPkgrefletepublic_base_url(ou o fallbackhttp(s)://host) corretamente, e o conteúdo é acessível por essa URL.python manage.py test files_storage.Algum cenário de contexto que queira dar?
A motivação principal foi permitir que o caminho físico de gravação (host interno, prefixo) seja independente da URL pública de leitura (ex.: CDN, domínio público diferente do host de escrita) — algo que o antigo
bucket_rootúnico não suportava. Como efeito colateral, isso obrigou a passar o objeto de configuração do Minio explicitamente pelas funções de upload doSPSPkg, em vez de buscá-lo repetidamente do banco a cada chamada (redução de N+1 consultas e maior previsibilidade de qual configuração está sendo usada durante todo o ciclo de upload de um pacote).A remoção de
libs/dsm/é um cleanup de código morto: esse módulo implementava uma integração antiga e direta com o OPAC viamongoengine, hoje substituída pelo fluxo atual.Screenshots
N/A — mudança de backend/infraestrutura, sem impacto visual direto. Se desejar, posso anexar prints do admin do Wagtail com os novos campos (
host_root_dir,bucket,public_base_url).Quais são tickets relevantes?
#999
Referências
[adicionar links, se houver — ex.: documentação interna sobre a topologia de storage MinIO/Wasabi]