diff --git a/dpa/data/config/maya/shelves.cfg b/dpa/data/config/maya/shelves.cfg
index 5159af6..e9cce1d 100644
--- a/dpa/data/config/maya/shelves.cfg
+++ b/dpa/data/config/maya/shelves.cfg
@@ -48,3 +48,11 @@ Pipeline:
annotation: Send a FAIL notification
image: "icon:///images/icons/warning_32x32.png"
+ updatesubs:
+ command: |
+ from dpa.ui.product.subscription.update import ProductSubscriptionUpdateDialog
+ ProductSubscriptionUpdateDialog().show()
+ label: Update Subscriptions
+ annotation: Update subscriptions
+ image: "icon:///images/icons/import_32x32.png"
+
diff --git a/dpa/data/config/product/subscription/update.cfg b/dpa/data/config/product/subscription/update.cfg
new file mode 100644
index 0000000..2f062d9
--- /dev/null
+++ b/dpa/data/config/product/subscription/update.cfg
@@ -0,0 +1,27 @@
+options:
+
+ outdated_subs:
+ type: list
+ help: Outdated Subscriptions
+ label: "Choose Outdated Subs to Update"
+ required: True
+ choices: []
+ default:
+
+ unofficial_subs:
+ type: list
+ help: Subscriptions that aren't official
+ label: "Unofficial Subscriptions"
+ required: False
+ multiple: False
+ choices: []
+ default:
+
+ current_subs:
+ type: list
+ help: Subcriptions that are current
+ label: "Up-to-date Subscriptions"
+ required: False
+ multiple: False
+ choices: []
+ default:
diff --git a/dpa/product/subscription/action/update.py b/dpa/product/subscription/action/update.py
index 660fa8e..c6d6744 100644
--- a/dpa/product/subscription/action/update.py
+++ b/dpa/product/subscription/action/update.py
@@ -163,7 +163,7 @@ def validate(self):
for sub in self._subs:
if isinstance(sub, ProductSubscription):
- subs_to_udpate.append(sub)
+ subs.append(sub)
continue
try:
diff --git a/dpa/ui/product/subscription/update.py b/dpa/ui/product/subscription/update.py
new file mode 100644
index 0000000..7abf24e
--- /dev/null
+++ b/dpa/ui/product/subscription/update.py
@@ -0,0 +1,187 @@
+"""Check/Update subscriptions of the supplied ptask."""
+from collections import defaultdict
+
+from PySide import QtCore, QtGui
+
+from dpa.action import ActionError
+from dpa.action.registry import ActionRegistry
+from dpa.ptask import PTask, PTaskError
+from dpa.ptask.area import PTaskArea
+from dpa.ui.app.session import SessionActionDialog
+from dpa.ui.icon.factory import IconFactory
+from dpa.app.session import SessionRegistry
+
+# -----------------------------------------------------------------------------
+
+UPDATE_ICON_URI = "icon:///images/icons/import_32x32.png"
+UPDATE_OPTIONS_CONFIG = "config/product/subscription/update.cfg"
+
+# -----------------------------------------------------------------------------
+class ProductSubscriptionUpdateDialog(SessionActionDialog):
+
+ # -------------------------------------------------------------------------
+ def __init__(self):
+
+ self._ptask_area = PTaskArea.current()
+ options_config = self._ptask_area.config(UPDATE_OPTIONS_CONFIG,
+ composite_ancestors=True)
+
+ self.check_subscriptions()
+
+ if 'outdated' in self.sublist:
+ options_config['options']['outdated_subs'].set('choices',
+ self.sublist['outdated'].keys())
+
+ if 'unofficial' in self.sublist:
+ options_config['options']['unofficial_subs'].set('choices',
+ self.sublist['unofficial'].keys())
+
+ if 'current' in self.sublist:
+ options_config['options']['current_subs'].set('choices',
+ self.sublist['current'].keys())
+
+ try:
+ self._ptask = PTask.get(self._ptask_area.spec)
+ except PTaskError as e:
+ error_dialog = QtGui.QErrorMessage(self)
+ error_dialog.setWindowTitle('Subscription Update Failure')
+ error_dialog.showMessage("Unable to update subscriptions.")
+ return
+
+ icon_path = IconFactory().disk_path(UPDATE_ICON_URI)
+
+ super(ProductSubscriptionUpdateDialog, self).__init__(
+ title='Update Existing Subscriptions',
+ options_config=options_config,
+ icon_path=icon_path,
+ action_button_text='Update',
+ modal=False,
+ )
+
+ # -------------------------------------------------------------------------
+ def accept(self):
+ print "before confirm"
+
+ if not self._confirm():
+ return
+
+ # Just like in PTaskVersionDialog, this needs to
+ # Call the session's reload()-like feature (should be written)
+ # Necessary for programs like Mari, not necessarily Maya
+
+ # handles closing the dialog
+ super(ProductSubscriptionUpdateDialog, self).accept()
+
+ try:
+ if len(self.updatelist) > 0:
+ update_action_cls = ActionRegistry().get_action('update', 'subs')
+ update_action_cls = update_action_cls(self._ptask, self.updatelist['subs'][0])
+ update_action_cls()
+ except ActionError as e:
+ error_dialog = QtGui.QErrorMessage(self.parent())
+ error_dialog.setWindowTitle('Update Subscription Failure')
+ error_dialog.showMessage(
+ "There was an error updating the subscriptions."
+ )
+ else:
+ QtGui.QMessageBox.question(self, "Updating Subscriptions Results",
+ "Please verify results in the console.",
+ buttons=QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Ok,
+ defaultButton=QtGui.QMessageBox.NoButton,
+ )
+
+ # -------------------------------------------------------------------------
+ def _confirm(self):
+ self._to_update = defaultdict(dict)
+ self._to_update['subs'] = []
+
+ for pspec in self.options.value['outdated_subs']:
+ self._to_update['subs'].append(self.sublist['outdated'][pspec])
+
+ confirm_message = """
+ Confirm subscription update:
+
+
| Product Spec: | +Version | +New Version | +
| {k} : | +{v} | +{nv} | +