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
Descripción de la nueva funcionalidad
Yo, como desarrollador backend, quiero que los modelos
Gender,Language,License,LicenseStatement,FlexibleDate,TextWithLang,TextLanguageMixin,RichTextWithLanguageyFileWithLangexistan encore/models.py, para que los distintos módulos de la aplicación puedan reutilizar entidades comunes sin redefinirlas.Criterios de aceptación
Languagedebe tener los camposnameycode2, y el método de claseget_or_createque normalizacode2usandolanguage_iso()antes de buscar o crear el registro.Language.load(user)debe poblar la tabla a partir dechoices.LANGUAGEsolo si está vacía.Genderdebe tenerunique_together = [("code", "gender")]y el métodocreate_or_update.Licensedebe tenerunique_together = [("license_type",)]e índice enlicense_type; el métodogetdebe usariexact.LicenseStatementdebe tenerunique_together = [("url", "license_p", "language")]e índice enurl.LicenseStatement.parse_url(url)debe extraerlicense_typeylicense_versiona partir de una URL de Creative Commons.LanguageFallbackManager.get_object_in_preferred_languagedebe retornar resultados en el idioma solicitado y, como fallback, en ordenpt → es → en.FlexibleDatedebe exponer la propiedaddatacomo diccionario con clavesdate__year,date__month,date__day.FileWithLangdebe exponer la propiedadfilenameusandoos.path.basename.core/migrations/0001_initial.pycontemplando los modelos concretos:Gender,Language,License,LicenseStatement,FlexibleDate.Anexos
RichTextWithLanguage,TextWithLang,TextLanguageMixinyFileWithLangson abstractos y no requieren migración.Referencias
unique_togetherRichTextField