Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Masaüstü istemci

Açıklama

Sinyal veri yolu ve watch_entity

Masaüstü SignalBus sinyalleri, ApiClient'ın değişiklik sinyallerini yayması ve ekranların watch_entity ile abone olması.

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 bir QObject nesnesidir; sayı src/cluster_erp/desktop/core/signal_bus.py:18-44 içindeki Signal( sınıf öznitelikleri sayılarak çıkarıldı.
  • ApiClient.post, put, patch, delete, post_multipart ve put_multipart, bir entity tanımlayıcısı verildiğinde başarılı bir çağrıdan sonra entity_created, entity_updated veya entity_deleted yayar (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şiklikte callback ç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).
  • FkCache aynı üç 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:

  1. Form _do_save işlevini bir çalışanda yürütür (src/cluster_erp/desktop/widgets/generic/generic_form_dialog.py:230-237). _do_save, GenericApi.create veya GenericApi.update çağırır (src/cluster_erp/desktop/widgets/generic/generic_form_dialog.py:262-269).
  2. GenericApi kendi EntityDescriptor nesnesini ApiClient nesnesine verir (src/cluster_erp/desktop/core/generic_api.py:67-84).
  3. Sunucu yanıt verdikten sonra ApiClient.post sonuçtan id okur ve created eylemiyle emit_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).
  4. 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).
  5. Her watch_entity kapanışı 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_entity ile 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-67 iç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-54 iç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 ApiClient nesnesine entity= verir. GenericApi bunu oluşturma, güncelleme ve silme için yapar; toplu silme ve POST aksiyonlarında sinyali emit_entity_change ile kendisi yayar (src/cluster_erp/desktop/core/generic_api.py:67-121).
  • Yinelenen bir sekme algılandığında TabManager.open_tab yeni kurulan bileşeni siler; böylece onun watch_entity kaydı 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_to ve open_entity sinyallerini sekmelere dönüştürür; bkz. sekmeler, bölmeler ve yerleşim.
  • main() veri yolunu verdiğinde FkCache yapı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

  • CompletenessPanel ve PurchaseRfqComparisonPanel, 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ı entity tanı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 onu MainWindow tarafı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_api ile başlatılan değişiklikler bir çalışan iş parçacığında yürür, bu yüzden emit_entity_change o 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, ConnectionType aranarak 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


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13