From 669168dd83c3e1fe4e26828315a5885b84bbaad4 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Fri, 14 Jul 2017 16:17:07 +0200 Subject: [PATCH] [ADD] create ui now create tree view [IMP] fr translation [IMP] add last refresh date time on the action name of each sql materialized view --- bi_sql_editor/README.rst | 14 +- bi_sql_editor/i18n/fr.po | 305 ++++++++++-------- bi_sql_editor/models/bi_sql_view.py | 36 ++- bi_sql_editor/models/bi_sql_view_field.py | 22 ++ .../description/06_action_datetime_name.png | Bin 0 -> 13714 bytes bi_sql_editor/views/view_bi_sql_view.xml | 7 +- 6 files changed, 227 insertions(+), 157 deletions(-) create mode 100644 bi_sql_editor/static/description/06_action_datetime_name.png diff --git a/bi_sql_editor/README.rst b/bi_sql_editor/README.rst index c483d14d..01f21e17 100644 --- a/bi_sql_editor/README.rst +++ b/bi_sql_editor/README.rst @@ -114,17 +114,17 @@ Known issues / Roadmap * Add 'interval', after type (row/col/measure) field for date(time) fields. -* Dynamically change displayed action name to mention the last refresh of the - materialized view. - -* Create ir.rule to limit access. (for company_id for exemple) - Note ==== -The syntax of the sql request has the following constrains: +* If the view is materialized, the name of the action will contain the date + and the time of it last refresh: + + .. figure:: /bi_sql_editor/static/description/06_action_datetime_name.png + :width: 800 px -* the name of the selectable columns should be prefixed by `x_` +* The syntax of the sql request has the following constrains: the name of the + selectable columns should be prefixed by `x_` Sample: diff --git a/bi_sql_editor/i18n/fr.po b/bi_sql_editor/i18n/fr.po index 6e2192d4..8b96735c 100644 --- a/bi_sql_editor/i18n/fr.po +++ b/bi_sql_editor/i18n/fr.po @@ -1,42 +1,43 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * bi_sql_editor -# -# Translators: -# OCA Transbot , 2017 -# Sébastien Alix , 2017 -# leemannd , 2017 +# * bi_sql_editor +# msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-03 01:19+0000\n" -"PO-Revision-Date: 2017-06-03 01:19+0000\n" -"Last-Translator: leemannd , 2017\n" -"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"POT-Creation-Date: 2017-07-14 14:00+0000\n" +"PO-Revision-Date: 2017-07-14 14:00+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: \n" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:151 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:515 +#, python-format +msgid "%m/%d/%Y %H:%M:%S UTC" +msgstr "%d/%m/%Y %H:%M:%S UTC" + +#. module: bi_sql_editor +#: code:addons/bi_sql_editor/models/bi_sql_view.py:155 #, python-format msgid "%s (Copy)" -msgstr "" +msgstr "%s (Copie)" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:248 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:255 #, python-format msgid "%s Access %s" -msgstr "" +msgstr "%s Accès %s" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:274 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:281 #, python-format msgid "Access %s" -msgstr "" +msgstr "Accès %s" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form @@ -51,70 +52,73 @@ msgstr "Utilisateurs Autorisés" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form -msgid "" -"Are you sure you want to set to draft this SQL View. It will delete" -" the materialized view, and all the previous" -" mapping realized with the columns" -msgstr "" +msgid "Are you sure you want to set to draft this SQL View. It will delete the materialized view, and all the previous mapping realized with the columns" +msgstr "Etes vous sur de vouloir remettre la Vue SQL en brouillon. Cela supprimera la vue (matérialisée), et tout le mapping préalablement réalisé sur les colonnes" + +#. module: bi_sql_editor +#: selection:bi.sql.view.field,tree_visibility:0 +msgid "Available" +msgstr "Disponible" #. module: bi_sql_editor #: help:bi.sql.view.field,is_group_by:0 -msgid "" -"Check this box if you want to create a 'group by' option in the search view" -msgstr "" +msgid "Check this box if you want to create a 'group by' option in the search view" +msgstr "Cochez cette case pour créer une option 'Grouper Par' sur la vue de recherche" #. module: bi_sql_editor #: help:bi.sql.view.field,is_index:0 -msgid "" -"Check this box if you want to create an index on that field. This is " -"recommended for searchable and groupable fields, to reduce duration" -msgstr "" +msgid "Check this box if you want to create an index on that field. This is recommended for searchable and groupable fields, to reduce duration" +msgstr "Cochez cette case pour créer un index SQL sur ce champ. Cela est recommandé pour les champs de recherche et de regroupement pour réduire le temps d'affichage." #. module: bi_sql_editor #: selection:bi.sql.view.field,graph_type:0 msgid "Column" -msgstr "" +msgstr "Colonne" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Create SQL View, Indexes and Models" -msgstr "" +msgstr "Créer la vue SQL, les index et les modèles" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Create UI" -msgstr "" +msgstr "Créer IU" #. module: bi_sql_editor -#: field:bi.sql.view,create_uid:0 field:bi.sql.view.field,create_uid:0 +#: field:bi.sql.view,create_uid:0 +#: field:bi.sql.view.field,create_uid:0 msgid "Created by" msgstr "Créé par" #. module: bi_sql_editor -#: field:bi.sql.view,create_date:0 field:bi.sql.view.field,create_date:0 +#: field:bi.sql.view,create_date:0 +#: field:bi.sql.view.field,create_date:0 msgid "Created on" msgstr "Créé le" #. module: bi_sql_editor #: help:bi.sql.view,cron_id:0 msgid "Cron Task that will refresh the materialized view" -msgstr "" +msgstr "Tâche CRON qui va rafraichir la vue matérialisée" #. module: bi_sql_editor #: field:bi.sql.view,size:0 msgid "Database Size" -msgstr "" +msgstr "Taille de la base de données" #. module: bi_sql_editor #: help:bi.sql.view,domain_force:0 -msgid "" -"Define here access restriction to data.\n" +msgid "Define here access restriction to data.\n" " Take care to use field name prefixed by 'x_'. A global 'ir.rule' will be created. A typical Multi Company rule is for exemple \n" " ['|', ('x_company_id','child_of', [user.company_id.id]),('x_company_id','=',False)]." -msgstr "" +msgstr "Définir ici les règles de restrictions d'accès aux données.\n" +" Faite attention à utilliser des noms de champs préfixés par 'x_'. Un 'ir.rule' global sera créé. Une règle classique en multi-companie est, par exemple : \n" +" ['|', ('x_company_id','child_of', [user.company_id.id]),('x_company_id','=',False)]." #. module: bi_sql_editor -#: field:bi.sql.view,display_name:0 field:bi.sql.view.field,display_name:0 +#: field:bi.sql.view,display_name:0 +#: field:bi.sql.view.field,display_name:0 msgid "Display Name" msgstr "Nom à afficher" @@ -126,17 +130,17 @@ msgstr "Brouillon" #. module: bi_sql_editor #: field:bi.sql.view,domain_force:0 msgid "Extra Rule Definition" -msgstr "" +msgstr "Définition de règle complémentaire" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Extras Information" -msgstr "" +msgstr "Information complémentaire" #. module: bi_sql_editor #: field:bi.sql.view.field,field_description:0 msgid "Field Description" -msgstr "" +msgstr "Description du champ" #. module: bi_sql_editor #: field:bi.sql.view.field,ttype:0 @@ -145,45 +149,51 @@ msgstr "Type de champ" #. module: bi_sql_editor #: help:bi.sql.view.field,many2one_model_id:0 -msgid "" -"For 'Many2one' Odoo field.\n" +msgid "For 'Many2one' Odoo field.\n" " Co Model of the field." -msgstr "" +msgstr "Pour les champs Odoo 'Many2one'.\n" +" Modèle associé à ce champ." #. module: bi_sql_editor #: help:bi.sql.view.field,selection:0 -msgid "" -"For 'Selection' Odoo field.\n" +msgid "For 'Selection' Odoo field.\n" " List of options, specified as a Python expression defining a list of (key, label) pairs. For example: [('blue','Blue'), ('yellow','Yellow')]" -msgstr "" +msgstr "Pour les champs Odoo 'Selection'.\n" +" Liste des options, spécifié par une expression python, définition une liste de paires de (clé, valeur). Par exemple : [('blue','Blue'), ('yellow','Yellow')]" #. module: bi_sql_editor #: help:bi.sql.view,model_name:0 msgid "Full Qualified Name of the transient model that will be created." -msgstr "" +msgstr "Nom complet du modèle transiant qui sera créé." #. module: bi_sql_editor #: help:bi.sql.view,view_name:0 msgid "Full name of the SQL view" -msgstr "" +msgstr "Nom complet de la vue SQL" #. module: bi_sql_editor #: field:bi.sql.view.field,graph_type:0 msgid "Graph Type" -msgstr "" +msgstr "Type de Graphe" #. module: bi_sql_editor #: selection:bi.sql.view,state:0 msgid "Graph, action and Menu Created" -msgstr "" +msgstr "Graphique, Action et Menu créés" #. module: bi_sql_editor #: field:bi.sql.view,has_group_changed:0 msgid "Has group changed" -msgstr "" +msgstr "A un changement de groupe" #. module: bi_sql_editor -#: field:bi.sql.view,id:0 field:bi.sql.view.field,id:0 +#: selection:bi.sql.view.field,tree_visibility:0 +msgid "Hidden" +msgstr "Caché" + +#. module: bi_sql_editor +#: field:bi.sql.view,id:0 +#: field:bi.sql.view.field,id:0 msgid "ID" msgstr "ID" @@ -195,42 +205,45 @@ msgstr "Nom de l'index" #. module: bi_sql_editor #: field:bi.sql.view.field,is_group_by:0 msgid "Is Group by" -msgstr "" +msgstr "Est 'Grouper Par'" #. module: bi_sql_editor #: field:bi.sql.view.field,is_index:0 msgid "Is Index" -msgstr "" +msgstr "Est un index" #. module: bi_sql_editor #: field:bi.sql.view,is_materialized:0 msgid "Is Materialized View" -msgstr "" +msgstr "Est une vue matérialisée" #. module: bi_sql_editor -#: field:bi.sql.view,__last_update:0 field:bi.sql.view.field,__last_update:0 +#: field:bi.sql.view,__last_update:0 +#: field:bi.sql.view.field,__last_update:0 msgid "Last Modified on" msgstr "Dernière modification le" #. module: bi_sql_editor -#: field:bi.sql.view,write_uid:0 field:bi.sql.view.field,write_uid:0 +#: field:bi.sql.view,write_uid:0 +#: field:bi.sql.view.field,write_uid:0 msgid "Last Updated by" msgstr "Dernière mise à jour par" #. module: bi_sql_editor -#: field:bi.sql.view,write_date:0 field:bi.sql.view.field,write_date:0 +#: field:bi.sql.view,write_date:0 +#: field:bi.sql.view.field,write_date:0 msgid "Last Updated on" msgstr "Dernière mise à jour le" #. module: bi_sql_editor #: field:bi.sql.view,materialized_text:0 msgid "Materialized text" -msgstr "" +msgstr "Materialized text" #. module: bi_sql_editor #: selection:bi.sql.view.field,graph_type:0 msgid "Measure" -msgstr "" +msgstr "Mesure" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form @@ -244,57 +257,63 @@ msgid "Model Name" msgstr "Nom du modèle" #. module: bi_sql_editor -#: field:bi.sql.view,name:0 field:bi.sql.view.field,name:0 +#: field:bi.sql.view,name:0 +#: field:bi.sql.view.field,name:0 msgid "Name" msgstr "Nom" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:475 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:497 #, python-format -msgid "" -"No Column was found.\n" +msgid "No Column was found.\n" "Columns name should be prefixed by 'x_'." -msgstr "" +msgstr "Aucune colonne n'a été trouvée.\n" +"Les noms de colonnes doivent être préfixés par 'x_'." #. module: bi_sql_editor #: field:bi.sql.view,action_id:0 msgid "Odoo Action" -msgstr "" +msgstr "Action Odoo" #. module: bi_sql_editor #: field:bi.sql.view,cron_id:0 msgid "Odoo Cron" -msgstr "" +msgstr "Cron Odoo" #. module: bi_sql_editor #: field:bi.sql.view,graph_view_id:0 msgid "Odoo Graph View" -msgstr "" +msgstr "Vue graphique Odoo" #. module: bi_sql_editor #: field:bi.sql.view,menu_id:0 msgid "Odoo Menu" -msgstr "" +msgstr "Menu Odoo" #. module: bi_sql_editor #: field:bi.sql.view,model_id:0 msgid "Odoo Model" -msgstr "" +msgstr "Modèle Odoo" #. module: bi_sql_editor #: field:bi.sql.view,rule_id:0 msgid "Odoo Rule" -msgstr "" +msgstr "Odoo Rule" #. module: bi_sql_editor #: field:bi.sql.view,search_view_id:0 msgid "Odoo Search View" -msgstr "" +msgstr "Vue de recherche Odoo" + +#. module: bi_sql_editor +#: field:bi.sql.view,tree_view_id:0 +msgid "Odoo Tree View" +msgstr "Vue Liste Odoo" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Open View" -msgstr "" +msgstr "Ouvrir la vue" #. module: bi_sql_editor #: field:bi.sql.view,query:0 @@ -304,66 +323,68 @@ msgstr "Requête" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Refresh Materialized View" -msgstr "" +msgstr "Rafraichir la vue matérialisée" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:263 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:270 #, python-format msgid "Refresh Materialized View %s" -msgstr "" +msgstr "Rafraichir la vue matérialisée %s" #. module: bi_sql_editor #: selection:bi.sql.view.field,graph_type:0 msgid "Row" -msgstr "" +msgstr "Ligne" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Rule Definition" -msgstr "" +msgstr "Définition de règle" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:358 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:380 #, python-format -msgid "" -"SQL Error while creating %s VIEW %s :\n" +msgid "SQL Error while creating %s VIEW %s :\n" +" %s" +msgstr "Erreur SQL lors de la création de %s VIEW %s :\n" " %s" -msgstr "" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form #: field:bi.sql.view,bi_sql_view_field_ids:0 msgid "SQL Fields" -msgstr "" +msgstr "Champs SQL" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "SQL Query" -msgstr "" +msgstr "Requête SQL" #. module: bi_sql_editor #: model:ir.ui.menu,name:bi_sql_editor.menu_bi_sql_editor msgid "SQL Reports" -msgstr "" +msgstr "SQL Reports" #. module: bi_sql_editor #: help:bi.sql.view,query:0 -msgid "" -"SQL Request that will be inserted as the view. Take care to :\n" +msgid "SQL Request that will be inserted as the view. Take care to :\n" " * set a name for all your selected fields, specially if you use SQL function (like EXTRACT, ...);\n" " * Do not use 'SELECT *' or 'SELECT table.*';\n" " * prefix the name of the selectable columns by 'x_';" -msgstr "" +msgstr "Requête SQL qui sera insérée dans la vue SQL. Faire attention à :\n" +" * Mettre un nom (AS) pour tous les champs à afficher, spécialement si vous utilisez des fonctions SQL (comme EXTRACT, ...);\n" +" * Ne pas utiliser 'SELECT *' ou 'SELECT table.*';\n" +" * Préfixer le nom des colonnes à afficher par 'x_';" #. module: bi_sql_editor #: field:bi.sql.view.field,sql_type:0 msgid "SQL Type" -msgstr "" +msgstr "Type SQL" #. module: bi_sql_editor #: help:bi.sql.view.field,sql_type:0 msgid "SQL Type in the database" -msgstr "" +msgstr "Type SQL dans la base de données" #. module: bi_sql_editor #: selection:bi.sql.view,state:0 @@ -373,18 +394,18 @@ msgstr "SQL Validé" #. module: bi_sql_editor #: field:bi.sql.view.field,bi_sql_view_id:0 msgid "SQL View" -msgstr "" +msgstr "Vue SQL" #. module: bi_sql_editor #: selection:bi.sql.view,state:0 msgid "SQL View and Model Created" -msgstr "" +msgstr "Vue SQL et Modèle créés" #. module: bi_sql_editor #: model:ir.actions.act_window,name:bi_sql_editor.action_bi_sql_view #: model:ir.ui.menu,name:bi_sql_editor.menu_bi_sql_view msgid "SQL Views" -msgstr "" +msgstr "Vues SQL" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form @@ -394,7 +415,7 @@ msgstr "Sécurité" #. module: bi_sql_editor #: field:bi.sql.view.field,selection:0 msgid "Selection Options" -msgstr "" +msgstr "Options de Sélection" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form @@ -404,32 +425,26 @@ msgstr "Remettre en brouillon" #. module: bi_sql_editor #: help:bi.sql.view,size:0 msgid "Size of the materialized view and its indexes" -msgstr "" +msgstr "Taille de la vue matérialisée et de ses index" #. module: bi_sql_editor #: field:bi.sql.view,state:0 msgid "State" -msgstr "Status" +msgstr "Statut" #. module: bi_sql_editor #: help:bi.sql.view,state:0 -msgid "" -"State of the Request:\n" +msgid "State of the Request:\n" " * 'Draft': Not tested\n" " * 'SQL Valid': SQL Request has been checked and is valid" -msgstr "" -"Etat de la requête:\n" +msgstr "Etat de la requête:\n" " * 'En brouillon': non testée\n" " * 'SQL Validé': La requête SQL a été vérifiée et est valide" #. module: bi_sql_editor #: help:bi.sql.view,technical_name:0 -msgid "" -"Suffix of the SQL view. (SQL full name will be computed and prefixed by " -"'x_bi_sql_view_'. Should have correctsyntax. For more information, see " -"https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-" -"SYNTAX-IDENTIFIERS" -msgstr "" +msgid "Suffix of the SQL view. (SQL full name will be computed and prefixed by 'x_bi_sql_view_'. Should have correctsyntax. For more information, see https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS" +msgstr "Suffixe de la requête SQL. (Le nom complet de la requête SQL sera calculé et préfixé par 'x_bi_sql_view_'. Should have correctsyntax. Pour plus d'information voir, https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS" #. module: bi_sql_editor #: field:bi.sql.view,technical_name:0 @@ -439,113 +454,117 @@ msgstr "Nom technique" #. module: bi_sql_editor #: help:bi.sql.view.field,field_description:0 msgid "This will be used as the name of the Odoo field, displayed for users" -msgstr "" +msgstr "Cette valeur sera utilisée comme nom du champ odoo et sera affichée aux utilisateurs" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "This will create Odoo View, Action and Menu" -msgstr "" +msgstr "Cela va créer une vue Odoo, une action et un menu" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form -msgid "" -"This will try to create an SQL View, based on the SQL request and the " -"according Transient Model and fields, based on settings" -msgstr "" +msgid "This will try to create an SQL View, based on the SQL request and the according Transient Model and fields, based on settings" +msgstr "Cela va créer une vue SQL, basée sur la requête SQL et va créer le modèle transiant correspondant et les champs, basés sur le paramétrage" + +#. module: bi_sql_editor +#: field:bi.sql.view.field,tree_visibility:0 +msgid "Tree Visibility" +msgstr "Visibilité dans la liste" #. module: bi_sql_editor #: help:bi.sql.view.field,ttype:0 -msgid "" -"Type of the Odoo field that will be created. Let empty if you don't want to " -"create a new field. If empty, this field will not be displayed neither " -"available for search or group by function" -msgstr "" +msgid "Type of the Odoo field that will be created. Let empty if you don't want to create a new field. If empty, this field will not be displayed neither available for search or group by function" +msgstr "Type du champ odoo qui sera créé. laisser vide si vous ne voulez pas créer un nouveau champ. Si la valeur est vide, le champ ne sera ni affiché, ni disponible pour les fonctions de rechercher ou de regroupement" + +#. module: bi_sql_editor +#: selection:bi.sql.view.field,tree_visibility:0 +msgid "Unavailable" +msgstr "Indisponible" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form -msgid "" -"Update Model Access. Required if you changed groups list after having " -"created the model" -msgstr "" +msgid "Update Model Access. Required if you changed groups list after having created the model" +msgstr "Mettre à jour l'accès au modèle. Requis si vous changez la liste de groupes, après avoir créer le modèle" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Update Model Acess" -msgstr "" +msgstr "Mettre à jour les accès au modèle" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "User Interface" -msgstr "" +msgstr "Interface utilisateur" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "Validate SQL Expression" -msgstr "" +msgstr "Valider l'expression SQL" #. module: bi_sql_editor #: field:bi.sql.view,view_name:0 msgid "View Name" -msgstr "" +msgstr "Nom de la vue" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:161 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:165 #, python-format msgid "You can only process this action on SQL Valid items" -msgstr "" +msgstr "Vous pouvez seulement réaliser cette action sur des items SQL valides" #. module: bi_sql_editor -#: code:addons/bi_sql_editor/models/bi_sql_view.py:143 +#: code:addons/bi_sql_editor/models/bi_sql_view.py:147 #, python-format msgid "You can only unlink draft views" -msgstr "" +msgstr "Vous pouvez seulement supprimer des vues en brouillon" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "boolean" -msgstr "" +msgstr "boolean" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "char" -msgstr "" +msgstr "char" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "date" -msgstr "" +msgstr "date" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "datetime" -msgstr "" +msgstr "datetime" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "float" -msgstr "" +msgstr "float" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "integer" -msgstr "" +msgstr "integer" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "many2one" -msgstr "" +msgstr "many2one" #. module: bi_sql_editor #: selection:bi.sql.view.field,ttype:0 msgid "selection" -msgstr "" +msgstr "selection" #. module: bi_sql_editor #: field:bi.sql.view.field,sequence:0 msgid "sequence" -msgstr "" +msgstr "sequence" #. module: bi_sql_editor #: view:bi.sql.view:bi_sql_editor.view_bi_sql_view_form msgid "this will refresh the materialized view" -msgstr "" +msgstr "Cela va rafraichir la vue matérialisée" + diff --git a/bi_sql_editor/models/bi_sql_view.py b/bi_sql_editor/models/bi_sql_view.py index e29133d2..685276a5 100644 --- a/bi_sql_editor/models/bi_sql_view.py +++ b/bi_sql_editor/models/bi_sql_view.py @@ -4,6 +4,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import logging +from datetime import datetime from psycopg2 import ProgrammingError from openerp import _, api, fields, models, SUPERUSER_ID @@ -86,6 +87,9 @@ class BiSQLView(models.Model): model_id = fields.Many2one( string='Odoo Model', comodel_name='ir.model', readonly=True) + tree_view_id = fields.Many2one( + string='Odoo Tree View', comodel_name='ir.ui.view', readonly=True) + graph_view_id = fields.Many2one( string='Odoo Graph View', comodel_name='ir.ui.view', readonly=True) @@ -186,8 +190,10 @@ class BiSQLView(models.Model): # Drop ORM sql_view._drop_model_and_fields() + sql_view.tree_view_id.unlink() sql_view.graph_view_id.unlink() sql_view.pivot_view_id.unlink() + sql_view.search_view_id.unlink() sql_view.action_id.unlink() sql_view.menu_id.unlink() sql_view.rule_id.unlink() @@ -197,6 +203,8 @@ class BiSQLView(models.Model): @api.multi def button_create_ui(self): + self.tree_view_id = self.env['ir.ui.view'].create( + self._prepare_tree_view()).id self.graph_view_id = self.env['ir.ui.view'].create( self._prepare_graph_view()).id self.pivot_view_id = self.env['ir.ui.view'].create( @@ -225,8 +233,7 @@ class BiSQLView(models.Model): 'type': 'ir.actions.act_window', 'res_model': self.model_id.model, 'search_view_id': self.search_view_id.id, - 'view_type': 'form', - 'view_mode': 'graph,pivot', + 'view_mode': 'graph,pivot,tree', } # Prepare Function @@ -282,6 +289,21 @@ class BiSQLView(models.Model): 'global': True, } + @api.multi + def _prepare_tree_view(self): + self.ensure_one() + return { + 'name': self.name, + 'type': 'tree', + 'model': self.model_id.model, + 'arch': + """""" + """{}""" + """""".format("".join( + [x._prepare_tree_field() + for x in self.bi_sql_view_field_ids])) + } + @api.multi def _prepare_graph_view(self): self.ensure_one() @@ -339,8 +361,8 @@ class BiSQLView(models.Model): 'name': self.name, 'res_model': self.model_id.model, 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'graph,pivot', + 'view_mode': 'graph,pivot,tree', + 'view_id': self.graph_view_id.id, 'search_view_id': self.search_view_id.id, } @@ -504,6 +526,12 @@ class BiSQLView(models.Model): sql_view.materialized_text, sql_view.view_name) self._log_execute(req) sql_view._refresh_size() + if sql_view.action_id: + # Alter name of the action, to display last refresh datetime + # of the materialized view + sql_view.action_id.name = "%s (%s)" % ( + self.name, + datetime.utcnow().strftime(_("%m/%d/%Y %H:%M:%S UTC"))) @api.multi def _refresh_size(self): diff --git a/bi_sql_editor/models/bi_sql_view_field.py b/bi_sql_editor/models/bi_sql_view_field.py index 533674b7..5c464e13 100644 --- a/bi_sql_editor/models/bi_sql_view_field.py +++ b/bi_sql_editor/models/bi_sql_view_field.py @@ -29,6 +29,12 @@ class BiSQLViewField(models.Model): ('measure', 'Measure'), ] + _TREE_VISIBILITY_SELECTION = [ + ('unavailable', 'Unavailable'), + ('hidden', 'Hidden'), + ('available', 'Available'), + ] + # Mapping to guess Odoo field type, from SQL column type _SQL_MAPPING = { 'boolean': 'boolean', @@ -68,6 +74,10 @@ class BiSQLViewField(models.Model): graph_type = fields.Selection( string='Graph Type', selection=_GRAPH_TYPE_SELECTION) + tree_visibility = fields.Selection( + string='Tree Visibility', selection=_TREE_VISIBILITY_SELECTION, + default='available', required=True) + field_description = fields.Char( string='Field Description', help="This will be used as the name" " of the Odoo field, displayed for users") @@ -164,8 +174,20 @@ class BiSQLViewField(models.Model): 'selection': self.ttype == 'selection' and self.selection or False, 'relation': self.ttype == 'many2one' and self.many2one_model_id.model or False, + 'tree_visibility': self.field_description and + 'available' or 'unavailable', } + @api.multi + def _prepare_tree_field(self): + self.ensure_one() + res = '' + if self.field_description and self.tree_visibility != 'unavailable': + res = """""".format( + self.name, + self.tree_visibility == 'hidden' and 'invisible="1"' or '') + return res + @api.multi def _prepare_graph_field(self): self.ensure_one() diff --git a/bi_sql_editor/static/description/06_action_datetime_name.png b/bi_sql_editor/static/description/06_action_datetime_name.png new file mode 100644 index 0000000000000000000000000000000000000000..354994e52dde7478571eb6367af4079585ab3b22 GIT binary patch literal 13714 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 bi.sql.view - + @@ -28,8 +28,7 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). string="Validate SQL Expression" class="oe_highlight"/>