Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

sƔbado, 3 de octubre de 2015

Archivo Configuracion Odoo

odoo.conf for Odoo explained


In one of my previous posts Install OpenERP 7.0 from trunk I’ve written how to start your server with a start scrip just changing the ports and all other default settings. You can also start your server with a specified config file with -c command.
./server/openerp-server -c /path/to/openerp-server.conf
Here is the config file spitted  into parts for easy understanding.

Server startup config – Common options

# Admin password for creating, restoring and backing up databases
admin_passwd = admin

# default CSV separator for import and export
csv_internal_sep = ,

# to compress reports
reportgz = False

# disable loading demo data for modules to be installed (comma-separated, use "all" for all modules)
without_demo = False

# Use this for big data importation, if it crashes you will be able to continue at the current state. Provide a filename to store intermediate importation states.
import_partial = 

# file where the server pid will be stored
pidfile = None

# specify additional addons paths (separated by commas)
addons_path = /full/path/to/addons

# Comma-separated list of server-wide modules default=web
server_wide_modules = None

XML-RPC / HTTP – XML-RPC Configuration

# disable the XML-RPC protocol
xmlrpc = True

# Specify the TCP IP address for the XML-RPC protocol. The empty string binds to all interfaces.
xmlrpc_interface = 

# specify the TCP port for the XML-RPC protocol
xmlrpc_port = 8069

# Enable correct behavior when behind a reverse proxy
proxy_mode = False

XML-RPC / HTTPS – XML-RPC Secure Configuration

# disable the XML-RPC Secure protocol
xmlrpcs = True

# Specify the TCP IP address for the XML-RPC Secure protocol. The empty string binds to all interfaces.
xmlrpcs_interface = 

# specify the TCP port for the XML-RPC Secure protocol
xmlrpcs_port = 8071

# specify the certificate file for the SSL connection
secure_cert_file = server.cert

# specify the private key file for the SSL connection
secure_pkey_file = server.pkey

NET-RPC – NET-RPC Configuration

# enable the NETRPC protocol
netrpc = False

# specify the TCP IP address for the NETRPC protocol
netrpc_interface = 

# specify the TCP port for the NETRPC protocol
netrpc_port = 8070

WEB – Web interface Configuration

# Filter listed database REGEXP
dbfilter = .*

Static HTTP – Static HTTP service

# enable static HTTP service for serving plain HTML files
static_http_enable = False 

# specify the directory containing your static HTML files (e.g '/var/www/')
static_http_document_root = None

# specify the URL root prefix where you want web browsers to access your static HTML files (e.g '/')
static_http_url_prefix = None

Testing Group – Testing Configuration

# Launch a YML test file.
test_file = False

# If set, will save sample of all reports in this directory.
test_report_directory = False

# Enable YAML and unit tests.
test_enable = False

# Commit database changes performed by YAML or XML tests.
test_commit = False

Logging Group – Logging Configuration

# file where the server log will be stored
logfile = None

# do not rotate the logfile
logrotate = True

# Send the log to the syslog server
syslog = False

# setup a handler at LEVEL for a given PREFIX. An empty PREFIX indicates the root logger. This option can be repeated. Example: "openerp.orm:DEBUG" or "werkzeug:CRITICAL" (default: ":INFO")
log_handler = [':INFO']

# specify the level of the logging. Accepted values: info, debug_rpc, warn, test, critical, debug_sql, error, debug, debug_rpc_answer, notset
log_level = info

SMTP Group – SMTP Configuration

# specify the SMTP email address for sending email
email_from = False 

# specify the SMTP server for sending email
smtp_server = localhost 

# specify the SMTP port
smtp_port = 25 

# specify the SMTP server support SSL or not
smtp_ssl = False 

# specify the SMTP username for sending email
smtp_user = False

# specify the SMTP password for sending email
smtp_password = False

Database related options

# specify the database name
db_name = False

# specify the database user name
db_user = openerp

# specify the database password
db_password = False

# specify the pg executable path
pg_path = None

# specify the database host
db_host = False

# specify the database port
db_port = False

# specify the the maximum number of physical connections to posgresql
db_maxconn = 64

# specify a custom database template to create a new database
db_template = template1

Internationalisation options

translate_modules = ['all']

Security-related options

