diff -r 59d1c0f80286 -r c4110b8b5931 eric6/Project/ProjectFile.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Project/ProjectFile.py Mon Jan 25 20:07:51 2021 +0100 @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a class representing the project JSON file. +""" + +import json +import os +import time +import typing + +from PyQt5.QtCore import QObject + +from E5Gui import E5MessageBox +from E5Gui.E5OverrideCursor import E5OverridenCursor + +import Preferences + +Project = typing.Type["Project"] + + +class ProjectFile(QObject): + """ + Class representing the project JSON file. + """ + def __init__(self, project: Project, parent: QObject = None): + """ + Constructor + + @param project reference to the project object + @type Project + @param parent reference to the parent object + @type QObject (optional) + """ + super(ProjectFile, self).__init__(parent) + self.__project = project + + def writeFile(self, filename: str) -> bool: + """ + Public method to write the project data to a project JSON file. + + @param filename name of the project file + @type str + @return flag indicating a successful write + @rtype bool + """ + name = os.path.splitext(os.path.basename(filename))[0] + + projectDict = {} + projectDict["header"] = { + "comment": f"eric project file for project {name}", + "copyright": "Copyright (C) {0} {1}, {2}".format( + time.strftime('%Y'), + self.__project.pdata["AUTHOR"], + self.__project.pdata["EMAIL"]) + } + + # TODO: replace 'XMLTimestamp' by 'Timestamp' + if Preferences.getProject("XMLTimestamp"): + projectDict["header"]["saved"] = ( + time.strftime('%Y-%m-%d, %H:%M:%S') + ) + + projectDict["project"] = self.__project.pdata + + try: + jsonString = json.dumps(projectDict, indent=2) + with open(filename, "w") as f: + f.write(jsonString) + except (TypeError, EnvironmentError) as err: + with E5OverridenCursor(): + E5MessageBox.critical( + None, + self.tr("Save Project File"), + self.tr( + "<p>The project file <b>{0}</b> could not be " + "written.</p><p>Reason: {1}</p>" + ).format(filename, str(err)) + ) + return False + + return True + + def readFile(self, filename: str) -> bool: + """ + Public method to read the project data from a project JSON file. + + @param filename name of the project file + @type str + @return flag indicating a successful read + @rtype bool + """ + try: + with open(filename, "r") as f: + jsonString = f.read() + projectDict = json.loads(jsonString) + except (EnvironmentError, json.JSONDecodeError) as err: + E5MessageBox.critical( + None, + self.tr("Read Project File"), + self.tr( + "<p>The project file <b>{0}</b> could not be " + "read.</p><p>Reason: {1}</p>" + ).format(filename, str(err)) + ) + return False + + self.__project.pdata = projectDict["project"] + + return True