X · Geliştirme · Bölüm 34
Bir SODOO modülünün anatomisi
Dosya yapısı, model ve görünüm genişletme, kaynaklar, çeviri ve bu projede uyulan yazım kuralları.
Dizin yapısı
custom_addons/modulum/
├── __manifest__.py künye: ad, sürüm, bağımlılık, veri dosyaları
├── __init__.py
├── models/ iş mantığı
├── views/ XML görünümler, menüler, eylemler
├── controllers/ HTTP uçları
├── security/ erişim hakları (CSV) ve kayıt kuralları
├── static/src/ JS, SCSS, XML şablonlar (arayüz)
├── data/ başlangıç verisi, zamanlanmış görevler
├── i18n/ çeviriler (tr.po)
├── migrations/ sürümden sürüme veri göçü
└── tests/ otomatik testler
Künye dosyası (__manifest__.py) modülün kimliğidir; bu projede geliştirici modül referansı doğrudan ondan üretilir. Künyedeki özet satırı ciddiye alınır: modülün ne yaptığını bir cümlede söyler ve referansta o cümle görünür.
Genişletme, değiştirme değil
Bir çekirdek modeli genişletmek için miras alınır; çekirdek dosyası düzenlenmez.
class SaleOrder(models.Model):
_inherit = "sale.order"
x_dealer_request_id = fields.Many2one("dealer.request", index=True)
Görünümler de aynı mantıkla, mevcut görünüme yama yapılarak genişletilir. Bu disiplin, çekirdeğin güncellenebilmesinin tek nedenidir.
Odoo 19'a özgü tuzaklar
Bu sürümde yakalanmış, sessizce yanlış davranan üç şey:
SQL kısıtları artık tanımlanan yerden gelmiyor
- Belirti
- Benzersizlik kısıtı yazılmıştı ama veritabanında hiçbir dizin oluşmuyordu; yinelenen kayıtlar yazılabiliyordu.
- Kök neden
- Eski
_sql_constraintsyazımı bu sürümde sessizce hiçbir şey üretmiyor. - Ders
- Kısıtlar yeni yazımla tanımlanır. Bir kısıtın var olduğunu varsaymak yerine, yinelenen kayıt yazmayı deneyen bir test yazılır.
Doğrulama kuralları yetkisiz koşar
- Belirti
- Yazarın kimliğine bağlı bir kural, beklenmedik biçimde her zaman geçiyordu.
- Kök neden
- Kısıt doğrulamaları yükseltilmiş yetkiyle koşar; içinde "şu anki kullanıcı" üzerinden verilen kararlar bu yüzden yanıltıcıdır.
- Ders
- Yazara bağlı kurallar kısıt içinde değil, yazma işleminin kendisinde uygulanır.
Canlı mesajlar türlerine göre dağıtılır
- Belirti
- Arayüz canlı güncellemeleri hiç almıyordu (12. bölüm).
- Kök neden
- Genel bir isme abone olmak yetmiyor; her mesaj türüne ayrı abone olunmalı.
- Ders
- Abonelikler tür tür yazılır ve yayımlanan pakette bunun böyle olduğu doğrulanır.
Arayüz kaynakları
Arayüz dosyaları künyedeki paketlere kaydedilir. İki kural:
- Şablonların içine karmaşık JavaScript yazılmaz. Şablon motoru çok ifadeli satırları desteklemez; olay işleyicisi tek bir yöntem çağırmalı.
- Yayımlanan dosyalar sürüm jetonu taşır. Aksi hâlde tarayıcı, güncellenmiş bir dosyanın eski hâlini uzun süre çalıştırır (2. ve 8. bölümlerdeki dersler).
Çeviri
Kaynak dizeler İngilizce yazılır; Türkçesi tr.po dosyasından gelir (2. bölüm).
Çeviri dosyası birleştirilerek üretilir
- Belirti
- Yeni çeviriler eklendiğinde eski çeviriler kayboluyordu.
- Kök neden
- Çeviri dosyası üzerine yazılıyordu, birleştirilmiyordu.
- Ders
- Üretim betiği her zaman birleştirir. Ayrıca dışa aktarım veritabanını okur; kayıt çevirileri için o veritabanında ilgili kayıtların bulunması gerekir.
Veri göçü
Bir alanın anlamı değiştiğinde ya da veri düzeltilmesi gerektiğinde göç kodu yazılır. İki kural:
- Göç yeniden çalıştırılabilir olmalı; iki kez koşması zarar vermemeli.
- Göç, kullanıcının elle yaptığı düzeltmeleri ezmemeli.
Yazım kuralları
- Kod, yorum ve commit mesajları İngilizce.
- Modüller yalnız
custom_addons/altında. - Enterprise modüle bağımlılık yok.
- Kullanıcıya görünen her metin çevrilebilir.
- Her modülün testleri var ve testler sözleşmeyi ölçer, uygulamayı değil.
Bir test uygulamayı değil sözleşmeyi ölçmeli
- Belirti
- Testler yeşildi, davranış yanlıştı.
- Kök neden
- Test, kodun yaptığı şeyi tekrar ediyordu — yani kod değişince test de değişiyordu. Ölçtüğü şey "kod kendisiyle tutarlı mı"ydı, "doğru şeyi yapıyor mu" değil.
- Ders
- Test, dışarıdan gözlenebilir sözleşmeyi yazar: verilen girdi için beklenen çıktı. Uygulama değişip sözleşme durduğunda test yeşil kalmalı; sözleşme bozulduğunda kırmızıya dönmeli.