# disable the ability to return the list of databases
list_db = True

Advanced options – Advanced options

# enable debug mode
debug_mode = False

# specify reference timezone for the server (e.g. Europe/Brussels")
timezone = False

# Force a limit on the maximum number of records kept in the virtual osv_memory tables. The default is False, which means no count-based limit. 
osv_memory_count_limit = False 

# Force a limit on the maximum age of records kept in the virtual osv_memory tables. This is a decimal value expressed in hours, and the default is 1 hour.
osv_memory_age_limit = 1.0 

# Maximum number of threads processing concurrently cron jobs (default 2)
max_cron_threads = 2

# Use the unaccent function provided by the database when available.
unaccent = False

Multiprocessing options

# Specify the number of workers, 0 disable prefork mode.
workers = 0

# Maximum allowed virtual memory per worker, when reached the worker be reset after the current request (default 671088640 aka 640MB)
limit_memory_soft = 671088640

# Maximum allowed virtual memory per worker, when reached, any memory allocation will fail (default 805306368 aka 768MB)
limit_memory_hard = 805306368

# Maximum allowed CPU time per request (default 60)
limit_time_cpu = 60

# Maximum allowed Real time per request (default 120)
limit_time_real = 120

# Maximum number of request to be processed per worker (default 8192)
limit_request = 8192
There are few more options that you can find in this file
vi server/openerp/tools/config.py
You can download the config file with all comments from here
Information by : Nikola Stojanoski

viernes, 2 de octubre de 2015

Campos Seleccion Calculados en Odoo

Crear un Campo Calculado de Tipo Seleccion



Si trabajamos con campos calculados en Odoo y nos hemos enfrentado a obtener un valor de un campo Selección o Relación, observamos que en la nueva tabla el resultado es correcto obtenemos el resultado pero no tenemos la etiqueta correcta. Esto se soluciona haciendo uso del atributo "selection".

Ejemplo:
def _get_states(self, cr, uid, ids, fieldnames, args, context=None):
    res = {}
    state = 'draft'
    #### Aqui meteriamos el codigo para obtener el Estado del registro que necesitaramos #####
    return res[ids[0]] = state

lista_estados = [
                ('draft','Borrador')
                ('done','Realizado')
                ]

'state': fields.function(_get_states, type='selection',method=True,  selection=lista_estados, string="Estado"),


La misma regla aplica para los campos Relacion (Related):

lista_estados = [
                ('draft','Borrador')
                ('confirmed','Confirmado')
                ('done','Realizado')
                ('cancel','Cancelado')
                ]

'state': fields.related('invoice_id','state', type='selection',method=True,  selection=lista_estados, string="Estado"),

jueves, 24 de septiembre de 2015

Truncar y Redondear Flotantes en Python

Truncar y Redondear Flotantes en Python



    Eh creado esta entrada para mostrar estas 2 funciones muy Ćŗtiles al momento de programar con Python, cual es la diferencia entre truncar y redondear, cuando truncamos un numero bĆ”sicamente cortamos la cantidad a cierto numero de decimales sin importar si este podrĆ­a redondearse hacia arriba o hacia abajo, lo que bĆ”sicamente hacemos al redondear.

Para truncar un numero en python utilizamos la función format:

"{0:.4f}".format(12.05464897987)

# El resultado seria 12.0546
# En la expresión {0:.2f}, en el lado del # valor del diccionario indicamos
# el numero de decimales.
# Seguido del metodo format y dentro la 
# cantidad a truncar.

## Con separación de miles: ##

'{0:,.4f}'.format(o.initial_balance)

Para redondear un numero en pyhton utilizamos la función round:


round(12.05464897987,2)

# El resultado seria 12.0547
# Ejecutamos el metodo round y este recibe:
# - Cantidad
# - Numero de Decimales a redondear.

miƩrcoles, 23 de septiembre de 2015

Ejecución de Métodos en Clases Odoo desde Web Services

Como ejecutar un MƩtodo desde un Web Services Python



Anteriormente hable un poco sobre como utilizar los Web Services de Odoo desde aplicaciones externas como Python Django, ahora quiero compartir como ejecutar un método no propio del FrameWork( Create, Unlink, Copy, Search, Write, Read), si no ejecutar un metodo de una clase X, por ejemplo el método Confirmar Pedido de Venta desde una conexión Web Service Python.

