diff --git a/.pylintrc b/.pylintrc
index 4051d643318077c6c09f6c4e896b87e0e193b481..cacf5a9a41d9f4df25a81689ebb69fc7e06717d4 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -3,3 +3,8 @@
 # List of plugins (as comma separated values of python module names) to load,
 # usually to register additional checkers.
 load-plugins=pylint_flask,pylint_flask_sqlalchemy
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace,scoped_session
diff --git a/areas/apps/models.py b/areas/apps/models.py
index a3098ab37a8c0a2a59a9f68d284343a9caa72d24..abc3448c098dc9fb7de4cf4d624b5b4550f9059f 100644
--- a/areas/apps/models.py
+++ b/areas/apps/models.py
@@ -51,7 +51,8 @@ class App(db.Model):
         """
         # Delete all roles first
         for role in self.roles:
-            role.delete()
+            db.session.delete(role)
+        db.session.commit()
 
         db.session.delete(self)
         return db.session.commit()
@@ -166,6 +167,7 @@ class AppStatus():  # pylint: disable=too-few-public-methods
             self.installed = False
             self.ready = False
             self.message = "Not installed"
+            return
 
         for helmrelease in helmreleases:
             hr_status = helmrelease['status']
diff --git a/cliapp/cliapp/cli.py b/cliapp/cliapp/cli.py
index 6ac5cba60f35aad0e1ec8f4ee8f6bd59ca20a1bd..25ba8611701cb15e9ff6fb01150cbf2f60927bd3 100644
--- a/cliapp/cliapp/cli.py
+++ b/cliapp/cliapp/cli.py
@@ -98,9 +98,14 @@ def delete_app(slug):
         current_app.logger.info("Not found")
         return
 
-    deleted = app_obj.delete()
-    current_app.logger.info(f"Success: {deleted}")
-    return
+    app_status = app_obj.get_status()
+    if not app_status.installed:
+        deleted = app_obj.delete()
+        current_app.logger.info(f"Success.")
+    else:
+        current_app.logger.info("Can not delete installed application, run"
+            " 'uninstall' first")
+
 
 @app_cli.command(
     "uninstall",
@@ -110,7 +115,7 @@ def uninstall_app(slug):
     """Uninstalls the app from the cluster
     :param slug: str Slug of app to remove
     """
-    current_app.logger.info(f"Trying to delete app: {slug}")
+    current_app.logger.info(f"Trying to uninstall app: {slug}")
     app_obj = App.query.filter_by(slug=slug).first()
 
     if not app_obj:
@@ -152,7 +157,7 @@ def install_app(slug):
         return
 
     current_status = app.get_status()
-    if current_status.installed == False:
+    if not current_status.installed:
         app.install()
         current_app.logger.info(
             f"App {slug} installing... use `status` to see status")