Cria projeto inicial para acomodar gerenciador de logs, cálculo de métricas de acesso e api sushi#1
Cria projeto inicial para acomodar gerenciador de logs, cálculo de métricas de acesso e api sushi#1gitnnolabs merged 40 commits intoscieloorg:mainfrom pitangainnovare:main
Conversation
|
Grato!
Em sex., 26 de abr. de 2024 às 11:11, Pitanga Innovare <
***@***.***> escreveu:
… @rafaelpezzuto <https://github.com/rafaelpezzuto>
Poderia me enviar alguns arquivos de logs para exemplo ? Para realizar
alguns testes de execução.
Grato!
Bom dia, sim, claro. Acabei de enviar alguns exemplares para seu e-mail @
innolabs.com.br.
Qualquer dúvida, estou à disposição.
—
Reply to this email directly, view it on GitHub
<#1 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AUXWFJQFSVTCPKUIGO4EAN3Y7JN7RAVCNFSM6AAAAABF32E6W2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZZGQ3TIOBQGA>
.
You are receiving this because your review was requested.Message ID:
***@***.***>
--
Jamil Atta Junior
* innoLabs*
www.innolabs.com.br
|
| User = get_user_model() | ||
|
|
||
|
|
||
| def _get_user(request, username=None, user_id=None): |
There was a problem hiding this comment.
Utilizar a funcao '_get_user' que esta localizado em core/utils/utils.py e apagar esta
There was a problem hiding this comment.
Essa app foi extraída do repositório core. Fiz alguns ajustes para padronizar com o sugerido. Obrigado.
| ... | ||
|
|
||
|
|
||
| class EventReportDeleteEventsError(Exception): |
There was a problem hiding this comment.
Talvez seja melhor colocar essas execeções em um arquivo excepetions.py
| @@ -0,0 +1,24 @@ | |||
| from rest_framework import serializers | |||
There was a problem hiding this comment.
Esses modulos de APi vao ser utilizados?
There was a problem hiding this comment.
Não no contexto da app core e sim em uma app nova (sushi).
|
|
||
| @celery_app.task(bind=True) | ||
| def task_load_collections(self, user_id=None, username=None): | ||
| if user_id: |
|
|
||
| @classmethod | ||
| def get(cls, config_type, sorting_field='-version_number'): | ||
| return cls.objects.filter( |
There was a problem hiding this comment.
Alterar o nome do método para de acordo com o função. Ou alterar a query para cls.objects.get(config_type=config_type)
There was a problem hiding this comment.
Preciso que seja filter. Mudarei o nome.
| @classmethod | ||
| def create(cls, user, config_type, value, is_enabled=True, version_number=None): | ||
| try: | ||
| last_config = cls.objects.filter(config_type=config_type).order_by('-version_number').first() |
There was a problem hiding this comment.
Com esse trecho de código, não acontecerá a exceção 'cls.DoesNotExist'.
There was a problem hiding this comment.
Verdade, só ocorre com get. Obrigado. Corrigi.
| base_form_class = CoreAdminModelForm | ||
|
|
||
| panels = [ | ||
| FieldPanel('collection'), |
There was a problem hiding this comment.
Utilizar AutocompletePanel.
from wagtailautocomplete.edit_handlers import AutocompletePanel
panels = [
AutocompletePanel("collection")
]|
|
||
| @classmethod | ||
| def get(cls, collection_acron2, config_type, is_enabled=True): | ||
| return cls.objects.filter( |
There was a problem hiding this comment.
Não devp, pois aqui posso obter mais de um elemento (como num outro caso já citado). Mudei o nome do método para ser mais claro. Obrigado.
|
|
||
| panel = [ | ||
| FieldPanel('date'), | ||
| FieldPanel('log_file') |
| @classmethod | ||
| def create(cls, user, collection, path, stat_result, hash, status=None): | ||
| try: | ||
| obj = cls.objects.get(hash=hash) |
| FieldPanel('path'), | ||
| FieldPanel('stat_result'), | ||
| FieldPanel('status'), | ||
| FieldPanel('collection'), |
| "date", | ||
| "log_file__collection", | ||
| ) | ||
| search_fields = () |
There was a problem hiding this comment.
Sim, ficará vazio por enquanto.
| base_form_class = CoreAdminModelForm | ||
|
|
||
| panels = [ | ||
| FieldPanel('log_file'), |
| """ | ||
| col = Collection.objects.get(acron2=collection_acron2) | ||
|
|
||
| col_configs_dirs = models.CollectionConfig.get( |
There was a problem hiding this comment.
No método de classe CollectionConfig.get(), ao mudar de filter() para get(), esse trecho de código ficaria com mais clareza e garantiria que trataremos a ausência do objeto esperado de forma explícita
try:
col_configs_dirs = models.CollectionConfig.get(
collection_acron2=collection_acron2,
config_type=choices.COLLECTION_CONFIG_TYPE_DIRECTORY_LOGS,
is_enabled=is_enabled,
)
except models.CollectionConfig.DoesNotExist:
raise exceptions.UndefinedCollectionConfigError('ERROR. Please, add a Collection Config for the Logs Directory.')There was a problem hiding this comment.
Exato. A confusão esteve em nomear como "get" um elemento que usa filter. Corrigi o nome e creio ter ficado mais claro.
|
|
||
|
|
||
| def temporal_reference_to_datetime(text): | ||
| text = text.lower() |
There was a problem hiding this comment.
Colocar esta linha dentro do if para evitar erros de NoneType
| Returns: | ||
| None. | ||
| """ | ||
| if username: |
|
|
||
|
|
||
| @celery_app.task(bind=True, name=_('Create Log File')) | ||
| def task_create_log_file(self, collection, path, user_id=None, username=None): |
There was a problem hiding this comment.
celery precisa serializar os argumentos para envia-los ao workers. Então, seria interessante voce passar algum identificador de collection para você obter ele dentro da task e assim passar o objeto collection para o método create()
|
|
||
| @celery_app.task(bind=True, name=_('Validate Log'), timelimit=-1) | ||
| def task_validate_log(self, log_file_hash, user_id=None, username=None): | ||
| if username: |
| Returns: | ||
| None. | ||
| """ | ||
| if username: |
|
|
||
| @celery_app.task(bind=True, name=_('Download Supplies')) | ||
| def task_download_supplies(self, url_robots, url_mmdb, user_id=None, username=None): | ||
| if user_id: |
|
|
||
| # Django | ||
| # ------------------------------------------------------------------------------ | ||
| django==4.2.7 |
There was a problem hiding this comment.
Atualizar django e wagtail para versões mais recente
| context: . | ||
| dockerfile: ./compose/local/django/Dockerfile | ||
| image: scielo_core_local_django | ||
| container_name: scielo_core_local_django |
There was a problem hiding this comment.
mudar nome dos containers tanto em local.yml como em production.yml.
Sugestão: scielo_usage_local...
| @@ -78,3 +78,32 @@ def task_discover(self, collection_acron2, is_enabled=True, temporal_reference=N | |||
|
|
|||
| if not (temporal_reference or from_date) or file_ctime > obj_from_date: | |||
| task_create_log_file(col, file_path, user_id, username) | |||
There was a problem hiding this comment.
task_create_log_file.apply_async(args=(collection_acron2, file_path, user_id, username))
|
@pitangainnovare solicitei para o @samuelveigarangel realizar a validação! Assim que possível por gentileza, verifique a possibilidade dos ajustes solicitado pelo @samuelveigarangel |
|
Pessoal irei aprovar esse PR para que tenhamos um ambiente de homologação. |
Aplica correções sugeridas pela revisão realizada no Pull Request #1
O que esse PR faz?
Este PR cria, inicialmente, uma estrutura baseada nos templates scms (core, upload, entre outros) para acomodar, numa única app, as funcionalidades de:
Este PR abarca a construção inicial do projeto, com os apps de rastreamento de erros (tracker), execução de tarefas assíncronas (Celery), modelagem de gerente de logs (log_manager) e indexação de dados (Solr).
Por onde a revisão poderia começar?
Sugere-se revisar por commits. A partir do commit 682519d códigos novos, de fato, são adicionados ao projeto. Antes dele, alguns trechos aproveitados dos projetos core e upload são maioria - ainda assim, sugere-se também analisar os arquivos de configuração do projeto (config) e requirements.
Como este poderia ser testado manualmente?
Pode-se seguir os seguintes passos para construir e rodar a aplicação, estando na raiz do projeto:
Após o quinto passo, a aplicação deverá estar funcional e acessível por meio da url http://0.0.0.0:8009/admin
Log Manager, que, quando acionado, lista os cinco items seguintes:Application Configuration,Collection Configuration,Log File Dates,Log FileeLog Processed Row.Para testar a aplicação, é preciso realizar algumas adições de conteúdo, como ter uma lista de coleções e configurações associadas à aplicação e às coleções. Os passos 9 a 11 ilustram como fazer isso:
username: "SEU_NOME_DE_USUARIO"no campo keyword arguments, além dos parâmetros "url_robots" e "url_mmdb", como mostra a imagem e dicionário seguintes){ "username": "SEU_NOME_DE_USUARIO", "url_robots": "https://raw.githubusercontent.com/atmire/COUNTER-Robots/master/COUNTER_Robots_list.json", "url_mmdb": "https://download.db-ip.com/free/dbip-city-lite-2024-03.mmdb.gz", }make django_shell). Também é possível configurar periodic_task, bastando acrescentar o username no campo keyword arguments.Algum cenário de contexto que queira dar?
N/A
Screenshots
N/A
Quais são tickets relevantes?
N/A
Referências
N/A