odoo10基礎

參考文檔 看雲文檔參考    思否ruter文檔參考css

odoo開發,須要那些工具

python
postgresql
node.js
less (css是靜態, less是動態)
githtml

運行odoo

1 安裝路徑: /xx/xx
2 /xx/xx/odoo-bin -c odoo-dev/odoo.conf & # odoo-dev/odoo.conf 配置文件
  -c 指定配置文件文件
  & 後臺運行node

odoo技巧

數據庫管理:http://127.0.0.1:8069/web/database/manager
數據庫選擇:http://127.0.0.1:8069/web/database/selector
數據庫指定:?db=database

後臺
  http://127.0.0.1:8069/web/
前臺
  http://127.0.0.1:8069/
登陸
  http://127.0.0.1:8069/web/loginpython

Odoo模塊組成

業務對象
  Python類,這些類會被Odoo框架自動持久化,持久化的方式決定於類的定義。
數據文件
  包括視圖、菜單、動做、工做流、權限、演示數據等,以XML或CSV文件定義。
Web控制器
  處理Web瀏覽器的請求
靜態頁面數據
  網站或界面使用的圖片、CSS或JavaScript文件
模塊結構
  每一個模塊都是模塊目錄中的一個子目錄, 能夠經過 --addons-path 選項指定模塊目錄的路徑
git

odoo的設計模式 --> MVC模式
  M Model
  V View
  C Controllerweb

建立模塊

1 在odoo源碼同層目錄下建立目錄: mkdir myaddons
2 用odoo-bin的腳手架功能建立空的odoo模塊
./odoo-bin scaffold todo myaddonssql

odoo orm

參考:參考手冊數據庫

本身的筆記跳轉:  odoo10 orm操做segmentfault

視圖

本身的筆記跳轉:  odoo10視圖設計模式

domains

經過domain來過濾數據記錄
domain做用子一個model上: 用model.search(domain)
Domain是定義模型子集的規則集合。domain表達式是由多個(field_name, operator, value)元組構成的列表或數組

field_name -- 字段名或者用.號分隔的Many2one關係的字段如:'street' , 'partner_id.country'
operator(str) -- 用於對字段值和給定值進行比較的運算符:
    =,!=,>,>=,<,<=,
    =?(值爲false或none時返回true,不然與=效果一致)
    =like()將字段數據與value進行匹配,_表明匹配單個字符、%匹配0或多個字符
    like() 將字段數據與%value% 進行匹配,
    not like 不與%value%匹配
    ilike 忽略大小寫的like函數
    not ilike 忽略大小寫的not like
    =ilike 忽略大小寫的=like
    in 與value的任意值相等,value須爲值列表
    not in 與value的任意值都不相等
    child_of 是否由value派生而來
value 對應值,必須與相應條件對應
    多個domain表達式可用運算符進行鏈接,運算符寫在兩個表達式以前。
        & 邏輯與 ,| 邏輯或,!邏輯非

 

1 做用在關聯字段上
  示例: 當爲授課選擇講師時,只有instructor值爲True的講師會被顯示出來。
  instructor_id = fields.Many2one('res.partner', string="Instructor", domain=[('instructor', '=', True)])

  注意: 聲明爲文字列表的domain會在服務端進行計算,右側不能夠是動態的字段; 而聲明爲字符串的domain是在客戶端進行計算的,右側能夠是動態的字段

2 做用在客戶端上
  當在客戶端界面選擇記錄集時,domain參數能夠添加到關聯字段上,以限制只顯示有效的關聯字段。
  <field name="instructor_id" domain="[('instructor', '=', True)]"/>

計算字段

odoo中提供一種每次引用字段, 經過方法動態計算的方式來獲取字段值的方法

1 建立計算字段
  - 建立一個字段
  - 將其屬性compute設置爲(計算)方法名稱

2 計算方法
  # ORM使用depends()裝飾器來指定計算方法的依賴性。當某些依賴關係被修改後,ORM層經過給定的依賴關係來觸發字段的從新計算。

  @api.multi
  @api.depends('value')
  def _compute_name(self):
    for record in self:
      record.name = "Record with value %s" % record.value

默認值

字段加上屬性 default

  - 能夠是一個值
  - 有返回值的匿名函數

