Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt, Cluster ERP ekranlarının sunucudaki modül metadata'sıyla tanımlandığı ve genel istemci koduyla çizildiği kuralı kapsar. Kural webapp/ içindeki web uygulamasına tamamen, masaüstü istemcinin kayıt ekranlarına da uygulanır. Metadata sınıfları metadata modeli sayfasında belgelenir.
Bağlam¶
Cluster ERP'nin her biri birçok varlığa sahip 28 modülü vardır. Projenin yazılı mühendislik kuralları web uygulamasının tamamen metadata güdümlü olduğunu söyler: ekran, form, liste ve aksiyon davranışı metadata'dan gelir; yalnız arayüze gömülmüş kurallar yasaktır. Metadata testi kural uygulanmadan önce olanı kaydeder: kurallar "used to hide in the web client" ve metadata'ya, i18n'e veya veriye taşındı (tests/test_metadata_driven_rules.py:1-5). Başka bir gerekçe koddan belirlenemez.
Karar¶
- Her modül
get_metadataile birModuleMetadöndürür (src/cluster_erp/core/module_base.py:73-74).src/cluster_erp/core/metadata.pyvarlıklar, alanlar, sütunlar, aksiyonlar, sekmeler, facet'ler ve kenar çubuğu için 45 sınıf tanımlar (grep -c "^class "ile sayıldı). - Sunucu yüklü tüm modüllerin metadata'sını
/api/v1/_metaadresinde yayımlar (src/cluster_erp/server/app.py:1519-1546). - Genel istemci kodu listeleri, formları ve kayıt kartlarını bundan çizer. Genel kod iş modülü adlarıyla karşılaştırma yapmaz ve modül yolları veya yetkileri tutmaz.
- Metadata'nın ifade edemediği modüle özgü bir ekran, o modülün kendi kapılı paketindeki ve metadata'da bildirilen özel bir bileşendir (
tests/test_metadata_driven_rules.py:158-180).
Akış şeması bir modülden bir ekrana giden yolu gösterir.
flowchart LR mod["Module.get_metadata"] --> eff["effective_module_meta"] eff --> meta["GET /api/v1/_meta"] meta --> web["webapp genel motorları"] meta --> desk["masaüstü MetadataStore"] desk --> gen["widgets/generic görünümleri"] meta --> bundle["gated_apps paketi özel bileşeni"]
Düzyazıyla: sunucu effective_module_meta içinde her modülün metadata'sını kiracı tanımlı alanlarla birleştirir ve sonucu süreç başına bir kez, bir ETag ile sunar (src/cluster_erp/server/app.py:1531-1544). Web motorları gen-list.js, gen-form.js ve gen-detail.js buradan çizer. Masaüstü istemci aynı belgeyi metadata deposuna yükler (src/cluster_erp/desktop/core/metadata_store.py:21) ve görünümleri src/cluster_erp/desktop/widgets/generic/ içinde kurar. Özel bileşenler gated_apps/<module>/app.js içinde durur (tests/test_metadata_driven_rules.py:175-180).
Sonuçlar¶
- Yeni bir varlık ekranı yalnız metadata ister; bkz. metadata ile ekran ekleyin.
- Platform özellikleri modül adıyla değil yetenekle bulunur. Kayıt belgeleri sağlayıcısı
providesile bildirilir (src/cluster_erp/core/metadata.py:731-735,tests/test_metadata_driven_rules.py:63-74). - Ana ekran bileşenleri modüllerce
home_widgetsile bildirilir ve modülün paketiyle çizilir (src/cluster_erp/core/metadata.py:739-740). - Taraf rolleri taraf kartında
FacetMetaile görünür; bkz. taraf birleşimi. - Yetki kodları açılışta metadata'daki varlıklardan tohumlanır (
src/cluster_erp/server/app.py:642-652).
Kodun uyguladığı yerler¶
| Mekanizma | Neyi denetler | Kaynak |
|---|---|---|
test_generic_web_engines_do_not_branch_on_business_module_names |
Beş genel motor hiçbir iş modülü adıyla karşılaştırma yapmaz | tests/test_architecture_boundaries.py:75-87 |
test_generic_web_code_names_no_module_paths_permissions_or_language_columns |
On bir genel dosya modül yolu, modül yetkisi, dil sütunu veya dil dalı adlandırmaz | tests/test_metadata_driven_rules.py:85-112 |
test_every_is_active_column_declares_the_active_flag_formatter |
Liste davranışı sütunun bildirdiği biçimleyiciden gelir | tests/test_metadata_driven_rules.py:36-48 |
test_home_widgets_are_module_metadata_rendered_by_module_bundles |
Ana ekran bileşenleri modül metadata'sıdır; home.js hiçbirini adlandırmaz |
tests/test_metadata_driven_rules.py:158-193 |
test_working_calendar_is_the_calendars_modules_custom_tab |
Çalışma takvimi genel kod değil, özel bir sekmedir | tests/test_metadata_driven_rules.py:196-214 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.