def build_updates_page(): '''available/pending updates''' page_name = u'updates.html' # need to consolidate/centralize this flag. Accessing it this way is ugly. if NSApp.delegate().mainWindowController._update_in_progress: return build_update_status_page() item_list = MunkiItems.getEffectiveUpdateList() other_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'update-available' ] page = {} page['update_rows'] = u'' page['hide_progress_spinner'] = u'hidden' page['hide_other_updates'] = u'hidden' page['install_all_button_classes'] = u'' item_template = get_template('update_row_template.html') if item_list: for item in item_list: escapeAndQuoteCommonFields(item) page['update_rows'] += item_template.safe_substitute(item) elif not other_updates: status_results_template = get_template('status_results_template.html') alert = {} alert['primary_status_text'] = NSLocalizedString( u"Your software is up to date.", u"No Pending Updates primary text") alert['secondary_status_text'] = NSLocalizedString( u"There is no new software for your computer at this time.", u"No Pending Updates secondary text") alert['hide_progress_bar'] = u'hidden' alert['progress_bar_value'] = u'' page['update_rows'] = status_results_template.safe_substitute(alert) count = len(item_list) page['update_count'] = msclib.updateCountMessage(count) page['install_btn_label'] = msclib.getInstallAllButtonTextForCount(count) page['warning_text'] = get_warning_text() page['other_updates_header_message'] = NSLocalizedString( u"Other available updates", u"Other Available Updates label") page['other_update_rows'] = u'' if other_updates: page['hide_other_updates'] = u'' for item in other_updates: escapeAndQuoteCommonFields(item) page['other_update_rows'] += item_template.safe_substitute(item) footer = get_template('footer_template.html', raw=True) generate_page(page_name, 'updates_template.html', page, footer=footer)
def build_updates_page(): '''available/pending updates''' page_name = u'updates.html' # need to consolidate/centralize this flag. Accessing it this way is ugly. if NSApp.delegate().mainWindowController._update_in_progress: return build_update_status_page() item_list = MunkiItems.getEffectiveUpdateList() other_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'update-available'] page = {} page['update_rows'] = u'' page['hide_progress_spinner'] = u'hidden' page['hide_other_updates'] = u'hidden' page['install_all_button_classes'] = u'' item_template = get_template('update_row_template.html') if item_list: for item in item_list: escapeAndQuoteCommonFields(item) page['update_rows'] += item_template.safe_substitute(item) elif not other_updates: status_results_template = get_template('status_results_template.html') alert = {} alert['primary_status_text'] = NSLocalizedString( u"Your software is up to date.", u"No Pending Updates primary text") alert['secondary_status_text'] = NSLocalizedString( u"There is no new software for your computer at this time.", u"No Pending Updates secondary text") alert['hide_progress_bar'] = u'hidden' alert['progress_bar_value'] = u'' page['update_rows'] = status_results_template.safe_substitute(alert) count = len(item_list) page['update_count'] = msclib.updateCountMessage(count) page['install_btn_label'] = msclib.getInstallAllButtonTextForCount(count) page['warning_text'] = get_warning_text() page['other_updates_header_message'] = NSLocalizedString( u"Other available updates", u"Other Available Updates label") page['other_update_rows'] = u'' if other_updates: page['hide_other_updates'] = u'' for item in other_updates: escapeAndQuoteCommonFields(item) page['other_update_rows'] += item_template.safe_substitute(item) footer = get_template('footer_template.html', raw=True) generate_page(page_name, 'updates_template.html', page, footer=footer)
def build_updates_page(): '''available/pending updates''' page_name = u'updates.html' # need to consolidate/centralize this flag. Accessing it this way is ugly. if NSApp.delegate().mainWindowController._update_in_progress: return build_update_status_page() item_list = MunkiItems.getEffectiveUpdateList() problem_updates = MunkiItems.getProblemItems() for item in problem_updates: item['hide_cancel_button'] = u'hidden' # find any optional installs with update available other_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'update-available' ] # find any listed optional install updates that require a higher OS # or have insufficient disk space or other blockers (because they have a # note) blocked_optional_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'installed' and item.get('note') ] for item in blocked_optional_updates: item['hide_cancel_button'] = u'hidden' other_updates.extend(blocked_optional_updates) page = {} page['update_rows'] = u'' page['hide_progress_spinner'] = u'hidden' page['hide_problem_updates'] = u'hidden' page['hide_other_updates'] = u'hidden' page['install_all_button_classes'] = u'' item_template = get_template('update_row_template.html') # build pending updates table if item_list: for item in item_list: escapeAndQuoteCommonFields(item) page['update_rows'] += item_template.safe_substitute(item) elif not other_updates and not problem_updates: status_results_template = get_template('status_results_template.html') alert = {} alert['primary_status_text'] = NSLocalizedString( u"Your software is up to date.", u"No Pending Updates primary text") alert['secondary_status_text'] = NSLocalizedString( u"There is no new software for your computer at this time.", u"No Pending Updates secondary text") alert['hide_progress_bar'] = u'hidden' alert['progress_bar_value'] = u'' page['update_rows'] = status_results_template.safe_substitute(alert) count = len( [item for item in item_list if item['status'] != 'problem-item']) page['update_count'] = msclib.updateCountMessage(count) page['install_btn_label'] = msclib.getInstallAllButtonTextForCount(count) page['warning_text'] = get_warning_text() # build problem updates table page['problem_updates_header_message'] = NSLocalizedString( u"Problem updates", u"Problem Updates label") page['problem_update_rows'] = u'' if problem_updates: page['hide_problem_updates'] = u'' for item in problem_updates: escapeAndQuoteCommonFields(item) page['problem_update_rows'] += item_template.safe_substitute(item) # build other available updates table page['other_updates_header_message'] = NSLocalizedString( u"Other available updates", u"Other Available Updates label") page['other_update_rows'] = u'' if other_updates: page['hide_other_updates'] = u'' for item in other_updates: escapeAndQuoteCommonFields(item) page['other_update_rows'] += item_template.safe_substitute(item) footer = get_template('footer_template.html', raw=True) generate_page(page_name, 'updates_template.html', page, footer=footer)
def build_updates_page(): '''available/pending updates''' page_name = u'updates.html' # need to consolidate/centralize this flag. Accessing it this way is ugly. if NSApp.delegate().mainWindowController._update_in_progress: return build_update_status_page() item_list = MunkiItems.getEffectiveUpdateList() problem_updates = MunkiItems.getProblemItems() for item in problem_updates: item['hide_cancel_button'] = u'hidden' # find any optional installs with update available other_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'update-available'] # find any listed optional install updates that require a higher OS # or have insufficient disk space or other blockers (because they have a # note) blocked_optional_updates = [ item for item in MunkiItems.getOptionalInstallItems() if item['status'] == 'installed' and item.get('note')] for item in blocked_optional_updates: item['hide_cancel_button'] = u'hidden' other_updates.extend(blocked_optional_updates) page = {} page['update_rows'] = u'' page['hide_progress_spinner'] = u'hidden' page['hide_problem_updates'] = u'hidden' page['hide_other_updates'] = u'hidden' page['install_all_button_classes'] = u'' item_template = get_template('update_row_template.html') # build pending updates table if item_list: for item in item_list: escapeAndQuoteCommonFields(item) page['update_rows'] += item_template.safe_substitute(item) elif not other_updates and not problem_updates: status_results_template = get_template('status_results_template.html') alert = {} alert['primary_status_text'] = NSLocalizedString( u"Your software is up to date.", u"No Pending Updates primary text") alert['secondary_status_text'] = NSLocalizedString( u"There is no new software for your computer at this time.", u"No Pending Updates secondary text") alert['hide_progress_bar'] = u'hidden' alert['progress_bar_value'] = u'' page['update_rows'] = status_results_template.safe_substitute(alert) count = len([item for item in item_list if item['status'] != 'problem-item']) page['update_count'] = msclib.updateCountMessage(count) page['install_btn_label'] = msclib.getInstallAllButtonTextForCount(count) page['warning_text'] = get_warning_text() # build problem updates table page['problem_updates_header_message'] = NSLocalizedString( u"Problem updates", u"Problem Updates label") page['problem_update_rows'] = u'' if problem_updates: page['hide_problem_updates'] = u'' for item in problem_updates: escapeAndQuoteCommonFields(item) page['problem_update_rows'] += item_template.safe_substitute(item) # build other available updates table page['other_updates_header_message'] = NSLocalizedString( u"Other available updates", u"Other Available Updates label") page['other_update_rows'] = u'' if other_updates: page['hide_other_updates'] = u'' for item in other_updates: escapeAndQuoteCommonFields(item) page['other_update_rows'] += item_template.safe_substitute(item) footer = get_template('footer_template.html', raw=True) generate_page(page_name, 'updates_template.html', page, footer=footer)
def updateOptionalInstallButtonClicked_(self, item_name): '''this method is called from JavaScript when a user clicks the cancel or add button in the updates list''' # TO-DO: better handling of all the possible "unexpected error"s document = self.webView.mainFrameDocument() item = MunkiItems.optionalItemForName_(item_name) if not item: msclog.debug_log('Unexpected error: Can\'t find item for %s' % item_name) return update_table_row = document.getElementById_('%s_update_table_row' % item_name) if not update_table_row: msclog.debug_log('Unexpected error: Can\'t find table row for %s' % item_name) return # remove this row from its current table node = update_table_row.parentNode().removeChild_(update_table_row) previous_status = item['status'] # update item status item.update_status() # do we need to add a new node to the other list? if item.get('needs_update'): # make some new HTML for the updated item managed_update_names = MunkiItems.getInstallInfo().get('managed_updates', []) item_template = mschtml.get_template('update_row_template.html') item_html = item_template.safe_substitute(item) if item['status'] in ['install-requested', 'update-will-be-installed', 'installed']: # add the node to the updates-to-install table table = document.getElementById_('updates-to-install-table') if item['status'] == 'update-available': # add the node to the other-updates table table = document.getElementById_('other-updates-table') if not table: msclog.debug_log('Unexpected error: could not find other-updates-table') return # this isn't the greatest way to add something to the DOM # but it works... table.setInnerHTML_(table.innerHTML() + item_html) # might need to toggle visibility of other updates div other_updates_div = document.getElementById_('other-updates') other_updates_div_classes = other_updates_div.className().split(' ') other_updates_table = document.getElementById_('other-updates-table') if other_updates_table.innerHTML().strip(): if 'hidden' in other_updates_div_classes: other_updates_div_classes.remove('hidden') other_updates_div.setClassName_(' '.join(other_updates_div_classes)) else: if not 'hidden' in other_updates_div_classes: other_updates_div_classes.append('hidden') other_updates_div.setClassName_(' '.join(other_updates_div_classes)) # update the updates-to-install header to reflect the new list of updates to install updateCount = self.getUpdateCount() update_count_message = msclib.updateCountMessage(updateCount) update_count_element = document.getElementById_('update-count-string') if update_count_element: update_count_element.setInnerText_(update_count_message) warning_text = mschtml.get_warning_text() warning_text_element = document.getElementById_('update-warning-text') if warning_text_element: warning_text_element.setInnerHTML_(warning_text) # update text of Install All button install_all_button_element = document.getElementById_('install-all-button-text') if install_all_button_element: install_all_button_element.setInnerText_( msclib.getInstallAllButtonTextForCount(updateCount)) # update count badges self.displayUpdateCount() if MunkiItems.updateCheckNeeded(): # check for updates after a short delay so UI changes visually complete first self.performSelector_withObject_afterDelay_(self.checkForUpdates, True, 1.0)