src/cluster_erp/desktop/core/signal_bus.py içindeki SignalBus, masaüstü istemcide ekranlar arasındaki tek kanaldır. Bir varlık tanımlayıcısıyla ApiClient üzerinden gönderilen değişiklik bir değişiklik sinyali yayar ve watch_entity ile bağımlılık bildiren her ekran yenilenir. Bu sayfa sinyalleri, değişiklikten sinyale giden yolu ve abonelik kurallarını açıklar. Modüller için sunucu tarafındaki karşılığı olay veri yolu sayfasındadır; web istemcisindeki karşılığı veri yenileme ve değişiklik sinyalleri sayfasındadır.
Kısaca¶
SignalBus, 12 sinyali olan birQObjectnesnesidir; sayısrc/cluster_erp/desktop/core/signal_bus.py:18-44içindekiSignal(sınıf öznitelikleri sayılarak çıkarıldı.ApiClient.post,put,patch,delete,post_multipartveput_multipart, birentitytanımlayıcısı verildiğinde başarılı bir çağrıdan sonraentity_created,entity_updatedveyaentity_deletedyayar (src/cluster_erp/desktop/core/api_client.py:213-294).watch_entity(entity, callback, owner=...), o modül ve varlık türündeki her değişikliktecallbackçağırır ve sahip bileşen yok edildiğinde kendi bağlantısını keser (src/cluster_erp/desktop/core/signal_bus.py:55-85).FkCacheaynı üç sinyali dinler ve değişen modülün önbelleğe alınmış seçenek listelerini düşürür (src/cluster_erp/desktop/core/fk_cache.py:51-77).
Nasıl çalışır¶
Sinyaller¶
| Sinyal | Bağımsız değişkenler | Yayan | Alan |
|---|---|---|---|
navigate_to |
modül, bölüm, parametreler | GenericDetailView._follow_link, depo ve MRP panoları (src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:767, src/cluster_erp/desktop/modules/inventory/warehouse_dashboard.py:91, src/cluster_erp/desktop/modules/procurement/mrp/dashboard.py:94) |
MainWindow._on_navigate_to (src/cluster_erp/desktop/widgets/main_window.py:66) |
open_entity |
modül, varlık türü, kimlik, başlık | çizelgeleme panosu (src/cluster_erp/desktop/modules/production/scheduling_board.py:2220) |
MainWindow._on_open_entity (src/cluster_erp/desktop/widgets/main_window.py:67) |
entity_created |
modül, varlık türü, kimlik | ApiClient.emit_entity_change (src/cluster_erp/desktop/core/api_client.py:213-218) |
watch_entity geri çağrıları, FkCache, iki panel |
entity_updated |
modül, varlık türü, kimlik | ApiClient.emit_entity_change |
watch_entity geri çağrıları, FkCache, iki panel |
entity_deleted |
modül, varlık türü, kimlik | ApiClient.emit_entity_change |
watch_entity geri çağrıları, FkCache, bir panel |
theme_changed |
tema adı | masaüstü klasöründe yayan yok | masaüstü klasöründe alan yok |
language_changed |
dil kodu | masaüstü klasöründe yayan yok | masaüstü klasöründe alan yok |
connection_status_changed |
bağlı bayrağı | StatusBarWidget._set_status (src/cluster_erp/desktop/widgets/status_bar.py:65-70) |
masaüstü klasöründe alan yok |
user_logged_in |
kullanıcı sözlüğü | main() ve MainWindow._on_session_expired (src/cluster_erp/desktop/main.py:192, src/cluster_erp/desktop/widgets/main_window.py:264) |
StatusBarWidget (src/cluster_erp/desktop/widgets/status_bar.py:44) |
user_logged_out |
yok | MainWindow._do_logout ve _on_session_expired (src/cluster_erp/desktop/widgets/main_window.py:241, src/cluster_erp/desktop/widgets/main_window.py:267) |
StatusBarWidget (src/cluster_erp/desktop/widgets/status_bar.py:45) |
session_expired |
yok | ApiClient._emit_session_expired (src/cluster_erp/desktop/core/api_client.py:207-211) |
MainWindow._on_session_expired (src/cluster_erp/desktop/widgets/main_window.py:65) |
accessibility_changed |
renk körlüğü kipi | main() içinde AccessibilityManager.settings_changed üzerine bir lambda (src/cluster_erp/desktop/main.py:173-175) |
BomExplorer (src/cluster_erp/desktop/modules/bom/bom_explorer.py:1118) |
Satırlar her sinyal adı src/cluster_erp/desktop/ içinde aranarak bulundu. src/cluster_erp/desktop/core/signal_bus.py:31-35 içindeki yorumlar, tema ve dil değişikliklerinin doğrudan ThemeEngine.theme_changed ve Translator.language_changed üzerinden gittiğini belirtir.
Değişiklikten sinyale giden yol¶
Diyagram, genel bir formdan yapılan kaydetmenin başka bir sekmedeki listenin yenilenmesine kadar olan yolunu gösterir.
sequenceDiagram participant F as GenericFormDialog participant W as ApiWorker participant G as GenericApi participant A as ApiClient participant B as SignalBus participant C as FkCache participant L as GenericListView F->>W: call_api(_do_save) W->>G: create(data) G->>A: post(path, json, entity=descriptor) A-->>G: kimlik içeren sonuç A->>B: entity_created(module, entity_type, id) B->>C: _on_entity_change modül girdilerini düşürür B->>L: _on_change süzgeci eşleşir L->>L: refresh
Sözcüklerle:
- Form
_do_saveişlevini bir çalışanda yürütür (src/cluster_erp/desktop/widgets/generic/generic_form_dialog.py:230-237)._do_save,GenericApi.createveyaGenericApi.updateçağırır (src/cluster_erp/desktop/widgets/generic/generic_form_dialog.py:262-269). GenericApikendiEntityDescriptornesnesiniApiClientnesnesine verir (src/cluster_erp/desktop/core/generic_api.py:67-84).- Sunucu yanıt verdikten sonra
ApiClient.postsonuçtanidokur vecreatedeylemiyleemit_entity_changeçağırır (src/cluster_erp/desktop/core/api_client.py:230-234).emit_entity_change,entity_<action>sinyalini bulur ve modülü, varlık türünü ve kimliği yayar (src/cluster_erp/desktop/core/api_client.py:213-218). FkCache._on_entity_change, anahtarı modül adıyla başlayan her önbellekteki seçenek listesini siler (src/cluster_erp/desktop/core/fk_cache.py:65-77).- Her
watch_entitykapanışı modülü ve varlık türünü karşılaştırır ve eşleşmede geri çağrısını çalıştırır (src/cluster_erp/desktop/core/signal_bus.py:69-71). Bir liste görünümü satırlarını yeniler (src/cluster_erp/desktop/widgets/generic/generic_list_view.py:333-334).
watch_entity ile abone olma¶
watch_entity tek bir kapanışı üç değişiklik sinyalinin hepsine bağlar. owner verildiğinde _track bağlantıları saklar ve sahibin destroyed sinyalini, bunları kesen _disconnect_owner işlevine bağlar (src/cluster_erp/desktop/core/signal_bus.py:77-110). unwatch_entity(owner) aynı şeyi istek üzerine yapar (src/cluster_erp/desktop/core/signal_bus.py:87-89).
On bir çağrı yeri watch_entity kullanır; sayı, src/cluster_erp/desktop/ içinde ad aranarak, signal_bus.py ve tab_manager.py içindeki bir yorum dışarıda bırakılarak çıkarıldı. Bunlar genel liste, ağaç, ayar, alt panel ve ayrıntı görünümleri, yetenek paneli, BOM gezgini ve oluşturucusu ve çizelgeleme panosudur (örneğin src/cluster_erp/desktop/widgets/generic/generic_list_view.py:334, src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:455-459, src/cluster_erp/desktop/modules/production/scheduling_board.py:1521).
GenericDetailView bir değişiklikte yalnızca formunda kaydedilmemiş düzenleme yoksa yeniden yükler. Yorum, aksi halde aynı türdeki başka bir kaydın kaydedilmesinin kullanıcının düzenlemelerinin üzerine yazacağını belirtir (src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:452-459, src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:564-569).
Oturum süresinin dolması¶
Başarısız bir belirteç yenilemesi session_expired yayar (src/cluster_erp/desktop/core/api_client.py:173-211). MainWindow._on_session_expired kullanıcı yeniden giriş yapana kadar yalnızca ilk yayını işler. Bir uyarı bildirimi gösterir, oturumu temizler ve giriş iletişim kutusunu açar. Başarılı bir giriş user_logged_in yayar; iptal user_logged_out yayar ve pencereyi kapatır (src/cluster_erp/desktop/widgets/main_window.py:244-268).
Neden böyle kurulmuştur¶
- Projenin yazılı mühendislik kuralları, ekranların veri bağımlılıklarını
watch_entityile bildirdiğini, sinyalleri API istemcisinin kendiliğinden yaydığını ve bunun modüller arası doğrudan çağrıların yerini aldığını belirtir. - Sahip izleme:
src/cluster_erp/desktop/core/signal_bus.py:62-67içindeki belge dizgesi, kendiliğinden bağlantı kesmenin sinyal sızıntılarını ve çökmeleri önlediğini belirtir. - Seçenek listesi geçersizleştirme:
src/cluster_erp/desktop/core/fk_cache.py:51-54içindeki yorum, yeni bir kaydın açılır listelerde önbellek ömrü sonunda değil hemen göründüğünü belirtir.
Kurallar ve sınırlar¶
- Bir ekran, başka ekranların gösterebileceği bir değişiklik için
ApiClientnesnesineentity=verir.GenericApibunu oluşturma, güncelleme ve silme için yapar; toplu silme vePOSTaksiyonlarında sinyaliemit_entity_changeile kendisi yayar (src/cluster_erp/desktop/core/generic_api.py:67-121). - Yinelenen bir sekme algılandığında
TabManager.open_tabyeni kurulan bileşeni siler; böylece onunwatch_entitykaydı da onunla biter (src/cluster_erp/desktop/core/tab_manager.py:97-107). Bkz. sekmeler, bölmeler ve yerleşim.
Diğer parçalarla etkileşim¶
MainWindow,navigate_toveopen_entitysinyallerini sekmelere dönüştürür; bkz. sekmeler, bölmeler ve yerleşim.main()veri yolunu verdiğindeFkCacheyapıcısında abone olur (src/cluster_erp/desktop/main.py:224); bkz. metadata deposu ve yabancı anahtar önbelleği.- Sinyaller yalnızca tek bir istemci sürecinin içinde yaşar. Diğer istemciler değişiklikleri verilerini yeniden yüklediklerinde görür. Modüller arası sunucu tarafı olaylar olay veri yolunu kullanır.
Sınırlar ve açık noktalar¶
CompletenessPanelvePurchaseRfqComparisonPanel, ham değişiklik sinyallerine modül süzgeci ve sahip izleme olmadan bağlanır (src/cluster_erp/desktop/widgets/generic/completeness_panel.py:65-67,src/cluster_erp/desktop/widgets/generic/purchase_rfq_comparison_panel.py:92-93).- MRP ekranları toplu aksiyonları
entitytanımlayıcısı olmadan gönderir, bu yüzden değişiklik sinyali yaymaz (src/cluster_erp/desktop/modules/procurement/mrp/planned_orders.py:411-417,src/cluster_erp/desktop/modules/procurement/mrp/exception_workbench.py:527-533). navigate_toüstündeki yorum onuMainWindowtarafından modül ve bölüm açılarak yanıtlanan gezinti isteği olarak tanımlar (src/cluster_erp/desktop/core/signal_bus.py:19-20). Yukarıdaki tablonun gösterdiği gibi sinyal bağlıdır ve yayılır.call_apiile başlatılan değişiklikler bir çalışan iş parçacığında yürür, bu yüzdenemit_entity_changeo iş parçacığında çağrılır (src/cluster_erp/desktop/core/api_worker.py:43-46). Bağlı her geri çağrının hangi iş parçacığında çalıştığı: Koddan belirlenemedi.src/cluster_erp/desktop/içinde hiçbir bağlantı türü ayarlanmaz; bu,ConnectionTypearanarak bulundu.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| signal bus | SignalBus |
Ekranlar arasında değişiklik, oturum, gezinme ve erişilebilirlik sinyallerini taşıyan masaüstü QObject nesnesi. |
sinyal veri yolu | src/cluster_erp/desktop/core/signal_bus.py:18 |
| entity watch | watch_entity |
Bir modül ve varlık türündeki kayıt değiştiğinde bir geri çağrıyı çalıştıran abonelik. | varlık izleme | src/cluster_erp/desktop/core/signal_bus.py:55 |
| change signal | entity_created, entity_updated, entity_deleted |
ApiClient nesnesinin başarılı bir değişiklikten sonra yaydığı sinyaller. |
değişiklik sinyali | src/cluster_erp/desktop/core/signal_bus.py:27-29 |
İlgili sayfalar¶
- Masaüstü istemci
- API istemcisi ve çalışanlar
- Metadata deposu ve yabancı anahtar önbelleği
- Olay veri yolu
- Veri yenileme ve değişiklik sinyalleri
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.