Adds addon "ir_rule_website"
parent
bd054fa459
commit
b53acf4350
|
|
@ -0,0 +1,55 @@
|
||||||
|
=========================================
|
||||||
|
Multi-website support in Security Rules
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
Allows to use ``website_id`` (current website) in ``domain_force`` field of Record Rules (``ir.rule``), e.g.:
|
||||||
|
|
||||||
|
* ``[('website_ids', 'in', [website_id])]``
|
||||||
|
* ``[('website_id', '=', website_id)]``
|
||||||
|
|
||||||
|
|
||||||
|
Example of usage:
|
||||||
|
|
||||||
|
* Show a blog on specific websites only (TODO: add link to the module)
|
||||||
|
* Show an event on specific websites only (TODO: add link to the module)
|
||||||
|
* Show a product on specific websites only (TODO: add link to the module)
|
||||||
|
|
||||||
|
Odoo 12.0+
|
||||||
|
==========
|
||||||
|
|
||||||
|
We hope this feature will be built-in since Odoo 12.0 at least: https://github.com/odoo/odoo/pull/22743
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
* `Ivan Yelizariev <https://www.it-projects.info/team/yelizariev>`__
|
||||||
|
* `Ildar Nasyrov <https://www.it-projects.info/team/iledarn>`__
|
||||||
|
|
||||||
|
Sponsors
|
||||||
|
--------
|
||||||
|
* `IT-Projects LLC <https://it-projects.info>`__
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
-----------
|
||||||
|
* `IT-Projects LLC <https://it-projects.info>`__
|
||||||
|
|
||||||
|
To get a guaranteed support you are kindly requested to purchase the module at `odoo apps store <https://apps.odoo.com/apps/modules/11.0/ir_rule_website/>`__.
|
||||||
|
|
||||||
|
Thank you for understanding!
|
||||||
|
|
||||||
|
`IT-Projects Team <https://www.it-projects.info/team>`__
|
||||||
|
|
||||||
|
Further information
|
||||||
|
===================
|
||||||
|
|
||||||
|
Demo: http://runbot.it-projects.info/demo/access-addons/11.0
|
||||||
|
|
||||||
|
HTML Description: https://apps.odoo.com/apps/modules/11.0/ir_rule_website
|
||||||
|
|
||||||
|
Usage instructions: `<doc/index.rst>`_
|
||||||
|
|
||||||
|
Changelog: `<doc/changelog.rst>`_
|
||||||
|
|
||||||
|
Tested on Odoo 11.0 dc61861f90d15797b19f8ebddfb0c8a66d0afa88
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
"name": """Multi-website support in Security Rules""",
|
||||||
|
"summary": """Provide access depending on current website""",
|
||||||
|
"category": "Access",
|
||||||
|
# "live_test_url": "",
|
||||||
|
"images": [],
|
||||||
|
"version": "1.0.0",
|
||||||
|
"application": False,
|
||||||
|
|
||||||
|
"author": "IT-Projects LLC, Ildar Nasyrov",
|
||||||
|
"support": "apps@it-projects.info",
|
||||||
|
"website": "https://it-projects.info/team/iledarn",
|
||||||
|
"license": "LGPL-3",
|
||||||
|
"price": 20.00,
|
||||||
|
"currency": "EUR",
|
||||||
|
|
||||||
|
"depends": [
|
||||||
|
"base",
|
||||||
|
],
|
||||||
|
"external_dependencies": {"python": [], "bin": []},
|
||||||
|
"data": [
|
||||||
|
],
|
||||||
|
"qweb": [
|
||||||
|
],
|
||||||
|
"demo": [
|
||||||
|
],
|
||||||
|
|
||||||
|
"post_load": None,
|
||||||
|
"pre_init_hook": None,
|
||||||
|
"post_init_hook": None,
|
||||||
|
"uninstall_hook": None,
|
||||||
|
|
||||||
|
"auto_install": False,
|
||||||
|
"installable": True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
`1.0.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Init version
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
=========================================
|
||||||
|
Multi-website support in Security Rules
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
* `Install <https://odoo-development.readthedocs.io/en/latest/odoo/usage/install-module.html>`__ this module in a usual way
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
This is a core technical module - no configurations are needed
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
* If you have a model accessible through a website (by means of controller methods) - specify this module into the "depends" section of your manifest file
|
||||||
|
* Now you can create security rules using `website_id` in `domain_force` fields. For example,
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="blog_rule_all" model="ir.rule">
|
||||||
|
<field name="name">Blogs available only for specifed websites</field>
|
||||||
|
<field name="model_id" ref="model_blog_blog"/>
|
||||||
|
<field name="domain_force">[('website_ids', 'in', [website_id])]</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import ir_rule
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, models, tools
|
||||||
|
from odoo.addons.base.ir.ir_rule import IrRule as IrRuleOriginal
|
||||||
|
|
||||||
|
|
||||||
|
class IrRule(models.Model):
|
||||||
|
_inherit = 'ir.rule'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _eval_context(self):
|
||||||
|
context = super(IrRule, self)._eval_context()
|
||||||
|
context['website_id'] = self._context.get('website_id')
|
||||||
|
return context
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
@tools.ormcache_context('self._uid', 'model_name', 'mode', keys=["website_id"])
|
||||||
|
def _compute_domain(self, model_name, mode="read"):
|
||||||
|
return IrRuleOriginal._compute_domain.__wrapped__(self, model_name, mode=mode)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
|
|
@ -0,0 +1,89 @@
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="oe_span12">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B;">Multi-website support in Security Rules</h2>
|
||||||
|
<h3 class="oe_slogan">Make website-dependent access to pages, products, etc.</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="oe_span12">
|
||||||
|
|
||||||
|
<div class="alert alert-info oe_mt32" style="padding:0.3em 0.6em; font-size: 150%;">
|
||||||
|
<i class="fa fa-hand-o-right"></i><b> Technical module that allows implementing different features. For example: </b>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
Show a blog on specific websites only
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
Show an event on specific websites only
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
Show a product on specific websites only
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="oe_span8">
|
||||||
|
<h2>Need our service?</h2>
|
||||||
|
<p class="oe_mt32">Contact us by <a href="mailto:apps@it-projects.info">email</a> or fill out <a href="https://www.it-projects.info/page/website.contactus " target="_blank">request form</a></p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="mailto:apps@it-projects.info">apps@it-projects.info <i class="fa fa-envelope-o"></i></a></li>
|
||||||
|
<li><a href="https://www.it-projects.info/page/website.contactus " target="_blank">https://www.it-projects.info/page/website.contactus <i class="fa fa-list-alt"></i></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="oe_span4">
|
||||||
|
<div class="stamp" style="width:200px;">
|
||||||
|
<div style="margin-top: 15px;
|
||||||
|
position: relative;
|
||||||
|
font-family:'Vollkorn', serif;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 25px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #75526b;
|
||||||
|
border: 3px dashed #75526b;
|
||||||
|
float: left;
|
||||||
|
padding: 4px 12px;
|
||||||
|
-webkit-transform: rotate(-1deg);
|
||||||
|
-o-transform: rotate(-1deg);
|
||||||
|
-moz-transform: rotate(-1deg);
|
||||||
|
-ms-transform: rotate(-1deg);">
|
||||||
|
Tested on Odoo<br/>11.0 community
|
||||||
|
</div>
|
||||||
|
<!--<div style="margin-top: 15px;
|
||||||
|
position: relative;
|
||||||
|
font-family:'Vollkorn', serif;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 25px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #75526b;
|
||||||
|
border: 3px dashed #75526b;
|
||||||
|
float: left;
|
||||||
|
padding: 4px 12px;
|
||||||
|
-webkit-transform: rotate(6deg);
|
||||||
|
-o-transform: rotate(6deg);
|
||||||
|
-moz-transform: rotate(6deg);
|
||||||
|
-ms-transform: rotate(6deg);">
|
||||||
|
Tested on Odoo<br/>11.0 enterprise
|
||||||
|
</div>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import test_compute_domain
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from openerp.tests.common import TransactionCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestComputeDomain(TransactionCase):
|
||||||
|
at_install = True
|
||||||
|
post_install = True
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestComputeDomain, self).setUp()
|
||||||
|
self.demo_user = self.env.ref('base.user_demo')
|
||||||
|
self.env['ir.rule'].create({'name': 'test ir_rule_website',
|
||||||
|
'model_id': self.env.ref('base.model_res_partner').id,
|
||||||
|
'domain_force': "[('parent_id', 'in', [website_id])]"})
|
||||||
|
|
||||||
|
def _cached_compute_domain(self, website_id):
|
||||||
|
test_domain = ('parent_id', 'in', [website_id])
|
||||||
|
domain = self.env['ir.rule'].sudo(user=self.demo_user.id).with_context(website_id=website_id)._compute_domain('res.partner')
|
||||||
|
self.assertTrue(test_domain in domain)
|
||||||
|
|
||||||
|
def test_cache(self):
|
||||||
|
self._cached_compute_domain(1)
|
||||||
|
self._cached_compute_domain(2)
|
||||||
Loading…
Reference in New Issue