diff --git a/__manifest__.py b/__manifest__.py index d1630d05677ed558fb318e3e0f379fa45c5a9aa0..2522b7527e464f2a4db9c5b6052a35574c7de8e7 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -16,8 +16,9 @@ "templates/blog_templates.xml", "templates/portal_layout.xml", # views - "views/scop_portal_blog.xml", "views/scop_portal_blog_category.xml", + "views/scop_portal_blog_page.xml", + "views/scop_portal_blog_site.xml", # menus "views/menus.xml", ], diff --git a/controllers/portal.py b/controllers/portal.py index 2a5060f4984d50d925885f3a2d4c9892b85c63c7..bf42efa33fc762342368f19e75944b2e985eaa8b 100644 --- a/controllers/portal.py +++ b/controllers/portal.py @@ -7,8 +7,8 @@ from odoo.addons.scopext_portal.controllers.portal import Extranet class ExtranetBlog(Extranet): - def _prepare_portal_ur_home_values(self): - parent_values = super()._prepare_portal_values() + def _prepare_portal_blog_home_values(self): + parent_values = super()._prepare_portal_values(ensure_coop=True) values = { "title": "Extranet CGScop - Mon Union Régionale", } @@ -18,14 +18,16 @@ class ExtranetBlog(Extranet): # Routes # ------------------------------------------------------ @route( - ["/ur", "/ur/<model('scop.portal.blog'):blog_page>"], + ["/ur", "/ur/<model('scop.portal.blog.page'):blog_page>"], type="http", auth="user", methods=["GET"], website=True, ) def coop_ur_blog(self, blog_page=False): - ur_id = request.env.user.partner_id.ur_id + selected_coop = request.env.user._get_selected_coop() + + ur_id = selected_coop.ur_id if not ur_id: return request.render("http_routing.404") @@ -33,12 +35,14 @@ class ExtranetBlog(Extranet): "scop.portal.blog.category" ].get_portal_blog_categories(ur_id) - values = self._prepare_portal_ressource_home_values() - values["category_ids"] = category_ids if not category_ids: return request.render("http_routing.404") + + values = self._prepare_portal_blog_home_values() + if blog_page: values["page_id"] = blog_page return request.render("scopext_portal_blog.blog_page", values) + values["category_ids"] = category_ids return request.render("scopext_portal_blog.blog_home", values) diff --git a/models/__init__.py b/models/__init__.py index 120206024450108080ffd9770984ca3776247365..bc9bef94dc5af7d486d9578596a5f931ac209539 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,2 +1,3 @@ -from . import scop_portal_blog from . import scop_portal_blog_category +from . import scop_portal_blog_page +from . import scop_portal_blog_site diff --git a/models/scop_portal_blog_category.py b/models/scop_portal_blog_category.py index a641888196357d34beec881b58176593186da8c4..ee0214ce96f1678dd5d6344c0c145ea4a2377396 100644 --- a/models/scop_portal_blog_category.py +++ b/models/scop_portal_blog_category.py @@ -16,14 +16,17 @@ class ScopPortalBlogCategory(models.Model): active = fields.Boolean("Actif", default=True) sequence = fields.Integer(default=10) color = fields.Char("Couleur") - logo = fields.Image() + logo = fields.Image("Logo") page_ids = fields.One2many( - comodel_name="scop.portal.blog", inverse_name="category_id", string="Catégorie" + comodel_name="scop.portal.blog.page", + inverse_name="category_id", + string="Catégorie", ) # TODO: Ajouter la valeur par défaut ur_id = fields.Many2one( comodel_name="union.regionale", string="Union Régionale", + required=True, ) # ------------------------------------------------------ diff --git a/models/scop_portal_blog.py b/models/scop_portal_blog_page.py similarity index 90% rename from models/scop_portal_blog.py rename to models/scop_portal_blog_page.py index 57f5fbb10d26b65619a3244df2716c1af7b0eb55..57a8bdedc3666b501f9f20c4e6afff70d28887ca 100644 --- a/models/scop_portal_blog.py +++ b/models/scop_portal_blog_page.py @@ -4,8 +4,8 @@ from odoo import fields, models -class ScopPortalBlog(models.Model): - _name = "scop.portal.blog" +class ScopPortalBlogPage(models.Model): + _name = "scop.portal.blog.page" _inherit = ["mail.thread"] _description = "Portal Blog Page" _order = "sequence, name" @@ -18,7 +18,7 @@ class ScopPortalBlog(models.Model): required=True, tracking=1, ) - sequence = fields.Integer() + sequence = fields.Integer(default=10) active = fields.Boolean("Actif", tracking=1, default=True) category_id = fields.Many2one( comodel_name="scop.portal.blog.category", @@ -32,6 +32,7 @@ class ScopPortalBlog(models.Model): comodel_name="union.regionale", string="Union Régionale", tracking=1, + required=True, ) is_published = fields.Boolean("Publié", tracking=1, default=False) content = fields.Html("Contenu") diff --git a/models/scop_portal_blog_site.py b/models/scop_portal_blog_site.py new file mode 100644 index 0000000000000000000000000000000000000000..00ad5fda696fe0a9fb8e4b362f08405fc20107c6 --- /dev/null +++ b/models/scop_portal_blog_site.py @@ -0,0 +1,39 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class ScopPortalBlogSite(models.Model): + _name = "scop.portal.blog.site" + _inherit = ["mail.thread"] + _description = "Portal Blog Site" + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + name = fields.Char( + "Titre", + required=True, + tracking=1, + ) + # TODO: Ajouter la valeur par défaut + ur_id = fields.Many2one( + comodel_name="union.regionale", + string="Union Régionale", + tracking=1, + required=True, + ) + image = fields.Image("Image d'accueil") + content = fields.Html("Contenu de la page d'accueil") + + # ------------------------------------------------------ + # Action + # ------------------------------------------------------ + def action_publish(self): + for blog in self: + blog.is_published = True + + def action_unpublish(self): + for blog in self: + blog.is_published = False diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 5efc72d47203905459503897c303231610c4f911..de404e8c854406088be9c399eb1a81d15bf7bed7 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,5 +1,7 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_scop_portal_blog_group_portal,access_scop_portal_blog_group_portal,model_scop_portal_blog,base.group_portal,1,0,0,0 -access_scop_portal_blog_group_editor,access_scop_portal_blog_group_editor,model_scop_portal_blog,group_portal_blog_editor,1,1,1,1 access_scop_portal_blog_category_group_portal,access_scop_portal_blog_category_group_portal,model_scop_portal_blog_category,base.group_portal,1,0,0,0 access_scop_portal_blog_category_group_editor,access_scop_portal_blog_category_group_editor,model_scop_portal_blog_category,group_portal_blog_editor,1,1,1,1 +access_scop_portal_blog_page_group_portal,access_scop_portal_blog_page_group_portal,model_scop_portal_blog_page,base.group_portal,1,0,0,0 +access_scop_portal_blog_page_group_editor,access_scop_portal_blog_page_group_editor,model_scop_portal_blog_page,group_portal_blog_editor,1,1,1,1 +access_scop_portal_blog_site_group_portal,access_scop_portal_blog_site_group_portal,model_scop_portal_blog_site,base.group_portal,1,0,0,0 +access_scop_portal_blog_site_group_editor,access_scop_portal_blog_site_group_editor,model_scop_portal_blog_site,group_portal_blog_editor,1,1,1,1 diff --git a/security/security_rules.xml b/security/security_rules.xml index 472c6596ad637fe90602b50b95f24e029e1e7cf4..011336061c038e4ca4df9540ba3f8dc609329fac 100644 --- a/security/security_rules.xml +++ b/security/security_rules.xml @@ -53,8 +53,8 @@ <!-- Admin --> <record id="scop_portal_blog_admin_ur_rule" model="ir.rule"> - <field name="name">Scop Portal: Admin Rule</field> - <field name="model_id" ref="model_scop_portal_blog" /> + <field name="name">Scop Portal Page: Admin Rule</field> + <field name="model_id" ref="model_scop_portal_blog_page" /> <field name="domain_force">[(1, '=', 1)]</field> <field name="groups" @@ -78,4 +78,17 @@ <field name="perm_create" eval="True" /> <field name="perm_unlink" eval="True" /> </record> + <record id="scop_portal_blog_admin_ur_rule" model="ir.rule"> + <field name="name">Scop Portal Site: Admin Rule</field> + <field name="model_id" ref="model_scop_portal_blog_site" /> + <field name="domain_force">[(1, '=', 1)]</field> + <field + name="groups" + eval="[(6, 0, [ref('scopext_portal_blog.group_portal_blog_admin')])]" + /> + <field name="perm_read" eval="True" /> + <field name="perm_write" eval="True" /> + <field name="perm_create" eval="True" /> + <field name="perm_unlink" eval="True" /> + </record> </odoo> diff --git a/templates/portal_layout.xml b/templates/portal_layout.xml index 16e13bd0f1c6422b46acf90e59ac2f96c1e77e40..dbadd9f46a0eec485df839955577204179a78985 100644 --- a/templates/portal_layout.xml +++ b/templates/portal_layout.xml @@ -8,8 +8,7 @@ name="blog_scop_nav_lvl1" > <xpath expr="//nav/t[@id='coop']" position="after"> - <t t-set="ur_id" t-value="request.env.user.partner_id.ur_id" /> - <t t-if="ur_id and request.env['scop.portal.blog.category'].get_portal_blog_categories(ur_id)"> + <t t-if="coop.ur_id and request.env['scop.portal.blog.category'].get_portal_blog_categories(coop.ur_id)"> <t id="home" t-call="scopext_portal.nav_lvl1_item"> <t t-set="link" t-value="'/ur'" /> <t t-set="name" t-value="'ur'" /> diff --git a/views/menus.xml b/views/menus.xml index 9edf9fa8f4ac5d9b4081bfa465fd2f79b33445d0..fd1d367491517709334322c8efcf27ec0b5c6f30 100644 --- a/views/menus.xml +++ b/views/menus.xml @@ -12,7 +12,7 @@ <menuitem id="menu_scop_portal_blog_page" name="Pages" - action="scop_portal_blog_action" + action="scop_portal_blog_page_action" parent="menu_scop_portal_blog_root" sequence="10" /> @@ -23,4 +23,11 @@ parent="menu_scop_portal_blog_root" sequence="20" /> + <menuitem + id="menu_scop_portal_blog_site" + name="Sites" + action="scop_portal_blog_site_action" + parent="menu_scop_portal_blog_root" + sequence="30" + /> </odoo> diff --git a/views/scop_portal_blog.xml b/views/scop_portal_blog_page.xml similarity index 79% rename from views/scop_portal_blog.xml rename to views/scop_portal_blog_page.xml index 3319b63328b02a511e4ae83ad355fb96153dec95..4c1c32be30ef19786fd0fca469b8c008f72b0bd8 100644 --- a/views/scop_portal_blog.xml +++ b/views/scop_portal_blog_page.xml @@ -3,9 +3,9 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> <!-- Form --> - <record id="scop_portal_blog_form" model="ir.ui.view"> - <field name="name">scop.portal.blog.form</field> - <field name="model">scop.portal.blog</field> + <record id="scop_portal_blog_page_form" model="ir.ui.view"> + <field name="name">scop.portal.blog.page.form</field> + <field name="model">scop.portal.blog.page</field> <field name="arch" type="xml"> <form> <sheet> @@ -42,9 +42,9 @@ </record> <!-- List --> - <record id="scop_portal_blog_list" model="ir.ui.view"> - <field name="name">scop.portal.blog.list</field> - <field name="model">scop.portal.blog</field> + <record id="scop_portal_blog_page_list" model="ir.ui.view"> + <field name="name">scop.portal.blog.page.list</field> + <field name="model">scop.portal.blog.page</field> <field name="arch" type="xml"> <list> <field name="sequence" widget="handle" /> @@ -57,9 +57,9 @@ </record> <!-- Search --> - <record id="scop_portal_blog_search" model="ir.ui.view"> - <field name="name">scop.portal.blog.search</field> - <field name="model">scop.portal.blog</field> + <record id="scop_portal_blog_page_search" model="ir.ui.view"> + <field name="name">scop.portal.blog.page.search</field> + <field name="model">scop.portal.blog.page</field> <field name="arch" type="xml"> <search> <field name="name" /> @@ -100,22 +100,22 @@ </record> <!-- Actions --> - <record model="ir.actions.act_window" id="scop_portal_blog_action"> + <record model="ir.actions.act_window" id="scop_portal_blog_page_action"> <field name="name">Page de blog</field> - <field name="res_model">scop.portal.blog</field> - <field name="path">blog-page</field> + <field name="res_model">scop.portal.blog.page</field> + <!-- <field name="path">blog-page</field> --> <field name="view_mode">list,form</field> <field name="help" type="html"> - <p class="o_view_nocontent_smiling_face"> + <p class="o_view_nocontent_smiling_face"> Créer une nouvelle page de blog </p> </field> </record> - <record model="ir.actions.server" id="action_publish_blog_page"> + <record id="action_publish_blog_page" model="ir.actions.server"> <field name="name">Publier</field> - <field name="model_id" ref="model_scop_portal_blog" /> - <field name="binding_model_id" ref="model_scop_portal_blog" /> + <field name="model_id" ref="model_scop_portal_blog_page" /> + <field name="binding_model_id" ref="model_scop_portal_blog_page" /> <field name="state">code</field> <field name="binding_view_types">list</field> <field name="code"> diff --git a/views/scop_portal_blog_site.xml b/views/scop_portal_blog_site.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e7cfa8a4d8f5a57d94995ed48606c897834f663 --- /dev/null +++ b/views/scop_portal_blog_site.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright 2024- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <!-- Form --> + <record id="scop_portal_blog_site_form" model="ir.ui.view"> + <field name="name">scop.portal.blog.site.form</field> + <field name="model">scop.portal.blog.site</field> + <field name="arch" type="xml"> + <form> + <sheet> + <div class="oe_title mb-2"> + <h1> + <field + name="name" + default_focus="1" + placeholder="Titre du site" + /> + </h1> + </div> + <group> + <group> + <field name="ur_id" options="{'no_create': 1}" /> + </group> + </group> + <separator string="Contenu" /> + <field name="content" /> + </sheet> + <chatter /> + </form> + </field> + </record> + + <!-- List --> + <record id="scop_portal_blog_list" model="ir.ui.view"> + <field name="name">scop.portal.blog.site.list</field> + <field name="model">scop.portal.blog.site</field> + <field name="arch" type="xml"> + <list> + <field name="name" /> + <field name="ur_id" /> + </list> + </field> + </record> + + <!-- Search --> + <record id="scop_portal_blog_search" model="ir.ui.view"> + <field name="name">scop.portal.blog.site.search</field> + <field name="model">scop.portal.blog.site</field> + <field name="arch" type="xml"> + <search> + <field name="name" /> + <field name="ur_id" /> + <separator /> + <group expand="0" name="group_by" string="Group By"> + <filter + name="group_ur_id" + string="UR" + context="{'group_by' : 'ur_id'}" + /> + </group> + </search> + </field> + </record> + + <!-- Actions --> + <record id="scop_portal_blog_site_action" model="ir.actions.act_window"> + <field name="name">Sites</field> + <field name="res_model">scop.portal.blog.site</field> + <field name="path">blog-site</field> + <field name="view_mode">list,form</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Créer un nouveau site + </p> + </field> + </record> +</odoo>