SODOO. El Kitabı

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ı.

Kime: geliştiriciOkuma: 14 dk

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:

Ders

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_constraints yazı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.
Ders

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.
Ders

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).

Ders

Ç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.
Ders

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.