Coder Social home page Coder Social logo

django-xram_memory's Introduction

Backend of the xRAM-Memory website

This project concentrates the content management system and the API for the xRAM-Memory website. The project used several Python libraries, especially: Django (base framework and CMS), Django REST Framework (API), newspaper3k and goose3 (news crawlers), django-filer (file management) and celery (queue management for processing). distributed).

Project dependencies are managed with the pipenv tool.

Instalação

  1. Install Python 3.7.* and Pipenv
  2. Install the packages: python3-dev(el), python3-pdfkit, poppler-utils and wkhtmltopdf
  3. Install project dependencies: pipenv install --dev --python 3.7 and npm install
  4. Set environment variables in .env from .env.example, in particular, set at least DJANGO_SECRET_KEY, DJANGO_LUNR_INDEX_REMOTE_SECRET and DJANGO_HASHID_FIELD_SALT variables
  5. Enter pipenv shell: pipenv shell
  6. Install nltk bodies: python ./scripts/download_corpora.py --user
  7. Collect the statics: ./manage.py collectstatic
  8. Create the media dir and the lunr index: mkdir -p ./media/lunr_index && ./media/lunr_index/index.json
  9. Run the migrations: ./manage.py migrate
  10. Create a superuser: ./manage.py createsuperuser

Local environment

Application

  1. Run the installation steps above
  2. Enter a pipenv shell
  3. Start a memcached container: docker run --name my-memcache -d -p 127.0.0.1:11211:11211 memcached memcached -m 64
  4. Start the application locally: ./manage.py runserver_plus
  5. Go to http://localhost:8000/admin/
  6. Clone, build the image and run the micro-lunr_index_builder project:
docker run -d --name xram_memory__lunr_index_builder -v <absolute path to the index file created on the step 7 above>:/usr/src/app/index.json:rw -e AUTH_TOKEN=<DJANGO_LUNR_INDEX_REMOTE_SECRET value> -p 3001:3000 xram_memory/lunr_index_builder

Celery

  1. Start a redis container listening on the default port locally:
docker run --name some-redis -d -p 127.0.0.1:6379:6379 redis
  1. Start as many instances of celery as necessary. In a pipenv shell, run:
celery worker -A xram_memory -n 1
  1. (Optional) Monitor workers with Flower. In a pipenv shell, run:
flower -A xram_memory

Data Entities

The following models (entities) are present in this project:

The diagram below illustrates the relationship between the entities (click to open the image):

diagram

Project structure

A Django project is made up of several applications, each with a specific responsibility, which can be expressed by the organization of folders. This is the structure of the ./xram_memory folder, which contains the system source code:

.
├── albums - Album management application
├── artifact - Artifact management application
├── lib - Specialized libraries developed for the project
│ ├── file_previews - File preview generator
│ ├── news_fetcher - Main system program, more about it below
│ │ └── plugins - The various plugin implementations
│ │ ├── archives - News Archivers
│ │ ├── parsers - News Content Extractors
│ │ └── pdf_captures - PDF news capture generators
│ └── stopwords - A dictionary of stopwords in multiple languages
├── logger - Application responsible for logging system operations
├── lunr_index - Application responsible for generating client-side search indexes
├── page - Application for managing Static Pages
├── quill_widget - Application that provides a rich text editing widget with the Quill.js library
├── search_indexes - Application responsible for generating server-side search indexes (ElasticSearch)
├── static - Static files
├── taxonomy - Application responsible for classifying content (Taxonomy)
├── templates - Global changes to templates
├── users - Application responsible for managing users and groups
└── utils - Global Utilities

In the ./tests folder we have the project tests. Code coverage is currently at 65%.

django-xram_memory's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar felipelube avatar

Watchers

 avatar  avatar

django-xram_memory's Issues

Permitir execução síncrona de atividades quando inserindo apenas uma notícia

Implementar o modo síncrono como failback

  • Avisar no dashboard que o servidor de filas não está disponível e que, portanto, algumas atividades demorarão mais para serem completadas e que algumas funcionalidades não estarão disponíveis (não é possível, pois o processamento é feito via sinais)
  • Executar atividades relacionadas à adição de informações adicionais à notícia sincronamente quando não houver servidor de filas disponível.

Simplificar documentos

Usuário deve inserir um documento sem ter que classificá-lo antes.

  • Obsoletar PDFDocument, ImageDocument
  • Utilizar apenas Document
  • Fazer uma função para determinar o local de download do documento com base no seu mimetype

Reorganização no app `taxonomy`

  • Criar classe base para itens de taxonomia
  • Criar novo item de taxonomia assunto
  • Relacionar esse item aos outros itens de conteúdo

Criar mecanismo de busca

Campos full text search

  • Título
  • Teaser
  • Campos devem ser normalizados: então => entao etc.

Facetas:
- tipo de documento

  • assunto
  • palavras-chave
  • intervalo de datas

Melhorias na interface administrativa

- Atalhos de teclado

Notícia

Formulário de edição/adição

  • Assuntos e Palavras chave devem ser inseridos/editados num campo autocompletar
  • Campos de Capturas devem exibir a pré-visualização da captura
  • Ações do formulário devem flutuar no rodapé: position:sticky ou similar

