Cluster ERP'nin her iş özelliği bir modüldür: src/cluster_erp/modules/ altında, Module sınıfı ModuleBase'den türeyen bir module.py dosyası taşıyan bir paket. Bu sayfa core/module_base.py içindeki sözleşmeyi ve core/module_registry.py'nin modülleri nasıl bulduğunu, yüklediğini ve kapattığını anlatır. Modüllerin kendileri modüller bölümünde belgelenir.
Kısaca¶
ModuleBaseüç soyut özellik (name,version,description) ve beş soyut yöntem (initialize,register_routes,register_events,shutdown,get_metadata) bildirir (src/cluster_erp/core/module_base.py:24-74).- Bir modülün API öneki
/api/v1/<name>'dir (src/cluster_erp/core/module_base.py:36-38). - Kayıt
cluster_erp.modules.<name>.modulemodülünü içe aktarır,Modulesınıfından örnek oluşturur veinitialize,register_routesveregister_eventsyöntemlerini bu sırayla çağırır (src/cluster_erp/core/module_registry.py:32-56). - Modüller
enabled_modulesayarındaki sırayla yüklenir (src/cluster_erp/core/module_registry.py:58-72,src/cluster_erp/config/settings.py:535-564). - Kapanışta kayıt, yüklü her modülde
shutdownçağırır ve hataları yükseltmeden günlüğe yazar (src/cluster_erp/core/module_registry.py:74-80).
Nasıl çalışır¶
Sözleşme¶
| Üye | Tür | Kaydın veya sunucunun beklentisi | Kaynak |
|---|---|---|---|
name |
soyut özellik | Modül anahtarı; registry.loaded içindeki anahtar da budur |
src/cluster_erp/core/module_base.py:24-26 |
version |
soyut özellik | GET /api/v1/modules tarafından gösterilen sürüm dizgisi |
src/cluster_erp/core/module_base.py:28-30 |
description |
soyut özellik | GET /api/v1/modules tarafından gösterilen tek satırlık açıklama |
src/cluster_erp/core/module_base.py:32-34 |
api_prefix |
özellik | Modüllerin yönlendiricilerinde kullandığı /api/v1/{name} |
src/cluster_erp/core/module_base.py:36-38 |
request_database() |
yöntem | Süren bir istek varsa o isteğin veritabanı, yoksa modülün kendi veritabanı tutamacı | src/cluster_erp/core/module_base.py:40-59 |
initialize(database) |
soyut async yöntem | Sürecin varsayılan Database nesnesiyle ilk çağrılan yöntem |
src/cluster_erp/core/module_base.py:61-62 |
register_routes(app) |
soyut yöntem | Modülün yönlendiricilerini FastAPI uygulamasına ekler | src/cluster_erp/core/module_base.py:64-65 |
register_events(bus) |
soyut yöntem | EventBus üzerinde olay işleyicilerini abone eder ve sorgu işleyicilerini kaydeder |
src/cluster_erp/core/module_base.py:67-68 |
shutdown() |
soyut async yöntem | Süreç sonunda temizlik | src/cluster_erp/core/module_base.py:70-71 |
get_metadata() |
soyut yöntem | Modülün ModuleMeta nesnesini döndürür |
src/cluster_erp/core/module_base.py:73-74 |
Bulma ve yükleme¶
Durum şeması bir modülün sunucu süreci içindeki ömrünü gösterir.
stateDiagram-v2 [*] --> Imported: import cluster_erp.modules.name.module Imported --> Instantiated: Module() Instantiated --> Initialized: initialize(database) Initialized --> Routed: register_routes(app) Routed --> Wired: register_events(bus) Wired --> Serving: kayda eklendi Serving --> Stopped: shutdown() Stopped --> [*]
Düz metinle:
discover(),cluster_erp.modulesaltındaki alt paketleripkgutil.iter_modulesile listeler (src/cluster_erp/core/module_registry.py:26-30).load_all(), ayarlanmışsaenabled_moduleslistesini, değilse bulunan listeyi alır. Etkin olup bulunamayan bir ad bir uyarıyla atlanır (src/cluster_erp/core/module_registry.py:58-71).load_module(),cluster_erp.modules.<name>.modulemodülünü içe aktarır. İçe aktarma hatasıModuleLoadErroryükseltir.Modulesınıfı olmayan bir dosya daModuleLoadErroryükseltir (src/cluster_erp/core/module_registry.py:39-47).Module()örneğini oluşturur veinitialize(database)çağrısını bekler, ardındanregister_routes(app)veregister_events(bus)çağırır (src/cluster_erp/core/module_registry.py:49-52).- Örneği
instance.namealtında saklar ve yüklemeyi günlüğe yazar (src/cluster_erp/core/module_registry.py:54-56).
load_all, ModuleLoadError yakalamaz (src/cluster_erp/core/module_registry.py:58-72). Lifespan load_all çağrısını bir işleyici olmadan yapar (src/cluster_erp/server/app.py:140); bu yüzden başarısız bir modül açılışı durdurur.
Modüllerin her adımda yaptığı¶
initializeveritabanı tutamacını saklar, modülün modellerini içe aktarır ve referans veri tohumlayabilir.partiesmodülü kanal türlerini ve ülkeleri tohumlar (src/cluster_erp/modules/parties/module.py:37-42).logsmodülü yalnızca modellerini içe aktarır (src/cluster_erp/modules/logs/module.py:28-29).register_routes,prefix=self.api_prefixile birAPIRouterkurar ve alt modül yönlendiricilerini ekler. 28module.pydosyasının 20'si yönlendirici bağımlılığı olarakrequire_app(self.name)verir (grep -l "require_app("ile sayıldı); örnek:src/cluster_erp/modules/currencies/module.py:64-82. Uygulama hakları uygulama mağazası, lisanslama ve haklar sayfasında belgelenir.register_eventsişleyicileri bağlar. Bkz. olay veri yolu.shutdown, 28 modülün 25'indepass'tir (async def shutdownsatırından sonraki satırdan sayıldı).
Metadata'yı kim okur¶
get_metadata() açılışta kiracı alanı tanımlarını kurmak ve izinleri tohumlamak için (src/cluster_erp/server/app.py:151-152), istek anında ise GET /api/v1/_meta tarafından okunur (src/cluster_erp/server/app.py:1531-1534). Bkz. metadata modeli.
Neden böyle kurulmuştur¶
ModuleBasebelge dizgisi tarifi verir: bir paket oluştur,Moduleadlı sınıfı içerenmodule.pyekle, soyut yöntemleri uygula; modül açılışta bulunur ve yüklenir (src/cluster_erp/core/module_base.py:15-22).request_databasebelge dizgisi neden var olduğunu belirtir: modüller varsayılan veritabanıyla bir kez başlatılır, ama çok kiracılı kipte bir istek kendi kiracısının veritabanında çalışır; bu yüzden bir işleyici isteğin veritabanını kullanmalıdır (src/cluster_erp/core/module_base.py:41-53).- Projenin yazılı mühendislik kuralları aynı dört adımlı yaşam döngüsünü belirtir.
Kurallar ve sınırlar¶
- Her modül klasöründe bir
module.pyvardır ve her modül en az bir rota dekoratörü bildirir. İkisini detests/test_architecture_boundaries.py:60-72zorlar. - Bir modül,
cluster_erp.modules.auth.guardsdışında başka bir modülü içe aktarmaz. Bunutests/test_architecture_boundaries.py:46-57zorlar.
Diğer parçalarla etkileşim¶
- Sunucu kaydı oluşturur ve lifespan içinde
load_allileshutdown_allçağırır (src/cluster_erp/server/app.py:63,src/cluster_erp/server/app.py:140,src/cluster_erp/server/app.py:220). Bkz. sunucu açılışı ve uygulama fabrikası. GET /api/v1/modules, oturum açmış bir çağırana yüklü her modülün adını, sürümünü ve açıklamasını döndürür (src/cluster_erp/server/app.py:1506-1515).
Sınırlar ve açık noktalar¶
- Kayıtta modüller arası bağımlılık sıralaması yoktur; sıra listenin sırasıdır. Bir modülün başka bir modülün
initializeadımının önce çalışmış olmasına dayanıp dayanmadığı koddan belirlenemedi. registry.get(name)bilinmeyen bir ad içinModuleNotRegisteredErroryükseltir (src/cluster_erp/core/module_registry.py:82-86). Çağıranları bu sayfa için listelenmedi.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| module registry | ModuleRegistry |
Modülleri bulan, yükleyen ve kapatan nesne. | modül kaydı | src/cluster_erp/core/module_registry.py:22 |
| API prefix | api_prefix |
Bir modülün yollarının temel yolu; /api/v1/ ve ardından modül adı. |
API öneki | src/cluster_erp/core/module_base.py:36-38 |
İlgili sayfalar¶
- Platform çekirdeği
- Sunucu açılışı ve uygulama fabrikası
- Olay veri yolu
- Metadata modeli
- Bir arka uç modülü yazın
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.