Modales en Django con Vistas Basadas en Clases y Bootstrap

Vamos a hacer lo mismo que en el post anterior pero con la diferencia que ahora usaremos los modales de bootstrap, para ello ya tenemos creados nuestro proyecto "modales" y la aplicación "productos", para hacer las pruebas debemos crear un nuevo modelo llamado "proveedores":

class Proveedor(models.Model):
    ruc = models.CharField(unique=True,max_length=11)
    razon_social = models.CharField(max_length=150)
    direccion = models.CharField(max_length=200)
    telefono = models.CharField(max_length=15,null=True)
    correo = models.EmailField(null=True)
    estado = models.BooleanField(default=True)

Creamos las vistas correspondientes al listado, creación, modificación y detalle de los proveedores:

archivo: views.py

class ListadoProveedores(ListView):
    model = Proveedor
    template_name = 'proveedores.html'
    context_object_name = 'proveedores'

class CrearProveedor(CreateView):
    template_name = 'proveedor.html'
    form_class = ProveedorForm
    success_url = reverse_lazy('productos:listado_proveedores')

class ModificarProveedor(UpdateView):
    model = Proveedor
    template_name = 'proveedor.html'
    form_class = ProveedorForm
    success_url = reverse_lazy('productos:listado_proveedores')

class DetalleProveedor(DetailView):
    model = Proveedor
    template_name = 'detalle_proveedor.html'

El formulario a utilizar tanto para modificación como para la creación del proveedor es uno solo:

archivo: forms.py

class ProveedorForm(forms.ModelForm):

    class Meta:
        model = Proveedor
        fields = ['ruc', 'razon_social', 'direccion', 'telefono','correo', 'estado']

    def __init__(self, *args, **kwargs):
        super(ProveedorForm, self).__init__(*args, **kwargs)
        for field in iter(self.fields):
            if field <> 'estado':
                self.fields[field].widget.attrs.update({
                    'class': 'form-control'
                })

Ahora debemos modificar nuestro archivo urls.py para poder agregar las nuevas urls:

archivo: urls.py

urlpatterns = [
        #.....
    url(r'^proveedores/$', ListadoProveedores.as_view(), name="listado_proveedores"),
    url(r'^crear_proveedor/$', CrearProveedor.as_view(), name="crear_proveedor"),
    url(r'^modificar_proveedor/(?P<pk>.+)/$',ModificarProveedor.as_view(), name="modificar_proveedor"),
    url(r'^detalle_proveedor/(?P<pk>.+)/$',DetalleProveedor.as_view(), name="detalle_proveedor"),
]

Veamos primero el archivo proveedores.html que es el template desde donde se van a realizar las demás operaciones:

archivo: proveedores.html

{% extends "base.html" %}
{% block cuerpo %}
<h3>Proveedores</h3>
<div class="row">
        <div class="col-lg-10">
                <a onclick="return abrir_modal('{% url 'productos:crear_proveedor' %}')" class="btn btn-primary">
                        Crear
                </a>
        </div>
</div>
<hr/>
<div class="row">
        <div class="col-lg-12">
                <table id="tabla" class="display" cellspacing="0" width="100%">
                        <thead>
                                <tr>
                                        <th class="text-center">RUC</th>
                                        <th class="text-center">RAZON SOCIAL</th>
                                        <th class="text-center">DIRECCION</th>
                                        <th class="text-center">ESTADO</th>
                                        <th class="text-center">ACCIONES</th>
                                </tr>
                        </thead>
                        <tbody>
                        {% for proveedor in proveedores %}
                <tr>
                    <td>{{ proveedor.ruc }}</td>
                    <td>{{ proveedor.razon_social }}</td>
                    <td>{{ proveedor.direccion }}</td>
                    {% if proveedor.estado %}
                    <td>ACTIVO</td>
                    {% else %}
                    <td>INACTIVO</td>
                    {% endif %}
                    <td class="text-center">
                        <a onclick="return abrir_modal('{% url 'productos:detalle_proveedor' proveedor.pk %}')" class="btn">
                            <span class="glyphicon glyphicon-eye-open"></span>
                        </a>
                        <a onclick="return abrir_modal('{% url 'productos:modificar_proveedor' proveedor.pk %}')" class="btn">
                            <span class="glyphicon glyphicon-edit"></span>
                        </a>
                    </td>
                                </tr>
                        {% endfor %}
                        </tbody>
                </table>
        </div>
