-
165muk_saas_branding/LICENSE
-
23muk_saas_branding/__init__.py
-
53muk_saas_branding/__manifest__.py
-
24muk_saas_branding/controllers/__init__.py
-
106muk_saas_branding/controllers/binary.py
-
75muk_saas_branding/controllers/database.py
-
4muk_saas_branding/doc/changelog.rst
-
126muk_saas_branding/doc/index.rst
-
BINmuk_saas_branding/static/description/banner.png
-
BINmuk_saas_branding/static/description/icon.png
-
1muk_saas_branding/static/description/icon.svg
-
133muk_saas_branding/static/description/index.html
-
BINmuk_saas_branding/static/description/logo.png
-
BINmuk_saas_branding/static/description/preview.png
-
BINmuk_saas_branding/static/description/service_customization.png
-
BINmuk_saas_branding/static/description/service_development.png
-
BINmuk_saas_branding/static/description/service_implementation.png
-
BINmuk_saas_branding/static/description/service_integration.png
-
BINmuk_saas_branding/static/description/service_support.png
-
BINmuk_saas_branding/static/src/img/favicon.ico
-
BINmuk_saas_branding/static/src/img/logo.png
-
BINmuk_saas_branding/static/src/img/nofavicon.ico
-
BINmuk_saas_branding/static/src/img/nologo.png
-
369muk_saas_branding/templates/database_manager.html
-
23muk_saas_branding/tools/__init__.py
-
38muk_saas_branding/tools/utils.py
@ -0,0 +1,165 @@ |
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
Version 3, 29 June 2007 |
|||
|
|||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
|
|||
This version of the GNU Lesser General Public License incorporates |
|||
the terms and conditions of version 3 of the GNU General Public |
|||
License, supplemented by the additional permissions listed below. |
|||
|
|||
0. Additional Definitions. |
|||
|
|||
As used herein, "this License" refers to version 3 of the GNU Lesser |
|||
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
|||
General Public License. |
|||
|
|||
"The Library" refers to a covered work governed by this License, |
|||
other than an Application or a Combined Work as defined below. |
|||
|
|||
An "Application" is any work that makes use of an interface provided |
|||
by the Library, but which is not otherwise based on the Library. |
|||
Defining a subclass of a class defined by the Library is deemed a mode |
|||
of using an interface provided by the Library. |
|||
|
|||
A "Combined Work" is a work produced by combining or linking an |
|||
Application with the Library. The particular version of the Library |
|||
with which the Combined Work was made is also called the "Linked |
|||
Version". |
|||
|
|||
The "Minimal Corresponding Source" for a Combined Work means the |
|||
Corresponding Source for the Combined Work, excluding any source code |
|||
for portions of the Combined Work that, considered in isolation, are |
|||
based on the Application, and not on the Linked Version. |
|||
|
|||
The "Corresponding Application Code" for a Combined Work means the |
|||
object code and/or source code for the Application, including any data |
|||
and utility programs needed for reproducing the Combined Work from the |
|||
Application, but excluding the System Libraries of the Combined Work. |
|||
|
|||
1. Exception to Section 3 of the GNU GPL. |
|||
|
|||
You may convey a covered work under sections 3 and 4 of this License |
|||
without being bound by section 3 of the GNU GPL. |
|||
|
|||
2. Conveying Modified Versions. |
|||
|
|||
If you modify a copy of the Library, and, in your modifications, a |
|||
facility refers to a function or data to be supplied by an Application |
|||
that uses the facility (other than as an argument passed when the |
|||
facility is invoked), then you may convey a copy of the modified |
|||
version: |
|||
|
|||
a) under this License, provided that you make a good faith effort to |
|||
ensure that, in the event an Application does not supply the |
|||
function or data, the facility still operates, and performs |
|||
whatever part of its purpose remains meaningful, or |
|||
|
|||
b) under the GNU GPL, with none of the additional permissions of |
|||
this License applicable to that copy. |
|||
|
|||
3. Object Code Incorporating Material from Library Header Files. |
|||
|
|||
The object code form of an Application may incorporate material from |
|||
a header file that is part of the Library. You may convey such object |
|||
code under terms of your choice, provided that, if the incorporated |
|||
material is not limited to numerical parameters, data structure |
|||
layouts and accessors, or small macros, inline functions and templates |
|||
(ten or fewer lines in length), you do both of the following: |
|||
|
|||
a) Give prominent notice with each copy of the object code that the |
|||
Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the object code with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
4. Combined Works. |
|||
|
|||
You may convey a Combined Work under terms of your choice that, |
|||
taken together, effectively do not restrict modification of the |
|||
portions of the Library contained in the Combined Work and reverse |
|||
engineering for debugging such modifications, if you also do each of |
|||
the following: |
|||
|
|||
a) Give prominent notice with each copy of the Combined Work that |
|||
the Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
c) For a Combined Work that displays copyright notices during |
|||
execution, include the copyright notice for the Library among |
|||
these notices, as well as a reference directing the user to the |
|||
copies of the GNU GPL and this license document. |
|||
|
|||
d) Do one of the following: |
|||
|
|||
0) Convey the Minimal Corresponding Source under the terms of this |
|||
License, and the Corresponding Application Code in a form |
|||
suitable for, and under terms that permit, the user to |
|||
recombine or relink the Application with a modified version of |
|||
the Linked Version to produce a modified Combined Work, in the |
|||
manner specified by section 6 of the GNU GPL for conveying |
|||
Corresponding Source. |
|||
|
|||
1) Use a suitable shared library mechanism for linking with the |
|||
Library. A suitable mechanism is one that (a) uses at run time |
|||
a copy of the Library already present on the user's computer |
|||
system, and (b) will operate properly with a modified version |
|||
of the Library that is interface-compatible with the Linked |
|||
Version. |
|||
|
|||
e) Provide Installation Information, but only if you would otherwise |
|||
be required to provide such information under section 6 of the |
|||
GNU GPL, and only to the extent that such information is |
|||
necessary to install and execute a modified version of the |
|||
Combined Work produced by recombining or relinking the |
|||
Application with a modified version of the Linked Version. (If |
|||
you use option 4d0, the Installation Information must accompany |
|||
the Minimal Corresponding Source and Corresponding Application |
|||
Code. If you use option 4d1, you must provide the Installation |
|||
Information in the manner specified by section 6 of the GNU GPL |
|||
for conveying Corresponding Source.) |
|||
|
|||
5. Combined Libraries. |
|||
|
|||
You may place library facilities that are a work based on the |
|||
Library side by side in a single library together with other library |
|||
facilities that are not Applications and are not covered by this |
|||
License, and convey such a combined library under terms of your |
|||
choice, if you do both of the following: |
|||
|
|||
a) Accompany the combined library with a copy of the same work based |
|||
on the Library, uncombined with any other library facilities, |
|||
conveyed under the terms of this License. |
|||
|
|||
b) Give prominent notice with the combined library that part of it |
|||
is a work based on the Library, and explaining where to find the |
|||
accompanying uncombined form of the same work. |
|||
|
|||
6. Revised Versions of the GNU Lesser General Public License. |
|||
|
|||
The Free Software Foundation may publish revised and/or new versions |
|||
of the GNU Lesser General Public License from time to time. Such new |
|||
versions will be similar in spirit to the present version, but may |
|||
differ in detail to address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the |
|||
Library as you received it specifies that a certain numbered version |
|||
of the GNU Lesser General Public License "or any later version" |
|||
applies to it, you have the option of following the terms and |
|||
conditions either of that published version or of any later version |
|||
published by the Free Software Foundation. If the Library as you |
|||
received it does not specify a version number of the GNU Lesser |
|||
General Public License, you may choose any version of the GNU Lesser |
|||
General Public License ever published by the Free Software Foundation. |
|||
|
|||
If the Library as you received it specifies that a proxy can decide |
|||
whether future versions of the GNU Lesser General Public License shall |
|||
apply, that proxy's public statement of acceptance of any version is |
|||
permanent authorization for you to choose that version for the |
|||
Library. |
@ -0,0 +1,23 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK SaaS Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import controllers |
@ -0,0 +1,53 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK SaaS Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
{ |
|||
"name": "MuK SaaS Branding", |
|||
"summary": """Branding and Debranding""", |
|||
"version": "12.0.1.0.0", |
|||
"category": "Extra Tools", |
|||
"license": "LGPL-3", |
|||
"website": "http://www.mukit.at", |
|||
'live_test_url': 'https://mukit.at/r/SgN', |
|||
"author": "MuK IT", |
|||
"contributors": [ |
|||
"Mathias Markl <mathias.markl@mukit.at>", |
|||
], |
|||
"depends": [ |
|||
"web", |
|||
], |
|||
"data": [ |
|||
], |
|||
"qweb": [ |
|||
"static/src/xml/*.xml", |
|||
], |
|||
"images": [ |
|||
'static/description/banner.png' |
|||
], |
|||
"external_dependencies": { |
|||
"python": [], |
|||
"bin": [], |
|||
}, |
|||
"auto_install": False, |
|||
"application": False, |
|||
"installable": True, |
|||
} |
@ -0,0 +1,24 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK SaaS Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import binary |
|||
from . import database |
@ -0,0 +1,106 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK SaaS Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
import io |
|||
import os |
|||
import base64 |
|||
import mimetypes |
|||
import functools |
|||
|
|||
from odoo import http, SUPERUSER_ID |
|||
from odoo.modules import registry, get_resource_path |
|||
from odoo.tools.mimetypes import guess_mimetype |
|||
from odoo.tools import config |
|||
from odoo.http import request |
|||
|
|||
from odoo.addons.web.controllers.main import Binary |
|||
from odoo.addons.muk_saas_branding.tools.utils import safe_execute |
|||
|
|||
class Binary(Binary): |
|||
|
|||
def _get_company_image_placeholder(self): |
|||
if config.get("default_company_image_folder", False): |
|||
def get_path(filename): |
|||
return os.path.join(config.get("default_company_image_folder"), filename) |
|||
return get_path |
|||
return functools.partial(get_resource_path, 'muk_saas_branding', 'static', 'src', 'img') |
|||
|
|||
def _get_company_image_data(self, dbname, uid, field, company=None): |
|||
try: |
|||
dbreg = registry.Registry(dbname) |
|||
with dbreg.cursor() as cr: |
|||
if company: |
|||
cr.execute(""" |
|||
SELECT {0}, write_date |
|||
FROM res_company |
|||
WHERE id = %s |
|||
""".format(field), (company,)) |
|||
else: |
|||
cr.execute(""" |
|||
SELECT c.{0}, c.write_date |
|||
FROM res_users u |
|||
LEFT JOIN res_company c |
|||
ON c.id = u.company_id |
|||
WHERE u.id = %s |
|||
""".format(field), (uid,)) |
|||
return cr.fetchone() |
|||
except Exception: |
|||
return None |
|||
|
|||
def _get_company_image_response(self, dbname, field, placeholders, default_mimetype, company=None): |
|||
uid = request.session.uid if request.session.db else None |
|||
placeholder = self._get_company_image_placeholder() |
|||
if request.session.db: |
|||
dbname = request.session.db |
|||
elif dbname is None: |
|||
dbname = http.db_monodb() |
|||
if not dbname: |
|||
response = http.send_file(placeholder(placeholders[0])) |
|||
else: |
|||
uid = uid if uid else SUPERUSER_ID |
|||
company_data = self._get_company_image_data(dbname, uid, field, company) |
|||
if company_data and company_data[0]: |
|||
image_data = base64.b64decode(company_data[0]) |
|||
mimetype = guess_mimetype(image_data, default=default_mimetype) |
|||
extension = mimetypes.guess_extension(mimetype) |
|||
response = http.send_file( |
|||
io.BytesIO(image_data), filename=('logo%s' % extension), |
|||
mimetype=mimetype, mtime=company_data[1] |
|||
) |
|||
else: |
|||
response = http.send_file(placeholder(placeholders[1])) |
|||
return response |
|||
|
|||
@http.route(['/web/binary/company_logo', '/logo', '/logo.png'], type='http', auth="none") |
|||
def company_logo(self, dbname=None, **kw): |
|||
company = safe_execute(False, int, kw['company']) if kw and kw.get('company') else False |
|||
return self._get_company_image_response( |
|||
dbname, 'logo_web', ('logo.png', 'nologo.png'), 'image/png', company |
|||
) |
|||
|
|||
@http.route(['/web/binary/company_favicon', '/favicon', '/favicon.ico'], type='http', auth="none") |
|||
def company_favicon(self, dbname=None, **kw): |
|||
company = safe_execute(False, int, kw['company']) if kw and kw.get('company') else False |
|||
return self._get_company_image_response( |
|||
dbname, 'favicon', ('favicon.ico', 'nofavicon.ico'), 'image/x-icon', company |
|||
) |
|||
|
@ -0,0 +1,75 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK SaaS Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
import os |
|||
import sys |
|||
import json |
|||
|
|||
from odoo import http, tools, service |
|||
from odoo.http import request, db_monodb, db_list |
|||
|
|||
from odoo.addons.web.controllers.main import DBNAME_PATTERN |
|||
from odoo.addons.web.controllers.main import jinja2, Database |
|||
|
|||
if hasattr(sys, 'frozen'): |
|||
location = os.path.dirname(__file__) |
|||
path = os.path.join(location, '..', 'templates') |
|||
loader = jinja2.FileSystemLoader(os.path.realpath(path)) |
|||
else: |
|||
loader = jinja2.PackageLoader('odoo.addons.muk_saas_branding', 'templates') |
|||
|
|||
env = jinja2.Environment(loader=loader, autoescape=True) |
|||
env.filters["json"] = json.dumps |
|||
|
|||
class Database(Database): |
|||
|
|||
def _render_template(self, **d): |
|||
d.setdefault('manage', True) |
|||
d['insecure'] = tools.config.verify_admin_password('admin') |
|||
d['list_db'] = tools.config['list_db'] |
|||
d['langs'] = service.db.exp_list_lang() |
|||
d['countries'] = service.db.exp_list_countries() |
|||
d['pattern'] = DBNAME_PATTERN |
|||
d['system_name'] = tools.config.get( |
|||
"database_manager_system_name", "Odoo" |
|||
) |
|||
d['system_logo'] = tools.config.get( |
|||
"database_manager_system_logo_url", |
|||
"/web/static/src/img/logo2.png" |
|||
) |
|||
d['system_favicon'] = tools.config.get( |
|||
"database_manager_system_favicon_url", |
|||
"/web/static/src/img/favicon.ico" |
|||
) |
|||
d['privacy_policy'] = tools.config.get( |
|||
"database_manager_privacy_policy_url", |
|||
"https://www.odoo.com/privacy" |
|||
) |
|||
d['databases'] = [] |
|||
try: |
|||
d['databases'] = db_list() |
|||
d['incompatible_databases'] = service.db.list_db_incompatible(d['databases']) |
|||
except odoo.exceptions.AccessDenied: |
|||
monodb = db_monodb() |
|||
if monodb: |
|||
d['databases'] = [monodb] |
|||
return env.get_template("database_manager.html").render(d) |
@ -0,0 +1,4 @@ |
|||
`1.0.0` |
|||
------- |
|||
|
|||
- Init version |
@ -0,0 +1,126 @@ |
|||
================ |
|||
MuK SaaS Branding |
|||
================ |
|||
|
|||
This module complements the Branding Module. It introduces a new route to recive the |
|||
favicon and adapts the existing route to receive the company logo to. You can also |
|||
use parameters in the configuration file to specify the images and links on the |
|||
database manager page. |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
To install this module, you need to: |
|||
|
|||
Download the module and add it to your Odoo addons folder. Afterward, log on to |
|||
your Odoo server and go to the Apps menu. Trigger the debug mode and update the |
|||
list by clicking on the "Update Apps List" link. Now install the module by |
|||
clicking on the install button. |
|||
|
|||
Another way to install this module is via the package management for Python |
|||
(`PyPI <https://pypi.org/project/pip/>`_). |
|||
|
|||
To install our modules using the package manager make sure |
|||
`odoo-autodiscover <https://pypi.org/project/odoo-autodiscover/>`_ is installed |
|||
correctly. Then open a console and install the module by entering the following |
|||
command: |
|||
|
|||
``pip install --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
|||
|
|||
The module name consists of the Odoo version and the module name, where |
|||
underscores are replaced by a dash. |
|||
|
|||
**Module:** |
|||
|
|||
``odoo<version>-addon-<module_name>`` |
|||
|
|||
**Example:** |
|||
|
|||
``sudo -H pip3 install --extra-index-url https://nexus.mukit.at/repository/odoo/simple odoo11-addon-muk-utils`` |
|||
|
|||
Once the installation has been successfully completed, the app is already in the |
|||
correct folder. Log on to your Odoo server and go to the Apps menu. Trigger the |
|||
debug mode and update the list by clicking on the "Update Apps List" link. Now |
|||
install the module by clicking on the install button. |
|||
|
|||
The biggest advantage of this variant is that you can now also update the app |
|||
using the "pip" command. To do this, enter the following command in your console: |
|||
|
|||
``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
|||
|
|||
When the process is finished, restart your server and update the application in |
|||
Odoo. The steps are the same as for the installation only the button has changed |
|||
from "Install" to "Upgrade". |
|||
|
|||
You can also view available Apps directly in our `repository <https://nexus.mukit.at/#browse/browse:odoo>`_ |
|||
and find a more detailed installation guide on our `website <https://mukit.at/page/open-source>`_. |
|||
|
|||
For modules licensed under OPL-1, you will receive access data when you purchase |
|||
the module. If the modules were not purchased directly from |
|||
`MuK IT <https://www.mukit.at/>`_ please contact our support (support@mukit.at) |
|||
with a confirmation of purchase to receive the corresponding access data. |
|||
|
|||
Upgrade |
|||
============ |
|||
|
|||
To upgrade this module, you need to: |
|||
|
|||
Download the module and add it to your Odoo addons folder. Restart the server |
|||
and log on to your Odoo server. Select the Apps menu and upgrade the module by |
|||
clicking on the upgrade button. |
|||
|
|||
If you installed the module using the "pip" command, you can also update the |
|||
module in the same way. Just type the following command into the console: |
|||
|
|||
``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple <module>`` |
|||
|
|||
When the process is finished, restart your server and update the application in |
|||
Odoo, just like you would normally. |
|||
|
|||
Configuration |
|||
============= |
|||
|
|||
Since this module need to be activated even if no database is selected it should |
|||
be loaded right at the server start. This can be done by editing the configuration |
|||
file or passing a load parameter to the start script. |
|||
|
|||
Parameter: ``--load=web,muk_saas_branding`` |
|||
|
|||
The following fields can be modified in the config file: |
|||
|
|||
* database_manager_system_name |
|||
* database_manager_system_logo_url |
|||
* database_manager_system_favicon_url |
|||
* database_manager_privacy_policy_url |
|||
|
|||
Usage |
|||
============= |
|||
|
|||
After setting the parameters, the system is automatically branded. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Mathias Markl <mathias.markl@mukit.at> |
|||
|
|||
Images |
|||
------------ |
|||
|
|||
Some pictures are based on or inspired by the icon set of Font Awesome: |
|||
|
|||
* `Font Awesome <https://fontawesome.com>`_ |
|||
|
|||
Author & Maintainer |
|||
------------------- |
|||
|
|||
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_. |
|||
|
|||
MuK IT is an Austrian company specialized in customizing and extending Odoo. |
|||
We develop custom solutions for your individual needs to help you focus on |
|||
your strength and expertise to grow your business. |
|||
|
|||
If you want to get in touch please contact us via mail |
|||
(sale@mukit.at) or visit our website (https://mukit.at). |
After Width: 880 | Height: 440 | Size: 43 KiB |
After Width: 250 | Height: 250 | Size: 12 KiB |
1
muk_saas_branding/static/description/icon.svg
File diff suppressed because it is too large
View File
@ -0,0 +1,133 @@ |
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan">MuK Branding</h2> |
|||
<h3 class="oe_slogan">Branding Features</h3> |
|||
<h4 class="oe_slogan" style="font-size: 23px;">MuK IT GmbH - |
|||
www.mukit.at</h4> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="text-justify" style="max-width: 84%; margin: 16px 8%;"> |
|||
<h3 class="oe_slogan">Overview</h3> |
|||
<p class="oe_mt32">This module complements the Branding Module. |
|||
It introduces a new route to recive the favicon and adapts the |
|||
existing route to receive the company logo to. You can also use |
|||
parameters in the configuration file to specify the images and links |
|||
on the database manager page.</p> |
|||
<p>Since this module need to be activated even if no database is |
|||
selected it should be loaded right at the server start. This can be |
|||
done by editing the configuration file or passing a load parameter |
|||
to the start script.</p> |
|||
<p> |
|||
Parameter: |
|||
<code>--load=web,muk_saas_branding</code> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Our Services</h3> |
|||
<div |
|||
style="display: flex; padding-top: 20px; justify-content: space-between;"> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://mukit.at/r/MQ5" target="_blank"> |
|||
<div |
|||
style="width: 75px; height: 75px; border-radius: 100%; margin: auto;"> |
|||
<img src="service_implementation.png" |
|||
style="width: 100%; border-radius: 100%;"> |
|||
</div> |
|||
<h3 class="oe_slogan" |
|||
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 14px; color: #000 !important; margin-top: 5px; opacity: 1 !important; line-height: 17px;"> |
|||
Odoo <br>Implementation |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://mukit.at/r/u7c" target="_blank"> |
|||
<div |
|||
style="width: 75px; height: 75px; border-radius: 100%; margin: auto;"> |
|||
<img src="service_integration.png" |
|||
style="width: 100%; border-radius: 100%;"> |
|||
</div> |
|||
<h3 class="oe_slogan" |
|||
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 14px; color: #000 !important; margin-top: 5px; opacity: 1 !important; line-height: 17px;"> |
|||
Odoo <br>Integration |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://mukit.at/r/xDJ" target="_blank"> |
|||
<div |
|||
style="width: 75px; height: 75px; border-radius: 100%; margin: auto;"> |
|||
<img src="service_customization.png" |
|||
style="width: 100%; border-radius: 100%;"> |
|||
</div> |
|||
<h3 class="oe_slogan" |
|||
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 14px; color: #000 !important; margin-top: 5px; opacity: 1 !important; line-height: 17px;"> |
|||
Odoo <br>Customization |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href=" https://mukit.at/r/J3A" target="_blank"> |
|||
<div |
|||
style="width: 75px; height: 75px; border-radius: 100%; margin: auto;"> |
|||
<img src="service_development.png" |
|||
style="width: 100%; border-radius: 100%;"> |
|||
</div> |
|||
<h3 class="oe_slogan" |
|||
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 14px; color: #000 !important; margin-top: 5px; opacity: 1 !important; line-height: 17px;"> |
|||
Odoo <br>Development |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href=" https://mukit.at/r/R1v" target="_blank"> |
|||
<div |
|||
style="width: 75px; height: 75px; border-radius: 100%; margin: auto;"> |
|||
<img src="service_support.png" |
|||
style="width: 100%; border-radius: 100%;"> |
|||
</div> |
|||
<h3 class="oe_slogan" |
|||
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 14px; color: #000 !important; margin-top: 5px; opacity: 1 !important; line-height: 17px;"> |
|||
Odoo <br>Support |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 32px 0;"> |
|||
<div class="oe_row oe_spaced" style="margin: auto;"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<a href="https://mukit.at/r/SgN" target="_blank"> <img |
|||
src="preview.png"> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<h3 class="oe_slogan">Help and Support</h3> |
|||
<h5 class="oe_slogan" style="font-size: 20px;">Feel free to |
|||
contact us, if you need any help with your Odoo integration or |
|||
addiontal features.</h5> |
|||
<div class="oe_slogan"> |
|||
<a class="btn btn-primary btn-lg mt8" href="https://mukit.at" |
|||
target="_blank"> <i class="fa fa-globe"></i> Website |
|||
</a> <a class="btn btn-primary btn-lg mt8" href="mailto:sale@mukit.at"> |
|||
<i class="fa fa-envelope"></i> Contact Us |
|||
</a> <a class="btn btn-primary btn-lg mt8" |
|||
href="https://github.com/muk-it" target="_blank"> <i |
|||
class="fa fa-github"></i> Issues |
|||
</a> |
|||
</div> |
|||
<img src="logo.png" |
|||
style="width: 200px; margin-bottom: 20px; display: block;" |
|||
class="mx-auto center-block"> |
|||
</section> |
After Width: 500 | Height: 500 | Size: 37 KiB |
After Width: 1000 | Height: 200 | Size: 32 KiB |
After Width: 250 | Height: 250 | Size: 27 KiB |
After Width: 250 | Height: 250 | Size: 28 KiB |
After Width: 250 | Height: 250 | Size: 26 KiB |
After Width: 250 | Height: 250 | Size: 24 KiB |
After Width: 250 | Height: 250 | Size: 24 KiB |
After Width: 500 | Height: 500 | Size: 37 KiB |
After Width: 500 | Height: 500 | Size: 37 KiB |
@ -0,0 +1,369 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
|||
<title>{{ system_name }}</title> |
|||
<link rel="shortcut icon" href="{{ system_favicon }}" type="image/x-icon"> |
|||
|
|||
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css"> |
|||
<link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css"> |
|||
|
|||
<script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script> |
|||
|
|||
<script type="text/javascript" src="/web/static/lib/popper/popper.js"></script> |
|||
|
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/index.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/util.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/alert.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/button.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/carousel.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/collapse.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/dropdown.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/modal.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/tooltip.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/popover.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/scrollspy.js"></script> |
|||
<script type="text/javascript" src="/web/static/lib/bootstrap/js/tab.js"></script> |
|||
|
|||
<script type="text/javascript"> |
|||
$(function() { |
|||
// Little eye |
|||
$('body').on('mousedown mouseup', '.o_little_eye', function (ev) { |
|||
$(ev.target).closest('.input-group').find('.form-control').prop('type', ev.type === 'mousedown' ? 'text' : 'password'); |
|||
}); |
|||
// db modal |
|||
$('body').on('click', '.o_database_action', function (ev) { |
|||
ev.preventDefault(); |
|||
var db = $(ev.currentTarget).data('db'); |
|||
var target = $(ev.currentTarget).data('target'); |
|||
$(target).find('input[name=name]').val(db); |
|||
$(target).modal(); |
|||
}); |
|||
// close modal on submit |
|||
$('.modal').on('submit', 'form', function (ev) { |
|||
var modal = $(this).parentsUntil('body', '.modal'); |
|||
if (modal.hasClass('o_database_backup')) { |
|||
$(modal).modal('hide'); |
|||
if (!$('.alert-backup-long').length) { |
|||
$('.list-group').before("<div class='alert alert-info alert-backup-long'>The backup may take some time before being ready</div>"); |
|||
} |
|||
} |
|||
}); |
|||
}); |
|||
</script> |
|||
</head> |
|||
|
|||
{% macro master_input() -%} |
|||
<div class="form-group"> |
|||
{% if insecure %} |
|||
<input type="hidden" name="master_pwd" class="form-control" value="admin"/> |
|||
{% else %} |
|||
<label for="master_pwd" class="col-form-label">Master Password</label> |
|||
<input id="master_pwd" type="password" name="master_pwd" class="form-control" required="required" autofocus="autofocus"/> |
|||
{% endif %} |
|||
</div> |
|||
{%- endmacro %} |
|||
|
|||
{% macro create_form() -%} |
|||
{{ master_input() }} |
|||
<div class="form-group row"> |
|||
<label for="name" class="col-md-4 col-form-label">Database Name</label> |
|||
<div class="col-md-8"> |
|||
<input id="name" type="text" name="name" class="form-control" required="required" autocomplete="off" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="login" class="col-md-4 col-form-label">Email</label> |
|||
<div class="col-md-8"> |
|||
<input id="login" type="text" name="login" class="form-control" required="required" autocomplete="off"/> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="password" class="col-md-4 col-form-label">Password</label> |
|||
<div class="col-md-8 input-group"> |
|||
<input id="password" type="password" name="password" class="form-control" required="required" autocomplete="off"/> |
|||
<div class="input-group-append"> |
|||
<span class="fa fa-eye o_little_eye input-group-text" aria-hidden="true" style="cursor: pointer;"></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="phone" class="col-md-4 col-form-label">Phone number</label> |
|||
<div class="col-md-8 input-group"> |
|||
<input id="phone" type="tel" name="phone" class="form-control" autocomplete="off"/> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="lang" class="col-md-4 col-form-label">Language</label> |
|||
<div class="col-md-8"> |
|||
<select id="lang" name="lang" class="form-control" required="required" autocomplete="off"> |
|||
{% for lang in langs %} |
|||
<option {% if lang[0] == "en_US" %}selected="selected" {% endif %}value="{{ lang[0] }}">{{ lang[1] }}</option> |
|||
{% endfor %} |
|||
</select> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="country" class="col-md-4 col-form-label ">Country</label> |
|||
<div class="col-md-8"> |
|||
<select id="country" name="country_code" class="form-control" autocomplete="off"> |
|||
<option value=""></option> |
|||
{% for country in countries %} |
|||
<option value="{{ country[0] }}">{{ country[1] }}</option> |
|||
{% endfor %} |
|||
</select> |
|||
</div> |
|||
</div> |
|||
<div class="form-group row"> |
|||
<label for="demo" class="col-md-4 col-form-label">Demo data</label> |
|||
<div class="col-md-8"> |
|||
<input type="checkbox" id="load_demo_checkbox" class="form-control-sm" name="demo" value="1"> |
|||
</div> |
|||
</div> |
|||
{%- endmacro %} |
|||
|
|||
<body> |
|||
<div class="container"> |
|||
<!-- Database List --> |
|||
<div class="row"> |
|||
<div class="col-lg-6 offset-lg-3 o_database_list"> |
|||
<img src="{{ system_logo }}" class="img-fluid d-block mx-auto"/> |
|||
{% if not list_db %} |
|||
<div class="alert alert-danger text-center">The database manager has been disabled by the administrator</div> |
|||
{% elif insecure and databases %} |
|||
<div class="alert alert-warning"> |
|||
Warning, your {{ system_name }} database manager is not protected.<br/> |
|||
Please <a href="#" data-toggle="modal" data-target=".o_database_master">set a master password</a> to secure it. |
|||
</div> |
|||
{% endif %} |
|||
{% if error %} |
|||
<div class="alert alert-danger">{{ error }}</div> |
|||
{% endif %} |
|||
{% if list_db and databases %} |
|||
<div class="list-group"> |
|||
{% for db in databases %} |
|||
<div class="list-group-item d-flex align-items-center"> |
|||
<a href="/web?db={{ db }}" class="d-block flex-grow-1"> |
|||
{% if db in incompatible_databases %} |
|||
<i class="icon fa fa-warning float-right text-warning" title="This database may not be compatible"></i> |
|||
{% endif %} |
|||
{{ db }} |
|||
</a> |
|||
{% if manage %} |
|||
<div class="btn-group btn-group-sm float-right"> |
|||
<button type="button" data-db="{{ db }}" data-target=".o_database_backup" class="o_database_action btn btn-primary"> |
|||
<i class="fa fa-floppy-o fa-fw"></i> Backup |
|||
</button> |
|||
<button type="button" data-db="{{ db }}" data-target=".o_database_duplicate" class="o_database_action btn btn-secondary"> |
|||
<i class="fa fa-files-o fa-fw"></i> Duplicate |
|||
</button> |
|||
<button type="button" data-db="{{ db }}" data-target=".o_database_delete" class="o_database_action btn btn-danger"> |
|||
<i class="fa fa-trash-o fa-fw"></i> Delete |
|||
</button> |
|||
</div> |
|||
{% endif %} |
|||
</div> |
|||
{% endfor %} |
|||
</div> |
|||
{% if manage %} |
|||
<div class="d-flex mt-2"> |
|||
<button type="button" data-toggle="modal" data-target=".o_database_create" class="btn btn-primary flex-grow-1">Create Database</button> |
|||
<button type="button" data-toggle="modal" data-target=".o_database_restore" class="btn btn-primary flex-grow-1 ml-2">Restore Database</button> |
|||
<button type="button" data-toggle="modal" data-target=".o_database_master" class="btn btn-primary flex-grow-1 ml-2">Set Master Password</button> |
|||
</div> |
|||
{% else %} |
|||
<div class="text-center mt-2"> |
|||
<a href="/web/database/manager">Manage databases</a> |
|||
</div> |
|||
{% endif %} |
|||
{% elif list_db %} |
|||
<form role="form" action="/web/database/create" method="post"> |
|||
{{ create_form() }} |
|||
<input type="submit" value="Create database" class="btn btn-primary float-left"/> |
|||
</form> |
|||
<a role="button" data-toggle="modal" data-target=".o_database_restore" class="btn btn-link">or restore a database</a> |
|||
{% endif %} |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Create --> |
|||
<div class="modal fade o_database_create" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<form role="form" action="/web/database/create" method="post"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Create Database</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
{{ create_form() }} |
|||
<small class="text-muted"> |
|||
To enhance your experience, some data may be sent to {{ system_name }} online services. See our <a href="{{ system_name }}">Privacy Policy</a>. |
|||
</small> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Continue" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Restore --> |
|||
<div class="modal fade o_database_restore" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Restore Database</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<form id="form_restore_db" role="form" action="/web/database/restore" method="post" enctype="multipart/form-data"> |
|||
<div class="modal-body"> |
|||
{{ master_input() }} |
|||
<div class="form-group"> |
|||
<label for="backup_file" class="col-form-label">File</label> |
|||
<input id="backup_file" type="file" name="backup_file" class="required"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="name" class="col-form-label">Database Name</label> |
|||
<input id="name" type="text" name="name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="copy">This database might have been moved or copied.</label> |
|||
<p class="form-text"> |
|||
In order to avoid conflicts between databases, {{ system_name }} needs to know if this database was moved or copied.<br/> |
|||
If you don't know, answer "This database is a copy". |
|||
</p> |
|||
<div class="custom-control custom-radio"> |
|||
<input id="radio_copy_true" name="copy" type="radio" class="custom-control-input" value="true" checked="1"> |
|||
<label for="radio_copy_true" class="custom-control-label">This database is a copy</label> |
|||
</div> |
|||
<div class="custom-control custom-radio"> |
|||
<input id="radio_copy_false" name="copy" type="radio" class="custom-control-input" value="false"> |
|||
<label for="radio_copy_false" class="custom-control-label">This database was moved</label> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Continue" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Master password --> |
|||
<div class="modal fade o_database_master" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Set Master Password</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<form id="form_change_pwd" role="form" action="/web/database/change_password" method="post"> |
|||
<div class="modal-body"> |
|||
<p>The master password is required to create, delete, dump or restore databases.</p> |
|||
{{ master_input() }} |
|||
<div class="form-group"> |
|||
<label for="master_pwd_new" class="col-form-label">New Master Password</label> |
|||
<div class="input-group"> |
|||
<input id="master_pwd_new" type="password" name="master_pwd_new" class="form-control" required="required" autocomplete="off"/> |
|||
<div class="input-group-append"> |
|||
<span class="fa fa-eye o_little_eye input-group-text" aria-hidden="true" style="cursor: pointer;"></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Continue" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Duplicate DB --> |
|||
<div class="modal fade o_database_duplicate" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Duplicate Database</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<form id="form-duplicate-db" role="form" action="/web/database/duplicate" method="post"> |
|||
<div class="modal-body"> |
|||
{{ master_input() }} |
|||
<div class="form-group"> |
|||
<label for="name" class="col-form-label">Database Name</label> |
|||
<input id="name" type="text" name="name" class="form-control" required="required" readonly="readonly"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="new_name" class="col-form-label">New Name</label> |
|||
<input id="new_name" type="text" name="new_name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/> |
|||
</div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Continue" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Drop DB --> |
|||
<div class="modal fade o_database_delete" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Delete Database</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<form id="form_drop_db" role="form" action="/web/database/drop" method="post"> |
|||
<div class="modal-body"> |
|||
{{ master_input() }} |
|||
<div class="form-group"> |
|||
<label for="name" class="col-form-label">Database</label> |
|||
<input id="name" type="text" name="name" class="form-control" required="required" readonly="readonly"/> |
|||
</div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Delete" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Backup DB --> |
|||
<div class="modal fade o_database_backup" role="dialog"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title">Backup Database</h4> |
|||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
|||
</div> |
|||
<form id="form_backup_db" role="form" action="/web/database/backup" method="post"> |
|||
<div class="modal-body"> |
|||
{{ master_input() }} |
|||
<div class="form-group"> |
|||
<label for="name" class="col-form-label">Database Name</label> |
|||
<input id="name" type="text" name="name" class="form-control" required="required" readonly="readonly"/> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="backup_format" class="col-form-label">Backup Format</label> |
|||
<select id="backup_format" name="backup_format" class="form-control" required="required"> |
|||
<option value="zip">zip (includes filestore)</option> |
|||
<option value="dump">pg_dump custom format (without filestore)</option> |
|||
</select> |
|||
</div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
<input type="submit" value="Backup" class="btn btn-primary float-right"/> |
|||
</div> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</body> |
|||
</html> |
@ -0,0 +1,23 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK Branding |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import utils |
@ -0,0 +1,38 @@ |
|||
################################################################################### |
|||
# |
|||
# Copyright (c) 2017-2019 MuK IT GmbH. |
|||
# |
|||
# This file is part of MuK Utils |
|||
# (see https://mukit.at). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Lesser General Public License as published by |
|||
# the Free Software Foundation, either version 3 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Lesser General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Lesser General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
import logging |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
#---------------------------------------------------------- |
|||
# Safe Execute |
|||
#---------------------------------------------------------- |
|||
|
|||
def safe_execute_exception(default, exception, function, *args, **kwargs): |
|||
try: |
|||
return function(*args, **kwargs) |
|||
except exception: |
|||
return default |
|||
|
|||
def safe_execute(default, function, *args, **kwargs): |
|||
return safe_execute_exception(default, Exception, function, *args, **kwargs) |