1. 程式人生 > >Odoo10教程---模組化三:模型約束,高階檢視,工作流,安全性,嚮導,國際化和報表等

Odoo10教程---模組化三:模型約束,高階檢視,工作流,安全性,嚮導,國際化和報表等

模型約束

Python約束定義為用constrains()修飾的方法,並在記錄集上呼叫。修飾符指定約束中涉及哪些欄位,以便在修改其中一個約束時自動評估約束。如果不滿足該不變數,則期望該方法引發異常:

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

練習

新增Python約束

新增一個約束,該約束檢查instructor在他/她自己的sessionattendees中不存在。

openacademy/models.py
# -*- coding: utf-8 -*-

from odoo import models, fields, api, exceptions

class Course(models.Model):
    _name = 'openacademy.course'
                    'message'
: "Increase seats or remove excess attendees", }, } @api.constrains('instructor_id', 'attendee_ids') def _check_instructor_not_in_attendees(self): for r in self: if r.instructor_id and r.instructor_id in r.attendee_ids: raise exceptions
.ValidationError("A session's instructor can't be an attendee")

SQL約束是通過模型屬性_sql_constraints定義的。後者被分配給字串的三元組列表(name, sql_definition, message),其中name 是有效的SQL約束名稱,sql_definition 是table_constraint表示式,message 是錯誤訊息。

練習

新增SQL約束

  1. CHECK (檢查)課程描述和課程名稱是不同的
  2. 使Course的name UNIQUE(唯一的)
openacademy/models.py
    session_ids = fields.One2many(
        'openacademy.session', 'course_id', string="Sessions")

    _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"),
    ]

class Session(models.Model):
    _name = 'openacademy.session'

練習

練習6 - 新增重複選項

因為我們為課程名稱的唯一性添加了一個約束,所以不再可能使用“複製”函式 (Form ‣ Duplicate)。

重新實現你自己的“複製”方法,允許複製課程物件,把原來的名字改成“[原始名字]的拷貝”。

openacademy/models.py
    session_ids = fields.One2many(
        'openacademy.session', 'course_id', string="Sessions")

    @api.multi
    def copy(self, default=None):
        default = dict(default or {})
        copied_count = self.search_count(
            [('name', '=like', u"Copy of {}%".format(self.name))])
        if not copied_count:
            new_name = u"Copy of {}".format(self.name)
        else:
            new_name = u"Copy of {} ({})".format(self.name, copied_count)
        default['name'] = new_name
        return super(Course, self).copy(default)
    _sql_constraints = [
        ('name_description_check',
         'CHECK(name != description)',

高階檢視

樹檢視

樹檢視可以採取補充屬性來進一步定製他們的行為:

decoration-{$name}

允許根據相應的記錄屬性更改行文字的樣式。

值是Python表示式。對於每個記錄,表示式以記錄的屬性作為上下文值來評估,如果為true,則將相應的樣式應用於行。 其他上下文值是uid (當前使用者的id) 和current_date (當前日期為yyyy-MM-dd形式的字串)。

{$name} 可以是 bf (font-weight: bold), it (font-style: italic),或任何的bootstrap contextual color (danger,infomutedprimarysuccess or warning).

<tree string="Idea Categories" decoration-info="state=='draft'"
    decoration-danger="state=='trashed'">
    <field name="name"/>
    <field name="state"/>
</tree>
editable
要麼是 "top" 要麼是 "bottom"。使樹檢視可就地編輯(而不是必須通過表單檢視),該值是新行出現的位置

練習

列表顏色

修改Session樹檢視的方式是持續少於5天的會話是藍色的,而持續超過15天的則是紅色的。

修改Session樹檢視:

openacademy/views/openacademy.xml
            <field name="name">session.tree</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <tree string="Session Tree" decoration-info="duration&lt;5" decoration-danger="duration&gt;15">
                    <field name="name"/>
                    <field name="course_id"/>
                    <field name="duration" invisible="1"/>
                    <field name="taken_seats" widget="progressbar"/>
                </tree>
            </field>

日曆檢視

將記錄顯示為日曆事件。它們的根元素是<calendar>,它們最常見的屬性是:

color
用於顏色分割的欄位的名稱。顏色被自動分配給事件,但是相同顏色段中的事件(具有與它們的@color欄位相同的值的記錄)將被賦予相同的顏色
date_start
記錄的欄位儲存事件的開始日期/時間
date_stop (可選的)
記錄欄位儲存事件的結束日期/時間

欄位(定義每個日曆事件的標籤    )

<calendar string="Ideas" date_start="invent_date" color="inventor_id">
    <field name="name"/>
</calendar>

練習

日曆檢視

Session模型新增日曆檢視,使使用者能夠檢視與Open Academy相關的事件。

  1. 新增從start_dateduration計算的AA欄位end_date 

    提示

    逆函式使欄位可寫,並允許在日曆檢視中移動會話(通過拖放)

  2. Session模型新增日曆檢視
  3. 並將日曆檢視新增到Session模型的動作中
openacademy/models.py
# -*- coding: utf-8 -*-

from datetime import timedelta
from odoo import models, fields, api, exceptions

class Course(models.Model):
    attendee_ids = fields.Many2many('res.partner', string="Attendees")

    taken_seats = fields.Float(string="Taken seats", compute='_taken_seats')
    end_date = fields.Date(string="End Date", store=True,
        compute='_get_end_date', inverse='_set_end_date')

    @api.depends('seats', 'attendee_ids')
    def _taken_seats(self):
                },
            }

    @api.depends('start_date', 'duration')
    def _get_end_date(self):
        for r in self:
            if not (r.start_date and r.duration):
                r.end_date = r.start_date
                continue
            # Add duration to start_date, but: Monday + 5 days = Saturday, so
            # subtract one second to get on Friday instead
            start = fields.Datetime.from_string(r.start_date)
            duration = timedelta(days=r.duration, seconds=-1)
            r.end_date = start + duration
    def _set_end_date(self):
        for r in self:
            if not (r.start_date and r.end_date):
                continue
            # Compute the difference between dates, but: Friday - Monday = 4 days,
            # so add one day to get 5 days instead
            start_date = fields.Datetime.from_string(r.start_date)
            end_date = fields.Datetime.from_string(r.end_date)
            r.duration = (end_date - start_date).days + 1
    @api.constrains('instructor_id', 'attendee_ids')
    def _check_instructor_not_in_attendees(self):
        for r in self:
