Odoo 10開発チュートリアル1(構築モジュール)

13069 ワード

警告このチュートリアルではodooをインストールする必要があります
Odooサーバの起動/停止
OdooはC/Sアーキテクチャを採用し、クライアントはWebブラウザを通じてサービス側にアクセスし、RPCプロトコルに従う.ビジネスロジックおよび拡張は、通常、サービス側で実行されますが、クライアントがサポートする新しいフィーチャーを追加するだけで、クライアントにコードが追加されます(たとえば、インタラクティブなプロセスで新しいデータのマッピング表現).サーバを起動します.shellでコマンドodoo-binを呼び出すか、完全なパス名で呼び出すだけです.
odoo-bin

Odooサービスは、Ctrl-cまたは対応するシステムプロセスを殺すことによって停止される.
Odooモジュールの構築
サービス側の拡張とクライアント拡張はモジュールとしてカプセル化され、これらのモジュールは選択的にインストールされ、インストールが完了したらデータベースを介してロードされます.モジュールは、新しいビジネスロジックであってもよいし、既存のビジネスロジックを変更および拡張してもよい.例えば、中国の会計モジュールを作成し、中国の会計準則をOdooの汎用会計に追加したり、新しいリアルタイム可視化管理チームのモジュールを作成したりすることができます.Odooのすべての機能はモジュールに含まれています.
モジュールの構成
Odooモジュールには、Odooフレームワークによって自動的に永続化されるビジネスオブジェクトPythonクラスと、クラスの定義によって永続化される複数の部分が含まれています.データファイルには、XMLまたはCSVファイルで定義されるビュー、メニュー、アクション、ワークフロー、パーミッション、プレゼンテーションデータなどが含まれます.Webコントローラは、Webブラウザの静的ページデータサイトまたはインタフェースの使用を要求するピクチャ、CSSまたはJavaScriptファイルを処理する
モジュール構造
各モジュールは、モジュールディレクトリのサブディレクトリです.モジュールディレクトリのパスは、--addons-pathオプションで指定できます.
プロンプトほとんどのコマンドラインオプションは、プロファイルで設定できます.
Odooモジュールはインベントリファイルによって宣言されます.詳細については、インベントリファイルのドキュメントを参照してください.モジュールは__init__.pyファイルを含むPythonパッケージであり、__init__.pyファイルはモジュールに必要なインポートの各Pythonファイルを含む.たとえば、モジュールにmymodule.pyファイルが含まれている場合、__init__.pyは次のように書く必要があります.
from . import mymodule

Odooは、新しいモジュールを迅速に作成するための足場メカニズムを提供し、odoo-binサブコマンドscaffoldは、空のモジュールを作成するために使用されます.
$ odoo-bin scaffold  