La sintaxis es la siguiente:

import xmlrpclib
dbname = "Mi_Base"
username = "admin"
pwd = "admin"
sock_common = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/common')
uid = sock_common.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object')
res = sock.execute(dbname, username, pwd, 'sale.order', 'action_button_confirm', [1])
print '############ Resultado >>>>> ',res
print " Ejecución Finalizada ... "

    Como podemos observar, es necesario Indicar la Base de Datos, Usuario y ContraseƱa de admin o algĆŗn usuario con los permisos sobre la clase que vamos a trabajar y al final enfocarnos en los IDS del metodo a ejecutar, en el ejemplo anterior mande el registro 1 de la tabla sale_order.

martes, 22 de septiembre de 2015

Override Metodos Odoo

Extender Funciones en Odoo (MƩtodo Super)


    Al momento de desarrollar, muchas veces necesitamos hacer un override a un mĆ©todo de una clase heredada, esto lo podemos realizar con ayuda del metodo super propio de Python.

La estructura es la siguiente:

@api.multi
def MetodoClase(self,):
    .... Aqui mi Codigo
    return super(ClaseHeredada, self).MetodoClase()
    Primero necesitamos definir los decoradores correspondientes del MĆ©todo, posteriormente solo extender mediante el mĆ©todo super de Python, aquĆ­ puedo darles un consejo, el mĆ©todo super puede ser asignado a una variable y el orden de la variable afectara el comportamiento del mĆ©todo, en la sintaxis de arriba primero ejecutarĆ­a mi código y posterior a esto el mĆ©todo Original, si quisiĆ©ramos cambiar este orden bastarĆ­a con esto:

@api.multi
def MetodoClase(self,):
    res = super(ClaseHeredada, self).MetodoClase()
    .... Aqui mi Codigo
    return res

Ejemplo Completo de un mƩtodo Super:

# -*- encoding: utf-8 -*-
############################################################################
#    (c) 2015 German Ponce Dominguez
#    All Rights Reserved.
#    info skype: german_442 email: (german.ponce@outlook.com)
############################################################################

import itertools
from lxml import etree

from openerp import models, fields, api, _
from openerp.exceptions import except_orm, Warning, RedirectWarning
from openerp.tools import float_compare
import openerp.addons.decimal_precision as dp


class account_invoice(models.Model):
    # Inherits partner and adds invoice information in the partner form
    _inherit = 'account.invoice'

    @api.multi
    def invoice_validate(self):
        res = super(account_invoice, self).invoice_validate()
        return res

Eliminar en Link en campos Many2Many Odoo

No acceder a Campos Relacionales en un Formulario



En algunas ocasiones es necesario eliminar el link que nos da Odoo para acceder a clases relacion por medio de campos many2one, por motivos de seguridad o por necesidad, para ello solo es necesario en la definicion del campo agregar la opcion no_open, su estructura es:

<field name="campo_many2one" options="{'no_open': True}"/>


Widgets para Campos Many2Many Odoo

Widgets para Campos Many2Many Odoo



Los widgets permitidos para Odoo, con campos Many2Many son:

  1. many2many widget (Defecto)
  2. many2many_tags widget (Crea Etiquetas)
  3. many2many_checkboxes widget (Tipo Lista)
  4. many2many_kanban widget (Subvista Grafica)
  5. x2many_counter widget
  6. many2many_binary widget (Subvista para Campos binary).

many2many widget por defecto

El widget many2many  es utilizado por defecto en todos los campos many2many por estĆ”ndar Odoo crea un grid de tipo subvista (tree,form), toma como referencia la "Accion" de la Clase Heredada.
many2many widget
Opciones:
  • no_create - Elimina el Boton “Crear"
Un Ejemplo:
<field name="campo_many2many" options="{'no_create': True}"/>

many2many_tags widget

Este widget te permite seleccionar registros de la clase relación y mostrarlas en forma de etiquetas, por estÔndar solo toma el nombre del registro para mostrarlo, podemos ver este Widget en Recursos Humanos o al definir un nuevo registro de Clientes/Proveedores.
many2many_tags widget
Opciones:
  • no_quick_create - Elimina la opción de crear.
  • no_create_edit -  Elimina la opción de Crear y Editar.
    many2many_tags widget
  • no_create - no_quick_create and no_create_edit combined.