</div>
<div id="popup" class="modal fade" role="dialog">

</div>

Tenemos la tabla con el listado de los proveedores ya creados junto con dos enlaces en cada fila de proveedor para poder desplegar el detalle y la modificación del mismo en los modales correspondientes, en la parte final vemos que para mostrar el modal usaremos el div con el id "popup" y con las clases de bootstrap "modal" y "fade" para que la ventana a mostrar sea un modal con un ligero efecto al mostrarse.

Ahora vamos a ver la parte de javascript necesaria para poder mostrar el modal correspondiente:

function abrir_modal(url)
{
        $('#popup').load(url, function()
        {
                $(this).modal('show');
        });
        return false;
}

function cerrar_modal()
{
        $('#popup').modal('hide');
        return false;
}

$(document).ready(function()
{
    var table = $('#tabla').dataTable( {
        "language": {
                url: "/static/localizacion/es_ES.json"
        }
    } );
});

Notamos que aquí la forma de trabajo es mas sencilla que cuando la haciamos con JQuery-UI ya que solamente usamos el método load() y mostramos el contenido de la ruta que pasamos como argumento.

Ahora veamos los templates correspondientes a la creación, modificación y detalle del proveedor, en el caso de los dos primeros es un solo template:

archivo: proveedor.html

<div class="modal-dialog modal-lg">
        <div class="modal-content">
                {% if object %}
                <form role="form" action="{% url 'productos:modificar_proveedor' object.pk %}" method="post">
                {% else %}
                <form role="form" action="{% url 'productos:crear_proveedor' %}" method="post">
                {% endif %}
                        <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">x</button>
                <h3>Modificar Proveedor</h3>
            </div>
            <div class="modal-body">
                                {% csrf_token %}
                                <div class="panel panel-default">
                                        <div class="panel-body">
                                                {{ form.as_p }}
                                        </div>
                                </div>
                        </div>
                        <div class="modal-footer">
                                <div class="col-lg-12 text-right">
                                        <input type="submit" class="btn btn-primary" name="submit" value="Guardar">
                                        <button type="button" class="btn btn-default" onclick="return cerrar_modal()">
                                                Cancelar
                                        </button>
                                </div>
                        </div>
                </form>
        </div>
</div>

archivo: detalle_proveedor.html

<div class="modal-dialog modal-lg">
        <div class="modal-content">
                <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">x</button>
                        <h3>Detalle Proveedor</h3>
                </div>
                <div class="modal-body">
                        <div class="row">
                                <div class="col-lg-4">
                                        <label>RUC:</label>
                                        <p>{{ object.ruc }}</p>
                                        <label>RAZÓN SOCIAL:</label>
                                        <p>{{ object.razon_social }}</p>
                                        <label>DIRECCIÓN:</label>
                                        <p>{{ object.direccion }}</p>
                                        <label>TELÉFONO:</label>
                                        <p>{{ object.telefono }}</p>
                                        <label>CORREO:</label>
                                        <p>{{ object.correo }}</p>
                                        <label>ESTADO:</label>
                                        {% if object.estado %}
                                                <p>ACTIVO</p>
                                        {% else %}
                                                <p>INACTIVO</p>
                                        {% endif %}
                                </div>
                        </div>
                </div>
                <div class="modal-footer">
                        <div class="col-lg-12 text-right">
                                <button type="button" class="btn btn-primary" onclick="return cerrar_modal()">
                                        Aceptar
                                </button>
                        </div>
                </div>
        </div>
</div>

Si todo ha salido bien podemos tener una pantalla como la siguiente:

/images/blog/proveedores.png

Y los modales:

Creacion de Nuevo Proveedor:

/images/blog/creacion_proveedor.png

Detalle de Proveedor:

/images/blog/detalle_proveedor.png

