Samstag, 27. Dezember 2014

Odoo-eBook schreiben mit Leanpub

Ein Projekt, das mich schon das ganze Jahr umtreibt, ist die Erstellung eines eBooks für Odoo.

Nachdem ich mehrere Tools und Programme ausprobiert habe, habe ich mich für Leanpub entschieden.

Dort entsteht jetzt gerade mein "Odoo Kochbuch". Ich habe die Feiertage genutzt und bin schon ein gutes Stück vorangekommen.

Es wird kein klassisches Anwender-Handbuch, sondern ein "Kochbuch" für Odoo wie es in der IT zahlreiche Bücher gibt. Ein Nachschlagewerk für die häufigsten Fragen zu Odoo 8.

Leanpub bietet die Möglichkeit den Leser in die Erstellung mit einzubeziehen. So kann ich Interessanten Vorabversionen zur Verfügung stellen.

Mit dem Teil der Odoo Installation bin ich weitgehend fertig. Jetzt kommen die eigentlichen "Rezepte" für Odoo. Teilweise verwende ich Themen, die ich bereits hier gebloggt habe und bereite sie noch etwas auf. Des weiteren kommen Themen, die ich meiner täglichen Arbeit mit Odoo bewältige.

Leanpub

Leanpub setzt bei der Erstellung auf Markdown Subset "Markua".

Wenn man sich an die Vorgehensweise gewöhnt hat, funktioniert es recht ein einfach.
Ich habe meine Dropbox mit Leanpub verbunden. In dem Dropbox-Buch-Ordner liegen jetzt alle Steuerungsdateien, Texte, Grafiken und Skript.

Die Texte schreibe ich mit iA Writer für Mac.
Sobald die Dateien in meiner Dropbox hochgeladen sind, kann ich mein Buch im PDF-, epub- oder Kindle-mobi-Format erzeugen lassen.

Das Ergebnis steht nach der Erzeugung nach wenigen Minuten wieder in meiner Dropbox.

Ich habe die wichtigsten Markdown Tags hier zusammengefasst. Bei Leanpub verfügt über eine sehr gut Dokumentation in Text- und Videoform.

Markua-Tags


Aufteilung in Buchbereiche
{frontmatter} > Einleitung
..
{mainmater} > Hauptbereich
..
{backmater} > Anhang

Neue Seite:
{pagebreak}

Zeilenumbruch
2 Leerzeichen am Zeilenende

Definition in Teile
-# Teil 1
..
-# Teil 2

Definition Kapitel
# Kapitel 1
..
# Kapitel 2
..
## Unterkapitel 2.1
..
### Unter-Unterkapitel 2.1.1


Textformatierungen
*kursiv*
**fett**

Hochstellen:
1^st^
2^nd^

`Text mit fester Laufweite`


Fussnoten
Fussnote [^fussnote1]
[^fussnote1]: Hier den Fussnotentext


