def get_item_wdg(self, item, is_template=False): item_div = DivWdg() item_div.add_style("margin-top: 3px") if is_template == True: item_div.add_style("display: none") #item_div.add_style("border: solid 1px blue") item_div.add_class("spt_list_template_item") else: item_div.add_class("spt_list_item") outer = DivWdg() outer.add_style("float: left") outer.add_style("text-align: left") outer.add(item) if self.show_enabled: checkbox = CheckboxWdg("enabled") checkbox.add_style("float: left") checkbox.set_checked() else: checkbox = HiddenWdg("enabled") item_div.add(checkbox) #item_div.add(item) item_div.add(outer) from tactic.ui.widget import IconButtonWdg add_wdg = DivWdg() add_wdg.add_class("hand") add_wdg.add_class("SPT_DTS") #add_wdg.add("(+)") add_wdg.add_class("spt_add") button = IconButtonWdg(title="Add Entry", icon="BS_PLUS") add_wdg.add(button) add_wdg.add_style("float: left") add_wdg.add_style("opacity: 0.5") #add_wdg.add_style("margin: 3px") item_div.add(add_wdg) remove_wdg = DivWdg() remove_wdg.add_class("hand") remove_wdg.add_class("SPT_DTS") #remove_wdg.add("(-)") remove_wdg.add_class("spt_remove") button = IconButtonWdg(title="Remove Entry", icon="BS_REMOVE") remove_wdg.add(button) remove_wdg.add_style("float: left") remove_wdg.add_style("opacity: 0.5") #remove_wdg.add_style("margin: 3px") item_div.add(remove_wdg) item_div.add("<br clear='all'/>") return item_div
def get_item_div(self, sobjects, related_type): item_div = DivWdg() item_div.add_style("margin: 15px 10px") sobject = sobjects[0] checkbox = CheckboxWdg('related_types') item_div.add(checkbox) checkbox.add_style("vertical-align: bottom") checkbox.set_attr("value", related_type) if related_type in ["sthpw/snapshot", "sthpw/file"]: checkbox.set_checked() checked_types = self.kwargs.get("checked_types") if checked_types == "__ALL__": checkbox.set_checked() item_div.add(" ") item_div.add(related_type) item_div.add(": ") if related_type.startswith("@SOBJECT"): related_sobjects = Search.eval(related_type, [sobject], list=True) else: try: related_sobjects = [] for sobject in sobjects: sobjs = sobject.get_related_sobjects(related_type) related_sobjects.extend(sobjs) except Exception as e: print("WARNING: ", e) related_sobjects = [] item_div.add("(%s)" % len(related_sobjects)) if len(related_sobjects) == 0: item_div.add_style("opacity: 0.5") return None else: # leave them unchecked for now to account for user's careless delete behavior pass # skip checking login by default to avoid accidental delete #if related_type != 'sthpw/login': # checkbox.set_checked() return item_div
def get_display(my): my.sobject = my.kwargs.get("sobject") search_key = my.sobject.get_search_key() top = DivWdg() top.add_class("spt_checkin_publish") top.add_style("padding: 10px") margin_top = '60px' top.add_style("margin-top", margin_top) top.add_style("position: relative") current_changelist = WidgetSettings.get_value_by_key( "current_changelist") current_branch = WidgetSettings.get_value_by_key("current_branch") current_workspace = WidgetSettings.get_value_by_key( "current_workspace") top.add("Branch: %s<br/>" % current_branch) top.add("Changelist: %s<br/>" % current_changelist) top.add("Workspace: %s<br/>" % current_workspace) top.add("<br/>") checked_out_div = DivWdg() checkbox = CheckboxWdg("editable") top.add(checked_out_div) checkbox.add_class("spt_checkin_editable") checked_out_div.add(checkbox) checked_out_div.add("Leave files editable") top.add("<br/>") top.add("Publish Description<br/>") text = TextAreaWdg("description") # this needs to be set or it will stick out to the right text.add_style("width: 220px") text.add_class("spt_checkin_description") top.add(text) # add as a note note_div = DivWdg() top.add(note_div) note_div.add_class("spt_add_note") checkbox = CheckboxWdg("add_note") web = WebContainer.get_web() browser = web.get_browser() if browser in ['Qt']: checkbox.add_style("margin-top: -4px") checkbox.add_style("margin-right: 3px") note_div.add_style("margin-top: 3px") checkbox.add_class("spt_checkin_add_note") note_div.add(checkbox) note_div.add("Also add as note") top.add("<br/><br/>") button = ActionButtonWdg(title="Check-in", icon=IconWdg.PUBLISH, size='medium') top.add(button) my.repo_type = 'perforce' if my.repo_type == 'perforce': # the depot is set per project (unless overridden) project = my.sobject.get_project() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() asset_dir = Environment.get_asset_dir() sandbox_dir = Environment.get_sandbox_dir() changelist = WidgetSettings.get_value_by_key("current_changelist") button.add_behavior({ 'type': 'click_up', 'depot': depot, 'changelist': changelist, 'sandbox_dir': sandbox_dir, 'search_key': search_key, 'cbjs_action': ''' var paths = spt.checkin.get_selected_paths(); spt.app_busy.show("Checking in "+paths.length+" file/s into Perforce"); var top = bvr.src_el.getParent(".spt_checkin_top"); var description = top.getElement(".spt_checkin_description").value; var add_note = top.getElement(".spt_checkin_add_note").value; var editable = top.getElement(".spt_checkin_editable").value; if (editable == 'on') { editable = true; } else { editable = false; } var process = top.getElement(".spt_checkin_process").value; // check into TACTIC var server = TacticServerStub.get(); var revisions = []; server.start({description: "File Check-in"}); try { var top = bvr.src_el.getParent(".spt_checkin_top"); var el = top.getElement(".spt_mode"); var mode = el.value; // check-in the changelist var changelist = 'default'; if (mode == 'changelist') { var scm_info = spt.scm.run("commit_changelist", [changelist, description]); for ( var i = 1; i < scm_info.length-1; i++) { // the first item is the changelist number //console.log(scm_info[i]); var action = scm_info[i]; revision = action.rev; revisions.push(revision); // Do an inplace check-in into TACTIC var path = action.depotFile; var parts = path.split("/"); var filename = parts[parts.length-1]; var context = process + "/" + filename; var snapshot = server.simple_checkin(bvr.search_key, context, path, {description: description, mode: "perforce", version: revision} ); } } else { // check in all of the files for ( var i = 0; i < paths.length; i++) { var path = paths[i]; var scm_info = spt.scm.run("commit_file", [path, description, editable]); // the first item is the changelist number var action = scm_info[1]; revision = action.rev; revisions.push(revision); var parts = path.split("/"); var filename = parts[parts.length-1]; var context = process + "/" + filename; //path = path.replace(bvr.sandbox_dir, "//"+bvr.depot); // NOTE: this assumes project == depot path = path.replace(bvr.sandbox_dir, "//"); // Do an inplace check-in into TACTIC var snapshot = server.simple_checkin(bvr.search_key, context, path, {description: description, mode: "perforce", version: revision} ); } } if (add_note == 'on') { var note = []; note.push('CHECK-IN'); for (var i = 0; i < paths.length; i++) { var parts = paths[i].split("/"); var filename = parts[parts.length-1]; note.push(filename+' (v'+revisions[i]+')'); } note.push(': '); note.push(description); note = note.join(" "); server.create_note(bvr.search_key, note, {process: process}); } server.finish({description: "File Check-in ["+paths.length+" file/s]"}); spt.panel.refresh(top); } catch(e) { spt.error("Error detected: " + e.msg) //console.log(e); server.abort(); } spt.app_busy.hide(); ''' }) else: button.add_behavior(behavior) button.add_style("margin-right: auto") button.add_style("margin-left: auto") button.add_style("margin-top: 20px") button.add_style("margin-bottom: 20px") top.add("<br clear='all'/>") top.add("<hr/>") hidden = HiddenWdg("checkin_type") top.add(hidden) hidden.add_class("spt_checkin_type") grey_out_div = DivWdg() top.add(grey_out_div) grey_out_div.add_class("spt_publish_disable") grey_out_div.add_style("position: absolute") grey_out_div.add_style("left: 0px") grey_out_div.add_style("top: 10px") grey_out_div.add_style("opacity: 0.6") grey_out_div.add_color("background", "background") grey_out_div.add_style("height: 100%") grey_out_div.add_style("width: 100%") #grey_out_div.add_border() return top
def get_display(my): my.sobject = my.kwargs.get("sobject") search_key = my.sobject.get_search_key() top = DivWdg() top.add_class("spt_checkin_publish") top.add_style("padding: 10px") margin_top = '60px' top.add_style("margin-top", margin_top) top.add_style("position: relative") current_changelist = WidgetSettings.get_value_by_key("current_changelist") current_branch = WidgetSettings.get_value_by_key("current_branch") current_workspace = WidgetSettings.get_value_by_key("current_workspace") top.add("Branch: %s<br/>" % current_branch) top.add("Changelist: %s<br/>" % current_changelist) top.add("Workspace: %s<br/>" % current_workspace) top.add("<br/>") checked_out_div = DivWdg() checkbox = CheckboxWdg("editable") top.add(checked_out_div) checkbox.add_class("spt_checkin_editable") checked_out_div.add(checkbox) checked_out_div.add("Leave files editable") top.add("<br/>") top.add("Publish Description<br/>") text = TextAreaWdg("description") # this needs to be set or it will stick out to the right text.add_style("width: 220px") text.add_class("spt_checkin_description") top.add(text) # add as a note note_div = DivWdg() top.add(note_div) note_div.add_class("spt_add_note") checkbox = CheckboxWdg("add_note") web = WebContainer.get_web() browser = web.get_browser() if browser in ['Qt']: checkbox.add_style("margin-top: -4px") checkbox.add_style("margin-right: 3px") note_div.add_style("margin-top: 3px") checkbox.add_class("spt_checkin_add_note") note_div.add(checkbox) note_div.add("Also add as note") top.add("<br/><br/>") button = ActionButtonWdg(title="Check-in", icon=IconWdg.PUBLISH, size='medium') top.add(button) my.repo_type = 'perforce' if my.repo_type == 'perforce': # the depot is set per project (unless overridden) project = my.sobject.get_project() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() asset_dir = Environment.get_asset_dir() sandbox_dir = Environment.get_sandbox_dir() changelist = WidgetSettings.get_value_by_key("current_changelist") button.add_behavior( { 'type': 'click_up', 'depot': depot, 'changelist': changelist, 'sandbox_dir': sandbox_dir, 'search_key': search_key, 'cbjs_action': ''' var paths = spt.checkin.get_selected_paths(); spt.app_busy.show("Checking in "+paths.length+" file/s into Perforce"); var top = bvr.src_el.getParent(".spt_checkin_top"); var description = top.getElement(".spt_checkin_description").value; var add_note = top.getElement(".spt_checkin_add_note").value; var editable = top.getElement(".spt_checkin_editable").value; if (editable == 'on') { editable = true; } else { editable = false; } var process = top.getElement(".spt_checkin_process").value; // check into TACTIC var server = TacticServerStub.get(); var revisions = []; server.start({description: "File Check-in"}); try { var top = bvr.src_el.getParent(".spt_checkin_top"); var el = top.getElement(".spt_mode"); var mode = el.value; // check-in the changelist var changelist = 'default'; if (mode == 'changelist') { var scm_info = spt.scm.run("commit_changelist", [changelist, description]); for ( var i = 1; i < scm_info.length-1; i++) { // the first item is the changelist number //console.log(scm_info[i]); var action = scm_info[i]; revision = action.rev; revisions.push(revision); // Do an inplace check-in into TACTIC var path = action.depotFile; var parts = path.split("/"); var filename = parts[parts.length-1]; var context = process + "/" + filename; var snapshot = server.simple_checkin(bvr.search_key, context, path, {description: description, mode: "perforce", version: revision} ); } } else { // check in all of the files for ( var i = 0; i < paths.length; i++) { var path = paths[i]; var scm_info = spt.scm.run("commit_file", [path, description, editable]); // the first item is the changelist number var action = scm_info[1]; revision = action.rev; revisions.push(revision); var parts = path.split("/"); var filename = parts[parts.length-1]; var context = process + "/" + filename; //path = path.replace(bvr.sandbox_dir, "//"+bvr.depot); // NOTE: this assumes project == depot path = path.replace(bvr.sandbox_dir, "//"); // Do an inplace check-in into TACTIC var snapshot = server.simple_checkin(bvr.search_key, context, path, {description: description, mode: "perforce", version: revision} ); } } if (add_note == 'on') { var note = []; note.push('CHECK-IN'); for (var i = 0; i < paths.length; i++) { var parts = paths[i].split("/"); var filename = parts[parts.length-1]; note.push(filename+' (v'+revisions[i]+')'); } note.push(': '); note.push(description); note = note.join(" "); server.create_note(bvr.search_key, note, {process: process}); } server.finish({description: "File Check-in ["+paths.length+" file/s]"}); spt.panel.refresh(top); } catch(e) { spt.error("Error detected: " + e.msg) //console.log(e); server.abort(); } spt.app_busy.hide(); ''' } ) else: button.add_behavior(behavior) button.add_style("margin-right: auto") button.add_style("margin-left: auto") button.add_style("margin-top: 20px") button.add_style("margin-bottom: 20px") top.add("<br clear='all'/>") top.add("<hr/>") hidden = HiddenWdg("checkin_type") top.add(hidden) hidden.add_class("spt_checkin_type") grey_out_div = DivWdg() top.add(grey_out_div) grey_out_div.add_class("spt_publish_disable") grey_out_div.add_style("position: absolute") grey_out_div.add_style("left: 0px") grey_out_div.add_style("top: 10px") grey_out_div.add_style("opacity: 0.6") grey_out_div.add_color("background", "background") grey_out_div.add_style("height: 100%") grey_out_div.add_style("width: 100%") #grey_out_div.add_border() return top
def handle_dir_or_item(my, item_div, dirname, basename): spath = "%s/%s" % (dirname, basename) fspath = "%s/%s" % (dirname, File.get_filesystem_name(basename)) md5 = my.md5s.get(fspath) changed = False context = None error_msg = None snapshot = None file_obj = my.checked_in_paths.get(fspath) if not file_obj: if fspath.startswith(my.base_dir): rel = fspath.replace("%s/" % my.base_dir, "") file_obj = my.checked_in_paths.get(rel) if file_obj != None: snapshot_code = file_obj.get_value("snapshot_code") snapshot = my.snapshots_dict.get(snapshot_code) if not snapshot: # last resort snapshot = file_obj.get_parent() if snapshot: context = snapshot.get_value("context") item_div.add_attr("spt_snapshot_code", snapshot.get_code()) snapshot_md5 = file_obj.get_value("md5") item_div.add_attr("spt_md5", snapshot_md5) item_div.add_attr("title", "Checked-in as: %s" % file_obj.get_value("file_name")) if md5 and md5 != snapshot_md5: item_div.add_class("spt_changed") changed = True else: error_msg = 'snapshot not found' status = None if file_obj != None: if changed: check = IconWdg( "Checked-In", IconWdg.ERROR, width=12 ) status = "changed" else: check = IconWdg( "Checked-In", IconWdg.CHECK, width=12 ) status = "same" item_div.add_color("color", "color", [0, 0, 50]) else: check = None item_div.add_style("opacity: 0.8") status = "unversioned" if check: item_div.add(check) check.add_style("float: left") check.add_style("margin-left: -16px") check.add_style("margin-top: 4px") # add the file name filename_div = DivWdg() item_div.add(filename_div) filename_div.add(basename) file_info_div = None if snapshot and status != 'unversioned': file_info_div = SpanWdg() filename_div.add(file_info_div) if error_msg: filename_div.add(' (%s)'%error_msg) filename_div.add_style("float: left") filename_div.add_style("overflow: hidden") filename_div.add_style("width: 65%") # DEPRECATED from pyasm.widget import CheckboxWdg, TextWdg, SelectWdg, HiddenWdg checkbox = CheckboxWdg("check") checkbox.add_style("display: none") checkbox.add_class("spt_select") checkbox.add_style("float: right") checkbox.add_style("margin-top: 1px") item_div.add(checkbox) subcontext_val = '' cat_input = None is_select = True if my.context_options: context_sel = SelectWdg("context") context_sel.add_attr('title', 'context') context_sel.set_option("show_missing", False) context_sel.set_option("values", my.context_options) item_div.add_attr("spt_context", my.context_options[0]) cat_input = context_sel input_cls = 'spt_context' else: if my.subcontext_options in [['(main)'], ['(auto)'] , []]: is_select = False #subcontext = TextWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.add_class("spt_subcontext") elif my.subcontext_options == ['(text)']: is_select = False subcontext = TextWdg("subcontext") subcontext.add_class("spt_subcontext") else: is_select = True subcontext = SelectWdg("subcontext") subcontext.set_option("show_missing", False) subcontext.set_option("values", my.subcontext_options) #subcontext.add_empty_option("----") cat_input = subcontext input_cls = 'spt_subcontext' if my.subcontext_options == ['(main)'] or my.subcontext_options == ['(auto)']: subcontext_val = my.subcontext_options[0] subcontext.set_value(subcontext_val) item_div.add_attr("spt_subcontext", subcontext_val) elif context: parts = context.split("/") if len(parts) > 1: # get the actual subcontext value subcontext_val = "/".join(parts[1:]) # identify a previous "auto" check-in and preselect the item in the select if is_select and subcontext_val not in my.subcontext_options: subcontext_val = '(auto)' elif isinstance(cat_input, HiddenWdg): subcontext_val = '' # the Text field will adopt the subcontext value of the last check-in subcontext.set_value(subcontext_val) item_div.add_attr("spt_subcontext", subcontext_val) else: if is_select: if my.subcontext_options: subcontext_val = my.subcontext_options[0] #subcontext_val = '(auto)' cat_input.set_value(subcontext_val) else: subcontext_val = '' item_div.add_attr("spt_subcontext", subcontext_val) item_div.add(cat_input) cat_input.add_behavior( { 'type': 'click_up', 'propagate_evt': False, 'cbjs_action': ''' bvr.src_el.focus(); ''' } ) cat_input.add_style("display: none") cat_input.add_class("spt_subcontext") cat_input.add_style("float: right") cat_input.add_style("width: 50px") cat_input.add_style("margin-top: -1px") cat_input.add_style("font-size: 10px") cat_input.add_style("height: 16px") # we depend on the attribute cuz sometimes we go by the initialized value # since they are not drawn cat_input.add_behavior( { 'type': 'change', 'cbjs_action': ''' var el = bvr.src_el.getParent('.spt_dir_list_item'); el.setAttribute("%s", bvr.src_el.value); ''' %input_cls } ) if file_info_div: if subcontext_val in ['(auto)','(main)', '']: file_info_div.add(" <i style='font-size: 9px; opacity: 0.6'>(v%s)</i>" % snapshot.get_value("version") ) else: file_info_div.add(" <i style='font-size: 9px; opacity: 0.6'>(v%s - %s)</i>" % (snapshot.get_value("version"), subcontext_val) )
def get_bottom_wdg(my): if my.get_option('mode') =='input': return web = WebContainer.get_web() if web.get_selected_app() not in ['XSI','Maya']: return div = DivWdg(css='spt_outdated_ref') refs = my.session.get_data().get_nodes("session/node/ref") snap_codes = [] snap_contexts = [] sobjects = [] session_data_dict = {} asset_codes = [] current_snapshots = [] node_names = [] session_versions = [] for ref in refs: snap_code = Xml.get_attribute(ref, "asset_snapshot_code") node_name = Xml.get_attribute(ref, "name") version = Xml.get_attribute(ref, "asset_snapshot_version") asset_code = Xml.get_attribute(ref, "asset_code") if snap_code in snap_codes: continue snap_codes.append(snap_code) snap_contexts.append(Xml.get_attribute(ref, "asset_snapshot_context")) asset_codes.append(asset_code) session_data_dict[snap_code] = version, node_name # must search one by one warnings=[] for idx, snap_code in enumerate(snap_codes): snapshot = Snapshot.get_by_code(snap_code) if not snapshot: continue search_type = snapshot.get_value('search_type') search_id = snapshot.get_value('search_id') sk = SearchKey.build_search_key(search_type, search_id, column='id') current_snapshot = Snapshot.get_snapshot(search_type, search_id, context=snap_contexts[idx], version=0) if not current_snapshot: warnings.append("Current version for [%s] context [%s] not found" %(sk, snap_contexts[idx])) continue session_version, node_name = session_data_dict.get(snap_code) if session_version and int(current_snapshot.get_version()) > int(session_version): current_snapshots.append(current_snapshot) sobjects.append(current_snapshot.get_sobject()) node_names.append(node_name) session_versions.append(int(session_version)) title = DivWdg('Outdated References') title.add_style('text-decoration','underline') div.add(title) # draw the nodes to be udpated for idx, current_snap in enumerate(current_snapshots): cb = CheckboxWdg(my.REF_CB_NAME) cb.add_class('spt_ref') cb.add_style('display: none') sobj = sobjects[idx] node_name = node_names[idx] session_version = session_versions[idx] snapshot = current_snap cb_value = my.get_input_value(sobj, snapshot) items = cb_value.split('|') items[-1] = node_name cb_value = '|'.join(items) cb.set_option('value', cb_value) div.add(cb) div.add('%0.1d. %s v%0.3d -> v%0.3d\n' \ %(idx+1, node_name, session_version, snapshot.get_version())) div.add(HtmlElement.br()) for warning in warnings: div.add(SpanWdg(warning, css='warning')) div.add(HtmlElement.br()) if current_snapshots: # add the button prefix = my.search_type #input_name = '%s_%s' %(my.search_type, my.CB_NAME) update_button = ProdIconButtonWdg("Update all references") update_button.add_behavior({'type': "click_up",\ 'cbjs_action': '''var cousins = bvr.src_el.getParent('.spt_outdated_ref').getElements('.spt_ref'); cousins.each( function(x) {x.checked=true;}); py_replace_reference(bvr, '%s','%s')''' % (prefix, my.REF_CB_NAME)}) div.add( SpanWdg(update_button, css='small')) div.add(HtmlElement.br(2)) return div
def get_bottom_wdg(my): if my.get_option('mode') == 'input': return web = WebContainer.get_web() if web.get_selected_app() not in ['XSI', 'Maya']: return div = DivWdg(css='spt_outdated_ref') refs = my.session.get_data().get_nodes("session/node/ref") snap_codes = [] snap_contexts = [] sobjects = [] session_data_dict = {} asset_codes = [] current_snapshots = [] node_names = [] session_versions = [] for ref in refs: snap_code = Xml.get_attribute(ref, "asset_snapshot_code") node_name = Xml.get_attribute(ref, "name") version = Xml.get_attribute(ref, "asset_snapshot_version") asset_code = Xml.get_attribute(ref, "asset_code") if snap_code in snap_codes: continue snap_codes.append(snap_code) snap_contexts.append( Xml.get_attribute(ref, "asset_snapshot_context")) asset_codes.append(asset_code) session_data_dict[snap_code] = version, node_name # must search one by one warnings = [] for idx, snap_code in enumerate(snap_codes): snapshot = Snapshot.get_by_code(snap_code) if not snapshot: continue search_type = snapshot.get_value('search_type') search_id = snapshot.get_value('search_id') sk = SearchKey.build_search_key(search_type, search_id, column='id') current_snapshot = Snapshot.get_snapshot( search_type, search_id, context=snap_contexts[idx], version=0) if not current_snapshot: warnings.append( "Current version for [%s] context [%s] not found" % (sk, snap_contexts[idx])) continue session_version, node_name = session_data_dict.get(snap_code) if session_version and int( current_snapshot.get_version()) > int(session_version): current_snapshots.append(current_snapshot) sobjects.append(current_snapshot.get_sobject()) node_names.append(node_name) session_versions.append(int(session_version)) title = DivWdg('Outdated References') title.add_style('text-decoration', 'underline') div.add(title) # draw the nodes to be udpated for idx, current_snap in enumerate(current_snapshots): cb = CheckboxWdg(my.REF_CB_NAME) cb.add_class('spt_ref') cb.add_style('display: none') sobj = sobjects[idx] node_name = node_names[idx] session_version = session_versions[idx] snapshot = current_snap cb_value = my.get_input_value(sobj, snapshot) items = cb_value.split('|') items[-1] = node_name cb_value = '|'.join(items) cb.set_option('value', cb_value) div.add(cb) div.add('%0.1d. %s v%0.3d -> v%0.3d\n' \ %(idx+1, node_name, session_version, snapshot.get_version())) div.add(HtmlElement.br()) for warning in warnings: div.add(SpanWdg(warning, css='warning')) div.add(HtmlElement.br()) if current_snapshots: # add the button prefix = my.search_type #input_name = '%s_%s' %(my.search_type, my.CB_NAME) update_button = ProdIconButtonWdg("Update all references") update_button.add_behavior({'type': "click_up",\ 'cbjs_action': '''var cousins = bvr.src_el.getParent('.spt_outdated_ref').getElements('.spt_ref'); cousins.each( function(x) {x.checked=true;}); py_replace_reference(bvr, '%s','%s')''' % (prefix, my.REF_CB_NAME)}) div.add(SpanWdg(update_button, css='small')) div.add(HtmlElement.br(2)) return div