Modificacion de Proveedor:

/images/blog/modificacion_proveedor.png

Para ver los archivos de configuración del proyecto y todo lo demás que no ha sido explicado en este post, pueden acceder al repositorio:

Proyecto Modales

Saludos.

Modales en Django con Vistas Basadas en Clases y JQuery-UI

En este post vamos a usar ventanas modales para poder hacer operaciones de visualización, creación y modificación de entidades. Para este fin hemos creado un proyecto llamado "modales" y una aplicación "productos" donde vamos a tener el modelo Producto, para poder mostrar los modales haremos uso de la librería JQuery-UI y de bootstrap para ayudarnos con el diseño, jquery como librería javascript y Datatables para mostrar las tablas de la manera mas cómoda. Los pormenores de creación del proyecto y la correspondiente aplicación serán obviados por haber sido tratados en artículos anteriores.

Primero creamos nuestro archivo base.html que va a contener la carga de las librerias necesarias:

base.html

<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Modales</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap.min.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'css/jquery-ui.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'css/jquery.dataTables.min.css'  %}"/>
    <script type="text/javascript" src="{% static 'js/jquery.js' %}" charset="UTF-8"></script>
    <script type="text/javascript" src="{% static 'js/bootstrap.min.js' %}" charset="UTF-8"></script>
    <script type="text/javascript" src="{% static 'js/jquery-ui.js' %}"></script>
    <script type="text/javascript" src="{% static 'js/jquery.dataTables.min.js' %}"></script>
</head>
<body>
<div id="page-wrapper">
    <div class="container-fluid">
    {% block cuerpo %}

    {% endblock cuerpo %}
    </div>
</div>
</body>
</html>

Vamos a proceder a crear nuestras vistas en el archivos views.py:

views.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.views.generic.edit import UpdateView, CreateView
from django.views.generic.list import ListView
from productos.forms import ProductoForm
from productos.models import Producto
from django.core.urlresolvers import reverse_lazy
from django.views.generic.detail import DetailView

class ListadoProductos(ListView):
    model = Producto
    template_name = 'productos.html'
    context_object_name = 'productos'

class CrearProducto(CreateView):
    template_name = 'producto.html'
    form_class = ProductoForm
    success_url = reverse_lazy('productos:listado_productos')

class ModificarProducto(UpdateView):
    model = Producto
    template_name = 'producto.html'
    form_class = ProductoForm
    success_url = reverse_lazy('productos:listado_productos')


class DetalleProducto(DetailView):
    model = Producto
    template_name = 'detalle_producto.html'

La vista ListadoProductos es la vista principal de nuestra aplicación desde aquí vamos a interactuar con las demás vistas, como se ve todas están basadas en clases.

Debemos crear un formulario llamado ProductoForm para utilizarlo tanto en ModificarProducto como en CrearProducto:

forms.py

from django import forms

from productos.models import Producto


class ProductoForm(forms.ModelForm):

    class Meta:
        model = Producto
        fields = ['descripcion', 'marca', 'precio', 'estado']

    def __init__(self, *args, **kwargs):
        super(ProductoForm, self).__init__(*args, **kwargs)
        for field in iter(self.fields):
            if field <> 'estado':
                self.fields[field].widget.attrs.update({
                    'class': 'form-control'
                })

Ĺo único nuevo en la parte de los formularios es que estamos implementando el método __init__ para poder agregar la clase 'form-control' de bootstrap.

Ahora vamos a crear nuestro archivo urls.py:

from django.conf.urls import url
from productos.views import ListadoProductos, CrearProducto, ModificarProducto, DetalleProducto

urlpatterns = [
    url(r'^$', ListadoProductos.as_view(), name="listado_productos"),
    url(r'^crear_producto/$', CrearProducto.as_view(), name="crear_producto"),
    url(r'^modificar_producto/(?P<pk>.+)/$',ModificarProducto.as_view(), name="modificar_producto"),
    url(r'^detalle_producto/(?P<pk>.+)/$',DetalleProducto.as_view(), name="detalle_producto"),
]

