# HG changeset patch
# User Etienne Ferriere <etienne.ferriere@xcg-consulting.fr>
# Date 1567009959 -7200
#      Wed Aug 28 18:32:39 2019 +0200
# Branch 11.0
# Node ID 46ced1fc361b5fb67127c9d21449b0e2900449d0
# Parent  4fd3d3f64d452ba3472e7ceda387567f6a39ef2c
Analytic fields can be set as required.
Updated the translations.

diff --git a/MetaAnalytic.py b/MetaAnalytic.py
--- a/MetaAnalytic.py
+++ b/MetaAnalytic.py
@@ -211,6 +211,21 @@
             """
             pass
 
+        @AddMethod(superclass)
+        @api.model
+        def _required_analytic_fields(self):
+
+            return (
+                self.env["analytic.structure"]
+                .search(
+                    [
+                        ("model_name", "=", self._name.replace(".", "_")),
+                        ("required", "=", True),
+                    ]
+                )
+                .mapped("ordering")
+            )
+
         return (superclass,)
 
     @classmethod
diff --git a/i18n/fr.po b/i18n/fr.po
--- a/i18n/fr.po
+++ b/i18n/fr.po
@@ -3,13 +3,13 @@
 # * analytic_structure
 # Jérémie Gavrel <jeremie.gavrel@xcg-consulting.fr>, 2014.
 # Brendan Masson <brendan.masson@xcg-consulting.fr>, 2016.
-# Etienne Ferriere <etienne.ferriere@xcg-consulting.fr>, 2018.
+# Etienne Ferriere <etienne.ferriere@xcg-consulting.fr>, 2018, 2019.
 msgid ""
 msgstr ""
 "Project-Id-Version: OpenERP Server 7.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-03-05 15:37+0000\n"
-"PO-Revision-Date: 2018-03-05 16:40+0200\n"
+"POT-Creation-Date: 2019-08-29 07:53+0000\n"
+"PO-Revision-Date: 2019-08-29 09:55+0200\n"
 "Last-Translator: Etienne Ferriere <etienne.ferriere@xcg-consulting.fr>\n"
 "Language-Team: XCG Consulting\n"
 "Language: fr\n"
@@ -45,7 +45,7 @@
 msgstr "Emplacement d'analyse"
 
 #. module: analytic_structure
-#: code:addons/analytic_structure/analytic_structure.py:43
+#: code:addons/analytic_structure/models/analytic_structure.py:42
 #, python-format
 msgid "Analysis {}"
 msgstr "Analytique {}"
@@ -103,7 +103,7 @@
 msgstr "Liste noire"
 
 #. module: analytic_structure
-#: code:addons/analytic_structure/analytic_dimension.py:29
+#: code:addons/analytic_structure/models/analytic_dimension.py:24
 #, python-format
 msgid "Both {model1} and {model2} reference {dim}"
 msgstr "{dim} est référencé à la fois par {model1} et {model2}"
@@ -222,18 +222,11 @@
 msgstr "Erreur ! Vous ne pouvez créer de code analytique récursif."
 
 #. module: analytic_structure
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns10_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns11_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns12_id
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns1_id
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns2_id
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns3_id
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns4_id
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns5_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns6_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns7_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns8_id
-#: model:ir.model.fields,field_description:analytic_structure.field_analytic_dimension_ns9_id
 msgid "Generated Subset of Structures"
 msgstr "Sous-ensemble de structures autogénéré"
 
@@ -287,7 +280,7 @@
 msgstr "Le nom doit être unique"
 
 #. module: analytic_structure
-#: code:addons/analytic_structure/analytic_dimension.py:30
+#: code:addons/analytic_structure/models/analytic_dimension.py:25
 #, python-format
 msgid "No model matches dimension {dim}"
 msgstr ""
@@ -318,6 +311,11 @@
 msgstr "Dimension associée"
 
 #. module: analytic_structure
+#: model:ir.model.fields,field_description:analytic_structure.field_analytic_structure_required
+msgid "Required"
+msgstr "Requis"
+
+#. module: analytic_structure
 #: model:ir.model.fields,field_description:analytic_structure.field_analytic_code_parent_right
 msgid "Right parent"
 msgstr "Parent droit"
diff --git a/models/analytic_structure.py b/models/analytic_structure.py
--- a/models/analytic_structure.py
+++ b/models/analytic_structure.py
@@ -98,6 +98,7 @@
     company_id = fields.Many2one(
         "res.company", "Company", default=(lambda *a: False)
     )
+    required = fields.Boolean()
 
     _sql_constraints = [
         (
@@ -333,7 +334,7 @@
             sorted_fields = list(found_fields.items())
             sorted_fields.sort(key=lambda i: int(i[0]))
             elem_fields = [
-                self.format_field_name(ordering, prefix, suffix)
+                (self.format_field_name(ordering, prefix, suffix), ordering)
                 for ordering, found in sorted_fields
                 if not found
             ]
@@ -347,16 +348,24 @@
 
                 modifiers = json.loads(elem.attrib.get("modifiers", "{}"))
                 # Now we can insert the fields in the view's architecture.
-                for field in elem_fields:
+
+                model_map = {
+                    model._name.replace(".", "_"): model._name
+                    for name, model in iter(self.env.registry.items())
+                }
+                required = self.env[
+                    model_map[model]
+                ]._required_analytic_fields()
+                for field, ordering in elem_fields:
                     attrs = {"name": field}
-                    attrs["modifiers"] = json.dumps(
-                        {
-                            attr: value
-                            for attr, value in list(modifiers.items())
-                            if elem.attrib.get(attr, "False")
-                            in ("True", "true", "1")
-                        }
-                    )
+                    attributes = {
+                        attr: value
+                        for attr, value in list(modifiers.items())
+                        if elem.attrib.get(attr, "False")
+                        in ("True", "true", "1")
+                    }
+                    attributes["required"] = int(ordering in required)
+                    attrs["modifiers"] = json.dumps(attributes)
                     for attr, value in list(elem.attrib.items()):
                         if attr in ["name", "prefix", "suffix", "modifiers"]:
                             continue
diff --git a/views/analytic_views.xml b/views/analytic_views.xml
--- a/views/analytic_views.xml
+++ b/views/analytic_views.xml
@@ -139,6 +139,8 @@
                         <field name="ordering" />
                         <newline />
                         <field name="company_id" placeholder="All" />
+                        <newline />
+                        <field name="required" />
                     </group>
                 </form>
             </field>