Skip to content

Commit

Permalink
[Fix] Catch project errors and report to project screen
Browse files Browse the repository at this point in the history
  • Loading branch information
NathanW2 committed Jun 9, 2017
1 parent ae4d8b5 commit e83370a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 8 deletions.
19 changes: 14 additions & 5 deletions src/roam/listmodulesdialog.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from PyQt4.QtNetwork import QNetworkRequest, QNetworkAccessManager
from PyQt4.QtCore import pyqtSignal, QSize, QUrl, Qt
from PyQt4.QtGui import QListWidgetItem, QPixmap, QWidget
from PyQt4.QtGui import QListWidgetItem, QPixmap, QWidget, QBrush, QColor

from functools import partial
from roam.flickwidget import FlickCharm
Expand Down Expand Up @@ -44,6 +44,10 @@ def refresh(self):

self.namelabel.setText(name)
self.descriptionlabel.setText(desc)
if not self.project.valid:
self.namelabel.setText(name + " (Invalid)")
self.descriptionlabel.setText(self.project.error)

pix = QPixmap(splash)
self.imagelabel.setPixmap(pix)
self.update_version_status()
Expand Down Expand Up @@ -119,10 +123,9 @@ def loadProjectList(self, projects):
self.projectitems.clear()
for project in projects:
if not project.valid:
roam.utils.warning("Project {} is invalid because {}".format(project.name, project.error))
continue
roam.utils.warning("Project {0} is invalid because {1}".format(project.name, project.error))

self.add_new_item(project.name, project, is_new=False)
self.add_new_item(project.name, project, is_new=False, is_valid=project.valid)

def show_new_updateable(self, updateprojects, newprojects):
print updateprojects, newprojects
Expand All @@ -143,14 +146,17 @@ def update_item(self, name, info):
widget = self.moduleList.itemWidget(item)
widget.project = info

def add_new_item(self, name, project, is_new=False):
def add_new_item(self, name, project, is_new=False, is_valid=True):
item = QListWidgetItem(self.moduleList, QListWidgetItem.UserType)
item.setData(QListWidgetItem.UserType, project)
item.setSizeHint(QSize(150, 150))
if not is_valid:
item.setFlags(item.flags() & ~Qt.ItemIsEnabled)

projectwidget = ProjectWidget(self.moduleList, project, is_new=is_new)
projectwidget.install_project.connect(self.projectInstall.emit)
projectwidget.update_project.connect(self.projectUpdate.emit)
projectwidget.setEnabled(is_valid)

self.moduleList.addItem(item)
self.moduleList.setItemWidget(item, projectwidget)
Expand All @@ -166,6 +172,9 @@ def openProject(self, item):
if isinstance(project, dict):
return

if not project.valid:
return

self.selectedProject = project
self.requestOpenProject.emit(project)
self.set_open_project(project)
Expand Down
30 changes: 27 additions & 3 deletions src/roam/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from roam.dataaccess.database import Database
from roam.structs import CaseInsensitiveDict

from yaml.scanner import ScannerError

import roam.qgisfunctions
import roam.utils
import roam
Expand All @@ -48,6 +50,13 @@ class ErrorInMapTool(Exception):
pass


class ProjectLoadError(Exception):
"""
Raised when a project fails to load.
"""
pass


def increment_version(version):
return int(version) + 1

Expand Down Expand Up @@ -150,7 +159,10 @@ def readfolderconfig(folder, configname):

try:
with open(settingspath, 'r') as f:
settings = yaml.load(f) or {}
try:
settings = yaml.load(f) or {}
except ScannerError as ex:
raise ProjectLoadError(str(ex))
return settings
except IOError as e:
utils.warning(e)
Expand Down Expand Up @@ -446,15 +458,19 @@ def __init__(self, rootfolder, settings):
self._splash = None
self.settings = settings
self._forms = []
self.error = ''
self.basepath = os.path.join(rootfolder, "..")
self.projectUpdated.connect(self.project_updated)
self._missinglayers = []
self.configError = None

@classmethod
def from_folder(cls, rootfolder):
project = cls(rootfolder, {})
project.settings = readfolderconfig(rootfolder, configname='project')
try:
project.settings = readfolderconfig(rootfolder, configname='project')
except ProjectLoadError as error:
roam.utils.error(error)
project.configError = error.message
return project

def reload(self):
Expand Down Expand Up @@ -503,6 +519,10 @@ def projectfile(self):
except KeyError:
return os.path.join(self.folder, "project.qgs")

@property
def error(self):
return "\n".join(list(self.validate()))

def validate(self):
"""
Yields messages for each error in the project.
Expand All @@ -521,6 +541,10 @@ def validate(self):
error = "Version mismatch"
yield error

if self.configError:
error = "Project has config error: {0}".format(self.configError)
yield error

@property
def enabled_plugins(self):
return self.settings.get('plugins', [])
Expand Down

0 comments on commit e83370a

Please sign in to comment.