對象self.env提供對請求參數和其餘有用的東西的訪問

self.env.cr 或者 self._cr            是數據庫遊標對象,一般用於查詢數據庫
self.env.uid或者self._uid            是當前用戶的數據庫ID
self.env.user                        是當前用戶記錄
self.env.ref(xml_id)                返回XML ID對應的記錄
self.env[model_name]                返回給定模型的實例

Odoo 有內置規則:active字段值爲False時記錄不可見

onchange

爲客戶端接口提供了一種方法, 只要用戶填寫了字段中的值, 就能夠實時更新form表單, 而無需向數據庫保存任何內容

示例

@api.onchange('amount', 'unit_price')        # onchange()的參數指定了在那個字段改變時,觸發方法
def _onchange_price(self):
    # 業務邏輯
    if flag:
        return {    # 能夠返回一個錯誤信息
            'warning': {
                'title': "Something bad happened",
                'message': "It was very bad indeed",
            }
        }

模型約束

python代碼級別約束

在記錄集上調用這個方法。裝飾器參數指定了約束涉及的字段,當涉及的字段中任一發生改變時觸發方法執行。若是不知足約束條件,該方法將引起異常:

示例

from odoo.exceptions import ValidationError

@api.constrains('age')
def _check_something(self):
    for record in self:
        if record.age > 20:
            raise ValidationError("Your record is too old: %s" % record.age)
    # all records passed the test, don't return anything

sql數據庫級別約束

SQL約束經過模型屬性_sql_constraints進行定義。

它是一個三元素的元組的列表(name, sql_definition, message)

  - name 是SQL約束名稱,
  - sql_definition 是約束規則,
  - message 是違反約束規則時的警告信息。

示例

_sql_constraints = [
    ('name_description_check',
     'CHECK(name != description)',
     "The title of the course should not be the description"),

    ('name_unique',
     'UNIQUE(name)',
     "The course title must be unique"),
]

工做流

工做流是與動態業務對象相關聯的模型。工做流也用於跟蹤動態(隨時間)演進的進程。

下面是工做流的兩種實現方式

1 僞工做流

button標籤的type='object'

給模型添加一個字段state, 用於定義一個工做流程

按鈕 --> 模型的方法

2 真工做流

button標籤的type='workflow'

與模型相關的工做流僅在建立模型記錄時被建立。所以,在工做流定義以前建立的授課實例是沒有與之對應的工做流實例的。

工做流的構成

工做流

# 有點相似一個【model的工做流模板】, 以後此model的工做流實例根據這個模板生成

xml示例代碼:

<record model="workflow" id="wkf_session">
    <field name="name">OpenAcademy sessions workflow</field>
    <field name="osv">openacademy.session</field>
    <field name="on_create">True</field>
</record>

活動(節點)

# 活動定義了應在Odoo服務器內完成的工做          例如更改某些記錄的狀態或發送電子郵件。

不一樣的調用方式:

<field name="kind">function</field>        # python代碼     
<field name="kind">dummy</field>           # 服務器的code
                                           # 還有 Subflow 和 Stop all,能夠參考官方文檔

xml示例代碼:

<record model="workflow.activity" id="draft">
    <field name="name">Draft</field>
    <field name="wkf_id" ref="wkf_session"/>
    <field name="flow_start" eval="True"/>        # 標示了活動的開始節點
    <field name="kind">function</field>
    <field name="action">action_draft()</field>
</record>

轉換

# 控制工做流如何從活動到活動。

xml示例代碼:

<record model="workflow.transition" id="session_draft_to_confirmed">
    <field name="act_from" ref="draft"/>
    <field name="act_to" ref="confirmed"/>
    <field name="signal">confirm</field>        # 【信號】: 經過button觸發, button會根據name去找到相應的signal
</record>

實例

# 建立一個recoed時, 會根據工做流模板, 生成工做流實例

有點相似python面向對象的實例化

條件

當條件被知足時, 自動狀態遷移, 有點相似 (條件+onchange)

自動化的工做流: 設置一個condition

xml示例代碼:

<record model="workflow.transition" id="session_auto_confirm_half_filled">
    <field name="act_from" ref="draft"/>
    <field name="act_to" ref="confirmed"/>
    <field name="condition">taken_seats > 50</field>
