347a3ccf763cc6958d5dc1df3168c9c65245736c
This commit is the 4th commit of a comprehensive refactor of our HTTP framework. See odoo/odoo#78857 for complete historic, discussions and rationnals. Complete refactor of the "registry" of controllers. The `ControllerType` metaclass have been replaced by an abstract class with a py3.7 `__init_subclass__`. The `Endpoint` class is gone too, replaced by a clever usage of `functools.partial`. This refactor is "pure", it doesn't add any new feature, it only merely adds a few warnings. The four `@route`, `Controller`, `_generate_routing_rule`, `routing_map` work as follow: 1. A reference to each immediate child class of `Controller` (not grand- children) is registered in a global list indexed by module (thus a dictionnary) everytime the server starts. Remember that every first- child (not grand-children) of `Controller` is the primary controller, the one that can later be extended by other controllers (the grand- children) in other modules. Remember that it is possible to get each class's children via the `__subclasses__` dunder method. 2. Every controller method that is decorated with `@route` is granted an attribute: `original_routing`, a dictionnary containing the `@route` arguments. When a controller method has the `original_routing` attribute, this method is called an `endpoint`. 3. `_generate_routing_rules` receives the list of installed module names, this list is topologicaly sorted according to the modules dependencies. That is `base` comes before `web` in this list. The objectif of this function is to pair each route to an endpoint whoose class's MRO respect the above-mentioned order. Whe achieve this by carefully crafting classes at runtime, classes inheritating from the correct "source code" controllers in accordance to the topology. This method is also responsible of merging each method's `original_routing` into one `routing` dictionnary, the very `rule.endpoint.routing` dict that is used through the rest of the http framework. 4. Each route-endpoint pair is saved into a `routing_map`, an object that bind each route to its endpoint. This object exposes a `match` method used to find back the endpoint given its route (=http path). In addition to this refactor, we added some new helpers in our tools, among them `submap` that implement a kind of `dict() - set() -> dict()` operator. Filtering a dict on a set of keys is a common operation but the python standard library lacks a dedicated operator. PR: odoo#78857 Task: 2571224
…
Odoo
Odoo is a suite of web based open source business apps.
The main Odoo Apps include an Open Source CRM, Website Builder, eCommerce, Warehouse Management, Project Management, Billing & Accounting, Point of Sale, Human Resources, Marketing, Manufacturing, ...
Odoo Apps can be used as stand-alone applications, but they also integrate seamlessly so you get a full-featured Open Source ERP when you install several Apps.
Getting started with Odoo
For a standard installation please follow the Setup instructions from the documentation.
To learn the software, we recommend the Odoo eLearning, or Scale-up, the business game. Developers can start with the developer tutorials
Languages
Python
49.6%
JavaScript
47.8%
SCSS
2%
CSS
0.3%
HTML
0.2%