Author SHA1 Message Date
mreul f278437df6 Algemene Mailcatcher toegevoegd voor hnode4 2026-01-15 12:36:07 +00:00
mreul 4504989145 Toegevoegd: Disable google_analytics + Unpublish products in webshop 2025-05-13 14:36:52 +00:00
mreul 85942b0339 Stagingarea (node) variabel gemaakt 2024-11-05 15:03:15 +00:00
mreul f0d7c56315 Update README.md 2024-06-10 13:16:00 +00:00
mreul d57844af24 Update README.md 2024-03-26 08:46:14 +00:00
mreul 2b524051c3 Functie aanroepen vanuit data.xml 2024-02-26 21:58:57 +00:00
root 1ee214c70a Initiele commit 2024-02-26 14:30:29 +00:00
root c8e217dd03 initiele commit 2024-02-23 16:15:05 +00:00
mreul cc6e5e4eec Add mailcatcher menu 2024-02-23 12:45:03 +01:00
33 changed files with 302 additions and 854 deletions
-1
View File
@@ -30,7 +30,6 @@ fi
go version
- Installeer nu Mailhog met het installatie script
```
## Na de installatie
+44 -73
View File
@@ -1,86 +1,57 @@
#!/bin/bash
set -e # stop bij fouten
echo ""
echo "==================================="
echo "Update apt..."
echo "==================================="
apt update
echo ""
echo "==================================="
echo "Install dependencies..."
echo "==================================="
apt-get -y install wget tar
echo ""
echo "==================================="
echo "Install Go 1.24.3..."
echo "==================================="
GO_VERSION=1.26.0
wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
# Go environment correct instellen
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
echo "Go version:"
go version
echo ""
echo "==================================="
echo "Installing MailHog..."
echo "==================================="
/usr/local/go/bin/go install github.com/mailhog/MailHog@latest
if [ -f "$HOME/go/bin/MailHog" ]; then
echo "MailHog installed successfully"
echo "";
echo "===================================";
echo "Install golang-go...";
echo "===================================";
apt-get -y install golang-go;
if [ $? == 0 ] ; then
echo 'golang-go installed'
else
echo "ERROR: MailHog binary not found!"
exit 1
echo 'ERROR: Installing golang-go NOT succesfull!'
exit
fi
echo ""
echo "==================================="
echo "Copy MailHog to /usr/local/bin..."
echo "==================================="
sudo cp "$HOME/go/bin/MailHog" /usr/local/bin/MailHog
echo ""
echo "==================================="
echo "Create MailHog service..."
echo "==================================="
sudo tee /etc/systemd/system/mailhog.service > /dev/null <<EOL
echo "";
echo "===================================";
echo "Installing mailhog...";
echo "===================================";
go install github.com/mailhog/MailHog@latest;
if [ $? == 0 ] ; then
echo "";
echo "===================================";
echo "Mailcatcher installed succesfully!";
echo "===================================";
echo "";
else
echo 'ERROR: Installing Mailcatcher NOT succesfull!'
exit
fi
echo "===================================";
echo "Copy Mailhog to bin...";
echo "===================================";
sudo cp ~/go/bin/MailHog /usr/local/bin/MailHog
if [ $? == 0 ] ; then
echo 'Mailhog copied'
else
echo 'ERROR: Copy Mailhog NOT succesfull!'
exit
fi
echo "";
echo "===================================";
echo "Create MailHog service...";
echo "===================================";
sudo tee /etc/systemd/system/mailhog.service <<EOL
[Unit]
Description=MailHog
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/MailHog
Restart=always
Environment="PATH=/usr/local/go/bin:/usr/bin:/bin"
ExecStart=/usr/bin/env /usr/local/bin/MailHog > /dev/null 2>&1 &
[Install]
WantedBy=multi-user.target
EOL
echo ""
echo "==================================="
echo "Enable + start MailHog service..."
echo "==================================="
systemctl daemon-reload
systemctl enable mailhog
systemctl start mailhog
echo ""
echo "==================================="
echo "MailHog is running!"
echo "Web UI: http://localhost:8025"
echo "SMTP: localhost:1025"
echo "==================================="
echo "";
echo "===================================";
echo "Mailhog service created and started.";
echo "===================================";
-2
View File
@@ -2,5 +2,3 @@
from . import controllers
from . import models
from . import wizard
from .hooks import post_init_hook
+3 -8
View File
@@ -11,16 +11,11 @@
'author': "Open2bizz",
'website': "http://www.open2bizz.tech",
'category': 'Tools',
'license': "AGPL-3",
'version': '15.0.1.0.0',
'module_type': 'official',
'category': 'Uncategorized',
'version': '0.1',
'depends': ['mail','base',],
'data': [
'wizard/install_warning_wizard_view.xml',
'views/views.xml',
'data/data.xml',
'security/ir.model.access.csv',
'data/data.xml'
],
'post_init_hook': 'post_init_hook',
}
+17 -51
View File
@@ -1,55 +1,21 @@
# Copyright 2024 Open2Bizz <info@open2bizz.nl>
# License LGPL-3
import logging
import requests
from odoo import http
from odoo.http import request, Response
_logger = logging.getLogger(__name__)
MAILHOG_BASE = "http://localhost:8025"
# -*- coding: utf-8 -*-
# from odoo import http
class MailcatcherProxy(http.Controller):
# class TestserverO2b(http.Controller):
# @http.route('/testserver_o2b/testserver_o2b/', auth='public')
# def index(self, **kw):
# return "Hello, world"
@http.route(['/mailcatcher', '/mailcatcher/<path:subpath>'],
type='http', auth='user', website=False, csrf=False)
def mailcatcher_proxy(self, subpath='', **kw):
"""Proxy requests to the local MailHog instance."""
target_url = f"{MAILHOG_BASE}/{subpath}"
if request.httprequest.query_string:
target_url += '?' + request.httprequest.query_string.decode('utf-8')
# @http.route('/testserver_o2b/testserver_o2b/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('testserver_o2b.listing', {
# 'root': '/testserver_o2b/testserver_o2b',
# 'objects': http.request.env['testserver_o2b.testserver_o2b'].search([]),
# })
try:
headers = {
k: v for k, v in request.httprequest.headers
if k.lower() not in ('host', 'cookie', 'authorization')
}
resp = requests.request(
method=request.httprequest.method,
url=target_url,
headers=headers,
data=request.httprequest.get_data(),
timeout=30,
allow_redirects=False,
)
except requests.exceptions.ConnectionError:
_logger.warning("Could not connect to MailHog at %s", MAILHOG_BASE)
return Response("MailHog is not available", status=502)
excluded_headers = {
'content-encoding', 'content-length', 'transfer-encoding',
'connection',
}
response_headers = [
(k, v) for k, v in resp.headers.items()
if k.lower() not in excluded_headers
]
return Response(
resp.content,
status=resp.status_code,
headers=response_headers,
)
# @http.route('/testserver_o2b/testserver_o2b/objects/<model("testserver_o2b.testserver_o2b"):obj>/', auth='public')
# def object(self, obj, **kw):
# return http.request.render('testserver_o2b.object', {
# 'object': obj
# })
+1
View File
@@ -1,4 +1,5 @@
<odoo>
<data>
<function model="ir.config_parameter" name="_mailcatcher_url"/>
</data>
</odoo>
-40
View File
@@ -1,40 +0,0 @@
# Copyright 2024 Open2Bizz <info@open2bizz.nl>
# License LGPL-3
import logging
import os
import subprocess
_logger = logging.getLogger(__name__)
def post_init_hook(cr, registry):
"""Install MailHog as a systemd service when the module is installed."""
script_path = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'install_mailhog_as_service.sh',
)
if not os.path.isfile(script_path):
_logger.error("MailHog install script not found at %s", script_path)
return
_logger.info("Running MailHog install script: %s", script_path)
try:
result = subprocess.run(
['bash', script_path],
capture_output=True,
text=True,
timeout=300,
)
if result.returncode == 0:
_logger.info("MailHog installed successfully.\n%s", result.stdout)
else:
_logger.error(
"MailHog install script failed (exit %s):\n%s\n%s",
result.returncode, result.stdout, result.stderr,
)
except subprocess.TimeoutExpired:
_logger.error("MailHog install script timed out after 300 seconds")
except Exception as e:
_logger.error("Failed to run MailHog install script: %s", e)
@@ -1,86 +0,0 @@
#!/bin/bash
set -e # stop bij fouten
echo ""
echo "==================================="
echo "Update apt..."
echo "==================================="
apt update
echo ""
echo "==================================="
echo "Install dependencies..."
echo "==================================="
apt-get -y install wget tar
echo ""
echo "==================================="
echo "Install Go 1.24.3..."
echo "==================================="
GO_VERSION=1.24.3
wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
# Go environment correct instellen
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
echo "Go version:"
go version
echo ""
echo "==================================="
echo "Installing MailHog..."
echo "==================================="
/usr/local/go/bin/go install github.com/mailhog/MailHog@latest
if [ -f "$HOME/go/bin/MailHog" ]; then
echo "MailHog installed successfully"
else
echo "ERROR: MailHog binary not found!"
exit 1
fi
echo ""
echo "==================================="
echo "Copy MailHog to /usr/local/bin..."
echo "==================================="
sudo cp "$HOME/go/bin/MailHog" /usr/local/bin/MailHog
echo ""
echo "==================================="
echo "Create MailHog service..."
echo "==================================="
sudo tee /etc/systemd/system/mailhog.service > /dev/null <<EOL
[Unit]
Description=MailHog
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/MailHog
Restart=always
Environment="PATH=/usr/local/go/bin:/usr/bin:/bin"
[Install]
WantedBy=multi-user.target
EOL
echo ""
echo "==================================="
echo "Enable + start MailHog service..."
echo "==================================="
systemctl daemon-reload
systemctl enable mailhog
systemctl start mailhog
echo ""
echo "==================================="
echo "MailHog is running!"
echo "Web UI: http://localhost:8025"
echo "SMTP: localhost:1025"
echo "==================================="
+1 -1
View File
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
# No models needed — MailHog is accessed via the proxy controller
from . import mailcatcher_menu
+24 -2
View File
@@ -1,7 +1,29 @@
# Copyright 2024 Open2Bizz <info@open2bizz.nl>
# License LGPL-3
# MailHog is now accessed via the internal proxy controller at /mailcatcher/
# so no dynamic URL computation is needed anymore.
from odoo import api, fields, models, _
import logging
_logger = logging.getLogger(__name__)
class IrActionUrl(models.Model):
_inherit = "ir.config_parameter"
@api.model
#def init(self):
def _mailcatcher_url(self):
parameters = self.env['ir.config_parameter'].search([('key','=', 'web.base.url')])
if parameters:
parameter = parameters[0]
cont_nr = parameter.value.split("//",1)[1] #Haal https:// van string
cont_nr = cont_nr[0:3] #De eerste 3 karakters is het containernummer
node = parameter.value.split("staging",1)[1] #Haal alles van string weg t/m staging
node = node[0:1] #Het eerste karakters is het de stagingarea
act_url = "https://" + cont_nr + "-mailcatcher.staging" + node + ".open2bizz.com"
_logger.info('---------- ACT_URL ---------- %s', act_url)
action_id = self.env['ir.model.data']._xmlid_to_res_id('mailcatcher_menu.action_mailcatcher_url')
action = self.env['ir.actions.act_url'].browse(action_id)
if action:
action.write({'url':act_url})
@@ -1,2 +1,2 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_mailcatcher_install_warning_wizard","mailcatcher.install.warning.wizard","model_mailcatcher_install_warning_wizard","base.group_user",1,1,1,1
"access_mailcatcher_menu_mailcatcher_menu","mailcatcher_menu.mailcatcher_menu","model_mailcatcher_menu_mailcatcher_menu","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mailcatcher_install_warning_wizard access_mailcatcher_menu_mailcatcher_menu mailcatcher.install.warning.wizard mailcatcher_menu.mailcatcher_menu model_mailcatcher_install_warning_wizard model_mailcatcher_menu_mailcatcher_menu base.group_user 1 1 1 1
+2 -2
View File
@@ -3,12 +3,12 @@
<record model="ir.actions.act_url" id="action_mailcatcher_url">
<field name="name">Open Mailcatcher</field>
<field name="url">/mailcatcher/</field>
<field name="url">https://mailcatcher.staging.open2bizz.com</field>
<field name="target">new</field>
</record>
<!-- Top menu item -->
<menuitem name="MailCatcher" id="mailcatcher_menu.menu_root" sequence="999" web_icon="mailcatcher_menu,static/description/email-icon.png" action="action_mailcatcher_url"/>
<menuitem name="MailCatcher" id="mailcatcher_menu.menu_root" sequence="99" web_icon="mailcatcher_menu,static/description/email-icon.png" action="action_mailcatcher_url"/>
</data>
</odoo>
-3
View File
@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import install_warning_wizard
@@ -1,43 +0,0 @@
# Copyright 2024 Open2Bizz <info@open2bizz.nl>
# License LGPL-3
from odoo import models, fields, api, _
class MailcatcherInstallWarningWizard(models.TransientModel):
_name = 'mailcatcher.install.warning.wizard'
_description = 'MailCatcher Install Warning'
module_id = fields.Many2one('ir.module.module', string='Module', readonly=True)
def action_confirm_install(self):
"""User confirmed — proceed with the actual module installation."""
self.ensure_one()
return self.module_id.with_context(
skip_mailcatcher_warning=True
).button_immediate_install()
class IrModuleModule(models.Model):
_inherit = 'ir.module.module'
def button_immediate_install(self):
"""Override to show a warning before installing mailcatcher_menu."""
if self.env.context.get('skip_mailcatcher_warning'):
return super().button_immediate_install()
mailcatcher_modules = self.filtered(lambda m: m.name == 'mailcatcher_menu')
if mailcatcher_modules:
wizard = self.env['mailcatcher.install.warning.wizard'].create({
'module_id': mailcatcher_modules[0].id,
})
return {
'name': _('Install MailCatcher Module'),
'type': 'ir.actions.act_window',
'res_model': 'mailcatcher.install.warning.wizard',
'res_id': wizard.id,
'view_mode': 'form',
'target': 'new',
}
return super().button_immediate_install()
@@ -1,28 +0,0 @@
<odoo>
<record id="view_mailcatcher_install_warning_wizard" model="ir.ui.view">
<field name="name">mailcatcher.install.warning.wizard.form</field>
<field name="model">mailcatcher.install.warning.wizard</field>
<field name="arch" type="xml">
<form string="Install MailCatcher">
<div class="alert alert-warning" role="alert">
<h4 class="alert-heading">Warning</h4>
<p>
You are about to install the <strong>MailCatcher</strong> module.
</p>
<p>
This will also install <strong>MailHog</strong> as a systemd service on this server.
MailHog will listen on port <strong>8025</strong> (Web UI) and port <strong>1025</strong> (SMTP).
</p>
<p>
Do you want to proceed with the installation?
</p>
</div>
<footer>
<button name="action_confirm_install" type="object"
string="Confirm Install" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
</odoo>
+1 -1
View File
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
from .hooks import post_init_hook
from . import controllers
from . import models
+15 -10
View File
@@ -1,20 +1,25 @@
# -*- coding: utf-8 -*-
{
'name': "Set as testserver Open2Bizz",
'name': "testserver_o2b",
'summary': """
Only to be used when installed as TEST env. Open2Bizz""",
Short (1 phrase/line) summary of the module's purpose, used as
subtitle on modules listing or apps.openerp.com""",
'description': """
Long description of module's purpose
""",
'author': "Open2bizz",
'website': "http://www.open2bizz.tech",
'category': 'Tools',
'license': "AGPL-3",
'version': '15.0.1.0.0',
'depends': ['mail', 'base', 'mailcatcher_menu'],
'author': "My Company",
'website': "http://www.yourcompany.com",
'category': 'Uncategorized',
'version': '0.1',
'depends': ['web_environment_ribbon', 'mail','base',],
'data': [
'views/views.xml',
'views/templates.xml',
'data/ir_cron.xml',
],
'post_init_hook': 'post_init_hook',
'demo': [
'demo/demo.xml',
],
}
+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers
+21
View File
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# from odoo import http
# class TestserverO2b(http.Controller):
# @http.route('/testserver_o2b/testserver_o2b/', auth='public')
# def index(self, **kw):
# return "Hello, world"
# @http.route('/testserver_o2b/testserver_o2b/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('testserver_o2b.listing', {
# 'root': '/testserver_o2b/testserver_o2b',
# 'objects': http.request.env['testserver_o2b.testserver_o2b'].search([]),
# })
# @http.route('/testserver_o2b/testserver_o2b/objects/<model("testserver_o2b.testserver_o2b"):obj>/', auth='public')
# def object(self, obj, **kw):
# return http.request.render('testserver_o2b.object', {
# 'object': obj
# })
-29
View File
@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="ir_cron_set_db_parameter" model="ir.cron">
<field name="name">Testserver: Set Date (ONLY FOR TEST ENV.)</field>
<field name="model_id" ref="base.model_ir_logging"/>
<field name="state">code</field>
<field name="code">model.set_db_param()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="user_id" ref="base.user_root"/>
<field name="active">True</field>
</record>
<record id="ir_cron_cleanup_filestore_attachments" model="ir.cron">
<field name="name">Testserver: Cleanup Unneeded Filestore</field>
<field name="model_id" ref="base.model_ir_logging"/>
<field name="state">code</field>
<field name="code">model.cleanup_unneeded_filestore_attachments(5000)</field>
<field name="interval_number">15</field>
<field name="interval_type">minutes</field>
<field name="user_id" ref="base.user_root"/>
<field name="active">True</field>
</record>
<record id="base.autovacuum_job" model="ir.cron">
<field name="active">True</field>
</record>
</data>
</odoo>
+30
View File
@@ -0,0 +1,30 @@
<odoo>
<data>
<!--
<record id="object0" model="testserver_o2b.testserver_o2b">
<field name="name">Object 0</field>
<field name="value">0</field>
</record>
<record id="object1" model="testserver_o2b.testserver_o2b">
<field name="name">Object 1</field>
<field name="value">10</field>
</record>
<record id="object2" model="testserver_o2b.testserver_o2b">
<field name="name">Object 2</field>
<field name="value">20</field>
</record>
<record id="object3" model="testserver_o2b.testserver_o2b">
<field name="name">Object 3</field>
<field name="value">30</field>
</record>
<record id="object4" model="testserver_o2b.testserver_o2b">
<field name="name">Object 4</field>
<field name="value">40</field>
</record>
-->
</data>
</odoo>
-11
View File
@@ -1,11 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import api, SUPERUSER_ID
def post_init_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env['ir.logging'].sudo().cleanup_unneeded_filestore_attachments(
limit=50
)
+54 -192
View File
@@ -1,206 +1,68 @@
# -*- coding: utf-8 -*-
from odoo import tools
from odoo import api, fields, models
from datetime import datetime, timedelta
from collections.abc import Mapping
import logging
_logger = logging.getLogger(__name__)
import os
import uuid
import odoo
import logging
_logger = logging.getLogger(__name__)
class IrLogging(models.Model):
_inherit = 'ir.logging'
MAIL_SERVERS = (
('127.0.0.1', '1025', 'Lokale mailcatcher', 'login', 'name', 't'),
('192.168.78.199', '1025', 'Algemene mailcatcher', 'login', 'name', 'f'),
('hnode6.openworx.nl', '1025', 'Algemene mailcatcher vanaf hnode4', 'login', 'name', 'f'),
)
EXPECTED_IP_PREFIX = '192.168.78.'
REPORT_URL = 'http://127.0.0.1:8069'
ENTERPRISE_CODE = 'M160129258730'
FILESTORE_CLEANUP_BATCH_LIMIT = 100
def init(self):
database_uuid = str(uuid.uuid1())
_logger.debug(f"____ Database UID: {database_uuid}")
self._reset_base_configuration(database_uuid)
_logger.debug(f"_____ reset_base_configuration ____")
self._remove_param_if_exists('web.base.url.freeze')
_logger.debug(f"______ remove_param_if_exists web.base.url.freeze ____")
self._create_param_if_missing('report.url', self.REPORT_URL)
_logger.debug(f"_______ create_param_if_missing report.url ____")
self._disable_web_push_notifications()
_logger.debug(f"_______ disable_web_push_notifications ____")
self._disable_delivery_carrier_prod_environment()
_logger.debug(f"_______ disable_delivery_carrier_prod_environment ____")
self._disable_payment_providers()
_logger.debug(f"_______ disable_delivery_carrier_prod_environment ____")
self._clear_account_online_links()
_logger.debug(f"_______ _disable_payment_providers ____")
self._reset_bank_statement_source()
_logger.debug(f"_______ _reset_bank_statement_source ____")
self._set_warning_ribbon_if_ip_is_invalid()
_logger.debug(f"_______ _set_warning_ribbon_if_ip_is_invalid ____")
self._run_testserver_script()
_logger.debug(f"_______ _run_testserver_script ____")
def _reset_base_configuration(self, database_uuid):
db_id = uuid.uuid1()
_logger.error(db_id)
self.env.cr.execute("""
UPDATE ir_mail_server SET active = 'f';
UPDATE fetchmail_server SET active = 'f';
UPDATE ir_cron SET active = 'f';
DELETE FROM mail_mail;
UPDATE ir_config_parameter
SET value = %s
WHERE key = 'database.enterprise_code';
UPDATE ir_config_parameter
SET value = (NOW() + INTERVAL '30 DAY')
WHERE key = 'database.expiration_date';
UPDATE ir_config_parameter
SET value = %s
WHERE key = 'database.uuid';
""", (self.ENTERPRISE_CODE, database_uuid))
for mail_server in self.MAIL_SERVERS:
UPDATE ir_mail_server set active = 'f';
UPDATE fetchmail_server set active = 'f';
UPDATE ir_cron set active = 'f';
DELETE FROM mail_mail;
UPDATE ir_config_parameter set value = 'M160129258730' where key = 'database.enterprise_code';
UPDATE ir_config_parameter set value = (NOW() + INTERVAL '30 DAY') where key = 'database.expiration_date';
UPDATE ir_config_parameter set value = '%s' where key = 'database.uuid';
INSERT INTO ir_mail_server(smtp_host,smtp_port,name,smtp_authentication,smtp_encryption,active) VALUES ('127.0.0.1','1025','Lokale mailcatcher','login','name','t');
INSERT INTO ir_mail_server(smtp_host,smtp_port,name,smtp_authentication,smtp_encryption,active) VALUES ('192.168.78.199','1025','Algemene mailcatcher','login','name','t');
INSERT INTO ir_mail_server(smtp_host,smtp_port,name,smtp_authentication,smtp_encryption,active) VALUES ('hnode6.openworx.nl','1025','Algemene mailcatcher vanaf hnode4','login','name','t');
UPDATE website SET google_analytics_key = NULL WHERE google_analytics_key IS NOT NULL;
UPDATE product_template SET is_published = FALSE WHERE is_published = TRUE;
""" %(db_id))
if self.env['ir.config_parameter'].search([('key','=','web.base.url.freeze')]):
self.env.cr.execute("""DELETE FROM ir_config_parameter WHERE key = 'web.base.url.freeze';""")
if not self.env['ir.config_parameter'].search([('key','=','report.url')]):
self.env.cr.execute("""INSERT INTO ir_config_parameter(key,value) VALUES ('report.url','http://127.0.0.1:8069');""")
model = self.env['ir.model'].search([('model','=','delivery.carrier')])
if model:
field = self.env['ir.model.fields'].search([('name','=','prod_environment'),('model_id','=',model.id)])
if field:
self.env.cr.execute("""UPDATE delivery_carrier SET prod_environment = False WHERE id>0;""")
model = self.env['ir.model'].search([('model','=','account.online.link')])
if model:
field = self.env['ir.model.fields'].search([('id','>',0),('model_id','=',model.id)])
if field:
self.env.cr.execute("""DELETE FROM account_online_link WHERE id > 0;""")
model = self.env['ir.model'].search([('model','=','payment.provider')])
if model:
field = self.env['ir.model.fields'].search([('name','=','state'),('model_id','=',model.id)])
if field:
self.env.cr.execute("""UPDATE payment_provider SET state = 'disabled' WHERE id>0;""")
if self.env['ir.model'].search([('model','=','account.journal')]):
self.env.cr.execute("""UPDATE account_journal set bank_statements_source = 'undefined';""")
ip_ok = False
with os.popen("ip a") as f:
for x in f.readlines():
if float(x.find('192.168.78.')) > -1:
ip_ok = True
if not ip_ok:
self.env.cr.execute("""
INSERT INTO ir_mail_server(
smtp_host, smtp_port, name, smtp_authentication, smtp_encryption, active
) VALUES (%s, %s, %s, %s, %s, %s);
""", mail_server)
def _remove_param_if_exists(self, key):
if self.env['ir.config_parameter'].search([('key', '=', key)], limit=1):
self.env.cr.execute("DELETE FROM ir_config_parameter WHERE key = %s;", (key,))
def _create_param_if_missing(self, key, value):
if not self.env['ir.config_parameter'].search([('key', '=', key)], limit=1):
self.env.cr.execute(
"INSERT INTO ir_config_parameter(key, value) VALUES (%s, %s);",
(key, value),
)
def _disable_web_push_notifications(self):
parameter = self.env['ir.config_parameter'].sudo()
parameter.set_param('web_push.notification.enabled', '0')
parameters = self.env['ir.config_parameter'].sudo().search([
('key', 'in', ('mail.web_push_vapid_private_key', 'mail.web_push_vapid_public_key', 'mail.sfu_server_key'))])
for parameter in parameters:
parameter.sudo().unlink()
if self.env['ir.model'].search([('model', '=', 'mail.partner.device')]):
self.env.cr.execute("""DELETE FROM mail_partner_device;""")
def _model_has_field(self, model_name, field_name=None):
model = self.env['ir.model'].search([('model', '=', model_name)], limit=1)
if not model:
return False
if field_name is None:
return True
return bool(
self.env['ir.model.fields'].search(
[('name', '=', field_name), ('model_id', '=', model.id)],
limit=1,
)
)
def _disable_delivery_carrier_prod_environment(self):
if self._model_has_field('delivery.carrier', 'prod_environment'):
self.env.cr.execute(
"UPDATE delivery_carrier SET prod_environment = False WHERE id > 0;"
)
def _disable_payment_providers(self):
if self._model_has_field('payment.provider', 'state'):
self.env.cr.execute(
"UPDATE payment_provider SET state = 'disabled' WHERE id > 0;"
)
def _clear_account_online_links(self):
model = self.env['ir.model'].search([('model', '=', 'account.online.link')], limit=1)
if not model:
return
has_any_field = self.env['ir.model.fields'].search(
[('id', '>', 0), ('model_id', '=', model.id)],
limit=1,
)
if has_any_field:
self.env.cr.execute("DELETE FROM account_online_link WHERE id > 0;")
def _reset_bank_statement_source(self):
if self.env['ir.model'].search([('model', '=', 'account.journal')], limit=1):
self.env.cr.execute(
"UPDATE account_journal SET bank_statements_source = 'undefined';"
)
def _has_expected_ip(self):
with os.popen("ip a") as command_output:
return any(self.EXPECTED_IP_PREFIX in line for line in command_output.readlines())
def _set_warning_ribbon_if_ip_is_invalid(self):
if self._has_expected_ip():
return
self.env.cr.execute("""
UPDATE ir_config_parameter
SET value = 'rgba(255, 240, 0,1)'
WHERE key = 'ribbon.background.color';
UPDATE ir_config_parameter
SET value = '#000000'
WHERE key = 'ribbon.color';
UPDATE ir_config_parameter
SET value = '!!! IP WRONG !!!'
WHERE key = 'ribbon.name';
""")
def _run_testserver_script(self):
addons_path = odoo.tools.config['addons_path']
_logger.error(addons_path)
addons_list = addons_path.split(',') if isinstance(addons_path, str) else list(addons_path)
for addon_path in addons_list:
if addon_path.endswith('testserver'):
_logger.error(os.system(f'./{addon_path}/testserver.sh'))
def _get_unneeded_filestore_attachment_ids(self, limit):
self.env.cr.execute(
"""
SELECT id
FROM ir_attachment
WHERE type = 'binary'
AND res_field IS NULL
AND store_fname IS NOT NULL
AND res_model not in ('sign.document','sign.request')
AND public = 'f'
ORDER BY COALESCE(file_size, 0) DESC, id ASC
LIMIT %s
""",
(limit,),
)
return [row[0] for row in self.env.cr.fetchall()]
def cleanup_unneeded_filestore_attachments(self, limit=FILESTORE_CLEANUP_BATCH_LIMIT):
limit = int(limit or 0)
if limit <= 0:
return 0
attachment_ids = self._get_unneeded_filestore_attachment_ids(limit)
if not attachment_ids:
return 0
self.env['ir.attachment'].sudo().browse(attachment_ids).unlink()
_logger.info('Deleted %s unneeded filestore attachments', len(attachment_ids))
return len(attachment_ids)
def set_db_param(self):
## Script to set database expiration date, when enterprise and test env.
parameter = self.env['ir.config_parameter'].search(
[('key', '=', 'database.expiration_date')],
limit=1,
)
if parameter:
new_date_time = datetime.now() + timedelta(days=30)
parameter.write({'value': str(new_date_time)[:19]})
UPDATE ir_config_parameter set value = 'rgba(255, 240, 0,1)' WHERE key = 'ribbon.background.color';
UPDATE ir_config_parameter set value = '#000000' WHERE key = 'ribbon.color';
UPDATE ir_config_parameter set value = '!!! IP WRONG !!!' WHERE key = 'ribbon.name';
""")
ADDONS_PATH = odoo.tools.config['addons_path']
_logger.error(ADDONS_PATH)
for ap in ADDONS_PATH.split(','):
if ap[-10:] == 'testserver':
_logger.error(os.system('./%s/testserver.sh' %(ap)))
@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_testserver_o2b_testserver_o2b,testserver_o2b.testserver_o2b,model_testserver_o2b_testserver_o2b,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_testserver_o2b_testserver_o2b testserver_o2b.testserver_o2b model_testserver_o2b_testserver_o2b base.group_user 1 1 1 1
+19 -13
View File
@@ -1,18 +1,24 @@
<odoo>
<data>
<!-- Banner for web layout (backend Odoo) -->
<template id="testserver_banner_web" name="TOP banner test backend" inherit_id="web.layout">
<xpath expr="//body" position="inside">
<div>
<span style="text-align: center;color: #FFFFFF;background-color: #006CFE;position: relative;display: block;font-size: 16px;">
This is a test database.
<a href="https://www.open2bizz.tech/helpdesk" target="_blank" style="color: #000000;">
See website to report issue's.
</a>
</span>
</div>
</xpath>
<!--
<template id="listing">
<ul>
<li t-foreach="objects" t-as="object">
<a t-attf-href="#{ root }/objects/#{ object.id }">
<t t-esc="object.display_name"/>
</a>
</li>
</ul>
</template>
<template id="object">
<h1><t t-esc="object.display_name"/></h1>
<dl>
<t t-foreach="object._fields" t-as="field">
<dt><t t-esc="field"/></dt>
<dd><t t-esc="object[field]"/></dd>
</t>
</dl>
</template>
-->
</data>
</odoo>
+60
View File
@@ -0,0 +1,60 @@
<odoo>
<data>
<!-- explicit list view definition -->
<!--
<record model="ir.ui.view" id="testserver_o2b.list">
<field name="name">testserver_o2b list</field>
<field name="model">testserver_o2b.testserver_o2b</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="value"/>
<field name="value2"/>
</tree>
</field>
</record>
-->
<!-- actions opening views on models -->
<!--
<record model="ir.actions.act_window" id="testserver_o2b.action_window">
<field name="name">testserver_o2b window</field>
<field name="res_model">testserver_o2b.testserver_o2b</field>
<field name="view_mode">tree,form</field>
</record>
-->
<!-- server action to the one above -->
<!--
<record model="ir.actions.server" id="testserver_o2b.action_server">
<field name="name">testserver_o2b server</field>
<field name="model_id" ref="model_testserver_o2b_testserver_o2b"/>
<field name="state">code</field>
<field name="code">
action = {
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": model._name,
}
</field>
</record>
-->
<!-- Top menu item -->
<!--
<menuitem name="testserver_o2b" id="testserver_o2b.menu_root"/>
-->
<!-- menu categories -->
<!--
<menuitem name="Menu 1" id="testserver_o2b.menu_1" parent="testserver_o2b.menu_root"/>
<menuitem name="Menu 2" id="testserver_o2b.menu_2" parent="testserver_o2b.menu_root"/>
-->
<!-- actions -->
<!--
<menuitem name="List" id="testserver_o2b.menu_1_list" parent="testserver_o2b.menu_1"
action="testserver_o2b.action_window"/>
<menuitem name="Server to list" id="testserver_o2b" parent="testserver_o2b.menu_2"
action="testserver_o2b.action_server"/>
-->
</data>
</odoo>
-3
View File
@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from .hooks import post_init_hook
-19
View File
@@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
{
'name': "Set as testserver Open2Bizz, when website is enabled",
'summary': """
Only to be used when installed as TEST env. Open2Bizz""",
'author': "Open2bizz",
'website': "http://www.open2bizz.tech",
'category': 'Tools',
'license': "AGPL-3",
'version': '15.0.1.0.0',
'depends': ['testserver_o2b','website'],
'data': [
'views/templates.xml',
],
'post_init_hook': 'post_init_hook',
}
-137
View File
@@ -1,137 +0,0 @@
# -*- coding: utf-8 -*-
import logging
from odoo import api, SUPERUSER_ID
_logger = logging.getLogger(__name__)
def post_init_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
Website = env['website'].sudo()
WebsitePage = env['website.page'].sudo()
# ---------------------------------------------------------
# 1. Get the generic TEST page template
# ---------------------------------------------------------
test_view = env.ref(
'testserver_website_o2b.testserver_page_website',
raise_if_not_found=False,
)
if not test_view:
_logger.error(
"Testserver website template "
"'testserver_website_o2b.testserver_page_website' not found."
)
return
# ---------------------------------------------------------
# 2. Unpublish all existing website pages
# ---------------------------------------------------------
pages = WebsitePage.search([])
if pages:
_logger.info(
"Unpublishing %s existing website pages.",
len(pages),
)
pages.write({
'website_published': False,
})
# ---------------------------------------------------------
# 3. Create a TEST homepage for every website
# ---------------------------------------------------------
websites = Website.search([])
for website in websites:
_logger.info(
"Creating test homepage for website %s (%s).",
website.name,
website.id,
)
# Each website gets its own ir.ui.view.
#
# In Odoo 15 website.page.website_id is related to
# view_id.website_id. Therefore we should not use the same
# ir.ui.view for multiple websites.
website_test_view = test_view.copy({
'name': 'Test environment - %s' % website.name,
'key': '%s.website_%s' % (test_view.key, website.id),
'website_id': website.id,
})
test_page = WebsitePage.create({
'url': '/testmodus',
'view_id': website_test_view.id,
'website_published': True,
'website_indexed': False,
})
# Odoo 15 uses homepage_id, NOT homepage_url.
website.write({
'domain': False,
'homepage_id': test_page.id,
})
_logger.info(
"Test homepage %s assigned to website %s.",
test_page.id,
website.id,
)
# ---------------------------------------------------------
# 4. Disable all payment acquirers
# ---------------------------------------------------------
#
# Odoo 15 uses payment.acquirer.
# payment.provider belongs to later Odoo versions.
#
if env.registry.get('payment.acquirer'):
payment_acquirers = env['payment.acquirer'].sudo().search([
('state', '!=', 'disabled'),
])
if payment_acquirers:
_logger.info(
"Disabling %s payment acquirers.",
len(payment_acquirers),
)
payment_acquirers.write({
'state': 'disabled',
})
# ---------------------------------------------------------
# 5. Unpublish all webshop products
# ---------------------------------------------------------
#
# website_published only exists on product.template when the
# relevant website/eCommerce functionality is installed.
#
if env.registry.get('product.template'):
ProductTemplate = env['product.template'].sudo()
if 'website_published' in ProductTemplate._fields:
published_products = ProductTemplate.search([
('website_published', '=', True),
])
if published_products:
_logger.info(
"Unpublishing %s webshop products.",
len(published_products),
)
published_products.write({
'website_published': False,
})
_logger.info(
"Testserver website neutralization completed successfully."
)
@@ -1 +0,0 @@
# -*- coding: utf-8 -*-
Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

@@ -1,18 +0,0 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<body>
<div class="document" id="module-name">
<h1 class="title">Testservers when website</h1>
<p>
This module is ONLY for test environments In DC Open2Bizz
</p>
<p>
Module is developed by Open2Bizz. Bug reports: support@open2bizz.eu
</p>
<p>
<img src="https://www.open2bizz.tech/logo.png" style="max-height: 100px;">
</p>
</div>
</body>
</html>
@@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Banner for web layout -->
<template id="testserver_banner_website" name="TOP banner test front" inherit_id="website.layout">
<xpath expr="//body" position="before">
<div>
<span style="text-align: center;
color: #FFFFFF;
background-color: #006CFE;
position: relative;
display: block;
font-size: 16px;">
***** This is a test environment *****
<a href="https://www.open2bizz.tech/helpdesk" target="_blank" style="color: #000000;">
See website to report issue's.
</a>
</span>
</div>
</xpath>
</template>
<!-- Test environment page -->
<template id="testserver_page_website" name="Website page front">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_banner parallax s_parallax_is_fixed pb96 o_colored_level pt40" data-scroll-background-ratio="1" data-snippet="s_banner" data-name="Banner" style="background-image: none;">
<span class="s_parallax_bg oe_img_bg o_bg_img_center" style="background-image: url('https://hd-beamers.nl/wp-content/uploads/2014/05/Testbeeld-1280x720p_hd-ready.png'); background-position: 50% 0px;"/>
<div class="o_we_bg_filter" style="background-image: linear-gradient(135deg, rgba(21, 25, 116, 0.71) 0%, rgba(226, 51, 255, 0.5) 100%);"/>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="col-lg-6 jumbotron rounded o_cc o_cc1 pt32 pb32 o_colored_level" data-name="Box">
<h1>
<font style="font-size: 62px;" class="o_default_snippet_text">
TEST
</font>
<br/>
</h1>
<p class="lead o_default_snippet_text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
<a class="mb-2 btn btn-primary" href="/web/login">
Login
</a>
<br/>
<br/>
<a class="mb-2 btn btn-secondary" href="https://www.open2bizz.nl">
Open2Bizz
</a>
</div>
</div>
</div>
</section>
</div>
</t>
</template>
</data>
</odoo>