diff --git a/auto_backup/i18n/auto_backup.pot b/auto_backup/i18n/auto_backup.pot
index 6d8eaf24b..8bf4c3f95 100644
--- a/auto_backup/i18n/auto_backup.pot
+++ b/auto_backup/i18n/auto_backup.pot
@@ -39,6 +39,11 @@ msgstr ""
msgid "Backup Failed"
msgstr ""
+#. module: auto_backup
+#: model:ir.model.fields,field_description:auto_backup.field_db_backup_backup_format
+msgid "Backup Format"
+msgstr ""
+
#. module: auto_backup
#: model:ir.actions.server,name:auto_backup.ir_cron_backup_scheduler_0_ir_actions_server
#: model:ir.cron,cron_name:auto_backup.ir_cron_backup_scheduler_0
@@ -66,25 +71,30 @@ msgstr ""
msgid "Cannot duplicate a configuration."
msgstr ""
+#. module: auto_backup
+#: model:ir.model.fields,help:auto_backup.field_db_backup_backup_format
+msgid "Choose the format for this backup."
+msgstr ""
+
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_method
msgid "Choose the storage method for this backup."
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:249
+#: code:addons/auto_backup/models/db_backup.py:265
#, python-format
msgid "Cleanup of old database backups failed."
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:128
+#: code:addons/auto_backup/models/db_backup.py:137
#, python-format
msgid "Connection Test Failed!"
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:123
+#: code:addons/auto_backup/models/db_backup.py:132
#, python-format
msgid "Connection Test Succeeded!"
msgstr ""
@@ -105,14 +115,14 @@ msgid "Database Backup"
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:203
+#: code:addons/auto_backup/models/db_backup.py:219
#: model:mail.message.subtype,description:auto_backup.mail_message_subtype_failure
#, python-format
msgid "Database backup failed."
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:211
+#: code:addons/auto_backup/models/db_backup.py:227
#: model:mail.message.subtype,description:auto_backup.mail_message_subtype_success
#, python-format
msgid "Database backup succeeded."
@@ -129,7 +139,7 @@ msgid "Display Name"
msgstr ""
#. module: auto_backup
-#: code:addons/auto_backup/models/db_backup.py:114
+#: code:addons/auto_backup/models/db_backup.py:123
#, python-format
msgid "Do not save backups on your filestore, or you will backup your backups too!"
msgstr ""
@@ -294,8 +304,18 @@ msgstr ""
msgid "john"
msgstr ""
+#. module: auto_backup
+#: selection:db.backup,backup_format:0
+msgid "pg_dump custom format (without filestore)"
+msgstr ""
+
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_conf_form
msgid "sftp.example.com"
msgstr ""
+#. module: auto_backup
+#: selection:db.backup,backup_format:0
+msgid "zip (includes filestore)"
+msgstr ""
+
diff --git a/auto_backup/models/db_backup.py b/auto_backup/models/db_backup.py
index 1b10507ca..3c1557424 100644
--- a/auto_backup/models/db_backup.py
+++ b/auto_backup/models/db_backup.py
@@ -83,6 +83,15 @@ class DbBackup(models.Model):
"read permissions for that file.",
)
+ backup_format = fields.Selection(
+ [
+ ("zip", "zip (includes filestore)"),
+ ("dump", "pg_dump custom format (without filestore)")
+ ],
+ default='zip',
+ help="Choose the format for this backup."
+ )
+
@api.model
def _default_folder(self):
"""Default to ``backups`` folder inside current server datadir."""
@@ -131,11 +140,11 @@ class DbBackup(models.Model):
def action_backup(self):
"""Run selected backups."""
backup = None
- filename = self.filename(datetime.now())
successful = self.browse()
# Start with local storage
for rec in self.filtered(lambda r: r.method == "local"):
+ filename = self.filename(datetime.now(), ext=rec.backup_format)
with rec.backup_log():
# Directory must exist
try:
@@ -151,21 +160,28 @@ class DbBackup(models.Model):
shutil.copyfileobj(cached, destiny)
# Generate new backup
else:
- db.dump_db(self.env.cr.dbname, destiny)
+ db.dump_db(
+ self.env.cr.dbname,
+ destiny,
+ backup_format=rec.backup_format
+ )
backup = backup or destiny.name
successful |= rec
# Ensure a local backup exists if we are going to write it remotely
sftp = self.filtered(lambda r: r.method == "sftp")
if sftp:
- if backup:
- cached = open(backup)
- else:
- cached = db.dump_db(self.env.cr.dbname, None)
+ for rec in sftp:
+ filename = self.filename(datetime.now(), ext=rec.backup_format)
+ with rec.backup_log():
- with cached:
- for rec in sftp:
- with rec.backup_log():
+ cached = db.dump_db(
+ self.env.cr.dbname,
+ None,
+ backup_format=rec.backup_format
+ )
+
+ with cached:
with rec.sftp_connection() as remote:
# Directory must exist
try:
@@ -255,13 +271,16 @@ class DbBackup(models.Model):
self.name)
@staticmethod
- def filename(when):
+ def filename(when, ext='zip'):
"""Generate a file name for a backup.
:param datetime.datetime when:
Use this datetime instead of :meth:`datetime.datetime.now`.
+ :param str ext: Extension of the file. Default: dump.zip
"""
- return "{:%Y_%m_%d_%H_%M_%S}.dump.zip".format(when)
+ return "{:%Y_%m_%d_%H_%M_%S}.{ext}".format(
+ when, ext='dump.zip' if ext == 'zip' else ext
+ )
@api.multi
def sftp_connection(self):
diff --git a/auto_backup/tests/test_db_backup.py b/auto_backup/tests/test_db_backup.py
index ef2972f3f..fdeda3886 100644
--- a/auto_backup/tests/test_db_backup.py
+++ b/auto_backup/tests/test_db_backup.py
@@ -175,18 +175,6 @@ class TestDbBackup(common.TransactionCase):
'wb'
)
- def test_action_backup_sftp_remote_open(self):
- """ It should open remote file w/ proper args """
- rec_id = self.new_record()
- with self.mock_assets() as assets:
- with self.patch_filtered_sftp(rec_id):
- conn = rec_id.sftp_connection().__enter__()
- rec_id.action_backup()
- conn.open.assert_called_once_with(
- assets['os'].path.join(),
- 'wb'
- )
-
def test_action_backup_all_search(self):
""" It should search all records """
rec_id = self.new_record()
@@ -241,8 +229,20 @@ class TestDbBackup(common.TransactionCase):
pysftp.Connection(), res,
)
- def test_filename(self):
+ def test_filename_default(self):
""" It should not error and should return a .dump.zip file str """
now = datetime.now()
res = self.Model.filename(now)
self.assertTrue(res.endswith(".dump.zip"))
+
+ def test_filename_zip(self):
+ """ It should return a dump.zip filename"""
+ now = datetime.now()
+ res = self.Model.filename(now, ext='zip')
+ self.assertTrue(res.endswith(".dump.zip"))
+
+ def test_filename_dump(self):
+ """ It should return a dump filename"""
+ now = datetime.now()
+ res = self.Model.filename(now, ext='dump')
+ self.assertTrue(res.endswith(".dump"))
diff --git a/auto_backup/view/db_backup_view.xml b/auto_backup/view/db_backup_view.xml
index 42f826feb..ebed80c91 100644
--- a/auto_backup/view/db_backup_view.xml
+++ b/auto_backup/view/db_backup_view.xml
@@ -15,6 +15,7 @@