[ADD] ADD query_deluxe

This commit is contained in:
zainab8585 2024-09-11 11:40:05 +02:00
parent 1520d33301
commit 612f2de8e2
26 changed files with 1129 additions and 0 deletions

View File

@ -0,0 +1,3 @@
from . import wizard
from . import report
from . import models

View File

@ -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']
}

View File

@ -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 &lt;= '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>

View File

@ -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

View File

@ -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}"

View File

@ -0,0 +1 @@
from . import query_deluxe

View File

@ -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("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
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)

View File

@ -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>

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_querydeluxe querydeluxe access query_deluxe.model_querydeluxe query_deluxe.group_query_deluxe 1 1 1 1
3 access_pdforientation pdforientation access query_deluxe.model_pdforientation query_deluxe.group_query_deluxe 1 1 1 1
4 access_tipsqueries tipsqueries access query_deluxe.model_tipsqueries query_deluxe.group_query_deluxe 1 1 1 1

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

View File

@ -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>

View File

@ -0,0 +1 @@
from . import pdforientation

View File

@ -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)

View File

@ -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>