Skip to content

Implement shared domain models in core/models.py#54

Draft
Copilot wants to merge 2 commits intomainfrom
copilot/add-shared-domain-models
Draft

Implement shared domain models in core/models.py#54
Copilot wants to merge 2 commits intomainfrom
copilot/add-shared-domain-models

Conversation

Copy link
Copy Markdown

Copilot AI commented Mar 24, 2026

O que esse PR faz?

Porta os modelos de domínio compartilhado do scieloorg/core para este repositório, permitindo que módulos reutilizem entidades comuns (Language, Gender, License, etc.) sem redefinição.

Modelos concretos (com migração): Gender, Language, License, LicenseStatement, FlexibleDate

Modelos abstratos: TextWithLang, TextLanguageMixin, RichTextWithLanguage, FileWithLang

Infraestrutura adicionada:

  • core/choices.py — constantes LANGUAGE (185 códigos ISO 639-1), GENDER_CHOICES, LICENSE_TYPES, MONTHS
  • core/utils/utils.pylanguage_iso() usando langcodes para normalização de códigos
  • LanguageFallbackManager — manager com fallback pt → es → en
  • Dependência langcodes==3.5.1 em requirements/base.txt

Onde a revisão poderia começar?

core/models.py — contém todos os modelos e o LanguageFallbackManager.

Como este poderia ser testado manualmente?

DATABASE_URL=sqlite:///db.sqlite3 CELERY_BROKER_URL=redis://localhost:6379/0 \
  USE_DOCKER=no DJANGO_SETTINGS_MODULE=config.settings.local \
  python manage.py test core.tests -v2

42 testes cobrindo:

  • language_iso() normalização (hyphen/underscore split, empty, None, invalid)
  • Gender.create_or_update e unique_together
  • Language.get_or_create com normalização via language_iso() e load() idempotente
  • License.get com iexact e unique_together
  • LicenseStatement.parse_url extração de license_type/license_version
  • FlexibleDate.data property
  • Verificação de abstract=True/False em todos os modelos

Algum cenário de contexto que queira dar?

Estes modelos são equivalentes aos do repositório scieloorg/core e seguem os mesmos contratos. Exemplo de uso:

from core.models import Language, License, LicenseStatement

# Normaliza código e busca/cria
lang = Language.get_or_create(code2="pt-BR", name="Português", creator=user)
# lang.code2 == "pt"

# Busca case-insensitive
lic = License.get("BY-NC")

# Extrai tipo e versão de URL CC
LicenseStatement.parse_url("https://creativecommons.org/licenses/by/4.0/")
# {"license_type": "by", "license_version": "4.0"}

Screenshots

N/A — sem alterações visuais.

Quais são tickets relevantes?

N/A

Referências

Original prompt

This section details on the original issue you should resolve

<issue_title>Implementar modelos de dominio compartido en core/models.py</issue_title>
<issue_description>### Descripción de la nueva funcionalidad
Yo, como desarrollador backend, quiero que los modelos Gender, Language, License, LicenseStatement, FlexibleDate, TextWithLang, TextLanguageMixin, RichTextWithLanguage y FileWithLang existan en core/models.py, para que los distintos módulos de la aplicación puedan reutilizar entidades comunes sin redefinirlas.

Criterios de aceptación

  • Language debe tener los campos name y code2, y el método de clase get_or_create que normaliza code2 usando language_iso() antes de buscar o crear el registro.
  • Language.load(user) debe poblar la tabla a partir de choices.LANGUAGE solo si está vacía.
  • Gender debe tener unique_together = [("code", "gender")] y el método create_or_update.
  • License debe tener unique_together = [("license_type",)] e índice en license_type; el método get debe usar iexact.
  • LicenseStatement debe tener unique_together = [("url", "license_p", "language")] e índice en url.
  • LicenseStatement.parse_url(url) debe extraer license_type y license_version a partir de una URL de Creative Commons.
  • LanguageFallbackManager.get_object_in_preferred_language debe retornar resultados en el idioma solicitado y, como fallback, en orden pt → es → en.
  • FlexibleDate debe exponer la propiedad data como diccionario con claves date__year, date__month, date__day.
  • FileWithLang debe exponer la propiedad filename usando os.path.basename.
  • Todos los modelos abstractos no deben generar migraciones propias.
  • Debe existir la migración core/migrations/0001_initial.py contemplando los modelos concretos: Gender, Language, License, LicenseStatement, FlexibleDate.

Anexos

  • RichTextWithLanguage, TextWithLang, TextLanguageMixin y FileWithLang son abstractos y no requieren migración.

Referencias

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

…, FlexibleDate) and abstract models (TextWithLang, TextLanguageMixin, RichTextWithLanguage, FileWithLang) to core/models.py

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Agent-Logs-Url: https://github.com/scieloorg/markapi/sessions/87eea582-78f5-4df3-8dd9-5115e4f29c2f
Copilot AI changed the title [WIP] Add shared domain models in core/models.py Implement shared domain models in core/models.py Mar 24, 2026
Copilot AI requested a review from robertatakenaka March 24, 2026 12:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implementar modelos de dominio compartido en core/models.py

2 participants