openacademy/views/openacademy.xml
            </field>
        </record>

        <!-- calendar view -->
        <record model="ir.ui.view" id="session_calendar_view">
            <field name="name">session.calendar</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <calendar string="Session Calendar" date_start="start_date"
                          date_stop="end_date"
                          color="instructor_id">
                    <field name="name"/>
                </calendar>
            </field>
        </record>
        <record model="ir.actions.act_window" id="session_list_action">
            <field name="name">Sessions</field>
            <field name="res_model">openacademy.session</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form,calendar</field>
        </record>

        <menuitem id="session_menu" name="Sessions"

搜尋檢視

搜尋檢視<field>元素可以有一個

相關推薦

Odoo10教程---模組模型約束高階檢視工作安全性嚮導國際化報表

模型約束Python約束定義為用constrains()修飾的方法,並在記錄集上呼叫。修飾符指定約束中涉及哪些欄位,以便在修改其中一個約束時自動評估約束。如果不滿足該不變數,則期望該方法引發異常:from odoo.exceptions import ValidationEr

Odoo10學習筆記模型(結構的應用數據)、視圖(用戶界面設計)

其他 描述 用戶界面 列表 支持 字段 界面設計 允許 學習 一:模型 1:創建模型 模型屬性:模型類可以使用一些屬性來控制它們的一些行為: _name :創建odoo模型的內部標識符,必含項。 _description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。

Odoo10教程---模組化二模型間關係繼承計算欄位

模型之間的關係來自模型的記錄可能與來自另一模型的記錄相關。例如,一個銷售訂單記錄和一個包含客戶資料的客戶記錄相關;同時也和銷售訂單線記錄相關。練習建立會話模型對於模組Open Academy,我們考慮一個會話模型:會話是在給定時間為給定聽眾授課的課程。為會話建立模型。一個會話

編寫模組CSSBEM

你是否做過多頁面的大型網站或者其中一部分?如果你做過,你可能意識到CSS架構不夠強大所帶來的恐懼。你可能還會研究如何編寫可維護的CSS。 由於我們的行業很棒,我們有很多推薦的解決方案。因為專家們的紛紛加入,於是我們有BEM,OOCSS,SMACSS,Atomic Design等許多選

Java 9 模組開發核心原則與實踐

內容簡介 Java 9 向 Java 平臺引入了模組系統,這是一個非常重要的飛躍,標誌著模組化 Java 軟體開發的新紀元。當需要建立靈活且易於維護的程式碼時,模組化是一個關鍵的架構設計原則。本書給出了 Java 模組系統的明確概述,並演示瞭如何通過建立模組化應用程式來幫助管理以及降低複雜性。

JS模組規範AMD/CMD/CommonJS

一、模組化規範的由來 隨著網頁的複雜化,javascript程式碼也相應變得龐大起來,程式碼之間的分工合作就尤為重要了,這時候有了模組,我們就可以只關注自己業務的核心邏輯,其他想要實現的功能直接載入他人的模組便足夠了。考慮到模組的統一,便有了模組規範化。接下來

深入理解JavaScript模組程式設計RequireJS

1、開篇的話 之前寫過一篇JavaScript模組化程式設計,當時是結合自己做的東西來寫的,比著葫蘆畫瓢。現在回過頭來看,依然有些不是太理解的地方,現在重新寫個小例子,加深自己的理解。JavaScript模組化概念及重要性以及RequireJS的好處就不介紹了

