mirror of
https://github.com/guohuadeng/app-odoo.git
synced 2025-02-23 04:11:36 +02:00
opt m2o
This commit is contained in:
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': "App base chinese,中国化基本模块增强",
|
'name': "App base chinese,中国化基本模块增强",
|
||||||
'version': '14.20.10.05',
|
'version': '14.21.03.22',
|
||||||
'author': 'Sunpop.cn',
|
'author': 'Sunpop.cn',
|
||||||
'category': 'Base',
|
'category': 'Base',
|
||||||
'website': 'https://www.sunpop.cn',
|
'website': 'https://www.sunpop.cn',
|
||||||
|
|||||||
8
app_base_chinese/data/crm_team_data.xml
Normal file
8
app_base_chinese/data/crm_team_data.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<!--<record id="sales_team.team_sales_department" model="crm.team">-->
|
||||||
|
<!--<field name="name">Sales</field>-->
|
||||||
|
<!--</record>-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<!--设置默认时区为中国,注意select 类型要加 ""-->
|
<!--设置默认时区为中国,注意select 类型要加 ""-->
|
||||||
<record id="res_partner_tz_default" model="ir.default">
|
<record id="res_partner_tz_default" model="ir.default">
|
||||||
<field name="field_id" eval="ref('base.field_res_partner__tz')"/>
|
<field name="field_id" eval="ref('base.field_res_partner__tz')"/>
|
||||||
<field name="json_value">"Asia/Shanghai"</field>
|
<field name="json_value">"Etc/GMT-8"</field>
|
||||||
</record>
|
</record>
|
||||||
<!--设置用户email在odoo内提醒-->
|
<!--设置用户email在odoo内提醒-->
|
||||||
<record id="res_user_notify_email_default" model="ir.default">
|
<record id="res_user_notify_email_default" model="ir.default">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data noupdate="1">
|
<data noupdate="0">
|
||||||
<!-- 时间格式 -->
|
<!-- 时间格式 -->
|
||||||
<record id="base.lang_zh_CN" model="res.lang">
|
<record id="base.lang_zh_CN" model="res.lang">
|
||||||
<field name="date_format">%Y-%m-%d</field>
|
<field name="date_format">%Y-%m-%d</field>
|
||||||
|
|||||||
@@ -33,18 +33,18 @@ def post_init_hook(cr, registry):
|
|||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
ids = env['product.category'].sudo().with_context(lang='zh_CN').search([
|
ids = env['product.category'].sudo().with_context(lang='zh_CN').search([
|
||||||
('parent_id', '!=', False)
|
('parent_id', '!=', False)
|
||||||
], order='complete_name')
|
], order='parent_path')
|
||||||
for rec in ids:
|
for rec in ids:
|
||||||
rec._compute_complete_name()
|
rec._compute_complete_name()
|
||||||
ids = env['stock.location'].sudo().with_context(lang='zh_CN').search([
|
ids = env['stock.location'].sudo().with_context(lang='zh_CN').search([
|
||||||
('location_id', '!=', False),
|
('location_id', '!=', False),
|
||||||
('usage', '!=', 'views'),
|
('usage', '!=', 'views'),
|
||||||
], order='complete_name')
|
], order='parent_path')
|
||||||
for rec in ids:
|
for rec in ids:
|
||||||
rec._compute_complete_name()
|
rec._compute_complete_name()
|
||||||
# 超级用户改时区为中国
|
# 超级用户改时区为中国
|
||||||
ids = env['res.users'].sudo().with_context(lang='zh_CN').browse([1, 2])
|
ids = env['res.users'].sudo().with_context(lang='zh_CN').browse([1, 2])
|
||||||
ids.write({'tz': "Asia/Shanghai"})
|
ids.write({'tz': "Etc/GMT-8"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise Warning(e)
|
raise Warning(e)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from . import res_partner
|
from . import res_partner
|
||||||
from . import res_company
|
|
||||||
from . import res_currency
|
from . import res_currency
|
||||||
from . import res_country
|
|
||||||
from . import product_category
|
from . import product_category
|
||||||
from . import stock_location
|
from . import stock_location
|
||||||
from . import account_tax_group
|
from . import account_tax_group
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class ResCurrency(models.Model):
|
|||||||
:return 返回值是对应阿拉伯数字的绝对值的中文数字
|
:return 返回值是对应阿拉伯数字的绝对值的中文数字
|
||||||
"""
|
"""
|
||||||
if self.name != 'CNY':
|
if self.name != 'CNY':
|
||||||
return;
|
return
|
||||||
rmbmap = [u"零", u"壹", u"贰", u"叁", u"肆", u"伍", u"陆", u"柒", u"捌", u"玖"]
|
rmbmap = [u"零", u"壹", u"贰", u"叁", u"肆", u"伍", u"陆", u"柒", u"捌", u"玖"]
|
||||||
unit = [u"分", u"角", u"元", u"拾", u"佰", u"仟", u"万", u"拾", u"佰", u"仟", u"亿",
|
unit = [u"分", u"角", u"元", u"拾", u"佰", u"仟", u"万", u"拾", u"佰", u"仟", u"亿",
|
||||||
u"拾", u"佰", u"仟", u"万", u"拾", u"佰", u"仟", u"兆"]
|
u"拾", u"佰", u"仟", u"万", u"拾", u"佰", u"仟", u"兆"]
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': "Sunpop Odooapp Common Function",
|
'name': "Sunpop Odooapp Common Func",
|
||||||
'version': '14.20.10.05',
|
'version': '14.21.01.27',
|
||||||
'author': 'Sunpop.cn',
|
'author': 'Sunpop.cn',
|
||||||
'category': 'Base',
|
'category': 'Base',
|
||||||
'website': 'https://www.sunpop.cn',
|
'website': 'https://www.sunpop.cn',
|
||||||
@@ -43,20 +43,20 @@
|
|||||||
'currency': 'EUR',
|
'currency': 'EUR',
|
||||||
'images': ['static/description/banner.png'],
|
'images': ['static/description/banner.png'],
|
||||||
'depends': [
|
'depends': [
|
||||||
|
'base',
|
||||||
'web',
|
'web',
|
||||||
],
|
],
|
||||||
'summary': '''
|
'summary': '''
|
||||||
Core for common use.
|
Core for common use sunpop apps.
|
||||||
Add get m2o default method
|
基础核心,必须没有要被依赖字段及视图等,实现auto_install
|
||||||
基础核心
|
|
||||||
''',
|
''',
|
||||||
'description': '''
|
'description': '''
|
||||||
Support Odoo 14,13,12, Enterprise and Community Edition
|
Support Odoo 13,12, Enterprise and Community Edition
|
||||||
1. Easy get default 1st record of m2o list.
|
1.
|
||||||
2.
|
2.
|
||||||
3. Multi-language Support.
|
3. Multi-language Support.
|
||||||
4. Multi-Company Support.
|
4. Multi-Company Support.
|
||||||
5. Support Odoo 14,13,12, Enterprise and Community Edition
|
5. Support Odoo 13,12, Enterprise and Community Edition
|
||||||
==========
|
==========
|
||||||
1.
|
1.
|
||||||
2.
|
2.
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
# 'security/*.xml',
|
# 'security/*.xml',
|
||||||
# 'security/ir.model.access.csv',
|
# 'security/ir.model.access.csv',
|
||||||
# 'data/.xml',
|
# 'data/.xml',
|
||||||
# 'views/.xml',
|
# 'views/ir_module_module_views.xml',
|
||||||
# 'report/.xml',
|
# 'report/.xml',
|
||||||
],
|
],
|
||||||
'qweb': [
|
'qweb': [
|
||||||
@@ -80,5 +80,5 @@
|
|||||||
# 'uninstall_hook': 'uninstall_hook',
|
# 'uninstall_hook': 'uninstall_hook',
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'application': True,
|
'application': True,
|
||||||
'auto_install': False,
|
'auto_install': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,3 +23,7 @@
|
|||||||
# description:
|
# description:
|
||||||
|
|
||||||
from . import base
|
from . import base
|
||||||
|
# from . import fields
|
||||||
|
# from . import validator
|
||||||
|
# from . import ir_ui_view
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
|
|
||||||
|
from datetime import date, datetime, time
|
||||||
|
import pytz
|
||||||
|
|
||||||
class Base(models.AbstractModel):
|
class Base(models.AbstractModel):
|
||||||
_inherit = 'base'
|
_inherit = 'base'
|
||||||
@@ -14,3 +17,29 @@ class Base(models.AbstractModel):
|
|||||||
rec = self.env[self._fields[fieldname].comodel_name].search(domain, limit=1)
|
rec = self.env[self._fields[fieldname].comodel_name].search(domain, limit=1)
|
||||||
return rec.id if rec else False
|
return rec.id if rec else False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _app_dt2local(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT):
|
||||||
|
"""
|
||||||
|
将value中时间,按格式转为用户本地时间
|
||||||
|
"""
|
||||||
|
if not value:
|
||||||
|
return value
|
||||||
|
if isinstance(value, datetime):
|
||||||
|
value = value.strftime(return_format)
|
||||||
|
dt = datetime.strptime(value, return_format)
|
||||||
|
pytz_timezone = pytz.timezone(self.env.user.tz or 'Etc/GMT-8')
|
||||||
|
dt = dt.replace(tzinfo=pytz.timezone('UTC'))
|
||||||
|
return dt.astimezone(pytz_timezone).strftime(return_format)
|
||||||
|
|
||||||
|
def _app_dt2utc(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT):
|
||||||
|
"""
|
||||||
|
将value中用户本地时间,按格式转为UTC时间,输出 str
|
||||||
|
"""
|
||||||
|
if not value:
|
||||||
|
return value
|
||||||
|
if isinstance(value, datetime):
|
||||||
|
value = value.strftime(return_format)
|
||||||
|
dt = datetime.strptime(value, return_format)
|
||||||
|
user_tz = pytz.timezone(self.env.user.tz or 'Etc/GMT+8')
|
||||||
|
dt = dt.replace(tzinfo=pytz.timezone('UTC'))
|
||||||
|
return dt.astimezone(user_tz).strftime(return_format)
|
||||||
|
|||||||
49
app_common/models/fields.py
Normal file
49
app_common/models/fields.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo.fields import Field, resolve_mro
|
||||||
|
from odoo.fields import Selection as oldSelection
|
||||||
|
from odoo.tools import merge_sequences
|
||||||
|
import logging
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# 此处用猴子补丁,热更新,不影响后续继承
|
||||||
|
class Selection(Field):
|
||||||
|
def _setup_attrs_app(self, model, name):
|
||||||
|
Field._setup_attrs(self, model, name)
|
||||||
|
|
||||||
|
# determine selection (applying 'selection_add' extensions)
|
||||||
|
values = None
|
||||||
|
labels = {}
|
||||||
|
|
||||||
|
for field in reversed(resolve_mro(model, name, self._can_setup_from)):
|
||||||
|
# We cannot use field.selection or field.selection_add here
|
||||||
|
# because those attributes are overridden by ``_setup_attrs``.
|
||||||
|
if 'selection' in field.args:
|
||||||
|
selection = field.args['selection']
|
||||||
|
if isinstance(selection, list):
|
||||||
|
if (
|
||||||
|
values is not None
|
||||||
|
and values != [kv[0] for kv in selection]
|
||||||
|
):
|
||||||
|
_logger.debug("%s: selection=%r overrides existing selection; use selection_add instead", self, selection)
|
||||||
|
values = [kv[0] for kv in selection]
|
||||||
|
labels = dict(selection)
|
||||||
|
else:
|
||||||
|
self.selection = selection
|
||||||
|
values = None
|
||||||
|
labels = {}
|
||||||
|
|
||||||
|
if 'selection_add' in field.args:
|
||||||
|
selection_add = field.args['selection_add']
|
||||||
|
assert isinstance(selection_add, list), \
|
||||||
|
"%s: selection_add=%r must be a list" % (self, selection_add)
|
||||||
|
assert values is not None, \
|
||||||
|
"%s: selection_add=%r on non-list selection %r" % (self, selection_add, self.selection)
|
||||||
|
values = merge_sequences(values, [kv[0] for kv in selection_add])
|
||||||
|
labels.update(kv for kv in selection_add if len(kv) == 2)
|
||||||
|
|
||||||
|
if values is not None:
|
||||||
|
self.selection = [(value, labels[value]) for value in values]
|
||||||
|
|
||||||
|
oldSelection._setup_attrs = Selection._setup_attrs_app
|
||||||
66
app_common/models/ir_ui_view.py
Normal file
66
app_common/models/ir_ui_view.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, models, tools, SUPERUSER_ID
|
||||||
|
from odoo.modules.module import get_resource_path
|
||||||
|
from odoo.tools import view_validation
|
||||||
|
from odoo.tools.view_validation import _relaxng_cache, validate, _validators
|
||||||
|
from odoo.tools.safe_eval import safe_eval
|
||||||
|
|
||||||
|
from lxml import etree
|
||||||
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@validate('tree')
|
||||||
|
def app_valid_field_in_tree(arch, **kwargs):
|
||||||
|
# 增加 header
|
||||||
|
return all(
|
||||||
|
child.tag in ('field', 'button', 'control', 'groupby', 'header')
|
||||||
|
for child in arch.xpath('/tree/*')
|
||||||
|
)
|
||||||
|
|
||||||
|
def app_relaxng(view_type):
|
||||||
|
""" Return a validator for the given view type, or None. """
|
||||||
|
if view_type not in _relaxng_cache:
|
||||||
|
# tree, search 特殊
|
||||||
|
if view_type in ['tree', 'search']:
|
||||||
|
_file = get_resource_path('app_common', 'rng', '%s_view.rng' % view_type)
|
||||||
|
else:
|
||||||
|
_file = get_resource_path('base', 'rng', '%s_view.rng' % view_type)
|
||||||
|
with tools.file_open(_file) as frng:
|
||||||
|
try:
|
||||||
|
relaxng_doc = etree.parse(frng)
|
||||||
|
_relaxng_cache[view_type] = etree.RelaxNG(relaxng_doc)
|
||||||
|
except Exception:
|
||||||
|
_logger.exception('Failed to load RelaxNG XML schema for views validation')
|
||||||
|
_relaxng_cache[view_type] = None
|
||||||
|
return _relaxng_cache[view_type]
|
||||||
|
|
||||||
|
def app_reset_valid_view(view_type):
|
||||||
|
_relaxng_cache = view_validation._relaxng_cache
|
||||||
|
for pred in _validators[view_type]:
|
||||||
|
# 要pop掉函数 valid_field_in_tree
|
||||||
|
if pred.__name__ == 'valid_field_in_tree':
|
||||||
|
_validators[view_type].remove(pred)
|
||||||
|
try:
|
||||||
|
_relaxng_cache.pop(view_type, None)
|
||||||
|
_relaxng_cache[view_type] = None
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
_relaxng_cache[view_type] = app_relaxng(view_type)
|
||||||
|
|
||||||
|
app_reset_valid_view('tree')
|
||||||
|
view_validation.valid_field_in_tree = app_valid_field_in_tree
|
||||||
|
view_validation.relaxng = app_relaxng
|
||||||
|
|
||||||
|
class View(models.Model):
|
||||||
|
_inherit = 'ir.ui.view'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(View, self).__init__(*args, **kwargs)
|
||||||
|
view_validation.relaxng = app_relaxng
|
||||||
|
# 重置 tree
|
||||||
|
app_reset_valid_view('tree')
|
||||||
|
|
||||||
|
# todo: 有可能需要处理增加的 header等标签
|
||||||
|
# 直接重写原生方法
|
||||||
|
# def transfer_node_to_modifiers(node, modifiers, context=None, in_tree_view=False):
|
||||||
78
app_common/models/validator_old.py
Normal file
78
app_common/models/validator_old.py
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import tools, _
|
||||||
|
from odoo.modules.module import get_resource_path
|
||||||
|
from odoo.tools import view_validation
|
||||||
|
from odoo.tools.view_validation import validate, _validators
|
||||||
|
from lxml import etree
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
_relaxng_cache = view_validation._relaxng_cache
|
||||||
|
_relaxng_cache['tree'] = None
|
||||||
|
with tools.file_open(get_resource_path('app_common', 'rng', 'tree_view.rng')) as frng:
|
||||||
|
try:
|
||||||
|
text = frng.read()
|
||||||
|
# with tools.file_open('addons/base/rng/common.rng') as common_rng:
|
||||||
|
# common_txt = common_rng.read()
|
||||||
|
# start_pos = common_txt.find('<rng:grammar')
|
||||||
|
# start_pos = common_txt.find('>', start_pos)
|
||||||
|
# end_pos = common_txt.find('</rng:grammar>')
|
||||||
|
# common_content = common_txt[start_pos + 1: end_pos]
|
||||||
|
#
|
||||||
|
# # 从14中学习,最新 common
|
||||||
|
# # <rng:optional><rng:attribute name="kanban_view_ref" />
|
||||||
|
# old_content = '''
|
||||||
|
# <rng:optional><rng:attribute name="kanban_view_ref" /></rng:optional>
|
||||||
|
# '''
|
||||||
|
# new_content = '''
|
||||||
|
# <rng:optional><rng:attribute name="hierarchize"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="expand"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="enable_counters"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="limit"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-bf"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-it"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-danger"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-info"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-muted"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-primary"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-success"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="decoration-warning"/></rng:optional>
|
||||||
|
# <rng:optional><rng:attribute name="kanban_view_ref" /></rng:optional>
|
||||||
|
# '''
|
||||||
|
# common_content = common_content.replace(old_content, new_content)
|
||||||
|
# # common 替代
|
||||||
|
# text = text.replace('<rng:include href=\"common.rng\"/>', common_content)
|
||||||
|
# # tree 替代
|
||||||
|
# old_content = '''<rng:ref name="control"/>'''
|
||||||
|
# new_content = '''<rng:element name="header">
|
||||||
|
# <rng:zeroOrMore>
|
||||||
|
# <rng:ref name="button"/>
|
||||||
|
# </rng:zeroOrMore>
|
||||||
|
# </rng:element>
|
||||||
|
# <rng:ref name="control"/>'''
|
||||||
|
# text = text.replace(old_content, new_content)
|
||||||
|
# # 增加 fx_tree_table 支持
|
||||||
|
# text = text.replace('<rng:optional><rng:attribute name=\"js_class\"/></rng:optional>',
|
||||||
|
# '<rng:optional><rng:attribute name=\"js_class\"/></rng:optional><rng:optional><rng:attribute name=\"options\"/></rng:optional>')
|
||||||
|
|
||||||
|
tmp_doc = etree.fromstring(text.encode('utf-8'))
|
||||||
|
_relaxng_cache['tree'] = etree.RelaxNG(tmp_doc)
|
||||||
|
_logger.warning('=========new tree done: %s' % _relaxng_cache['tree'])
|
||||||
|
except Exception as error:
|
||||||
|
_logger.exception('Failed to load RelaxNG XML schema for views validation, {error}'.format(
|
||||||
|
error=error))
|
||||||
|
_relaxng_cache['tree'] = None
|
||||||
|
|
||||||
|
|
||||||
|
@validate('tree')
|
||||||
|
def app_valid_field_in_tree(arch, **kwargs):
|
||||||
|
# 增加 header
|
||||||
|
return all(
|
||||||
|
child.tag in ('field', 'button', 'control', 'groupby', 'header')
|
||||||
|
for child in arch.xpath('/tree/*')
|
||||||
|
)
|
||||||
|
|
||||||
|
view_validation.valid_field_in_tree = app_valid_field_in_tree
|
||||||
29
app_common/rng/activity_view.rng
Normal file
29
app_common/rng/activity_view.rng
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
|
||||||
|
<include href="common.rng"/>
|
||||||
|
|
||||||
|
<define name="activity">
|
||||||
|
<element name="activity">
|
||||||
|
<attribute name="string"/>
|
||||||
|
<optional><attribute name="create"/></optional>
|
||||||
|
<interleave>
|
||||||
|
<zeroOrMore><ref name="field"/></zeroOrMore>
|
||||||
|
<optional>
|
||||||
|
<element name="templates">
|
||||||
|
<oneOrMore>
|
||||||
|
<ref name="any"/>
|
||||||
|
</oneOrMore>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
</interleave>
|
||||||
|
</element>
|
||||||
|
</define>
|
||||||
|
|
||||||
|
<start>
|
||||||
|
<ref name="activity"/>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
</grammar>
|
||||||
48
app_common/rng/calendar_view.rng
Normal file
48
app_common/rng/calendar_view.rng
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
<rng:define name="calendar">
|
||||||
|
<rng:element name="calendar">
|
||||||
|
<rng:optional><rng:attribute name="string" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="date_start" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="date_stop" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="date_delay" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="all_day" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="form_view_id" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="event_limit" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="quick_add" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="color" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="event_open_popup" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="show_unusual_days" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="js_class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="hide_time"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="hide_date"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="create"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="delete"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="scales"/></rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="mode">
|
||||||
|
<rng:choice>
|
||||||
|
<rng:value>year</rng:value>
|
||||||
|
<rng:value>month</rng:value>
|
||||||
|
<rng:value>week</rng:value>
|
||||||
|
<rng:value>day</rng:value>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="calendar" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
438
app_common/rng/common.rng
Normal file
438
app_common/rng/common.rng
Normal file
@@ -0,0 +1,438 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
|
||||||
|
<rng:define name="overload">
|
||||||
|
<rng:optional>
|
||||||
|
<!--
|
||||||
|
Alter matched element with content
|
||||||
|
-->
|
||||||
|
<rng:choice>
|
||||||
|
<rng:attribute name="position">
|
||||||
|
<rng:choice>
|
||||||
|
<!-- Insert content before first child -->
|
||||||
|
<rng:value>before</rng:value>
|
||||||
|
<!-- Insert content after last child -->
|
||||||
|
<rng:value>after</rng:value>
|
||||||
|
<!-- Replace all children with content -->
|
||||||
|
<rng:value>inside</rng:value>
|
||||||
|
<!-- Replace matched element itself with content -->
|
||||||
|
<rng:value>replace</rng:value>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:attribute>
|
||||||
|
<rng:group>
|
||||||
|
<rng:attribute name="position">
|
||||||
|
<!-- Edit element attributes -->
|
||||||
|
<rng:value>attributes</rng:value>
|
||||||
|
</rng:attribute>
|
||||||
|
<rng:oneOrMore>
|
||||||
|
<rng:element name="attribute">
|
||||||
|
<rng:attribute name="name"><rng:text/></rng:attribute>
|
||||||
|
<rng:text />
|
||||||
|
</rng:element>
|
||||||
|
</rng:oneOrMore>
|
||||||
|
</rng:group>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:optional>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="modifiable">
|
||||||
|
<rng:optional>
|
||||||
|
<!-- @modifiers contains a JSON map unifying the various
|
||||||
|
modifier attributes: @readonly, @required, @invisible.
|
||||||
|
Each attribute is a key, mapped to a JSON list representing
|
||||||
|
a condition expressed as an OpenERP `domain` filter
|
||||||
|
Only some of the modifier keys make sense on some
|
||||||
|
elements, for example <filter> and <group> only support
|
||||||
|
`invisible`. -->
|
||||||
|
<rng:attribute name="modifiers"/>
|
||||||
|
</rng:optional>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="access_rights">
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="groups"/>
|
||||||
|
</rng:optional>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="container">
|
||||||
|
<rng:optional><rng:attribute name="col"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="label" />
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="image"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="image">
|
||||||
|
<rng:element name="image">
|
||||||
|
<rng:attribute name="name"/>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="html">
|
||||||
|
<rng:element name="html">
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:text/>
|
||||||
|
<rng:ref name="any"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="label">
|
||||||
|
<rng:element name="label">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="align"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="angle"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="fill"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="help"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="width"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="wrap"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="name"/></rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<!-- @for: allows to explicitely link a label to a field -->
|
||||||
|
<rng:attribute name="for"/>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:text/>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="label" />
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="image"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="any">
|
||||||
|
<rng:element>
|
||||||
|
<rng:anyName/>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:attribute>
|
||||||
|
<rng:anyName/>
|
||||||
|
</rng:attribute>
|
||||||
|
<rng:text/>
|
||||||
|
<rng:ref name="any"/>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="separator">
|
||||||
|
<rng:element name="separator">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="name"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="rowspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="col"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="select"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="orientation"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="label" />
|
||||||
|
<rng:ref name="group" />
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="xpath">
|
||||||
|
<rng:element name="xpath">
|
||||||
|
<rng:optional><rng:attribute name="expr"/></rng:optional>
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="any"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="data">
|
||||||
|
<rng:element name="data">
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="label"/>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="xpath"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="field">
|
||||||
|
<rng:element name="field">
|
||||||
|
<rng:attribute name="name" />
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="domain_filter"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="attrs"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="completion"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="width"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="type"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="ref"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="eval"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="search"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="model"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="use"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="on_change"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="domain"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="filter_domain"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="password"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="comparator"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="sum"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="bold"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="avg"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="select"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="hierarchize"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="expand"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="group"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="color"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="groupby"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="disable_counters"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="enable_counters"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="limit"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="operator"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="nolabel"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="required"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="readonly"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="view_mode"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="widget"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="context"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="states"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="digits"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="icon"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="mode"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="size"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="filename"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="height"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="rowspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="align"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="selection"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="default_focus"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="filters"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="statusbar_visible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="can_create" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="can_write" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="interval" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="avatar_field" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="write_model" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="write_field" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="text" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="optional" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-bf"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-it"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-danger"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-info"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-muted"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-primary"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-success"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-warning"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="kanban_view_ref" /></rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="force_save">
|
||||||
|
<rng:choice>
|
||||||
|
<rng:value>1</rng:value>
|
||||||
|
<rng:value>0</rng:value>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<!-- Widget *static* options defined as an arbitrary JSON dict, with
|
||||||
|
widget-dependent parameters. To be ignored if widget/client does
|
||||||
|
not support them. -->
|
||||||
|
<rng:optional><rng:attribute name="options"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="placeholder"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="data"/>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="label"/>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="xpath"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="group">
|
||||||
|
<rng:element name="group">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="attrs"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="rowspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="expand"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="states"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="fill"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="height"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="width"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="name"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="color" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
<rng:ref name="container"/>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="button">
|
||||||
|
<rng:element name="button">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="attrs"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="name" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="icon" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="states" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="type" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="special" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="align" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="target"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="readonly"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="context"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="confirm"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="help"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="default_focus"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="tabindex"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="title"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="aria-label"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="aria-pressed"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
<rng:ref name="xpath" />
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="filter">
|
||||||
|
<rng:element name="filter">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:attribute name="name"/>
|
||||||
|
<rng:optional><rng:attribute name="attrs"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="icon"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="separator" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="type" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="align" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="colspan"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="readonly"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="context"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="help"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="domain"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="date"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="default_period"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
<rng:ref name="xpath" />
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="create">
|
||||||
|
<rng:element name="create">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:ref name="access_rights"/>
|
||||||
|
<rng:attribute name="string"/>
|
||||||
|
<rng:attribute name="context"/>
|
||||||
|
<rng:ref name="modifiable"/>
|
||||||
|
<rng:optional><rng:attribute name="attrs"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="invisible"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="special" /></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="help"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="title"/></rng:optional>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="control">
|
||||||
|
<rng:element name="control">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:oneOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="create"/>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:oneOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
</rng:grammar>
|
||||||
39
app_common/rng/graph_view.rng
Normal file
39
app_common/rng/graph_view.rng
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
<rng:define name="graph">
|
||||||
|
<rng:element name="graph">
|
||||||
|
<rng:optional><rng:attribute name="string" /></rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="type">
|
||||||
|
<rng:choice>
|
||||||
|
<rng:value>bar</rng:value>
|
||||||
|
<rng:value>pie</rng:value>
|
||||||
|
<rng:value>line</rng:value>
|
||||||
|
<rng:value>pivot</rng:value>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="js_class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="stacked"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="order"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="orientation"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="interval"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="disable_linking"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="sample"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="graph" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
28
app_common/rng/pivot_view.rng
Normal file
28
app_common/rng/pivot_view.rng
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
<rng:define name="pivot">
|
||||||
|
<rng:element name="pivot">
|
||||||
|
<rng:optional><rng:attribute name="sample"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="stacked"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="display_quantity"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="disable_linking"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="js_class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="default_order"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="pivot" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
57
app_common/rng/search_view.rng
Normal file
57
app_common/rng/search_view.rng
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
|
||||||
|
<rng:define name="searchpanel">
|
||||||
|
<rng:element name="searchpanel">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="view_types"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="options"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="superbar">
|
||||||
|
<rng:element name="superbar">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="view_types"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="options"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="search">
|
||||||
|
<rng:element name="search">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
<rng:optional><rng:attribute name="options"/></rng:optional>
|
||||||
|
<rng:ref name="searchpanel"/>
|
||||||
|
<rng:ref name="superbar"/>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="search" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
54
app_common/rng/search_view_new.rng
Normal file
54
app_common/rng/search_view_new.rng
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
|
||||||
|
<rng:define name="searchpanel">
|
||||||
|
<rng:element name="searchpanel">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="view_types"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="superbar">
|
||||||
|
<rng:element name="superbar">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="view_types"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field" />
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="search">
|
||||||
|
<rng:element name="search">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="group"/>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
<rng:ref name="searchpanel"/>
|
||||||
|
<rng:ref name="superbar"/>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="search" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
94
app_common/rng/tree_view.rng
Normal file
94
app_common/rng/tree_view.rng
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
|
||||||
|
xmlns:a="http://relaxng.org/ns/annotation/1.0"
|
||||||
|
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
<!-- Handling of element overloading when inheriting from a base
|
||||||
|
template
|
||||||
|
-->
|
||||||
|
<rng:include href="common.rng"/>
|
||||||
|
|
||||||
|
<rng:define name="groupby">
|
||||||
|
<rng:element name="groupby">
|
||||||
|
<rng:attribute name="name"/>
|
||||||
|
<rng:optional><rng:attribute name="expand"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
|
||||||
|
<rng:define name="tree">
|
||||||
|
<rng:element name="tree">
|
||||||
|
<rng:ref name="overload"/>
|
||||||
|
<rng:optional><rng:attribute name="name"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="create"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="delete"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="edit"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="multi_edit"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="export_xlsx"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="duplicate"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="import"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="string"/></rng:optional> <!-- deprecated, has no effect anymore -->
|
||||||
|
<rng:optional><rng:attribute name="class"/></rng:optional>
|
||||||
|
<!-- Allows to take a custom View widget for handling -->
|
||||||
|
<rng:optional><rng:attribute name="js_class"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="options"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="default_order"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-bf"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-it"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-danger"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-info"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-muted"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-primary"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-success"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="decoration-warning"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="banner_route"/></rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="sample"/></rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="limit">
|
||||||
|
<rng:data type="int"/>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="groups_limit">
|
||||||
|
<rng:data type="int"/>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:optional>
|
||||||
|
<rng:attribute name="editable">
|
||||||
|
<rng:choice>
|
||||||
|
<rng:value>top</rng:value>
|
||||||
|
<rng:value>bottom</rng:value>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:attribute>
|
||||||
|
</rng:optional>
|
||||||
|
<rng:optional><rng:attribute name="expand"/></rng:optional>
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:element name="header">
|
||||||
|
<rng:zeroOrMore>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
<rng:ref name="control"/>
|
||||||
|
<rng:ref name="field"/>
|
||||||
|
<rng:ref name="separator"/>
|
||||||
|
<rng:ref name="tree"/>
|
||||||
|
<rng:ref name="groupby"/>
|
||||||
|
<rng:ref name="button"/>
|
||||||
|
<rng:ref name="filter"/>
|
||||||
|
<rng:ref name="html"/>
|
||||||
|
<rng:element name="newline"><rng:empty/></rng:element>
|
||||||
|
</rng:choice>
|
||||||
|
</rng:zeroOrMore>
|
||||||
|
</rng:element>
|
||||||
|
</rng:define>
|
||||||
|
<rng:start>
|
||||||
|
<rng:choice>
|
||||||
|
<rng:ref name="tree" />
|
||||||
|
</rng:choice>
|
||||||
|
</rng:start>
|
||||||
|
</rng:grammar>
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
<section class="oe_container">
|
<section class="oe_container">
|
||||||
<div class="oe_row oe_spaced" >
|
<div class="oe_row oe_spaced" >
|
||||||
<div class="oe_span12">
|
<div class="oe_span12">
|
||||||
<h2 class="oe_slogan"> Sunpop Odooapp Common Function </h2>
|
<h2 class="oe_slogan"> </h2>
|
||||||
<h3 class="oe_slogan"> </h3>
|
<h3 class="oe_slogan"> </h3>
|
||||||
<div class="oe_row">
|
<div class="oe_row">
|
||||||
<h3>Lastest update: v14.20.10.05</h3>
|
<h3>Lastest update: v13.20.01.01</h3>
|
||||||
<div class="oe_span12">
|
<div class="oe_span12">
|
||||||
<img class="oe_demo oe_screenshot" style="max-height: 100%;" src="banner.png">
|
<img class="oe_demo oe_screenshot" style="max-height: 100%;" src="banner.png">
|
||||||
</div>
|
</div>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled">
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-check-square-o text-primary"></i>
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
Easy get default 1st record of m2o list.
|
Put key function here.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-check-square-o text-primary"></i>
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-check-square-o text-primary"></i>
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
5. Support Odoo 14,13,12, 11, Enterprise and Community Edition.
|
5. Support Odoo 13,12, 11, Enterprise and Community Edition.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError, ValidationError
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -337,6 +338,7 @@ class ResConfigSettings(models.TransientModel):
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
def remove_account_chart(self):
|
def remove_account_chart(self):
|
||||||
|
# todo: 安装会计模块后,会有问题,后续处理
|
||||||
company_id = self.env.company.id
|
company_id = self.env.company.id
|
||||||
self = self.with_context(force_company=company_id, company_id=company_id)
|
self = self.with_context(force_company=company_id, company_id=company_id)
|
||||||
to_removes = [
|
to_removes = [
|
||||||
|
|||||||
Reference in New Issue
Block a user