Adds addon "ir_rule_website"
							parent
							
								
									54764e4d8b
								
							
						
					
					
						commit
						a9be327607
					
				|  | @ -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