Ejemplo:
<field name="campo_many2many"
widget="many2many_tags"
options="{'no_create_edit': True}"/>

many2many_checkboxes widget

Este modulo mostrara un listado de todos los registros de la clase relacionada, solo para activar los campos que utilizaremos en nuestro registro de formulario, es muy importante destacar que en este widget no es posible crear o editar un registro.
many2many_tags widget
Ejemplo:
<field name="campo_many2many
" widget="many2many_checkboxes"/>

many2many_kanban widget

El widget many2many_kanban  te permite tener una vista de tipo kanban en cada uno de los registros insertados en nuestro Formulario.
many2many_kanban widget
Ejemplo:
<field name="campo_many2many" widget="many2many_kanban">
<kanban>
<field name="name"/>
<templates>
<t t-name="kanban-box">
<field name="name"/>
</t>
</templates>
</kanban>
</field>

x2many_counter widget

Este widget te muestra un conteo de todos los registros disponibles en la tabla o modelo relacionado, este widget tambien se puede utilizar en campos one2many.
x2many_counter widget
Ejemplo
<field name="campo_many2many" widget="x2many_counter" string="things"/>

many2many_binary widget

Este Widget te permite tener un listado de Archivos (ficheros), es exclusivo para campos relacionados con la tabla ir.attachment.
many2many_binary kanban
Ejemplo:
<field name="campo_many2many" widget="many2many_binary" string="Attach a file"/>
Fuente: http://ludwiktrammer.github.io/odoo/form-widgets-many2many-fields-options-odoo.html

martes, 8 de septiembre de 2015

Ruta Fisica de Bases de Datos PostgreSQL

¿Donde se encuentran mis BD de Postgres?

Es muy comĆŗn tener la duda acerca de la ruta de instalacion de PostgreSQL y en donde estan almacenadas mis Bases de Datos, si utilizas Ubuntu la ruta es:
  •  /var/lib/postgresql/9.4/main/
Si estas usando Windows la ruta seria:
  • C:\Program Files\PostgreSQL\9.4\main
Si necesitas la carpeta en donde se encuentran tus bases, existe dentro de esa ruta la carpeta con el nombre base:
  • /var/lib/postgresql/9.4/main/base
Si escribimos ls observarĆ­amos solo seran carpetas del tipo:

Si queremos obtener una relación sobre carpeta y base de datos que le corresponde:

  1. Entramos como superusuario de Postgres: sudo su postgres
  2. Nos conectamos al Template 1: psql template1;
  3. Ejecutamos el siguiente Script:  select datname,oid from pg_database;
El resultado anterior nos mostrara el nombre de la carpeta y a que base corresponde.

viernes, 14 de agosto de 2015

Consulta AutomƔtica de Tasa de Cambio para USD en Odoo

Consulta Tasa de Cambio USD para Odoo MƩxico

     Al trabajar con odoo en ocasiones utilizamos el esquema multimoneda y comĆŗnmente usamos Dolares (USD), en odoo es necesario ingresar manualmente el tipo de cambio diario para poder controlar las perdidas o ganancias por conversión de divisa. Últimamente eh estado estudiando la librerĆ­a PyQuery que nos permite acceder a contenidos web, muy similar a lo que nos ofrece JQuery y para aprovechar eh desarrollado un modulo para consultar la Tasa de Cambio diaria y poder insertarla automĆ”ticamente en odoo.

Primero necesitaremos tener instalada esta libreria para utilizar el modulo:
  • sudo apt-get install python-pyquery
O tambien mediante Python Pip:
  • sudo pip install pyquery

La liga del modulo:
  • https://github.com/germanponce/ps_currency_usd_default

Su uso es muy simple, este modulo crea un asistente en el catalogo de monedas de Odoo:


Al pulsar el Botón desplegara el asistente, mostrando la tasa de cambio del día de consulta:




Presionamos Insertar, para crear la tasa de cambio del dia en la moneda (USD):


Espero que les pueda ayudar un poco este modulo, por el momento solo funciona con Dolares, en un futuro espero consultar una base de datos con la conversión de todas las monedas del mundo.