</record>

嚮導

model --> ir.actions.act_window

在odoo中經過使用嚮導建立一個表單與用戶進行交互, 嚮導的model使用TransientModel定義

運行wizard: 能夠經過ir.actions.act_window模型表裏的記錄啓動, 能夠從menu裏或者某個button觸發;

      另一種方式, 在form view上方的下拉按鈕組(context action)中調用, 設置好src_model關聯對應的model

1 嚮導視圖中:

src_model     指向上下文的模型
res_model     指向嚮導的模型

target="new"        將彈出一個新窗口打開向導
special="calcel"    關閉嚮導窗口而不保存

2 嚮導模型中

self._context        獲取當前對象的模型的上下文

注意: 嚮導記錄不是永久性的, 會在一段時間後自動從數據庫中刪除. 這就是爲何他們被稱爲"瞬態"

odoo報表

報表構成

1 在ir.actions.report.xml中定義報表記錄, 使用<report>設置報表的各類基本參數

id                 外部標示
name            助記符/描述符
model            報告涉及的模型
report_type        qweb-pdf/qweb-html
report_name        打印出來的名字
groups            容許哪些組能夠查看/使用報表
attachment_use    設成True, 報表將使用附件表達式生成的名稱存爲記錄的附件
attachment        表達式
paperformat        紙質格式的外部ID, 默認爲公司的紙質格式

2 Qweb view定義報表樣式

docs是從context發送過來的變量(上下文), 表明報表內容記錄, 
user表明打印此報表的人

- external_layout        將在報表上添加默認頁眉和頁腳
- PDF的body將會包含在<div class="page"> 
- <template>的id必須是<report>裏指定的name
- <template>裏可使用的變量
    docs             記錄當前報表
    doc_ids         docs 記錄的id列表
    doc_model         模型爲 docs 記錄
    time             引用Python標準庫的 time
    user             res.user 記錄用戶打印報表
    res_company     記錄當前 user 的公司

Qweb經常使用指令

1 數據輸出

t-esc = 'value'            會作html轉義, 有xss攻擊的危險
t-raw                      不轉義

2 條件

t-if
t-elif
t-else

3 循環

t-foreach t-as
t-esc # 設置: t-set = '...' t-value = ''

4 屬性

計算屬性: t-attr
有3中不一樣的形式:

1 t-attr-$name
2 t-attf-$name
3 t-att-mapping
  t-att-pair

5 設置變量

經過set指令完成

兩種方式

1 t-value = '2+1'        # 能夠是表達式
2 若是沒有t-value, 則節點的body將設置爲變量的值

6 調用子模版

使用t-call調用其餘模版

神奇的0變量

主模版:
    <div>
        This template was called with content:
        <t t-raw="0"/>        # 將會渲染爲子的內容, 至關於爲子的body預留位置
    </div>

調用子模版:
    <t t-call="other-template">
        <em>content</em>
    </t>
    
將會渲染成:
    <div>
        This template was called with content:
        <em>content</em>
    </div>

動做

參考 odoo10動做

1 窗口動做

--->  ir.actions.act_window

res_model:要打開的視圖(窗口)關聯的數據模型
view_type:視圖類型,默認值爲 form,通常狀況下咱們取默認值就能夠了
view_mode:容許打開的視圖類型,以逗號分隔,默認值爲 tree,form
target:打開的窗口類型,經常使用的有 current(當前窗口打開)和 new (彈窗打開)這兩種,默認爲 current

還有一些非必填的字段在某些時候咱們是會用上的,這裏也分列出來:
view_ids:關聯的視圖對象 id,需注意區分和 view_id 的區別
view_id:關聯的視圖的 id, 例如在不一樣時候須要打開同一個數據模型不一樣的表單視圖,就能夠經過這個字段指定要打開的視圖的 id
res_id:僅在視圖類型爲 form 時有效,表示打開該 id 對應的記錄的表單視圖,如未指定則打開新建頁面
context:傳遞到上下文中的數據,一個字典
domain:過濾規則,對視圖中的記錄進行過濾
limit:列表中每頁顯示的記錄數量,默認爲 80
search_view_id:指定搜索視圖,不指定則按默認規則加載
multi:若是設置爲 True 且動做綁定了模型(src_model)的話,該動做按鈕會只出如今所綁定模型列表視圖的「動做」下拉列表中(在搜索視圖左側)
views:由 (view_id, view_type) 這樣的元組對組成的列表,view_id 爲指定視圖的 id 或是 False(按默認值取出對應視圖),view_type 表示視圖類型