Link:
[Linkname](http://url)


Bulletliste
* Eins
* Zwei
* ..


Nummerliste
1. Eins
2. Zwei
3. ..


Grafik
![Grafiktitel](images/grafikname.png)

Quellcode


Variante 1
    Quellcode 4 Leerzeichen einrücken
    damit Leanpub es erkennt

Variante 2
~~~~~~~~
Quellcodeblock
...
Quellcode
~~~~~~~~ (8x~  > ~ beim Mac [alt+n])

Variante 3
Link zum Code 
<<(code/codename.py)
ggf. <<[Titel des Codeblocks](code/codename.py)


Variante 4
`Quellcodeblock`


Tabellen
| Spalte1       | Spalte2      |
|------------------------------|
| text 1        | text 2       |
| text 3        | text 4       |


Hinweis-Boxen
> Textblock eingerückt
> Textblock eingerückt
> ...

A> ##Textblock mit Rahmen Titel
A>
A> Textblock mit Rahmen
A> ...

T> ##Textblock-Tipp Titel
T>
T> Textblock-Tipp
T> ...

W> ##Textblock-Warnung Titel
W> 
W> Textblock-Warnung
W> ...

E> ##Textblock-Fehler Titel
E> 
E> Textblock-Fehler
E> ...

I> ##Textblock-Info Titel
I> 
I> Textblock-Info
I> ...

Q> ##Textblock-Frage Titel
Q> 
Q> Textblock-Frage
Q> ...

D> ##Textblock-Diskussion Titel
D> 
D> Textblock-Diskussion
D> ...

X> ##Textblock-Übung Titel
X> 
X> Textblock-Übung
X> ...

{icon=calculator}
G> ##Textblock-Freie Grafik Titel
G> 
G> Textblock-Freie Grafik von 
G> [fontawesome](http://fontawesome.io/icons/)
G> ...



Querverweis
{#querverweisname}
Querverweistext

Im Text:
Bitte drücken Sie [hier](#querverweisname) um...



Montag, 15. Dezember 2014

Das Geheimnis der Mehrsprachigkeit bei OpenERP/Odoo und die "Problemchen" damit...

Prinzipiell ist Odoo/OpenERP auf Mehrsprachigkeit ausgelegt.

Den Odoo-Modulen liegt eine Übersetzungsdatei für die jeweilige Sprache bei:

Beispiel de.po:
..
#. module: equitania
#: model:ir.model,name:equitania.model_res_company
msgid "Companies"
msgstr "Unternehmen"
..
Für jedes zu übersetzende Wort in Englisch wird die Übersetzung in Deutsch hinterlegt.
Dabei wird der Modulname und das Model angegeben.

Wird ein Modul installiert wird dies ausgelesen und in die Tabelle "ir_translation" gespeichert.
Basierend auf der Anwender oder Kundensprache wird die passende Übersetzung gezogen.

Man kann Odoo auf dazu veranlassen alle Sprachdateien nochmals auszulesen:





























Soweit die Theorie!


Wird aber die Tabelle "ir_translation" nicht korrekt gefüllt.

Ich habe mal ein Beispiel aufbereitet. In der "ir_translation" steht die Übersetzung. Im Feld "res_id" steht der Bezug auf Objekt.

SELECT irt.*,
(SELECT iuv."name" FROM ir_ui_view iuv WHERE iuv."id"=irt.res_id) AS refer_object
FROM ir_translation irt 
WHERE irt.res_id = 1749

ORDER BY irt.src, irt.lang











Felder und ihre Bedeutung:

id = Auto-Field wird von der Datenbank gesetzt
lang = Sprachpaket im Beispiel de_DE = deutsch für Deutschland de_AT wäre deutsch für Österreich
src = Welcher englische Begriff soll übersetzt werden
name = Welcher Bereich
res_id = Verweis auf das Objekt in Tabelle "ir_ui_view"
module = Für Odoo-Module
state = Status z.B. "translated"
value = Übersetzung des Feldes "src"
type = Art der Objektes z.B. View, Ode, Field etc.
comments = Kommentar

Über die Oberfläche von Odoo kommt man auch an die Übersetzung:





















Lösung bei Übersetzungsfehlern

Wenn also ein Übersetzung nicht angezeigt wird, kann hier nachgeschaut werden und ggf. der fehlende Eintrag nachgebessert werden. Allerdings ist dieser nach dem nächsten "-u all" / Update der Datenbank wieder weg.

Deshalb schreiben wir gerade eine zentrale Funktion für unser Installationsfunktionen https://github.com/equitania/odoo-addons/blob/master/equitania/eq_install_func.py  die fehlende Einträge automatisch nachholt.

Sonntag, 14. Dezember 2014

OpenERP/Odoo auf dem Standardport 80 betreiben

Heute zeige ich wie man seinen Odoo-Server auf dem Port 80 betreiben kann, d.h. man muss hinter der IP-Adresse nicht mehr Port 8069 angeben.

Beispiel: 
http://192.168.0.10 statt http://192.168.0.10:8069 
oder
http://myodoo.de statt http://myodoo.de:8069 

Dazu installiert man den Webserver "nginx" als Proxy.

Als root Benutzer:
$ sudo su (ubuntu)
$ apt-get update
$ apt-get install nginx

Danach editieren wir die Default-Datei mittels
$ nano /etc/nginx/sites-available/default
und ersetzen den Inhalt wie folgt:
server {
        listen 80;
        server_name localhost;
    client_max_body_size 8192m;

    access_log    /var/log/nginx/www-access.log;
    error_log     /var/log/nginx/www-error.log;

location / {
        # proxy_set_header   X-OpenERP-dbfilter dbname;
        proxy_pass    http://127.0.0.1:8069;

        # increase proxy buffer to handle some OpenERP web requests
        proxy_read_timeout 600;
        proxy_connect_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;

        send_timeout 600;

    }
}
Jetzt ergänzen wir die in der odoo-server.conf folgende Zeilen:
xmlrpc_interface = 127.0.0.1 
netrpc_interface = 127.0.0.1

Jetzt stoppen wir Odoo und nginx und starten bei Dienste neu:
$ /etc/init.d/openerp-server stop
$ /etc/init.d/nginx stop
$ /etc/init.d/openerp-server start
$ /etc/init.d/nginx start

Jetzt können Sie Ihren Server direkt ansprechen. Mit nginx verschlüsselt man übrigens auch sein Odoo System mit einem SSL Zertifikat oder filtert gewisse Datenbanken.

Dazu vielleicht in einem späteren Blogeintrag.

Montag, 1. Dezember 2014

Einrichtung des Dokumentenverwaltungssystem von Odoo/OpenERP

Wenn man das Modul "document" installiert, muss man noch einige Details beachten!























Nach der Installation muss man unter Systemparameter den Eintrag "ir_attachment.location" mit dem Wert "file:///filestore" setzen.

































Gibt man nichts an, speichert Odoo die Daten unter "~/.local/share/Odoo/filestore/databasename".
Dies kann man ändern, in dem man den Pfad in der odoo-server.config setzt wie z.B. "data_dir=/opt/odoo/odoo-dms"

Wichtig: 
Der odoo-user muss Schreibrechte darauf haben.

Danach kann man zu den meisten Objekten (Kunden, Aufträge, Produkte..) Dateien anhängen.





Dienstag, 25. November 2014

Odoo/OpenERP: Wenn der "Primary Key" mal verloren geht.

Bei unseren Odoo/OpenERP Installationen kam es nach einigen Updates vor, dass die "Sequence ID"s der PostgreSQL Datenbank nicht mehr gestimmt haben.

Hintergrund:
Jede Tabelle in der Odoo-Datenbank hat ein ID-Feld. Darauf zeigt der "Primary Key". Dadurch wird verhindert, dass ein Datensatz doppelt vorkommt.
Über einen "Autozähler" wird der Wert beim "Insert" erhöht, was über eine Sequenz verwaltet wird.

Diese ID war auf einmal zu niedrig, was dazu führte, dass keine neuen Datensätze vor allem in den Tabellen der Website hinzugefügt werden konnten.

Das folgende Skript kontrolliert alle Tabellen der Odoo-Datenbank und setzt den Sequenz Wert auf den MAX-Wert.


# -*- coding: UTF-8 -*- ############################################################################## # # Python Script for Odoo, Open Source Management Solution # Copyright (C) 2014-now Equitania Software GmbH(<http://www.equitania.de>). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## __author__ = 'm.schmid@equitania.de' import psycopg2 #Connection with the Connectionstring conn = psycopg2.connect('dbname=Databasename user=postgres host=localhost password=Databasepassword') cur = conn.cursor() #Gets the tables with an primary key cur.execute("""select tc.table_schema, tc.table_name, kc.column_name from information_schema.table_constraints tc, information_schema.key_column_usage kc where tc.constraint_type = 'PRIMARY KEY' and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name order by 1, 2;""") #Tables that have the id field, without a value. blacklist = ['ir_act_client', 'ir_act_report', 'ir_act_report_xml', 'ir_act_server', 'ir_act_url', 'ir_act_window'] for table in cur.fetchall(): if table[1] not in blacklist: #Max ID cur.execute("SELECT MAX(id) FROM %s;" % (table[1])) max_id = cur.fetchone() #Next ID cur.execute("SELECT nextval('%s_id_seq');" % (table[1])) next_id = cur.fetchone() #If max_id bigger than next_id and both aren't None if max_id[0] != None and next_id[0] != None: if int(next_id[0]) <= int(max_id[0]): #Sets the PKey to the max_id + 1 cur.execute("SELECT setval('%s_id_seq', %s);" % (table[1], max_id[0] + 1)) print("Tabelle " + table[1] + " hatte eine fehlerhafte ID.") else: print('ID für die Tabelle ' + table[1] + ' ist fehlerfrei.') else: print('Kein Eintrag in der Tabelle ' + table[1] + '.') print("Fertig!")

Sonntag, 23. November 2014

QWEB Pickinglist für Odoo/OpenERP

In unserem Open Source Repository auf GITHub haben wir jetzt auch die "Pickinglist/Lieferschein" für Odoo/OpenERP bereitgestellt.

Näheres unter
https://github.com/equitania/odoo-addons



Samstag, 22. November 2014

Spracheinstellungen, Dezimalstellen und Tausender-Separator mit Odoo/OpenERP

Wenn man eine neue Datenbank für Odoo/OpenERP erzeugt und die deutsche Lokalisation gewählt hat, wundert man sich, warum das Datum und die Zahlenformate nicht stimmen.

Ich hoffe, dass wir es schaffen unter dem OCA Projekt http://portal.sliderocket.com/openbig/OCA-Deutsche-Lokalisierung künftig eine bessere deutsche Oberfläche hinbekommen. Jeder ist eingeladen dort mitzumachen. http://odoo-community.org/

Bis dahin hier ein paar Tipps:

Datums- und Zahlenformate

Odoo: Spracheinstellungen
































Unter Languages/Sprachen wählt man die deutsche Sprache aus und korrigiert das Datumsformat von "%m/%d/%Y" auf "%d.%m.%Y". Danch setzt man den Dezimalseparator auf "," und the Tausender-Separator auf ".".

Wichtig!
Nie beide Separatoren gleichsetzen!

Jetzt korrigiert man das Separator-Format auf "[3,0]".

Dezimalstellen

Odoo: Dezimalstellen
Unter Datenbank-Struktur kann man die Dezimalstellenlänge für die verschiedenen Werte ändern. Bis auf die Währungen. Diese Einstellung findet man unter den Einstellungen "Finanzen/Rechnung"

Odoo: Finanzen

Übersetzungen

Installiert man Module nach, kommt es meist vor, dass nicht alle Wörter auf Deutsch erscheinen.

Odoo: Sprache neu laden
Dies löst man, in dem man die Sprache neu lädt und die bestehende Übersetzung überschreibt.
Für manche Module gibt es leider keine deutsche Sprache-Version. Wie man diese übersetzt erkläre ich in einem späteren Blogeintag. Versprochen ;)








Samstag, 8. November 2014

Odoo/OpenERP installieren, updaten, Backup/Restore so einfach wie noch nie mittels Shellskripten

Da ich immer bemüht bin Prozesse zu optimieren, habe ich inzwischen diverse Shellskripte erstellt, die das Arbeiten mit Odoo einfacher machen.

Alle Skripte liegen unter https://github.com/equitania/odoo-addons/tree/master/scripts

Die Skript sind für den Ubuntu 14 LTS geschrieben und getestet.


Wenn man die Skript auf seinen Server kopiert hat, muss man diese noch ausführbar machen:
sudo chmod +x SKRIPTNAME
Gehen wir mal die Skripte im einzelnen durch:

Server Vorbereitung

https://github.com/equitania/odoo-addons/blob/master/scripts/prepare-odoo-server.sh 

Dieses Skript installiert alle nötigen Module, die für Odoo gebraucht werden. Das Skript wird regelmäßig angepasst und kann auch zum Server Update benutzt werden. Ferner für es eine PostgreSQL Optimierung durch.

Odoo Installation

https://github.com/equitania/odoo-addons/blob/master/scripts/install-odoo-server.sh 

Das Skript installiert den Odoo Server komplett und für den "Dämon" gleich als Autostart ein.
Die Installation basiert auf unserem Odoo-Fork https://github.com/equitania/odoo, welcher wöchtlich aktualisiert wird. Es legt einen User "odoo" an und setzt auch die Passworte für die PostgreSQL und die Datenbankpflege.

Odoo Server Update

https://github.com/equitania/odoo-addons/blob/master/scripts/update-odoo-server-addons.sh

Wichtig: Das muss als User "odoo" durchgeführt werden, aber vorher den Dämon stoppen!
sudo su /etc/init.d/openerp-server stop
sudo su odoo 
Das Skript führt zunächst ein Backup durch. Danach wird unser Odoo-Fork https://github.com/equitania/odoo geupdatet und auch die Equitania Erweiterungen installiert.
Danach wird die Datenbank aktualisiert. 

Sind alle Updates gelaufen (Error sind rot, Warnings gelb und sind meist zu ignorieren), stoppt man das Skript mit [crtl]+[c].
2014-11-08 14:47:33,658 22212 INFO db openerp.models: Computing parent left and right for table ir_ui_menu...

Backup & Restore

Mit diesen beiden Skripten kann man ein Backup/Restore auf Shell-Ebene durchführen. Das ist sicherer als es über die Weboberfläche zu machen.
Dazu auch den "odoo"-User nehmen.





Mittwoch, 5. November 2014

web.base.url im Odoo/OpenERP Server bei nginx setzen

Wenn man die Website von Odoo einsetzt und seinem Kunden einen Zugriff auf das Webportal ermöglichen will, dann muss man die web.base.url setzen.

Soweit so gut. 

Hat man allerdings eine Portweiterleitung mit dem "nginx" eingerichtet, dann wir die web.base.url immer wieder automatisch gesetzt.

Dies kann man durch den Zusatz-Parameter:

web.base.url.freeze = True

verhindern, siehe Grafik.

Danke an Josef Kaser von https://www.inox-tech.de  für den Tipp!

web.base.url parameters odoo





























Dienstag, 4. November 2014

Wie geht es mit Apple weiter, wenn schon die eingefleischten Fans zu Android wechseln?

Nachdem ich seit dem iPhone 3 bis zum iPhone 5s ein Gerät von Apple hatte, bin ich heute auf ein Sony Xperia Z3 umgestiegen. Man muss dazu sagen, dass ich auch Programme für iPhone entwickle.
Ferner habe ich mehrere Macs, Apple TV, iPad etc. und einen Apfelaufkleber auf dem Auto;)

Die Arroganz und der Umgang mit den Kunden ist für mich nicht länger hinnehmbar.
Nicht nur von Apple, sondern auch von meinem derzeitigen Provider Vodafone.

Vor fast genau einem Jahr habe ich meinen Vertrag bei Vodafone verlängert und bin vom iPhone 4s auf das iPhone 5s umgestiegen. Gesagt werden muss, dass wir als Firma noch andere Verträge bei Vodafone haben, die eigentlich mit einem neue Mobilfunkgerät verlängert werden könnten.

Dies wurde uns im Februar mitgeteilt. Als das iPhone 6 vorstellt wurde, wollte ich das tun - da sagte aber Vodafone, dass die anteiligen Zusatzgebühren nicht anrechenbar seien. Wo das stehen sollte, ist uns bis heute nicht gesagt worden. Auch der Wechsel auf einen SIM-Only-Tarif wäre nur möglich, wenn wir auf 24 weitere Monate verlängern.

Die Strategie ist ganz offensichtlich. Wegen 100-200 € geht keiner vor Gericht oder beauftragt einen Anwalt. Okay sagte ich mir, dann halt kein neues iPhone und habe alle Vodafone Verträge gekündigt.

Kurze Zeit später wurde ich Sprachqualität meines iPhone 5s immer schlecht. Danach habe ich etwas recherchiert und festgestellt, dass dieses Problem lange bekannt ist und es keine richtige Lösung dafür gibt. :( Man kann von einem Smartphone nicht erwarten, dass man damit telefonieren kann.

Also habe ich erstmal bei der Business Hotline von Vodafone angerufen. Dort wurde mir dann gesagt, ich müsste das Gerät einschicken, das wären die Vorgaben von Apple. Bei jedem anderen Gerät gäbe es sofort einen Austausch. Mit was ich inzwischen telefonieren sollte, wurde mir nicht gesagt und das es ein großer Aufwand ist das Gerät zu sichern und wieder herzustellen interessiert wohl niemanden. Ich solle mich direkt an Apple wenden.

Okay - dann rufe ich mal an, dachte ich. Nach über 20 min. Warteschleife habe ich entnervt aufgelegt und 20 min. nach einer E-Mail Adresse gesucht. Auffallend ist, dass man alles schnell findet, wenn Apple einem etwas verkaufen will. Bei Reklamationen wird es da schon schwieriger. An den Support kann man gar nicht schreiben. Also habe ich die allgemeine Adresse "contactus.de@euro.apple.com" gewählt. Nach einem Tag kam die lapidare Antwort, dass ich die Hotline anrufen soll.

Daraufhin habe ich meine "rosa" Apple-Brille abgesetzt und einfach mal die Frage gestellt, "was wäre wenn.. " Diese Frage hat sich vorher nie gestellt. Einmal Apple immer Apple.

Man kann noch so viele Tests derzeit lesen und kommt immer wieder zu dem Schluss, so toll sind die Apple-Produkte gegenüber der Konkurrenz gar nicht mehr. Und Android ist schon lange ebenbürtig, wenn nicht sogar in bestimmten Bereichen besser. Von der Hardware wollen wir gar nicht sprechen.

Jetzt habe ich ein Gerät, dass rund 40% günstiger war als ein vergleichbares Apple Produkt. Zudem ich es staubgeschützt und Wasser dicht. Zum Einrichten und übertragen der Daten habe ich auch nicht länger gebraucht, da ich vieles in der "Wolke" speichere.

Was ich aber kaum geglaubt hätte: Die Integration in meinen BMW ist besser! Jetzt kann ich zu den Kontakten sogar die Bilder sehen und kann SMS und E-Mail direkt in meinem ConnectedDrive vorlesen lassen. Ging mit dem iPhone nicht!

Mein Fazit: Wenn der Kunde nicht mehr als Kunde wahrgenommen wird und die Produkte auch kein wirkliches Alleinstellungsmerkmal haben, wird Apples Stern über kurz oder lang untergehen. Ich bin auf jeden Fall froh, dass ich den Schritt getan habe, auch wenn in mir jetzt einige Kommentare anhören muss. ;)

iTunes Match beende ich jetzt auch und mein Apple TV ist durch ein Kindle Fire TV ersetzt. Den Aufkleber auf meinem Auo mache ich auch runter!

Montag, 3. November 2014

Odoo/OpenERP Server mittels Shell-Skript vorbereiten

Heute habe ich ein kleines Shell-Skript erstellt, dass alle nötigen Pakete auf einem Ubuntu Server 14  installiert, die für Odoo benötigt werden.

Zunächst meldet man sich am Ubuntu Server an und wechselt zu "Root"-Rechten:
sudo su
Danach erstellt man die Datei z.B. mit dem Texteditor "nano"
nano prepare-odoo-server.sh
Dort kopiert man die folgenden Zeilen rein.

#!/bin/bash # Mit diesem Skript werden alle Pakete für den Odoo Betrieb unter Ubuntu installiert # Skript muss mit root-Rechten ausgeführt werden echo "Prepare Ubuntu" apt-get update && apt-get dist-upgrade && apt-get autoremove echo "Tools zip, unzip, mc(Midnight Comander) und htop werden installiert..." apt-get install mc zip unzip htop echo "Wollen Sie die PostgreSQL-DB installieren (j/n):" read mypsql if [ "$mypsql" = "j" ]; then echo "PostgreSQL wird installiert..." apt-get install postgresql else echo "PostgreSQL wird nicht installiert!" fi apt-get install ghostscript graphviz antiword git libpq-dev poppler-utils python-pip apt-get install python-dateutil python-pypdf python-requests \ python-feedparser python-gdata python-ldap python-libxslt1 \ python-lxml python-mako python-openid python-psycopg2 \ python-pybabel python-pychart python-pydot python-pyparsing \ python-reportlab python-simplejson python-tz python-vatnumber \ python-vobject python-webdav python-werkzeug python-xlwt \ python-yaml python-zsi python-docutils python-psutil \ python-unittest2 python-mock python-jinja2 python-dev \ python-pdftools python-decorator python-openssl python-babel \ python-imaging python-reportlab-accel \ python-paramiko python-software-properties pip install passlib beautifulsoup4 evdev echo "Wollen Sie das Modul HTML2PDF installieren (j/n):" read mypdf if [ "$mypdf" = "j" ]; then echo "HTML2PDF wird installiert..." wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb rm wkhtmltox-0.12.1_linux-trusty-amd64.deb else echo "HTML2PDF wird nicht installiert!" fi echo "Wollen Sie die PostgreSQL-Einstellungen optimieren (j/n):" read mysql if [ "$mysql" = "j" ]; then echo "PostgreSQL wird optimiert..." apt-get install pgtune sudo pgtune -i /etc/postgresql/9.3/main/postgresql.conf -o /etc/postgresql/9.3/main/postgresql.conf.tuned sudo mv /etc/postgresql/9.3/main/postgresql.conf /etc/postgresql/9.3/main/postgresql.conf.old sudo mv /etc/postgresql/9.3/main/postgresql.conf.tuned /etc/postgresql/9.3/main/postgresql.conf sudo /etc/init.d/postgresql stop sudo /etc/init.d/postgresql start sudo cat /etc/postgresql/9.3/main/postgresql.conf else echo "PostgreSQL wird nicht optimiert!" fi echo "Finished!"

Zuletzt muss dem Skript noch Execute-Rechte gegeben werden:
chmod +x prepare-odoo-server.sh
Jetzt kann es gestartet werden:
./prepare-odoo-server.sh
Das Skript installiert nicht nur alle Pakete, es optimiert auch gleich die Postgres-Einstellungen.



Sonntag, 2. November 2014

Neue Quellen für unsere Odoo/OpenERP Installation und Addons

Wir haben unsere öffentlichen Repositories von Bitbucket zu Github umgezogen:

https://bitbucket.org/equitania-ondemand/odoo ist jetzt unter https://github.com/equitania/odoo

https://bitbucket.org/equitania-ondemand/odoo-addons ist jetzt unter https://github.com/equitania/odoo-addons

Dies hatte mehrere Gründe:

  • Wir haben nun einen direkten Fork von https://github.com/odoo/odoo gemacht. Dadurch wird die Pflege einfacher. 
  • In der Regel wird das Repository wöchentlich, in Ausnahmen täglich, aktualisiert. Es wurde kleinere Änderungen zu Installation und Entwicklung eingefügt.
  • Ferner ist das Handling für Laien mit einfacher. 

Dienstag, 23. September 2014

Odoo: Workaround nachdem Update von Odoo 8RC auf Final ging der "Website Builder" nicht mehr...

Als ich letzte Woche unsere Homepage https://myodoo.de von dem Release Candidate auf die FINAL geupdatet hatte, sah alles ganz normal aus.

Als ich dann aber eine neue Seite erstellen wollte, konnte ich auf einmal keine Website-Inhalte hinzufügen. Statt dem gewohnten Menü, erschien nur eine leere Leiste.



Was tun??? - zwar fand ich im Odoo Helpforum Einträge mit ähnlichen Symptomen, aber keine Lösung.

Unser Workaround

Zunächst haben wir die Datenbank weggesichert.
Danach wurde das Module "Website Builder" deinstalliert und wieder installiert.







Achtung: Danach sind alle Seiten und Blogs weg! Deshalb die Sicherung!

Jetzt haben wir die Inhalte von der Sicherung übertragen:

Import der website

  1. Menüeinträge. Die Tabelle "website_menu" per CSV exportiert und die in der neuen Datenbank importiert.
    Wichtig!!! Wenn ein Datum mit exportiert wird, muss das Format des Servers gewählt werden. (1990-12-31 17:30)
    Beim Import(Append/Update) das selbe Spiel, sonst gibt es beim import einen Fehler, wobei nur die Felder id, parent_left, parent_right, name, sequence, url, parent_id und new_window wichtig sind. Insert/Append sollte benutzt werden. Wenn Fehler auftauchen, ist dies kein Problem, es fehlt nur der Inhalt in der Zeile.
  2. Webseiten. website_bugfix ausführen.
  3. Blogeinträge > die gleichen Vorgehnsweise wie bei den Menüeinträgen.
  4. blog_blog ohne die Spalten, create_id, create_date, write_id, write_date, message_last_post.
  5. bei blog_post das selbe, außer das man das create_date und write_date importiert.
  6. blog_post_history mit allen Feldern.
  7. blog_tag mit allen Feldern.
  8. blog_pos_tag_rel mit allen Feldern
Wir haben dazu ein Python-Skript erstellt. Wer ähnliche Probleme hat, kann sich gerne melden.

Sonntag, 14. September 2014

Terminal Session-Verwaltung mit "screen"

Im Zeitalter der "Cloud" ist die Verbindung über das Terminal eine wichtiges Werkzeug bei meiner Arbeit. Ich betreue zahlreiche Linux Server meist auf Ubuntu Basis.

Da es des öfteren vorkommt, dass ich langwierige Jobs laufen lassen muss, es aber durchaus vorkommen kann, dass die Verbindung zum Server abreist, arbeite ich mit "screen".
Es gibt nichts schlimmeres als z.B. bei Backup- und Restore-Prozessen die Session zu verlieren!

screen

screen ist ein Unix Session Management.
Es ist auf meinem Mac oder Ubuntu bereits installiert.

Man verwendet den "screen"-Befehl als Präfix für die SSH-Session und kann jeder Zeit wieder auf diese zurückkehren.

Näheres zur Installation und der Benutzung unter http://wiki.ubuntuusers.de/screen

Wichtig:

Man startet "screen" nicht auf einer lokalen Maschine, sondern auf der Remote-Maschine, d.h. zunächst verbindet man sich wie üblich mit ssh.

ssh -l BENUTZER IP oder SERVERNAME

Dort startet man dann eine "screen"-Session mittels

screen -S SESSIONNAME

Der Sessionname ist hilfreich, falls man mehrere Sessions hat. Danach arbeitet man ganz normal innerhalb der Session. Falls die Verbindung abreisst oder man sie mit [ALT]+[a]+[d] verlassen hat, kann man sich mittels

screen -ls 

die aktuellen Sessions aufzeigen lassen.

Mit

screen -r SESSIONNAME

kehrt man wieder zurück.






Freitag, 1. August 2014

PostgreSQL unter Ubuntu optimal einstellen, insbesondere für einen performante odoo/OpenERP Server

Der PostgreSQL Server ist in der Grundinstallation sehr minimalistisch eingestellt, damit er überall passt. In diesem Beitrag beschreibe ich die Vorgehensweise für eine optimale Konfiguration.

Mein Referenzsystem ist dabei Ubuntu 12 LTS 64 Bit mit einem PostgreSQL 9.1. Jedoch kann man die Vorgehensweise auch auf andere Systeme anwenden.

Zunächst müssen wir ein neues Paket installieren:
$ sudo apt-get update
$ sudo apt-get install pgtune
PGTune von Gregory Smith ermittelt später die optimale Einstellung für unseren PostgreSQL basierend auf unseren Systemdaten.

Jetzt müssen wir die Speichereinstellungen vornehmen, da PostgreSQL bis 9.3 "SysV shared memory" verwendet. Ab 9.3 wird "Posix shared memory and mmap" für die Speicherverwaltung benutzt.

Hierzu Dank an Alexey Vasiliew und seinem Blog-Eintrag. Versucht man nämlich den Speicher in der "postgresql.conf" zu erhöhen, kommt mitunter folgende Meldung:
This error usually means that PostgreSQL's request for a shared memory
segment exceeded your kernel's SHMMAX parameter. You can either
reduce the request size or reconfigure the kernel with larger SHMMAX.
To reduce the request size (currently 4011376640 bytes), reduce
PostgreSQL's shared_buffers parameter (currently 50000) and/or
its max_connections parameter (currently 12).
Deshalb muss man die Speichergrenzen erhöhen. Dazu gehen wir wie folgt vor:
$ sudo su
Damit wechselt man unter Ubuntu in den root-User Modus:
$ nano shmsetup
Hier kopiert man folgende Zeilen rein:
#!/bin/bash
# simple shmsetup script
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall
Nach dem Abspeichern muss man die Datei noch ausführbar machen:
$ sudo chmod +x shmsetup
Wenn man die Datei jetzt ausführt
$ sudo ./shmsetup
sollte bei einem 2 GB Server folgende Werte erscheinen:
kernel.shmmax = 1055092736
kernel.shmall = 257591
Diese werden nun im System hinterlegt:
$ sudo ./shmsetup >> /etc/sysctl.conf
mit
$ sudo sysctl -p
kann man es überprüfen. Wie oben genannt, muss man dies bei PostgreSQL 9.3 nicht mehr machen.

PostgreSQL mit pgtune optimieren


Einfach das Programm mit den aufgeführten Parametern aufrufen. Es erstellt dann eine optimierte Einstellung am Ende der Konfiguration. Bei Version 9.3 ist der Pfad abweichend. Meist nur 9.1 zu 9.3 ändern.
$ sudo pgtune -i /etc/postgresql/9.1/main/postgresql.conf -o /etc/postgresql/9.1/main/postgresql.conf.tuned
$ sudo mv /etc/postgresql/9.1/main/postgresql.conf  /etc/postgresql/9.1/main/postgresql.conf.old
$ sudo mv /etc/postgresql/9.1/main/postgresql.conf.tuned  /etc/postgresql/9.1/main/postgresql.conf
Die alte Konfiguration wird umbenannt und die optimierte zur aktuellen.

Bei einem 32 GB Server ermittelt "pgtune" z.B. folgendes:
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

#custom_variable_classes = ''  # list of custom variable class names
default_statistics_target = 50 # pgtune wizard 2014-08-01
maintenance_work_mem = 1GB # pgtune wizard 2014-08-01
constraint_exclusion = on # pgtune wizard 2014-08-01
checkpoint_completion_target = 0.9 # pgtune wizard 2014-08-01
effective_cache_size = 22GB # pgtune wizard 2014-08-01
work_mem = 192MB # pgtune wizard 2014-08-01
wal_buffers = 8MB # pgtune wizard 2014-08-01
checkpoint_segments = 16 # pgtune wizard 2014-08-01
shared_buffers = 7680MB # pgtune wizard 2014-08-01
max_connections = 80 # pgtune wizard 2014-08-0
Hängt natürlich vom System und den Zugriffen ab.

Das wäre es fast schon gewesen:
$ sudo /etc/init.d/postgresql stop
und neu starten:
$ sudo /etc/init.d/postgresql start
Bingo!