diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 000000000..277f2a902 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,15 @@ +[report] +include = + */OCA/server-tools/* + +omit = + */tests/* + *__init__.py + +# Regexes for lines to exclude from consideration +exclude_lines = + # Have to re-enable the standard pragma + pragma: no cover + + # Don't complain about null context checking + if context is None: diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..32f023adc --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: python +python: + - "2.7" + +virtualenv: + system_site_packages: true + +install: + - git clone https://github.com/yvaucher/maintainer-quality-tools.git $HOME/maintainer-quality-tools + - export PATH=$HOME/maintainer-quality-tools/travis:$PATH + - travis_install_nightly 7.0 + - pip install coveralls flake8 + - pip install python-ldap + - printf '[options]\n\nrunning_env = dev' > /tmp/odoo.cfg + +script: + - travis_run_flake8 + - travis_run_tests 7.0 /tmp/odoo.cfg + +after_success: + coveralls diff --git a/README.md b/README.md new file mode 100644 index 000000000..140ba36b6 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +[![Build Status](https://travis-ci.org/OCA/server-tools.svg?branch=7.0)](https://travis-ci.org/OCA/server-tools) +[![Coverage Status](https://coveralls.io/repos/OCA/server-tools/badge.png?branch=7.0)](https://coveralls.io/r/OCA/server-tools?branch=7.0) + +Server Environment And Tools +============================ + +This project aim to deal with modules related to manage OpenERP server environment and provide useful tools. You'll find modules that: + + - Manage configuration depending on environment (devs, test, prod,..) + - Keep the security on update + - Manage email settings + -... diff --git a/ir_config_parameter_viewer/__init__.py b/__unported__/ir_config_parameter_viewer/__init__.py similarity index 100% rename from ir_config_parameter_viewer/__init__.py rename to __unported__/ir_config_parameter_viewer/__init__.py diff --git a/ir_config_parameter_viewer/__openerp__.py b/__unported__/ir_config_parameter_viewer/__openerp__.py similarity index 100% rename from ir_config_parameter_viewer/__openerp__.py rename to __unported__/ir_config_parameter_viewer/__openerp__.py diff --git a/ir_config_parameter_viewer/i18n/ir_config_parameter_viewer.pot b/__unported__/ir_config_parameter_viewer/i18n/ir_config_parameter_viewer.pot similarity index 100% rename from ir_config_parameter_viewer/i18n/ir_config_parameter_viewer.pot rename to __unported__/ir_config_parameter_viewer/i18n/ir_config_parameter_viewer.pot diff --git a/ir_config_parameter_viewer/ir_config_parameter_view.xml b/__unported__/ir_config_parameter_viewer/ir_config_parameter_view.xml similarity index 100% rename from ir_config_parameter_viewer/ir_config_parameter_view.xml rename to __unported__/ir_config_parameter_viewer/ir_config_parameter_view.xml diff --git a/security_protector/__init__.py b/__unported__/security_protector/__init__.py similarity index 100% rename from security_protector/__init__.py rename to __unported__/security_protector/__init__.py diff --git a/security_protector/__openerp__.py b/__unported__/security_protector/__openerp__.py similarity index 100% rename from security_protector/__openerp__.py rename to __unported__/security_protector/__openerp__.py diff --git a/security_protector/data.xml b/__unported__/security_protector/data.xml similarity index 100% rename from security_protector/data.xml rename to __unported__/security_protector/data.xml diff --git a/security_protector/i18n/security_protector.pot b/__unported__/security_protector/i18n/security_protector.pot similarity index 100% rename from security_protector/i18n/security_protector.pot rename to __unported__/security_protector/i18n/security_protector.pot diff --git a/security_protector/security_protector.py b/__unported__/security_protector/security_protector.py similarity index 100% rename from security_protector/security_protector.py rename to __unported__/security_protector/security_protector.py diff --git a/security_protector/security_view.xml b/__unported__/security_protector/security_view.xml similarity index 100% rename from security_protector/security_view.xml rename to __unported__/security_protector/security_view.xml diff --git a/server_env_base_external_referentials/__init__.py b/__unported__/server_env_base_external_referentials/__init__.py similarity index 100% rename from server_env_base_external_referentials/__init__.py rename to __unported__/server_env_base_external_referentials/__init__.py diff --git a/server_env_base_external_referentials/__openerp__.py b/__unported__/server_env_base_external_referentials/__openerp__.py similarity index 100% rename from server_env_base_external_referentials/__openerp__.py rename to __unported__/server_env_base_external_referentials/__openerp__.py diff --git a/server_env_base_external_referentials/base_external_referentials.py b/__unported__/server_env_base_external_referentials/base_external_referentials.py similarity index 100% rename from server_env_base_external_referentials/base_external_referentials.py rename to __unported__/server_env_base_external_referentials/base_external_referentials.py diff --git a/server_env_base_external_referentials/i18n/server_env_base_external_referentials.pot b/__unported__/server_env_base_external_referentials/i18n/server_env_base_external_referentials.pot similarity index 100% rename from server_env_base_external_referentials/i18n/server_env_base_external_referentials.pot rename to __unported__/server_env_base_external_referentials/i18n/server_env_base_external_referentials.pot diff --git a/configuration_helper/__init__.py b/configuration_helper/__init__.py new file mode 100644 index 000000000..bfca433c9 --- /dev/null +++ b/configuration_helper/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: David BEAL +# Copyright 2014 Akretion +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import config # noqa diff --git a/configuration_helper/__openerp__.py b/configuration_helper/__openerp__.py new file mode 100644 index 000000000..7ca0618fb --- /dev/null +++ b/configuration_helper/__openerp__.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: David BEAL +# Copyright 2014 Akretion +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Configuration Helper', + 'version': '0.8', + 'author': 'Akretion', + 'maintainer': 'Akretion', + 'category': 'server', + 'complexity': 'normal', + 'depends': ['base'], + 'description': """ +Configuration Helper +==================== + +*This module is intended for developer only. It does nothing used alone.* + +This module : + + * create automatically related fields in 'whatiwant.config.settings' + using those defined in 'res.company' : it avoid duplicated field definitions. + * company_id field with default value is created + * onchange_company_id is defined to update all related fields + * supported fields: char, text, integer, float, datetime, date, boolean, m2o + + +How to use +---------- + +.. code-block:: python + + from . company import ResCompany + + class WhatiwantClassSettings(orm.TransientModel): + _inherit = ['res.config.settings', 'abstract.config.settings'] + _name = 'whatiwant.config.settings' + # fields must be defined in ResCompany class + # related fields are automatically generated from previous definitions + _companyObject = ResCompany + + +Roadmap +------- + * support (or check support) for these field types : o2m, m2m, reference, property, selection + * automatically generate a default view for 'whatiwant.config.settings' (in --debug ?) + + +Contributors +------------ + +* David BEAL +* Sébastien BEAU +* Yannick Vaucher, Camptocamp, (code refactoring from his module 'delivery_carrier_label_postlogistics') + + """, + 'website': 'http://www.akretion.com/', + 'data': [ + ], + 'tests': [], + 'installable': True, + 'auto_install': False, + 'license': 'AGPL-3', + 'application': True, +} diff --git a/configuration_helper/config.py b/configuration_helper/config.py new file mode 100644 index 000000000..187d683ab --- /dev/null +++ b/configuration_helper/config.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: David BEAL, Copyright 2014 Akretion +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import re + +from openerp.osv import orm, fields + + +class AbstractConfigSettings(orm.AbstractModel): + _name = 'abstract.config.settings' + _description = 'Abstract configuration settings' + # prefix field name to differentiate fields in company with those in config + _prefix = 'setting_' + # this is the class name to import in your module + # (it should be ResCompany or res_company, depends of your code) + _companyObject = None + + def _filter_field(self, field_key): + """Inherit in your module to define for which company field + you don't want have a matching related field""" + return True + + def __init__(self, pool, cr): + super(AbstractConfigSettings, self).__init__(pool, cr) + if self._companyObject: + for field_key in self._companyObject._columns: + #allows to exclude some field + if self._filter_field(field_key): + args = ('company_id', field_key) + kwargs = { + 'string': self._companyObject._columns[field_key].string, + 'help': self._companyObject._columns[field_key].help, + 'type': self._companyObject._columns[field_key]._type, + } + if '_obj' in self._companyObject._columns[field_key].__dict__.keys(): + kwargs['relation'] = \ + self._companyObject._columns[field_key]._obj + if '_domain' in \ + self._companyObject._columns[field_key].__dict__.keys(): + kwargs['domain'] = \ + self._companyObject._columns[field_key]._domain + field_key = re.sub('^' + self._prefix, '', field_key) + self._columns[field_key] = \ + fields.related(*args, **kwargs) + + _columns = { + 'company_id': fields.many2one( + 'res.company', + 'Company', + required=True), + } + + def _default_company(self, cr, uid, context=None): + user = self.pool['res.users'].browse(cr, uid, uid, context=context) + return user.company_id.id + + _defaults = { + 'company_id': _default_company, + } + + def field_to_populate_as_related(self, cr, uid, field, company_cols, context=None): + """Only fields which comes from company with the right prefix + must be defined as related""" + if self._prefix + field in company_cols: + return True + return False + + def onchange_company_id(self, cr, uid, ids, company_id, context=None): + " update related fields " + values = {} + values['currency_id'] = False + if not company_id: + return {'value': values} + company_m = self.pool['res.company'] + company = company_m.browse( + cr, uid, company_id, context=context) + company_cols = company_m._columns.keys() + for field in self._columns: + if self.field_to_populate_as_related( + cr, uid, field, company_cols, context=context): + cpny_field = self._columns[field].arg[-1] + if self._columns[field]._type == 'many2one': + values[field] = company[cpny_field]['id'] or False + else: + values[field] = company[cpny_field] + return {'value': values} + + def create(self, cr, uid, values, context=None): + id = super(AbstractConfigSettings, self).create( + cr, uid, values, context=context) + # Hack: to avoid some nasty bug, related fields are not written + # upon record creation. Hence we write on those fields here. + vals = {} + for fname, field in self._columns.iteritems(): + if isinstance(field, fields.related) and fname in values: + vals[fname] = values[fname] + self.write(cr, uid, [id], vals, context) + return id diff --git a/cron_run_manually/__openerp__.py b/cron_run_manually/__openerp__.py index 9fa6ed24a..eb53e939b 100644 --- a/cron_run_manually/__openerp__.py +++ b/cron_run_manually/__openerp__.py @@ -33,4 +33,5 @@ of the scheduler. """, 'depends': ['base'], 'data': ['view/ir_cron.xml'], + 'installable': True, } diff --git a/email_template_template/__openerp__.py b/email_template_template/__openerp__.py index 329915bc4..a193404c1 100644 --- a/email_template_template/__openerp__.py +++ b/email_template_template/__openerp__.py @@ -95,5 +95,6 @@ In your template template: 'view/email_template.xml', ], "license": 'AGPL-3', + 'installable': True, } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/server_environment/serv_config.py b/server_environment/serv_config.py index 6d9181818..033cc91fe 100644 --- a/server_environment/serv_config.py +++ b/server_environment/serv_config.py @@ -23,7 +23,7 @@ import os import ConfigParser from lxml import etree -from openerp.osv import osv, fields, orm +from openerp.osv import fields, orm from openerp.tools.config import config as system_base_config from .system_info import get_server_environment @@ -46,12 +46,13 @@ if not system_base_config.get('running_env', False): ck_path = os.path.join(_dir, system_base_config['running_env']) -if not os.path.exists(ck_path) : +if not os.path.exists(ck_path): raise Exception( "Provided server environment does not exist, " "please add a folder %s" % ck_path ) + def setboolean(obj, attr, _bool=_boolean_states): """Replace the attribute with a boolean.""" res = _bool[getattr(obj, attr).lower()] @@ -115,7 +116,7 @@ class ServerConfiguration(orm.TransientModel): _conf_defaults = _Defaults() def __init__(self, pool, cr): - res = super(ServerConfiguration, self).__init__(pool, cr) + super(ServerConfiguration, self).__init__(pool, cr) self.running_env = system_base_config['running_env'] # Only show passwords in development self.show_passwords = self.running_env in ('dev',) @@ -187,7 +188,6 @@ class ServerConfiguration(orm.TransientModel): res['fields'] = xfields return res - def default_get(self, cr, uid, fields_list, context=None): res = {} for key in self._conf_defaults: diff --git a/web_context_tunnel/__openerp__.py b/web_context_tunnel/__openerp__.py index 41519b664..3813782b6 100644 --- a/web_context_tunnel/__openerp__.py +++ b/web_context_tunnel/__openerp__.py @@ -88,5 +88,6 @@ https://github.com/openerpbrasil/l10n_br_core/compare/develop...feature%2Fsale-w ], 'css': [], 'auto_install': False, + 'installable': True, 'web_preload': False, }