@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
from . import controllers
|
||||
@@ -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
|
||||
@@ -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 &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="主修课程")
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)]
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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 +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 |
@@ -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,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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user