Derniers billets de blog

Expert Python/Django/Plone et chef de projet agile, j'aime coder et découvrir de nouvelles technologies.

Connecting to Oracle with SQLAchemy and very simple Plone integration

SQLAlchemy (The Python SQL Toolkit and Object Relational Mapper) allow Oracle connection through the cx_oracle driver. This how-to describes how to install SQLAlchemy for Oracle Database and how to integrate it in buildout and use it in a browser view.

Requirements

  • Python 2.4 or higher.
  • easy_install (see http://peak.telecommunity.com/DevCenter/EasyInstall).
  • Oracle 9i or higher.

SQLAlchemy installation

cx_oracle

See http://cx-oracle.sourceforge.net/ for the good version, depending on your Python and Oracle versions.

$ export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
$ export PATH=$PATH:$ORACLE_HOME/bin
$ path_to_python/bin/easy_install cx_oracle

$ path_to_python/bin/python 
[...]
>>> import cx_Oracle
>>> cx_Oracle
<module 'cx_Oracle' from '[...]/cx_Oracle.so'>

SQLAlchemy

$ path/to/python/bin/easy_install sqlalchemy

$ path_to_python/bin/python 
[...]
>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.5.4'

Simple connection to Oracle with Python

$ path_to_python/bin/python 
[...]
>>> import sqlalchemy
>>> sqlalchemy.create_engine('oracle://username:password@database')
>>> connection = oracle_db.connect()
>>> result = connection.execute("SELECT test_column FROM test_table")
>>> for row in result:
...     print row
... 
('NAME 1',)
('NAME 2',)
[...]
>>> connection.close()

 

Plone/Zope integration

Integration in buildout.cfg

As cx_oracle and SQLAlchemy are already installed in our python, we don't need to list them as dependencies in the buildout.cfg file.

However we have to declare in buildout.cfg where are the Oracle binaries:

$ vi buildout.cfg
...
environment-vars =
    ...
    ORACLE_HOME /usr/lib/oracle/xe/app/oracle/product/10.2.0/server
    PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: 
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
...

 

A browser view example

$ vi browser.py

# Zope imports
from zope.interface import implements
from Products.Five.browser import BrowserView
from plone.memoize import ram

# Python import
from time import time
import sqlalchemy

# Product imports
from interfaces import IExampleBrowserView
 
class ExampleBrowserView(BrowserView):
    """ See IExampleBrowserView for documentation """

    implements(IExampleBrowserView)

    def __init__(self, context, request):
        self.context = context
        self.request = request
   
    @ram.cache(lambda *args: time() // (60 * 60)) # 60 minutes
    def getOracleParamDatas(self):
        oracle_db = sqlalchemy.create_engine('oracle://username:password@database')
        connection = oracle_db.connect()
       
        datas = []
        try:
            result = connection.execute("SELECT name, value, description FROM params")
            for row in result:
                datas.append({'name': row.name,
                              'value': row.value,
                              'description': row.description})
        finally:
            connection.close()
       
        # Always return simple python data structure for catching purpose
        return datas

 

Références

SQLAlchemy on pypi

SQLAlchemy.org

cx_oracle driver

Getting Subclipse (and JavaHL) to work in Ubuntu Intrepid Ibex with Eclipse 3.4.2

If after installing Subclipse in Eclipse 3.4.2 you get the error message "Unable to load default SVN", read this quick recipe on how getting Subclipse (and JavaHL) to work in Ubuntu Intrepid Ibex.

First of all I use an Eclipse Bundle built with the Yoxos Eclipse service, but without Subclipse.

The requirements for Subclipse 1.4 are Subversion 1.5 and the JavaHL library.

Subversion 1.5

$ sudo apt-get install subversion
$ svn --version
svn, version 1.5.1 ...

Java and JavaHL

You need to use Java provided by Sun.

$ sudo apt-get install sun-java6-jre

Note: libsvn-javahl is a dummy package to assist with upgrades from Debian 3.0, as libsvn-javahl has been renamed to libsvn-java.

$ sudo apt-get install libsvn-java
$ ls /usr/lib/jni
libsvnjavahl-1.so  libsvnjavahl-1.so.0  libsvnjavahl-1.so.0.0.0

And set Sun-Java as your default JVM:

$ sudo update-java-alternatives -s java-6-sun

eclipse.ini

We need to edit the eclipse.ini file to add a line which says where are the JavaHL librairies.

$ gedit ~/.../eclipse.ini
Add at the end the line: -Djava.library.path=/usr/lib/jni

My eclipse.ini file contains:

-startup
plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
-Djava.library.path=/usr/lib/jni

Now, restart Eclipse.

Subclipse

Follow the screenshot tour of the Subclipse installation process in Eclipse 3.x.

Astuce: Eviter l'envoi de courriels malencontreux avec Postfix

Voici une petite astuce pour éviter d'envoyer des courriels non désirés et sans s'en rendre compte... par exemple lors d'un test d'envoi d'une newsletter à 6000 personnes en utilisant une copie de la base de production (et en ayant oublié de changer les adresses de courriel réelles)... ;)

Ajouter la ligne suivante à la fin du fichier /etc/postfix/main.cf:

default_transport = error:outside mail is not deliverable

Marre de redémarrer Zope2 & Plone ?

Si vous en avez marre de redémarrez Zope2 à chaque modification du code source (python ou zcml) cette astuce est pour vous: utiliser plone.reload si vous utilisez Plone 3 ou alors RefreshNG si vous utilisez Plone 2.5.

Plone 3 & plone.reload

plone.reload sur pypi

Installer plone.reload 0.9

Editer votre buildout.cfg pour y intégrer plone.reload:

[project]
...
eggs=
    ...
    plone.reload

zcml=
    ...
    plone.reload

[versions]
...
plone.reload = 0.9

Puis relancer votre buildout:

$ ./bin/buildout -c buildout.cfg

Utiliser plone.reload

Si votre Zope écoute sur le port 8080 de localhost, rendez-vous à l'adresse suivante: http://localhost:8080/@@reload

L'interface vous propose deux actions:

  • Reload code: Tous les modules modifiés depuis leur dernier chargement sont rechargés.
  • Reload code and ZCML: Recharge également tous les modules modifiés mais aussi toutes les directives de configuration ZCML.

Attention: plone.reload reste expérimental et possède certaines limites, notament pour les méthodes décorées qui ne sont pas rechargées correctement.

Plone 2.5 & RefreshNG

RefreshNG sur launchpad.net

Pourquoi ne pas utiliser plone.reload ?

Et bien tout simplement car je n'ai pas réussi ;) et que plone.reload s'est très fortement inspiré du produit Zope RefreshNG.

Installer RefreshNG 0.1

Editer votre buildout.cfg pour y intégrer RefreshNG:

[project]
...
urls=
    ...
    http://launchpad.net/refreshng/0.1/0.1/+download/RefreshNG-0.1.tar.gz

Puis relancer votre buildout:

$ ./bin/buildout -c buildout.cfg

Utiliser RefreshNG

Pour activer la fonction "refresh" pour un de vos produits en cours de développement (ex: MyProduct), il suffit de rajouter dans le produit un fichier vide nommé "refresh.txt".

Rendez-vous alors via la ZMI sur la page "Control_Panel > Products > MyProduct" puis cliquez sur l'onglet "refresh".

L'interfarce vous propose alors de recharger le produit (Refresh this product) et même de marquer le produit comme "auto-recharcheable"  (auto refresh mode).

Attention: Tous les produits ne sont pas compatibles avec cette fonctionnalité, cf. le README du produit RefreshNG pour en savoir plus.

Buildout Quick Reference Card -> très pratique !!!

Six Feet Up offre un joli résumé pour ceux qui utilisent buildout, disponible sur commande ou gratuitement au format PDF !

Excellent résumé pour ceux qui utilise buildout pour leurs déploiements.

Buildout Quick Reference Card" sur sixfeetup.com

Au programme:

  • Démarrer avec un buildout Plone
  • Configuration
  • Versions
  • Utilisation en ligne de commande
  • Options
  • Commandes
  • Assignements
  • et liens pour en savoir plus

Un grand merci à Six Feet Up !!!

La nouvelle version d'OpenERP 5.0 est là!

Tiny vient de sortir sa nouvelle version majeure OpenERP 5.0, accompagnée par OOweb 5.0 (Open Object web), la version web d'OpenERP développée par Axelor en partenariat avec Tiny.

Apparemment tout plein de nouveautés, aussi bien pour le logiciel que pour l'organisation de la communauté OpenERP et la gestion de la maintenance fournit par Tiny.

Parmi les nouveautés de cette nouvelle version majeure:

  • Un wiki
  • Un webmail
  • Un cube OLAP (Business Intelligence)
  • Une boîte à idée
  • Une gestion documentaire
  • Une intégration eCommerce
  • etc...

[edit 2015 : OpenERP est maintenant Odoo]