[ADD] ADD query_deluxe
|
|
@ -0,0 +1,3 @@
|
||||||
|
from . import wizard
|
||||||
|
from . import report
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
'name': 'PostgreSQL Query Deluxe',
|
||||||
|
'description': 'Execute postgreSQL query into Odoo interface',
|
||||||
|
'author': 'Yvan Dotet',
|
||||||
|
'depends': ['base', 'mail'],
|
||||||
|
'application': True,
|
||||||
|
'version': '14.0.1.0.4',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'support': 'yvandotet@yahoo.fr',
|
||||||
|
'website': 'https://github.com/YvanDotet/query_deluxe/',
|
||||||
|
'installable': True,
|
||||||
|
|
||||||
|
'data': [
|
||||||
|
'security/security.xml',
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
|
||||||
|
'views/query_deluxe_views.xml',
|
||||||
|
|
||||||
|
'wizard/pdforientation.xml',
|
||||||
|
|
||||||
|
'report/print_pdf.xml',
|
||||||
|
|
||||||
|
'datas/data.xml'
|
||||||
|
],
|
||||||
|
|
||||||
|
'images': ['static/description/banner.gif']
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="select_res_partner" model="tipsqueries">
|
||||||
|
<field name="name">SELECT name,phone,email FROM res_partner;</field>
|
||||||
|
<field name="description">Display all the records of res.partner's model, with name, phone and email attributes.</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_pg_catalog_pg_table" model="tipsqueries">
|
||||||
|
<field name="name">SELECT * FROM pg_catalog.pg_tables;</field>
|
||||||
|
<field name="description">Display all the tables inside that database</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_datname_pg_database" model="tipsqueries">
|
||||||
|
<field name="name">SELECT datname FROM pg_database;</field>
|
||||||
|
<field name="description">List of all the databases inside that postgreSQL</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_pg_user" model="tipsqueries">
|
||||||
|
<field name="name">SELECT * FROM pg_user;</field>
|
||||||
|
<field name="description">List of all the users using that postgreSQL</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_versions" model="tipsqueries">
|
||||||
|
<field name="name">SELECT version();</field>
|
||||||
|
<field name="description">The version of that postgreSQL</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_sale_order" model="tipsqueries">
|
||||||
|
<field name="name">SELECT * FROM sale_order WHERE partner_id IN (SELECT id FROM res_partner WHERE name ILIKE '%Johnson%') LIMIT 5;</field>
|
||||||
|
<field name="description">Show only the 5 first records of sale.order's model where their client have 'Johnson' in their name</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="with_product_table" model="tipsqueries">
|
||||||
|
<field name="name">
|
||||||
|
WITH temporary_table AS (
|
||||||
|
SELECT pt.id AS pt_id, pp.id AS pp_id
|
||||||
|
FROM product_template pt
|
||||||
|
LEFT JOIN product_product pp
|
||||||
|
ON pp.product_tmpl_id = pt.id
|
||||||
|
)
|
||||||
|
SELECT * FROM temporary_table ORDER BY pt_id;
|
||||||
|
</field>
|
||||||
|
<field name="description">Associate each product template with their product variant</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="update_res_users_password" model="tipsqueries">
|
||||||
|
<field name="name">UPDATE res_users SET password = 'my_45_password' WHERE id = 10;</field>
|
||||||
|
<field name="description">Modify the password to 'my_45_password' for the user with id = 10</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="update_res_partner_email" model="tipsqueries">
|
||||||
|
<field name="name">UPDATE res_partner AS a SET email = CONCAT(a.name,'@company_mail.com');</field>
|
||||||
|
<field name="description">Modify all the email of the contact within the rule 'name of the contact'+'@company_mail.com'</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="delete_sale_order" model="tipsqueries">
|
||||||
|
<field name="name">DELETE FROM sale_order WHERE write_date <= '2017-12-31'::date;</field>
|
||||||
|
<field name="description">Delete old sale_orders that was last modified before the 2018 year</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="select_res_partner_inner_join_sale_order" model="tipsqueries">
|
||||||
|
<field name="name">SELECT a.name,b.name FROM res_partner a INNER JOIN sale_order b ON a.id=b.partner_id;</field>
|
||||||
|
<field name="description">Select the clients linked with their sales orders</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="create_table_mytable" model="tipsqueries">
|
||||||
|
<field name="name">CREATE TABLE mytable ( id Integer , name char(10) , description char(40) );</field>
|
||||||
|
<field name="description">Create a table 'mytable' with a column for id,name and description</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="insert_into_mytable" model="tipsqueries">
|
||||||
|
<field name="name">INSERT INTO mytable VALUES ( 30 , 'first rec' , 'this is a the first record' );</field>
|
||||||
|
<field name="description">Insert row in the table 'mytable' with the corresponding column and type</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="alter_database_rename" model="tipsqueries">
|
||||||
|
<field name="name">ALTER DATABASE mycurrentdatabasename RENAME TO newnamefordatabase;</field>
|
||||||
|
<field name="description">Give a new name to a database</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="drop_table_mytable" model="tipsqueries">
|
||||||
|
<field name="name">DROP TABLE mytable;</field>
|
||||||
|
<field name="description">Drop the table 'mytable'</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
==============
|
||||||
|
query_deluxe
|
||||||
|
==============
|
||||||
|
|
||||||
|
This module is usefull to make postgreSQL's queries directly from an Odoo interface.
|
||||||
|
|
||||||
|
You can type queries involving SELECT statement and many clauses like WHERE, AND, etc ...
|
||||||
|
|
||||||
|
The result is correctly presented in a table form.
|
||||||
|
|
||||||
|
You can also make UPDATE, DELETE, CREATE, INSERT, ALTER and DROP statements.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
Go to "Apps" menu and type "query_deluxe" into the search box.
|
||||||
|
|
||||||
|
Odoo version 14
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Authors
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Yvan Dotet
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
* This module is maintained by Yvan Dotet.
|
||||||
|
|
||||||
|
Contact
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Mail address of Yvan Dotet : Yvandotet@yahoo.fr
|
||||||
|
* website :
|
||||||
|
1) https://github.com/YvanDotet/query_deluxe
|
||||||
|
2) https://be.linkedin.com/in/yvan-dotet-19ba67135
|
||||||
|
|
@ -0,0 +1,493 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * query_deluxe
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0+e\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2022-11-17 19:50+0000\n"
|
||||||
|
"PO-Revision-Date: 2022-11-17 19:50+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"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:res.groups,name:query_deluxe.group_query_deluxe
|
||||||
|
msgid "Access query_deluxe"
|
||||||
|
msgstr "Accès query_deluxe"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_needaction
|
||||||
|
msgid "Action Needed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_ids
|
||||||
|
msgid "Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_exception_decoration
|
||||||
|
msgid "Activity Exception Decoration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_state
|
||||||
|
msgid "Activity State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_type_icon
|
||||||
|
msgid "Activity Type Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.with_product_table
|
||||||
|
msgid "Associate each product template with their product variant"
|
||||||
|
msgstr "Associe chaque produit template avec leurs produits variants"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_attachment_count
|
||||||
|
msgid "Attachment Count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.pdforientation_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annuler"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Copy"
|
||||||
|
msgstr "Copier"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.create_table_mytable
|
||||||
|
msgid "Create a table 'mytable' with a column for id,name and description"
|
||||||
|
msgstr ""
|
||||||
|
"Créée une table 'mytable' avec une colonne pour l'id, le nom et la "
|
||||||
|
"description"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Créé par"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__create_date
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__create_date
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Créé le"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.delete_sale_order
|
||||||
|
msgid "Delete old sale_orders that was last modified before the 2018 year"
|
||||||
|
msgstr ""
|
||||||
|
"Supprime les anciens devis qui ont été modifiés pour la dernière fois avant "
|
||||||
|
"l'année 2018"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__tips_description
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__description
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.tips_queries_view_tree
|
||||||
|
msgid "Description"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__display_name
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__display_name
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_res_partner
|
||||||
|
msgid ""
|
||||||
|
"Display all the records of res.partner's model, with name, phone and email "
|
||||||
|
"attributes."
|
||||||
|
msgstr ""
|
||||||
|
"Affiche tous les enregistrements du modèle de res.partner, avec leur noms, "
|
||||||
|
"numéros de téléphone et emails."
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_pg_catalog_pg_table
|
||||||
|
msgid "Display all the tables inside that database"
|
||||||
|
msgstr "Affiche toutes les tables de cette base de données"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.drop_table_mytable
|
||||||
|
msgid "Drop the table 'mytable'"
|
||||||
|
msgstr "Efface la table 'mytable'"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.actions.act_window,name:query_deluxe.query_deluxe_submenu_tipsqueries_action
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__tips
|
||||||
|
#: model:ir.ui.menu,name:query_deluxe.query_deluxe_submenu_tipsqueries
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Examples"
|
||||||
|
msgstr "Exemples"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Examples :"
|
||||||
|
msgstr "Exemples :"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Execute"
|
||||||
|
msgstr "Exécuter"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_follower_ids
|
||||||
|
msgid "Followers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_channel_ids
|
||||||
|
msgid "Followers (Channels)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_partner_ids
|
||||||
|
msgid "Followers (Partners)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__activity_type_icon
|
||||||
|
msgid "Font awesome icon e.g. fa-tasks"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.alter_database_rename
|
||||||
|
msgid "Give a new name to a database"
|
||||||
|
msgstr "Donne un nouveau nom à une base de données"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__html
|
||||||
|
msgid "HTML"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__id
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__id
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_exception_icon
|
||||||
|
msgid "Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__activity_exception_icon
|
||||||
|
msgid "Icon to indicate an exception activity."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_needaction
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_unread
|
||||||
|
msgid "If checked, new messages require your attention."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_has_error
|
||||||
|
msgid "If checked, some messages have a delivery error."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.insert_into_mytable
|
||||||
|
msgid ""
|
||||||
|
"Insert row in the table 'mytable' with the corresponding column and type"
|
||||||
|
msgstr ""
|
||||||
|
"Insére une ligne dans la table 'mytable' avec la colonne et le type "
|
||||||
|
"correspondants"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_is_follower
|
||||||
|
msgid "Is Follower"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: code:addons/query_deluxe/wizard/pdforientation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Landscape"
|
||||||
|
msgstr "Paysage"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation____last_update
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe____last_update
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Dernière modification le"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Dernière mise à jour par"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__write_date
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__write_date
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Dernière mise à jour le"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_datname_pg_database
|
||||||
|
msgid "List of all the databases inside that postgreSQL"
|
||||||
|
msgstr "Liste de toutes les bases de données à l'intérieur de ce postgreSQL"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_pg_user
|
||||||
|
msgid "List of all the users using that postgreSQL"
|
||||||
|
msgstr "Liste de tous les utilisateurs utilisant ce postgreSQL"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_main_attachment_id
|
||||||
|
msgid "Main Attachment"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_has_error
|
||||||
|
msgid "Message Delivery error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_ids
|
||||||
|
msgid "Messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.update_res_partner_email
|
||||||
|
msgid ""
|
||||||
|
"Modify all the email of the contact within the rule 'name of the "
|
||||||
|
"contact'+'@company_mail.com'"
|
||||||
|
msgstr ""
|
||||||
|
"Modifie tous les emails de contact avec la règle suivante : 'nom du "
|
||||||
|
"contact'+'@company_mail.com'"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.update_res_users_password
|
||||||
|
msgid "Modify the password to 'my_45_password' for the user with id = 10"
|
||||||
|
msgstr ""
|
||||||
|
"Modifie le mot de passe en 'my_45_password' pour l'utilisateur d'id = 10"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__my_activity_date_deadline
|
||||||
|
msgid "My Activity Deadline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_date_deadline
|
||||||
|
msgid "Next Activity Deadline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_summary
|
||||||
|
msgid "Next Activity Summary"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_type_id
|
||||||
|
msgid "Next Activity Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_needaction_counter
|
||||||
|
msgid "Number of Actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_has_error_counter
|
||||||
|
msgid "Number of errors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_needaction_counter
|
||||||
|
msgid "Number of messages which requires an action"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_has_error_counter
|
||||||
|
msgid "Number of messages with delivery error"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__message_unread_counter
|
||||||
|
msgid "Number of unread messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__orientation
|
||||||
|
msgid "PDF orientation"
|
||||||
|
msgstr "Orientation du PDF"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: code:addons/query_deluxe/wizard/pdforientation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Portrait"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model,name:query_deluxe.model_querydeluxe
|
||||||
|
msgid "Postgres queries from Odoo interface"
|
||||||
|
msgstr "Requête PostgreSQL depuis l'interface Odoo"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.pdforientation_form
|
||||||
|
msgid "Print"
|
||||||
|
msgstr "Imprimer"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Print PDF"
|
||||||
|
msgstr "Imprimer PDF"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.actions.act_window,name:query_deluxe.query_deluxe_submenu_querydeluxe_action
|
||||||
|
#: model:ir.ui.menu,name:query_deluxe.query_deluxe_submenu_querydeluxe
|
||||||
|
msgid "Queries"
|
||||||
|
msgstr "Requêtes"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_pdforientation__query_name
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_tipsqueries__name
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_tree
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.tips_queries_view_tree
|
||||||
|
msgid "Query"
|
||||||
|
msgstr "Requête"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Query :"
|
||||||
|
msgstr "Requête :"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.ui.menu,name:query_deluxe.query_deluxe_menu
|
||||||
|
msgid "Query Deluxe"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.actions.report,name:query_deluxe.action_print_pdf
|
||||||
|
msgid "Query result"
|
||||||
|
msgstr "Résultat de la requête"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__raw_output
|
||||||
|
msgid "Raw output"
|
||||||
|
msgstr "Données brutes"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__activity_user_id
|
||||||
|
msgid "Responsible User"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__rowcount
|
||||||
|
msgid "Rowcount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "SELECT * FROM res_partner"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.tips_queries_view_search
|
||||||
|
msgid "Search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: code:addons/query_deluxe/models/query_deluxe.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Select orientation of the PDF's result"
|
||||||
|
msgstr "Sélectionner l'orientation du PDF"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_res_partner_inner_join_sale_order
|
||||||
|
msgid "Select the clients linked with their sales orders"
|
||||||
|
msgstr "Sélectionne les clients liés à leurs devis"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model,name:query_deluxe.model_pdforientation
|
||||||
|
msgid "Select the orientation of the pdf"
|
||||||
|
msgstr "Sélectionner l'orientation du PDF"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_sale_order
|
||||||
|
msgid ""
|
||||||
|
"Show only the 5 first records of sale.order's model where their client have "
|
||||||
|
"'Johnson' in their name"
|
||||||
|
msgstr ""
|
||||||
|
"Affiche uniquement les 5 premiers enregistrements du modèle de sale.order où"
|
||||||
|
" leur client possède 'Johnson' dans leur nom"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__show_raw_output
|
||||||
|
msgid "Show the raw output of the query"
|
||||||
|
msgstr "Montrer les données brutes de la requête"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__activity_state
|
||||||
|
msgid ""
|
||||||
|
"Status based on activities\n"
|
||||||
|
"Overdue: Due date is already passed\n"
|
||||||
|
"Today: Activity date is today\n"
|
||||||
|
"Planned: Future activities."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:tipsqueries,description:query_deluxe.select_versions
|
||||||
|
msgid "The version of that postgreSQL"
|
||||||
|
msgstr "La version de ce postgreSQL"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model,name:query_deluxe.model_tipsqueries
|
||||||
|
msgid "Tips for queries"
|
||||||
|
msgstr "Conseils pour les requêtes"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model_terms:ir.ui.view,arch_db:query_deluxe.query_deluxe_view_form
|
||||||
|
msgid "Type a query"
|
||||||
|
msgstr "Ecrivez une requête"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__name
|
||||||
|
msgid "Type a query : "
|
||||||
|
msgstr "Ecrivez une requête :"
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,help:query_deluxe.field_querydeluxe__activity_exception_decoration
|
||||||
|
msgid "Type of the exception activity on record."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_unread
|
||||||
|
msgid "Unread Messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__message_unread_counter
|
||||||
|
msgid "Unread Messages Counter"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: model:ir.model.fields,field_description:query_deluxe.field_querydeluxe__valid_query_name
|
||||||
|
msgid "Valid Query Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: query_deluxe
|
||||||
|
#: code:addons/query_deluxe/models/query_deluxe.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "{0} row{1} processed"
|
||||||
|
msgstr "{0} ligne{1} traitée{1}"
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import query_deluxe
|
||||||
|
|
@ -0,0 +1,115 @@
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class QueryDeluxe(models.Model):
|
||||||
|
_name = "querydeluxe"
|
||||||
|
_description = "Postgres queries from Odoo interface"
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
|
|
||||||
|
tips = fields.Many2one('tipsqueries', string="Examples")
|
||||||
|
tips_description = fields.Text(related='tips.description')
|
||||||
|
|
||||||
|
rowcount = fields.Text(string='Rowcount')
|
||||||
|
html = fields.Html(string='HTML')
|
||||||
|
|
||||||
|
name = fields.Text(string='Type a query : ')
|
||||||
|
valid_query_name = fields.Text()
|
||||||
|
|
||||||
|
show_raw_output = fields.Boolean(string='Show the raw output of the query')
|
||||||
|
raw_output = fields.Text(string='Raw output')
|
||||||
|
|
||||||
|
def print_result(self):
|
||||||
|
self.ensure_one()
|
||||||
|
|
||||||
|
return {
|
||||||
|
'name': _("Select orientation of the PDF's result"),
|
||||||
|
'view_mode': 'form',
|
||||||
|
'res_model': 'pdforientation',
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'target': 'new',
|
||||||
|
'context': {
|
||||||
|
'default_query_name': self.valid_query_name
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def copy_query(self):
|
||||||
|
self.ensure_one()
|
||||||
|
|
||||||
|
if self.tips:
|
||||||
|
self.name = self.tips.name
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
self = self.sudo()
|
||||||
|
self.ensure_one()
|
||||||
|
|
||||||
|
self.show_raw_output = False
|
||||||
|
self.raw_output = ''
|
||||||
|
|
||||||
|
self.rowcount = ''
|
||||||
|
self.html = '<br></br>'
|
||||||
|
|
||||||
|
self.valid_query_name = ''
|
||||||
|
|
||||||
|
if self.name:
|
||||||
|
self.tips = False
|
||||||
|
self.message_post(body=str(self.name))
|
||||||
|
|
||||||
|
headers = []
|
||||||
|
datas = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.env.cr.execute(self.name)
|
||||||
|
except Exception as e:
|
||||||
|
raise UserError(e)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.env.cr.description:
|
||||||
|
headers = [d[0] for d in self.env.cr.description]
|
||||||
|
datas = self.env.cr.fetchall()
|
||||||
|
except Exception as e:
|
||||||
|
raise UserError(e)
|
||||||
|
|
||||||
|
rowcount = self.env.cr.rowcount
|
||||||
|
self.rowcount = _("{0} row{1} processed").format(rowcount, 's' if 1 < rowcount else '')
|
||||||
|
|
||||||
|
if headers and datas:
|
||||||
|
self.valid_query_name = self.name
|
||||||
|
self.raw_output = datas
|
||||||
|
|
||||||
|
header_html = "<tr style='background-color: lightgrey'> <th style='background-color:white'/>"
|
||||||
|
header_html += "".join(["<th style='border: 1px solid black'>" + str(header) + "</th>" for header in headers])
|
||||||
|
header_html += "</tr>"
|
||||||
|
|
||||||
|
body_html = ""
|
||||||
|
i = 0
|
||||||
|
for data in datas:
|
||||||
|
i += 1
|
||||||
|
body_line = "<tr style='background-color: {0}'> <td style='border-right: 3px double; border-bottom: 1px solid black; background-color: yellow'>{1}</td>".format('cyan' if i%2 == 0 else 'white', i)
|
||||||
|
for value in data:
|
||||||
|
display_value = ''
|
||||||
|
if value is not None:
|
||||||
|
display_value = str(value).replace("&", "&").replace("<", "<").replace(">", ">")
|
||||||
|
body_line += "<td style='border: 1px solid black'>{0}</td>".format(display_value)
|
||||||
|
body_line += "</tr>"
|
||||||
|
body_html += body_line
|
||||||
|
|
||||||
|
self.html = """
|
||||||
|
<table style="text-align: center">
|
||||||
|
<thead>
|
||||||
|
{0}
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{1}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
""".format(header_html, body_html)
|
||||||
|
|
||||||
|
|
||||||
|
class TipsQueries(models.Model):
|
||||||
|
_name = 'tipsqueries'
|
||||||
|
_description = "Tips for queries"
|
||||||
|
|
||||||
|
name = fields.Text(string='Query', required=True)
|
||||||
|
description = fields.Text(string="Description", translate=True)
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
<template id="pdf">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<!-- <div class="header"/>-->
|
||||||
|
|
||||||
|
<div class="article">
|
||||||
|
<div style="text-align:center">
|
||||||
|
<t t-esc="query_name"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<table style="text-align: center">
|
||||||
|
<thead style="background-color: lightgrey">
|
||||||
|
<tr>
|
||||||
|
<th style='background-color:white'/>
|
||||||
|
|
||||||
|
<t t-foreach="headers" t-as="header">
|
||||||
|
<th style='border: 1px solid black'>
|
||||||
|
<t t-esc="str(header)"/>
|
||||||
|
</th>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<t t-foreach="bodies" t-as="body">
|
||||||
|
<tr t-att-style="'background-color: {0}'.format('cyan' if body_index%2==1 else 'white')">
|
||||||
|
<td style='border-right: 3px double; border-bottom: 1px solid black; background-color: yellow'>
|
||||||
|
<t t-esc="1+body_index"/>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<t t-foreach="body" t-as="value">
|
||||||
|
<td style="border: 1px solid black">
|
||||||
|
<t t-esc="str(value) if (value is not None) else ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
</t>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div class="footer"/>-->
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<record id="paperformat" model="report.paperformat">
|
||||||
|
<field name="name">Paperformat query deluxe</field>
|
||||||
|
<field name="default" eval="False"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Landscape</field>
|
||||||
|
<field name="margin_top">3</field>
|
||||||
|
<field name="margin_bottom">3</field>
|
||||||
|
<field name="margin_left">3</field>
|
||||||
|
<field name="margin_right">3</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">3</field>
|
||||||
|
<field name="dpi">80</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_print_pdf" model="ir.actions.report">
|
||||||
|
<field name="name">Query result</field>
|
||||||
|
<field name="model">pdforientation</field>
|
||||||
|
<field name="report_name">query_deluxe.pdf</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="paperformat_id" ref="query_deluxe.paperformat"/>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_querydeluxe,querydeluxe access,query_deluxe.model_querydeluxe,query_deluxe.group_query_deluxe,1,1,1,1
|
||||||
|
access_pdforientation,pdforientation access,query_deluxe.model_pdforientation,query_deluxe.group_query_deluxe,1,1,1,1
|
||||||
|
access_tipsqueries,tipsqueries access,query_deluxe.model_tipsqueries,query_deluxe.group_query_deluxe,1,1,1,1
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo noupdate="1">
|
||||||
|
<record id="group_query_deluxe" model="res.groups">
|
||||||
|
<field name="name">Access query_deluxe</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="base.group_system" model="res.groups">
|
||||||
|
<field name="implied_ids" eval="[(4, ref('query_deluxe.group_query_deluxe'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="base.group_erp_manager" model="res.groups">
|
||||||
|
<field name="implied_ids" eval="[(4, ref('query_deluxe.group_query_deluxe'))]"/>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
After Width: | Height: | Size: 9.2 MiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 762 KiB |
|
After Width: | Height: | Size: 204 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
|
@ -0,0 +1,100 @@
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row">
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="example_query.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B;">The complete app for making easy queries in PostgreSQL</h2>
|
||||||
|
<h3 class="oe_slogan">Explore your PostgreSQL database with query into an Odoo interface</h3>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="simple_query.png">
|
||||||
|
</div>
|
||||||
|
<p class="oe_mb32" style="margin-left:48px;">
|
||||||
|
You can use SELECT, UPDATE, DELETE, CREATE, INSERT, ALTER and DROP statements.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B;">Find examples </h2>
|
||||||
|
<h3 class="oe_slogan">Remember useful queries</h3>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="find_example.png">
|
||||||
|
</div>
|
||||||
|
<div class="oe_span6 text-justify oe_mt32">
|
||||||
|
<span class="fa fa-search fa-2x pull-left"/>
|
||||||
|
<p class="oe_mb32" style="margin-left:48px;">
|
||||||
|
Get a description of what the query does.
|
||||||
|
</p>
|
||||||
|
<!--
|
||||||
|
<span class="fa fa-sliders fa-2x pull-left"/>
|
||||||
|
<p class="oe_mb32" style="margin-left:48px;">
|
||||||
|
Design custom dashboards to get a picture of your business at a glance.
|
||||||
|
</p>
|
||||||
|
<span class="fa fa-bar-chart fa-2x pull-left"></span>
|
||||||
|
<p>
|
||||||
|
Dig deeper with real-time reports and flow charts that anyone can create and share.
|
||||||
|
</p>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="copy_query.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B;">Memorize your own example</h2>
|
||||||
|
<h3 class="oe_slogan">Save repetitive query</h3>
|
||||||
|
<div class="oe_span12">
|
||||||
|
<p class="oe_mt32 oe_mb32 text-justify">
|
||||||
|
You can store your own query to re-use it quickly.
|
||||||
|
</p>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="own_example.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="oe_span12">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B; text-align: left;">Print your result</h2>
|
||||||
|
<h3 class="oe_slogan" style="text-align: left;">PDF format</h3>
|
||||||
|
<p class="oe_mt32">
|
||||||
|
Print your table's result in a PDF format, <b>landscape</b> or <b>portrait</b> orientation.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="print_pdf.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="pdf.png"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan" style="color:#875A7B;">History</h2>
|
||||||
|
<h3 class="oe_slogan">History of your previous queries</h3>
|
||||||
|
<div class="oe_span12">
|
||||||
|
<p class="oe_mt32 text-justify">
|
||||||
|
You can retrieve the last queries you have typed.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="oe_span12 oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="history.png"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container oe_separator">
|
||||||
|
</section>
|
||||||
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 207 KiB |
|
After Width: | Height: | Size: 287 KiB |
|
|
@ -0,0 +1,110 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
<record id="query_deluxe_view_tree" model="ir.ui.view">
|
||||||
|
<field name="name">Type a query tree</field>
|
||||||
|
<field name="model">querydeluxe</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="name" string="Query"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="query_deluxe_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">Type a query form</field>
|
||||||
|
<field name="model">querydeluxe</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<header>
|
||||||
|
<button name="print_result" string="Print PDF" type="object" class="oe_highlight" attrs="{'invisible':[('raw_output','in',['',[],False])]}"/>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<sheet>
|
||||||
|
<group string="Examples">
|
||||||
|
<label string="Examples :" for="tips"/>
|
||||||
|
<div class="o_row">
|
||||||
|
<field name="tips" widget="selection"/>
|
||||||
|
<button name="copy_query" type="object" class="btn-danger" string="Copy" attrs="{'invisible':[('tips','=',False)]}"/>
|
||||||
|
</div>
|
||||||
|
<field name="tips_description" attrs="{'invisible':[('tips','=',False)]}"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group string="Type a query">
|
||||||
|
<label string="Query :" for="name"/>
|
||||||
|
<div class="o_row">
|
||||||
|
<field name="name" placeholder="SELECT * FROM res_partner" style="border-bottom: 1px solid blue"/>
|
||||||
|
</div>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<button name="execute" type="object" string="Execute" class="oe_highlight"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<label string=" " for="rowcount"/>
|
||||||
|
<div class="o_row">
|
||||||
|
<field name="rowcount" readonly="1" nolabel="1"/>
|
||||||
|
</div>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="html" readonly="1" nolabel="1"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="show_raw_output"/>
|
||||||
|
<field name="raw_output" attrs="{'invisible':[('show_raw_output','=',False)]}"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids" widget="mail_followers"/>
|
||||||
|
<field name="activity_ids" widget="mail_activity"/>
|
||||||
|
<field name="message_ids" widget="mail_thread"/>
|
||||||
|
</div>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model='ir.actions.act_window' id='query_deluxe_submenu_querydeluxe_action'>
|
||||||
|
<field name="name">Queries</field>
|
||||||
|
<field name="res_model">querydeluxe</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="tips_queries_view_tree" model="ir.ui.view">
|
||||||
|
<field name="name">Memorize a query tree</field>
|
||||||
|
<field name="model">tipsqueries</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree editable="bottom">
|
||||||
|
<field name="name" string="Query"/>
|
||||||
|
<field name="description" string="Description"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="tips_queries_view_search" model="ir.ui.view">
|
||||||
|
<field name="name">Search a query</field>
|
||||||
|
<field name="model">tipsqueries</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="Search">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="description"/>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model='ir.actions.act_window' id='query_deluxe_submenu_tipsqueries_action'>
|
||||||
|
<field name="name">Examples</field>
|
||||||
|
<field name="res_model">tipsqueries</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="query_deluxe_menu" name="Query Deluxe" sequence="-1" groups="query_deluxe.group_query_deluxe" web_icon="query_deluxe,static/description/icon.png"/>
|
||||||
|
|
||||||
|
<menuitem id="query_deluxe_submenu_querydeluxe" parent="query_deluxe.query_deluxe_menu" action="query_deluxe.query_deluxe_submenu_querydeluxe_action" sequence="-1" groups="query_deluxe.group_query_deluxe"/>
|
||||||
|
<menuitem id="query_deluxe_submenu_tipsqueries" parent="query_deluxe.query_deluxe_menu" action="query_deluxe.query_deluxe_submenu_tipsqueries_action" sequence="10" groups="query_deluxe.group_query_deluxe"/>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import pdforientation
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class PdfOrientation(models.TransientModel):
|
||||||
|
_name = 'pdforientation'
|
||||||
|
_description = "Select the orientation of the pdf"
|
||||||
|
|
||||||
|
def orientation_choices(self):
|
||||||
|
return [('landscape', _('Landscape')), ('portrait', _('Portrait'))]
|
||||||
|
|
||||||
|
orientation = fields.Selection(string="PDF orientation", selection=orientation_choices, default='landscape')
|
||||||
|
query_name = fields.Text(string="Query")
|
||||||
|
|
||||||
|
def print_pdf(self):
|
||||||
|
self = self.sudo()
|
||||||
|
try:
|
||||||
|
self.env.cr.execute(self.query_name)
|
||||||
|
except Exception as e:
|
||||||
|
raise UserError(e)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.env.cr.description:
|
||||||
|
headers = [d[0] for d in self.env.cr.description]
|
||||||
|
bodies = self.env.cr.fetchall()
|
||||||
|
except Exception as e:
|
||||||
|
raise UserError(e)
|
||||||
|
|
||||||
|
action_print_pdf = self.env.ref('query_deluxe.action_print_pdf')
|
||||||
|
if self.orientation == 'landscape':
|
||||||
|
action_print_pdf.paperformat_id.orientation = "Landscape"
|
||||||
|
elif self.orientation == 'portrait':
|
||||||
|
action_print_pdf.paperformat_id.orientation = "Portrait"
|
||||||
|
|
||||||
|
append_data = {
|
||||||
|
'query_name': self.query_name,
|
||||||
|
'headers': headers,
|
||||||
|
'bodies': bodies
|
||||||
|
}
|
||||||
|
return action_print_pdf.report_action(self, data=append_data)
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
<record id="pdforientation_form" model="ir.ui.view">
|
||||||
|
<field name="name">pdforientation.form</field>
|
||||||
|
<field name="model">pdforientation</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<field name="query_name" invisible="0" readonly="1"/>
|
||||||
|
<field name="orientation" widget="radio" options="{'horizontal': true}"/>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<button string="Print" name="print_pdf" type="object" class="oe_highlight"/>
|
||||||
|
<button string="Cancel" special="cancel"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||