odoo中常用功能代码小片段
一、去除字符串的中文、英文
def remove_letters_and_chinese(self,text):
"""字符串去除字母与中文"""
import re
pattern = r'[\u4e00-\u9fa5a-zA-Z]'
result = re.sub(pattern, '', text)
return result
二、根据时分来判断是当天还是第二天
def set_format_datetime(self,type, date1, date2): """
str_date1='2023-06-27'
str_date2='23:30'
""" from datetime import datetime, timedelta str_date1 = self.remove_letters_and_chinese(date1) str_date2 = self.remove_letters_and_chinese(date2) if type == 'next': dt = datetime.strptime(f"{str_date1} {str_date2}", "%Y-%m-%d %H:%M") else: ql_house = int(str_date2.split(':')[0]) if 13 < ql_house < 24: date_obj = datetime.strptime(str_date1, '%Y-%m-%d') next_day = date_obj - timedelta(days=1) dt = datetime.strptime(f"{next_day.strftime('%Y-%m-%d')} {str_date2}", "%Y-%m-%d %H:%M") else: dt = datetime.strptime(f"{str_date1} {str_date2}", "%Y-%m-%d %H:%M") print('=====dt====----------9999---------------===', dt) return dt.strftime("%Y-%m-%d %H:%M:%S")
三、获取两个时分的时间差
def get_on_bed_time(self, start_time, end_time): from datetime import datetime, timedelta # 将时间字符串转换为datetime对象 start_time = self.remove_letters_and_chinese(start_time) end_time = self.remove_letters_and_chinese(end_time) dt1 = datetime.strptime(start_time, '%H:%M') dt2 = datetime.strptime(end_time, '%H:%M') # 如果dt2比dt1大,说明时间跨越了一天,需要将dt2加上一天 if dt2 < dt1: dt2 += timedelta(days=1) # 计算时间差 delta = dt2 - dt1 # 将时间差转换为小时数 hours = delta.seconds // 3600 # # 将时间差转换为分钟数 minutes = delta.seconds // 60 print(f"时间差为{hours}小时或{minutes}分钟") return delta.seconds
四、日期的加减加一天减一天
def set_report_date(self, date1): """获取日期""" from datetime import datetime, timedelta date_obj = datetime.strptime(date1, '%Y-%m-%d') next_day = date_obj - timedelta(days=1) return next_day.strftime("%Y-%m-%d")
五、获取区间中的日期
def get_dates_between(self, start_date, end_date): """获取区间中的日期""" from datetime import datetime, timedelta dates = [] current_date = datetime.strptime(str(start_date), "%Y-%m-%d") end_date = datetime.strptime(str(end_date), "%Y-%m-%d") while current_date <= end_date: dates.append(current_date.strftime("%Y-%m-%d")) current_date += timedelta(days=1) return dates
六、write与create常见的操作
class Job(models.Model): _inherit = 'hr.job' group_id = fields.Many2one('res.groups', string=u'岗位权限', domain=[('is_job_group', '=', True)]) job_user_ids = fields.Many2many('res.users', 'zimo_m2m_job_user', string=u'岗位人员') @api.model def _on_create_job_user_changed(self, job): if job.group_id and job.job_user_ids: job.group_id.write({'users': [(4, job_user.id) for job_user in job.job_user_ids]}) @api.model def _on_write_job_user_changed(self, job, add_user_list, remove_user_list): if job.group_id: # 获取当前岗位下已有的用户列表 # 根据新增的岗位人员将人员添加到权限组中 added_users = add_user_list if added_users: job.group_id.write({'users': [(4, user.id) for user in added_users]}) # 根据删除的岗位人员将人员从权限组中删除 removed_users = remove_user_list if removed_users: job.group_id.write({'users': [(3, user.id) for user in removed_users]}) @api.model_create_multi def create(self, vals_list): jobs = super(Job, self).create(vals_list) for job in jobs: group_vals = { 'name': job.name, 'category_id': self.env.ref('zimo_increment_base.module_zimo_job_title').id, 'implied_ids': [(6, 0, [self.env.ref('base.group_user').id])], 'is_job_group': True, 'users': [(4, user.id) for user in job.job_user_ids if job.job_user_ids], } job.group_id = self.env['res.groups'].create(group_vals) self._on_create_job_user_changed(job) return jobs def write(self, vals): old_job_user_ids = self.job_user_ids res = super(Job, self).write(vals) new_job_user_ids = self.job_user_ids add_user_list = [i for i in new_job_user_ids if i not in old_job_user_ids] remove_user_list = [i for i in old_job_user_ids if i not in new_job_user_ids] # 分别做操作 if 'group_id' in vals or 'job_user_ids' in vals: for job in self: self._on_write_job_user_changed(job, add_user_list, remove_user_list) return res
心有猛虎,细嗅蔷薇