odoo context上下文通俗理解


我們經常在程序中遇到這樣的場景,在一個作業界面點擊某個按鈕或者進行某類操作,然后觸發到另外一個作業界面的邏輯,此時我們有時不僅僅

需要將特定的數據庫字段傳過去,還可能將第一個界面的某些信息傳遞到跳轉的界面。舉個例子:

學生選課的時候,在課程界面點擊選課,然后會將課程的相關信息傳遞到學生界面,但是我們還需要將課程界面的操作人員(可能不是學生本人)傳遞過去,

此時就需要用到context了。

# -*- coding: utf-8 -*-

from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from odoo.modules.module import get_module_resource
from odoo import tools, _
import random
import time


class course(models.Model):
_name = 'xksystem.course'
_description = 'xksystem.course'

name = fields.Char(string=u'課程名')
code = fields.Char(string=u'課程編號')
studentlimit = fields.Integer(string=u'學生上限')
havestudent = fields.Integer(string=u'已選課學生數', compute='_compute_have_student')
teachers = fields.Many2many('xksystem.teacher', 'xksystem_course_xksystem_teacher_rel',
'course_id', 'teacher_id', string='授課教師')
course_score = fields.Float(string='課程學分')
remarks = fields.Html()

@api.constrains('course_score')
def check_course_score(self):
for record in self:
if record.course_score > 2:
raise ValidationError("The Score is too High: %s" % record.course_score)

#--重寫name_get方法,同時返回課程名稱和代碼,這樣別人在調用的時候就會明確的知道課程名稱和課程代碼
@api.multi
def name_get(self):
result = []

for record in self:
result.append((record.id, "%s(%s)" % (record.name, record.code)))

return result

@api.multi
def _compute_have_student(self):
for recode in self:
l_sql = "select course_id,count(*) from xksystem_studentcourseline " \
"where course_id = %s group by course_id" % (recode.id)
self.env.cr.execute(l_sql)
dicts = self.env.cr.dictfetchall()
#print(dicts)
if len(dicts) > 0:
recode.havestudent = dicts[0]['count']
else:
recode.havestudent = 0

@api.multi
def xk_btn(self):
# --點擊選課按鈕,然后創建一筆學生課程資料
res = self.env['res.users'].search([('id', '=', self.env.uid)]) # 獲取當前用戶的ID
print(res.login)
code = res.login # 獲取當前用戶的學號
res = self.env['xksystem.student'].search([('code', '=', code)]) # 以學號獲取當前學生頭表信息
if res.id:
# 檢索是否已經選過此門課程
res_course = self.env['xksystem.studentcourseline'].search(['&', ('student_id', '=', res.id),
('coursecode', '=', self.id)])
if res_course:
print('此門課程已被選過了,不能重復選擇!')
raise UserError(('你已經選過了這門課,不能重復選擇!'))
else:
# 防止大量並發選課,每位學生隨機停止0-1秒
sleep_time = random.random()
print(sleep_time)
time.sleep(sleep_time)

# 檢索課程是否已經被選光
l_sql = "select course_id,count(*) from xksystem_studentcourseline " \
"where course_id = %s group by course_id" % (self.id)
self.env.cr.execute(l_sql)
dicts = self.env.cr.dictfetchall()
if len(dicts)==0:
havastudent_count = 0
else:
havastudent_count = dicts[0]['count']

if havastudent_count >= self.studentlimit:
raise UserError(('選課學生人數已經超過上限,請選擇其他課程!'))

# 合規,系統進行選課
#在課程類中組學生課程信息,同時將當前操作用戶傳遞過去,然后在student類中判斷當前用戶的合法性
context = {'用戶名':code}
print('context:',context)
vals = {'linenumber': self.env['ir.sequence'].next_by_code('seq.test'), 'student_id': res.id,
'course_id': self.id, 'coursecode': self.code,}
self.with_context(context).env['xksystem.studentcourseline'].sudo().create(vals)
else:
raise UserError(('此賬戶不是學生賬戶,不能選課!'))
return True
class StudentCourseLine(models.Model):

@api.model_create_multi
def create(self, vals_list): limit_student = self.env.context.get('用戶名',False) #從上下文中獲取對應的學生,限制其選課 if limit_student == 'S081001': raise UserError(('此學生被限制選課,請聯系學院管理員!')) for rec in self: print('----context test-----') print(rec.context_get()) print('----context test-----') return super(StudentCourseLine, self).create(vals_list)

 

這個例子就是從一個類跳轉到另外一個類中,將第一個類中的信息用with_context形式傳遞到下游,然后下游的類再用self.env.context.get('用戶名',False)獲取對應的

鍵值,進而邏輯判斷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM