diff --git a/room/__manifest__.py b/room/__manifest__.py index 25522f044..43b68f973 100644 --- a/room/__manifest__.py +++ b/room/__manifest__.py @@ -7,7 +7,7 @@ 'description': 'Experience the Ease of Booking Meeting Rooms with Real-Time Availability Display.', 'category': 'Services/Room', 'version': '1.0', - 'depends': ['mail', 'hr', 'documents'], + 'depends': ['mail', 'hr', 'documents', 'yuthon_wechat'], 'data': [ 'data/message_template_views.xml', 'views/room_booking_views.xml', diff --git a/room/models/room_booking.py b/room/models/room_booking.py index bf88722f3..a166448e4 100644 --- a/room/models/room_booking.py +++ b/room/models/room_booking.py @@ -4,7 +4,7 @@ import qrcode import base64 from io import BytesIO from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError +from odoo.exceptions import ValidationError, UserError class RoomBooking(models.Model): @@ -34,6 +34,8 @@ class RoomBooking(models.Model): meeting_boss_document_ids = fields.One2many('boss.document', 'room_booking_id', string="董事会议文档") meeting_sing_ids = fields.One2many('room.meeting.sign', 'room_booking_id', string="签到详情") meeting_data = fields.Html(string="会议说明") + wechat_meetingid = fields.Char("企业微信会议室ID") + def meet_notice(self): if self.is_notice: @@ -61,7 +63,7 @@ class RoomBooking(models.Model): # odoo发通知 def meeting_sign_in(self): # todo 需要写一个页面填写信息之后返回给地址 - code_url = "" # 制作填写表单的地址 + code_url = "https://pengyuthon.com/contactus" # 制作填写表单的地址 qrcode_url = qrcode.make(code_url) buffer = BytesIO() qrcode_url.save(buffer, format='PNG') @@ -111,13 +113,58 @@ class RoomBooking(models.Model): # Notify frontend views of new bookings for room, bookings in bookings.grouped("room_id").items(): room._notify_booking_view("create", bookings) + # wechat 创建会议 + for record in bookings: + record.sync_wechat_room() return bookings + @api.model + def sync_wechat_room(self): + for record in self: + admin_userid = record.organizer_id.oauth_uid + title = record.name + meeting_start = record.start_datetime.timestamp() + meeting_duration = record.stop_datetime.timestamp() - record.start_datetime.timestamp() + if not record.wechat_meetingid: + create_result, create_data = self.sudo().env["wecom.apps"].sync_meeting_create( + admin_userid=admin_userid, + title=title, + meeting_start=meeting_start, + meeting_duration=meeting_duration, + kwargs={ + "location": record.room_id.name, + "invitees": { + "userid": [r.oauth_uid for r in record.room_users_ids] + }, + } + ) + if create_result: + record.wechat_meetingid = create_data.get("meetingid", "") + if not create_result: + raise UserError("同步企业微信会议失败:{0}".format(str(create_data))) + if record.wechat_meetingid: + update_result, update_data = self.sudo().env["wecom.apps"].sync_meeting_update( + meetingid=record.wechat_meetingid, + kwargs={ + "title": title, + "meeting_start": meeting_start, + "meeting_duration":meeting_duration, + "location": record.room_id.name, + "invitees": { + "userid": [r.oauth_uid for r in record.room_users_ids] + }, + } + ) + if not update_result: + raise UserError("更新企业微信会议失败:{0}".format(str(update_data))) + def unlink(self): # Notify frontend of deleted bookings bookings_by_room = self.grouped("room_id") for room, bookings in bookings_by_room.items(): room._notify_booking_view("delete", bookings) + if self.wechat_meetingid: + self.sudo().env["wecom.apps"].sync_meeting_cancel(meetingid=self.wechat_meetingid) return super(RoomBooking, self).unlink() def write(self, vals): @@ -132,6 +179,7 @@ class RoomBooking(models.Model): elif {"name", "start_datetime", "stop_datetime"} & vals.keys(): for room, bookings in bookings_by_room.items(): room._notify_booking_view("update", bookings) + self.sync_wechat_room() return res @api.model diff --git a/room/wizard/room_booking_sign_wizard.xml b/room/wizard/room_booking_sign_wizard.xml index d4e98be2c..ef109fafd 100644 --- a/room/wizard/room_booking_sign_wizard.xml +++ b/room/wizard/room_booking_sign_wizard.xml @@ -6,7 +6,7 @@
- +
diff --git a/website_form_room/__init__.py b/website_form_room/__init__.py new file mode 100644 index 000000000..e046e49fb --- /dev/null +++ b/website_form_room/__init__.py @@ -0,0 +1 @@ +from . import controllers diff --git a/website_form_room/__manifest__.py b/website_form_room/__manifest__.py new file mode 100644 index 000000000..a62a8ec87 --- /dev/null +++ b/website_form_room/__manifest__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': '会议表单', + 'version': '17.0', + 'depends': ['web'], + 'data': [ + 'views/webclient_templates.xml', + ], +} diff --git a/website_form_room/controllers/__init__.py b/website_form_room/controllers/__init__.py new file mode 100644 index 000000000..12a7e529b --- /dev/null +++ b/website_form_room/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/website_form_room/controllers/main.py b/website_form_room/controllers/main.py new file mode 100644 index 000000000..240ecd61a --- /dev/null +++ b/website_form_room/controllers/main.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import json +import logging + + +import odoo +import odoo.modules.registry +from odoo import http +from odoo.exceptions import AccessError +from odoo.http import request +from odoo.addons.web.controllers.utils import ensure_db + +_logger = logging.getLogger(__name__) + + +class Home(http.Controller): + @http.route('/web/room', type='http', auth="none") + def web_login(self, room_id=None, **kw): + ensure_db() + values = {k: v for k, v in request.params.items()} + + if not room_id: + values['error'] = "缺少会议号" + else: + values['room_id'] = int(room_id) + # record = request.env['room.booking'].sudo().browse(values['room_id']) + if request.httprequest.method == 'POST': + try: + # pass + values["message"] = "签到成功" + except odoo.exceptions.AccessDenied as e: + if e.args == odoo.exceptions.AccessDenied().args: + values['error'] = "重复签到" + else: + values['error'] = "签到失败" + + response = request.render('website_form_room.website_form_room', values) + response.headers['X-Frame-Options'] = 'SAMEORIGIN' + response.headers['Content-Security-Policy'] = "frame-ancestors 'self'" + return response diff --git a/website_form_room/static/description/icon.png b/website_form_room/static/description/icon.png new file mode 100644 index 000000000..b7aaac75c Binary files /dev/null and b/website_form_room/static/description/icon.png differ diff --git a/website_form_room/views/webclient_templates.xml b/website_form_room/views/webclient_templates.xml new file mode 100644 index 000000000..135d9bbf3 --- /dev/null +++ b/website_form_room/views/webclient_templates.xml @@ -0,0 +1,78 @@ + + + + + + + + diff --git a/yuthon_hr_employee/models/hr_employee_page.py b/yuthon_hr_employee/models/hr_employee_page.py index c7e2eb037..41b198132 100644 --- a/yuthon_hr_employee/models/hr_employee_page.py +++ b/yuthon_hr_employee/models/hr_employee_page.py @@ -36,6 +36,8 @@ class YuthonEducationExperienceLine(models.Model): start_date = fields.Date(string="入学时间") end_date = fields.Date(string="毕业时间") professional = fields.Char(string="专业") + Part_time_degree = fields.Char(string="非全日制学历学位") + full_time_degree = fields.Char(string="全日制学历学位") major_courses = fields.Char(string="主修课程") diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index dd06dc58f..75175eb8d 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from odoo import api, fields, models +from datetime import datetime nation_list = [('a', '汉族'), ('b', '壮族'), ('v', '满族'), ('d', '回族'), ('e', '苗族'), ('f', '维吾尔族'), ('g', '土家族'), ('h', '彝族'), ('i', '蒙古族'), ('j', '藏族'), ('k', '布依族'), ('l', '侗族'), @@ -22,25 +23,26 @@ class YuthonHrEmployee(models.Model): # odoo里是这样做的,一个用户可以多个公司绑定多个员工,每个员工都有自己的部门和岗位 number = fields.Char(string="编号") - use_user_type = fields.Selection([('formal', '正式工'), ('labor', '劳务派遣'), - ('part_time', '兼职人员'), ('practice', '正式工')], string="用工形式") + use_user_type = fields.Selection([('formal', '正式职工'), ('labor', '劳务协议'), + ('part_time', '兼职协议'), ('employment', '兼职用工')], string="用工形式") user_number = fields.Char(string="员工编号") job_lv_id = fields.Many2one('yuthon.job.lv', string="最新职级") # 个人信息 user_salary = fields.Float(string="基本工资") job_lv_salary = fields.Float(string="职级工资") - entry_time = fields.Datetime(string="入职时间") - confirmation_time = fields.Datetime(string="转正时间") - company_old = fields.Integer(string="司龄") + entry_date = fields.Date(string="入职时间") + confirmation_date = fields.Date(string="转正时间") + company_old = fields.Char(string="司龄", compute='_compute_company_old') user_sex = fields.Selection([('girl', '女'), ('boy', '男')], string="性别") user_number_start_time = fields.Date(string="身份中有效开始时间") user_number_end_time = fields.Date(string="身份证有效到期时间") nation = fields.Selection(nation_list, string="民族") - old = fields.Integer(string="年龄") + old = fields.Integer(string="年龄", compute='_compute_birthday_old') + birthday_month = fields.Integer(string="生日月份", compute='_compute_birthday_old') user_type = fields.Char(string="人员类别") - retire_data = fields.Date(string="退休日期") - retire_years = fields.Integer(string="离退休年限") - political_aspects = fields.Selection([('dang', '党员'), ('people', '群众')], string="政治面貌") + retire_date = fields.Date(string="退休日期") + retire_years = fields.Integer(string="离退休年限", compute='_compute_retire_years') + political_aspects = fields.Selection([('cpc_dang', '中共党员'), ('nld', '民盟'), ('league_member', '共青团员'), ('people', '群众')], string="政治面貌") dang_data = fields.Date(string="入团(党)时间") user_origin = fields.Char(string="籍贯") user_location = fields.Char(string="户口所在地") @@ -57,7 +59,6 @@ class YuthonHrEmployee(models.Model): cumulative_work_month = fields.Integer(string="累计工作月数") cumulative_work_years = fields.Integer(string="累计工作年限") # 教育 - full_degree = fields.Selection([('full', '全日制学历学位'), ('no_full', '非全日制学历学位')], string="学历学位") high_degree = fields.Char(string="最高学历") high_degree2 = fields.Char(string="最高学位") graduate_school = fields.Char(string="毕业院校") @@ -116,35 +117,44 @@ class YuthonHrEmployee(models.Model): else: social.social_insurance_time = False + @api.depends('entry_date') + def _compute_company_old(self): + """司龄计算""" + for record in self: + if record.entry_date: + today = datetime.now().date() + years_diff = today.year - record.entry_date.year + months_diff = today.month - record.entry_date.month + if today.month < record.entry_date.month: + years_diff -= 1 + months_diff += 12 + record.company_old = str(years_diff) + '年' + str(months_diff) + '月' + else: + record.company_old = None + @api.depends('birthday') + def _compute_birthday_old(self): + """生日月份 年龄 计算""" + for record in self: + if record.birthday: + today = datetime.now().date() + record.birthday_month = record.birthday.month + record.old = today.year - record.birthday.year + else: + record.birthday_month = 0 + record.old = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @api.depends('retire_date') + def _compute_retire_years(self): + """离退休年限计算""" + for record in self: + if record.retire_date: + today = datetime.now().date() + years_diff = today.year - record.retire_date.year + compute = years_diff + if compute < 0: + record.retire_years = -1 * compute + else: + record.retire_years = 0 + else: + record.retire_years = 0 diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index 67c656a3b..186727826 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -49,8 +49,8 @@ - - + + @@ -60,10 +60,20 @@ - + - - - - - - - - - - - - - - - - - @@ -196,6 +189,8 @@ + + diff --git a/yuthon_hr_employee/wizard/hr_employee_wizard.py b/yuthon_hr_employee/wizard/hr_employee_wizard.py index 8d7efccfb..500bdfe03 100644 --- a/yuthon_hr_employee/wizard/hr_employee_wizard.py +++ b/yuthon_hr_employee/wizard/hr_employee_wizard.py @@ -22,9 +22,11 @@ class YuthonHrEmployeeWizard(models.Model): raise ValidationError('请上传文件。') book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file)) sh = book.sheet_by_index(0) + sh2 = book.sheet_by_index(1) + sh3 = book.sheet_by_index(2) for rx in range(1, sh.nrows): row = sh.row(rx) - self.employee_user_data(row) + self.employee_user_data(row, sh2, sh3) return { 'name': '批量更新员工', 'type': 'ir.actions.act_window', @@ -32,45 +34,75 @@ class YuthonHrEmployeeWizard(models.Model): 'res_model': 'hr.employee', } - def employee_user_data(self, row): - employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)]) - department_id = self.env['hr.department'].search([('name', '=', row[1].value.split('\\')[-1])]) - role_main = self.env['soong.user.role'].search([('name', '=', row[4].value)]) - job = self.env['hr.job'].search([('name', '=', row[7].value)]) - job_lv = self.env['yuthon.job.lv'].search([('name', '=', row[8].value)]) - parent_id = self.env['hr.employee'].search([('name', '=', row[9].value)]) - if role_main: - role_list_id = role_main - else: - role_list_id = self.env['soong.user.role'].create({'name': row[4].value}) - if job: - job_id = job - else: - job_id = self.env['hr.job'].create({'name': row[7].value}) - if job_lv: - job_lv_id = job_lv - else: - job_lv_id = self.env['yuthon.job.lv'].create({'name': row[8].value}) - role_data = row[5].value - role_list_ids = [] - for user in role_data.split(','): - user_role = self.env['soong.user.role'].search([('name', '=', user)]) - if user_role: - role_list_ids.append(user_role.id) - else: - new_user_role = self.env['soong.user.role'].create({'name': user}) - role_list_ids.append(new_user_role.id) + def employee_user_data(self, row, sh2, sh3): + employee_name = self.env['hr.employee'].search([('name', '=', row[4].value)]) + use_user_type_dict = {'正式职工': 'formal', '劳务协议': 'labor', '兼职协议': 'part_time', '兼职用工': 'employment', '': ''} + use_user_type = use_user_type_dict[row[1].value] + job_lv_id = self.env['yuthon.job.lv'].search([('name', '=', row[9].value)]) + marital_dict = {'单身': 'single', '已婚': 'married', '合法同居者': 'cohabitant', '丧偶': 'widower', '离异': 'divorced', '': ''} + marital = marital_dict[row[19].value] + political_aspects_dict = {'中共党员': 'cpc_dang', '民盟': 'nld', '共青团员': 'league_member', '群众': 'people', '': ''} + political_aspects = political_aspects_dict[row[26].value] + employee_data = { - 'name': employee_name.name, - 'department_id': department_id.id, - 'user_sex': 'boy' if row[2].value == '男' else 'girl', - 'birthday': datetime.strptime(row[3].value, '%Y-%m-%d').date() if len(row[3].value) != 0 else '', - 'user_role_id': role_list_id, - 'user_role_ids': role_list_ids, - 'work_phone': row[6].value, - 'job_id': job_id, - 'job_lv_id': job_lv_id, - 'parent_id': parent_id, + 'use_user_type': use_user_type if use_user_type else None, # 用工形式 + 'marital': marital if marital else None, # 婚姻 + 'user_type': row[23].value if row[23].value else None, # 人员类别 + 'high_degree': row[30].value if row[30].value else None, # 最高学历 + 'seniority_prize_pick_up_status': row[43].value if row[43].value else None, # 工龄相关年功奖领取情况 + 'high_degree2': row[31].value if row[31].value else None, # 最高学位 + 'new_start_contract_data': datetime.strptime(row[28].value, '%Y/%m/%d').date() if row[28].value else None, # 最新合同开始日期 + 'political_aspects': political_aspects if political_aspects else None, # 政治面貌 + 'birthday': datetime.strptime(row[20].value, '%Y/%m/%d').date() if row[20].value else None, # 出生年月 + 'dang_data': datetime.strptime(row[27].value, '%Y/%m/%d').date() if row[27].value else None, # 入党(团)时间 + 'retire_date': datetime.strptime(row[24].value, '%Y/%m/%d').date() if row[24].value else None, # 退休日期 + 'new_end_contract_data': datetime.strptime(row[29].value, '%Y/%m/%d').date() if row[29].value else None, # 最新合同终止日期 + 'job_lv_id': job_lv_id.id, # 最新职级 有几个没有 + 'user_sex': 'boy' if row[18].value == '男' else 'girl', # 性别 + 'nation': row[17].value if row[17].value else None, # 民族 + 'identification_id': row[14].value if row[14].value else None, # 身份证号 + 'entry_date': datetime.strptime(row[11].value, '%Y/%m/%d').date() if row[11].value else None, # 入职时间 + 'confirmation_date': datetime.strptime(row[12].value, '%Y/%m/%d').date() if row[12].value else None, # 转正时间 + 'user_number_start_time': datetime.strptime(row[15].value, '%Y/%m/%d').date() if row[15].value else None, # 身份证有效期开始时间 + 'user_number_end_time': datetime.strptime(row[16].value, '%Y/%m/%d').date() if row[16].value else None, # 身份证有效期结束时间 + 'mobile_phone': int(row[8].value) if row[8].value else None, # 手机号码 + 'work_phone': int(row[7].value) if row[7].value else None, # 办公电话 + 'user_number': row[3].value if row[3].value else None, # 员工编号 } if employee_name: employee_name.write(employee_data) + + # 处理教育经历 + for rx in range(1, sh2.nrows): + row2 = sh2.row(rx) + if row2[0].value == row[4].value: + existing_education = employee_name.education_experience_ids.filtered(lambda e: e.name_school == row2[1].value) + education_data = { + 'name_school': row2[1].value if row2[1].value else None, # 学校名称 + 'end_date': datetime.strptime(row2[2].value, '%Y/%m/%d').date() if row2[2].value else None, # 毕业时间 + 'professional': row2[3].value if row2[3].value else None, # 专业 + 'Part_time_degree': row2[4].value if row2[4].value else None, # 非全日制学历学位 + 'full_time_degree': row2[5].value if row2[5].value else None, # 全日制学历学位 + } + if existing_education: + existing_education.write(education_data) + else: + employee_name.write({ + 'education_experience_ids': [(0, 0, education_data)] + }) + + # 处理技能证书 + for rx in range(1, sh3.nrows): + row3 = sh3.row(rx) + if row3[0].value == row[4].value: + existing_certificate = employee_name.skills_certificates_ids.filtered(lambda s: s.rank_name == row3[1].value) + certificate_data = { + 'rank_name': row3[1].value if row3[1].value else None, # 职级名称 + 'rank_time': datetime.strptime(row3[2].value, '%Y/%m/%d').date() if row3[2].value else None, # 职级时间 + } + if existing_certificate: + existing_certificate.write(certificate_data) + else: + employee_name.write({ + 'skills_certificates_ids': [(0, 0, certificate_data)] + }) diff --git a/yuthon_issue/__manifest__.py b/yuthon_issue/__manifest__.py index fa7cae1dd..2ac78637e 100644 --- a/yuthon_issue/__manifest__.py +++ b/yuthon_issue/__manifest__.py @@ -20,6 +20,7 @@ 'views/issue_approval_class_views.xml', 'views/issue_approval_boss_views.xml', 'views/inherit_room_booking_views.xml', + 'views/menus.xml', ], 'installable': True, 'application': True, diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py index dfdbe0105..69dece85a 100644 --- a/yuthon_issue/models/issue_library.py +++ b/yuthon_issue/models/issue_library.py @@ -15,8 +15,14 @@ class IssueLibrary(models.Model): statu = fields.Selection([('draft', '草稿'), ('approval', '审批中'), ('done', '已通过'), ('stop', '已拒绝'), ('will', '待上会'), ('on_meet', '已上会'), ('cancel', '已取消')], default='draft', string="议题状态") is_party = fields.Boolean(string="党之委会") + is_party_pass = fields.Boolean(string="通过") + is_party_note = fields.Text(string="不通过意见") is_class = fields.Boolean(string="班子会") + is_class_pass = fields.Boolean(string="通过") + is_class_note = fields.Text(string="不通过意见") is_boss = fields.Boolean(string="董事会") + is_boss_pass = fields.Boolean(string="通过") + is_boss_note = fields.Text(string="不通过意见") is_note = fields.Boolean(string="备案、核准") creart_datetime = fields.Datetime(string="创建时间", default=fields.Datetime.now) notice_documents_ids = fields.Many2many('documents.document', string="议题管理文件") diff --git a/yuthon_issue/security/ir.model.access.csv b/yuthon_issue/security/ir.model.access.csv index a2fc9712b..d1f18eba3 100644 --- a/yuthon_issue/security/ir.model.access.csv +++ b/yuthon_issue/security/ir.model.access.csv @@ -1,3 +1,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_issue_library,issue_library,model_issue_library,base.group_user,1,1,1,1 +access_issue_approval_boss,issue_approval_boss,model_issue_approval_boss,base.group_user,1,1,1,1 +access_issue_approval_class,issue_approval_class,model_issue_approval_class,base.group_user,1,1,1,1 +access_issue_approval_party,issue_approval_party,model_issue_approval_party,base.group_user,1,1,1,1 diff --git a/yuthon_issue/views/issue_approval_boss_views.xml b/yuthon_issue/views/issue_approval_boss_views.xml index 8d37acbbe..8507b392e 100644 --- a/yuthon_issue/views/issue_approval_boss_views.xml +++ b/yuthon_issue/views/issue_approval_boss_views.xml @@ -60,16 +60,10 @@ - 党总支议题审批 + 董事会议题审批 issue.approval.boss tree,form - - + \ No newline at end of file diff --git a/yuthon_issue/views/issue_approval_class_views.xml b/yuthon_issue/views/issue_approval_class_views.xml index bb78ca39d..4cfb88eea 100644 --- a/yuthon_issue/views/issue_approval_class_views.xml +++ b/yuthon_issue/views/issue_approval_class_views.xml @@ -60,16 +60,10 @@ - 党总支议题审批 + 领导班子议题审批 issue.approval.class tree,form - - + \ No newline at end of file diff --git a/yuthon_issue/views/issue_approval_party_views.xml b/yuthon_issue/views/issue_approval_party_views.xml index c8d7af591..78ffd365e 100644 --- a/yuthon_issue/views/issue_approval_party_views.xml +++ b/yuthon_issue/views/issue_approval_party_views.xml @@ -66,10 +66,5 @@ - + \ No newline at end of file diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index 0b1112e04..f889ecf14 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -11,8 +11,11 @@ + + + @@ -21,6 +24,110 @@ + issue.library.tree + issue.library + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + issue.library.search + issue.library + + + + + + + + + + + + + 议题库 + issue.library + tree,form + + + + + 待上会 + issue.library + tree,form + [('statu','=','will')] + + + + 已上会 + issue.library + tree,form + [('statu','=','on_meet')] + + + + + issue.library.tree + issue.library + + + + + + + + + + + + + + issue.library.tree issue.library @@ -65,41 +172,34 @@ - - issue.library.search - issue.library - - - - - - - - - - - - - - - + 议题库 issue.library tree,form - + - + + 待上会 issue.library tree,form [('statu','=','will')] + - + + 已上会 issue.library tree,form [('statu','=','on_meet')] + @@ -109,41 +209,4 @@ code action = model.all_meeting_issue() - - - - - - - - - \ No newline at end of file diff --git a/yuthon_issue/views/issue_type_views.xml b/yuthon_issue/views/issue_type_views.xml index 830a75533..69ad8c9a1 100644 --- a/yuthon_issue/views/issue_type_views.xml +++ b/yuthon_issue/views/issue_type_views.xml @@ -17,10 +17,10 @@ tree - + + + + + + \ No newline at end of file diff --git a/yuthon_issue/views/menus.xml b/yuthon_issue/views/menus.xml new file mode 100644 index 000000000..eca8b842a --- /dev/null +++ b/yuthon_issue/views/menus.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/yuthon_res_partner/__init__.py b/yuthon_res_partner/__init__.py deleted file mode 100644 index cde864bae..000000000 --- a/yuthon_res_partner/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import models diff --git a/yuthon_res_partner/__manifest__.py b/yuthon_res_partner/__manifest__.py deleted file mode 100644 index 9800f7161..000000000 --- a/yuthon_res_partner/__manifest__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -{ - 'name': "Yuthon Res Partner", - 'summary': "联系人承租方", - 'description': """ - - """, - 'author': 'pengyuthon', - 'website': 'https://www.pengyuthon.com', - 'category': 'Human Resources/Attendances', - 'version': '0.1', - 'license': 'LGPL-3', - 'depends': ['base', 'account', 'contacts'], - 'data': [ - 'security/ir.model.access.csv', - 'views/yuthon_res_partner_views.xml', - 'views/contacts_inherit_menu_views.xml', - ], - 'installable': True, - 'application': True, -} - diff --git a/yuthon_res_partner/models/__init__.py b/yuthon_res_partner/models/__init__.py deleted file mode 100644 index c005a0071..000000000 --- a/yuthon_res_partner/models/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import yuthon_res_partner diff --git a/yuthon_res_partner/security/ir.model.access.csv b/yuthon_res_partner/security/ir.model.access.csv deleted file mode 100644 index d7595f820..000000000 --- a/yuthon_res_partner/security/ir.model.access.csv +++ /dev/null @@ -1,4 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink - - - diff --git a/yuthon_res_partner/static/description/icon.svg b/yuthon_res_partner/static/description/icon.svg deleted file mode 100644 index 21ce0f24e..000000000 --- a/yuthon_res_partner/static/description/icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yuthon_sale_renting/__manifest__.py b/yuthon_sale_renting/__manifest__.py index 23ba12ad3..ba30b1dc5 100644 --- a/yuthon_sale_renting/__manifest__.py +++ b/yuthon_sale_renting/__manifest__.py @@ -10,10 +10,12 @@ 'category': 'Human Resources/Attendances', 'version': '0.1', 'license': 'LGPL-3', - 'depends': ['sale_renting', 'mail', 'documents', 'soong_workflow'], + 'depends': ['sale_renting', 'mail', 'documents', 'soong_workflow', 'contacts'], 'data': [ 'data/sale_renting_code_data.xml', 'security/ir.model.access.csv', + 'views/contacts_inherit_menu_views.xml', + 'views/yuthon_res_partner_views.xml', 'views/property_assess_views.xml', 'views/property_confirm_views.xml', 'views/property_move_views.xml', diff --git a/yuthon_sale_renting/models/__init__.py b/yuthon_sale_renting/models/__init__.py index 8a812b92d..87362a99a 100644 --- a/yuthon_sale_renting/models/__init__.py +++ b/yuthon_sale_renting/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from . import yuthon_res_partner from . import yuthon_product_template from . import property_assess from . import property_confirm diff --git a/yuthon_res_partner/models/yuthon_res_partner.py b/yuthon_sale_renting/models/yuthon_res_partner.py similarity index 100% rename from yuthon_res_partner/models/yuthon_res_partner.py rename to yuthon_sale_renting/models/yuthon_res_partner.py diff --git a/yuthon_res_partner/views/contacts_inherit_menu_views.xml b/yuthon_sale_renting/views/contacts_inherit_menu_views.xml similarity index 100% rename from yuthon_res_partner/views/contacts_inherit_menu_views.xml rename to yuthon_sale_renting/views/contacts_inherit_menu_views.xml diff --git a/yuthon_res_partner/views/yuthon_res_partner_views.xml b/yuthon_sale_renting/views/yuthon_res_partner_views.xml similarity index 100% rename from yuthon_res_partner/views/yuthon_res_partner_views.xml rename to yuthon_sale_renting/views/yuthon_res_partner_views.xml diff --git a/序列号生成器/序列号.py b/序列号生成器/序列号.py index 1fff5b110..132a85d8a 100644 --- a/序列号生成器/序列号.py +++ b/序列号生成器/序列号.py @@ -39,7 +39,7 @@ def rsaDecrypt(str1): return con -str1 = rsaEncrypt("base#2099-04-18 23:59:59") +str1 = rsaEncrypt("base#2030-04-18 23:59:59") print("加密后密文:\n%s" % str1) # content = rsaDecrypt('16E01254F15E539CF5B734A9A6FB3649640709796F06F5167CB5BFE542210596CE920CBFDB5E22E863983682DC326C421EF896A9D8E2CAC6B9226E89F502FDD7') # print("解密后明文:\n%s" % content)