Merge pull request !148 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2024-08-20 06:51:35 +00:00
committed by Gitee
33 changed files with 559 additions and 226 deletions
+1 -1
View File
@@ -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',
+50 -2
View File
@@ -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
+1 -1
View File
@@ -6,7 +6,7 @@
<field name="arch" type="xml">
<form>
<group>
<field name="qrcode_image" widget="image"/>
<field name="qrcode_image" widget="image" readonly="1"/>
</group>
</form>
</field>
+1
View File
@@ -0,0 +1 @@
from . import controllers
+11
View File
@@ -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',
],
}
@@ -0,0 +1 @@
from . import main
+42
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="website_form_room.frontend_layout" name="Frontend Layout" inherit_id="web.layout" primary="True">
<xpath expr="//head/meta[last()]" position="after">
<meta name="viewport" content="width=device-width, initial-scale=1"/>
</xpath>
<xpath expr="//head/link[last()]" position="after">
<link rel="preload" href="/web/static/src/libs/fontawesome/fonts/fontawesome-webfont.woff2?v=4.7.0" as="font" crossorigin=""/>
<t t-call-assets="web.assets_frontend" t-js="false"/>
</xpath>
<xpath expr="//t[@t-out='0']" position="replace">
<div id="wrapwrap" t-attf-class="#{pageName or ''}">
<header t-if="not no_header" id="top" data-anchor="true">
<img class="img-responsive d-block mx-auto"
t-attf-src="/web/binary/company_logo"
alt="Logo"/>
</header>
<main>
<t t-out="0"/>
</main>
<footer t-cache="no_footer,no_copyright" t-if="not no_footer" id="bottom" data-anchor="true" t-attf-class="bg-light o_footer">
<div id="footer"/>
<div t-if="not no_copyright" class="o_footer_copyright">
<div class="container py-3">
<div class="row">
<div class="col-sm text-center text-sm-start text-muted">
<span class="o_footer_copyright_name me-2">Copyright &amp;copy; <span t-field="res_company.name" itemprop="name">Company name</span></span>
</div>
<div class="col-sm text-center text-sm-end">
<t t-call="web.brand_promotion"/>
</div>
</div>
</div>
</div>
</footer>
</div>
</xpath>
</template>
<template id="website_form_room.website_form_room" name="website form room">
<t t-call="website_form_room.frontend_layout">
<div class="container py-5">
<form class="oe_website_form_room" role="form" t-attf-action="/web/room" method="post" onsubmit="this.action = '/web/room' + location.hash">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="mb-3 field-room_id">
<label for="room_id" class="form-label">会议号</label>
<input type="text" placeholder="会议号" name="room_id" t-att-value="room_id" id="room_id" t-attf-class="form-control" readonly="readonly"/>
</div>
<div class="mb-3 field-name">
<label for="name" class="form-label">名字</label>
<input type="text" placeholder="名字" name="name" t-att-value="name" id="name" t-attf-class="form-control" required="required" autofocus="autofocus" autocapitalize="off"/>
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" placeholder="Password" name="password" id="password" t-attf-class="form-control" required="required" t-att-autofocus="'autofocus' if name else None" maxlength="4096"/>
</div>
<p class="alert alert-danger" t-if="error" role="alert">
<t t-esc="error"/>
</p>
<p class="alert alert-success" t-if="message" role="status">
<t t-esc="message"/>
</p>
<div t-attf-class="clearfix oe_login_buttons text-center gap-1 d-grid mb-1">
<button type="submit" class="btn btn-primary">签到</button>
</div>
</form>
</div>
</t>
</template>
</odoo>
@@ -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="主修课程")
+50 -40
View File
@@ -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
@@ -49,8 +49,8 @@
<field name="job_lv_salary"/>
<field name="bank_account_id" context="{'default_partner_id': work_contact_id}"
options="{'no_quick_create': True}" readonly="not id"/>
<field name="entry_time"/>
<field name="confirmation_time"/>
<field name="entry_date"/>
<field name="confirmation_date"/>
<field name="company_old"/>
</group>
<group string="基本信息">
@@ -60,10 +60,20 @@
<field name="user_number_end_time"/>
<field name="nation"/>
<field name="birthday"/>
<field name="old"/>
<label for="old"/>
<div>
<field name="old" style="width: 5%"/>岁
</div>
<label for="birthday_month"/>
<div>
<field name="birthday_month" style="width: 5%"/>月
</div>
<field name="user_type"/>
<field name="retire_data"/>
<field name="retire_years"/>
<field name="retire_date"/>
<label for="retire_years"/>
<div>
<field name="retire_years" style="width: 5%"/>年
</div>
<field name="political_aspects"/>
<field name="dang_data"/>
<field name="user_origin"/>
@@ -72,26 +82,9 @@
<!-- 原字段的关联 暂时保留并隐藏 -->
<field name="country_of_birth" invisible="1"/>
</group>
<!-- 删除 与HR重复-->
<!-- <group string="工作信息">-->
<!-- <field name="new_start_contract_data"/>-->
<!-- <field name="new_end_contract_data"/>-->
<!-- <field name="open_start_time"/>-->
<!-- <field name="open_start_time_today"/>-->
<!-- <field name="interrupt_work_month"/>-->
<!-- <field name="cumulative_work_month"/>-->
<!-- <field name="cumulative_work_years"/>-->
<!-- </group>-->
<group string="教育">
<field name="high_degree"/>
<field name="high_degree2"/>
<field name="full_degree"/>
<field name="graduate_school"/>
<field name="profession"/>
<field name="graduate_date"/>
<field name="job_lv_date"/>
<field name="job_lv"/>
<field name="job_qualification_date"/>
<field name="job_lv_change"/>
<field name="move_note_date"/>
</group>
@@ -196,6 +189,8 @@
<field name="name_school"/>
<field name="start_date"/>
<field name="end_date"/>
<field name="Part_time_degree"/>
<field name="full_time_degree"/>
<field name="professional"/>
<field name="major_courses"/>
</tree>
+71 -39
View File
@@ -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)]
})
+1
View File
@@ -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,
+6
View File
@@ -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="议题管理文件")
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_issue_library issue_library model_issue_library base.group_user 1 1 1 1
3 access_issue_approval_boss issue_approval_boss model_issue_approval_boss base.group_user 1 1 1 1
4 access_issue_approval_class issue_approval_class model_issue_approval_class base.group_user 1 1 1 1
5 access_issue_approval_party issue_approval_party model_issue_approval_party base.group_user 1 1 1 1
6
@@ -60,16 +60,10 @@
</record>
<record id="issue_approval_boss_action" model="ir.actions.act_window">
<field name="name">党总支议题审批</field>
<field name="name">董事会议题审批</field>
<field name="res_model">issue.approval.boss</field>
<field name="view_mode">tree,form</field>
<!-- <field name="search_view_id" ref="view_issue_approval_filter"/>-->
</record>
<menuitem
id="issue_approval_boss_menu"
parent="issue_approval_menu"
name="董事会议题审批"
action="issue_approval_boss_action"
sequence="30"/>
</odoo>
@@ -60,16 +60,10 @@
</record>
<record id="issue_approval_class_action" model="ir.actions.act_window">
<field name="name">党总支议题审批</field>
<field name="name">领导班子议题审批</field>
<field name="res_model">issue.approval.class</field>
<field name="view_mode">tree,form</field>
<!-- <field name="search_view_id" ref="view_issue_approval_filter"/>-->
</record>
<menuitem
id="issue_approval_class_menu"
parent="issue_approval_menu"
name="领导班子议题审批"
action="issue_approval_class_action"
sequence="20"/>
</odoo>
@@ -66,10 +66,5 @@
<!-- <field name="search_view_id" ref="view_issue_approval_filter"/>-->
</record>
<menuitem
id="issue_approval_party_menu"
parent="issue_approval_menu"
name="党总支议题审批"
action="issue_approval_party_action"
sequence="10"/>
</odoo>
+121 -58
View File
@@ -11,8 +11,11 @@
<field name="name"/>
<field name="code"/>
<field name="is_party"/>
<field name="is_party_pass"/>
<field name="is_class"/>
<field name="is_class_pass"/>
<field name="is_boss"/>
<field name="is_boss_pass"/>
<field name="is_note"/>
<field name="creart_datetime"/>
<field name="statu"/>
@@ -21,6 +24,110 @@
</record>
<record id="view_issue_library_form" model="ir.ui.view">
<field name="name">issue.library.tree</field>
<field name="model">issue.library</field>
<field name="arch" type="xml">
<form string="议题库">
<header>
<button name="issue_cancel" string="取消" type="object" class="oe_highlight"/>
<field name="statu" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" required="1"/>
</h1>
</div>
<group>
<group>
<field name="code"/>
<field name="is_party"/>
<field name="is_party_pass"/>
<field name="is_party_note" invisible="is_party_pass == True"/>
<field name="is_class"/>
<field name="is_class_pass"/>
<field name="is_class_note" invisible="is_class_pass == True"/>
<field name="creart_datetime"/>
</group>
<group>
<field name="is_boss"/>
<field name="is_boss_pass"/>
<field name="is_boss_note" invisible="is_boss_pass == True"/>
<field name="is_note"/>
<field name="room_booking_id"/>
<field name="notice_documents_ids">
<tree>
<field name="name"/>
</tree>
</field>
</group>
</group>
</sheet>
<div class="o_attachment_preview"/>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="view_issue_library_filter" model="ir.ui.view">
<field name="name">issue.library.search</field>
<field name="model">issue.library</field>
<field name="arch" type="xml">
<search string="议题">
<filter string="待上会" name="statu" domain="[('statu', '=', 'will')]"/>
<filter string="已上会" name="statu" domain="[('statu', '=', 'on_meet')]"/>
<group expand="0">
<filter name="group_manager" string="会议状态" domain="[]" context="{'group_by': 'statu'}"/>
</group>
</search>
</field>
</record>
<record id="issue_library_action" model="ir.actions.act_window">
<field name="name">议题库</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_issue_library_filter"/>
</record>
<record id="issue_library_action_will" model="ir.actions.act_window">
<field name="name">待上会</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('statu','=','will')]</field>
</record>
<record id="issue_library_action_done" model="ir.actions.act_window">
<field name="name">已上会</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('statu','=','on_meet')]</field>
</record>
<!-- 其他部门的议题库 无董事长 -->
<record id="view_issue_library_tree2" model="ir.ui.view">
<field name="name">issue.library.tree</field>
<field name="model">issue.library</field>
<field name="arch" type="xml">
<tree string="议题库"
create="false" edit="false" delete="false">
<field name="name"/>
<field name="code"/>
<field name="is_party"/>
<field name="is_class"/>
<field name="is_note"/>
<field name="creart_datetime"/>
<field name="statu"/>
</tree>
</field>
</record>
<record id="view_issue_library_form2" model="ir.ui.view">
<field name="name">issue.library.tree</field>
<field name="model">issue.library</field>
<field name="arch" type="xml">
@@ -65,41 +172,34 @@
</field>
</record>
<record id="view_issue_library_filter" model="ir.ui.view">
<field name="name">issue.library.search</field>
<field name="model">issue.library</field>
<field name="arch" type="xml">
<search string="议题">
<filter string="待上会" name="statu" domain="[('statu', '=', 'will')]"/>
<filter string="已上会" name="statu" domain="[('statu', '=', 'on_meet')]"/>
<group expand="0">
<filter name="group_manager" string="会议状态" domain="[]" context="{'group_by': 'statu'}"/>
</group>
<!-- <searchpanel>-->
<!-- <field name="issue_type_id" string="议题类别" enable_counters="1"/>-->
<!-- </searchpanel>-->
</search>
</field>
</record>
<record id="issue_library_action" model="ir.actions.act_window">
<record id="issue_library_action2" model="ir.actions.act_window">
<field name="name">议题库</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_issue_library_filter"/>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_issue.view_issue_library_tree2')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_issue.view_issue_library_form2')})]"/>
</record>
<record id="issue_library_action2" model="ir.actions.act_window">
<record id="issue_library_action_will2" model="ir.actions.act_window">
<field name="name">待上会</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('statu','=','will')]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_issue.view_issue_library_tree2')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_issue.view_issue_library_form2')})]"/>
</record>
<record id="issue_library_action3" model="ir.actions.act_window">
<record id="issue_library_action_done2" model="ir.actions.act_window">
<field name="name">已上会</field>
<field name="res_model">issue.library</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('statu','=','on_meet')]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('yuthon_issue.view_issue_library_tree2')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_issue.view_issue_library_form2')})]"/>
</record>
<record id="all_meting_issue" model="ir.actions.server">
@@ -109,41 +209,4 @@
<field name="state">code</field>
<field name="code">action = model.all_meeting_issue()</field>
</record>
<menuitem
id="tianhe_issue_library_menu_root"
name="议题管理"
web_icon="yuthon_issue,static/description/icon.png"
sequence="1"/>
<menuitem
id="tianhe_issue_library_menu"
parent="tianhe_issue_library_menu_root"
name="议题库"
sequence="5"/>
<menuitem
id="tianhe_issue_library_menu_all"
parent="tianhe_issue_library_menu"
name="全部"
action="issue_library_action"
sequence="5"/>
<menuitem
id="tianhe_issue_library_menu_will"
parent="tianhe_issue_library_menu"
name="待上会"
action="issue_library_action2"
sequence="8"/>
<menuitem
id="tianhe_issue_library_menu_on_meet"
parent="tianhe_issue_library_menu"
name="已上会"
action="issue_library_action3"
sequence="10"/>
<menuitem
id="issue_approval_menu"
parent="tianhe_issue_library_menu_root"
name="议题审批"
action="issue_library_action"
sequence="10"/>
</odoo>
+6 -6
View File
@@ -17,10 +17,10 @@
<field name="view_mode">tree</field>
</record>
<menuitem
id="tianhe_issue_type_menu"
parent="tianhe_issue_library_menu_root"
name="议题类别管理"
action="issue_type_action"
sequence="5"/>
<!-- <menuitem-->
<!-- id="tianhe_issue_type_menu"-->
<!-- parent="tianhe_issue_library_menu_root"-->
<!-- name="议题类别管理"-->
<!-- action="issue_type_action"-->
<!-- sequence="5"/>-->
</odoo>
+87
View File
@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<menuitem
id="tianhe_issue_library_menu_root"
name="议题管理"
web_icon="yuthon_issue,static/description/icon.png"
sequence="1"/>
<!-- 天河投资议题库管理 -->
<menuitem
id="tianhe_issue_library_menu"
parent="tianhe_issue_library_menu_root"
name="议题库"
sequence="5"/>
<menuitem
id="tianhe_issue_library_all"
parent="tianhe_issue_library_menu"
name="全部"
action="issue_library_action"
sequence="1"/>
<menuitem
id="tianhe_issue_library_menu_will"
parent="tianhe_issue_library_menu"
name="待上会"
action="issue_library_action_will"
sequence="5"/>
<menuitem
id="tianhe_issue_library_menu_on_meet"
parent="tianhe_issue_library_menu"
name="已上会"
action="issue_library_action_done"
sequence="10"/>
<!-- 物管,粮储 议题库管理 -->
<menuitem
id="tianhe_other_issue_library_menu"
parent="tianhe_issue_library_menu_root"
name="子部门议题库"
sequence="8"/>
<menuitem
id="tianhe_issue_library_all2"
parent="tianhe_other_issue_library_menu"
name="全部"
action="issue_library_action2"
sequence="1"/>
<menuitem
id="other_issue_library_menu_will"
parent="tianhe_other_issue_library_menu"
name="待上会"
action="issue_library_action_will2"
sequence="5"/>
<menuitem
id="other_issue_library_menu_on_meet"
parent="tianhe_other_issue_library_menu"
name="已上会"
action="issue_library_action_done2"
sequence="10"/>
<menuitem
id="issue_approval_menu"
parent="tianhe_issue_library_menu_root"
name="议题审批"
action="issue_library_action"
sequence="9"/>
<menuitem
id="issue_approval_party_menu"
parent="issue_approval_menu"
name="党总支议题审批"
action="issue_approval_party_action"
sequence="10"/>
<menuitem
id="issue_approval_class_menu"
parent="issue_approval_menu"
name="领导班子议题审批"
action="issue_approval_class_action"
sequence="20"/>
<menuitem
id="issue_approval_boss_menu"
parent="issue_approval_menu"
name="董事会议题审批"
action="issue_approval_boss_action"
sequence="30"/>
</odoo>
-3
View File
@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import models
-22
View File
@@ -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,
}
-3
View File
@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import yuthon_res_partner
@@ -1,4 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
@@ -1 +0,0 @@
<svg width="50" height="50" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg"><path d="M28 16c0 5.523-4.477 10-10 10S8 21.523 8 16 12.477 6 18 6s10 4.477 10 10Z" fill="#1AD3BB"/><path d="M43 24a5 5 0 1 1-10 0 5 5 0 0 1 10 0Zm-27 7h26a4 4 0 0 1 4 4v5a4 4 0 0 1-4 4H16V31Z" fill="#005E7A"/><path d="M4 31h16c7.18 0 13 5.82 13 13H17C9.82 44 4 38.18 4 31Z" fill="#1AD3BB"/><path d="M23.549 12.128 22.425 11l-5.532 5.556-3.319-3.335-1.123 1.129a1.552 1.552 0 0 0 0 2.188L16.892 21l6.657-6.685a1.55 1.55 0 0 0 0-2.187Z" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 539 B

+3 -1
View File
@@ -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',
+1
View File
@@ -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
+1 -1
View File
@@ -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)