手把手教你用深度學習做物體檢測()模型訓練

本篇文章旨在快速試驗使用yolov3演算法訓練出自己的物體檢測模型,所以會重過程而輕原理,當然,原理是非常重要的,只是原理會安排在後續文章中專門進行介紹。所以如果本文中有些地方你有原理方面的疑惑,也沒關係,可以自行網上搜索相關資料,也可以先留著問題,相信你會在後續文章中找到答案。    

MySQL()MHA實現MySQL主從架構中主服務器的高可用zabbix完成manager重啟

code parallel 可以登錄 authorize sudo word systemctl 命令 nag MHA(Master High Availability)是目前在MySQL高可用方面相對成熟的一個解決方案,MHA在監控到master節點故障時,會提升其中擁有

mysql系列詳解mysql中各類日誌詳解-技術ken

1.前言 日誌檔案記錄了MySQL資料庫的各種型別的活動,MySQL資料庫中常見的日誌檔案有 查詢日誌,慢查詢日誌,錯誤日誌,二進位制日誌,中繼日誌 。下面分別對他們進行介紹。   2.查詢日誌   1.檢視查詢日誌變數 查詢日誌即檢視日誌記錄了所有對 My

《CMake實踐》筆記構建靜態庫(.a) 與 動態庫(.so) 及 如何使用外部共享庫標頭檔案

五、靜態庫與動態庫構建 讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。 本節的任務: 1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,Hell

【轉】《CMake實踐》筆記構建靜態庫(.a) 與 動態庫(.so) 及 如何使用外部共享庫標頭檔案

五、靜態庫與動態庫構建讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。本節的任務:1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,H

1098: C語言程式設計教程(第版)課後習題10.5---有n人圍成一圈順序排號。從第1個人開始報數(從1到3報數)凡報到3的人退出圈子問最後留下的是原來的第幾號的那位。

題目描述 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。 輸入 初始人數n 輸出 最後一人的初始編號 樣例輸入 3 樣例輸出 2 提示 來源 思路點撥:定義一個數組,陣列下標表示人的編號,若數組裡面的

視覺視訊中國從哪個國家進口額最高?不是美國、日本竟是…

導讀:剛剛過去的中國進口博覽會,是世界上首個以進口為主題的大型國家級展會。那麼你知道中國從哪個國

模型下的旋轉檢視模型如何確定旋轉中心點

在三檢視下對模型進行旋轉檢視,如果能確定旋轉中心點,那麼對模型的瀏覽就更加的容易。Revit提供了這個功能來設定旋轉檢視中心點。 在旋轉開始前,選擇一個物件,那麼Revit就會以這個物件的中心點為旋轉點進行旋轉。再啟動旋轉檢視命令。 旋轉檢視有兩種方式: 1. 拖動檢

.NET快速信息系統開發框架 V3.2->Web版本工作部分業務處理界面與查看界面全新展示

rdiframework 工作流 快速開發框架 web前端 權限系統   RDIFramework.NET工作流程組件是以RDIFramework.NET框架為支撐,根據我們多年的項目經驗和項目實踐,結合國內各大工作流產品的特點研發的一套流程管理組件。該組件不僅考慮到從零搭建業務系統,也考

實戰筆記Jenkins打造強大的前端自動化工作

背景 公司的前端構建及部署工作都是人工去做,隨著業務擴大,專案迭代速度變快,人員增多,各種問題都暴露出來,本文是對前端自動化工作流進行探索後的一篇經驗分享,將通過一個簡單案例分享一下基於Jenkins的前端自動化工作流搭建的過程,搭建完這套工作流,我們只需要在本地發起一個g

2018 保研經驗(適用於剛進入大的學弟學妹,內含香港中文,清華計算機,北大叉院,中科院計算所自動化所入營難度分析)

我的保研歷程是從大三的寒假開始的, 在2018.02-2018.09這漫長的七個月中可以說是一路坎坷,不過好在最終結果很滿意~ 這期間,筆者除了對自己的未來有了更深入的思考之外,更是結交了很多優秀的同學,我想,這會是我一生中都難忘的經歷. 0.前言 寫這篇文

HTML5前端教程分享前端模組開發

1. 命名衝突 首先從一個簡單的習慣開始。 由於以前一直做 JavaEE 開發的緣故,在 JavaScript 開發中,我已經習慣將專案中的一些通用功能抽象出來,形成一個個的獨立函式,以便於實現程式碼複用,如: function css(element, attr

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗按鍵模組② — 點選與長點選

實驗三:按鍵模組② — 點選與長點選 實驗二我們學過按鍵功能模組的基礎內容,其中我們知道按鍵功能模組有如下操作: l 電平變化檢測; l 過濾抖動; l 產生有效按鍵。 實驗三我們也會z執行同樣的事情,不過卻是產生不一樣的有效按鍵: l 按下有效(點選); l 長按下有效(長點選)。 圖3