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在他/她自己的session的attendees中不存在。
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約束
- CHECK (檢查)課程描述和課程名稱是不同的
- 使Course的name UNIQUE(唯一的)
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 - 新增重複選項
因為我們為課程名稱的唯一性添加了一個約束,所以不再可能使用“複製”函式 (
)。重新實現你自己的“複製”方法,允許複製課程物件,把原來的名字改成“[原始名字]的拷貝”。
openacademy/models.pysession_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
,info
,muted
,primary
,success
orwarning
).<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<5" decoration-danger="duration>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相關的事件。
新增從start_date和duration計算的AA欄位end_date
提示
逆函式使欄位可寫,並允許在日曆檢視中移動會話(通過拖放)
- 向Session模型新增日曆檢視
- 並將日曆檢視新增到Session模型的動作中
# -*- 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>元素可以有一個
模型約束Python約束定義為用constrains()修飾的方法,並在記錄集上呼叫。修飾符指定約束中涉及哪些欄位,以便在修改其中一個約束時自動評估約束。如果不滿足該不變數,則期望該方法引發異常:from odoo.exceptions import ValidationEr 其他 描述 用戶界面 列表 支持 字段 界面設計 允許 學習 一:模型
1:創建模型
模型屬性:模型類可以使用一些屬性來控制它們的一些行為:
_name :創建odoo模型的內部標識符,必含項。
_description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。
模型之間的關係來自模型的記錄可能與來自另一模型的記錄相關。例如,一個銷售訂單記錄和一個包含客戶資料的客戶記錄相關;同時也和銷售訂單線記錄相關。練習建立會話模型對於模組Open Academy,我們考慮一個會話模型:會話是在給定時間為給定聽眾授課的課程。為會話建立模型。一個會話
你是否做過多頁面的大型網站或者其中一部分?如果你做過,你可能意識到CSS架構不夠強大所帶來的恐懼。你可能還會研究如何編寫可維護的CSS。
由於我們的行業很棒,我們有很多推薦的解決方案。因為專家們的紛紛加入,於是我們有BEM,OOCSS,SMACSS,Atomic Design等許多選
內容簡介
Java 9 向 Java 平臺引入了模組系統,這是一個非常重要的飛躍,標誌著模組化 Java 軟體開發的新紀元。當需要建立靈活且易於維護的程式碼時,模組化是一個關鍵的架構設計原則。本書給出了 Java 模組系統的明確概述,並演示瞭如何通過建立模組化應用程式來幫助管理以及降低複雜性。
一、模組化規範的由來
隨著網頁的複雜化,javascript程式碼也相應變得龐大起來,程式碼之間的分工合作就尤為重要了,這時候有了模組,我們就可以只關注自己業務的核心邏輯,其他想要實現的功能直接載入他人的模組便足夠了。考慮到模組的統一,便有了模組規範化。接下來
1、開篇的話
之前寫過一篇JavaScript模組化程式設計,當時是結合自己做的東西來寫的,比著葫蘆畫瓢。現在回過頭來看,依然有些不是太理解的地方,現在重新寫個小例子,加深自己的理解。JavaScript模組化概念及重要性以及RequireJS的好處就不介紹了
本篇文章旨在快速試驗使用yolov3演算法訓練出自己的物體檢測模型,所以會重過程而輕原理,當然,原理是非常重要的,只是原理會安排在後續文章中專門進行介紹。所以如果本文中有些地方你有原理方面的疑惑,也沒關係,可以自行網上搜索相關資料,也可以先留著問題,相信你會在後續文章中找到答案。
  code parallel 可以登錄 authorize sudo word systemctl 命令 nag MHA(Master High Availability)是目前在MySQL高可用方面相對成熟的一個解決方案,MHA在監控到master節點故障時,會提升其中擁有 1.前言
