Browse Source

Apr 01: [ADD] Initial Commit 'odoo_database_restore_manager'

pull/313/head
RisvanaCybro 1 year ago
parent
commit
72331557de
  1. 55
      odoo_database_restore_manager/README.rst
  2. 23
      odoo_database_restore_manager/__init__.py
  3. 54
      odoo_database_restore_manager/__manifest__.py
  4. 6
      odoo_database_restore_manager/doc/RELEASE_NOTES.md
  5. 23
      odoo_database_restore_manager/models/__init__.py
  6. 279
      odoo_database_restore_manager/models/database_manager.py
  7. 32
      odoo_database_restore_manager/models/res_config_settings.py
  8. 3
      odoo_database_restore_manager/security/ir.model.access.csv
  9. BIN
      odoo_database_restore_manager/static/description/assets/cybro-icon.png
  10. BIN
      odoo_database_restore_manager/static/description/assets/cybro-odoo.png
  11. BIN
      odoo_database_restore_manager/static/description/assets/icons/check.png
  12. BIN
      odoo_database_restore_manager/static/description/assets/icons/chevron.png
  13. BIN
      odoo_database_restore_manager/static/description/assets/icons/cogs.png
  14. BIN
      odoo_database_restore_manager/static/description/assets/icons/consultation.png
  15. 1
      odoo_database_restore_manager/static/description/assets/icons/down.svg
  16. BIN
      odoo_database_restore_manager/static/description/assets/icons/ecom-black.png
  17. BIN
      odoo_database_restore_manager/static/description/assets/icons/education-black.png
  18. BIN
      odoo_database_restore_manager/static/description/assets/icons/faq.png
  19. BIN
      odoo_database_restore_manager/static/description/assets/icons/feature.png
  20. BIN
      odoo_database_restore_manager/static/description/assets/icons/hotel-black.png
  21. BIN
      odoo_database_restore_manager/static/description/assets/icons/license.png
  22. BIN
      odoo_database_restore_manager/static/description/assets/icons/lifebuoy.png
  23. BIN
      odoo_database_restore_manager/static/description/assets/icons/manufacturing-black.png
  24. BIN
      odoo_database_restore_manager/static/description/assets/icons/notes.png
  25. BIN
      odoo_database_restore_manager/static/description/assets/icons/pos-black.png
  26. BIN
      odoo_database_restore_manager/static/description/assets/icons/puzzle.png
  27. BIN
      odoo_database_restore_manager/static/description/assets/icons/restaurant-black.png
  28. BIN
      odoo_database_restore_manager/static/description/assets/icons/screenshot.png
  29. BIN
      odoo_database_restore_manager/static/description/assets/icons/service-black.png
  30. BIN
      odoo_database_restore_manager/static/description/assets/icons/skype.png
  31. 53
      odoo_database_restore_manager/static/description/assets/icons/star-1.svg
  32. 9
      odoo_database_restore_manager/static/description/assets/icons/star-2.svg
  33. BIN
      odoo_database_restore_manager/static/description/assets/icons/support.png
  34. BIN
      odoo_database_restore_manager/static/description/assets/icons/test-1 - Copy.png
  35. BIN
      odoo_database_restore_manager/static/description/assets/icons/test-1.png
  36. BIN
      odoo_database_restore_manager/static/description/assets/icons/test-2.png
  37. BIN
      odoo_database_restore_manager/static/description/assets/icons/trading-black.png
  38. BIN
      odoo_database_restore_manager/static/description/assets/icons/training.png
  39. BIN
      odoo_database_restore_manager/static/description/assets/icons/update.png
  40. BIN
      odoo_database_restore_manager/static/description/assets/icons/user.png
  41. BIN
      odoo_database_restore_manager/static/description/assets/icons/video.png
  42. BIN
      odoo_database_restore_manager/static/description/assets/icons/whatsapp.png
  43. BIN
      odoo_database_restore_manager/static/description/assets/icons/wrench.png
  44. BIN
      odoo_database_restore_manager/static/description/assets/misc/Cybrosys R.png
  45. 33
      odoo_database_restore_manager/static/description/assets/misc/email.svg
  46. 3
      odoo_database_restore_manager/static/description/assets/misc/phone.svg
  47. 9
      odoo_database_restore_manager/static/description/assets/misc/star (1) 2.svg
  48. 9
      odoo_database_restore_manager/static/description/assets/misc/support (1) 1.svg
  49. 6
      odoo_database_restore_manager/static/description/assets/misc/support-email.svg
  50. 17
      odoo_database_restore_manager/static/description/assets/misc/tick-mark.svg
  51. 9
      odoo_database_restore_manager/static/description/assets/misc/whatsapp 1.svg
  52. 33
      odoo_database_restore_manager/static/description/assets/misc/whatsapp.svg
  53. BIN
      odoo_database_restore_manager/static/description/assets/modules/1.gif
  54. BIN
      odoo_database_restore_manager/static/description/assets/modules/2.jpg
  55. BIN
      odoo_database_restore_manager/static/description/assets/modules/3.png
  56. BIN
      odoo_database_restore_manager/static/description/assets/modules/4.png
  57. BIN
      odoo_database_restore_manager/static/description/assets/modules/5.png
  58. BIN
      odoo_database_restore_manager/static/description/assets/modules/6.jpg
  59. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/1.png
  60. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/2.png
  61. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/3.png
  62. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/4.png
  63. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/5.png
  64. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/6.png
  65. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/7.png
  66. BIN
      odoo_database_restore_manager/static/description/assets/screenshots/hero.gif
  67. BIN
      odoo_database_restore_manager/static/description/banner.jpg
  68. BIN
      odoo_database_restore_manager/static/description/icon.png
  69. 1192
      odoo_database_restore_manager/static/description/index.html
  70. BIN
      odoo_database_restore_manager/static/src/img/odoo_logo.png
  71. BIN
      odoo_database_restore_manager/static/src/img/restore.png
  72. 79
      odoo_database_restore_manager/static/src/js/restore.js
  73. 65
      odoo_database_restore_manager/static/src/scss/db_restore.scss
  74. 84
      odoo_database_restore_manager/static/src/xml/db_restore_dashboard_templates.xml
  75. 13
      odoo_database_restore_manager/views/database_manager_views.xml
  76. 23
      odoo_database_restore_manager/views/res_config_settings_views.xml
  77. 22
      odoo_database_restore_manager/wizard/__init__.py
  78. 115
      odoo_database_restore_manager/wizard/database_restore.py
  79. 24
      odoo_database_restore_manager/wizard/database_restore_views.xml

55
odoo_database_restore_manager/README.rst

