Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dpa/data/config/maya/shelves.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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"

27 changes: 27 additions & 0 deletions dpa/data/config/product/subscription/update.cfg
Original file line number Diff line number Diff line change
@@ -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:
2 changes: 1 addition & 1 deletion dpa/product/subscription/action/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
187 changes: 187 additions & 0 deletions dpa/ui/product/subscription/update.py
Original file line number Diff line number Diff line change
@@ -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:<br>

<table>
<tr>
<td align="left">Product Spec:&nbsp;&nbsp;</td>
<td align="left"><b>Version&nbsp;&nbsp;</b></td>
<td align="left"><b>New Version</b></td>
</tr>
""".format(
ptask=self._ptask.spec,
)

i = 0
for spec in self.options.value.outdated_subs:
to_version = self.updatelist['subs'][0][i].product_version.product.official_version
if not to_version:
to_version = self.updatelist['subs'][0][i].product_version.product.latest_published().number

cur_version = self.updatelist['subs'][0][i].product_version.number
confirm_message += """
<tr>
<td align="left">{k} :&nbsp;&nbsp;</td>
<td align="left"><b>{v} &nbsp;&nbsp;</b></td>
<td align="left"><b>{nv}</b></td>
</tr>
""".format(
k=spec,
v=cur_version,
nv=to_version
)
i += 1

confirm_message += """
</table><br><br>
This will also refresh your import directory and attempt to reload.<br><br>
<b>Update Subscriptions?</b>
"""

# info dialog showing what will be done
proceed = QtGui.QMessageBox.question(
self,
"Version Up Confirmation",
confirm_message,
buttons=QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Yes,
defaultButton=QtGui.QMessageBox.NoButton,
)

return proceed == QtGui.QMessageBox.Yes


# -------------------------------------------------------------------------
def check_subscriptions(self):
sublist = defaultdict(dict)

# get existing subscriptions, exclude deprecated
for sub in SessionRegistry().current().ptask_version.subscriptions:
sub_prod = sub.product_version.product

if sub.product_version.number == sub_prod.latest_published().number:
sublist['current'][sub_prod.spec] = [sub]

if sub.product_version.number != sub_prod.official_version:
sublist['unofficial'][sub_prod.spec] = [sub]
else:
sublist['outdated'][sub_prod.spec] = [sub]

if sub.product_version.number != sub_prod.official_version:
sublist['unofficial'][sub_prod.spec] = [sub]

self._sublist = sublist

# -------------------------------------------------------------------------
@property
def sublist(self):
if not hasattr(self, '_sublist'):
return defaultdict(dict)

return self._sublist

# -------------------------------------------------------------------------
@property
def updatelist(self):
if not hasattr(self, '_to_update'):
return defaultdict(dict)

return self._to_update