日誌檔案記錄了MySQL資料庫的各種型別的活動,MySQL資料庫中常見的日誌檔案有 查詢日誌,慢查詢日誌,錯誤日誌,二進位制日誌,中繼日誌 。下面分別對他們進行介紹。
2.查詢日誌
1.檢視查詢日誌變數
查詢日誌即檢視日誌記錄了所有對 My
五、靜態庫與動態庫構建
讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。
本節的任務:
1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,Hell
五、靜態庫與動態庫構建讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。本節的任務:1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,H
題目描述
有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。
輸入
初始人數n
輸出
最後一人的初始編號
樣例輸入
3
樣例輸出
2
提示
來源
思路點撥:定義一個數組,陣列下標表示人的編號,若數組裡面的
導讀:剛剛過去的中國進口博覽會,是世界上首個以進口為主題的大型國家級展會。那麼你知道中國從哪個國
在三檢視下對模型進行旋轉檢視,如果能確定旋轉中心點,那麼對模型的瀏覽就更加的容易。Revit提供了這個功能來設定旋轉檢視中心點。
在旋轉開始前,選擇一個物件,那麼Revit就會以這個物件的中心點為旋轉點進行旋轉。再啟動旋轉檢視命令。
旋轉檢視有兩種方式:
1. 拖動檢 rdiframework 工作流 快速開發框架 web前端 權限系統 RDIFramework.NET工作流程組件是以RDIFramework.NET框架為支撐,根據我們多年的項目經驗和項目實踐,結合國內各大工作流產品的特點研發的一套流程管理組件。該組件不僅考慮到從零搭建業務系統,也考
背景
公司的前端構建及部署工作都是人工去做,隨著業務擴大,專案迭代速度變快,人員增多,各種問題都暴露出來,本文是對前端自動化工作流進行探索後的一篇經驗分享,將通過一個簡單案例分享一下基於Jenkins的前端自動化工作流搭建的過程,搭建完這套工作流,我們只需要在本地發起一個g
我的保研歷程是從大三的寒假開始的, 在2018.02-2018.09這漫長的七個月中可以說是一路坎坷,不過好在最終結果很滿意~
這期間,筆者除了對自己的未來有了更深入的思考之外,更是結交了很多優秀的同學,我想,這會是我一生中都難忘的經歷.
0.前言
寫這篇文
1. 命名衝突
首先從一個簡單的習慣開始。
由於以前一直做 JavaEE 開發的緣故,在 JavaScript 開發中,我已經習慣將專案中的一些通用功能抽象出來,形成一個個的獨立函式,以便於實現程式碼複用,如:
function css(element, attr 實驗三:按鍵模組② — 點選與長點選 實驗二我們學過按鍵功能模組的基礎內容,其中我們知道按鍵功能模組有如下操作: l 電平變化檢測; l 過濾抖動; l 產生有效按鍵。 實驗三我們也會z執行同樣的事情,不過卻是產生不一樣的有效按鍵: l 按下有效(點選); l 長按下有效(長點選)。 圖3 相關推薦
Odoo10教程---模組化三:模型約束,高階檢視,工作流,安全性,嚮導,國際化和報表等
Odoo10學習筆記三:模型(結構化的應用數據)、視圖(用戶界面設計)
Odoo10教程---模組化二:模型間關係,繼承,計算欄位等
編寫模組化CSS:BEM
Java 9 模組化開發:核心原則與實踐
JS模組化規範:AMD/CMD/CommonJS
深入理解JavaScript模組化程式設計:RequireJS
手把手教你用深度學習做物體檢測(三):模型訓練
MySQL(三):MHA實現MySQL主從架構中主服務器的高可用,zabbix完成manager重啟
mysql系列詳解三:mysql中各類日誌詳解-技術流ken
《CMake實踐》筆記三:構建靜態庫(.a) 與 動態庫(.so) 及 如何使用外部共享庫和標頭檔案
【轉】《CMake實踐》筆記三:構建靜態庫(.a) 與 動態庫(.so) 及 如何使用外部共享庫和標頭檔案
1098: C語言程式設計教程(第三版)課後習題10.5---有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。
視覺化視訊:中國從哪個國家進口額最高?不是美國、日本,竟是…
三維模型下的旋轉檢視模型時,如何確定旋轉中心點
.NET快速信息化系統開發框架 V3.2->Web版本工作流部分業務處理界面與查看界面全新展示
實戰筆記:Jenkins打造強大的前端自動化工作流
2018 保研經驗(適用於剛進入大三的學弟學妹,內含香港中文,清華計算機,北大叉院,中科院計算所和自動化所等入營難度分析)
HTML5前端教程分享:前端模組化開發
【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗三:按鍵模組② — 點選與長點選