Ahora si haremos nuestra plantilla principal, llamada productos.html, primero haremos la parte del html y luego la de javascript:

productos.html

{% extends "base.html" %}
{% block cuerpo %}
<h3>Productos</h3>
<div class="row">
        <div class="col-lg-10">
                <a onclick="return abrir_modal('{% url 'productos:crear_producto' %}','Productos / Nuevo')" class="btn btn-primary">
                        Crear
                </a>
        </div>
</div>

Aquí primero heredamos de base.html y luego tenemos un botón para crear un nuevo producto, para desplegar el modal se llama a la url correspondiente como primer argumento del método de javascript "abrir_modal" y como segundo el título del modal.:

onclick="return abrir_modal('{% url 'productos:crear_producto' %}','Productos / Nuevo')"

Sigamos viendo nuestro archivo productos.html:

<hr/>
<div class="row">
        <div class="col-lg-12">
                <table id="tabla" class="display" cellspacing="0" width="100%">
                        <thead>
                                <tr>
                                        <th class="text-center">DESCRIPCION</th>
                                        <th class="text-center">MARCA</th>
                                        <th class="text-center">PRECIO</th>
                                        <th class="text-center">ESTADO</th>
                                        <th class="text-center">ACCIONES</th>
                                </tr>
                        </thead>
                        <tbody>
                        {% for producto in productos %}
        <tr>
            <td>{{ producto.descripcion }}</td>
            <td>{{ producto.marca }}</td>
            <td>{{ producto.precio }}</td>
            {% if producto.estado %}
            <td>ACTIVO</td>
            {% else %}
            <td>INACTIVO</td>
            {% endif %}
            <td class="text-center">
                <a onclick="return abrir_modal('{% url 'productos:detalle_producto' producto.pk %}','Productos / {{ producto.descripcion }}')" class="btn">
                    <span class="glyphicon glyphicon-eye-open"></span>
                </a>
                <a onclick="return abrir_modal('{% url 'productos:modificar_producto' producto.pk %}','Productos / {{ producto.descripcion }}')" class="btn">
                    <span class="glyphicon glyphicon-edit"></span>
                </a>
            </td>
                        </tr>
                        {% endfor %}
                        </tbody>
                </table>
        </div>
</div>
<div id="popup"></div>

Tenemos la tabla con el listado de los productos ya creados junto con dos enlaces en cada fila de producto para poder desplegar el detalle y la modificación del mismo en los modales correspondientes, tal como se explico arriba, en la parte final vemos que para mostrar el modal usaremos el div con el id "popup".

Ahora vamos a ver la parte de javascript necesaria para poder mostrar el modal correspondiente:

var modal;

function abrir_modal(url, titulo)
{
    modal = $('#popup').dialog(
    {
        title: titulo,
        modal: true,
        width: 500,
        resizable: false
    }).dialog('open').load(url)
}

function cerrar_modal()
{
    modal.dialog("close");
}

$(document).ready(function()
{
    var table = $('#tabla').dataTable( {
        "language": {
                url: "/static/localizacion/es_ES.json"
        }
    } );
});

La función abrir_modal usa el método dialog() de JQuery-UI para mostrar un modal cuyo contenido en html va a ser cargado con el método load de acuerdo a la url que estemos tratando de visualizar. Este elemento se guarda en la variable modal.

La función cerrar_modal() utiliza la variable modal, para cerrar el dialogo pasando el parámetro "close".

Finalmente tenemos los templates correspondientes a detalle_producto.html y producto.html:

detalle_producto.html

<div class="panel panel-default">
        <div class="panel-body">
                <div class="row">
                        <div class="col-lg-7">
                                <h3>{{ object.descripcion }}</h3>
                        </div>
                </div>
                <div class="row">
                        <div class="col-lg-4">
                                <label>MARCA:</label>
                                <p>{{ object.marca }}</p>
                                <label>PRECIO:</label>
                                <p>{{ object.precio }}</p>
                                <label>ESTADO:</label>
                                {% if object.estado %}
                                        <p>ACTIVO</p>
                                {% else %}
                                        <p>INACTIVO</p>
                                {% endif %}
                        </div>
                </div>
        </div>