@ -0,0 +1,55 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Database Restore Manager
========================
All the database backups that are stored by module auto_database_backup can be
restored using this module
Configuration
=============
The auto_database_backup module should be installed
( Here is the link: https://apps.odoo.com/apps/modules/17.0/auto_database_backup/ )
All the requirements for auto_database_backup module should be installed.
Installation
============
- www.odoo.com/documentation/17.0/setup/install.html
- Install our custom addon
License
-------
General Public License, Version 3 (AGPL v3).
(http://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: (V16) Aslam A K,
(V17) Sruthi Ranjith
Contact : odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

23
odoo_database_restore_manager/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import models
from . import wizard

54
odoo_database_restore_manager/__manifest__.py

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': "Database Restore Manager",
'version': "17.0.1.0.0",
'category': "Extra Tools",
'summary': """Efficient Database Restore Manager""",
'description': """The Database Restore Manager allows users to easily
restore and download backups uploaded by the auto_database_backup module,
providing convenient backup management within the platform""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['base_setup', 'auto_database_backup'],
'data': [
'security/ir.model.access.csv',
'views/database_manager_views.xml',
'views/res_config_settings_views.xml',
'wizard/database_restore_views.xml'
],
'assets': {
'web.assets_backend': [
'/odoo_database_restore_manager/static/src/js/restore.js',
'/odoo_database_restore_manager/static/src/xml/db_restore_dashboard_templates.xml',
'/odoo_database_restore_manager/static/src/scss/db_restore.scss'
]
},
'external_dependencies': {'python': ['dropbox', 'gdown']},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

6
odoo_database_restore_manager/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <odoo_database_restore_manager>
#### 20.03.2024
#### Version 17.0.1.0.0
#### ADD
- Initial commit for Database Restore Manager

23
odoo_database_restore_manager/models/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import database_manager
from . import res_config_settings

279
odoo_database_restore_manager/models/database_manager.py

@ -0,0 +1,279 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
import boto3
import dropbox
import ftplib
import nextcloud_client
import os
import paramiko
import requests
from odoo.http import request
from datetime import datetime
from odoo import api, fields, models
class DatabaseManager(models.Model):
""" Dashboard model to view all database backups """
_name = 'database.manager'
_description = 'Database Manager'
@api.model
def action_import_files(self):
""" Import latest backups from the storages configured """
return_data = {}
backup_count = int(self.env['ir.config_parameter'].get_param(
'odoo_database_restore_manager.backup_count'))
current_company = request.httprequest.cookies.get('cids')[0]
# Check if backup_count is less than or equal to 0
if backup_count <= 0:
return ['error', 'Please set a backup count', 'Storages',
current_company]
# Check if any backups are configured in the database
if not self.env['db.backup.configure'].search([]):
return ['error', 'No Backups Found', 'auto_database_backup',
current_company]
# Loop through each configured backup source
for rec in self.env['db.backup.configure'].search([]):
# For Dropbox
if rec.backup_destination == 'dropbox':
try:
# Retrieve backups from Dropbox and update the return_data
# dictionary with the latest backups
dbx_dict = {}
dbx = dropbox.Dropbox(app_key=rec.dropbox_client_key,
app_secret=rec.dropbox_client_secret,
oauth2_refresh_token=
rec.dropbox_refresh_token)
response = dbx.files_list_folder(path=rec.dropbox_folder)
for files in response.entries:
file = dbx.files_get_temporary_link(
path=files.path_lower)
dbx_dict[file.metadata.name] = file.link, 'Dropbox', \
files.client_modified
return_data.update(dict(list(sorted(dbx_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during Dropbox backup
# retrieval
return ['error', e, 'Dropbox', current_company]
# For Onedrive
if rec.backup_destination == 'onedrive':
try:
# Retrieve backups from OneDrive and update the return_data
# dictionary with the latest backups
onedrive_dict = {}
if rec.onedrive_token_validity <= fields.Datetime.now():
rec.generate_onedrive_refresh_token()
url = "https://graph.microsoft.com/v1.0/me/drive/items/" \
"%s/children?Content-Type=application/json" \
% rec.onedrive_folder_key
response = requests.request("GET", url, headers={
'Authorization': 'Bearer "' + rec.onedrive_access_token + '"'}, data={})
for file in response.json().get('value'):
if list(file.keys())[
0] == '@microsoft.graph.downloadUrl':
onedrive_dict[file['name']] = file[
'@microsoft.graph.downloadUrl'], 'OneDrive', \
datetime.strptime(
file['createdDateTime'],
"%Y-%m-%dT%H:%M:%S.%fZ").strftime(
"%Y-%m-%d %H:%M:%S")
return_data.update(dict(list(sorted(onedrive_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during OneDrive backup
# retrieval
return ['error', e, 'OneDrive', current_company]
# For Google Drive
if rec.backup_destination == 'google_drive':
try:
# Retrieve backups from Google Drive and update the
# return_data dictionary with the latest backups
gdrive_dict = {}
if rec.gdrive_token_validity <= fields.Datetime.now():
rec.generate_gdrive_refresh_token()
response = requests.get(
f"https://www.googleapis.com/drive/v3/files",
headers={
"Authorization": "Bearer %s" % rec.gdrive_access_token
},
params={
"q": f"'{rec.google_drive_folder_key}' in parents",
"fields": "files(name, webContentLink, createdTime)",
})
for file_data in response.json().get("files", []):
gdrive_dict[file_data.get("name")] = file_data.get(
"webContentLink"), 'Google Drive', \
datetime.strptime(file_data.get("createdTime"),
"%Y-%m-%dT%H:%M:%S.%fZ").strftime(
"%Y-%m-%d %H:%M:%S")
return_data.update(dict(list(sorted(gdrive_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during Google Drive
# backup retrieval
return ['error', e, 'Google Drive', current_company]
# For Local Storage
if rec.backup_destination == 'local':
try:
# Retrieve backups from Local Storage and update the
# return_data dictionary with the latest backups
local_dict = {}
for root, dirs, files in os.walk(rec.backup_path):
for file in files:
file_path = os.path.join(root, file)
create_date = datetime.fromtimestamp(
os.path.getctime(file_path)).strftime(
"%Y-%m-%d %H:%M:%S")
local_dict[file] = file_path, 'Local Storage', \
create_date
return_data.update(dict(list(sorted(local_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during Local Storage
# backup retrieval
return ['error', e, 'Local', current_company]
# For FTP
if rec.backup_destination == 'ftp':
try:
# Retrieve backups from FTP Storage and update the
# return_data dictionary with the latest backups
ftp_dict = {}
ftp_server = ftplib.FTP()
ftp_server.connect(rec.ftp_host, int(rec.ftp_port))
ftp_server.login(rec.ftp_user, rec.ftp_password)
for file in ftp_server.nlst(rec.ftp_path):
file_details = ftp_server.voidcmd("MDTM " + file)
ftp_dict[os.path.basename(
file)] = file, 'FTP Storage', datetime.strptime(
file_details[4:].strip(), "%Y%m%d%H%M%S")
ftp_server.quit()
return_data.update(dict(list(sorted(ftp_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during FTP Storage
# backup retrieval
return ['error', e, 'FTP server', current_company]
# For SFTP
if rec.backup_destination == 'sftp':
sftp_client = paramiko.SSHClient()
sftp_client.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
try:
# Retrieve backups from SFTP Storage and update the
# return_data dictionary with the latest backups
sftp_dict = {}
sftp_client.connect(hostname=rec.sftp_host,
username=rec.sftp_user,
password=rec.sftp_password,
port=rec.sftp_port)
sftp_server = sftp_client.open_sftp()
sftp_server.chdir(rec.sftp_path)
file_list = sftp_server.listdir()
for file_name in file_list:
sftp_dict[file_name] = os.path.join(rec.sftp_path,
file_name), \
'SFTP Storage', datetime.fromtimestamp(
sftp_server.stat(file_name).st_mtime)
sftp_server.close()
return_data.update(dict(list(sorted(sftp_dict.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during SFTP Storage
# backup retrieval
return ['error', e, 'SFTP server', current_company]
finally:
sftp_client.close()
# For Next Cloud
if rec.backup_destination == 'next_cloud':
try:
nxt_dixt = {}
nc_access = nextcloud_client.Client(rec.domain)
nc_access.login(rec.next_cloud_user_name,
rec.next_cloud_password)
for file_name in [file.name for file in
nc_access.list(
'/' + rec.nextcloud_folder_key)]:
link_info = nc_access.share_file_with_link(
'/' + rec.nextcloud_folder_key + '/' + file_name,
publicUpload=False)
file_info = nc_access.file_info(
'/' + rec.nextcloud_folder_key + '/' + file_name)
input_datetime = datetime.strptime(
file_info.attributes['{DAV:}getlastmodified'],
"%a, %d %b %Y %H:%M:%S %Z")
output_date_str = input_datetime.strftime(
"%Y-%m-%d %H:%M:%S")
nxt_dixt[
file_name] = link_info.get_link() + '/download', 'Nextcloud', output_date_str
return_data.update(dict(list(sorted(nxt_dixt.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during SFTP Storage
# backup retrieval
return ['error', e, 'Nextcloud', current_company]
# For Amazon S3
if rec.backup_destination == 'amazon_s3':
try:
s3_dixt = {}
client = boto3.client('s3', aws_access_key_id=rec.aws_access_key,
aws_secret_access_key=rec.aws_secret_access_key)
region = client.get_bucket_location(Bucket=rec.bucket_file_name)
client = boto3.client(
's3', region_name=region['LocationConstraint'],
aws_access_key_id=rec.aws_access_key,
aws_secret_access_key=rec.aws_secret_access_key
)
response = client.list_objects(Bucket=rec.bucket_file_name, Prefix=rec.aws_folder_name)
for data in response['Contents']:
if data['Size'] != 0:
url = client.generate_presigned_url(
ClientMethod='get_object',
Params={'Bucket': rec.bucket_file_name,
'Key': data['Key']},ExpiresIn=3600)
s3_dixt[data['Key']] = url, 'AmazonS3', data['LastModified']
return_data.update(dict(list(sorted(s3_dixt.items(),
key=lambda x: x[1][2],
reverse=True))[
:backup_count]))
except Exception as e:
# Handle any exceptions that occur during amazon_s3 Storage
# backup retrieval
return ['error', e, 'Amazon S3', current_company]
# Return the dictionary containing the latest backups from all
# configured sources
return [return_data, current_company]

32
odoo_database_restore_manager/models/res_config_settings.py

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
""" Configure the number of backups for restore """
_inherit = 'res.config.settings'
backup_count = fields.Integer(string='Backup Count',
help='Number of backups to list for restore',
config_parameter=
'odoo_database_restore_manager.backup_count')

3
odoo_database_restore_manager/security/ir.model.access.csv

@ -0,0 +1,3 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_database_manager,access.database.manager,model_database_manager,base.group_user,1,1,1,1
access_database_restore,access.database.restore,model_database_restore,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_database_manager access.database.manager model_database_manager base.group_user 1 1 1 1
3 access_database_restore access.database.restore model_database_restore base.group_user 1 1 1 1

BIN
odoo_database_restore_manager/static/description/assets/cybro-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
odoo_database_restore_manager/static/description/assets/cybro-odoo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
odoo_database_restore_manager/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

1
odoo_database_restore_manager/static/description/assets/icons/down.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" width="512" height="512" x="0" y="0" viewBox="0 0 24 24" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g id="Layer_2" data-name="Layer 2"><path d="m12 1a11 11 0 1 0 11 11 11.013 11.013 0 0 0 -11-11zm5.707 9.707-5 5a1 1 0 0 1 -1.414 0l-5-5a1 1 0 0 1 1.414-1.414l4.293 4.293 4.293-4.293a1 1 0 0 1 1.414 1.414z" fill="#781d96" data-original="#000000" class=""></path></g></g></svg>

After

Width:  |  Height:  |  Size: 542 B

BIN
odoo_database_restore_manager/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
odoo_database_restore_manager/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
odoo_database_restore_manager/static/description/assets/icons/faq.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/feature.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
odoo_database_restore_manager/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
odoo_database_restore_manager/static/description/assets/icons/notes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
odoo_database_restore_manager/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
odoo_database_restore_manager/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
odoo_database_restore_manager/static/description/assets/icons/screenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
odoo_database_restore_manager/static/description/assets/icons/skype.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

53
odoo_database_restore_manager/static/description/assets/icons/star-1.svg

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1024px" height="1024px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.968" fill="#6802dd" d="M 872.5,351.5 C 869.316,353.414 865.649,354.08 861.5,353.5C 861.068,352.29 860.401,351.29 859.5,350.5C 855.884,340.601 851.217,331.268 845.5,322.5C 841.319,314.792 836.652,307.458 831.5,300.5C 825.654,289.989 818.654,280.322 810.5,271.5C 804.551,263.217 797.884,255.55 790.5,248.5C 783.833,241.167 776.833,234.167 769.5,227.5C 763.245,221.369 756.578,215.702 749.5,210.5C 738.906,201.529 727.572,193.529 715.5,186.5C 706.018,180.041 696.018,174.374 685.5,169.5C 673.375,162.774 660.708,157.107 647.5,152.5C 631.495,146.499 615.162,141.499 598.5,137.5C 507.572,117.423 420.572,128.089 337.5,169.5C 326.51,174.993 315.843,180.993 305.5,187.5C 296.223,193.444 287.223,199.778 278.5,206.5C 269.849,213.154 261.516,220.154 253.5,227.5C 246.167,234.167 239.167,241.167 232.5,248.5C 225.116,255.55 218.449,263.217 212.5,271.5C 204.346,280.322 197.346,289.989 191.5,300.5C 186.348,307.458 181.681,314.792 177.5,322.5C 171.798,331.237 167.132,340.57 163.5,350.5C 162.599,351.29 161.932,352.29 161.5,353.5C 157.351,354.08 153.684,353.414 150.5,351.5C 183.041,278.449 233.041,220.282 300.5,177C 398.817,117.525 503.817,101.859 615.5,130C 722.993,161.19 804.16,225.357 859,322.5C 864.059,331.948 868.559,341.615 872.5,351.5 Z"/></g>
<g><path style="opacity:1" fill="#b779fc" d="M 598.5,137.5 C 615.162,141.499 631.495,146.499 647.5,152.5C 640.391,154.014 633.058,154.847 625.5,155C 625.957,155.414 626.291,155.914 626.5,156.5C 616.183,157.332 605.849,157.832 595.5,158C 595.957,158.414 596.291,158.914 596.5,159.5C 591.533,160.329 586.533,160.829 581.5,161C 581.957,161.414 582.291,161.914 582.5,162.5C 572.833,163.167 563.167,163.833 553.5,164.5C 554.624,165.914 555.624,167.414 556.5,169C 540.819,169.345 525.152,170.011 509.5,171C 510.167,171.667 510.833,172.333 511.5,173C 501.5,173.333 491.5,173.667 481.5,174C 482.167,175 482.833,176 483.5,177C 474.176,177.744 464.843,178.244 455.5,178.5C 419.098,172.35 382.431,169.683 345.5,170.5C 358.362,169.511 371.362,168.344 384.5,167C 383.833,166 383.167,165 382.5,164C 401.944,162.442 421.944,161.109 442.5,160C 441.833,159.333 441.167,158.667 440.5,158C 445.833,157.667 451.167,157.333 456.5,157C 455.833,156.333 455.167,155.667 454.5,155C 473.944,153.442 493.944,152.109 514.5,151C 513.833,150 513.167,149 512.5,148C 517.533,147.829 522.533,147.329 527.5,146.5C 527.291,145.914 526.957,145.414 526.5,145C 536.849,144.832 547.183,144.332 557.5,143.5C 557.291,142.914 556.957,142.414 556.5,142C 566.184,141.832 575.851,141.332 585.5,140.5C 585.291,139.914 584.957,139.414 584.5,139C 589.351,138.826 594.018,138.326 598.5,137.5 Z"/></g>
<g><path style="opacity:1" fill="#ba7efd" d="M 598.5,137.5 C 594.018,138.326 589.351,138.826 584.5,139C 584.957,139.414 585.291,139.914 585.5,140.5C 575.851,141.332 566.184,141.832 556.5,142C 556.957,142.414 557.291,142.914 557.5,143.5C 547.183,144.332 536.849,144.832 526.5,145C 526.957,145.414 527.291,145.914 527.5,146.5C 522.533,147.329 517.533,147.829 512.5,148C 513.167,149 513.833,150 514.5,151C 493.944,152.109 473.944,153.442 454.5,155C 455.167,155.667 455.833,156.333 456.5,157C 451.167,157.333 445.833,157.667 440.5,158C 441.167,158.667 441.833,159.333 442.5,160C 421.944,161.109 401.944,162.442 382.5,164C 383.167,165 383.833,166 384.5,167C 371.362,168.344 358.362,169.511 345.5,170.5C 342.615,170.806 339.948,170.473 337.5,169.5C 420.572,128.089 507.572,117.423 598.5,137.5 Z"/></g>
<g><path style="opacity:1" fill="#b373fb" d="M 647.5,152.5 C 660.708,157.107 673.375,162.774 685.5,169.5C 678.679,170.329 671.679,170.829 664.5,171C 664.957,171.414 665.291,171.914 665.5,172.5C 655.851,173.332 646.184,173.832 636.5,174C 637.167,175 637.833,176 638.5,177C 633.467,177.171 628.467,177.671 623.5,178.5C 623.709,179.086 624.043,179.586 624.5,180C 603.944,181.109 583.944,182.442 564.5,184C 565.357,184.689 566.023,185.522 566.5,186.5C 561.5,187.167 556.5,187.833 551.5,188.5C 551.709,189.086 552.043,189.586 552.5,190C 542.167,190.333 531.833,190.667 521.5,191C 521.957,191.414 522.291,191.914 522.5,192.5C 519.914,193.48 517.247,193.813 514.5,193.5C 508.102,192.033 501.768,190.366 495.5,188.5C 482.32,184.531 468.987,181.198 455.5,178.5C 464.843,178.244 474.176,177.744 483.5,177C 482.833,176 482.167,175 481.5,174C 491.5,173.667 501.5,173.333 511.5,173C 510.833,172.333 510.167,171.667 509.5,171C 525.152,170.011 540.819,169.345 556.5,169C 555.624,167.414 554.624,165.914 553.5,164.5C 563.167,163.833 572.833,163.167 582.5,162.5C 582.291,161.914 581.957,161.414 581.5,161C 586.533,160.829 591.533,160.329 596.5,159.5C 596.291,158.914 595.957,158.414 595.5,158C 605.849,157.832 616.183,157.332 626.5,156.5C 626.291,155.914 625.957,155.414 625.5,155C 633.058,154.847 640.391,154.014 647.5,152.5 Z"/></g>
<g><path style="opacity:1" fill="#b06dfa" d="M 685.5,169.5 C 696.018,174.374 706.018,180.041 715.5,186.5C 712.642,187.166 709.642,187.833 706.5,188.5C 706.709,189.086 707.043,189.586 707.5,190C 697.151,190.168 686.817,190.668 676.5,191.5C 676.709,192.086 677.043,192.586 677.5,193C 662.518,194.032 647.518,194.698 632.5,195C 643.515,195.168 654.515,195.668 665.5,196.5C 645.225,197.916 624.892,199.416 604.5,201C 605.167,202 605.833,203 606.5,204C 601.833,204.333 597.167,204.667 592.5,205C 592.957,205.414 593.291,205.914 593.5,206.5C 583.183,207.332 572.849,207.832 562.5,208C 565.194,210.552 564.527,211.719 560.5,211.5C 557.166,210.166 553.833,208.833 550.5,207.5C 538.736,202.245 526.736,197.578 514.5,193.5C 517.247,193.813 519.914,193.48 522.5,192.5C 522.291,191.914 521.957,191.414 521.5,191C 531.833,190.667 542.167,190.333 552.5,190C 552.043,189.586 551.709,189.086 551.5,188.5C 556.5,187.833 561.5,187.167 566.5,186.5C 566.023,185.522 565.357,184.689 564.5,184C 583.944,182.442 603.944,181.109 624.5,180C 624.043,179.586 623.709,179.086 623.5,178.5C 628.467,177.671 633.467,177.171 638.5,177C 637.833,176 637.167,175 636.5,174C 646.184,173.832 655.851,173.332 665.5,172.5C 665.291,171.914 664.957,171.414 664.5,171C 671.679,170.829 678.679,170.329 685.5,169.5 Z"/></g>
<g><path style="opacity:1" fill="#af6bfb" d="M 337.5,169.5 C 339.948,170.473 342.615,170.806 345.5,170.5C 382.431,169.683 419.098,172.35 455.5,178.5C 468.987,181.198 482.32,184.531 495.5,188.5C 431.998,188.832 368.664,188.499 305.5,187.5C 315.843,180.993 326.51,174.993 337.5,169.5 Z"/></g>
<g><path style="opacity:1" fill="#ac66fa" d="M 305.5,187.5 C 368.664,188.499 431.998,188.832 495.5,188.5C 501.768,190.366 508.102,192.033 514.5,193.5C 526.736,197.578 538.736,202.245 550.5,207.5C 459.665,207.833 368.998,207.499 278.5,206.5C 287.223,199.778 296.223,193.444 305.5,187.5 Z"/></g>
<g><path style="opacity:1" fill="#ac66f9" d="M 715.5,186.5 C 727.572,193.529 738.906,201.529 749.5,210.5C 739.992,211.167 730.325,211.833 720.5,212.5C 720.709,213.086 721.043,213.586 721.5,214C 711.151,214.168 700.817,214.668 690.5,215.5C 690.833,216.167 691.167,216.833 691.5,217.5C 687.167,218.167 682.833,218.833 678.5,219.5C 678.709,220.086 679.043,220.586 679.5,221C 669.151,221.168 658.817,221.668 648.5,222.5C 648.977,223.478 649.643,224.311 650.5,225C 645.167,225.333 639.833,225.667 634.5,226C 635.167,226.667 635.833,227.333 636.5,228C 626.5,228.333 616.5,228.667 606.5,229C 609.145,232.164 608.145,233.331 603.5,232.5C 600.848,230.418 597.848,229.085 594.5,228.5C 583.446,222.306 572.112,216.639 560.5,211.5C 564.527,211.719 565.194,210.552 562.5,208C 572.849,207.832 583.183,207.332 593.5,206.5C 593.291,205.914 592.957,205.414 592.5,205C 597.167,204.667 601.833,204.333 606.5,204C 605.833,203 605.167,202 604.5,201C 624.892,199.416 645.225,197.916 665.5,196.5C 654.515,195.668 643.515,195.168 632.5,195C 647.518,194.698 662.518,194.032 677.5,193C 677.043,192.586 676.709,192.086 676.5,191.5C 686.817,190.668 697.151,190.168 707.5,190C 707.043,189.586 706.709,189.086 706.5,188.5C 709.642,187.833 712.642,187.166 715.5,186.5 Z"/></g>
<g><path style="opacity:1" fill="#a85ff8" d="M 278.5,206.5 C 368.998,207.499 459.665,207.833 550.5,207.5C 553.833,208.833 557.166,210.166 560.5,211.5C 572.112,216.639 583.446,222.306 594.5,228.5C 480.665,228.833 366.999,228.5 253.5,227.5C 261.516,220.154 269.849,213.154 278.5,206.5 Z"/></g>
<g><path style="opacity:1" fill="#a760f7" d="M 749.5,210.5 C 756.578,215.702 763.245,221.369 769.5,227.5C 767.031,228.317 764.365,228.817 761.5,229C 762.167,230 762.833,231 763.5,232C 753.151,232.168 742.817,232.668 732.5,233.5C 732.709,234.086 733.043,234.586 733.5,235C 728.467,235.171 723.467,235.671 718.5,236.5C 718.833,237.167 719.167,237.833 719.5,238.5C 709.833,239.167 700.167,239.833 690.5,240.5C 690.977,241.478 691.643,242.311 692.5,243C 687.167,243.333 681.833,243.667 676.5,244C 677.167,244.667 677.833,245.333 678.5,246C 668.151,246.168 657.817,246.668 647.5,247.5C 647.833,248.167 648.167,248.833 648.5,249.5C 643.208,250.495 637.875,250.828 632.5,250.5C 632.158,249.662 631.492,249.328 630.5,249.5C 621.669,243.583 612.669,237.917 603.5,232.5C 608.145,233.331 609.145,232.164 606.5,229C 616.5,228.667 626.5,228.333 636.5,228C 635.833,227.333 635.167,226.667 634.5,226C 639.833,225.667 645.167,225.333 650.5,225C 649.643,224.311 648.977,223.478 648.5,222.5C 658.817,221.668 669.151,221.168 679.5,221C 679.043,220.586 678.709,220.086 678.5,219.5C 682.833,218.833 687.167,218.167 691.5,217.5C 691.167,216.833 690.833,216.167 690.5,215.5C 700.817,214.668 711.151,214.168 721.5,214C 721.043,213.586 720.709,213.086 720.5,212.5C 730.325,211.833 739.992,211.167 749.5,210.5 Z"/></g>
<g><path style="opacity:1" fill="#a45af7" d="M 253.5,227.5 C 366.999,228.5 480.665,228.833 594.5,228.5C 597.848,229.085 600.848,230.418 603.5,232.5C 612.669,237.917 621.669,243.583 630.5,249.5C 592.663,249.168 554.996,249.502 517.5,250.5C 515.511,246.904 513.511,243.237 511.5,239.5C 509.203,243.1 507.203,246.767 505.5,250.5C 414.5,249.833 323.5,249.167 232.5,248.5C 239.167,241.167 246.167,234.167 253.5,227.5 Z"/></g>
<g><path style="opacity:1" fill="#a45af6" d="M 769.5,227.5 C 776.833,234.167 783.833,241.167 790.5,248.5C 779.674,249.33 768.674,249.83 757.5,250C 757.957,250.414 758.291,250.914 758.5,251.5C 764.167,252.167 769.833,252.833 775.5,253.5C 761.379,256.056 746.379,257.556 730.5,258C 731.167,259 731.833,260 732.5,261C 718.167,262.667 703.833,264.333 689.5,266C 690.293,267.085 690.96,268.252 691.5,269.5C 680.849,270.666 670.182,270.832 659.5,270C 650.433,263.478 641.433,256.978 632.5,250.5C 637.875,250.828 643.208,250.495 648.5,249.5C 648.167,248.833 647.833,248.167 647.5,247.5C 657.817,246.668 668.151,246.168 678.5,246C 677.833,245.333 677.167,244.667 676.5,244C 681.833,243.667 687.167,243.333 692.5,243C 691.643,242.311 690.977,241.478 690.5,240.5C 700.167,239.833 709.833,239.167 719.5,238.5C 719.167,237.833 718.833,237.167 718.5,236.5C 723.467,235.671 728.467,235.171 733.5,235C 733.043,234.586 732.709,234.086 732.5,233.5C 742.817,232.668 753.151,232.168 763.5,232C 762.833,231 762.167,230 761.5,229C 764.365,228.817 767.031,228.317 769.5,227.5 Z"/></g>
<g><path style="opacity:1" fill="#fefefe" d="M 517.5,250.5 C 520.659,258.151 524.325,265.484 528.5,272.5C 532.659,282.151 537.325,291.484 542.5,300.5C 546.263,309.024 550.263,317.358 554.5,325.5C 558.325,334.484 562.659,343.151 567.5,351.5C 571.325,360.484 575.659,369.151 580.5,377.5C 584.105,385.875 588.105,394.042 592.5,402C 615.123,405.491 637.79,408.658 660.5,411.5C 697.139,417.139 733.806,422.639 770.5,428C 766.296,432.036 762.296,436.202 758.5,440.5C 746.473,452.194 734.473,463.861 722.5,475.5C 708.807,488.861 695.14,502.194 681.5,515.5C 668.506,528.327 655.339,540.994 642,553.5C 641.26,554.749 641.427,555.749 642.5,556.5C 643.974,570.68 646.308,584.68 649.5,598.5C 652.98,621.718 656.98,644.718 661.5,667.5C 664.668,688.343 668.001,709.176 671.5,730C 671.167,730.833 670.833,731.667 670.5,732.5C 617.658,704.245 564.658,676.245 511.5,648.5C 458.5,676.5 405.5,704.5 352.5,732.5C 352.167,731.667 351.833,730.833 351.5,730C 354.999,709.176 358.332,688.343 361.5,667.5C 366.02,644.718 370.02,621.718 373.5,598.5C 376.692,584.68 379.026,570.68 380.5,556.5C 381.573,555.749 381.74,554.749 381,553.5C 366.327,539.66 351.827,525.66 337.5,511.5C 324.527,498.861 311.527,486.194 298.5,473.5C 287.193,462.527 275.86,451.527 264.5,440.5C 260.704,436.202 256.704,432.036 252.5,428C 289.455,422.173 326.455,416.673 363.5,411.5C 386.197,408.256 408.863,404.756 431.5,401C 433.974,395.886 436.307,390.72 438.5,385.5C 444.675,374.484 450.341,363.151 455.5,351.5C 460.341,343.151 464.675,334.484 468.5,325.5C 472.737,317.358 476.737,309.024 480.5,300.5C 485.675,291.484 490.341,282.151 494.5,272.5C 498.675,265.484 502.341,258.151 505.5,250.5C 507.203,246.767 509.203,243.1 511.5,239.5C 513.511,243.237 515.511,246.904 517.5,250.5 Z"/></g>
<g><path style="opacity:1" fill="#a054f5" d="M 232.5,248.5 C 323.5,249.167 414.5,249.833 505.5,250.5C 502.341,258.151 498.675,265.484 494.5,272.5C 400.332,272.833 306.332,272.499 212.5,271.5C 218.449,263.217 225.116,255.55 232.5,248.5 Z"/></g>
<g><path style="opacity:1" fill="#a054f5" d="M 790.5,248.5 C 797.884,255.55 804.551,263.217 810.5,271.5C 802.677,272.329 794.677,272.829 786.5,273C 787.357,273.689 788.023,274.522 788.5,275.5C 778.183,276.332 767.849,276.832 757.5,277C 758.167,278 758.833,279 759.5,280C 754.467,280.171 749.467,280.671 744.5,281.5C 744.833,282.167 745.167,282.833 745.5,283.5C 735.833,284.167 726.167,284.833 716.5,285.5C 716.977,286.478 717.643,287.311 718.5,288C 713.167,288.333 707.833,288.667 702.5,289C 703.357,289.689 704.023,290.522 704.5,291.5C 699.147,292.211 693.814,292.878 688.5,293.5C 680.015,286.426 671.348,279.592 662.5,273C 617.835,272.5 573.168,272.333 528.5,272.5C 524.325,265.484 520.659,258.151 517.5,250.5C 554.996,249.502 592.663,249.168 630.5,249.5C 631.492,249.328 632.158,249.662 632.5,250.5C 641.433,256.978 650.433,263.478 659.5,270C 670.182,270.832 680.849,270.666 691.5,269.5C 690.96,268.252 690.293,267.085 689.5,266C 703.833,264.333 718.167,262.667 732.5,261C 731.833,260 731.167,259 730.5,258C 746.379,257.556 761.379,256.056 775.5,253.5C 769.833,252.833 764.167,252.167 758.5,251.5C 758.291,250.914 757.957,250.414 757.5,250C 768.674,249.83 779.674,249.33 790.5,248.5 Z"/></g>
<g><path style="opacity:1" fill="#9c4df4" d="M 212.5,271.5 C 306.332,272.499 400.332,272.833 494.5,272.5C 490.341,282.151 485.675,291.484 480.5,300.5C 384.167,300.5 287.833,300.5 191.5,300.5C 197.346,289.989 204.346,280.322 212.5,271.5 Z"/></g>
<g><path style="opacity:1" fill="#9b4df3" d="M 810.5,271.5 C 818.654,280.322 825.654,289.989 831.5,300.5C 822.143,300.168 812.81,300.502 803.5,301.5C 803.833,302.167 804.167,302.833 804.5,303.5C 794.183,304.332 783.849,304.832 773.5,305C 774.167,306 774.833,307 775.5,308C 770.467,308.171 765.467,308.671 760.5,309.5C 760.833,310.167 761.167,310.833 761.5,311.5C 756.533,312.329 751.533,312.829 746.5,313C 747.167,314 747.833,315 748.5,316C 738.816,316.168 729.149,316.668 719.5,317.5C 721.167,319.167 720.833,320.167 718.5,320.5C 710.578,314.916 703.245,308.583 696.5,301.5C 645.171,300.5 593.838,300.167 542.5,300.5C 537.325,291.484 532.659,282.151 528.5,272.5C 573.168,272.333 617.835,272.5 662.5,273C 671.348,279.592 680.015,286.426 688.5,293.5C 693.814,292.878 699.147,292.211 704.5,291.5C 704.023,290.522 703.357,289.689 702.5,289C 707.833,288.667 713.167,288.333 718.5,288C 717.643,287.311 716.977,286.478 716.5,285.5C 726.167,284.833 735.833,284.167 745.5,283.5C 745.167,282.833 744.833,282.167 744.5,281.5C 749.467,280.671 754.467,280.171 759.5,280C 758.833,279 758.167,278 757.5,277C 767.849,276.832 778.183,276.332 788.5,275.5C 788.023,274.522 787.357,273.689 786.5,273C 794.677,272.829 802.677,272.329 810.5,271.5 Z"/></g>
<g><path style="opacity:1" fill="#9847f2" d="M 191.5,300.5 C 287.833,300.5 384.167,300.5 480.5,300.5C 476.737,309.024 472.737,317.358 468.5,325.5C 371.329,325.166 274.329,324.166 177.5,322.5C 181.681,314.792 186.348,307.458 191.5,300.5 Z"/></g>
<g><path style="opacity:1" fill="#9847f2" d="M 542.5,300.5 C 593.838,300.167 645.171,300.5 696.5,301.5C 703.245,308.583 710.578,314.916 718.5,320.5C 720.833,320.167 721.167,319.167 719.5,317.5C 729.149,316.668 738.816,316.168 748.5,316C 747.833,315 747.167,314 746.5,313C 751.533,312.829 756.533,312.329 761.5,311.5C 761.167,310.833 760.833,310.167 760.5,309.5C 765.467,308.671 770.467,308.171 775.5,308C 774.833,307 774.167,306 773.5,305C 783.849,304.832 794.183,304.332 804.5,303.5C 804.167,302.833 803.833,302.167 803.5,301.5C 812.81,300.502 822.143,300.168 831.5,300.5C 836.652,307.458 841.319,314.792 845.5,322.5C 836.219,324.312 826.552,325.145 816.5,325C 817.357,325.689 818.023,326.522 818.5,327.5C 808.183,328.332 797.849,328.832 787.5,329C 788.293,330.085 788.96,331.252 789.5,332.5C 784.533,333.329 779.533,333.829 774.5,334C 775.916,336.835 777.583,339.502 779.5,342C 769.5,342.333 759.5,342.667 749.5,343C 750.357,343.689 751.023,344.522 751.5,345.5C 747.541,346.66 743.541,346.827 739.5,346C 733.171,338.671 726.504,331.671 719.5,325C 664.332,324.168 609.332,324.335 554.5,325.5C 550.263,317.358 546.263,309.024 542.5,300.5 Z"/></g>
<g><path style="opacity:1" fill="#9441f0" d="M 177.5,322.5 C 274.329,324.166 371.329,325.166 468.5,325.5C 464.675,334.484 460.341,343.151 455.5,351.5C 358.335,350.501 261.001,350.167 163.5,350.5C 167.132,340.57 171.798,331.237 177.5,322.5 Z"/></g>
<g><path style="opacity:1" fill="#9441f0" d="M 845.5,322.5 C 851.217,331.268 855.884,340.601 859.5,350.5C 850.161,350.334 840.827,350.5 831.5,351C 832.357,351.689 833.023,352.522 833.5,353.5C 828.5,354.167 823.5,354.833 818.5,355.5C 819.167,356.5 819.833,357.5 820.5,358.5C 810.183,359.332 799.849,359.832 789.5,360C 790.167,361 790.833,362 791.5,363C 786.467,363.171 781.467,363.671 776.5,364.5C 777.04,365.748 777.707,366.915 778.5,368C 773.833,368.333 769.167,368.667 764.5,369C 767.388,371.296 766.888,372.462 763,372.5C 761.564,372.441 760.231,372.108 759,371.5C 754.259,364.088 748.759,357.255 742.5,351C 683.999,350.168 625.665,350.335 567.5,351.5C 562.659,343.151 558.325,334.484 554.5,325.5C 609.332,324.335 664.332,324.168 719.5,325C 726.504,331.671 733.171,338.671 739.5,346C 743.541,346.827 747.541,346.66 751.5,345.5C 751.023,344.522 750.357,343.689 749.5,343C 759.5,342.667 769.5,342.333 779.5,342C 777.583,339.502 775.916,336.835 774.5,334C 779.533,333.829 784.533,333.329 789.5,332.5C 788.96,331.252 788.293,330.085 787.5,329C 797.849,328.832 808.183,328.332 818.5,327.5C 818.023,326.522 817.357,325.689 816.5,325C 826.552,325.145 836.219,324.312 845.5,322.5 Z"/></g>
<g><path style="opacity:1" fill="#8f3bee" d="M 859.5,350.5 C 860.401,351.29 861.068,352.29 861.5,353.5C 865.09,360.937 868.09,368.603 870.5,376.5C 863.011,377.329 855.344,377.829 847.5,378C 848.167,379 848.833,380 849.5,381C 844.167,381.333 838.833,381.667 833.5,382C 834.743,383.154 835.743,384.488 836.5,386C 826.151,386.168 815.817,386.668 805.5,387.5C 806.167,388.5 806.833,389.5 807.5,390.5C 802.5,391.167 797.5,391.833 792.5,392.5C 792.977,393.478 793.643,394.311 794.5,395C 789.833,395.333 785.167,395.667 780.5,396C 782.631,397.888 782.631,399.388 780.5,400.5C 774.249,393.525 768.582,386.025 763.5,378C 702.501,377.5 641.501,377.333 580.5,377.5C 575.659,369.151 571.325,360.484 567.5,351.5C 625.665,350.335 683.999,350.168 742.5,351C 748.759,357.255 754.259,364.088 759,371.5C 760.231,372.108 761.564,372.441 763,372.5C 766.888,372.462 767.388,371.296 764.5,369C 769.167,368.667 773.833,368.333 778.5,368C 777.707,366.915 777.04,365.748 776.5,364.5C 781.467,363.671 786.467,363.171 791.5,363C 790.833,362 790.167,361 789.5,360C 799.849,359.832 810.183,359.332 820.5,358.5C 819.833,357.5 819.167,356.5 818.5,355.5C 823.5,354.833 828.5,354.167 833.5,353.5C 833.023,352.522 832.357,351.689 831.5,351C 840.827,350.5 850.161,350.334 859.5,350.5 Z"/></g>
<g><path style="opacity:1" fill="#8f39ee" d="M 163.5,350.5 C 261.001,350.167 358.335,350.501 455.5,351.5C 450.341,363.151 444.675,374.484 438.5,385.5C 341.999,385.833 245.665,385.499 149.5,384.5C 152.713,373.859 156.713,363.526 161.5,353.5C 161.932,352.29 162.599,351.29 163.5,350.5 Z"/></g>
<g><path style="opacity:1" fill="#8b34ec" d="M 149.5,384.5 C 245.665,385.499 341.999,385.833 438.5,385.5C 436.307,390.72 433.974,395.886 431.5,401C 408.863,404.756 386.197,408.256 363.5,411.5C 289.5,410.833 215.5,410.167 141.5,409.5C 143.393,400.825 146.059,392.492 149.5,384.5 Z"/></g>
<g><path style="opacity:1" fill="#8c35ec" d="M 870.5,376.5 C 875.138,387.079 878.804,398.079 881.5,409.5C 871.145,409.168 860.812,409.501 850.5,410.5C 851.248,412.332 852.248,413.999 853.5,415.5C 843.183,416.332 832.849,416.832 822.5,417C 833.358,418.147 844.358,418.98 855.5,419.5C 845.183,420.332 834.849,420.832 824.5,421C 825.357,421.689 826.023,422.522 826.5,423.5C 816.833,424.167 807.167,424.833 797.5,425.5C 797.709,426.086 798.043,426.586 798.5,427C 803.5,427.333 808.5,427.667 813.5,428C 808.833,428.333 804.167,428.667 799.5,429C 800.627,430.753 801.627,432.587 802.5,434.5C 801.167,435.833 799.833,435.833 798.5,434.5C 794.43,426.275 789.764,418.441 784.5,411C 742.998,410.169 701.665,410.335 660.5,411.5C 637.79,408.658 615.123,405.491 592.5,402C 588.105,394.042 584.105,385.875 580.5,377.5C 641.501,377.333 702.501,377.5 763.5,378C 768.582,386.025 774.249,393.525 780.5,400.5C 782.631,399.388 782.631,397.888 780.5,396C 785.167,395.667 789.833,395.333 794.5,395C 793.643,394.311 792.977,393.478 792.5,392.5C 797.5,391.833 802.5,391.167 807.5,390.5C 806.833,389.5 806.167,388.5 805.5,387.5C 815.817,386.668 826.151,386.168 836.5,386C 835.743,384.488 834.743,383.154 833.5,382C 838.833,381.667 844.167,381.333 849.5,381C 848.833,380 848.167,379 847.5,378C 855.344,377.829 863.011,377.329 870.5,376.5 Z"/></g>
<g><path style="opacity:1" fill="#872fea" d="M 141.5,409.5 C 215.5,410.167 289.5,410.833 363.5,411.5C 326.455,416.673 289.455,422.173 252.5,428C 256.704,432.036 260.704,436.202 264.5,440.5C 220.997,440.832 177.663,440.499 134.5,439.5C 135.915,429.179 138.249,419.179 141.5,409.5 Z"/></g>
<g><path style="opacity:1" fill="#8830ea" d="M 881.5,409.5 C 884.57,419.55 886.904,429.883 888.5,440.5C 886.801,440.34 885.134,440.506 883.5,441C 884.743,442.154 885.743,443.488 886.5,445C 881.167,445.333 875.833,445.667 870.5,446C 871.872,447.242 872.872,448.742 873.5,450.5C 868.533,451.329 863.533,451.829 858.5,452C 859.293,453.085 859.96,454.252 860.5,455.5C 850.183,456.332 839.849,456.832 829.5,457C 830.872,458.242 831.872,459.742 832.5,461.5C 828.167,462.167 823.833,462.833 819.5,463.5C 820.04,464.748 820.707,465.915 821.5,467C 818.773,467.818 816.106,467.652 813.5,466.5C 809.805,457.61 805.472,449.11 800.5,441C 786.504,440.5 772.504,440.333 758.5,440.5C 762.296,436.202 766.296,432.036 770.5,428C 733.806,422.639 697.139,417.139 660.5,411.5C 701.665,410.335 742.998,410.169 784.5,411C 789.764,418.441 794.43,426.275 798.5,434.5C 799.833,435.833 801.167,435.833 802.5,434.5C 801.627,432.587 800.627,430.753 799.5,429C 804.167,428.667 808.833,428.333 813.5,428C 808.5,427.667 803.5,427.333 798.5,427C 798.043,426.586 797.709,426.086 797.5,425.5C 807.167,424.833 816.833,424.167 826.5,423.5C 826.023,422.522 825.357,421.689 824.5,421C 834.849,420.832 845.183,420.332 855.5,419.5C 844.358,418.98 833.358,418.147 822.5,417C 832.849,416.832 843.183,416.332 853.5,415.5C 852.248,413.999 851.248,412.332 850.5,410.5C 860.812,409.501 871.145,409.168 881.5,409.5 Z"/></g>
<g><path style="opacity:1" fill="#8328e8" d="M 134.5,439.5 C 177.663,440.499 220.997,440.832 264.5,440.5C 275.86,451.527 287.193,462.527 298.5,473.5C 242.167,473.5 185.833,473.5 129.5,473.5C 130.162,461.889 131.829,450.556 134.5,439.5 Z"/></g>
<g><path style="opacity:1" fill="#8228e8" d="M 758.5,440.5 C 772.504,440.333 786.504,440.5 800.5,441C 805.472,449.11 809.805,457.61 813.5,466.5C 816.106,467.652 818.773,467.818 821.5,467C 820.707,465.915 820.04,464.748 819.5,463.5C 823.833,462.833 828.167,462.167 832.5,461.5C 831.872,459.742 830.872,458.242 829.5,457C 839.849,456.832 850.183,456.332 860.5,455.5C 859.96,454.252 859.293,453.085 858.5,452C 863.533,451.829 868.533,451.329 873.5,450.5C 872.872,448.742 871.872,447.242 870.5,446C 875.833,445.667 881.167,445.333 886.5,445C 885.743,443.488 884.743,442.154 883.5,441C 885.134,440.506 886.801,440.34 888.5,440.5C 891.55,452.608 893.217,464.941 893.5,477.5C 892.391,478.29 891.058,478.79 889.5,479C 890.872,480.242 891.872,481.742 892.5,483.5C 887.533,484.329 882.533,484.829 877.5,485C 878.5,486.667 879.5,488.333 880.5,490C 870.167,490.333 859.833,490.667 849.5,491C 850.5,492.667 851.5,494.333 852.5,496C 847.833,496.333 843.167,496.667 838.5,497C 842.659,501.511 841.325,503.344 834.5,502.5C 831.911,502.473 829.411,502.139 827,501.5C 823.905,492.814 820.405,484.314 816.5,476C 785.168,475.5 753.835,475.333 722.5,475.5C 734.473,463.861 746.473,452.194 758.5,440.5 Z"/></g>
<g><path style="opacity:0.967" fill="#6000cd" d="M 150.5,351.5 C 153.684,353.414 157.351,354.08 161.5,353.5C 156.713,363.526 152.713,373.859 149.5,384.5C 146.059,392.492 143.393,400.825 141.5,409.5C 138.249,419.179 135.915,429.179 134.5,439.5C 131.829,450.556 130.162,461.889 129.5,473.5C 127.987,486.116 127.32,498.782 127.5,511.5C 127.225,525.978 128.225,540.311 130.5,554.5C 131.184,565.251 132.517,575.917 134.5,586.5C 130.498,586.036 126.831,586.702 123.5,588.5C 109.33,512.205 116.163,437.872 144,365.5C 145.942,360.623 148.108,355.956 150.5,351.5 Z"/></g>
<g><path style="opacity:0.968" fill="#6000cd" d="M 872.5,351.5 C 905.029,424.884 914.362,501.217 900.5,580.5C 896.936,581.423 893.269,581.756 889.5,581.5C 892.521,561.606 894.521,541.606 895.5,521.5C 895.817,506.633 895.15,491.966 893.5,477.5C 893.217,464.941 891.55,452.608 888.5,440.5C 886.904,429.883 884.57,419.55 881.5,409.5C 878.804,398.079 875.138,387.079 870.5,376.5C 868.09,368.603 865.09,360.937 861.5,353.5C 865.649,354.08 869.316,353.414 872.5,351.5 Z"/></g>
<g><path style="opacity:1" fill="#7e22e6" d="M 129.5,473.5 C 185.833,473.5 242.167,473.5 298.5,473.5C 311.527,486.194 324.527,498.861 337.5,511.5C 267.5,511.5 197.5,511.5 127.5,511.5C 127.32,498.782 127.987,486.116 129.5,473.5 Z"/></g>
<g><path style="opacity:1" fill="#7e22e5" d="M 722.5,475.5 C 753.835,475.333 785.168,475.5 816.5,476C 820.405,484.314 823.905,492.814 827,501.5C 829.411,502.139 831.911,502.473 834.5,502.5C 841.325,503.344 842.659,501.511 838.5,497C 843.167,496.667 847.833,496.333 852.5,496C 851.5,494.333 850.5,492.667 849.5,491C 859.833,490.667 870.167,490.333 880.5,490C 879.5,488.333 878.5,486.667 877.5,485C 882.533,484.829 887.533,484.329 892.5,483.5C 891.872,481.742 890.872,480.242 889.5,479C 891.058,478.79 892.391,478.29 893.5,477.5C 895.15,491.966 895.817,506.633 895.5,521.5C 894.532,523.607 894.198,525.941 894.5,528.5C 892.076,528.192 889.743,528.526 887.5,529.5C 888.167,530.5 888.833,531.5 889.5,532.5C 884.5,533.167 879.5,533.833 874.5,534.5C 874.709,535.086 875.043,535.586 875.5,536C 870.833,536.333 866.167,536.667 861.5,537C 866.689,538.121 872.022,538.955 877.5,539.5C 867.833,540.167 858.167,540.833 848.5,541.5C 850.043,544.086 851.709,546.586 853.5,549C 849.179,549.499 844.846,549.666 840.5,549.5C 837.496,538.149 834.496,526.816 831.5,515.5C 781.5,515.5 731.5,515.5 681.5,515.5C 695.14,502.194 708.807,488.861 722.5,475.5 Z"/></g>
<g><path style="opacity:1" fill="#7a1be3" d="M 127.5,511.5 C 197.5,511.5 267.5,511.5 337.5,511.5C 351.827,525.66 366.327,539.66 381,553.5C 381.74,554.749 381.573,555.749 380.5,556.5C 297.507,554.503 214.173,553.836 130.5,554.5C 128.225,540.311 127.225,525.978 127.5,511.5 Z"/></g>
<g><path style="opacity:1" fill="#791be2" d="M 681.5,515.5 C 731.5,515.5 781.5,515.5 831.5,515.5C 834.496,526.816 837.496,538.149 840.5,549.5C 844.846,549.666 849.179,549.499 853.5,549C 851.709,546.586 850.043,544.086 848.5,541.5C 858.167,540.833 867.833,540.167 877.5,539.5C 872.022,538.955 866.689,538.121 861.5,537C 866.167,536.667 870.833,536.333 875.5,536C 875.043,535.586 874.709,535.086 874.5,534.5C 879.5,533.833 884.5,533.167 889.5,532.5C 888.833,531.5 888.167,530.5 887.5,529.5C 889.743,528.526 892.076,528.192 894.5,528.5C 894.198,525.941 894.532,523.607 895.5,521.5C 894.521,541.606 892.521,561.606 889.5,581.5C 888.393,585.142 887.393,588.809 886.5,592.5C 873.816,592.832 861.149,592.499 848.5,591.5C 846.274,579.147 843.941,566.813 841.5,554.5C 774.825,553.837 708.492,554.503 642.5,556.5C 641.427,555.749 641.26,554.749 642,553.5C 655.339,540.994 668.506,528.327 681.5,515.5 Z"/></g>
<g><path style="opacity:1" fill="#7414e0" d="M 130.5,554.5 C 214.173,553.836 297.507,554.503 380.5,556.5C 379.026,570.68 376.692,584.68 373.5,598.5C 294.833,598.5 216.167,598.5 137.5,598.5C 136.688,594.552 135.688,590.552 134.5,586.5C 132.517,575.917 131.184,565.251 130.5,554.5 Z"/></g>
<g><path style="opacity:1" fill="#7415df" d="M 886.5,592.5 C 879.597,626.622 867.931,658.955 851.5,689.5C 852.099,681.514 852.432,673.514 852.5,665.5C 853.102,643.007 851.769,620.674 848.5,598.5C 782.167,598.5 715.833,598.5 649.5,598.5C 646.308,584.68 643.974,570.68 642.5,556.5C 708.492,554.503 774.825,553.837 841.5,554.5C 843.941,566.813 846.274,579.147 848.5,591.5C 861.149,592.499 873.816,592.832 886.5,592.5 Z"/></g>
<g><path style="opacity:1" fill="#6f0edc" d="M 137.5,598.5 C 216.167,598.5 294.833,598.5 373.5,598.5C 370.02,621.718 366.02,644.718 361.5,667.5C 294.508,665.503 227.175,664.837 159.5,665.5C 150.164,643.824 142.83,621.491 137.5,598.5 Z"/></g>
<g><path style="opacity:1" fill="#6f0edc" d="M 649.5,598.5 C 715.833,598.5 782.167,598.5 848.5,598.5C 851.769,620.674 853.102,643.007 852.5,665.5C 788.491,664.837 724.825,665.504 661.5,667.5C 656.98,644.718 652.98,621.718 649.5,598.5 Z"/></g>
<g><path style="opacity:0.969" fill="#5a00c0" d="M 134.5,586.5 C 135.688,590.552 136.688,594.552 137.5,598.5C 142.83,621.491 150.164,643.824 159.5,665.5C 173.814,698.423 192.481,728.423 215.5,755.5C 226.153,768.485 237.487,780.819 249.5,792.5C 244.637,792.181 239.97,792.514 235.5,793.5C 177.143,737.155 139.81,668.821 123.5,588.5C 126.831,586.702 130.498,586.036 134.5,586.5 Z"/></g>
<g><path style="opacity:0.971" fill="#5a00c0" d="M 900.5,580.5 C 885.439,663.639 848.106,734.639 788.5,793.5C 783.695,792.513 778.695,792.179 773.5,792.5C 785.57,780.767 796.903,768.433 807.5,755.5C 824.905,735.409 839.572,713.409 851.5,689.5C 867.931,658.955 879.597,626.622 886.5,592.5C 887.393,588.809 888.393,585.142 889.5,581.5C 893.269,581.756 896.936,581.423 900.5,580.5 Z"/></g>
<g><path style="opacity:1" fill="#6907d6" d="M 661.5,667.5 C 724.825,665.504 788.491,664.837 852.5,665.5C 852.432,673.514 852.099,681.514 851.5,689.5C 839.572,713.409 824.905,735.409 807.5,755.5C 610.167,755.5 412.833,755.5 215.5,755.5C 192.481,728.423 173.814,698.423 159.5,665.5C 227.175,664.837 294.508,665.503 361.5,667.5C 358.332,688.343 354.999,709.176 351.5,730C 351.833,730.833 352.167,731.667 352.5,732.5C 405.5,704.5 458.5,676.5 511.5,648.5C 564.658,676.245 617.658,704.245 670.5,732.5C 670.833,731.667 671.167,730.833 671.5,730C 668.001,709.176 664.668,688.343 661.5,667.5 Z"/></g>
<g><path style="opacity:1" fill="#6503d2" d="M 215.5,755.5 C 412.833,755.5 610.167,755.5 807.5,755.5C 796.903,768.433 785.57,780.767 773.5,792.5C 745.16,818.852 713.494,840.518 678.5,857.5C 677.893,857.376 677.56,857.043 677.5,856.5C 682.671,851.159 686.004,844.825 687.5,837.5C 688.648,833.019 688.815,828.352 688,823.5C 686.688,818.884 684.855,814.551 682.5,810.5C 669.58,795.183 653.58,784.016 634.5,777C 628.5,775 622.5,773 616.5,771C 546.5,770.333 476.5,770.333 406.5,771C 385.378,776.727 366.378,786.394 349.5,800C 346.137,803.252 343.137,806.752 340.5,810.5C 338.145,814.551 336.312,818.884 335,823.5C 334.185,828.352 334.352,833.019 335.5,837.5C 336.996,844.825 340.329,851.159 345.5,856.5C 345.44,857.043 345.107,857.376 344.5,857.5C 309.796,840.106 278.13,818.439 249.5,792.5C 237.487,780.819 226.153,768.485 215.5,755.5 Z"/></g>
<g><path style="opacity:1" fill="#6709d1" d="M 682.5,810.5 C 568.5,810.5 454.5,810.5 340.5,810.5C 343.137,806.752 346.137,803.252 349.5,800C 366.378,786.394 385.378,776.727 406.5,771C 476.5,770.333 546.5,770.333 616.5,771C 622.5,773 628.5,775 634.5,777C 653.58,784.016 669.58,795.183 682.5,810.5 Z"/></g>
<g><path style="opacity:1" fill="#5b05bc" d="M 249.5,792.5 C 278.13,818.439 309.796,840.106 344.5,857.5C 345.107,857.376 345.44,857.043 345.5,856.5C 456.167,855.167 566.833,855.167 677.5,856.5C 677.56,857.043 677.893,857.376 678.5,857.5C 713.494,840.518 745.16,818.852 773.5,792.5C 778.695,792.179 783.695,792.513 788.5,793.5C 735.361,845.249 672.361,879.582 599.5,896.5C 619.323,891.277 638.323,883.777 656.5,874C 662.736,870.433 668.403,866.1 673.5,861C 673,860.833 672.5,860.667 672,860.5C 659.298,865.938 646.465,870.938 633.5,875.5C 552.167,875.5 470.833,875.5 389.5,875.5C 375.525,870.833 361.858,865.666 348.5,860C 363.482,872.998 380.482,882.664 399.5,889C 410.834,892.498 422.168,895.664 433.5,898.5C 356.558,883.372 290.558,848.372 235.5,793.5C 239.97,792.514 244.637,792.181 249.5,792.5 Z"/></g>
<g><path style="opacity:1" fill="#6209c4" d="M 687.5,837.5 C 686.004,844.825 682.671,851.159 677.5,856.5C 566.833,855.167 456.167,855.167 345.5,856.5C 340.329,851.159 336.996,844.825 335.5,837.5C 452.833,836.167 570.167,836.167 687.5,837.5 Z"/></g>
<g><path style="opacity:1" fill="#650acb" d="M 340.5,810.5 C 454.5,810.5 568.5,810.5 682.5,810.5C 684.855,814.551 686.688,818.884 688,823.5C 688.815,828.352 688.648,833.019 687.5,837.5C 570.167,836.167 452.833,836.167 335.5,837.5C 334.352,833.019 334.185,828.352 335,823.5C 336.312,818.884 338.145,814.551 340.5,810.5 Z"/></g>
<g><path style="opacity:1" fill="#4d03a0" d="M 389.5,875.5 C 470.821,902.166 552.155,902.166 633.5,875.5C 646.465,870.938 659.298,865.938 672,860.5C 672.5,860.667 673,860.833 673.5,861C 668.403,866.1 662.736,870.433 656.5,874C 638.323,883.777 619.323,891.277 599.5,896.5C 555.413,906.717 510.747,909.217 465.5,904C 454.57,902.901 443.903,901.068 433.5,898.5C 422.168,895.664 410.834,892.498 399.5,889C 380.482,882.664 363.482,872.998 348.5,860C 361.858,865.666 375.525,870.833 389.5,875.5 Z"/></g>
<g><path style="opacity:1" fill="#5805b5" d="M 389.5,875.5 C 470.833,875.5 552.167,875.5 633.5,875.5C 552.155,902.166 470.821,902.166 389.5,875.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

9
odoo_database_restore_manager/static/description/assets/icons/star-2.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/test-1 - Copy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/test-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/test-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
odoo_database_restore_manager/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
odoo_database_restore_manager/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
odoo_database_restore_manager/static/description/assets/icons/video.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
odoo_database_restore_manager/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
odoo_database_restore_manager/static/description/assets/misc/Cybrosys R.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

33
odoo_database_restore_manager/static/description/assets/misc/email.svg

@ -0,0 +1,33 @@
<svg width="80" height="81" viewBox="0 0 80 81" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="3116889_design_email_material_communication_mail_icon 1" clip-path="url(#clip0_81_366)">
<g id="layer1">
<path id="rect3851" d="M74.6067 0.730957H5.5424C2.75742 0.730957 0.499756 3.01685 0.499756 5.83664V75.7642C0.499756 78.584 2.75742 80.8699 5.5424 80.8699H74.6067C77.3916 80.8699 79.6493 78.584 79.6493 75.7642V5.83664C79.6493 3.01685 77.3916 0.730957 74.6067 0.730957Z" fill="#DB534B"/>
<g id="Clip path group">
<mask id="mask0_81_366" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="1" y="5" width="78" height="76">
<g id="clipPath4206">
<path id="rect4208" d="M73.6244 5.2915H6.62595C3.92428 5.2915 1.73413 7.4473 1.73413 10.1066V76.0546C1.73413 78.7139 3.92428 80.8697 6.62595 80.8697H73.6244C76.3261 80.8697 78.5162 78.7139 78.5162 76.0546V10.1066C78.5162 7.4473 76.3261 5.2915 73.6244 5.2915Z" fill="white"/>
</g>
</mask>
<g mask="url(#mask0_81_366)">
<g id="g4145" opacity="0.489612">
<g id="g4147">
<path id="path4149" d="M65.8115 41.5171C65.8115 54.9863 54.4292 65.9053 40.3884 65.9053L198.828 221.861C212.869 221.861 224.251 210.942 224.251 197.472L65.8115 41.5171Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4151" d="M40.3884 65.9051C33.2495 65.9051 26.7979 63.0825 22.1802 58.5371L180.62 214.492C185.237 219.038 191.689 221.86 198.828 221.86L40.3884 65.9051Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4153" d="M22.1802 58.5373C17.7157 54.1428 14.9653 48.1381 14.9653 41.5171L173.405 197.472C173.405 204.093 176.155 210.098 180.62 214.493L22.1802 58.5373Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4155" d="M14.9653 41.5171C14.9653 28.0479 26.3476 17.1289 40.3884 17.1289L198.828 173.084C184.787 173.084 173.405 184.003 173.405 197.472L14.9653 41.5171Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4157" d="M40.3884 17.1289C47.5273 17.1289 53.9789 19.9516 58.5966 24.4969L217.036 180.452C212.418 175.907 205.967 173.084 198.828 173.084L40.3884 17.1289Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4159" d="M58.5964 24.4971C63.0609 28.8916 65.8113 34.8963 65.8113 41.5173L224.251 197.473C224.251 190.852 221.5 184.847 217.036 180.452L58.5964 24.4971Z" fill="black" fill-opacity="0.0588235"/>
</g>
<path id="path4111" d="M65.8114 41.5171C65.8114 54.9863 54.4291 65.9053 40.3884 65.9053C26.3476 65.9053 14.9653 54.9863 14.9653 41.5171C14.9653 28.0479 26.3476 17.1289 40.3884 17.1289C54.4291 17.1289 65.8114 28.0479 65.8114 41.5171Z" fill="black" fill-opacity="0.0588235"/>
</g>
</g>
</g>
<path id="path3864" d="M17.506 17.5386H62.9018C64.4068 17.5386 65.8501 18.1439 66.9143 19.2214C67.9784 20.2988 68.5763 21.7602 68.5763 23.284V57.7564C68.5763 58.5109 68.4295 59.258 68.1443 59.9551C67.8592 60.6521 67.4412 61.2855 66.9143 61.819C66.3873 62.3525 65.7618 62.7757 65.0733 63.0645C64.3849 63.3532 63.647 63.5018 62.9018 63.5018H17.506C14.3567 63.5018 11.8315 60.9164 11.8315 57.7564V23.284C11.8315 20.0953 14.3567 17.5386 17.506 17.5386ZM40.2039 37.6475L62.9018 23.284H17.506L40.2039 37.6475ZM17.506 57.7564H62.9018V30.0923L40.2039 44.4271L17.506 30.0923V57.7564Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_81_366">
<rect width="80" height="81" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

3
odoo_database_restore_manager/static/description/assets/misc/phone.svg

@ -0,0 +1,3 @@
<svg width="36" height="44" viewBox="0 0 36 44" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M7.25 19.3903C10.13 26.0689 14.76 31.5322 20.43 34.9305L24.83 29.7268C25.38 29.0778 26.17 28.889 26.86 29.1486C29.1 30.0218 31.51 30.4938 34 30.4938C35.11 30.4938 36 31.544 36 32.8537V41.1135C36 42.4233 35.11 43.4734 34 43.4734C15.22 43.4734 0 25.5143 0 3.35456C0 2.0448 0.9 0.994629 2 0.994629H9C10.11 0.994629 11 2.0448 11 3.35456C11 6.29268 11.4 9.1364 12.14 11.7795C12.36 12.5937 12.2 13.5259 11.65 14.1749L7.25 19.3903Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

9
odoo_database_restore_manager/static/description/assets/misc/star (1) 2.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

9
odoo_database_restore_manager/static/description/assets/misc/support (1) 1.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 43 KiB

6
odoo_database_restore_manager/static/description/assets/misc/support-email.svg

@ -0,0 +1,6 @@
<svg width="49" height="37" viewBox="0 0 49 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M2.23798 3.59132C3.53363 4.39742 21.5313 15.9748 22.2027 16.3917C22.8741 16.8087 23.5573 17.0032 24.6173 17.0032C25.6774 17.0032 26.3606 16.8087 27.0319 16.3917C27.7033 15.9748 45.701 4.39742 46.9967 3.59132C47.4796 3.29945 48.2923 2.77131 48.469 2.17368C48.7753 1.11741 48.4455 0.714355 47.138 0.714355H24.6173H2.09664C0.789214 0.714355 0.459412 1.13131 0.765656 2.17368C0.942335 2.78521 1.75506 3.29945 2.23798 3.59132Z" fill="white"/>
<path id="Vector_2" d="M48.0214 4.21664C47.0555 4.80037 38.3865 12.0831 32.6503 16.4611L42.3323 29.3171C42.5679 29.5951 42.6739 29.9286 42.5443 30.0954C42.403 30.2483 42.0967 30.1649 41.8494 29.9008L30.2357 18.3374C28.4807 19.6716 27.2439 20.5889 27.0319 20.7279C26.1249 21.2699 25.4889 21.3394 24.6173 21.3394C23.7457 21.3394 23.1096 21.2699 22.2027 20.7279C21.9789 20.5889 20.7539 19.6716 18.9989 18.3374L7.38519 29.9008C7.14961 30.1788 6.83159 30.2622 6.69025 30.0954C6.54891 29.9425 6.65491 29.5951 6.89048 29.3171L16.5607 16.4611C10.8245 12.0831 2.06126 4.80037 1.09541 4.21664C0.0588929 3.59121 0 4.32783 0 4.89766C0 5.46749 0 33.3893 0 33.3893C0 34.6819 1.61367 36.2941 2.76797 36.2941H24.6173H46.4666C47.6209 36.2941 48.999 34.668 48.999 33.3893C48.999 33.3893 48.999 5.4536 48.999 4.89766C48.999 4.31393 49.0697 3.59121 48.0214 4.21664Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

17
odoo_database_restore_manager/static/description/assets/misc/tick-mark.svg

@ -0,0 +1,17 @@
<svg width="52" height="52" viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="52" height="52" fill="#F5F5F5"/>
<g clip-path="url(#clip0_0_1)">
<rect width="1440" height="7504" transform="translate(-107 -1660)" fill="white"/>
<rect x="-45" y="-203" width="1305" height="937" rx="19" fill="#FFF5FC"/>
<rect width="52" height="52" fill="url(#pattern0)"/>
</g>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_0_1" transform="scale(0.00387597)"/>
</pattern>
<clipPath id="clip0_0_1">
<rect width="1440" height="7504" fill="white" transform="translate(-107 -1660)"/>
</clipPath>
<image id="image0_0_1" width="258" height="258" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQIAAAECCAYAAAAVT9lQAAAACXBIWXMAAAsTAAALEwEAmpwYAAAJJ0lEQVR4nO3dYZXjNhQGUDEohEAohEAohEAYCIawEAxhIQRCIQTCQmhX202bTWcmcWzpSda953y/J9JYL5EsyykBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1/f49f37PXwXztVprgMXeUtkCkDNXaw2wyOF7zql8EXir1SBgmTw4v6XyReBUq0HA835L/8zVSxeAXGSOldoELPBHqvMrIP+N3yu1CXhS/hXwJZUvAIoANKrGbcFr8t/5rU6zgGfVWhBUBKBBtRYEFQFoVJ4KXJIiAMOqsUNQEYBG1Z4K/PXz7ykC0IjaU4GcuUrLgKecUt0CoAhAQ/JP8jwgFQEY1CHV2yCkCECDaj0rcJ8/azQOeGxK9QvAtQi4OwDBIm4NKgLQkJoPDCkC0KCo9QBFABpRe6uwIgANidofcM23pAhAqDwAo9YDrkXAyUIQKA/AqPUARQAacEqxRSBHEYBAkYuC15yKtxL40JwUARhWXhQ8p/gi4DVkEOSQYu8MXDOXbijwvug7A4oABIvcLnwbuwYhyCnFFwBFAALVet/go+RfI4fCbQXekefi0QXgWgRsGILKWrk9eM0fZZsL3It+cOg+p7LNBe5Fnib0XuayzQXutbJHQBGAIK0VAbcJobI8B2+pCDhhCCrLRSB64N8XAbcJoaLWikCO24RQ0ZTiB/19PFIMFc0pftDfZy7aYuAXLRYBLyeFilosApfkDgFU02IRcIcAKmnt4aHbuEMAFbT28NBtpoLtBn5quQh8Ldhu4KeWi4BnCKCClouAo8aggpaLQM6xXNOBrPUiYPswFNZ6EZjLNR3IWi8CFgehsNaLgMVBKKz1IpBj5yAU1EMRmIq1HuiiCNg5CAX1UAQuyeIgFNNDEfBYMRTUQxHIOZXqAKDd8wRuMxdrPdDkyUL3ceYgFNRDEbBpCArqoQjk2DQEhfRSBKZSHQCj+5LiB/gzOZfqABjdKcUP8GfibcVQSC9FIOdYqA9gaD0VgalQH8DQ8rdr9OB+NudCfQBDy/vy83w7eoA/E+sCUEBPRSDnWKYbYFz5m7WnIjCV6QYYVy9PEl5zLtMNMK7eioB1ASggf7tGD+4lOZbpBhjXnOIH9pJ8KdMNMK5enh+4xvkCsLFTih/YS+J8AdhYb0Ugx/kCsKG8YSh6UC/NXKQnaFb+h+d5oJ+AZfS2azDHy0oHk4vA9Z+fL9ZT7MfZnTyYLil+YC+N9xEM5LYI3Ca/osq3wXq9bRi65q1EZ9Cmj4rANflb7Bj26fYhF9ToQb003lM4kEdF4DZT0Gfs3ZI+biW2EA/klQvUQuIy+ad19KB+JccSnUF71nxLWUh8Tu6j6AH9SmwhHsSaInAbC4kf6/E2YY4txIPYqghcc0l+Rt47pD6LgFeXD2LrInCbqWI7WtbrbcIctwoHULIIXGMhsb9zBa5xq3AANYrANSMvJNbs563/Z9Z6di7q4hxtITEXv+gB/Wo8Vbhz0d9QlzTGQmJuY/RgfjVuFe5cdBG4zVS4rZF6vU2Yc0lj/WobTktF4Jo9LiT2fIcgx63CnWv14tzbQuI5xffpq5kK9AeNaf3n6h4WEucU34+vxu7BgZxS/AX3WS6p34XE1vv2sziAdEA9PAM/FWt9Gbl4RffZmtg9OKBejsbqZSExf8aWp1yPct6+S+hFLyfmtr6Q2PsdArsH6epwjFYXEucU3zdrYvcgP/SwXnDNJbW1kNhTIX0vHijiX72sF9xmKtITy+SCFN0Pa2JKwP/0eFFHLiTmv9vz4mDOcfNeYRemFH9xLk3EQmLvi4M5HijiU+cUf5G+kpoLiXOlNpXKJZkS8EC+QHr9yZsv8OP2XfKL3hcHc0r3ETuRL5Toi3VNpu275Ife+yXHlIBF8gUTfdGuydYLiT3/UrrtE1MCFut9QWzLhcTe+yLHGQO85JD6/xbMWbuQ2Puvo5xpRfvhx/bT6It4i1zSa4tke2i/MwbYxJziL+atMi1o9yHt4xeRKQGb2MMGmts8s5C4lzZPD9oJi/TyyPKzebSQODfwGdfGlIAi9rCZ5j7vLSTuYV0gx5SAYnp6ZPnZXNJ/C4mHtI91gend/x5sZA8baz4bPHtYFzAloIpjir/Y5eOYElDNlOIvePl/ps/+aVDCHn5G7ymmBIQ4pP2uF/QYUwLCnFL8ABBTAhowp/iBMHIuyePFNKDHU5D3lOPjfxHUsbctyL3EiUM0Z0rxA2OkXJIpAY06p/gBMkqOT/5PoLpDckuxRkwJaN5ent5rNV5VRjf2cM5fq/H2YrqxlxN+Wou3F9MdtxS3jSkB3drjqUZROS3se2jKOcUPot5zXtzr0JhDcktxTb6lbV/fBmHcUnw90wv9Dc2aU/yg6i0OG2F3PKW4PA4bYZfcUnw+04t9DF3IF3j0IGs9l2TPAAOw6/DzHF/vWujHIbml+FHmFf0K3Tml+EHXWmwjZkh7fJfimpzWdSf0ac/vUlya88q+hK4dU/wgjI5txJAcZDKt70Lo38gHmdhGDDdG3XV43KLzYE/yT+TogVkzTiOGD5xT/ACtEXsG4BOHNMYtRacRwwN7P+vwvF1Xwb7tedfhYcN+gl3b667DactOghHs7azDy7bdA+OYU/wA3irHjfsGhrGXsw7nrTsGRpO/SaMH8prYMwAb6fnBpLcC/QFD6nWK4KEi2FiPDyZ5NwEUMKX4wf1sPFQEBfVwdoEFQiishynCqVjrgX+1PEU4F2w3cKfVKcKhZKOBX7U4RZiKthh4V0tThEuyQAhhWpkiOHUIArUwRTgXbyXwUPQU4VC+icAzoqYIU43GAc+JmCJckgVCaE7tKYIFQmhUrSnCuVaDgOVqTREOtRoEvKb0FGGq1xRgjVJTBAuE0JFSU4RTzUYA6209RbBACB3a+tBTZxBCp45pmyLgDELo3Nr3IjiDEHZg7RTBAiHsxKtvV/aSEtiZr2l5ITiGfFKgmDxFyPP9Z4vAHPMxgdLyS0mfXSA8BH1GoIK8MehRIZjCPh1QxaPtx5e4jwbUlL/xPyoEDhyBQXy0t+Ac+aGA+t7bW+B5AhjQ7d4CzxPAoPItwm/J8wQwvLxw+Bb9IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4DV/A/Mf3+pWEmbtAAAAAElFTkSuQmCC"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

9
odoo_database_restore_manager/static/description/assets/misc/whatsapp 1.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

33
odoo_database_restore_manager/static/description/assets/misc/whatsapp.svg

@ -0,0 +1,33 @@
<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="3116884_whatsapp_square_chat_design_message_icon 1" clip-path="url(#clip0_81_382)">
<g id="layer1">
<path id="rect3851" d="M74.6066 0.72168H5.5424C2.75742 0.72168 0.499756 2.97935 0.499756 5.76433V74.8286C0.499756 77.6135 2.75742 79.8712 5.5424 79.8712H74.6066C77.3916 79.8712 79.6492 77.6135 79.6492 74.8286V5.76433C79.6492 2.97935 77.3916 0.72168 74.6066 0.72168Z" fill="#39BB59"/>
<g id="Clip path group">
<mask id="mask0_81_382" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="6" y="9" width="75" height="72">
<g id="clipPath4206">
<path id="rect4208" d="M75.7716 9.01709H11.1629C8.55758 9.01709 6.44556 11.0471 6.44556 13.5512V75.6502C6.44556 78.1543 8.55758 80.1843 11.1629 80.1843H75.7716C78.3769 80.1843 80.4889 78.1543 80.4889 75.6502V13.5512C80.4889 11.0471 78.3769 9.01709 75.7716 9.01709Z" fill="white"/>
</g>
</mask>
<g mask="url(#mask0_81_382)">
<g id="g4145" opacity="0.489612">
<g id="g4147">
<path id="path4149" d="M68.2374 43.1284C68.2374 55.8115 57.2611 66.0932 43.7212 66.0932L196.51 212.946C210.049 212.946 221.026 202.665 221.026 189.982L68.2374 43.1284Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4151" d="M43.7211 66.0932C36.8369 66.0932 30.6154 63.4353 26.1624 59.1553L178.951 206.008C183.404 210.289 189.625 212.946 196.51 212.946L43.7211 66.0932Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4153" d="M26.1623 59.1553C21.8571 55.0173 19.2048 49.363 19.2048 43.1284L171.993 189.982C171.993 196.216 174.645 201.87 178.951 206.008L26.1623 59.1553Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4155" d="M19.2048 43.1284C19.2048 30.4453 30.1811 20.1636 43.7211 20.1636L196.509 167.017C182.969 167.017 171.993 177.299 171.993 189.982L19.2048 43.1284Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4157" d="M43.7212 20.1636C50.6054 20.1636 56.8269 22.8215 61.2799 27.1015L214.068 173.955C209.615 169.675 203.394 167.017 196.51 167.017L43.7212 20.1636Z" fill="black" fill-opacity="0.0588235"/>
<path id="path4159" d="M61.2798 27.1016C65.585 31.2396 68.2373 36.8939 68.2373 43.1284L221.026 189.982C221.026 183.747 218.373 178.093 214.068 173.955L61.2798 27.1016Z" fill="black" fill-opacity="0.0588235"/>
</g>
<path id="path4111" d="M68.2373 43.1284C68.2373 55.8115 57.261 66.0932 43.7211 66.0932C30.1811 66.0932 19.2048 55.8115 19.2048 43.1284C19.2048 30.4453 30.1811 20.1636 43.7211 20.1636C57.261 20.1636 68.2373 30.4453 68.2373 43.1284Z" fill="black" fill-opacity="0.0588235"/>
</g>
</g>
</g>
<path id="path4074" d="M51.3896 43.6875C51.9673 43.9879 52.337 44.1497 52.4526 44.3808C52.5912 44.635 52.545 45.7904 51.9673 47.1076C51.5051 48.4017 49.1018 49.6496 48.0388 49.6958C46.9758 49.7421 46.9527 50.5277 41.1985 48.0089C35.4444 45.49 31.9781 39.3431 31.7008 38.9502C31.4235 38.5574 29.4823 35.7612 29.5748 32.9188C29.6903 30.0995 31.1693 28.7592 31.7701 28.2046C32.3247 27.6037 32.9487 27.5344 33.3415 27.6037H34.4276C34.7743 27.6037 35.2596 27.4651 35.6986 28.6437L37.2931 32.965C37.4318 33.2654 37.5242 33.6121 37.3163 33.9818L36.6923 34.9293L35.7911 35.8998C35.5138 36.1771 35.1902 36.4776 35.5138 37.0553C35.7911 37.6561 36.9465 39.5741 38.5641 41.1687C40.667 43.2022 42.5158 43.8724 43.0704 44.1728C43.625 44.4963 43.9716 44.4501 44.3182 44.0804L46.1901 41.9081C46.6291 41.3304 46.9989 41.4691 47.5304 41.6539L51.3896 43.6875ZM40.4128 16.0493C46.5417 16.0493 52.4195 18.484 56.7533 22.8178C61.0871 27.1515 63.5217 33.0293 63.5217 39.1582C63.5217 45.287 61.0871 51.1649 56.7533 55.4986C52.4195 59.8324 46.5417 62.2671 40.4128 62.2671C35.8604 62.2671 31.6315 60.9498 28.0496 58.6852L17.304 62.2671L20.8858 51.5214C18.6212 47.9396 17.304 43.7106 17.304 39.1582C17.304 33.0293 19.7386 27.1515 24.0724 22.8178C28.4061 18.484 34.284 16.0493 40.4128 16.0493ZM40.4128 20.6711C35.5098 20.6711 30.8075 22.6188 27.3405 26.0858C23.8735 29.5528 21.9257 34.2551 21.9257 39.1582C21.9257 43.1329 23.1736 46.8072 25.2996 49.8114L23.0812 56.4898L29.7596 54.2714C32.7638 56.3974 36.4381 57.6453 40.4128 57.6453C45.3159 57.6453 50.0182 55.6975 53.4852 52.2305C56.9522 48.7635 58.9 44.0613 58.9 39.1582C58.9 34.2551 56.9522 29.5528 53.4852 26.0858C50.0182 22.6188 45.3159 20.6711 40.4128 20.6711Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_81_382">
<rect width="80" height="80" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/1.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
odoo_database_restore_manager/static/description/assets/modules/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

BIN
odoo_database_restore_manager/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
odoo_database_restore_manager/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
odoo_database_restore_manager/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

1192
odoo_database_restore_manager/static/description/index.html

File diff suppressed because it is too large

BIN
odoo_database_restore_manager/static/src/img/odoo_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
odoo_database_restore_manager/static/src/img/restore.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

79
odoo_database_restore_manager/static/src/js/restore.js

@ -0,0 +1,79 @@
/* @odoo-module */
import { useService } from "@web/core/utils/hooks";
import { Component, onWillStart, useState } from "@odoo/owl";
import {registry} from '@web/core/registry';
export class DbRestoreDashboard extends Component {
setup() {
super.setup(...arguments);
this.dbDashboard = useState({ data: [] })
this.orm = useService("orm");
this.action = useService("action");
onWillStart(async () => {
await this.loadDashboardData();
});
}
async loadDashboardData() {
const database_file = await this.orm.call(
'database.manager',
'action_import_files',
[]
);
if (database_file[0] == 'error'){
this.action.doAction({
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': 'Failed to Load Files from ' + database_file[2] + ' [ ' + database_file[1] + ' ]',
'type': 'warning',
'sticky': false,
}
});
}
else {
this.dbDashboard.data = Object.entries(database_file[0]).map(([file_name, values]) => {
return {
'file_name': file_name,
'values': values
};
});
}
}
// Function for restore the database
_onClick_restore(ev) {
this.action.doAction({
name: "Restore Database",
type: 'ir.actions.act_window',
res_model: 'database.restore',
view_mode: 'form',
view_type: 'form',
views: [[false, 'form']],
context: {
default_db_file: ev.target.value,
default_backup_location: ev.target.dataset.location
},
target: 'new',
});
}
isValidBackupName(name) {
return ['Dropbox', 'OneDrive', 'Google Drive' , 'Nextcloud', 'AmazonS3'].includes(name)
}
// Filter for location
_onchange_location(ev) {
var e = ev.target.value
var self = this;
$('.table_row').show();
$('.table_row').each(function(index, element) {
if (e == 'all_backups') {
$('.table_row').show();
}
else if ($(element)[0].children[2].innerHTML != e){
$(element).hide();
}
});
};
}
registry.category("actions").add("database_manager_dashboard", DbRestoreDashboard);
DbRestoreDashboard.components = { DbRestoreDashboard };
DbRestoreDashboard.template = 'database_manager_dashboard.DbRestoreDashboard';

65
odoo_database_restore_manager/static/src/scss/db_restore.scss

@ -0,0 +1,65 @@
#db_location {
outline: none;
border: none;
font-size: 15px;
box-shadow: none;
background-color: #fff;
padding: 4px 24px;
height: 40px;
}
.db_restore_content {
height: 100%;
width: 100%;
}
#db_restore {
color: #ffffff;
width: 100px;
background-color: #b1b1b1;
height: 30px;
border: none;
text-transform: capitalize;
margin-right: 10px;
text-align: center;
}
#db_restore:hover {
background-color: #000;
color: #fff;
}
.backup_download {
color: #ffffff;
width: 30px;
background-color: #b1b1b1;
height: 30px;
border: none;
text-transform: capitalize;
}
.backup_download:hover {
background-color: #000;
color: #fff;
}
.table-head {
background-color: #2e2e2e;
color: #fff;
border: 1px solid #eaeaea;
}
.table-data {
text-align: center;
}
.file_row {
--table-bg: #ffffff;
color: #000;
border: 1px solid #eaeaea;
}
.scrollable-table {
height: 75vh;
overflow-y: auto;
}
.company_image {
max-width: 200px;
max-height: 100px;
margin: 20px;
}
.option {
background-color: black;
color: white;
}

84
odoo_database_restore_manager/static/src/xml/db_restore_dashboard_templates.xml

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Dashboard template -->
<template id="db_restore">
<t t-name="database_manager_dashboard.DbRestoreDashboard">
<div class="container">
<section class="dashboard_main_section db_restore_section"
id="main_section_manager">
<center>
<div class="company_image"/>
</center>
<!-- Selection for filtering on basis of storage types -->
<div class="filter_location"
style="float:right; margin-right: 15px; margin-bottom: 10px;">
<select id="db_location"
t-on-change="_onchange_location"
class="form-select db_location">
<option class="option" value="all_backups">All
Backups
</option>
<option class="option" value="OneDrive">OneDrive
</option>
<option class="option" value="Dropbox">Dropbox</option>
<option class="option" value="AmazonS3">Amazon</option>
<option class="option" value="Google Drive">Google
Drive
</option>
<option class="option" value="Local Storage">Local
Storage
</option>
<option class="option" value="FTP Storage">FTP
Storage
</option>
<option class="option" value="SFTP Storage">SFTP
Storage
</option>
<option class="option" value="Nextcloud">Nextcloud
</option>
</select>
</div>
<br/>
<!-- Table to show all Backup Files -->
<div class="db_restore_content scrollable-table"
style="margin-top: 46px">
<table class="table" id="db_restore_table">
<thead class="table-head">
<tr style="text-align:center;">
<th style="text-align:center;" scope="col">SL
NO:
</th>
<th scope="col">Backup Files</th>
<th scope="col">Backup Location</th>
<th scope="col">Time (UTC)</th>
<th scope="col" style="width:190px"/>
</tr>
</thead>
<tbody class="db_restore_files">
<tr class="table_row" t-foreach="dbDashboard.data" t-as="data" t-key="data_index">
<td class="table-data" t-out="data_index + 1"/>
<td class="table-data" t-out="data.file_name"/>
<td class="table-data" t-out="data.values[1]"/>
<td class="table-data" t-out="data.values[2]"/>
<td>
<button type="button" id="db_restore"
t-att-data-location="data.values[1]"
t-on-click="_onClick_restore"
t-att-value="data.values[0]"
class="btn btn-primary">
<i class="fa fa-floppy-o fa-fw"/>
Restore
</button>
<a t-if="isValidBackupName(data.values[1])" t-att-href="data.values[0]">
<button type="button" class="backup_download btn btn-primary">
<i class="fa fa-download o_pivot_download"/>
</button>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</section>
</div>
</t>
</template>

13
odoo_database_restore_manager/views/database_manager_views.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Database manager views -->
<record id="database_manager_action" model="ir.actions.client">
<field name="name">Database Restore Manager</field>
<field name="tag">database_manager_dashboard</field>
<field name="target">current</field>
</record>
<menuitem id="menu_db_restore_view"
parent="auto_database_backup.db_backup_menu_root"
name="Restore Manager"
action="database_manager_action"/>
</odoo>

23
odoo_database_restore_manager/views/res_config_settings_views.xml

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Set backup count view on settings -->
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.odoo.database.restore.manager</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//block[@id='user_default_rights']" position="inside">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label string="Backup Count" for="backup_count"/>
<div class="text-muted">
Configure the number of backups to restore
</div>
<field name="backup_count"/>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

22
odoo_database_restore_manager/wizard/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import database_restore

115
odoo_database_restore_manager/wizard/database_restore.py

@ -0,0 +1,115 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
import ftplib
import gdown
import os
import paramiko
import requests
import tempfile
import odoo
import odoo.modules.registry
from odoo import fields, models
from odoo.exceptions import UserError
from odoo.http import dispatch_rpc
from odoo.service import db
from odoo.tools.misc import str2bool
class DataBaseRestore(models.TransientModel):
""" Database Restore Model """
_name = "database.restore"
_description = "Database Restore"
db_file = fields.Char(string="File", help="Restore database file")
db_name = fields.Char(string="Database Name", help="Name of the database")
db_master_pwd = fields.Char(string="Database Master Password",
help="Master Password to restore database")
backup_location = fields.Char(string="Backup Location",
help="Database backup location")
def action_restore_database(self, copy=False):
""" Function to restore the database Backup """
# Check if the admin password is insecure and update it if provided
insecure = odoo.tools.config.verify_admin_password('admin')
if insecure and self.db_master_pwd:
dispatch_rpc('db', 'change_admin_password',
["admin", self.db_master_pwd])
try:
# Check if the admin password is correct and proceed with the
# restore process
db.check_super(self.db_master_pwd)
# Create a temporary file to store the downloaded backup data
temp_file = tempfile.NamedTemporaryFile(delete=False)
if self.backup_location == 'Google Drive':
# Retrieve backup from Google Drive using gdown library
gdown.download(self.db_file, temp_file.name, quiet=False)
elif self.backup_location in ['Dropbox', 'OneDrive', 'Nextcloud', 'AmazonS3']:
# Retrieve backup from Dropbox or OneDrive using requests
# library
response = requests.get(self.db_file, stream=True)
temp_file.write(response.content)
elif self.backup_location == 'FTP Storage':
# Retrieve backup from FTP Storage using ftplib
for rec in self.env['db.backup.configure'].search([]):
if rec.backup_destination == 'ftp' and rec.ftp_path == \
os.path.dirname(self.db_file):
ftp_server = ftplib.FTP()
ftp_server.connect(rec.ftp_host, int(rec.ftp_port))
ftp_server.login(rec.ftp_user, rec.ftp_password)
ftp_server.retrbinary("RETR " + self.db_file,
temp_file.write)
temp_file.seek(0)
ftp_server.quit()
elif self.backup_location == 'SFTP Storage':
# Retrieve backup from SFTP Storage using paramiko
for rec in self.env['db.backup.configure'].search([]):
if rec.backup_destination == 'sftp' and rec.sftp_path == \
os.path.dirname(self.db_file):
sftp_client = paramiko.SSHClient()
sftp_client.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
sftp_client.connect(hostname=rec.sftp_host,
username=rec.sftp_user,
password=rec.sftp_password,
port=rec.sftp_port)
sftp_server = sftp_client.open_sftp()
sftp_server.getfo(self.db_file, temp_file)
sftp_server.close()
sftp_client.close()
elif self.backup_location == 'Local Storage':
# If the backup is stored in the local storage, set the temp
# file's name accordingly
temp_file.name = self.db_file
# Restore the database using Odoo's 'restore_db' method
db.restore_db(self.db_name, temp_file.name, str2bool(copy))
temp_file.close()
# Redirect the user to the Database Manager after successful
# restore
return {
'type': 'ir.actions.act_url',
'url': '/web/database/manager'
}
except Exception as e:
# Raise a UserError if any error occurs during the database
# restore process
raise UserError(
"Database restore error: %s" % (str(e) or repr(e)))

24
odoo_database_restore_manager/wizard/database_restore_views.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Restore database wizard view -->
<record id="database_restore_view_form" model="ir.ui.view">
<field name="name">database.restore.view.form</field>
<field name="model">database.restore</field>
<field name="arch" type="xml">
<form string="database restore wizard">
<group class="oe_title">
<field name="db_name"/>
<field name="db_master_pwd" password="True"/>
</group>
<footer>
<button string="Restore" name="action_restore_database"
type="object"
class="oe_highlight" data-hotkey="q"
help="Confirm Upload"/>
<button string="Cancel" class="btn btn-secondary"
special="cancel" help="Cancel Upload"/>
</footer>
</form>
</field>
</record>
</odoo>
Loading…
Cancel
Save