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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章