2 服務器動做

--->  ir.actions.server

model_id:當前的動做是在哪一個模型上運行的
binding_model_id:綁定的模型,當前動做將會出如今綁定的模型的視圖中
state:服務器動做的類型,總共有 4 種可選的類型,分別是 code(執行 Python 代碼),object_create(建立一條新記錄),object_write(更新記錄),multi(執行多個動做)
code:對應 state 的類型 code,爲當前動做運行時所要執行的 Python 代碼

咱們定義的全部模型都會在 ir.model.data 對應的表中存在相應的記錄

接下來咱們再看到字段 code 裏面的內容,在這裏面咱們有一些變量是能夠直接使用的:
env:Odoo 的運行環境
model:動做觸發時對應的 Odoo 模型實例
record:動做觸發時對應的單個記錄(如在表單視圖中運行對應當前表單所指向的記錄),多是空的
records:動做觸發時對應的記錄集(如在列表視圖中勾選多條記錄觸發,記錄集指向這些選中的記錄),多是空的
Python 庫:time, datetime, dateutil, timezone 時間相關的 Python 庫
log:用來記錄日誌信息
Warning:經過 raise Warning('xxxxx') 拋出警告信息

3 URL動做

--->  ir.actions.act_url

target:有兩個可選值,分別是新窗口(new)打開連接,至關於 <a target='_blank' />,以及當前窗口(self)打開,至關於 <a target='_self' />
url:要打開的目標頁面的連接,能夠是外部頁面也能夠是同域下的內部頁面

4 客戶端動做

觸發一個徹底右客戶端(瀏覽器)執行的動做

5 報表動做

安全與權限

參考 思否文檔參考

1 基於組對錶的訪問權限 --> CSV文件
2 基於組對錶中數據行的訪問權限 --> XML文件
3 字段級別     // contraint     # 經過contraint能夠作到字段級別

1 用戶組的權限

模塊分類: ir.module.category
用戶組: res.groups

a 定義用戶組

兩個系統自帶的用戶組:

base.group_user    基礎用戶組
base.user_root    管理員帳號

用戶組裏每一個字段所表明的含義:

category_id:該用戶組所屬的模塊分類    # <field name="category_id" ref="todo.module_category_todo"/>
implied_ids:在當前用戶組下的用戶,同時加入該(字段所指定的)用戶組中    
users:該字段所指定的用戶默認被加入到當前用戶組中    # 將會默認得到此組權限的用戶

b 用戶組的權限

(先根據上一步建立用戶組)

用戶組的權限定義以.csv文件存儲的
默認的權限記錄文件: security/ir.model.access.csv
裏面有8個字段, 分別表明的含義以下;

id:這條權限記錄的 id,能夠類比爲 xml_id    # 相似xml的外部標識
name:權限記錄的名稱
model_id:id:要配置權限的模型的外部 ID (以 model_ 開頭)
group_id:id:應用此條權限配置的用戶組的 id,若爲空則默認對全部用戶組生效        # 上一步創的用戶組id
perm_read:讀取記錄的權限,1 爲擁有該權限,0 爲不分配該權限
perm_write:編輯更新記錄的權限,取值同上
perm_create:建立新記錄的權限,取值同上
perm_unlink:刪除記錄的權限,取值同上

示例

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_app02_contract,app02.contract,model_app02_contract,,1,1,1,0

2 記錄集權限

(俗名: 規則)

模型: ir.rule

model_id:要應用該規則的模型的外部 ID # 模型的外部標識ID --> model_**_**
domain_force:過濾條件,符合該條件的記錄都將按照所定義權限進行檢查,其中變量 user 表示當前用戶的實例對象,能夠直接使用
groups:應用該規則的用戶組,若是不指定則默認對所有用戶應用該規則

菜單隱藏

只須要在對應的菜單項上添加一個groups屬性便可,  裏面的值能夠是逗號分隔的多個用戶組的外部ID

相關文章
相關標籤/搜索