diff --git a/dev/odoo-server-dev-ka.conf b/dev/odoo-server-dev-ha.conf similarity index 100% rename from dev/odoo-server-dev-ka.conf rename to dev/odoo-server-dev-ha.conf diff --git a/setup/lib/cli.py b/setup/lib/cli.py index ac7ba5a8..498d484b 100755 --- a/setup/lib/cli.py +++ b/setup/lib/cli.py @@ -1,53 +1,65 @@ # -*- coding: utf-8 -*- +import urlparse +import sys -from functions import CamadeusFunctions from config_at import Config from environments import ENVIRONMENTS, Environment -import sys, getopt +from functions import CamadeusFunctions def main(): - def _usage(): print 'cam.py [create|setup|rollout|update] []' + print 'cam.py list-envs' sys.exit(3) - + argv = sys.argv[1:] config = Config() - + + if not argv: + _usage() + # RUNBOT # ./cam runbot create [db] [port] [working-dir] - + if argv[0] == 'runbot': import os cmd = argv[1] db = argv[2] port = argv[3] setup_path = argv[4] - + env = Environment('http://localhost', port, db, 'admin', 'admin', 'admin') os.chdir(setup_path) + elif argv[0] == 'list-envs': + print 'name: host:port dbname username' + for env_name in sorted(ENVIRONMENTS): + env = ENVIRONMENTS[env_name] + print '%s: %s:%s %s %s' % (env_name, env.host, env.port, env.dbname, env.username) + return else: - if not len(argv) == 2: - if len(argv) == 3 and argv[1] in ['update','install']: # 'update' requires additional param 'module_name' + if len(argv) != 2: + if len(argv) == 3 and argv[1] in ['update', 'install']: + # 'update' requires additional param 'module_name' pass else: _usage() - + cmd = argv[1] - - env = ENVIRONMENTS.get(argv[0],False) + + env = ENVIRONMENTS.get(argv[0]) if not env: + print 'Unbekannte Umgebung' _usage() - + instance = CamadeusFunctions(env, config) - methods = False - + methods = None + if cmd == 'test': methods = [ 'login', ] - + if cmd == 'create': methods = [ 'create_db', @@ -57,7 +69,7 @@ def main(): 'setup_accounting2', 'set_admin_rights', ] - + if cmd == 'setup': methods = [ 'login', @@ -69,7 +81,7 @@ def main(): 'hr_config', 'stock_config', 'mrp_config', - 'stock_set_cost_method', + 'stock_set_cost_method', 'set_incoterms', 'purchase_config', 'set_date_format', @@ -84,10 +96,10 @@ def main(): 'set_translations', 'set_default_removal_strategy', 'default_set_order_policy', - 'delete_mail_server', - 'update_values', + 'delete_mail_server', + 'update_values', 'set_sys_params', - 'setup_reports', + 'setup_reports', ] if cmd == 'rollout': @@ -96,7 +108,7 @@ def main(): 'set_dokumentennummern', 'set_dmi_noupdate', 'dmi_confirm_inventory', - 'import_users', + 'import_users', ] if cmd == 'update': @@ -126,17 +138,42 @@ def main(): ] if not methods: + print 'Unbekanntes Kommando' _usage() print env + local_netlocs = [ + 'localhost', + '127.0.0.1', + '::1', + ] + netloc = urlparse.urlparse(env.host).netloc + if netloc not in local_netlocs: + print '\nAchtung, diese Umgebung ist nicht lokal!\n' + + print cmd, + print instance.config.module_name if instance.config.module_name else '' + print + + env.pwd = raw_input('Passwort: ') + + if cmd == 'create': + env.super_admin_pw = raw_input('Super-Admin-Passwort: ') + + print + for method in methods: + doc = getattr(instance, method).__doc__ + print doc, + sys.stdout.flush() res = getattr(instance, method)() - print "%s: %s" % (res and "OK " or "ERROR ", getattr(instance, method).__doc__) + print '\r%s: %s' % (res and 'OK ' or 'ERROR ', doc) if not res: - return False + print 'Abbruch wegen Fehler' + return - print "\nAbgeschlossen." + print '\nAbgeschlossen.' -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/setup/lib/config_at.py b/setup/lib/config_at.py index b6307a24..5a46ed06 100644 --- a/setup/lib/config_at.py +++ b/setup/lib/config_at.py @@ -1,31 +1,29 @@ # -*- coding: utf-8 -*- - -class Config(): - +class Config(): def __init__(self): - - self.lang = 'de_DE' # de_DE, en_US + self.module_name = None + self.lang = 'de_DE' # de_DE, en_US self.chart_of_accounts = 'l10n_at' self.sales_tax = '20% MwSt' self.purchase_tax = '20% VSt' - self.chart_template_id = 2 # Austrian Chart of Account + self.chart_template_id = 2 # Austrian Chart of Account self.price_decimals = 2 # Nachkommastellen Preis self.uom_decimals = 3 # Nachkommastellen Mengeneinheiten - + self.company_data = { 'name': 'Camadeus GmbH', - 'street': 'Kriehubergasse 16', + 'street': 'Wiedner Hauptstraße 135/B3', 'street2': False, 'city': 'Wien', 'zip': '1050', 'phone': '+43 1 78910 96 70', 'fax': False, 'email': 'office@camadeus.at', - 'website': 'http://www.camadeus.at', + 'website': 'http://www.camadeus.at/', 'company_registry': '280076b', - 'country_id': 'at', # "de" für deutschland - 'logo': False, - 'vat': 'ATU 62991855', + 'country_id': 'at', # 'de' für Deutschland + 'logo': False, + 'vat': 'ATU 62991855', 'rml_header1': False, 'vat_check_vies': True, 'tax_calculation_rounding_method': 'round_globally', @@ -41,25 +39,25 @@ class Config(): 'smtp_user': 'test', 'smtp_pass': 'test', } - + # Nur für Lager # Wenn nicht gesetzt, dann wird der Firmenname genommen - self.warehouse_name = False - self.warehouse_code = False - + self.warehouse_name = False + self.warehouse_code = False + # Anzahl der Schritte beim Ausliefern # [ship_only] Direkt vom Lager liefern - # [pick_ship] Liefere vor Auslieferung zuerst in Versandlager (Pick + Ship) + # [pick_ship] Liefere vor Auslieferung zuerst in Versandlager (Pick + Ship) # [pick_pack_ship] Verpacken Sie die Produkte an einer Pack-Station bevor Sie den Versand vornehmen - self.delivery_steps = 'ship_only' - + self.delivery_steps = 'ship_only' + self.valid_taxes = [ '20% MwSt', '10% MwSt', '20% VSt', '10% VSt', ] - + # Aktive Steuerzuordnungen self.valid_fiscal_positions = [ #'Lieferant EU (ohne Ust-ID)', @@ -68,29 +66,29 @@ class Config(): 'Kunde Ausland', 'Kunde EU (ohne USt-ID)', 'Kunde EU Unternehmen (mit USt-ID)', - ] - + ] + # Aktive Währungen self.valid_currencies = [ 'EUR', - ] - + ] + # Allgemeine Einstellungen self.base_config = { 'module_portal': False, # Kundenportal - 'alias_domain': False, # False: keine Domainbezogenen E-Mails (wie zB. Reply-To zur alias-Adresse) + 'alias_domain': False, # False: keine Domainbezogenen E-Mails (wie z. B. Reply-To zur Alias-Adresse) } - + # Einstellungen Verkauf self.sale_config = { 'group_sale_delivery_address': True, # Verschiedene Adressen für Rechnung und Lieferung 'group_sale_pricelist': True, # Preislisten verwenden 'group_discount_per_so_line': True, # Rabatte verwenden 'group_uom': True, # Verwende Mengeneinheiten - 'group_invoice_deli_orders': True, # Erstelle Rechnungen durch Auslieferungen + 'group_invoice_deli_orders': True, # Erstelle Rechnungen durch Auslieferungen } self.order_policy = 'picking' # Erzeuge Rechnung: [manual], [picking],[prepaid] - + # Einstellungen Einkauf self.purchase_config = { 'group_purchase_pricelist': True, # Preislisten verwenden @@ -99,23 +97,22 @@ class Config(): # [order] - Vorabrechnungsentwurf durch Bestellung 'group_costing_method': True, # Benutzen Sie 'Einkaufs-' oder 'Durchschnittspreis' zur Bestandsbewertung } - + #Einstellungen Personal self.hr_config = { 'module_hr_expense': True, # Spesen der Mitarbeiter verwalten - 'module_hr_timesheet': False, # Verwalten Sie Ihre Studenzettel + 'module_hr_timesheet': False, # Verwalten Sie Ihre Studenzettel 'group_hr_attendance': True, # Zuweisung der Berechtigung zur Arbeitszeiteingabe für alle Benutzer - - } - + } + #Einstellungen Lager self.stock_config = { 'group_stock_multiple_locations': True, # Verwalten Sie mehrere Lager und Lagerorte 'group_stock_tracking_lot': False, # Benutze Verpackungen: Paletten, Boxen, ... 'group_stock_production_lot': True, # Verfolgen Sie Los- und Seriennummern. - 'group_stock_packaging': False, # Ermöglicht die Auswahl einer Verpackung - 'group_stock_adv_location': True, # Verwalten Sie erweiterte Routen im Lager - } + 'group_stock_packaging': False, # Ermöglicht die Auswahl einer Verpackung + 'group_stock_adv_location': True, # Verwalten Sie erweiterte Routen im Lager + } # Einstellungen Fertigung self.mrp_config = { @@ -124,82 +121,82 @@ class Config(): 'group_mrp_properties': False, # Ermögliche Merkmale für verschiedene Stücklisten eines Produkts } - #self.removal_strategy = 'fefo' #[fifo], [lifo], [fefo] - - self.stock_cost_method = 'average' # [standard], [average], [real] + #self.removal_strategy = 'fefo' #[fifo], [lifo], [fefo] + + self.stock_cost_method = 'average' # [standard], [average], [real] # Wenn gesetzt, teilen sich Gutschriften und Rechnungen den selben Nummernkreis self.refund_invoice_sequence = True - + self.sequences = { - 'sale.order': { - 'number_next_actual': 1, + 'sale.order': { + 'number_next_actual': 1, 'prefix': 'A-', 'padding': 5, }, -# 'work.order': { -# 'number_next_actual': 1, +# 'work.order': { +# 'number_next_actual': 1, # 'prefix': 'AS-', # 'padding': 5, -# }, -# 'picking.out': { -# #'number_next_actual': 1, +# }, +# 'picking.out': { +# #'number_next_actual': 1, # 'prefix': 'LS/', # 'padding': 4, # }, -# 'picking.in': { -# #'number_next_actual': 1, +# 'picking.in': { +# #'number_next_actual': 1, # 'prefix': 'LS/IN/', # 'padding': 4, -# }, -# 'picking.int': { -# #'number_next_actual': 1, +# }, +# 'picking.int': { +# #'number_next_actual': 1, # 'prefix': 'LS/INT/', # 'padding': 4, # }, -# 'purchase.order': { -# 'number_next_actual': 1, +# 'purchase.order': { +# 'number_next_actual': 1, # 'prefix': 'B-', # 'padding': 5, # }, -# 'account.invoice': { -# 'number_next_actual': 2000, +# 'account.invoice': { +# 'number_next_actual': 2000, # 'prefix': '15-', # 'padding': 4, # }, } - + self.active_uoms = { 'product.product_uom_unit': 'Stk.', #'product.product_uom_meter': 'lfm', #'product.product_uom_litre': 'l', #'product.product_uom_hour': 'h', #'product.product_uom_kgm': 'kg', - } + } #Lieferbedingungen self.incoterms = { ('Ab Werk', 'ABW'), ('Botendienst', 'BOT'), ('Zustellung', 'ZUS'), - } - + } + # Soll das Ändern einer Rechnung im Nachhinein erlaubt sein? self.allow_cancel_invoice = True - + self.modules = [ 'base_iban', 'document', 'knowledge', 'auth_crypt', - 'cam_testenv', + 'cam_testenv', 'cam_max_width', 'oerp_no_phoning_home', 'cam_custom', 'cam_reports', 'account_cancel', 'cam_invoice_skonto', - 'web_printscreen_zb', + 'web_printscreen_zb', 'crm', 'sale', 'mail_follower_control', @@ -209,13 +206,13 @@ class Config(): #'sale_order_reminder', ] - # Setzen das Feld "Attachment" im Report (wenn gesetzt, wird das PDF in den Anhängen gespeichert) + # Setze das Feld "Attachment" im Report (wenn gesetzt wird das PDF in den Anhängen gespeichert) timestamp = " + '_' + time.strftime('%Y-%m-%d-%H%M') + '.pdf')" - self.reports = { + self.reports = { 'sale.report_saleorder': "((object.state in ('draft','sent') and 'KV_' or 'AB_') + object.name" + timestamp, 'cam_reports.report_saleorder_ohne': "((object.state in ('draft','sent') and 'KV_' or 'AB_') + object.name" + timestamp, 'cam_reports.report_porto_anforderung': "('PV_' + object.name " + timestamp, - 'cam_reports.report_porto_anforderung_ohne': "('PV_' + object.name " + timestamp, + 'cam_reports.report_porto_anforderung_ohne': "('PV_' + object.name " + timestamp, 'account.report_invoice': "(object.state in ('open','paid')) and ('RE_'+(object.number or '').replace('/','')" + timestamp, 'cam_reports.report_invoices_ohne': "(object.state in ('open','paid')) and ('RE_'+(object.number or '').replace('/','')" + timestamp, 'cam_reports.report_porto_rechnung': "(object.state in ('open','paid')) and ('RE_'+(object.number or '').replace('/','')" + timestamp, @@ -224,11 +221,11 @@ class Config(): 'purchase.report_purchaseorder': "('B_' + object.name" + timestamp, 'cam_reports.report_purchaseorder_ohne': "('B_' + object.name" + timestamp, } - - self.users_file = "res.users.csv" - + + self.users_file = 'res.users.csv' + self.translation_files = [ - "ir.translation.csv" + 'ir.translation.csv' ] self.default_values = [ # ir.values @@ -240,7 +237,7 @@ class Config(): 'purchase.route_warehouse0_buy': {'name': 'Einkaufen'}, 'stock.route_warehouse0_mto': {'name': 'Beschaffe von Auftrag'}, } - + self.system_parameters = { 'ir_attachment.location': 'db', # [db] oder [file] - } \ No newline at end of file + } diff --git a/setup/lib/environments.py b/setup/lib/environments.py index a5662b82..e7c506fc 100644 --- a/setup/lib/environments.py +++ b/setup/lib/environments.py @@ -1,16 +1,18 @@ # -*- coding: utf-8 -*- - class Environment(): - - def __init__(self, host, port, dbname, username, pwd, admin_pw=False, basic_auth=False): - self.admin_pw = admin_pw + def __init__(self, host, port, dbname, username, pwd=None, super_admin_pw=None, basic_auth=None): + self.host = host + self.port = port self.dbname = dbname self.username = username + # The password for the user named username + # During create the user is created with this password, + # otherwise it's used to authenticate during login. self.pwd = pwd - self.port = port - self.host = host - self.basic_auth = basic_auth or ('user', 'pass') # HTTP authentification - + self.super_admin_pw = super_admin_pw + # HTTP authentication + self.basic_auth = basic_auth or ('user', 'pass') + def __str__(self): return """============================== Host: %s @@ -18,12 +20,16 @@ User: %s DB: %s Port: %s ==============================""" % (self.host, self.username, self.dbname, self.port) - - + + ENVIRONMENTS = { - 'br': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), - 'sk': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), - 'ka': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), - 'test': Environment('https://INSTANCE.camadeus.at', '443', 'INSTANCE_1', 'admin', '141kcal', 'asdfasdf'), + # Local environments are listed with passwords + 'br': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), + 'sk': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), + 'ha': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), + 'jb': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), + 'uk': Environment('http://localhost', '8080', 'INSTANCE_1', 'admin', 'x', 'admin'), + # Remote environments are always listed without passwords! + # Do not store them here, you have to type them anyway! + 'test': Environment('https://INSTANCE.camadeus.at', '443', 'INSTANCE_1', 'admin'), } - \ No newline at end of file diff --git a/setup/lib/functions.py b/setup/lib/functions.py index 612c91cf..c3bf78bc 100755 --- a/setup/lib/functions.py +++ b/setup/lib/functions.py @@ -1,25 +1,21 @@ # -*- coding: utf-8 -*- - -import xmlrpclib import base64 -import os -import sys -import datetime import json +import pprint +import sys +import xmlrpclib + import requests -from config_at import Config -from environments import ENVIRONMENTS class CamadeusFunctions(): - def __init__(self, environment, config): self.env = environment self.config = config def create_db(self): """Neue Datenbank erstellen""" - - payload = {'fields': [ {'name': 'super_admin_pwd', 'value': self.env.admin_pw}, + + payload = {'fields': [ {'name': 'super_admin_pwd', 'value': self.env.super_admin_pw}, {'name': 'db_name', 'value': self.env.dbname}, {'name': 'demo_data', 'value': False}, {'name': 'db_lang', 'value': self.config.lang}, @@ -29,28 +25,29 @@ class CamadeusFunctions(): payload = {'params': payload} json_data = json.dumps(payload) headers = {'content-type': 'application/json'} - r = requests.post('%s:%s/web/database/create' % (self.env.host,self.env.port), data=json_data, headers=headers, auth=self.env.basic_auth, verify=False) - if r and r.json().get('result',False): + r = requests.post('%s:%s/web/database/create' % (self.env.host, self.env.port), data=json_data, headers=headers, auth=self.env.basic_auth, verify=False) + if r and r.json().get('result', False): return True else: - print "Error occured: %s" % r.json().get('error', '????') - return False + msg = pprint.pformat(r.json().get('error', '????')) + print 'Error occured: %s' % msg + return False def login(self): """Login""" - + # Get the uid - sock_common = xmlrpclib.ServerProxy ('%s:%s/xmlrpc/common' % (self.env.host,self.env.port)) + sock_common = xmlrpclib.ServerProxy ('%s:%s/xmlrpc/common' % (self.env.host, self.env.port)) self.uid = sock_common.login(self.env.dbname, self.env.username, self.env.pwd) if not self.uid: - raise "Authentication Error" - self.sock = xmlrpclib.ServerProxy('%s:%s/xmlrpc/object' % (self.env.host,self.env.port)) + raise Exception('Authentication Error') + self.sock = xmlrpclib.ServerProxy('%s:%s/xmlrpc/object' % (self.env.host, self.env.port)) return True def _execute(self, *args): return self.sock.execute(self.env.dbname, self.uid, self.env.pwd, *args) - def _readAndReturnFile(self, filename, encode = ''): + def _readAndReturnFile(self, filename, encode =''): fi = open (filename, 'r') content = '' if encode=='': @@ -61,73 +58,58 @@ class CamadeusFunctions(): sys.exit(-1) fi.close() return content - + def set_company(self): """Setze Unternehmensdaten (Allgemein, RML, Logo)""" - + vals = self.config.company_data - dummy,country_id = self._execute('ir.model.data', 'get_object_reference', 'base',vals['country_id']) - - # RML-Header ist nun ein function-Feld - #if vals.get('rml_header',False): - # vals['rml_header'] = self._readAndReturnFile(vals['rml_header']) - - if vals.get('logo',False): - vals['logo'] = self._readAndReturnFile(vals['logo'], encode = 'base64') + dummy,country_id = self._execute('ir.model.data', 'get_object_reference', 'base', vals['country_id']) + + if vals.get('logo', False): + vals['logo'] = self._readAndReturnFile(vals['logo'], encode='base64') vals['country_id'] = country_id - c_ids = self._execute('res.company', 'search', [], ) - return self._execute('res.company', 'write', c_ids, vals) + c_ids = self._execute('res.company', 'search', []) + return self._execute('res.company', 'write', c_ids, vals) def set_taxes(self): """Setze nicht benötigte Steuern auf inaktiv""" - - tax_ids = self._execute('account.tax', 'search', [('description','not in', self.config.valid_taxes)]) + + tax_ids = self._execute('account.tax', 'search', [('description', 'not in', self.config.valid_taxes)]) return self._execute('account.tax', 'write', tax_ids, {'active': False}) def set_date_format(self): """Setzen des Datumsformats """ - - lang_ids = self._execute('res.lang', 'search', [('code','=',self.config.lang)]) + + lang_ids = self._execute('res.lang', 'search', [('code', '=', self.config.lang)]) if lang_ids: vals = { 'date_format': '%d.%m.%Y', 'time_format': '%H:%M:%S', - 'grouping': '[3,3]', + 'grouping': '[3,3]', 'thousands_sep': '.', - 'decimal_point': ',', + 'decimal_point': ',', } self._execute('res.lang', 'write', lang_ids, vals) else: return False - - lang_ids = self._execute('res.lang', 'search', [('code','=','en_US')]) + + lang_ids = self._execute('res.lang', 'search', [('code', '=', 'en_US')]) if lang_ids: vals = { - 'grouping': '[3,3]', + 'grouping': '[3,3]', } self._execute('res.lang', 'write', lang_ids, vals) else: - return False - - return True + return False -# def set_report_types(self): -# """Setzen der Report Types auf RML (PDF)""" -# -# report_names = ['purchase.report_purchaseorder', -# 'purchase.report_purchasequotation', -# 'account.report_invoice', -# 'sale.report_saleorder', -# 'stock.report_picking'] -# report_ids = self._execute('ir.actions.report.xml', 'search', [('report_name','in',report_names)]) -# return self._execute('ir.actions.report.xml', 'write', report_ids, {'report_type': 'pdf'}) + return True def purchase_config(self): """Basiskonfiguration für Einkauf laden""" - + if hasattr(self.config, 'purchase_config'): - vals = self._execute('purchase.config.settings', 'default_get', []) - vals.update(self.config.purchase_config) + vals = self._execute('purchase.config.settings', 'default_get', []) + vals.update(self.config.purchase_config) wizard_id = self._execute('purchase.config.settings', 'create', vals) return self._execute('purchase.config.settings', 'execute', [wizard_id]) return True @@ -139,46 +121,45 @@ class CamadeusFunctions(): vals.update(self.config.sale_config) wizard_id = self._execute('sale.config.settings', 'create', vals) return self._execute('sale.config.settings', 'execute', [wizard_id]) - + def stock_config(self): """Basiskonfiguration für Lager laden""" if hasattr(self.config, 'stock_config'): - vals = self._execute('stock.config.settings', 'default_get', []) - vals.update(self.config.stock_config) + vals = self._execute('stock.config.settings', 'default_get', []) + vals.update(self.config.stock_config) wizard_id = self._execute('stock.config.settings', 'create', vals) - return self._execute('stock.config.settings', 'execute', [wizard_id]) - return True + return self._execute('stock.config.settings', 'execute', [wizard_id]) + return True def mrp_config(self): """Basiskonfiguration für Fertigung laden""" if hasattr(self.config, 'mrp_config'): - vals = {}#self._execute('mrp.config.settings', 'default_get', self.config.mrp_config.keys()) - vals.update(self.config.mrp_config) + vals = {} + vals.update(self.config.mrp_config) wizard_id = self._execute('mrp.config.settings', 'create', vals) - return self._execute('mrp.config.settings', 'execute', [wizard_id]) - return True - + return self._execute('mrp.config.settings', 'execute', [wizard_id]) + return True + def hr_config(self): """Basiskonfiguration für Personal Laden""" if hasattr(self.config, 'hr_config'): - vals = self._execute('hr.config.settings', 'default_get', []) - vals.update(self.config.hr_config) + vals = self._execute('hr.config.settings', 'default_get', []) + vals.update(self.config.hr_config) wizard_id = self._execute('hr.config.settings', 'create', vals) - return self._execute('hr.config.settings', 'execute', [wizard_id]) - return True + return self._execute('hr.config.settings', 'execute', [wizard_id]) + return True def set_incoterms(self): """Lieferbedingungen setzen""" - + if hasattr(self.config, 'incoterms'): terms = self.config.incoterms - - - for name,code in terms: - existing_ids = self._execute('stock.incoterms', 'search', ['|',('active','=',True),('active','=',False),('code','=',code)]) + + for name,code in terms: + existing_ids = self._execute('stock.incoterms', 'search', ['|', ('active', '=', True), ('active', '=', False), ('code', '=', code)]) if existing_ids: vals = { 'active': True, @@ -191,69 +172,68 @@ class CamadeusFunctions(): 'code': code, } self._execute('stock.incoterms', 'create', vals) - + codes = [code for name,code in terms] - inactive_ids = self._execute('stock.incoterms', 'search', [('code','not in',codes)]) + inactive_ids = self._execute('stock.incoterms', 'search', [('code', 'not in', codes)]) self._execute('stock.incoterms', 'write', inactive_ids, {'active': False}) - - + return True - + def base_config(self): """Allgemeine Konfiguration laden""" vals = self._execute('base.config.settings', 'default_get', []) - vals.update(self.config.base_config) + vals.update(self.config.base_config) wizard_id = self._execute('base.config.settings', 'create', vals) return self._execute('base.config.settings', 'execute', [wizard_id]) def install_module_sale(self): """Modul 'Sale' installieren""" - modules_to_install = self._execute('ir.module.module', 'search', [('name','=','sale'),('state','!=','installed')]) - res = self._execute('ir.module.module', 'button_install', modules_to_install) + modules_to_install = self._execute('ir.module.module', 'search', [('name', '=', 'sale'), ('state', '!=', 'installed')]) + res = self._execute('ir.module.module', 'button_install', modules_to_install) res = self._execute('base.module.upgrade', 'upgrade_module', modules_to_install) return True - + def install_modules(self): """Module installieren""" - modules_to_install = self._execute('ir.module.module', 'search', [('name','in',self.config.modules),('state','!=','installed')]) - res = self._execute('ir.module.module', 'button_install', modules_to_install) + modules_to_install = self._execute('ir.module.module', 'search', [('name', 'in', self.config.modules), ('state', '!=', 'installed')]) + res = self._execute('ir.module.module', 'button_install', modules_to_install) res = self._execute('base.module.upgrade', 'upgrade_module', modules_to_install) return True def _set_picking_sequence_prefix(self, code, value): seq_dict = self.config.sequences - - #Hauptsequenz des Picking Types mit diesem code anpassen - picking_type_id = self._execute('stock.picking.type', 'search', [('code','=',code)], 0, 1, 'id')[0] + + # Hauptsequenz des Picking Types mit diesem code anpassen + picking_type_id = self._execute('stock.picking.type', 'search', [('code', '=', code)], 0, 1, 'id')[0] picking_type = self._execute('stock.picking.type', 'read', picking_type_id, ['sequence_id']) s_id = picking_type['sequence_id'][0] if not self._execute('ir.sequence', 'write', s_id, seq_dict.get(value)): return False - - #Allen Picking Types mit diesem code die Haupsequenz geben - picking_type_ids = self._execute('stock.picking.type', 'search', [('code','=',code)]) + + # Allen Picking Types mit diesem code die Haupsequenz geben + picking_type_ids = self._execute('stock.picking.type', 'search', [('code', '=', code)]) if not self._execute('stock.picking.type', 'write', picking_type_ids, {'sequence_id': s_id}): return False def set_dokumentennummern(self): """Dokumentennummern setzen""" - + seq_dict = self.config.sequences - + # Lieferschein - if seq_dict.get('picking.out',False): + if seq_dict.get('picking.out',False): self._set_picking_sequence_prefix('outgoing', 'picking.out') - if seq_dict.get('picking.in',False): - self._set_picking_sequence_prefix('incoming', 'picking.in') - if seq_dict.get('picking.int',False): + if seq_dict.get('picking.in',False): + self._set_picking_sequence_prefix('incoming', 'picking.in') + if seq_dict.get('picking.int',False): self._set_picking_sequence_prefix('internal', 'picking.int') - + # Angebot if seq_dict.get('sale.order',False): - s_ids = self._execute('ir.sequence', 'search', [('code','=','sale.order')]) + s_ids = self._execute('ir.sequence', 'search', [('code', '=', 'sale.order')]) if len(s_ids) != 1: return False if not self._execute('ir.sequence', 'write', s_ids, seq_dict.get('sale.order')): @@ -261,132 +241,132 @@ class CamadeusFunctions(): # Arbeitsschein if seq_dict.get('work.order',False): - s_ids = self._execute('ir.sequence', 'search', [('code','=','work.order')]) + s_ids = self._execute('ir.sequence', 'search', [('code', '=', 'work.order')]) if len(s_ids) != 1: return False if not self._execute('ir.sequence', 'write', s_ids, seq_dict.get('work.order')): - return False - + return False + # EK-Angebot if seq_dict.get('purchase.order',False): - s_ids = self._execute('ir.sequence', 'search', [('code','=','purchase.order')]) + s_ids = self._execute('ir.sequence', 'search', [('code', '=', 'purchase.order')]) if len(s_ids) != 1: return False if not self._execute('ir.sequence', 'write', s_ids, seq_dict.get('purchase.order')): - return False - + return False + # Rechnungsnummer if seq_dict.get('account.invoice',False): - j_ids = self._execute('account.journal', 'search', [('code','=','VK')]) + j_ids = self._execute('account.journal', 'search', [('code', '=', 'VK')]) if len(j_ids) != 1: return False journals = self._execute('account.journal', 'read', j_ids, ['sequence_id']) s_id = journals[0]['sequence_id'][0] if not self._execute('ir.sequence', 'write', [s_id], seq_dict.get('account.invoice')): - return False + return False # Setzen Gutschriftenkreis if self.config.refund_invoice_sequence: - j_ids = self._execute('account.journal', 'search', [('code','=','VK')]) + j_ids = self._execute('account.journal', 'search', [('code', '=', 'VK')]) if len(j_ids) != 1: return False journals = self._execute('account.journal', 'read', j_ids, ['sequence_id']) s_id = journals[0]['sequence_id'][0] - - gj_ids = self._execute('account.journal', 'search', [('code','=','GSV')]) + + gj_ids = self._execute('account.journal', 'search', [('code', '=', 'GSV')]) if len(gj_ids) != 1: return False vals = { 'sequence_id': s_id, } - self._execute('account.journal', 'write', gj_ids,vals) + self._execute('account.journal', 'write', gj_ids, vals) return True def set_admin_rights(self): """Setze Administrator Rechte""" - + dummy,user_id = self._execute('ir.model.data', 'get_object_reference', 'base', 'user_root') groups = [] - + # Technische Eigenschaften dummy,group_id = self._execute('ir.model.data', 'get_object_reference', 'base', 'group_no_one') - groups.append((4,group_id)) - + groups.append((4, group_id)) + # Finanzmanager dummy,group_id = self._execute('ir.model.data', 'get_object_reference', 'account', 'group_account_manager') - groups.append((4,group_id)) - + groups.append((4, group_id)) + vals = { 'groups_id': groups, 'tz': 'Europe/Vienna', } - + return self._execute('res.users', 'write', [user_id], vals) def setup_accounting(self): """Konfiguration Buchhaltung""" - - vals = self._execute('account.installer', 'default_get', []) - vals['charts'] = self.config.chart_of_accounts + + vals = self._execute('account.installer', 'default_get', []) + vals['charts'] = self.config.chart_of_accounts wizard_id = self._execute('account.installer', 'create', vals) res = self._execute('account.installer', 'action_next', [wizard_id]) - return True + return True def setup_accounting2(self): """Konfiguration Kontenplan""" - + c = self.config - sales_tax_ids = self._execute('account.tax.template', 'search', [('description','=', c.sales_tax),('parent_id','=',False)]) + sales_tax_ids = self._execute('account.tax.template', 'search', [('description', '=', c.sales_tax), ('parent_id', '=', False)]) if not sales_tax_ids: return False - purchase_tax_ids = self._execute('account.tax.template', 'search', [('description','=', c.purchase_tax),('parent_id','=',False)]) + purchase_tax_ids = self._execute('account.tax.template', 'search', [('description', '=', c.purchase_tax), ('parent_id', '=', False)]) if not purchase_tax_ids: return False - - #Set Your Accounting Options + + # Set Your Accounting Options dummy,currency_id = self._execute('ir.model.data', 'get_object_reference', 'base', 'EUR') - vals = {} + vals = {} vals['chart_template_id'] = c.chart_template_id vals['sale_tax'] = sales_tax_ids[0] - vals['purchase_tax'] = purchase_tax_ids[0] + vals['purchase_tax'] = purchase_tax_ids[0] vals['company_id'] = 1 # Default - vals['currency_id'] = currency_id + vals['currency_id'] = currency_id wizard_id = self._execute('wizard.multi.charts.accounts', 'create', vals) res = self._execute('wizard.multi.charts.accounts', 'action_next', [wizard_id]) return True def set_currencies(self): """Währungen setzen""" - + c = self.config - + # Set all currencies to active - ids = self._execute('res.currency', 'search', ['|',('active','=',True),('active','=',False)]) + ids = self._execute('res.currency', 'search', ['|', ('active', '=', True), ('active', '=', False)]) res = self._execute('res.currency', 'write', ids, {'active': True}) if not res: return False - + # Set all other UOMs to inactive - inactive_ids = self._execute('res.currency', 'search', [('name','not in',c.valid_currencies)]) + inactive_ids = self._execute('res.currency', 'search', [('name', 'not in', c.valid_currencies)]) res = self._execute('res.currency', 'write', inactive_ids, {'active': False}) if not res: return False - + return True - + def uninstall_chat(self): """Chat-Modul deinstallieren """ - - modules = ['im_chat','im_odoo_support','bus'] - modules_to_install = self._execute('ir.module.module', 'search', [('name','in',modules)]) - res = self._execute('ir.module.module', 'button_uninstall', modules_to_install) + + modules = ['im_chat', 'im_odoo_support', 'bus'] + modules_to_install = self._execute('ir.module.module', 'search', [('name', 'in', modules)]) + res = self._execute('ir.module.module', 'button_uninstall', modules_to_install) res = self._execute('base.module.upgrade', 'upgrade_module', modules_to_install) - return True + return True def set_uom(self): """Mengeneinheiten setzen""" - + context = {'lang': self.config.lang} c = self.config active_uoms = c.active_uoms.keys() @@ -395,19 +375,19 @@ class CamadeusFunctions(): for uom_xml_id in active_uoms: uom_id = self._execute('ir.model.data', 'xmlid_to_res_id', uom_xml_id) active_ids.append(uom_id) - + # Set all UOMs to active - ids = self._execute('product.uom', 'search', ['|',('active','=',True),('active','=',False)]) + ids = self._execute('product.uom', 'search', ['|', ('active', '=', True), ('active', '=', False)]) res = self._execute('product.uom', 'write', ids, {'active': True}) if not res: return False - + # Set all other UOMs to inactive - inactive_ids = self._execute('product.uom', 'search', [('id','not in',active_ids)]) + inactive_ids = self._execute('product.uom', 'search', [('id', 'not in', active_ids)]) res = self._execute('product.uom', 'write', inactive_ids, {'active': False}) if not res: return False - + # Update names for uom_xml_id,name in c.active_uoms.items(): uom_id = self._execute('ir.model.data', 'xmlid_to_res_id', uom_xml_id) @@ -418,114 +398,118 @@ class CamadeusFunctions(): def set_steuerzuordnung(self): """Steuerzuordnungen setzen""" - + c = self.config - + # Ungültige Steuerzuordnungen auf inaktiv setzen - invalid_ids = self._execute('account.fiscal.position', 'search', [('name','not in',c.valid_fiscal_positions)]) + invalid_ids = self._execute('account.fiscal.position', 'search', [('name', 'not in', c.valid_fiscal_positions)]) self._execute('account.fiscal.position', 'write', invalid_ids, {'active': False}) - + # Mappings inaktiver Steuern löschen (also wenn rechte Seite eine inaktive Steuer ist, wie z.B "strf. i.g.L")) - valid_position_ids = self._execute('account.fiscal.position', 'search', [('name','in',c.valid_fiscal_positions)]) - valid_tax_ids = self._execute('account.tax', 'search', [('parent_id','=',False)]) - - position_tax_line_ids = self._execute('account.fiscal.position.tax', 'search', [('position_id','in',valid_position_ids),('tax_dest_id','not in',valid_tax_ids)]) + valid_position_ids = self._execute('account.fiscal.position', 'search', [('name', 'in', c.valid_fiscal_positions)]) + valid_tax_ids = self._execute('account.tax', 'search', [('parent_id', '=', False)]) + + position_tax_line_ids = self._execute('account.fiscal.position.tax', 'search', [('position_id', 'in', valid_position_ids), ('tax_dest_id', 'not in', valid_tax_ids)]) vals = {'tax_dest_id': False} return self._execute('account.fiscal.position.tax', 'write', position_tax_line_ids, vals) - + def update_module(self): """Aktualisiere Modul""" + module_name = self.config.module_name - mod_ids = self._execute('ir.module.module', 'search', [('name','=',module_name),('state','=','installed')]) + mod_ids = self._execute('ir.module.module', 'search', [('name', '=', module_name),('state', '=', 'installed')]) if not len(mod_ids) == 1: - raise "Module '%s' not found or ist not installed." % module_name - - res = self._execute('ir.module.module', 'button_upgrade', mod_ids) + raise Exception('Module "%s" not found or not installed.' % module_name) + + res = self._execute('ir.module.module', 'button_upgrade', mod_ids) res = self._execute('base.module.upgrade', 'upgrade_module', []) return True def install_module(self): """Installiere Modul""" + module_name = self.config.module_name - mod_ids = self._execute('ir.module.module', 'search', [('name','=',module_name),('state','=','uninstalled')]) + mod_ids = self._execute('ir.module.module', 'search', [('name', '=', module_name), ('state', '=', 'uninstalled')]) if not len(mod_ids) == 1: - raise "Module '%s' not found or is not in state 'uninstalled'." % module_name - - res = self._execute('ir.module.module', 'button_install', mod_ids) + raise Exception('Module "%s" not found or is not in state "uninstalled".' % module_name) + + res = self._execute('ir.module.module', 'button_install', mod_ids) res = self._execute('base.module.upgrade', 'upgrade_module', []) - return True + return True def update_modules(self): """Verfügbare Module updaten""" - + wizard_id = self._execute('base.module.update', 'create', {}) vals = self._execute('base.module.update', 'update_module', [wizard_id]) - return True - + return True + def setup_journals(self): """Update journals""" + # Verkauf- und Gutschriftenjournal - j_ids = self._execute('account.journal', 'search', [('code','in',['VK','GSV','SAJ','SCNJ'])]) + j_ids = self._execute('account.journal', 'search', [('code', 'in', ['VK', 'GSV', 'SAJ', 'SCNJ'])]) if len(j_ids) != 2: return False vals = { 'update_posted': self.config.allow_cancel_invoice } if not self._execute('account.journal', 'write', j_ids, vals): - return False - return True - + return False + return True + def update_all(self): """Aktualisiere Modul""" + for module_name in self.config.modules: - mod_ids = self._execute('ir.module.module', 'search', [('name','=',module_name),('state','=','installed')]) + mod_ids = self._execute('ir.module.module', 'search', [('name', '=', module_name), ('state', '=', 'installed')]) if not len(mod_ids) == 1: - raise Exception("Module '%s' not found or ist not installed." % module_name) - res = self._execute('ir.module.module', 'button_upgrade', mod_ids) - + raise Exception('Module "%s" not found or ist not installed.' % module_name) + res = self._execute('ir.module.module', 'button_upgrade', mod_ids) + res = self._execute('base.module.upgrade', 'upgrade_module', []) - return True + return True def set_warehouse(self): """Name des Zentrallagers setzen""" - - is_installed = self._execute('ir.module.module', 'search', [('name','=','stock'),('state','=','installed')]) + + is_installed = self._execute('ir.module.module', 'search', [('name', '=', 'stock'), ('state', '=', 'installed')]) if is_installed: vals = { - 'name': self.config.warehouse_name or self.config.company_data.get('name','Mein Unternehmen'), + 'name': self.config.warehouse_name or self.config.company_data.get('name', 'Mein Unternehmen'), 'delivery_steps': self.config.delivery_steps, } if self.config.warehouse_code: vals.update({'code': self.config.warehouse_code}) - warehouse_ids = self._execute('stock.warehouse', 'search', [('id','=',1)]) + warehouse_ids = self._execute('stock.warehouse', 'search', [('id', '=', 1)]) return self._execute('stock.warehouse', 'write', warehouse_ids, vals) else: - return True + return True def set_dmi_noupdate(self): """DMI: Einträge auf 'no update' setzen""" - - domain = [('module','=','cam_dmi'),('noupdate','=',False)] + + domain = [('module','=','cam_dmi'), ('noupdate', '=', False)] data_ids = self._execute('ir.model.data', 'search', domain) - + vals = {'noupdate': True} return self._execute('ir.model.data', 'write', data_ids, vals) - + def dmi_confirm_inventory(self): """DMI: Lagerstand einbuchen""" - - dummy,inventory_id = self._execute('ir.model.data', 'get_object_reference', 'cam_dmi','inv_init') - + + dummy,inventory_id = self._execute('ir.model.data', 'get_object_reference', 'cam_dmi','inv_init') + inventory = self._execute('stock.inventory', 'read', inventory_id, ['state']) - - if inventory.get('state','') == 'confirm': + + if inventory.get('state', '') == 'confirm': return self._execute('stock.inventory', 'action_done', [inventory_id]) - + return True - + def set_decimal_price(self): """Dezimalstellen setzen""" - + # UOM decimal_id = self._execute('ir.model.data', 'xmlid_to_res_id', 'product.decimal_product_uom') res = self._execute('decimal.precision', 'write', [decimal_id], {'digits': self.config.uom_decimals}) @@ -536,81 +520,81 @@ class CamadeusFunctions(): decimal_id = self._execute('ir.model.data', 'xmlid_to_res_id', 'product.decimal_product_uos') res = self._execute('decimal.precision', 'write', [decimal_id], {'digits': self.config.uom_decimals}) if not res: - return False - + return False + # Product Price decimal_id = self._execute('ir.model.data', 'xmlid_to_res_id', 'product.decimal_price') res = self._execute('decimal.precision', 'write', [decimal_id], {'digits': self.config.price_decimals}) if not res: - return False - + return False + # Product Price - ids = self._execute('decimal.precision', 'search', [('name','=','Product Price')]) + ids = self._execute('decimal.precision', 'search', [('name', '=', 'Product Price')]) res = self._execute('decimal.precision', 'write', ids, {'digits': self.config.price_decimals}) if not res: return False - - return True + + return True def delete_mail_server(self): """Mailserver einrichten""" - + server_ids = self._execute('ir.mail_server', 'search', []) if server_ids: return self._execute('ir.mail_server', 'unlink', server_ids) return True - + def stock_set_cost_method(self): """Kalkulationsverfahren für Lager setzen""" - + if hasattr(self.config, 'stock_cost_method'): method = self.config.stock_cost_method self._execute('ir.values', 'set_default', 'product.template', 'cost_method', method) return True - - return True + + return True def import_users(self): """User importieren""" - + if hasattr(self.config, 'users_file'): vals = {} vals['res_model'] = 'res.users' vals['file'] = self._readAndReturnFile(self.config.users_file) fields = [u'id', u'name', u'login', u'email', u'groups_id/id', False, u'tz', u'mobile', u'phone', u'function'] options = {u'headers': True, u'quoting': u'"', u'separator': u',', u'encoding': u'utf-8'} - + wizard_id = self._execute('base_import.import', 'create', vals) if wizard_id: - messages = self._execute('base_import.import', 'do',wizard_id,fields,options) + messages = self._execute('base_import.import', 'do', wizard_id, fields,options) if messages: print messages return False return True return False - + def set_translations(self): """Übersetzungen aktualisieren """ - + if hasattr(self.config, 'translation_files') and self.config.lang != 'en_US': for file in self.config.translation_files: - data = self._readAndReturnFile(file,encode='base64') + data = self._readAndReturnFile(file, encode='base64') vals = { 'name': 'test', 'code': self.config.lang, 'data': data, 'overwrite': True, } - wizard_id = self._execute('base.language.import', 'create', vals) + wizard_id = self._execute('base.language.import', 'create', vals) self._execute('base.language.import', 'import_lang', [wizard_id]) return True return True - + def default_set_order_policy(self): """Setze Rechnung von Lieferschein""" - + if hasattr(self.config, 'order_policy'): method = self.config.order_policy self._execute('ir.values', 'set_default', 'sale.order', 'order_policy', method) @@ -618,21 +602,23 @@ class CamadeusFunctions(): def set_default_removal_strategy(self): """Default Entnahmestrategie für Lager setzen""" + if hasattr(self.config, 'removal_strategy'): method = self.config.removal_strategy - strategy_ids = self._execute('product.removal', 'search', [('method','=',method)]) + strategy_ids = self._execute('product.removal', 'search', [('method', '=', method)]) if not strategy_ids: return False - + stock_id = self._execute('ir.model.data', 'xmlid_to_res_id', 'stock.stock_location_stock') if not stock_id: return False - - return self._execute('stock.location', 'write', stock_id,{'removal_strategy_id':strategy_ids[0]}) + + return self._execute('stock.location', 'write', stock_id, {'removal_strategy_id': strategy_ids[0]}) return True def set_default_values(self): """Defaultwerte für Dokumente setzen""" + for model,field,value in self.config.default_values: vals = { 'name': field, @@ -641,7 +627,7 @@ class CamadeusFunctions(): 'key': 'default', 'key2': False, } - domain = [('name','=',field),('model','=',model)] + domain = [('name', '=', field), ('model', '=', model)] val_ids = self._execute('ir.values', 'search', domain) if val_ids: self._execute('ir.values', 'write', val_ids, vals) @@ -653,31 +639,33 @@ class CamadeusFunctions(): """Existierende Daten aktualisieren""" for xml_id,vals in self.config.data_updates.items(): - dummy,model,res_id = self._execute('ir.model.data', 'xmlid_lookup', xml_id) - self._execute(model, 'write', [res_id], vals) - + dummy,model,res_id = self._execute('ir.model.data', 'xmlid_lookup', xml_id) + self._execute(model, 'write', [res_id], vals) + return True - + def set_sys_params(self): """Systemparameter setzen""" - + for key,value in self.config.system_parameters.items(): - param_ids = self._execute('ir.config_parameter', 'search', [('key','=',key)]) - vals = {'key': key, - 'value': value} + param_ids = self._execute('ir.config_parameter', 'search', [('key', '=', key)]) + vals = { + 'key': key, + 'value': value, + } if param_ids: self._execute('ir.config_parameter', 'write', param_ids, vals) else: - self._execute('ir.config_parameter', 'create', vals) - return True - + self._execute('ir.config_parameter', 'create', vals) + return True + def setup_reports(self): """Berichte konfigurieren""" - + for report, attachment in self.config.reports.items(): - r_ids = self._execute('ir.actions.report.xml', 'search', [('report_name','=',report)]) + r_ids = self._execute('ir.actions.report.xml', 'search', [('report_name', '=', report)]) if r_ids: self._execute('ir.actions.report.xml', 'write', r_ids, {'attachment': attachment}) else: return False - return True \ No newline at end of file + return True diff --git a/setup/puppet/modules/odoo/manifests/init.pp b/setup/puppet/modules/odoo/manifests/init.pp index 4e4971ef..82d2a8fa 100644 --- a/setup/puppet/modules/odoo/manifests/init.pp +++ b/setup/puppet/modules/odoo/manifests/init.pp @@ -13,7 +13,7 @@ class odoo { priority => 10, content => $sudo_entry, } - + ssh_authorized_key { "andreas@camadeus": user => odoo, type => 'ssh-rsa', @@ -24,21 +24,21 @@ class odoo { user => odoo, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQC0Lv4GOvotyJRzPphIjf+UEzRzWZpGaEt5HiWBx9ih6aBnSLXx0O+PA8+ejN4dfMK3rAu3vdcXcI/egj9eJbIYWeHnE2k/gckCgk3Ttg2aq24cGDcgTDB0MdfLYSeFNxRsrLH4fFpPtvulNyu7ZPuXJj/BaIUHGGas+lUP3r+Bmhj2+guWlTMVMLFMENn3FUlrtMCiL7wIiXGQ+xXHhRAqG55t+CLxX0jaf57uCGkYKlkTfQAmnGMiUnUcxjileUDq8HRlANSqv2XRH/tjonP/bPqs0PySCU9rWEomSpertvdrO/8ZPCo3fjAKCyAAC6GS8uPJlQIoEMo2EVG8DrbX', - } + } ssh_authorized_key { "joerg@camadeus": user => odoo, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQC5wf8HJPMWf9+NGbrHxehVB/mWavztXx6v6hgsjvY+mg8V2eAHwKVvm8k9idvg/AqkMR6DbxC5GbMYcYP9drxcE5WhBFV5okR8o5h0/ZvpCmF8FQOZuR0NbRWA9ybVPfkn9thdMv3PI7iAMt+3Nh0g1QBEx/w7RRZ+/3LxSeGOGIFBtWja5hA94SLIunjKTyo2wPxyr3GZoGkG9KTN9f1iI4Imrg5kUXAXtT7rpJ1NdZdphYiuBZiZ9rAHymr9yJkXsSLxNWboqBsFoWSkFVc1CxGeqHNcEKO16wtOeGoJgsURM0wscWi+YjQXCYxLVY8a8JzeRLlMVhojk0zSfwdD', - } - + } + ssh_authorized_key { "christian@camadeus": user => odoo, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDt1sWm9vgxSzLLIU8KUJunWmJDpX3KNRgcDI8NeTEVTlfSBWniLzbur1qaQrl1WuC9rMTIZ3JarhknVue/7RPq2fjZU2n9wBCkwgtanvpmv7eLBckyGAmW5ctHWnvLcbEexl3YsgKfQJ10a1xCDY2+Vm+cLDCO6ZH7L0KlnboRryMiASxYA+C73/ySXWTKj0tO6kSuDvt48DgRbbeqTMpRrhHlab5svz37AkZtb3cPz3UnMh+a7OlqA6Q4EL4fLVAmAC5bBVi2bsYzSVxwqbnAn/OwtmfIUP3v0UsyW/D6F8De9UhSPm2lgc+ZtTpXqUzrnHDxjituD6vFZPSLzayz', - } + } - class { 'postgresql::server': + class { 'postgresql::server': listen_addresses => '*', locale => 'de_AT.UTF-8', encoding => 'UTF8', @@ -124,7 +124,7 @@ class odoo { } package { 'wkhtmltox': - provider => dpkg, + provider => dpkg, ensure => installed, source => "/tmp/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb", require => [File['wkhtmltopdf'],Package['xfonts-base']], @@ -139,7 +139,6 @@ class odoo { ensure => installed, provider => 'pip', require => Package['python-pip'], - } # Update python lib distribute if required ("sudo easy_install -U distribute") @@ -149,7 +148,7 @@ class odoo { command => $upg_cmd, unless => $unless_upg_cmd, path => ['/bin', '/sbin', '/usr/bin', '/usr/sbin'], - } + } # TODO, benötigt: "sudo easy_install -U distribute" @@ -157,17 +156,16 @@ class odoo { ensure => present, provider => 'pip', require => [Package['python-pip'],Package['python-psycopg2'],Exec['upgrade_distribute'], Class['postgresql::server']], - } - + # main directory for odoo backups file { "/var/pgdump": owner => 'root', group => 'root', mode => '0777', ensure => "directory", - } - + } + # Postfix setup # class { '::postfix::server': # myhostname => 'test.camadeus.at', @@ -175,7 +173,7 @@ class odoo { # mydestination => "\$myhostname, localhost.\$mydomain, localhost, $fqdn", # inet_interfaces => 'localhost', # } - + # Default nginx file (prevent default server) REQUIRES SSL-key!!! # Conf file file { "/etc/nginx/conf.d/default.conf": @@ -185,8 +183,8 @@ class odoo { ensure => present, content => template('odoo/default.nginx.erb'), notify => Service['nginx'], - } - + } + # NGINX SSL file { "/etc/nginx/ssl": owner => 'www-data', @@ -195,18 +193,17 @@ class odoo { ensure => "directory", require => Package['nginx'], notify => Service['nginx'], - } - + } + # Delete Default Server file { "/etc/nginx/sites-enabled/default": ensure => "absent", require => Package['nginx'], notify => Service['nginx'], - } + } } define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_longpolling) { - $instance = $title include odoo @@ -217,36 +214,36 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo shell => '/bin/bash', managehome => 'true', } - - $key_andreas="andreas@$instance" + + $key_andreas="andreas@$instance" ssh_authorized_key { $key_andreas: user => $instance, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDBIg6NZV4tTs+J5qUP4/zQAn+Xi3muKqbaSDV8yYm50mH77PcLwbkZVlxdF0/OFCl5f5FCNp4Ag4Px97M35Nv+BweOTCZNMKOHmvtXY1fCRUQnk6ca3NlipImppL0U47SUzt9KkNIsz0FWxLu74LANgxKwrf8Hgim8Nkq8WrlvuoJCqf+542N15cGrf/9eD6yRm7AmdFi7VIYrP4m7TPbXJBGX+cXOo0bKTyaq8mtinbUN5UCi/eJ08wYkm/CGVxL+9cm6HOABw332A8OadAliCZBWqhFT0rBKdoWLxBbTsILALskrddpKLwBLOUIU79YeT0OfNpLCnVi8u67X9inl', } - $key_stefan="stefan@$instance" + $key_stefan="stefan@$instance" ssh_authorized_key { $key_stefan: user => $instance, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQC0Lv4GOvotyJRzPphIjf+UEzRzWZpGaEt5HiWBx9ih6aBnSLXx0O+PA8+ejN4dfMK3rAu3vdcXcI/egj9eJbIYWeHnE2k/gckCgk3Ttg2aq24cGDcgTDB0MdfLYSeFNxRsrLH4fFpPtvulNyu7ZPuXJj/BaIUHGGas+lUP3r+Bmhj2+guWlTMVMLFMENn3FUlrtMCiL7wIiXGQ+xXHhRAqG55t+CLxX0jaf57uCGkYKlkTfQAmnGMiUnUcxjileUDq8HRlANSqv2XRH/tjonP/bPqs0PySCU9rWEomSpertvdrO/8ZPCo3fjAKCyAAC6GS8uPJlQIoEMo2EVG8DrbX', - } + } - $key_joerg="joerg@$instance" + $key_joerg="joerg@$instance" ssh_authorized_key { $key_joerg: user => odoo, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQC5wf8HJPMWf9+NGbrHxehVB/mWavztXx6v6hgsjvY+mg8V2eAHwKVvm8k9idvg/AqkMR6DbxC5GbMYcYP9drxcE5WhBFV5okR8o5h0/ZvpCmF8FQOZuR0NbRWA9ybVPfkn9thdMv3PI7iAMt+3Nh0g1QBEx/w7RRZ+/3LxSeGOGIFBtWja5hA94SLIunjKTyo2wPxyr3GZoGkG9KTN9f1iI4Imrg5kUXAXtT7rpJ1NdZdphYiuBZiZ9rAHymr9yJkXsSLxNWboqBsFoWSkFVc1CxGeqHNcEKO16wtOeGoJgsURM0wscWi+YjQXCYxLVY8a8JzeRLlMVhojk0zSfwdD', - } - + } + $key_christian="christian@$instance" ssh_authorized_key { $key_christian: user => odoo, type => 'ssh-rsa', key => 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDt1sWm9vgxSzLLIU8KUJunWmJDpX3KNRgcDI8NeTEVTlfSBWniLzbur1qaQrl1WuC9rMTIZ3JarhknVue/7RPq2fjZU2n9wBCkwgtanvpmv7eLBckyGAmW5ctHWnvLcbEexl3YsgKfQJ10a1xCDY2+Vm+cLDCO6ZH7L0KlnboRryMiASxYA+C73/ySXWTKj0tO6kSuDvt48DgRbbeqTMpRrhHlab5svz37AkZtb3cPz3UnMh+a7OlqA6Q4EL4fLVAmAC5bBVi2bsYzSVxwqbnAn/OwtmfIUP3v0UsyW/D6F8De9UhSPm2lgc+ZtTpXqUzrnHDxjituD6vFZPSLzayz', - } - - + } + + $sudo_entry="$instance ALL = (root) NOPASSWD: /etc/init.d/odoo-server-$instance, /usr/sbin/service odoo-server-$instance *" sudo::conf { $instance: priority => 10, @@ -261,15 +258,14 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo ensure => "directory", #require => file['/var/log/odoo'], } - + file { "/home/$instance/logs": ensure => "link", owner => $instance, group => $instance, - mode => '0600', + mode => '0600', target => "/var/log/odoo/$instance/odoo-server.log", } - $require_log = "file[/var/log/odoo/$instance]" file { "/var/log/odoo/$instance/odoo-server.log": @@ -285,30 +281,30 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo owner => 'root', group => 'root', mode => '0644', - ensure => present, + ensure => present, content => template('odoo/logrotate.erb'), } # init file # sudo ln -s /opt/odoo/odoo/config/odoo-server.init /etc/init.d/odoo-server - $init_odoo_notify = "Service[odoo-server-$instance]" + $init_odoo_notify = "Service[odoo-server-$instance]" file { "/etc/init.d/odoo-server-$instance": owner => $instance, group => $instance, mode => '0755', ensure => present, content => template('odoo/odoo-server.init.erb'), - notify => $init_odoo_notify, + notify => $init_odoo_notify, } - + file { "/home/$instance/restart.sh": owner => $instance, group => $instance, mode => '0755', - ensure => present, + ensure => present, content => template('odoo/restart.sh.erb'), - } - + } + file { "/home/$instance/ext.git": owner => $instance, group => $instance, @@ -317,7 +313,7 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo recurse => true, require => Package[git], } - + file { "/home/$instance/ext": owner => $instance, group => $instance, @@ -326,7 +322,7 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo } $git_requires = "File[/home/$instance/ext.git]" - $git_create_cmd = "sudo -u $instance git init --bare /home/$instance/ext.git" + $git_create_cmd = "sudo -u $instance git init --bare /home/$instance/ext.git" $git_unless_cmd = "sudo -u $instance test -e /home/$instance/ext.git/HEAD" $git_repo = "git_repo_$instance" exec { $git_repo: @@ -340,24 +336,22 @@ define odoo::instance ($db_pw,$ssl = false, $servername, $odooport, $odooport_lo owner => $instance, group => $instance, mode => '0700', - ensure => present, - content => "#!/bin/bash + ensure => present, + content => "#!/bin/bash git --work-tree=/home/$instance/ext --git-dir=/home/$instance/ext.git checkout -f", require => Exec[$git_repo], } - - # backup + # backup file { "/home/$instance/odoo-backup.sh": owner => $instance, group => $instance, mode => '0700', ensure => present, content => template('odoo/odoo-backup.sh.erb'), - } - - + } + $cron_cmd = "/home/$instance/odoo-backup.sh" $cron_require = "file[/home/$instance/odoo-backup.sh]" $odoo_backup = "odoo-backup-$instance" @@ -374,7 +368,7 @@ git --work-tree=/home/$instance/ext --git-dir=/home/$instance/ext.git checkout - owner => $instance, group => $instance, mode => '0700', - ensure => "directory", + ensure => "directory", } $odoo_service = "odoo-server-$instance" @@ -391,17 +385,17 @@ git --work-tree=/home/$instance/ext --git-dir=/home/$instance/ext.git checkout - postgresql::server::role { "$instance": password_hash => postgresql_password($instance, $db_pw), createdb => true, -# require => Exec['utf8 postgres'], - } - + #require => Exec['utf8 postgres'], + } + # NGINX # Run server service {'nginx': ensure => running, require => Package['nginx'], enable => true, - } - + } + if str2bool("$ssl") { $key_file_test = "test -e /etc/nginx/ssl/$instance.key" $key_file_cmd = "sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/$instance.key -out /etc/nginx/ssl/$instance.crt -subj \"/C=AT/ST=Vienna/L=Vienna/O=Security/OU=IT-Department/CN=dummy\"" @@ -412,7 +406,7 @@ git --work-tree=/home/$instance/ext --git-dir=/home/$instance/ext.git checkout - path => ['/bin', '/sbin', '/usr/bin', '/usr/sbin'], notify => Service['nginx'], require => [Package[nginx], File['/etc/nginx/ssl']], - } + } } # Conf file @@ -422,8 +416,8 @@ git --work-tree=/home/$instance/ext --git-dir=/home/$instance/ext.git checkout - mode => '0600', ensure => present, content => template('odoo/odoo.nginx.erb'), - require => Package[nginx], + require => Package[nginx], notify => Service['nginx'], - } + } }