Lista de notícias

  • Botão para adicionar novas notícias deve ficar lado-a-lado com o botão para adicionar somente uma
  • Lista de notícias deve indicar se um item possui captura em pdf, imagem associada e/ou se possui informações básicas (usar ícones do google)

Documentos

Item de taxonomia

Lista de itens

- Inserir índice alfabético com as letras no topo da lista

Criar tipo de conteúdo Página (`page`)

Página

Uma página de conteúdo geral para o site ou um texto sobre determinado tema/assunto com
possibilidade de referências a um ou mais artefato do acervo

Campos:

  • Título

  • URL

  • Corpo

  • Chamada

  • Campos de publicação

  • Imagens (de fundo e thumbnail)

  • Corpo da página deve aceitar conteúdo formatado, utilizando um editor de texto rico

Unificar o design da página de inserção múltipla de notícias

A página deve parecer com a página de inserção solo, com fieldsets, alinhamento equivalente, breadcrumbs, barra de botões ao final etc.

  • Breadcrumbs
  • Textarea deve ficar alinhada abaixo do label
  • Campo endereços deve ser (estilizado como) obrigatório
  • Botão submit deve ser renomeado para 'Inserir notícias'
  • Label de ajuda, logo abaixo do textarea deve ficar alinhado com o textarea

Alterar look and feel da interface administrativa

  • Deve estar em português
  • Deve usar as cores do design felubra/nuxt-xram-memory
  • Deve usar as fontes do design felubra/nuxt-xram-memory
  • Definir fieldsets padrão para todos os modelos que herdarem de TraceableEditorialModel e TraceableModel

Criar aplicativo artefato

Reestruturação de modelos e aplicativos (I)

Criação do aplicativo artifact

Modelo "Artefato" (artifact)

  • Deve herdar de TraceableModel
  • Deve ser uma classe abstrata da qual os tipos abaixo serão herdarão

Modelo "Notícia" (news)

Uma notícia da web capturada em formato PDF

  • Modelo deve implementar funcionalidade para fazer as capturas
  • Modelo deve capturar sincronicamente: conteúdos da notícia e url de versão arquivada
  • Todas as imagens obtidas devem ser baixadas para o diretório de uploads e instanciadas como FileField
  • Um job para a captura de página deverá ser alocado na função save()

Modelo "Documento" (document)

PDFs, imagens etc.

  • Subtituir ArchivedNewsPDFCapture por um documento simples, já com o mimetype preenchido
  • Ao salvar o modelo, determinar o MIME type do arquivo e agendar um job para obter informações detalhadas sobre o arquivo. Por exemplo, se o arquivo tiver o MIME type image/jpeg, o job deve obter as informações sobre as dimensões da imagem.

Aplicativos descontinuados

  • archived_news deve dar lugar ao news do app acima
  • news_fetcher deve ter funcionalidade incorporada na classe do modelo news
  • documents deve ter funcionalidade incluída no aplicativo artifact

Implementar aplicação logger (auditoria)

Sistema de auditoria

Informações básicas que todo registro deve ter

  • Operação
  • Nome do usuário que está realizando a operação
  • Identificação do objeto que sofre a operação
  • IP do usuário
  • Data e hora da ação
  • Estágio ou resultado da ação (iniciado, concluído, falha)

Ações registradas pelo sistema por tipo de conteúdo

  • TODOS

    • Criação
    • Atualização
    • Deleção
  • Notícia

    • Captura de conteúdo
    • Captura de versão arquivada
    • Captura de página

Informações específicas por tipo de ação

Captura de página
  • URL de captura
  • Nome do arquivo gerado
  • Tempo da operação
Captura de conteúdo
  • Campos atualizados
  • URL utilizada para obter os dados
  • Biblioteca utilizada para obter os dados
  • Tempo da operação
  • Relatório de captura (arquivo pdf gerado pelo sistema)
Captura de versão arquivada
  • Nome do arquivo
  • Tempo da operação

Melhor captura de páginas

Tentar replicar o funcionamento de http://archive.fo/

  • Capturar o log de requisições feitas à página

  • Capturar uma imagem da página completa

  • Capturar a página em HTML e todos os seus recursos num arquivo .zip

  • Estudar https://pywb.readthedocs.io/en/latest/manual/usage.html

  • Usar http://timetravel.mementoweb.org/guide/api/ (http://timetravel.mementoweb.org/api/json//) para pegar um arquivo de notícia, rodar o newspapper3k nela e indexar o conteúdo

  • Usar a Memento API dos sites de arquivo para pegar vários snapshots da notícia - arquivar essa informação. Notícia deve ter indicação se está offline e dicionário com snapshots disponíveis.

  • Se possível, comparar os vários snapshots

  • Se a notícia não tem snapshots, gravar um no próprio arquivo do site ou então solicitar a gravação num site de arquivo e pegar a URl.

Recursos:
https://fettblog.eu/scraping-with-puppeteer/
https://github.com/GoogleChrome/puppeteer/blob/v1.11.0/docs/api.md#pagescreenshotoptions
https://miyakogi.github.io/pyppeteer/

Expandir taxonomia

  • Adicionar itens de taxonomia: anos, idioma
  • Inferir ano e idioma automaticamente de notícias e documentos

Arquivos devem ter miniatura para exibição

Não apenas imagens, mas também arquivos PDF.
Deve ter um failback para ícones em casos de tipos sem visualização.
Utilizar os projetos:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.