このコマンドは、モジュールのサブディレクトリを作成し、モジュールの標準ファイルを自動的に作成します.これらのファイルの多くは、コメントされたコードとXML要素のみを含んでいます.これらのファイルの意味は後述する.
練習作成モジュール上のコマンドラインを使用して空のモジュールOpen Academyを作成し、Odooにインストールします.
  • 呼び出しコマンドodoo-bin scaffold openacademy addons
  • モジュール内の関連ファイル
  • を修正する
  • 他のファイル
  • を変更しないでください.openacademy/__manifest__.py
    # -*- coding: utf-8 -*-
    {
        'name': "Open Academy",
    
        'summary': """Manage trainings""",
    
        'description': """
            Open Academy module for managing trainings:
                - training courses
                - training sessions
                - attendees registration
        """,
    
        'author': "My Company",
        'website': "http://www.yourcompany.com",
    
        # Categories can be used to filter modules in modules listing
        # Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
        # for the full list
        'category': 'Test',
        'version': '0.1',
    
        # any module necessary for this one to work correctly
        'depends': ['base'],
    
        # always loaded
        'data': [
            # 'security/ir.model.access.csv',
            'templates.xml',
        ],
        # only loaded in demonstration mode
        'demo': [
            'demo.xml',
        ],
    }
    
    openacademy/__init__.py
    # -*- coding: utf-8 -*-
    from . import controllers
    from . import models
    
    openacademy/controllers.py
    # -*- coding: utf-8 -*-
    from odoo import http
    
    # class Openacademy(http.Controller):
    #     @http.route('/openacademy/openacademy/', auth='public')
    #     def index(self, **kw):
    #         return "Hello, world"
    
    #     @http.route('/openacademy/openacademy/objects/', auth='public')
    #     def list(self, **kw):
    #         return http.request.render('openacademy.listing', {
    #             'root': '/openacademy/openacademy',
    #             'objects': http.request.env['openacademy.openacademy'].search([]),
    #         })
    
    #     @http.route('/openacademy/openacademy/objects//', auth='public')
    #     def object(self, obj, **kw):
    #         return http.request.render('openacademy.object', {
    #             'object': obj
    #         })
    
    openacademy/demo.xml
    
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    
    openacademy/models.py
    # -*- coding: utf-8 -*-
    
    from odoo import models, fields, api
    
    # class openacademy(models.Model):
    #     _name = 'openacademy.openacademy'
    
    #     name = fields.Char()
    
    openacademy/security/ir.model.access.csv
    id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
    access_openacademy_openacademy,openacademy.openacademy,model_openacademy_openacademy,,1,0,0,0
    
    openacademy/templates.xml
    
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    

    オブジェクトリレーションシップマッピング
    OdooのキーコンポーネントはORM層です.このレイヤは、大量の手書きSQLを回避し、拡張性とセキュリティを提供します.ビジネス・オブジェクトは、Modelクラスの拡張クラスとして宣言され、永続層に自動的に統合されます.定義時にプロパティを設定することで、モデルを構成できます.最も重要な属性は_nameで、Odooシステム内のモジュールの名前を定義する必須属性です.最も簡単なモデル定義:
    from odoo import models
    class MinimalModel(models.Model):
        _name = 'test.model'
    

    モデルフィールド
    フィールドは、モデルに格納するコンテンツと格納場所を定義します.フィールドはクラスのプロパティによって定義されます.
    from odoo import models, fields
    
    class LessMinimalModel(models.Model):
        _name = 'test.model2'
    
        name = fields.Char()
    

    共通属性はモデルと同様に、フィールドを構成することもできます.フィールドは属性パラメータによって構成されます.
    name = field.Char(required=True)
    

    いくつかのプロパティは、最も一般的なプロパティです.string(unicode,default: field's name)ユーザーインタフェースのフィールドラベル(ユーザー表示)required(bool,default:False) Trueの場合、このフィールドは空ではありません.デフォルト値が必要か、レコードの作成時に常に値が指定されている必要があります.help (unicode, default: '')ロングフォーマットで、ユーザーインタフェースに表示されるプロンプト.index (bool, default: False)は、Odooがカラムにデータベースインデックスを作成するように要求します.
    単純フィールドには、単純フィールドと関連フィールドの2つの種類があります.単純フィールドの値はモデルテーブルに格納された原子値であり、関連フィールドはモデル(同じモデルまたは異なるモデル)を指すレコード行です.単純フィールドの例としては、Boolean、Date、Char関連フィールドの例として、Many 2 One、One 2 May、Many 2 Mayが挙げられる
    予約フィールドOdooは、システムによって管理され、ユーザプログラムが書き込むべきではない固定フィールドをすべてのモデルに作成します.ただし、id(Id)モデルに記録された一意識別子create_date(Datetime)に記録された作成日create_uid(Many2one)に記録されたユーザwrite_date(Datetime)に記録された最終修正時間write_uid(Many2one)に記録されたユーザをユーザプログラムで読み取ることができる
    特殊フィールドのデフォルトでは、Odooのnameはすべてのモデルに表示および検索のためのフィールドが必要です.これらの目的のためのフィールドは、フィールド_rec_nameを設定することによって実現することができる.
    Openacademyモジュールで新しいデータモデルカリキュラムを定義するモデルの定義を練習します.各カリキュラムには、必須フィールドである2つのフィールド、タイトル、説明が含まれています.ファイルopenacademy/models/models.pyは、Courseクラスを含むように編集される.openacademy/models.py
    from odoo import models, fields, api
    
    class Course(models.Model):
        _name = 'openacademy.course'
    
        name = fields.Char(string="Title", required=True)
        description = fields.Text()
    

    データファイル
    Odooは高度なデータ駆動システムで、動作はPythonコードで作成されていますが、一部のモジュールの値はロード時にデータファイルで設定されています.
    ヒント:一部のモジュールの役割は、Odooにデータを追加するためだけです.
    モジュールデータは、要素を有するXMLデータファイルによって宣言される.各要素は、データベース内のレコード行を作成または更新します.
    
        
            
                {a value}
            
        
    
    
  • modelは、記録行に記録するOdooモデル名
  • である.
  • idは外部識別子であり、参照レコード(データベース内の識別子を知る必要はない)
  • を可能にする.
  • 、各はデータ行のフィールドに対応し、name属性はフィールド名(例えばdescription)であり、bodyはフィールドの値である.データファイルはmanifestファイル宣言によってロードされ、dataリスト宣言(常にロード)でもdemoリスト宣言(プレゼンテーションモードでのみダウンロード)
  • でもよい.
    練習はプレゼンテーションデータを定義し、プレゼンテーションデータを追加してCourseモデルのデータを埋め込み、ファイルopenacademy/demo/demo.xmlを編集してプレゼンテーションデータを追加するopenacademy/demo/demo.xml
    
        
            
                Course 0
                Course 0's description
    
    Can have multiple lines
                
            
            
                Course 1
                
            
            
                Course 2
                Course 2's description
            
        
    
    

    操作とメニュー
    アクションとメニューは、データベース内の通常のデータであり、通常はデータファイルで宣言されます.操作は3つの方法でトリガーすることができる:1.メニュー項目をクリック(特定の操作にリンク)2.操作に接続されている場合は、ビュー内のボタンをクリックします.オブジェクトとしてのコンテキスト操作は、メニューの宣言が比較的複雑であるため、のショートカットがir.ui.menuのメニューオブジェクトを宣言し、対応する操作に接続しやすくする.
    
        Ideas
        idea.idea
        tree,form
    
    
    

    危険操作はXMLファイルの対応するメニューの前に宣言しなければならない.データファイルは順番に実行され、操作のidは、対応するメニューが確立される前にデータベースに存在しなければならない.
    新しいメニュー項目の定義を練習し、オープンアカデミーメニュー項目の下で新しいメニュー項目を定義してコースにアクセスします.ユーザーは次のことができるはずです.
  • 全コースのリストを表示
  • カリキュラムを作成または編集します.openacademy/views/openacademy.xmlが作成され、操作をトリガできるメニュー項目が作成される.2.このファイルをopenacademy/__manifest__.pyの下のdataリストに追加します.
  • openacademy/__manifest__.py
     'data': [
            # 'security/ir.model.access.csv',
            'templates.xml',
            'views/openacademy.xml',
        ],
        # only loaded in demonstration mode
        'demo': [
    
    openacademy/views/openacademy.xml
    
    
        
            
            
            
                Courses
                openacademy.course
                form
                tree,form
                
                    

    Create the first course