diff --git a/nw/config.py b/nw/config.py index 50941257..4cefc76a 100644 --- a/nw/config.py +++ b/nw/config.py @@ -89,6 +89,12 @@ class Config: self.spellLanguage = "en_GB" + # Backup + self.backupPath = None + self.backupOnClose = True + self.minBackupTime = 0 + self.askBeforeBackup = True + # Path self.recentList = [""]*10 @@ -184,6 +190,10 @@ class Config: self.fmtDoubleQuotes = self._parseLine(cnfParse, cnfSec, "fmtdoublequote", self.CNF_LIST, self.fmtDoubleQuotes) self.spellLanguage = self._parseLine(cnfParse, cnfSec, "spellcheck", self.CNF_STR, self.spellLanguage) + ## Backup + cnfSec = "Backup" + self.backupPath = self._parseLine(cnfParse, cnfSec, "backuppath", self.CNF_STR, self.backupPath) + ## Path cnfSec = "Path" for i in range(10): @@ -240,6 +250,11 @@ class Config: cnfParse.set(cnfSec,"fmtdoublequote",self._packList(self.fmtDoubleQuotes)) cnfParse.set(cnfSec,"spellcheck", str(self.spellLanguage)) + ## Backup + cnfSec = "Backup" + cnfParse.add_section(cnfSec) + cnfParse.set(cnfSec,"backuppath", str(self.backupPath)) + ## Path cnfSec = "Path" cnfParse.add_section(cnfSec) diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 374668a6..178b89db 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -36,6 +36,7 @@ from nw.project.project import NWProject from nw.project.document import NWDoc from nw.project.item import NWItem from nw.project.index import NWIndex +from nw.project.backup import NWBackup from nw.tools.wordcount import countWords from nw.theme import Theme from nw.enum import nwItemType, nwAlert @@ -209,6 +210,8 @@ class GuiMain(QMainWindow): self.closeDocument() if self.theProject.projChanged: saveOK = self.saveProject() + theBackup = NWBackup(self.theProject) + theBackup.zipIt() else: saveOK = True @@ -217,7 +220,7 @@ class GuiMain(QMainWindow): self.theIndex.clearIndex() self.clearGUI() self.hasProject = False - + return saveOK def openProject(self, projFile=None): diff --git a/nw/project/backup.py b/nw/project/backup.py new file mode 100644 index 00000000..b381d764 --- /dev/null +++ b/nw/project/backup.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +"""novelWriter Project Backup + + novelWriter – Project Backup +============================== + Class handling project backups + + File History: + Created: 2019-06-16 [0.1.5] + +""" + +import logging +import nw + +from os import path, mkdir, listdir +from shutil import make_archive +from datetime import datetime + +from nw.enum import nwAlert + +logger = logging.getLogger(__name__) + +class NWBackup(): + + def __init__(self, theParent, theProject): + + self.mainConf = nw.CONFIG + self.theParent = theParent + self.theProject = theProject + + return + + def zipIt(self): + + if self.mainConf.backupPath is None: + self.theParent.makeAlert("Cannot backup project because no backup path is set.",nwAlert.WARN) + return False + + if self.theProject.projName is None: + self.theParent.makeAlert("Cannot backup project because no project name is set.",nwAlert.WARN) + return False + + logger.info("Backing up project") + + archName = "" + for c in self.theProject.projName: + if c.isalnum(): + archName += c + + archName = archName+"_"+datetime.now().strftime("%Y%m%d-%H%M%S") + baseName = path.join(self.mainConf.backupPath, archName) + + try: + make_archive( + baseName, "zip", + root_dir = self.theProject.projPath, + base_dir = "." + ) + except Exception as e: + self.theParent.makeAlert(["Could not write backup archive.",str(e)],nwAlert.ERROR) + return False + + return True + +# END Class NWBackup