</div>

producto.html

{% if object %}
<form role="form" action="{% url 'productos:modificar_producto' object.pk %}" method="post">
{% else %}
<form role="form" action="{% url 'productos:crear_producto' %}" method="post">
{% endif %}
        {% csrf_token %}
        <div class="panel panel-default">
                <div class="panel-body">
                        {{ form.as_p }}
                </div>
        </div>
        <div class="row">
                <div class="col-lg-12 text-right">
                        <input type="submit" class="btn btn-primary" name="submit" value="Guardar">
                        <button type="button" class="btn btn-default" onclick="return cerrar_modal()">
                                Cancelar
                        </button>
                </div>
        </div>
</form>

Este template tiene de especial que va a ser usado tanto para crear como para modificar el producto, por lo que se procede a preguntar si existe un objeto object, en caso de que sea así la acción a realizar será modificar el producto y sino crear un nuevo producto.

Si todo ha salido bien podemos tener una pantalla como la siguiente:

/images/blog/modales_principal.png

Y los modales:

Creacion de Nuevo Producto:

/images/blog/creacion_producto.png

Detalle de Producto:

/images/blog/detalle_producto.png

Modificacion de Producto:

/images/blog/modificacion_producto.png

Para ver los archivos de configuración del proyecto y todo lo demás que no ha sido explicado en este post, pueden acceder al repositorio:

Proyecto Modales

Saludos.

Configurando Django con Postgresql

En este videotutorial les mostramos la forma de configurar un servidor postgresql y conectarlo con Django, además de utilizar la herramienta gráfica de administración de base de datos PgAdminIII, esperemos les sea útil:

Configuración de Entorno de Desarrollo Django

Después de algunos meses de ausencia y de haber superado los fenómenos climáticos que vivimos en nuestra región, volvemos con nuevos contenidos, esta vez vamos a probar con la realización de videotutoriales, empezamos desde lo básico configurando un entorno de desarrollo para Django usando el IDE Pycharm en su versión community y creando un entorno virtual, esperamos que lo disfruten:

Configurando la Ruta de los Addons en Odoo

La ruta de los addons es un parámetro de configuración, que lista los directorios donde se buscarán los módulos agregados a Odoo cuando se inicializa una nueva base de datos. Los directorios listados en la ruta addons se espera que contengan subdirectorios, cada uno de los cuales es un módulo agregado.

Primero ingresamos a la ruta donde tenemos nuestro entorno de Odoo 10 y creamos una carpeta llamada local-addons:

cd ~/odoo-dev-10/
mkdir local-addons

La carpeta local-addons contendrá los módulos que vamos a desarrollar.

Ahora editamos la configuración de la instancia:

nano myodoo.cfg

Localizamos la linea que empieza con addons_path =. Por defecto esta mostrará lo siguiente:

addons_path = /home/usuario/odoo-dev-10/odoo/odoo/addons,/home/usuario/odoo-dev-10/odoo/addons

Modificamos la linea agregando una coma al final de la linea y añadiendo la ruta donde van a estar nuestros módulos adicionales, en este caso la carpeta local-addons en la ruta /home/usuario/odoo-dev-10:

addons_path = /home/usuario/odoo-dev-10/odoo/odoo/addons,/home/usuario/odoo-dev-10/odoo/addons,/home/usuario/odoo-dev-10/local-addons

Ahora reiniciamos nuestra instancia de odoo:

python odoo/odoo-bin -c myodoo.cfg

Si nos detenemos a observar la terminal y los avisos que nos lanza Odoo, veremos que en la linea de addons_paths ya nos aparece la carpeta local-addons:

2017-01-21 17:03:58,845 8081 INFO ? odoo: addons paths: ['/home/usuario/.local/share/Odoo/addons/10.0', u'/home/usuario/odoo-dev-10/odoo/odoo/addons', u'/home/usuario/odoo-dev-10/odoo/addons', u'/home/usuario/odoo-dev-10/local-addons']

Instalación de módulos desde GitHub

GitHub es una gran fuente de módulos de terceros. Muchos desarrolladores de Odoo utilizan GitHub para compartir sus módulos, y la Asociación Comunitaria Odoo(OCA) mantiene colectivamente varios cientos de addons en GitHub.

Vamos a descargar un módulo de Asociación Comunitaria Odoo(OCA), para buscar los que necesitamos podemos ir a:

https://github.com/OCA/

En esta caso instalaremos algunos módulos que nos permiten tener funcionalidades para administrar centros de salud, para ello debemos situarnos en la carpeta de nuestro entorno de desarrollo y clonar el módulo allí:

cd ~/odoo-dev-10
git clone https://github.com/OCA/vertical-medical

De acuerdo a la documentación sabemos que estos módulos dependen de otro llamado partner contacto, por lo que también debemos descargarlo para que esté disponible:

git clone https://github.com/OCA/partner-contact.git

Ahora en nuestra carpeta tendremos dos carpetas adicionales tal como se muestra en la imagen:

/images/blog/addons4.png

Todos los repositorios de códigos de la Asociación Comunitaria Odoo(OCA) tienen sus complementos contenidos en subdirectorios separados, lo cual es coherente con lo que espera de Odoo con respecto a los directorios en la ruta addons, por lo que debemos agregar ambas a la ruta de addons:

nano myodoo.cfg

Modificamos la linea addons_path:

addons_path = /home/usuario/odoo-dev-10/odoo/odoo/addons,/home/usuario/odoo-dev-10/odoo/addons,/home/usuario/odoo-dev-10/local-addons, /home/usuario/odoo-dev-10/partner-contact, /home/usuario/odoo-dev-10/vertical-medical

Ahora lanzamos nuestra instancia:

python odoo/odoo-bin -c myodoo.cfg

Ahora nos vamos al navegador para instalar nuestros addons descargados:

https://localhost:8069

Recordemos que el usuario y la contraseña por defecto son admin y admin.

Una vez que hayamos ingresado, buscamos el menú Settings(acá lo tenemos como Configuración, debido a que ya cargamos el soporte para idioma Español) y activamos el modo desarrollador:

/images/blog/addons1.png

Ahora nos vamos al menú Apps y le damos click a la opción "Actualizar lista de aplicaciones":

/images/blog/addons2.png

Nos desplegará una ventana como la siguiente, donde presionamos el botón actualizar:

/images/blog/addons3.png

Finalmente vamos a las aplicaciones y buscamos el módulo Odoo Medical:

/images/blog/addons5.png

Le damos click al botón instalar y automáticamente instalará también el addon partner-contact:

Ya con esto podemos administrar un centro médico con Odoo.

/images/blog/addons6.png

Saludos.

Guardando la Configuración de una Instancia de Odoo en un Archivo

Seguimos configurando un entorno de desarrollo para Odoo 10 y tal como hemos visto en el artículo anterior podíamos levantar una instancia de Odoo con algunos parámetros agregados:

python odoo-bin -d odoo10 --addons-path=addons

Odoo tiene múltiples parámetros de configuración, para ver que parámetros podemos utilizar ejecutamos el siguiente comando:

python odoo-bin --help | less

Estar cargando todos estos parámetros cada vez que levantamos nuestra instancia es un poco tedioso, por eso tenemos la opción de guardar un archivo de configuración donde tengamos todos nuestros parámetros establecidos.

Suponiendo que estamos ubicados en la carpeta que contiene el código fuente de Odoo, para generar el archivo de configuración debemos correr el siguiente comando:

python odoo-bin --save --config myodoo.cfg --stop-after-init

De esta manera generamos un archivo de configuración llamado myodoo.cfg(el nombre puede ser cualquiera) que se guardará en la misma carpeta donde está el script odoo-bin.

Es posible guardar este archivo en cualquier ubicación, eso ya depende de nosotros y de como nos ubiquemos para utilizar el script odoo-bin, en nuestro caso siempre creamos el archivo de configuración en la carpeta superior a la que contiene el código fuente de odoo(si seguimos la secuencia del artículo anterior esta carpeta será odoo-dev-10), por lo que haremos lo siguiente:

