dinsdag 13 november 2012

Postgresql subquery hack

Blijkbaar als een subquery geen resultaat vind, geeft deze een lege recordset terug. Als je deze dan concatenate met een char waarde geeft deze een empty field.

For example,

SELECT resource_resource.name ||' '|| hr_employee.surname || ' : ' ||  (SELECT jfs_partner_contact_details.value FROM

Zal als resultaat een lege record terug geven. Een hack die ik hiervoor heb gebruikt is de volgende.

SELECT resource_resource.name ||' '|| hr_employee.surname || ' : ' ||  (SELECT COALESCE(MAX(jfs_partner_contact_details.value),'NO EMAIL FOUND') FROM

Door MAX() te gebruiken zal bij een lege recordset de waarde null worden teruggeven, die we dan vervangen door COALESCE() te gebruiken.

vrijdag 12 oktober 2012

YAML testing OpenERP

Ik dacht laat ik eens een module nemen, deze dropen in mijn 6.1 OpenERP addons folder en er mee aan de slag gaan. Na enkele verbeteringen te hebben gedaan leek het me geschikte opportuniteit om deYAML test scenario's voor versie 6.0 (and up) te gebruiken.

Na wat trial en error zoekwerk ben ik tot een werkende oplossing gekomen.






Het is vrij eenvoudig om deze functionaliteit te gebruiken. Je plaatst in je __openerp__.py file de volgende tag:
'demo_xml': ['test/hr_car_testing.yml'],
Zoals je kan zien bevat de demo_xml tag het path en de de naam van de YAML file.

De volgende stap houd in dat je de server opstart met het volgende commando.

python openerp-server.py -i hr_car --log-level=test

Als de server is opgestart en je bent ingelogd zou de output van de testen te zien moeten zijn in je logfile of de stdout. Afhankelijk van hoe je de YAML test hebt geschreven krijg je ongeveer volgende output.

2012-10-13 05:55:02,756 5524 INFO sandbox openerp.modules.loading: module hr_car: loading test/hr_car_testing.yml  
2012-10-13 05:55:02,767 5524 TEST sandbox openerp.tools.yaml_import: Creating !record {model: hr.car.make, id: new_make}:
 with {'name': 'testingmake11111111'}
2012-10-13 05:55:02,776 5524 TEST sandbox openerp.tools.yaml_import: Creating !record {model: hr.car.model, id: new_model}:
 with {'make_id': 'new_make', 'name': 'testingmodel'}
Om het plaatje volledig te maken zet ik hier ook de YAML file die ik heb gebruikt om dit voorbeeld uit te werken. Het is ver van af omdat het in principe crud operaties zou moeten omvatten van de objecten binnen de module. OPGELET voor de spatie indentatie van YAML syntax, kan je wel eens de mist mee ingaan.


#HR_CAR test testing scenario
-
 !record {model: hr.car.make, id: new_make}:
  name: testingmake11111111
-
 !record {model: hr.car.model, id: new_model}:
  name: "testingmodel"
  make_id: new_make

Referenties :
http://doc.openerp.com/v6.0/developer/5_16_data_serialization/yaml_serialization.html#writing-yaml-tests
http://doc.openerp.com/v6.0/contribute/15_guidelines/coding_guidelines_testing.html#tests-are-run-on-the-server-side



Opzetten van OpenERP development omgeving. (windows)

Aangezien mijn vriendin op dinsdag en donderdag werkt, heb ik besloten om die dagen te besteden aan het updaten van men blog en programmeren van allerhande zaken. Ik was bezig met het opzetten van mijn development omgeving voor OpenERP en dacht dat het misschien handig kan zijn om hierover een blog post te schrijven.

Repository

Het eerste dat ik gedaan heb is het opzetten van een code repository bij assembla. Het kwam erg aangeraden door kennissen en het leek me een betere optie dan bijvoorbeeld Google code. Een account aanmaken is erg gemakkelijk en je krijgt de keuze om het privaat of open te maken. Ik heb gekozen voor Subversion als versiebeheersysteem omdat ik dat systeem al erg gewoon ben.

Python

Ik maak gebruik van  versie 2.7.3.

Ide

Als ide koos ik voor eclipse, niet speciaal een voorkeur voor maar het heeft alles wat ik nodig heb om  aan de slag te kunnen. Daarbij heb ik ook nog enkele plugins geïnstalleerd.

OpenERP source code

Ik heb eerste een nieuwe repository location toegevoegd via de SVN Repository Exploring Perspective en hier dan het url van de assembla repository ingegeven. Als je een location aanmaakt zie je dat deze ook een nieuw project toevoegd in je PyDev package explorer. Ik heb via rmb->Team->Update er voor gezorgd dat beide locaties gelijk zijn.

In de trunk folder heb ik dan de laatste versie van de OpenERP source code geplaatst. Ik heb de source tarball All-in-one genomen.

Python packages

Voor je de server kan draaien vanuit de source heb je een aantal Python packages nodig. De requires.txt in de folder openerp.egg.info liet me weten welke extra modules ik nodig had.

Voor de meeste modules kan je gebruik maken van python's setuptools easyinstall.exe
  • Setuptools
    • babel
    • feedparser
    • gdata
    • lxml
    • mako
    • psycopg2
    • pydot
    • python-dateutil < 2
    • python-ldap
    • python-openid
    • pytz
    • pywebdav
    • pyyaml
    • reportlab
    • simplejson
    • vatnumber
    • vobject
    • werkzeug
    • xlwt
    • zsi
    • pyopenssl (enkel voor ssl)
Op onderstaande website vind je ook een hoop binaire packages die snel en gemakkelijk te installeren of te verwijderen zijn.
Een andere manier om snel aan de slag te gaan is gewoon de code downloaden, openerp-server hernoemen naar een python file (de extensie veranderen naar een .py) en deze dan uitvoeren. Normaal gezien krijg je dan een warning of crash van de server als er een module ontbreekt.

Ik run de server altijd vanuit Eclipse, als er dan iets misgaat heb je altijd een console uitput / stack trace die ja kan helpen om het probleem te vinden.

Database

Als database voor Openerp gebruikt men Postgres RDBMS. Het volstaat om deze te installeren en een user aan te maken met adminrechten. In de config file van OpenERP gebruik je deze user om een verbinding met de server te maken. Start hierna OpenERP op en creëer een nieuwe database via het setup scherm van OpenERP zelf. 

maandag 2 april 2012

Ik ben echt verschoten !

Ik ben nu al een tijdje met Google Go, Mongo-DB en mgo bezig. Ik heb me nog nooit zo verwend gevoeld, zulk een mooie documentatie van alle 3 de producten. Zulk een logische code en zo een behulpzame community. Ik sta er zo versteld van dat ik er een blog-post aan wijd. Ik ben bezig met een code-snippet pagina voor mgo, die ik binnenkort met jullie zal delen.In ieder geval, het is fantastische en bijzonder leuk om deel van deze community uit te maken. Ik ben dan ook laaiend enthousiast.

woensdag 28 maart 2012

Google Go1 is live gegaan!!!

Ik heb vandaag een berichtje gekregen dat google Go zijn eerste stabiele release uit heeft gebracht. GO1
Ik ben het onmiddelijk gaan uit testen en was zeer onder de indruk over de 'out of the box' functionality voor de windows release. Installeren ging vlotjes, het toevoegen van extra packages was ook geen probleem. Ik ben onder de indruk.

Google Go en Mongo database

Na het spelen met een tiny webserver in Google Go leek het me wel leuk om die webserver eens te laten verbinden met een database. Hierbij dacht ik niet aan een alledaagse entity relation database, maar eens iets anders. Hierbij kwam ik al vlug uit op Mongo DB. Het installeren ging heel vlug en ik had al gelezen over een package speciaal voor deze database.

De package die ik moenteel gebruik noemt MGO en kan je vrij eenvoudig installeren door het volgende commando uit te voeren. 

go get launchpad.net/mgo

Ik zeg er wel bij dat dit me niet lukte voor de release van Go1. Daarom had ik het even opzij gelegd en ben nu opnieuw begonnen. Deze download en installeerd de packages onder de folder C:\Go\src\pkg\launchpad.net.
Daarom dat je bij het importeren van deze packages volgende path gebruikt.

"launchpad.net/mgo"
"launchpad.net/mgo/bson"

Volgend script maakt het mogelijk om iets in de database weg te schrijven en terug op te halen.

package main

import (
        "fmt"
        "launchpad.net/mgo"
"launchpad.net/mgo/bson"
)

type Person struct {
        Name string
        Phone string
}

func main() {
session, err := mgo.Dial("localhost")
if err != nil {
panic(err)
}
defer session.Close()
c := session.DB("journal").C("people")
err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
  &Person{"Cla", "+55 53 8402 8510"})
if err != nil {
panic(err)
}

result := Person{}
err = c.Find(bson.M{"name": "Ale"}).One(&result)
if err != nil {
panic(err)
}

fmt.Println("Phone:", result.Phone)
}

zaterdag 11 februari 2012

Kleine webserver met html template

Na wat voorbeelden te zoeken en deze voorbeelden aan te passen naar werkende code. Heb ik nu een kleine webserver opgezet die html toont met behulp van Go's template package. Ik vermoed dat mijn template package wat verouderd is en dat daardoor veel verschillende voorbeelden niet werkte. Ik heb hiervoor de google go versie gebruikt die je in men eerdere blog posts kan terugvinden.

Hieronder staat de code voor mijn main.go

// Webserver project main.go
package main
// Importing packages
import (
    "fmt"
    "http"
    "template"
)
// Data structure
type foo struct{
    Title string
    Header1 string
}
// In the Handler
func sayHello(w http.ResponseWriter, r *http.Request) {
    //creating our parser
    t, _ := template.ParseFile("./h1.html", nil)
    //creating our data struct
    f := &amp;foo{Title:"NewTitle",Header1:"Header1"}
    //parsing our template and data struct
    t.Execute(f, w)
}
// Our main
func main(){
    fmt.Printf("Starting http Server ... \n")
    http.Handle("/", http.HandlerFunc(sayHello))
    err := http.ListenAndServe("0.0.0.0:8080", nil)
    if err != nil {
       fmt.Printf("ListenAndServe Error :" + err.String())
    }
}

Hieronder staat de code voor h1.html

<!DOCTYPE html>
<html>
  <head>
    <title>{.section Title}{@}{.or}SomeoneForgotTheTitle{.end}</title>
  </head>
  <body>
    <h1>{Header1}</h1>
  </body>
</html>