cd ~/odoo-dev-10
python odoo/odoo-bin --save --config myodoo.cfg --stop-after-init

Si editamos el archivo myodoo.cfg y cambiamos algunos de los parámetros, es posible tomar estos cambios la siguiente vez que iniciemos nuestra instancia usando el parámetro -c, que es una opción abreviada de --config:

python odoo/odoo-bin -c myodoo.cfg

Esto funciona de la siguiente manera, al arrancar, Odoo carga su configuración en tres pasos:

  • Primero se inicializa un conjunto de valores predeterminados para todas las opciones desde el código fuente.
  • A continuación, se analiza la configuración y cualquier valor definido en el archivo reemplaza los valores predeterminados.
  • Finalmente, se analizan las opciones de la línea de comandos y sus valores anulan la configuración obtenida del paso anterior.

Los nombres de las variables de configuración se pueden transformar desde los nombres de las opciones de la línea de comandos, eliminando los guiones principales y convirtiendo los guiones medios en guiones bajos. Hay algunas excepciones en particular, pero para obtener mayor detalle de esto remitanse a la documentación de Odoo o a los libros que hemos recomendado en los artículos anteriores y que estamos usando como guía.

Saludos.

Instalando Entorno de Desarrollo para Odoo 10 en Ubuntu 16.04

Continuando nuestra serie de tutoriales sobre Odoo esta vez nos toca hacer la instalación de un entorno de desarrollo para Odoo sobre Ubuntu 16.04.

Primero instalamos las dependencias necesarias:

sudo apt-get install git python2.7 postgresql nano python-virtualenv

Descargamos e instalamos wkhtmltox, esto es necesario para los reportes en pdf.

wget http://nightly.odoo.com/extra/wkhtmltox-0.12.1.2_linux-jessie-amd64.deb
dpkg -i wkhtmltox-0.12.1.2_linux-jessie-amd64.deb

Ahora instalamos las dependencias de desarrollo:

sudo apt-get install gcc python2.7-dev libxml2-dev \
libxslt1-dev libevent-dev libsasl2-dev libldap2-dev libpq-dev \
libpng12-dev libjpeg-dev

Instalamos NodeJS y su manejador de paquetes:

sudo apt-get install npm
ln -s /usr/bin/nodejs /usr/bin/node

Instalamos el compilador less, a partir de la versión 9.0, el cliente web Odoo requiere el preprocesador less CSS para que las páginas web se representen correctamente, esto depende de Node.js y npm, que hemos instalado en el paso anterior.

npm install -g less less-plugin-clean-css

Configuramos postgresql, primero creamos un usuario con posibilidad de crear bases de datos y que tenga nuestro mismo nombre de usuario de Ubuntu:

sudo -u postgres createuser --createdb $(whoami)

Creamos la base de datos odoo10

createdb odoo10

Configuramos git para poder descargar el código fuente de odoo:

git config --global user.name "Tu nombre"
git config --global user.email "Tu email"

Creamos la carpeta donde vamos a clonar odoo 10:

mkdir ~/odoo-dev-10
cd ~/odoo-dev-10
git clone -b 10.0 --depth=1 https://github.com/odoo/odoo.git odoo
cd odoo

Creamos el entorno virtual para odoo 10 y lo activamos:

virtualenv ~/odoo-10
source ~/odoo-10/bin/activate

Instalamos las python dependencias de Odoo en el entorno virtual:

pip install -r requirements.txt

Ahora levantamos odoo con el siguiente comando:

python odoo-bin -d odoo10 --addons-path=addons
  • El script para inicializar odoo se llama odoo-bin.
  • El parámetro -d es para indicarle que vamos a trabajar con la base de datos odoo10.
  • El parámetro --addons-path es para indicarle las rutas que contendrán los addons de Odoo.

Probamos el correcto funcionamiento de odoo usando nuestro navegador web y poniendo la siguiente dirección en la barra de direcciones:

http://localhost:8069

Nos logueamos con las siguientes credenciales:

  • Usuario: admin
  • Password: admin

En los siguientes tutoriales empezaremos a crear addons para Odoo, hasta la próxima.

Saludos.