def _get_target_span(self): # get the target span search = Search(self.container_cls.SEARCH_TYPE) self._order_search(search) groups = search.get_sobjects() if groups: self.container_sobj = groups[0] target_span = SpanWdg(css='med') group_table = Table(self.GROUP_TABLE_NAME, css='table') group_table.add_style('width', '30em') group_table.add_col(css='small') group_table.add_col(css='small') group_table.add_col() target_span.add(group_table) group_table.add_row_cell(search.get_search_type_obj()\ .get_description(), "heading") checkbox = CheckboxWdg() checkbox.set_option("onclick", \ "a=new Elements('container_ids');a.toggle_all(this);") group_table.add_row() group_table.add_cell(checkbox) col_name = group_table.get_next_col_name() toggle_control = HiddenRowToggleWdg(col_name, is_control=True, auto_index=True) group_table.add_cell(toggle_control) group_table.add_cell('MASTER CONTROL') remove_cmd = HiddenWdg(SObjectGroupCmd.REMOVE_CMD) self.add(remove_cmd) for group in groups: group_table.add_row() checkbox = CheckboxWdg("container_ids") checkbox.set_option("value", group.get_primary_key_value()) toggle = HiddenRowToggleWdg(col_name, auto_index=True) toggle.store_event() group_details = ItemInContainerWdg(group, self.item_sobj, self.item_cls, self.grouping_cls) # set the target content of the toggle toggle.set_static_content(group_details) group_table.add_cell(checkbox) group_table.add_cell(toggle, add_hidden_wdg=True) group_table.add_cell(group.get_description()) num_items = group_details.get_num_items() if num_items: td = group_table.add_cell("( %s )" % num_items, 'no_wrap') td.add_style('color: #777') else: group_table.add_blank_cell() return target_span
def get_instantiation_wdg(self): setting = self.get_default_setting() default_instantiation = setting.get('instantiation') div = DivWdg() is_unchecked = True default_cb = None for value in self.get_instantiation_options(): name = self.get_element_name("instantiation") checkbox = CheckboxWdg( name ) if value == default_instantiation: default_cb = checkbox checkbox.set_option("value", value) checkbox.set_persistence() if checkbox.is_checked(): is_unchecked = False checkbox.add_behavior({'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" %name}) span = SpanWdg(checkbox, css='small') span.add(value) div.add(span) if is_unchecked: default_cb.set_checked() return div
def get_instantiation_wdg(my): setting = my.get_default_setting() default_instantiation = setting.get('instantiation') div = DivWdg() is_unchecked = True default_cb = None for value in my.get_instantiation_options(): name = my.get_element_name("instantiation") checkbox = CheckboxWdg(name) if value == default_instantiation: default_cb = checkbox checkbox.set_option("value", value) checkbox.set_persistence() if checkbox.is_checked(): is_unchecked = False checkbox.add_behavior({ 'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" % name }) span = SpanWdg(checkbox, css='small') span.add(value) div.add(span) if is_unchecked: default_cb.set_checked() return div
def init(self): self.add("Process: ") checkbox = CheckboxWdg("process") checkbox.set_option("value", "on") checkbox.set_persistence() checkbox.add_event("onclick", "document.form.submit()") self.add(checkbox)
def get_display(self): sobject = self.get_current_sobject() checkbox = CheckboxWdg() checkbox.set_name(self.name) checkbox.set_option("value", sobject.get_search_key()) return checkbox
def _get_target_span(my): # get the target span search = Search(my.container_cls) my._order_search(search) groups = search.get_sobjects() if groups: my.container_sobj = groups[0] target_span = SpanWdg(css='med') group_table = Table(my.GROUP_TABLE_NAME, css='table') group_table.add_style('width','30em') group_table.add_col(css='small') group_table.add_col(css='small') group_table.add_col() target_span.add(group_table) group_table.add_row_cell(search.get_search_type_obj()\ .get_description(), "heading") checkbox = CheckboxWdg() checkbox.set_option("onclick", \ "a=new Elements('container_ids');a.toggle_all(this);") group_table.add_row() group_table.add_cell(checkbox) col_name = group_table.get_next_col_name() toggle_control = HiddenRowToggleWdg(col_name=col_name, is_control=True, auto_index=True) group_table.add_cell(toggle_control) group_table.add_cell('MASTER CONTROL') remove_cmd = HiddenWdg(SObjectGroupCmd.REMOVE_CMD) my.add(remove_cmd) for group in groups: group_table.add_row() checkbox = CheckboxWdg("container_ids") checkbox.set_option("value", group.get_primary_key_value() ) toggle = HiddenRowToggleWdg(col_name, auto_index=True) toggle.store_event() group_details = ItemInContainerWdg( group, my.item_sobj, my.item_cls, my.grouping_cls ) # set the target content of the toggle toggle.set_static_content(group_details) group_table.add_cell( checkbox ) group_table.add_cell( toggle, add_hidden_wdg=True ) group_table.add_cell( group.get_description()) num_items = group_details.get_num_items() if num_items: td = group_table.add_cell( "( %s )" % num_items, 'no_wrap') td.add_color(color) else: group_table.add_blank_cell() return target_span
def get_display(my): sobject = my.get_current_sobject() checkbox = CheckboxWdg() checkbox.set_name(my.name) checkbox.set_option( "value", sobject.get_search_key() ) return checkbox
def get_display(self): sobject = self.get_current_sobject() search_key = sobject.get_search_key() div = DivWdg() checkbox = CheckboxWdg("search_key") checkbox.set_option("value", search_key) div.add(checkbox) return div
def get_format_wdg(my, value, format, display_value): div = DivWdg() if format not in ['Checkbox'] and value == '': return div if format == 'Checkbox': div.add_style("width: 100%") div.add_class("spt_boolean_top") from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg(my.get_name()) checkbox.set_option("value", "true") if value: checkbox.set_checked() div.add(checkbox) checkbox.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var cached_data = {}; var value_wdg = bvr.src_el; var top_el = bvr.src_el.getParent(".spt_boolean_top"); spt.dg_table.edit.widget = top_el; var key_code = spt.kbd.special_keys_map.ENTER; spt.dg_table.inline_edit_cell_cbk( value_wdg, cached_data ); ''' }) elif format == '-$1,234.00': if value < 0: div.add_style("color: red") div.add("(%s)" % display_value.replace("-", "")) else: div.add_style("color: black") div.add(display_value) else: div.add(display_value) return div
def get_format_wdg(self, value, format, display_value): div = DivWdg() if format not in ['Checkbox'] and value == '': return div if format == 'Checkbox': div.add_style("width: 100%") div.add_class("spt_boolean_top") from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg(self.get_name()) checkbox.set_option("value", "true") if value: checkbox.set_checked() div.add(checkbox) checkbox.add_behavior( { 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var cached_data = {}; var value_wdg = bvr.src_el; var top_el = bvr.src_el.getParent(".spt_boolean_top"); spt.dg_table.edit.widget = top_el; var key_code = spt.kbd.special_keys_map.ENTER; spt.dg_table.inline_edit_cell_cbk( value_wdg, cached_data ); ''' } ) elif format == '-$1,234.00': if value < 0: div.add_style("color: red") div.add("(%s)" % display_value.replace("-", "")) else: div.add_style("color: black") div.add(display_value) else: div.add(display_value) return div
def get_display(my): my.init_kwargs() sobject = my.get_current_sobject() table = Table(css='minimal') table.add_color("color", "color") table.add_style("font-size: 0.9em") snapshots = my.get_snapshot(my.mode) for snapshot in snapshots: table.add_row() value = my.get_input_value(sobject, snapshot) current_version = snapshot.get_value("version") current_context = snapshot.get_value("context") current_revision = snapshot.get_value("revision", no_exception=True) current_snapshot_type = snapshot.get_value("snapshot_type") # hack hard coded type translation if current_snapshot_type == "anim_export": current_snapshot_type = "anim" # ignore icon context completely if current_context == "icon": table.add_blank_cell() table.add_cell("(---)") return table checkbox = CheckboxWdg('%s_%s' % (my.search_type, my.CB_NAME)) # this is added back in for now to work with 3.7 Fast table checkbox.add_behavior({'type': 'click_up', 'propagate_evt': True}) checkbox.add_class('spt_latest_%s' % my.mode) checkbox.set_option("value", value) table.add_cell(checkbox) load_all = False if load_all: checkbox.set_checked() # add the file type icon xml = snapshot.get_snapshot_xml() file_name = xml.get_value("snapshot/file/@name") icon_link = ThumbWdg.find_icon_link(file_name) image = HtmlElement.img(icon_link) image.add_style("width: 15px") table.add_cell(image) namespace = my.get_namespace(sobject, snapshot) asset_code = my.get_asset_code() # force asset mode = True my.session.set_asset_mode(asset_mode=my.get_session_asset_mode()) node_name = my.get_node_name(snapshot, asset_code, namespace) # get session info session_context = session_version = session_revision = None if my.session: session_context = my.session.get_context( node_name, asset_code, current_snapshot_type) session_version = my.session.get_version( node_name, asset_code, current_snapshot_type) session_revision = my.session.get_revision( node_name, asset_code, current_snapshot_type) # Maya Specific: try with namespace in front of it for referencing referenced_name = '%s:%s' % (namespace, node_name) if not session_context or not session_version: session_context = my.session.get_context( referenced_name, asset_code, current_snapshot_type) session_version = my.session.get_version( referenced_name, asset_code, current_snapshot_type) session_revision = my.session.get_revision( referenced_name, asset_code, current_snapshot_type) from version_wdg import CurrentVersionContextWdg, SubRefWdg version_wdg = CurrentVersionContextWdg() data = {'session_version': session_version, \ 'session_context': session_context, \ 'session_revision': session_revision, \ 'current_context': current_context, \ 'current_version': current_version, \ 'current_revision': current_revision } version_wdg.set_options(data) table.add_cell(version_wdg, "no_wrap") td = table.add_cell(HtmlElement.b("(%s)" % current_context)) td.add_tip("Snapshot code: %s" % snapshot.get_code()) #table.add_cell(snapshot.get_code() ) #if snapshot.is_current(): # current = IconWdg("current", IconWdg.CURRENT) # table.add_cell(current) #else: # table.add_blank_cell() # handle subreferences has_subreferences = True xml = snapshot.get_xml_value("snapshot") refs = xml.get_nodes("snapshot/file/ref") if my.mode == "output" and refs: table.add_row() td = table.add_cell() swap = SwapDisplayWdg.get_triangle_wdg() td.add(swap) td.add("[ %s reference(s)" % len(refs)) #td.add_style("text-align: right") sub_ref_wdg = SubRefWdg() sub_ref_wdg.set_info(snapshot, my.session, namespace) swap.add_action_script( sub_ref_wdg.get_on_script(), "toggle_display('%s')" % sub_ref_wdg.get_top_id()) status = sub_ref_wdg.get_overall_status() td.add(SpanWdg(VersionWdg.get(status), css='small_left')) td.add(']') td.add(sub_ref_wdg) td.add_style('padding-left: 10px') #else: if not snapshots: table.add_row() table.add_blank_cell() table.add_cell("(---)") return table
def get_viewer(self): top = DivWdg(css='spt_single_note_viewer_top') # draw checkbox options swap = SwapDisplayWdg() title = SpanWdg('context') title.add_color('color','color') div = DivWdg(css='spt_context_cb') div.add_color('color','color') SwapDisplayWdg.create_swap_title(title, swap, div, is_open=False) checkbox_name = 'split_screen' checked_process_names = [] if self.show_context: top.add(swap) top.add(title) top.add(div) #checkbox_name = 'note_context_cb' checkbox_name = self.checkbox_name cb = CheckboxWdg(checkbox_name) cb.persistence = True cb.persistence_obj = cb checked_process_names = cb.get_values() for value in self.process_names: #self.checked_process_names = web.get_form_values('process_names') cb = CheckboxWdg(checkbox_name, label=value) if value in checked_process_names: self.checked_processes.append(value) # FIXME: this is very tenous. Accessing private members to # override behavior cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_single_note_viewer_top") var table_top = top.getElement('.spt_note_viewer_table'); var cbs = top.getElement('.spt_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.%s; var kwargs = { process_names: processes}; spt.input.save_selected(bvr, '%s','%s'); spt.panel.refresh(table_top, kwargs, false); ''' % (checkbox_name, checkbox_name, key) }) div.add(cb) else: web = WebContainer.get_web() checked_process_names = web.get_form_values('process_names') table_top = DivWdg(css='spt_note_viewer_table') expression = "@SOBJECT(sthpw/note['context','in','%s'])" %'|'.join(checked_process_names) table_id = 'main_table1' table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view=self.view,\ show_row_select=True, show_insert=False, state={'parent_key': self.parent_key}, inline_search=False, show_refresh=True, expression=expression ) if self.resize: from tactic.ui.container import ResizeScrollWdg inner_wdg = ResizeScrollWdg( width='500px', height='500px', scroll_bar_size_str='thick', scroll_expansion='inside' ) inner_wdg.add(table) table_top.add(inner_wdg) else: table_top.add(table) self.set_as_panel(table_top) top.add(table_top) return top
def get_display(self): if self.is_refresh: top = Widget() self.add(top) else: container = DivWdg() self.add(container) #parent = SearchKey.get_by_search_key(self.search_key) top = DivWdg() container.add(top) self.set_as_panel(top) top.add_style("margin-top: -2px") top.add_class("spt_uber_notes_top") from tactic.ui.app import HelpButtonWdg help_button = HelpButtonWdg(alias="note-sheet-widget") top.add(help_button) help_button.add_style("float: right") table_id = 'sub_table' view = 'table' span = DivWdg(css='spt_input_group') top.add(span) span.add_border() span.add_style("height: 27px") span.add_style("padding: 5px") button_div = DivWdg() span.add(button_div) button_div.add_style("float: left") button_div.add_style("margin-right: 10px") table = Table() button_div.add(table) table.add_row() from tactic.ui.widget import SingleButtonWdg refresh = SingleButtonWdg(title="Refresh", icon=IconWdg.REFRESH) table.add_cell(refresh) refresh.add_style("float: left") refresh.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var values = spt.api.Utility.get_input_values(tbody); spt.panel.refresh(top, values, false); ''' }) save = SingleButtonWdg(title="Save", icon=IconWdg.SAVE) table.add_cell(save) save.add_style("float: left") save.add_behavior( { 'type': 'click_up', 'update_current_only': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var table = top.getElement(".spt_table"); bvr.src_el = table; spt.dg_table.update_row(evt, bvr) ''' }) process = SingleButtonWdg(title="Show Processes", icon=IconWdg.PROCESS, show_arrow=True) table.add_cell(process) from tactic.ui.container import DialogWdg process_dialog = DialogWdg(display=False) span.add(process_dialog) process_dialog.set_as_activator(process) process_dialog.add_title("Processes") process_div = DivWdg() process_dialog.add(process_div) #process_div.add_style("padding: 5px") process_div.add_color("background", "background") process_div.add_color("color", "color") process_div.add_border() refresh = ActionButtonWdg(title="Refresh") refresh.add_style('margin: 0 auto 10px auto') process_div.add(refresh) refresh.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var values = spt.api.Utility.get_input_values(tbody); spt.panel.refresh(top, values, false); ''' } ) process_div.add("<hr/>") selected_process_names = [] step = 0 for idx, value in enumerate(self.process_names): checkbox_name = 'note_process_cb' if self.child_mode: selected_process_names.append(value) #break cb = CheckboxWdg(checkbox_name, label=value) cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) #cb.set_persistence() cb.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.input.save_selected(bvr, '%s','%s'); ''' % (checkbox_name, key) }) # only 1 is selected in child_mode if cb.is_checked(): selected_process_names.append(value) if idx == 0 or idx == 10 * step: # add a new inner div inner_div = self._get_inner_div() process_div.add(inner_div, 'inner%s'%step) step += 1 inner_div.add(cb) inner_div.add("<br/>") # if less than 10, make it wider if len(self.process_names) < 10: inner_div.add_style('width: 100px') # add a master private checkbox if not self.child_mode: checkbox_name = 'note_master_private_cb' cb = CheckboxWdg(checkbox_name, label='make notes private') cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var inputs = spt.api.Utility.get_inputs(tbody,'is_private'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = bvr.src_el.checked; spt.input.save_selected(bvr, '%s','%s'); '''%(checkbox_name, key) }) cb_span = DivWdg(cb, css='small') cb_span.add_styles('border-left: 1px dotted #bbb; margin-left: 10px') span.add(cb_span) main_config_view = self._get_main_config(view, selected_process_names) sobject_dict = {} # TODO: do a union all search or by order number = 1 for value in selected_process_names: search = Search('sthpw/note') search.add_filter('project_code', Project.get_project_code()) search.add_filter('context', value) search.add_filter('search_type',self.parent_search_type) search.add_filter('search_id',self.parent_search_id) search.add_order_by('timestamp desc') search.add_limit(1) sobject = search.get_sobject() if sobject: sobject_dict[value] = sobject #sobjects = search.get_sobjects() # virtual sobject for placeholder, we can put more than 1 maybe? sobject = SearchType.create('sthpw/note') edit_config = self._get_edit_config('edit', selected_process_names) edit_configs = {'sthpw/note': edit_config} Container.put("CellEditWdg:configs", edit_configs) table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view='table', config=main_config_view, aux_info={'sobjects': sobject_dict, 'parent': self.parent}, mode="simple", show_row_select=False, show_insert=False, show_commit_all=True, show_refresh='false', state={'parent_key': self.search_key} ) table.set_sobject(sobject) top.add(table) return super(NoteSheetWdg, self).get_display()
def handle_instance(my, table, instance, asset, node_name='', publish=True, allow_ref_checkin=False): # handle the case where asset is not defined if not asset: table.add_row() table.add_blank_cell() table.add_blank_cell() # FIXME: Maya specific parts = instance.split(":") instance_name = parts[0] asset_code = parts[1] if instance_name == asset_code: table.add_cell(instance_name) else: table.add_cell(instance) td = table.add_cell() td.add("< %s node >" % my.session.get_node_type(instance_name)) table.add_blank_cell() return # get the pipeline for this asset and handlers for the pipeline process_name = my.process_select.get_value() handler_hidden = my.get_handler_input(asset, process_name) pipeline = Pipeline.get_by_sobject(asset) # TEST: switch this to using node name instead, if provided if node_name: instance_node = my.session.get_node(node_name) else: instance_node = my.session.get_node(instance) if instance_node is None: return if Xml.get_attribute(instance_node, "reference") == "true": is_ref = True else: is_ref = False namespace = Xml.get_attribute(instance_node, "namespace") if not namespace: namespace = instance asset_code = asset.get_code() is_set = False if asset.get_value('asset_type', no_exception=True) in ['set', 'section']: is_set = True tr = table.add_row() if is_set: tr.add_class("group") if publish and (allow_ref_checkin or not is_ref): checkbox = CheckboxWdg("asset_instances") if is_set: checkbox = CheckboxWdg("set_instances") checkbox.set_option("value", "%s|%s|%s" % \ (namespace, asset_code, instance) ) checkbox.set_persist_on_submit() td = table.add_cell(checkbox) else: td = table.add_blank_cell() # only one will be added even if there are multiple if handler_hidden: td.add(handler_hidden) # add the thumbnail thumb = ThumbWdg() thumb.set_name("images") thumb.set_sobject(asset) thumb.set_icon_size(60) table.add_cell(thumb) info_wdg = Widget() info_wdg.add(HtmlElement.b(instance)) if not node_name: node_name = '%s - %s' % (asset_code, asset.get_name()) info_div = DivWdg(node_name) info_div.add_style('font-size: 0.8em') info_wdg.add(info_div) info_div.add(HtmlElement.br(2)) if pipeline: info_div.add(pipeline.get_code()) table.add_cell(info_wdg) # by default can't checkin references if not allow_ref_checkin and is_ref: #icon = IconWdg("error", IconWdg.ERROR) #td = table.add_cell(icon) td = table.add_cell() td.add(HtmlElement.b("Ref. instance")) ''' import_button = ProdIconButtonWdg('import') import_button.add_event('onclick', "import_instance('%s')" %instance) td.add(import_button) ''' table.add_cell(my.get_save_wdg(my.current_sobject)) elif publish: textarea = TextAreaWdg() textarea.set_persist_on_submit() textarea.set_name("%s_description" % instance) textarea.set_attr("cols", "35") textarea.set_attr("rows", "2") table.add_cell(textarea) table.add_cell(my.get_save_wdg(my.current_sobject)) else: table.add_blank_cell() table.add_blank_cell()
def get_display(my): div = DivWdg() div.add_class("spt_security") div.add_attr("id", "SecurityManagerWdg") div.add_attr("spt_class_name", Common.get_full_class_name(my) ) div.add_attr("spt_search_key", my.search_key) div.add_attr("spt_update", "true") project_div = DivWdg() project_div.add_color("background", "background") project_div.add_color("color", "color") project_div.add_style("padding: 10px") project_div.add_border() project_div.add_style("width: 300px") group = SearchKey.get_by_search_key(my.search_key) title = DivWdg() title.add_class("maq_search_bar") name = group.get_value("login_group") title.add("Global security settings for %s" % name) project_div.add(title) access_rules = group.get_xml_value("access_rules") access_manager = AccessManager() access_manager.add_xml_rules(access_rules) group = "builtin" global_default_access = "deny" list_div = DivWdg() list_div.add_style("color: #222") for item in permission_list: if item.get('group'): group_div = DivWdg() list_div.add(group_div) group_div.add_style("margin-top: 10px") group_div.add_style("font-weight: bold") group_div.add(item.get('group')) group_div.add("<hr/>") continue item_div = DivWdg() list_div.add(item_div) item_div.add_style("margin-top: 5px") key = item.get('key') item_default = item.get('default') if item_default: default_access = item_default else: default_access = global_default_access allowed = access_manager.check_access(group, key, "allow", default=default_access) checkbox = CheckboxWdg("rule") if allowed: checkbox.set_checked() checkbox.set_option("value", key) item_div.add(checkbox) item_div.add_style("color: #222") item_div.add(item.get('title') ) project_div.add(list_div) project_div.add("<hr>") #close_script = "spt.popup.close(bvr.src_el.getParent('.spt_popup'))" save_button = ActionButtonWdg(title="Save", tip="Save Security Settings") save_button.add_behavior( { "type": "click_up", "cbjs_action": "el=bvr.src_el.getParent('.spt_security');spt.panel.refresh(el);" } ) save_button.add_style("margin-left: auto") save_button.add_style("margin-right: auto") project_div.add(save_button) div.add(project_div) if my.update == "true": div.add(HtmlElement.br()) div.add(HtmlElement.b(my.description)) return div
def get_viewer(self): top = DivWdg(css='spt_note_viewer_top') # draw checkbox options swap = SwapDisplayWdg() title = SpanWdg('main context') split_div = FloatDivWdg(css='spt_split_cb') div = DivWdg(css='spt_main_context_cb') content_div = DivWdg() content_div.add_color('color','color') content_div.add_style('padding: 10px') SwapDisplayWdg.create_swap_title(title, swap, content_div, is_open=False) div.add(swap) div.add(title) checkbox_name = 'split_screen' split_cb = CheckboxWdg(checkbox_name, label='Split View') split_cb.persistence = True split_cb.persistence_obj = split_cb key = split_cb.get_key() #cb.add_style('float: left') split_cb.add_behavior({'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_note_viewer_top"); var table_top = top.getElement(".spt_note_viewer_table"); var cbs = top.getElement('.spt_main_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.note_context_cb; var kwargs = { process_names: processes}; if (bvr.src_el.checked) { kwargs.split_view = 'true'; kwargs.show_context = 'true'; kwargs.left_process_names = processes; kwargs.right_process_names = processes; } spt.input.save_selected(bvr, '%s','%s'); spt.app_busy.show("Note Viewer", 'Loading') ; setTimeout(function(){ spt.panel.refresh(table_top, kwargs, false); if (bvr.src_el.checked) spt.hide(cbs); else spt.show(cbs); spt.app_busy.hide(); }, 50 ); ''' % ( checkbox_name, key) }) split_div.add(split_cb) top.add(split_div) top.add(div) div.add(content_div) top.add(HtmlElement.br()) checkbox_name = 'note_main_context_cb' cb = CheckboxWdg(checkbox_name) cb.persistence = True cb.persistence_obj = cb self.checked_process_names = cb.get_values() for value in self.process_names: #self.checked_process_names = web.get_form_values('process_names') cb = CheckboxWdg(checkbox_name, label=value) if value in self.checked_process_names: self.checked_processes.append(value) # FIXME: this is very tenous. Accessing private members to # override behavior cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_note_viewer_top") var table_top = top.getElement('.spt_note_viewer_table'); var cbs = top.getElement('.spt_main_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.note_main_context_cb; var kwargs = { process_names: processes}; spt.input.save_selected(bvr, '%s','%s'); spt.panel.refresh(table_top, kwargs, false); ''' % (checkbox_name, key) }) content_div.add(cb) table_top = DivWdg(css='spt_note_viewer_table') expression = "@SOBJECT(sthpw/note['context','in','%s'])" %'|'.join(self.checked_processes) if split_cb.is_checked(): table = self.get_split_viewer() else: table_id = 'main_table1' table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view=self.view,\ show_row_select=True, show_insert=False, state={'parent_key': self.parent_key}, inline_search=False, show_refresh=True, expression=expression ) self.set_as_panel(table_top) table_top.add_style('float: left') top.add(table_top) table_top.add(table) return top
class ArtistViewWdg(SpanWdg): def init(self): self.add("Show assigned only: ") self.checkbox = CheckboxWdg("show_assigned_only") self.checkbox.set_option("value", "on") self.checkbox.set_persistence() self.checkbox.add_event("onclick", "document.form.submit()") self.add(self.checkbox) self.add_class("med") def is_supervisor(self): # if the user is a supervisor, look at all of the assets project = Project.get_project_name() security = Environment.get_security() return security.check_access("prod/%s" % project, "model/supervisor", "true") def is_artist(self): # if the user is a artist, look at all of the assets project = Project.get_project_name() security = Environment.get_security() return security.check_access("prod/%s" % project, "model/artist", "true") def alter_search(self, search): # get all of the relevant tasks to the user task_search = Search("sthpw/task") task_search.add_column("search_id") # only look at this project project = Project.get_project_name() task_search.add_filter("search_type", search.get_search_type()) # figure out who the user is security = Environment.get_security() login = security.get_login() user = login.get_value("login") print "is_artist: ", self.is_artist() print "is_supervisor: ", self.is_supervisor() # do some filtering web = WebContainer.get_web() show_assigned_only = self.checkbox.get_value() show_process = web.get_form_values("process") if not show_process or show_process[0] == '': show_process = [] show_task_status = web.get_form_values("task_status") if not show_task_status or show_task_status[0] == '': show_task_status = [] if show_assigned_only == "on": task_search.add_filter("assigned", user) if show_process: where = "process in (%s)" % ", ".join( ["'%s'" % x for x in show_process] ) task_search.add_where(where) if show_task_status: where = "status in (%s)" % ", ".join( ["'%s'" % x for x in show_task_status] ) task_search.add_where(where) else: task_search.add_where("NULL") # record the tasks self.tasks = task_search.get_sobjects() # get all of the sobject ids sobject_ids = ["'%s'" % x.get_value("search_id") for x in self.tasks] # get all of the sobjects related to this task if sobject_ids: search.add_where( "id in (%s)" % ", ".join(sobject_ids) )
def get_display(self): search_key = self.kwargs.get("search_key") path = self.kwargs.get("path") parser_str = self.kwargs.get("parser") use_tactic_tags = self.kwargs.get("use_tactic_tags") from pyasm.checkin import BaseMetadataParser #parser_str = "EXIF" if parser_str: parser = BaseMetadataParser.get_parser(parser_str, path) else: parser = BaseMetadataParser.get_parser_by_path(path) if parser: if use_tactic_tags in ['true', True]: metadata = parser.get_tactic_metadata() else: metadata = parser.get_metadata() else: metadata = {} parser_title = parser.get_title() top = self.top top.add_color("background", "background") top.add_class("spt_metadata_top") shelf = DivWdg() top.add(shelf) from tactic.ui.widget import ActionButtonWdg button = ActionButtonWdg(title="Add Selected to Keywords", width="200") shelf.add(button) shelf.add_style("margin: 10px 0px") button.add_behavior( { 'search_key': search_key, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_metadata_top"); var values = spt.api.get_input_values(top, null, true); var searchables = values.searchable; var items = []; for (var i = 0; i < searchables.length; i++) { if (searchables[i] == "") { continue; } items.push(searchables[i]); } var server = TacticServerStub.get(); var class_name = 'spt.modules.workflow.AssetAddMetadataToKeywordsCmd'; var kwargs = { search_key: bvr.search_key, items: items, }; server.p_execute_cmd(class_name, kwargs) .then( function() { spt.api.clear_inputs(top); spt.notify.show_message("Added Keywords"); } ) ''' } ) table = Table() table.add_style("width: 100%") #table.add_style("table-layout: fixed") top.add(table) table.set_unique_id() table.add_smart_styles("spt_cell", { 'padding': '3px' } ) tr, td = table.add_row_cell() td.add(parser_title) td.add_style("height: 20px") td.add_style("font-weight: bold") td.add_style("padding: 5px 3px") td.add_color("background", "background", -5) border_color = td.get_color("border") td.add_color("border-bottom", "solid 1px %s" % border_color) tr.add_class("tactic_hover") """ tr = table.add_row() tr.add_color("background", "background", -5) th = table.add_header("Property") th.add_style("min-width: 200px") th.add_style("padding: 5px") th = table.add_header("Value") #th.add_style("min-width: 400px") th.add_style("padding: 5px") """ keys = metadata.get("__keys__") if not keys: keys = metadata.keys() empty = False if not keys: empty = True keys = ['','','','','','',''] table.add_smart_styles("spt_cell", { 'height': '20px' } ) keys.sort() for i, key in enumerate(keys): value = metadata.get(key) value = Common.process_unicode_string(value) if not isinstance(key, basestring): key = str(key) #title = Common.get_display_title(key) title = key tr = table.add_row() tr.add_class("tactic_hover") if i % 2: tr.add_color("background", "background", -2) tr.add_color("color", "color") else: tr.add_color("background", "background") tr.add_color("color", "color") td = table.add_cell() td.add_class("spt_cell") td.add(title) td.add_style("width: 300px") td.add_style("min-width: 200px") td = table.add_cell() td.add_class("spt_cell") if len(str(value)) > 500: inside = DivWdg() td.add(inside) value = value[:500] inside.add(value) inside.add_style("max-width: 600px") else: td.add(value) td.add_style("max-width: 600px") td.add_style("overflow: hidden") td.add_style("text-overflow: ellipsis") td.add_style("white-space: nowrap") td = table.add_cell() td.add_class("spt_cell") try: is_ascii = True for c in str(value): if ord(c) > 128: is_ascii = False break if not is_ascii: continue except Exception as e: print("WARNING: ", e) continue from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg("searchable") checkbox.add_attr("spt_is_multiple", "true") td.add(checkbox) td.add_style("width: 40px") td.add_style("max-width: 30px") checkbox.set_option("value", "%s|%s|%s" % (parser_title,key,value)) if empty: div = DivWdg() top.add(div) div.add_style("height: 30px") div.add_style("width: 150px") div.add_style("margin-top: -110px") div.center() div.add("<b>No Metadata</b>") div.add_border() div.add_color("background", "background3") div.add_color("color", "color3") div.add_style("padding: 20px") div.add_style("text-align: center") top.add_style("min-height: 200px") return top
def get_display(self): search_key = self.kwargs.get("search_key") path = self.kwargs.get("path") parser_str = self.kwargs.get("parser") use_tactic_tags = self.kwargs.get("use_tactic_tags") from pyasm.checkin import BaseMetadataParser #parser_str = "EXIF" if parser_str: parser = BaseMetadataParser.get_parser(parser_str, path) else: parser = BaseMetadataParser.get_parser_by_path(path) if parser: if use_tactic_tags in ['true', True]: metadata = parser.get_tactic_metadata() else: metadata = parser.get_metadata() else: metadata = {} parser_title = parser.get_title() top = self.top top.add_color("background", "background") top.add_class("spt_metadata_top") shelf = DivWdg() top.add(shelf) from tactic.ui.widget import ActionButtonWdg button = ActionButtonWdg(title="Add Selected to Keywords", width="200") shelf.add(button) shelf.add_style("margin: 10px 0px") button.add_behavior({ 'search_key': search_key, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_metadata_top"); var values = spt.api.get_input_values(top, null, true); var searchables = values.searchable; var items = []; for (var i = 0; i < searchables.length; i++) { if (searchables[i] == "") { continue; } items.push(searchables[i]); } var server = TacticServerStub.get(); var class_name = 'spt.modules.workflow.AssetAddMetadataToKeywordsCmd'; var kwargs = { search_key: bvr.search_key, items: items, }; server.p_execute_cmd(class_name, kwargs) .then( function() { spt.api.clear_inputs(top); spt.notify.show_message("Added Keywords"); } ) ''' }) table = Table() table.add_style("width: 100%") #table.add_style("table-layout: fixed") top.add(table) table.set_unique_id() table.add_smart_styles("spt_cell", {'padding': '3px'}) tr, td = table.add_row_cell() td.add(parser_title) td.add_style("height: 20px") td.add_style("font-weight: bold") td.add_style("padding: 5px 3px") td.add_color("background", "background", -5) border_color = td.get_color("border") td.add_color("border-bottom", "solid 1px %s" % border_color) tr.add_class("tactic_hover") """ tr = table.add_row() tr.add_color("background", "background", -5) th = table.add_header("Property") th.add_style("min-width: 200px") th.add_style("padding: 5px") th = table.add_header("Value") #th.add_style("min-width: 400px") th.add_style("padding: 5px") """ keys = metadata.get("__keys__") if not keys: keys = metadata.keys() empty = False if not keys: empty = True keys = ['', '', '', '', '', '', ''] table.add_smart_styles("spt_cell", {'height': '20px'}) keys.sort() for i, key in enumerate(keys): value = metadata.get(key) value = Common.process_unicode_string(value) if not isinstance(key, basestring): key = str(key) #title = Common.get_display_title(key) title = key tr = table.add_row() tr.add_class("tactic_hover") if i % 2: tr.add_color("background", "background", -2) tr.add_color("color", "color") else: tr.add_color("background", "background") tr.add_color("color", "color") td = table.add_cell() td.add_class("spt_cell") td.add(title) td.add_style("width: 300px") td.add_style("min-width: 200px") td = table.add_cell() td.add_class("spt_cell") if len(str(value)) > 500: inside = DivWdg() td.add(inside) value = value[:500] inside.add(value) inside.add_style("max-width: 600px") else: td.add(value) td.add_style("max-width: 600px") td.add_style("overflow: hidden") td.add_style("text-overflow: ellipsis") td.add_style("white-space: nowrap") td = table.add_cell() td.add_class("spt_cell") try: is_ascii = True for c in str(value): if ord(c) > 128: is_ascii = False break if not is_ascii: continue except Exception as e: print("WARNING: ", e) continue from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg("searchable") checkbox.add_attr("spt_is_multiple", "true") td.add(checkbox) td.add_style("width: 40px") td.add_style("max-width: 30px") checkbox.set_option("value", "%s|%s|%s" % (parser_title, key, value)) if empty: div = DivWdg() top.add(div) div.add_style("height: 30px") div.add_style("width: 150px") div.add_style("margin-top: -110px") div.center() div.add("<b>No Metadata</b>") div.add_border() div.add_color("background", "background3") div.add_color("color", "color3") div.add_style("padding: 20px") div.add_style("text-align: center") top.add_style("min-height: 200px") return top
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_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("padding: 10px") top.add_style("min-width: 400px") from tactic.ui.app import HelpButtonWdg help_wdg = HelpButtonWdg(alias="exporting-csv-data") top.add(help_wdg) help_wdg.add_style("float: right") help_wdg.add_style("margin-top: -3px") if not my.check(): top.add(DivWdg('Error: %s' %my.error_msg)) top.add(HtmlElement.br(2)) return super(CsvExportWdg, my).get_display() if my.search_type_list and my.search_type_list[0] != my.search_type: st = SearchType.get(my.search_type_list[0]) title_div =DivWdg('Exporting related items [%s]' % st.get_title()) top.add(title_div) top.add(HtmlElement.br()) my.search_type = my.search_type_list[0] my.view = my.related_view if my.mode != 'export_all': num = len(my.selected_search_keys) else: search = Search(my.search_type) num = search.get_count() msg_div = DivWdg('Total: %s items to export'% num) msg_div.add_style("font-size: 12px") msg_div.add_style("font-weight: bold") msg_div.add_style('margin-left: 4px') top.add(msg_div) if num > 300: msg_div.add_behavior({'type':'load', 'cbjs_action': "spt.alert('%s items are about to be exported. It may take a while.')" %num}) top.add(HtmlElement.br()) div = DivWdg(css='spt_csv_export', id='csv_export_action') div.add_color("background", "background", -10) div.add_style("padding: 10px") div.add_style("margin: 5px") div.add_styles('max-height: 350px; overflow: auto') table = Table( css='minimal') table.add_color("color", "color") div.add(table) table.set_id('csv_export_table') table.center() cb_name = 'csv_column_name' master_cb = CheckboxWdg('master_control') master_cb.set_checked() master_cb.add_behavior({'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var inputs = spt.api.Utility.get_inputs(bvr.src_el.getParent('.spt_csv_export'),'%s'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = !inputs[i].checked; ''' %cb_name}) span = SpanWdg('Select Columns To Export') span.add_style('font-weight','600') table.add_row_cell(span) table.add_row_cell(HtmlElement.br()) tr = table.add_row() tr.add_style('border-bottom: 1px groove #777') td = table.add_cell(master_cb) label = HtmlElement.i('toggle all') label.add_style('color: #888') table.add_cell(label) col1 = table.add_col() col1.add_style('width: 35px') col2 = table.add_col() if not my.search_type or not my.view: return table # use overriding element names and derived titles if available config = WidgetConfigView.get_by_search_type(my.search_type, my.view) if my.element_names and config: filtered_columns = my.element_names titles = [] for name in my.element_names: title = config.get_element_title(name) titles.append(title) else: # excluding FunctionalTableElement filtered_columns = [] titles = [] if not config: columns = search.get_columns() filtered_columns = columns titles = ['n/a'] * len(filtered_columns) else: columns = config.get_element_names() filtered_columns = columns titles = config.get_element_titles() """ # commented out until it is decided 2.5 widgets will # use this class to differentiate between reg and functional element from pyasm.widget import FunctionalTableElement for column in columns: widget = config.get_display_widget(column) if isinstance(widget, FunctionalTableElement): continue filtered_columns.append(column) """ for idx, column in enumerate(filtered_columns): table.add_row() cb = CheckboxWdg(cb_name) cb.set_option('value', column) cb.set_checked() table.add_cell(cb) title = titles[idx] table.add_cell('<b>%s</b> (%s) '%(title, column)) action_div = DivWdg() widget = DivWdg() table.add_row_cell(widget) widget.add_style("margin: 20px 0 10px 0px") cb = CheckboxWdg('include_id', label=" Include ID") cb.set_default_checked() widget.add(cb) hint = HintWdg('To update entries with specific ID later, please check this option. For new inserts in this or other table later on, uncheck this option.') widget.add(hint) label = string.capwords(my.mode.replace('_', ' ')) button = ActionButtonWdg(title=label) is_export_all = my.mode == 'export_all' button.add_behavior({ 'type': "click_up", 'cbfn_action': 'spt.dg_table_action.csv_export', 'element': 'csv_export', 'column_names': 'csv_column_name', 'search_type': my.search_type, 'view': my.view, 'search_keys' : my.selected_search_keys, 'is_export_all' : is_export_all }) my.close_action = "var popup = bvr.src_el.getParent('.spt_popup');spt.popup.close(popup)" if my.close_action: close_button = ActionButtonWdg(title='Close') close_button.add_behavior({ 'type': "click", 'cbjs_action': my.close_action }) table = Table() action_div.add(table) table.center() table.add_row() td = table.add_cell(button) td.add_style("width: 130px") table.add_cell(close_button) action_div.add("<br clear='all'/>") top.add(div) top.add(HtmlElement.br()) top.add(action_div) return top
def get_display(my): my.init_kwargs() sobject = my.get_current_sobject() table = Table(css='minimal') table.add_color("color", "color") table.add_style("font-size: 0.9em") snapshots = my.get_snapshot(my.mode) for snapshot in snapshots: table.add_row() value = my.get_input_value(sobject, snapshot) current_version = snapshot.get_value("version") current_context = snapshot.get_value("context") current_revision = snapshot.get_value("revision", no_exception=True) current_snapshot_type = snapshot.get_value("snapshot_type") # hack hard coded type translation if current_snapshot_type == "anim_export": current_snapshot_type = "anim" # ignore icon context completely if current_context == "icon": table.add_blank_cell() table.add_cell("(---)") return table checkbox = CheckboxWdg('%s_%s' %(my.search_type, my.CB_NAME)) # this is added back in for now to work with 3.7 Fast table checkbox.add_behavior({'type': 'click_up', 'propagate_evt': True}) checkbox.add_class('spt_latest_%s' %my.mode) checkbox.set_option("value", value ) table.add_cell( checkbox ) load_all = False if load_all: checkbox.set_checked() # add the file type icon xml = snapshot.get_snapshot_xml() file_name = xml.get_value("snapshot/file/@name") icon_link = ThumbWdg.find_icon_link(file_name) image = HtmlElement.img(icon_link) image.add_style("width: 15px") table.add_cell(image) namespace = my.get_namespace(sobject, snapshot) asset_code = my.get_asset_code() # force asset mode = True my.session.set_asset_mode(asset_mode=my.get_session_asset_mode()) node_name = my.get_node_name(snapshot, asset_code, namespace) # get session info session_context = session_version = session_revision = None if my.session: session_context = my.session.get_context(node_name, asset_code, current_snapshot_type) session_version = my.session.get_version(node_name, asset_code, current_snapshot_type) session_revision = my.session.get_revision(node_name, asset_code,current_snapshot_type) # Maya Specific: try with namespace in front of it for referencing referenced_name = '%s:%s' %(namespace, node_name) if not session_context or not session_version: session_context = my.session.get_context(referenced_name, asset_code, current_snapshot_type) session_version = my.session.get_version(referenced_name, asset_code, current_snapshot_type) session_revision = my.session.get_revision(referenced_name, asset_code, current_snapshot_type) from version_wdg import CurrentVersionContextWdg, SubRefWdg version_wdg = CurrentVersionContextWdg() data = {'session_version': session_version, \ 'session_context': session_context, \ 'session_revision': session_revision, \ 'current_context': current_context, \ 'current_version': current_version, \ 'current_revision': current_revision } version_wdg.set_options(data) table.add_cell(version_wdg, "no_wrap") td = table.add_cell(HtmlElement.b("(%s)" %current_context)) td.add_tip("Snapshot code: %s" % snapshot.get_code()) #table.add_cell(snapshot.get_code() ) #if snapshot.is_current(): # current = IconWdg("current", IconWdg.CURRENT) # table.add_cell(current) #else: # table.add_blank_cell() # handle subreferences has_subreferences = True xml = snapshot.get_xml_value("snapshot") refs = xml.get_nodes("snapshot/file/ref") if my.mode == "output" and refs: table.add_row() td = table.add_cell() swap = SwapDisplayWdg.get_triangle_wdg() td.add(swap) td.add("[ %s reference(s)" % len(refs)) #td.add_style("text-align: right") sub_ref_wdg = SubRefWdg() sub_ref_wdg.set_info(snapshot, my.session, namespace) swap.add_action_script( sub_ref_wdg.get_on_script(), "toggle_display('%s')" % sub_ref_wdg.get_top_id() ) status = sub_ref_wdg.get_overall_status() td.add(SpanWdg(VersionWdg.get(status), css='small_left')) td.add(']') td.add( sub_ref_wdg ) td.add_style('padding-left: 10px') #else: if not snapshots: table.add_row() table.add_blank_cell() table.add_cell("(---)") return table
def init(my): my.item_cls = my.kwargs.get('left_search_type') my.container_cls = my.kwargs.get('right_search_type') my.grouping_cls = my.kwargs.get('search_type') my.item_sobj = my.container_sobj = None # List the items search = Search(my.item_cls) my._order_search(search) items = search.get_sobjects() if items: my.item_sobj = items[0] #select = MultiSelectWdg("item_ids") #select.set_search_for_options(search,"login", "get_full_name()") user_span = SpanWdg(css='med') user_table = Table(css='table') user_table.add_style("margin-left: 6px") user_table.set_max_width() user_table.add_col(css='small') user_table.add_col() user_table.add_style("min-width: 14em") user_table.add_row_cell(search.get_search_type_obj()\ .get_description(), "heading") for item in items: user_table.add_row() checkbox = CheckboxWdg("item_ids") checkbox.set_option("value", item.get_primary_key_value() ) user_table.add_cell( checkbox ) project_code = item.get_value("project_code", no_exception=True) if project_code: user_table.add_cell( "[ %s ]" % project_code ) else: user_table.add_cell( "[ * ]" ) user_table.add_cell( item.get_description() ) user_span.add(user_table) # control widget in the middle control_div = DivWdg() control_div.add_style('padding: 100px 10px 0 10px') button = IconSubmitWdg(my.ADD_LABEL, "stock_insert-slide.png", True) button.add_style('padding: 2px 30px 4px 30px') control_div.add(button) main_table = Table(css='collapse') main_table.set_max_width() main_table.add_row(css='plain_bg') main_table.add_cell(user_span, 'valign_top') td = main_table.add_cell(control_div, 'valign_top') td.add_style('width','12em') main_table.add_cell(my._get_target_span(), 'valign_top') my.add(main_table) # register command here if my.item_sobj and my.container_sobj: marshaller = WebContainer.register_cmd("pyasm.widget.SObjectGroupCmd") marshaller.set_option("grouping_search_type", my.grouping_cls) marshaller.set_option("item_foreign_key", my.item_sobj.get_foreign_key()) marshaller.set_option("container_foreign_key", my.container_sobj.get_foreign_key())
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_display(self): self.check() if self.is_refresh: div = Widget() else: div = DivWdg() self.set_as_panel(div) div.add_style('padding','6px') min_width = '400px' div.add_style('min-width', min_width) div.add_color('background','background') div.add_class('spt_add_task_panel') div.add_style("padding: 20px") from tactic.ui.app import HelpButtonWdg help_button = HelpButtonWdg(alias="creating-tasks") div.add(help_button) help_button.add_style("float: right") help_button.add_style("margin-top: -5px") if not self.search_key_list: msg_div = DivWdg() msg_table = Table() msg_div.add(msg_table) msg_table.add_row() msg_table.add_cell( IconWdg("No items selected", IconWdg.WARNING) ) msg_table.add_cell('Please select at least 1 item to add tasks to.') msg_div.add_style('margin: 10px') msg_table.add_style("font-weight: bold") div.add(msg_div) return div msg_div = DivWdg() msg_div.add_style('margin-left: 4px') div.add(msg_div, 'info') msg_div.add('Total: %s item/s to add tasks to' %len(self.search_key_list)) div.add(HtmlElement.br()) hint = HintWdg('Tasks are added according to the assigned pipeline.') msg_div.add(" ") msg_div.add(hint) msg_div.add(HtmlElement.br()) option_div = DivWdg(css='spt_ui_options') #option_div.add_style('margin-left: 12px') sel = SelectWdg('pipeline_mode', label='Create tasks by: ') sel.set_option('values', ['simple process','context', 'standard']) sel.set_option('labels', ['process','context', 'all contexts in process']) sel.set_persistence() sel.add_behavior({'type':'change', 'cbjs_action': 'spt.panel.refresh(bvr.src_el)'}) option_div.add(sel) value = sel.get_value() # default to simple process if not value: value = 'simple process' msg = '' if value not in ['simple process','context','standard']: value = 'simple process' if value == 'context': msg = 'In context mode, a single task will be created for each selected context.' elif value == 'simple process': msg = 'In process mode, a single task will be created for each selected process.' elif value == 'standard': msg = 'In this mode, a task will be created for all contexts of each selected process.' option_div.add(HintWdg(msg)) div.add(option_div) div.add(HtmlElement.br()) title = DivWdg('Assigned Pipelines') title.add_style('padding: 6px') title.add_color('background','background2') title.add_color('color','color', +120) div.add(title) content_div = DivWdg() content_div.add_style('min-height', '150px') div.add(content_div) content_div.add_border() filtered_search_key_list = [] for sk in self.search_key_list: id = SearchKey.extract_id(sk) if id=='-1': continue filtered_search_key_list.append(sk) sobjects = SearchKey.get_by_search_keys(filtered_search_key_list) skipped = [] pipeline_codes = [] for sobject in sobjects: if isinstance(sobject, Task): msg_div = DivWdg('WARNING: Creation of task for [Task] is not allowed.') msg_div.add_style('margin-left: 10px') div.add(msg_div, 'info') return div pipeline_code = sobject.get_value('pipeline_code', no_exception=True) if not pipeline_code: skipped.append(sobject) if pipeline_code not in pipeline_codes: pipeline_codes.append(pipeline_code) pipelines = Search.get_by_code('sthpw/pipeline', pipeline_codes) if pipelines == None: pipelines = [] #if not pipelines: # msg_div = DivWdg('WARNING: No Pipelines found for selected.') # msg_div.add_style('margin-left: 10px') # div.add(msg_div, 'info') # return div # expand the width according to num of pipelines content_div.add_style('min-width', len(pipelines)*250) mode_cb = SelectWdg('pipeline_mode') mode_cb.set_persistence() mode = mode_cb.get_value() if 'context' == mode: mode = 'context' else: mode = 'process' show_subpipeline = True min_height = '150px' # create a temp default pipeline if not pipelines: pipeline = SearchType.create("sthpw/pipeline") pipeline.set_value("code", "__default__") pipeline.set_value("pipeline", ''' <pipeline> <process name='publish'/> </pipeline> ''') # FIXME: HACK to initialize virtual pipeline pipeline.set_pipeline(pipeline.get_value("pipeline")) pipelines = [pipeline] for pipeline in pipelines: name = pipeline.get_value("name") if not name: name = pipeline.get_code() span = SpanWdg("Pipeline: %s" % name) span.add_style('font-weight: bold') v_div = FloatDivWdg(span) v_div.add_style('margin: 20px') v_div.add_style('min-height', min_height) v_div.add(HtmlElement.br(2)) content_div.add(v_div) processes = pipeline.get_processes(recurse=show_subpipeline, type=['manual','approval']) cb_name = '%s|task_process' %pipeline.get_code() master_cb = CheckboxWdg('master_control') master_cb.set_checked() master_cb.add_behavior({'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var inputs = spt.api.Utility.get_inputs(bvr.src_el.getParent('.spt_add_task_panel'),'%s'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = bvr.src_el.checked; ''' %cb_name}) toggle_div = DivWdg() toggle_div.add(SpanWdg(master_cb, css='small')) label = HtmlElement.i('toggle all') label.add_style('color: #888') toggle_div.add_styles('border-bottom: 1px solid #888; width: 170px') toggle_div.add(label) v_div.add(toggle_div) process_names = [] for process in processes: process_labels = [] if process.is_from_sub_pipeline(): process_name = process.get_full_name() else: process_name = process.get_name() process_label = process.get_label() if not process_label: process_label = '' if mode =='context': contexts = pipeline.get_output_contexts(process.get_name()) labels = contexts if process.is_from_sub_pipeline(): labels = ['%s/%s'%(process.parent_pipeline_code, x) for x in contexts] for x in labels: process_labels.append(process_label) # prepend process to contexts in this mode to ensure uniqueness contexts = ['%s:%s' %(process_name, x) for x in contexts] else: contexts = [process_name] labels = contexts process_labels.append(process_label) for idx, context in enumerate(contexts): cb = CheckboxWdg(cb_name) cb.set_checked() cb.set_option('value', context) v_div.add(SpanWdg(cb, css='small')) if mode == 'context': span = SpanWdg(process_name, css='med') #span.add_color('color','color') v_div.add(span) v_div.add(SpanWdg(labels[idx])) process_label = process_labels[idx] if process_label: v_div.add(SpanWdg("(%s)" %process_label, css='small')) v_div.add(HtmlElement.br()) content_div.add("<br clear='all'/>") skipped = [] if True: div.add("<br/>") btn = ActionButtonWdg(title='Add Tasks') btn.add_behavior({'type' : 'click_up', 'post_event': 'search_table_%s'% self.table_id, 'cbjs_action': ''' spt.dg_table.add_task_selected(bvr); ''', 'search_key_list': self.search_key_list }) cb = CheckboxWdg('skip_duplicated', label='Skip Duplicates') cb.set_checked() option_div =DivWdg(cb) option_div.add_style('width', '130px') option_div.add_style('align: left') div.add(option_div) div.add(HtmlElement.br()) btn.add_style("float: right") div.add(btn) div.add(HtmlElement.br(clear="all")) if skipped: content_div.add(HtmlElement.br()) skip_div = DivWdg('Missing pipeline code (Skipped)') skip_div.add_style('text-decoration: underline') content_div.add(skip_div) content_div.add(HtmlElement.br()) item_div = DivWdg() item_div.add_style('margin-left: 10px') content_div.add(item_div) for skip in skipped: item_div.add(skip.get_code()) item_div.add(HtmlElement.br()) return div
def get_display(my): div = DivWdg() div.add_class("spt_security") div.add_attr("id", "SecurityManagerWdg") div.add_attr("spt_class_name", Common.get_full_class_name(my) ) div.add_attr("spt_search_key", my.search_key) div.add_attr("spt_update", "true") project_div = DivWdg() project_div.add_color("background", "background") project_div.add_color("color", "color") project_div.add_style("padding: 10px") project_div.add_border() project_div.add_style("width: 300px") group = SearchKey.get_by_search_key(my.search_key) title = DivWdg() title.add_class("maq_search_bar") name = group.get_value("login_group") title.add("Global security settings for %s" % name) project_div.add(title) access_rules = group.get_xml_value("access_rules") access_manager = AccessManager() access_manager.add_xml_rules(access_rules) access_level = group.get_access_level() project_code = group.get_value('project_code') if project_code: project_codes = set(project_code) else: project_codes = set() xml = LoginGroup.get_default_access_rule(access_level, project_codes) access_manager.add_xml_rules(xml) group = "builtin" global_default_access = "deny" list_div = DivWdg() list_div.add_style("color: #222") for item in permission_list: if item.get('group'): group_div = DivWdg() list_div.add(group_div) group_div.add_style("margin-top: 10px") group_div.add_style("font-weight: bold") group_div.add(item.get('group')) group_div.add("<hr/>") continue item_div = DivWdg() list_div.add(item_div) item_div.add_style("margin-top: 5px") key = item.get('key') item_default = item.get('default') if item_default: default_access = item_default else: default_access = global_default_access allowed = access_manager.check_access(group, key, "allow", default=default_access) checkbox = CheckboxWdg("rule") if allowed: checkbox.set_checked() checkbox.set_option("value", key) item_div.add(checkbox) item_div.add_style("color: #222") item_div.add(item.get('title') ) project_div.add(list_div) project_div.add("<hr>") #close_script = "spt.popup.close(bvr.src_el.getParent('.spt_popup'))" save_button = ActionButtonWdg(title="Save", tip="Save Security Settings") save_button.add_behavior( { "type": "click_up", "cbjs_action": "el=bvr.src_el.getParent('.spt_security');spt.panel.refresh(el);" } ) save_button.add_style("margin-left: auto") save_button.add_style("margin-right: auto") project_div.add(save_button) div.add(project_div) if my.update == "true": div.add(HtmlElement.br()) div.add(HtmlElement.b(my.description)) return div
def handle_instance(my, table, instance, asset, node_name='', publish=True, allow_ref_checkin=False): # handle the case where asset is not defined if not asset: table.add_row() table.add_blank_cell() table.add_blank_cell() # FIXME: Maya specific parts = instance.split(":") instance_name = parts[0] asset_code = parts[1] if instance_name == asset_code: table.add_cell(instance_name) else: table.add_cell(instance) td = table.add_cell() td.add("< %s node >" % my.session.get_node_type(instance_name)) table.add_blank_cell() return # get the pipeline for this asset and handlers for the pipeline process_name = my.process_select.get_value() handler_hidden = my.get_handler_input(asset, process_name) pipeline = Pipeline.get_by_sobject(asset) # TEST: switch this to using node name instead, if provided if node_name: instance_node = my.session.get_node(node_name) else: instance_node = my.session.get_node(instance) if instance_node is None: return if Xml.get_attribute(instance_node,"reference") == "true": is_ref = True else: is_ref = False namespace = Xml.get_attribute(instance_node, "namespace") if not namespace: namespace = instance asset_code = asset.get_code() is_set = False if asset.get_value('asset_type', no_exception=True) in ['set','section']: is_set = True tr = table.add_row() if is_set: tr.add_class("group") if publish and (allow_ref_checkin or not is_ref): checkbox = CheckboxWdg("asset_instances") if is_set: checkbox = CheckboxWdg("set_instances") checkbox.set_option("value", "%s|%s|%s" % \ (namespace, asset_code, instance) ) checkbox.set_persist_on_submit() td = table.add_cell(checkbox) else: td = table.add_blank_cell() # only one will be added even if there are multiple if handler_hidden: td.add(handler_hidden) # add the thumbnail thumb = ThumbWdg() thumb.set_name("images") thumb.set_sobject(asset) thumb.set_icon_size(60) table.add_cell(thumb) info_wdg = Widget() info_wdg.add(HtmlElement.b(instance)) if not node_name: node_name = '%s - %s' %(asset_code, asset.get_name()) info_div = DivWdg(node_name) info_div.add_style('font-size: 0.8em') info_wdg.add(info_div) info_div.add(HtmlElement.br(2)) if pipeline: info_div.add(pipeline.get_code()) table.add_cell(info_wdg) # by default can't checkin references if not allow_ref_checkin and is_ref: #icon = IconWdg("error", IconWdg.ERROR) #td = table.add_cell(icon) td = table.add_cell() td.add(HtmlElement.b("Ref. instance")) ''' import_button = ProdIconButtonWdg('import') import_button.add_event('onclick', "import_instance('%s')" %instance) td.add(import_button) ''' table.add_cell(my.get_save_wdg(my.current_sobject) ) elif publish: textarea = TextAreaWdg() textarea.set_persist_on_submit() textarea.set_name("%s_description" % instance) textarea.set_attr("cols", "35") textarea.set_attr("rows", "2") table.add_cell(textarea) table.add_cell(my.get_save_wdg(my.current_sobject) ) else: table.add_blank_cell() table.add_blank_cell()
def get_viewer(my): top = DivWdg(css='spt_single_note_viewer_top') # draw checkbox options swap = SwapDisplayWdg() title = SpanWdg('context') title.add_color('color', 'color') div = DivWdg(css='spt_context_cb') div.add_color('color', 'color') SwapDisplayWdg.create_swap_title(title, swap, div, is_open=False) checkbox_name = 'split_screen' checked_process_names = [] if my.show_context: top.add(swap) top.add(title) top.add(div) #checkbox_name = 'note_context_cb' checkbox_name = my.checkbox_name cb = CheckboxWdg(checkbox_name) cb.persistence = True cb.persistence_obj = cb checked_process_names = cb.get_values() for value in my.process_names: #my.checked_process_names = web.get_form_values('process_names') cb = CheckboxWdg(checkbox_name, label=value) if value in checked_process_names: my.checked_processes.append(value) # FIXME: this is very tenous. Accessing private members to # override behavior cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_single_note_viewer_top") var table_top = top.getElement('.spt_note_viewer_table'); var cbs = top.getElement('.spt_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.%s; var kwargs = { process_names: processes}; spt.input.save_selected(bvr, '%s','%s'); spt.panel.refresh(table_top, kwargs, false); ''' % (checkbox_name, checkbox_name, key) }) div.add(cb) else: web = WebContainer.get_web() checked_process_names = web.get_form_values('process_names') table_top = DivWdg(css='spt_note_viewer_table') expression = "@SOBJECT(sthpw/note['context','in','%s'])" % '|'.join( checked_process_names) table_id = 'main_table1' table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view=my.view,\ show_row_select=True, show_insert=False, state={'parent_key': my.parent_key}, inline_search=False, show_refresh=True, expression=expression ) if my.resize: from tactic.ui.container import ResizeScrollWdg inner_wdg = ResizeScrollWdg(width='500px', height='500px', scroll_bar_size_str='thick', scroll_expansion='inside') inner_wdg.add(table) table_top.add(inner_wdg) else: table_top.add(table) my.set_as_panel(table_top) top.add(table_top) return top
def get_display(self): self.check() if self.is_refresh: div = Widget() else: div = DivWdg() self.set_as_panel(div) div.add_style('padding', '6px') min_width = '400px' div.add_style('min-width', min_width) div.add_color('background', 'background') div.add_class('spt_add_task_panel') div.add_style("padding: 20px") from tactic.ui.app import HelpButtonWdg help_button = HelpButtonWdg(alias="creating-tasks") div.add(help_button) help_button.add_style("float: right") help_button.add_style("margin-top: -5px") if not self.search_key_list: msg_div = DivWdg() msg_table = Table() msg_div.add(msg_table) msg_table.add_row() msg_table.add_cell(IconWdg("No items selected", IconWdg.WARNING)) msg_table.add_cell( 'Please select at least 1 item to add tasks to.') msg_div.add_style('margin: 10px') msg_table.add_style("font-weight: bold") div.add(msg_div) return div msg_div = DivWdg() msg_div.add_style('margin-left: 4px') div.add(msg_div, 'info') msg_div.add('Total: %s item/s to add tasks to' % len(self.search_key_list)) div.add(HtmlElement.br()) hint = HintWdg('Tasks are added according to the assigned pipeline.') msg_div.add(" ") msg_div.add(hint) msg_div.add(HtmlElement.br()) option_div = DivWdg(css='spt_ui_options') #option_div.add_style('margin-left: 12px') sel = SelectWdg('pipeline_mode', label='Create tasks by: ') sel.set_option('values', ['simple process', 'context', 'standard']) sel.set_option('labels', ['process', 'context', 'all contexts in process']) sel.set_persistence() sel.add_behavior({ 'type': 'change', 'cbjs_action': 'spt.panel.refresh(bvr.src_el)' }) option_div.add(sel) value = sel.get_value() # default to simple process if not value: value = 'simple process' msg = '' if value not in ['simple process', 'context', 'standard']: value = 'simple process' if value == 'context': msg = 'In context mode, a single task will be created for each selected context.' elif value == 'simple process': msg = 'In process mode, a single task will be created for each selected process.' elif value == 'standard': msg = 'In this mode, a task will be created for all contexts of each selected process.' option_div.add(HintWdg(msg)) div.add(option_div) div.add(HtmlElement.br()) title = DivWdg('Assigned Pipelines') title.add_style('padding: 6px') title.add_color('background', 'background2') title.add_color('color', 'color', +120) div.add(title) content_div = DivWdg() content_div.add_style('min-height', '150px') div.add(content_div) content_div.add_border() filtered_search_key_list = [] for sk in self.search_key_list: id = SearchKey.extract_id(sk) if id == '-1': continue filtered_search_key_list.append(sk) sobjects = SearchKey.get_by_search_keys(filtered_search_key_list) skipped = [] pipeline_codes = [] for sobject in sobjects: if isinstance(sobject, Task): msg_div = DivWdg( 'WARNING: Creation of task for [Task] is not allowed.') msg_div.add_style('margin-left: 10px') div.add(msg_div, 'info') return div pipeline_code = sobject.get_value('pipeline_code', no_exception=True) if not pipeline_code: skipped.append(sobject) if pipeline_code not in pipeline_codes: pipeline_codes.append(pipeline_code) pipelines = Search.get_by_code('sthpw/pipeline', pipeline_codes) if pipelines == None: pipelines = [] #if not pipelines: # msg_div = DivWdg('WARNING: No Pipelines found for selected.') # msg_div.add_style('margin-left: 10px') # div.add(msg_div, 'info') # return div # expand the width according to num of pipelines content_div.add_style('min-width', len(pipelines) * 250) mode_cb = SelectWdg('pipeline_mode') mode_cb.set_persistence() mode = mode_cb.get_value() if 'context' == mode: mode = 'context' else: mode = 'process' show_subpipeline = True min_height = '150px' # create a temp default pipeline if not pipelines: pipeline = SearchType.create("sthpw/pipeline") pipeline.set_value("code", "__default__") pipeline.set_value( "pipeline", ''' <pipeline> <process name='publish'/> </pipeline> ''') # FIXME: HACK to initialize virtual pipeline pipeline.set_pipeline(pipeline.get_value("pipeline")) pipelines = [pipeline] for pipeline in pipelines: name = pipeline.get_value("name") if not name: name = pipeline.get_code() span = SpanWdg("Pipeline: %s" % name) span.add_style('font-weight: bold') v_div = FloatDivWdg(span) v_div.add_style('margin: 20px') v_div.add_style('min-height', min_height) v_div.add(HtmlElement.br(2)) content_div.add(v_div) processes = pipeline.get_processes(recurse=show_subpipeline, type=['manual', 'approval']) cb_name = '%s|task_process' % pipeline.get_code() master_cb = CheckboxWdg('master_control') master_cb.set_checked() master_cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var inputs = spt.api.Utility.get_inputs(bvr.src_el.getParent('.spt_add_task_panel'),'%s'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = bvr.src_el.checked; ''' % cb_name }) toggle_div = DivWdg() toggle_div.add(SpanWdg(master_cb, css='small')) label = HtmlElement.i('toggle all') label.add_style('color: #888') toggle_div.add_styles( 'border-bottom: 1px solid #888; width: 170px') toggle_div.add(label) v_div.add(toggle_div) process_names = [] for process in processes: process_labels = [] if process.is_from_sub_pipeline(): process_name = process.get_full_name() else: process_name = process.get_name() process_label = process.get_label() if not process_label: process_label = '' if mode == 'context': contexts = pipeline.get_output_contexts(process.get_name()) labels = contexts if process.is_from_sub_pipeline(): labels = [ '%s/%s' % (process.parent_pipeline_code, x) for x in contexts ] for x in labels: process_labels.append(process_label) # prepend process to contexts in this mode to ensure uniqueness contexts = ['%s:%s' % (process_name, x) for x in contexts] else: contexts = [process_name] labels = contexts process_labels.append(process_label) for idx, context in enumerate(contexts): cb = CheckboxWdg(cb_name) cb.set_checked() cb.set_option('value', context) v_div.add(SpanWdg(cb, css='small')) if mode == 'context': span = SpanWdg(process_name, css='med') #span.add_color('color','color') v_div.add(span) v_div.add(SpanWdg(labels[idx])) process_label = process_labels[idx] if process_label: v_div.add(SpanWdg("(%s)" % process_label, css='small')) v_div.add(HtmlElement.br()) content_div.add("<br clear='all'/>") skipped = [] if True: div.add("<br/>") btn = ActionButtonWdg(title='Add Tasks') btn.add_behavior({ 'type': 'click_up', 'post_event': 'search_table_%s' % self.table_id, 'cbjs_action': ''' spt.dg_table.add_task_selected(bvr); ''', 'search_key_list': self.search_key_list }) cb = CheckboxWdg('skip_duplicated', label='Skip Duplicates') cb.set_checked() option_div = DivWdg(cb) option_div.add_style('width', '130px') option_div.add_style('align: left') div.add(option_div) div.add(HtmlElement.br()) btn.add_style("float: right") div.add(btn) div.add(HtmlElement.br(clear="all")) if skipped: content_div.add(HtmlElement.br()) skip_div = DivWdg('Missing pipeline code (Skipped)') skip_div.add_style('text-decoration: underline') content_div.add(skip_div) content_div.add(HtmlElement.br()) item_div = DivWdg() item_div.add_style('margin-left: 10px') content_div.add(item_div) for skip in skipped: item_div.add(skip.get_code()) item_div.add(HtmlElement.br()) return div
def get_viewer(my): top = DivWdg(css='spt_note_viewer_top') # draw checkbox options swap = SwapDisplayWdg() title = SpanWdg('main context') split_div = FloatDivWdg(css='spt_split_cb') div = DivWdg(css='spt_main_context_cb') content_div = DivWdg() content_div.add_color('color', 'color') content_div.add_style('padding: 10px') SwapDisplayWdg.create_swap_title(title, swap, content_div, is_open=False) div.add(swap) div.add(title) checkbox_name = 'split_screen' split_cb = CheckboxWdg(checkbox_name, label='Split View') split_cb.persistence = True split_cb.persistence_obj = split_cb key = split_cb.get_key() #cb.add_style('float: left') split_cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_note_viewer_top"); var table_top = top.getElement(".spt_note_viewer_table"); var cbs = top.getElement('.spt_main_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.note_context_cb; var kwargs = { process_names: processes}; if (bvr.src_el.checked) { kwargs.split_view = 'true'; kwargs.show_context = 'true'; kwargs.left_process_names = processes; kwargs.right_process_names = processes; } spt.input.save_selected(bvr, '%s','%s'); spt.app_busy.show("Note Viewer", 'Loading') ; setTimeout(function(){ spt.panel.refresh(table_top, kwargs, false); if (bvr.src_el.checked) spt.hide(cbs); else spt.show(cbs); spt.app_busy.hide(); }, 50 ); ''' % (checkbox_name, key) }) split_div.add(split_cb) top.add(split_div) top.add(div) div.add(content_div) top.add(HtmlElement.br()) checkbox_name = 'note_main_context_cb' cb = CheckboxWdg(checkbox_name) cb.persistence = True cb.persistence_obj = cb my.checked_process_names = cb.get_values() for value in my.process_names: #my.checked_process_names = web.get_form_values('process_names') cb = CheckboxWdg(checkbox_name, label=value) if value in my.checked_process_names: my.checked_processes.append(value) # FIXME: this is very tenous. Accessing private members to # override behavior cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_note_viewer_top") var table_top = top.getElement('.spt_note_viewer_table'); var cbs = top.getElement('.spt_main_context_cb'); var values = spt.api.Utility.get_input_values(cbs); var processes = values.note_main_context_cb; var kwargs = { process_names: processes}; spt.input.save_selected(bvr, '%s','%s'); spt.panel.refresh(table_top, kwargs, false); ''' % (checkbox_name, key) }) content_div.add(cb) table_top = DivWdg(css='spt_note_viewer_table') expression = "@SOBJECT(sthpw/note['context','in','%s'])" % '|'.join( my.checked_processes) if split_cb.is_checked(): table = my.get_split_viewer() else: table_id = 'main_table1' table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view=my.view,\ show_row_select=True, show_insert=False, state={'parent_key': my.parent_key}, inline_search=False, show_refresh=True, expression=expression ) my.set_as_panel(table_top) table_top.add_style('float: left') top.add(table_top) table_top.add(table) return top
class ArtistViewWdg(SpanWdg): def init(self): self.add("Show assigned only: ") self.checkbox = CheckboxWdg("show_assigned_only") self.checkbox.set_option("value", "on") self.checkbox.set_persistence() self.checkbox.add_event("onclick", "document.form.submit()") self.add(self.checkbox) self.add_class("med") def is_supervisor(self): # if the user is a supervisor, look at all of the assets project = Project.get_project_name() security = Environment.get_security() return security.check_access("prod/%s" % project, "model/supervisor", "true") def is_artist(self): # if the user is a artist, look at all of the assets project = Project.get_project_name() security = Environment.get_security() return security.check_access("prod/%s" % project, "model/artist", "true") def alter_search(self, search): # get all of the relevant tasks to the user task_search = Search("sthpw/task") task_search.add_column("search_id") # only look at this project project = Project.get_project_name() task_search.add_filter("search_type", search.get_search_type()) # figure out who the user is security = Environment.get_security() login = security.get_login() user = login.get_value("login") print "is_artist: ", self.is_artist() print "is_supervisor: ", self.is_supervisor() # do some filtering web = WebContainer.get_web() show_assigned_only = self.checkbox.get_value() show_process = web.get_form_values("process") if not show_process or show_process[0] == '': show_process = [] show_task_status = web.get_form_values("task_status") if not show_task_status or show_task_status[0] == '': show_task_status = [] if show_assigned_only == "on": task_search.add_filter("assigned", user) if show_process: where = "process in (%s)" % ", ".join( ["'%s'" % x for x in show_process]) task_search.add_where(where) if show_task_status: where = "status in (%s)" % ", ".join( ["'%s'" % x for x in show_task_status]) task_search.add_where(where) else: task_search.add_where("NULL") # record the tasks self.tasks = task_search.get_sobjects() # get all of the sobject ids sobject_ids = ["'%s'" % x.get_value("search_id") for x in self.tasks] # get all of the sobjects related to this task if sobject_ids: search.add_where("id in (%s)" % ", ".join(sobject_ids))
def init(self): # List the items search = Search(self.item_cls.SEARCH_TYPE) self._order_search(search) items = search.get_sobjects() if items: self.item_sobj = items[0] #select = MultiSelectWdg("item_ids") #select.set_search_for_options(search,"login", "get_full_name()") user_span = SpanWdg(css='med') user_table = Table(css='table') user_table.add_style("margin-left: 6px") user_table.set_max_width() user_table.add_col(css='small') user_table.add_col() user_table.add_style("min-width: 14em") user_table.add_row_cell(search.get_search_type_obj()\ .get_description(), "heading") for item in items: user_table.add_row() checkbox = CheckboxWdg("item_ids") checkbox.set_option("value", item.get_primary_key_value()) user_table.add_cell(checkbox) project_code = item.get_value("project_code", no_exception=True) if project_code: user_table.add_cell("[ %s ]" % project_code) else: user_table.add_cell("[ * ]") user_table.add_cell(item.get_description()) user_span.add(user_table) # control widget in the middle control_div = DivWdg() control_div.add_style('padding: 100px 10px 0 10px') button = IconSubmitWdg(self.ADD_LABEL, IconWdg.INSERT, True) button.add_style('padding: 2px 30px 4px 30px') control_div.add(button) main_table = Table(css='collapse') main_table.set_max_width() main_table.add_row(css='plain_bg') main_table.add_cell(user_span, 'valign_top') td = main_table.add_cell(control_div, 'valign_top') td.add_style('width', '12em') main_table.add_cell(self._get_target_span(), 'valign_top') self.add(main_table) # register command here if self.item_sobj and self.container_sobj: marshaller = WebContainer.register_cmd( "pyasm.widget.SObjectGroupCmd") marshaller.set_option("grouping_search_type", self.grouping_cls.SEARCH_TYPE) marshaller.set_option("item_foreign_key", self.item_sobj.get_foreign_key()) marshaller.set_option("container_foreign_key", self.container_sobj.get_foreign_key())
def get_display(my): if my.is_refresh: top = Widget() my.add(top) else: container = DivWdg() my.add(container) #parent = SearchKey.get_by_search_key(my.search_key) top = DivWdg() container.add(top) my.set_as_panel(top) top.add_style("margin-top: -2px") top.add_class("spt_uber_notes_top") from tactic.ui.app import HelpButtonWdg help_button = HelpButtonWdg(alias="note-sheet-widget") top.add(help_button) help_button.add_style("float: right") table_id = 'sub_table' view = 'table' span = DivWdg(css='spt_input_group') top.add(span) span.add_border() span.add_style("height: 27px") span.add_style("padding: 5px") button_div = DivWdg() span.add(button_div) button_div.add_style("float: left") button_div.add_style("margin-right: 10px") table = Table() button_div.add(table) table.add_row() from tactic.ui.widget import SingleButtonWdg refresh = SingleButtonWdg(title="Refresh", icon=IconWdg.REFRESH) table.add_cell(refresh) refresh.add_style("float: left") refresh.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var values = spt.api.Utility.get_input_values(tbody); spt.panel.refresh(top, values, false); ''' }) save = SingleButtonWdg(title="Save", icon=IconWdg.SAVE) table.add_cell(save) save.add_style("float: left") save.add_behavior({ 'type': 'click_up', 'update_current_only': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var table = top.getElement(".spt_table"); bvr.src_el = table; spt.dg_table.update_row(evt, bvr) ''' }) process = SingleButtonWdg(title="Show Processes", icon=IconWdg.PROCESS, show_arrow=True) table.add_cell(process) from tactic.ui.container import DialogWdg process_dialog = DialogWdg(display=False) span.add(process_dialog) process_dialog.set_as_activator(process) process_dialog.add_title("Processes") process_div = DivWdg() process_dialog.add(process_div) #process_div.add_style("padding: 5px") process_div.add_color("background", "background") process_div.add_color("color", "color") process_div.add_border() refresh = ActionButtonWdg(title="Refresh") refresh.add_style('margin: 0 auto 10px auto') process_div.add(refresh) refresh.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var values = spt.api.Utility.get_input_values(tbody); spt.panel.refresh(top, values, false); ''' }) process_div.add("<hr/>") selected_process_names = [] step = 0 for idx, value in enumerate(my.process_names): checkbox_name = 'note_process_cb' if my.child_mode: selected_process_names.append(value) #break cb = CheckboxWdg(checkbox_name, label=value) cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.set_option('value', value) #cb.set_persistence() cb.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.input.save_selected(bvr, '%s','%s'); ''' % (checkbox_name, key) }) # only 1 is selected in child_mode if cb.is_checked(): selected_process_names.append(value) if idx == 0 or idx == 10 * step: # add a new inner div inner_div = my._get_inner_div() process_div.add(inner_div, 'inner%s' % step) step += 1 inner_div.add(cb) inner_div.add("<br/>") # if less than 10, make it wider if len(my.process_names) < 10: inner_div.add_style('width: 100px') # add a master private checkbox if not my.child_mode: checkbox_name = 'note_master_private_cb' cb = CheckboxWdg(checkbox_name, label='make notes private') cb.persistence = True cb.persistence_obj = cb key = cb.get_key() cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_uber_notes_top"); var tbody = top.getElements('.spt_table_tbody')[2]; var inputs = spt.api.Utility.get_inputs(tbody,'is_private'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = bvr.src_el.checked; spt.input.save_selected(bvr, '%s','%s'); ''' % (checkbox_name, key) }) cb_span = DivWdg(cb, css='small') cb_span.add_styles( 'border-left: 1px dotted #bbb; margin-left: 10px') span.add(cb_span) main_config_view = my._get_main_config(view, selected_process_names) sobject_dict = {} # TODO: do a union all search or by order number = 1 for value in selected_process_names: search = Search('sthpw/note') search.add_filter('project_code', Project.get_project_code()) search.add_filter('context', value) search.add_filter('search_type', my.parent_search_type) search.add_filter('search_id', my.parent_search_id) search.add_order_by('timestamp desc') search.add_limit(1) sobject = search.get_sobject() if sobject: sobject_dict[value] = sobject #sobjects = search.get_sobjects() # virtual sobject for placeholder, we can put more than 1 maybe? sobject = SearchType.create('sthpw/note') edit_config = my._get_edit_config('edit', selected_process_names) edit_configs = {'sthpw/note': edit_config} Container.put("CellEditWdg:configs", edit_configs) table = TableLayoutWdg(table_id=table_id, search_type='sthpw/note', view='table', config=main_config_view, aux_info={ 'sobjects': sobject_dict, 'parent': my.parent }, mode="simple", show_row_select=False, show_insert=False, show_commit_all=True, show_refresh='false', state={'parent_key': my.search_key}) table.set_sobject(sobject) top.add(table) return super(NoteSheetWdg, my).get_display()
def get_display(self): widget = Widget() div = DivWdg(css='spt_ui_options') div.set_unique_id() table = Table() div.add(table) table.add_style("margin: 5px 15px") table.add_color('color','color') swap = SwapDisplayWdg() #swap.set_off() app = WebContainer.get_web().get_selected_app() outer_span = SpanWdg() outer_span.add_style('float: right') span = SpanWdg(app, css='small') icon = IconWdg(icon=eval("IconWdg.%s"%app.upper()), width='13px') outer_span.add(span) outer_span.add(icon) title = SpanWdg("Loading Options") title.add(outer_span) SwapDisplayWdg.create_swap_title(title, swap, div, is_open=False) widget.add(swap) widget.add(title) widget.add(div) if not self.hide_instantiation: table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Instantiation: ")) table.add_cell(div) div = self.get_instantiation_wdg() table.add_cell(div) setting = self.get_default_setting() default_instantiation = setting.get('instantiation') default_connection = setting.get('connection') default_dependency = setting.get('texture_dependency') if not self.hide_connection: table.add_row() table.add_blank_cell() con_div = DivWdg(HtmlElement.b("Connection: ")) table.add_cell(con_div) td = table.add_cell() is_unchecked = True default_cb = None for value in ['http', 'file system']: name = self.get_element_name("connection") checkbox = CheckboxWdg( name ) checkbox.set_option("value", value) checkbox.set_persistence() if value == default_connection: default_cb = checkbox if checkbox.is_checked(): is_unchecked = False checkbox.add_behavior({'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" %name}) span = SpanWdg(checkbox, css='small') span.add(value) td.add(span) if is_unchecked: default_cb.set_checked() if not self.hide_dependencies: table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Texture Dependencies: ")) table.add_cell(div) td = table.add_cell() is_unchecked = True default_cb = None for value in ['as checked in', 'latest', 'current']: name = self.get_element_name("dependency") checkbox = CheckboxWdg( name ) checkbox.set_option("value", value) checkbox.set_persistence() checkbox.add_behavior({'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" %name}) if value == default_dependency: default_cb = checkbox if checkbox.is_checked(): is_unchecked = False span = SpanWdg(checkbox, css='small') span.add(value) td.add(span) if is_unchecked: default_cb.set_checked() from connection_select_wdg import ConnectionSelectWdg table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Connection Type: ")) table.add_cell(div) table.add_cell( ConnectionSelectWdg() ) table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Connection Port: ")) table.add_cell(div) port_div = DivWdg() port_text = TextWdg("port") port_text.set_option('size','6') port_div.add(port_text) port_div.add_style("padding-left: 7px") port_div.add_style("width: 40px") table.add_cell( port_div ) from pyasm.prod.web import WidgetSettings value = WidgetSettings.get_value_by_key("CGApp:connection_port") if value: port_text.set_value(value) elif WebContainer.get_web().get_selected_app() == 'Houdini': port_text.set_value("13000") else: port_text.set_value("4444") port_text.add_behavior( { 'type': 'change', 'cbjs_action': ''' var value = bvr.src_el.value; value = parseInt(value); var kwargs = { 'data': value, 'key': 'CGApp:connection_port' } var cmd = "pyasm.web.WidgetSettingSaveCbk" var server = TacticServerStub.get(); server.execute_cmd(cmd, kwargs); // FIXME: this is dangerous use of a global var app.port = value; ''' } ) return widget
def get_format_value(my, value, format): if format not in ['Checkbox'] and value == '': return '' # ------------------------------------------------ # Integer if format == '-1234': if not value: # Case where value is '', 0, 0.0, -0.0 . value = 0 value = "%0.0f" % my.convert_to_float(value) elif format == '-1,234': if not value: value = 0 # Group the value into three numbers seperated by a comma. value = my.number_format(value, places=0) # ------------------------------------------------ # Float elif format == '-1234.12': if not value: value = 0 value = "%0.2f" % my.convert_to_float(value) elif format == '-1,234.12': # break the value up by 3s if not value: value = 0 value = my.number_format(value, places=2) # ------------------------------------------------ # Percentage elif format == '-13%': if not value: value = 0 value = my.convert_to_float(value) * 100 value = "%0.0f" % my.convert_to_float(value) + "%" elif format == '-12.95%': if not value: value = 0 value = my.convert_to_float(value) * 100 value = "%0.2f" % my.convert_to_float(value) + "%" # ------------------------------------------------ # Currency elif format == '-$1,234': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True) value = value[0:-3] elif format == '-$1,234.00': if not value: value = 0 value = my.currency_format(value, grouping=True) elif format == '-$1,234.--': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True) value = value[0:-3] + ".--" elif format == '-$1,234.00 CAD': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True, monetary=True) elif format == '($1,234.00)': # break the value up by 3s if not value or value == "0": value = " " else: value = my.currency_format(value, grouping=True) if value.startswith("-"): value = "<span style='color: #F00'>(%s)</span>" % value.replace("-", "") # ------------------------------------------------ # Date elif format == '31/12/99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y") elif format == 'December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%B %d, %Y") elif format == '31/12/1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%Y") elif format == 'Dec 31, 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%b %d, %y") elif format == 'Dec 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%b %d, %Y") elif format == '31 Dec, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d %b, %Y") elif format == '31 December 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d %B %Y") elif format == 'Fri, Dec 31, 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a, %b %d, %y") elif format == 'Fri 31/Dec 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a %d/%b %y") elif format == 'Fri, December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a, %B %d, %Y") elif format == 'Friday, December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%A, %B %d, %Y") elif format == '12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%d") elif format == '99-12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%y-%m-%d") elif format == '1999-12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%Y-%m-%d") elif format == '12-31-1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%d-%Y") elif format == '12/99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%y") elif format == '31/Dec': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%b") elif format == 'December': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%B") elif format == '52': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%U") # ------------------------------------------------ # Time elif format == '13:37': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%H:%M") elif format == '13:37:46': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%H:%M:%S") elif format == '01:37 PM': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%I:%M %p") elif format == '01:37:46 PM': if not value: value = '' else: value = parser.parse(value) from pyasm.common import SPTDate timezone = my.get_option('timezone') if not timezone: pass elif timezone == "local": value = SPTDate.convert_to_local(value) else: value = SPTDate.convert_to_timezone(value, "EDT") value = value.strftime("%I:%M:%S %p") elif format == '31/12/99 13:37': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y %H:%M") elif format == '31/12/99 13:37:46': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y %H:%M:%S") elif format == 'DATETIME': if not value: value = '' else: value = parser.parse(value) setting = ProdSetting.get_value_by_key('DATETIME') if not setting: setting = "%Y-%m-%d %H:%M" value = value.strftime(setting) elif format == 'DATE': if not value: value = '' else: value = parser.parse(value) setting = ProdSetting.get_value_by_key('DATE') if not setting: setting = "%Y-%m-%d" value = value.strftime(setting) # ------------------------------------------------ # Scientific elif format == '-1.23E+03': if not value: value = '' else: try: value = "%.2e" % my.convert_to_float(value) except: value = "0.00" elif format == '-1.234E+03': if not value: value = '' else: try: value = "%.2e" % my.convert_to_float(value) except: value = "0.00" # ------------------------------------------------ # Boolean # false = 0, true = 1 elif format in ['True|False']: if value: value = 'True' else: value = 'False' elif format in ['true|false']: if value: value = 'true' else: value = 'false' elif format == 'Checkbox': div = DivWdg() div.add_class("spt_boolean_top") from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg(my.get_name()) checkbox.set_option("value", "true") if value: checkbox.set_checked() div.add(checkbox) div.add_class('spt_format_checkbox_%s' % my.get_name()) version = my.parent_wdg.get_layout_version() if version == "2": pass else: checkbox.add_behavior( { 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var cached_data = {}; var value_wdg = bvr.src_el; var top_el = bvr.src_el.getParent(".spt_boolean_top"); spt.dg_table.edit.widget = top_el; var key_code = spt.kbd.special_keys_map.ENTER; spt.dg_table.inline_edit_cell_cbk( value_wdg, cached_data ); ''' } ) value = div # ------------------------------------------------ # Timecode elif format in ['MM:SS.FF','MM:SS:FF', 'MM:SS', 'HH:MM:SS.FF', 'HH:MM:SS:FF', 'HH:MM:SS']: fps = my.get_option('fps') if not fps: fps = 24 else: fps = int(fps) timecode = TimeCode(frames=value, fps=fps) value = timecode.get_timecode(format) # ------------------------------------------------ # Text formats elif format in ['wiki']: pass return value
def get_display(my): widget = Widget() div = DivWdg(css='spt_ui_options') div.set_unique_id() table = Table() div.add(table) table.add_style("margin: 5px 15px") table.add_color('color', 'color') swap = SwapDisplayWdg() #swap.set_off() app = WebContainer.get_web().get_selected_app() outer_span = SpanWdg() outer_span.add_style('float: right') span = SpanWdg(app, css='small') icon = IconWdg(icon=eval("IconWdg.%s" % app.upper()), width='13px') outer_span.add(span) outer_span.add(icon) title = SpanWdg("Loading Options") title.add(outer_span) SwapDisplayWdg.create_swap_title(title, swap, div, is_open=False) widget.add(swap) widget.add(title) widget.add(div) if not my.hide_instantiation: table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Instantiation: ")) table.add_cell(div) div = my.get_instantiation_wdg() table.add_cell(div) setting = my.get_default_setting() default_instantiation = setting.get('instantiation') default_connection = setting.get('connection') default_dependency = setting.get('texture_dependency') if not my.hide_connection: table.add_row() table.add_blank_cell() con_div = DivWdg(HtmlElement.b("Connection: ")) table.add_cell(con_div) td = table.add_cell() is_unchecked = True default_cb = None for value in ['http', 'file system']: name = my.get_element_name("connection") checkbox = CheckboxWdg(name) checkbox.set_option("value", value) checkbox.set_persistence() if value == default_connection: default_cb = checkbox if checkbox.is_checked(): is_unchecked = False checkbox.add_behavior({ 'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" % name }) span = SpanWdg(checkbox, css='small') span.add(value) td.add(span) if is_unchecked: default_cb.set_checked() if not my.hide_dependencies: table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Texture Dependencies: ")) table.add_cell(div) td = table.add_cell() is_unchecked = True default_cb = None for value in ['as checked in', 'latest', 'current']: name = my.get_element_name("dependency") checkbox = CheckboxWdg(name) checkbox.set_option("value", value) checkbox.set_persistence() checkbox.add_behavior({ 'type': 'click_up', 'propagate_evt': True, "cbjs_action": "spt.toggle_checkbox(bvr, '.spt_ui_options', '%s')" % name }) if value == default_dependency: default_cb = checkbox if checkbox.is_checked(): is_unchecked = False span = SpanWdg(checkbox, css='small') span.add(value) td.add(span) if is_unchecked: default_cb.set_checked() from connection_select_wdg import ConnectionSelectWdg table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Connection Type: ")) table.add_cell(div) table.add_cell(ConnectionSelectWdg()) table.add_row() table.add_blank_cell() div = DivWdg(HtmlElement.b("Connection Port: ")) table.add_cell(div) port_div = DivWdg() port_text = TextWdg("port") port_text.set_option('size', '6') port_div.add(port_text) port_div.add_style("padding-left: 7px") port_div.add_style("width: 40px") table.add_cell(port_div) from pyasm.prod.web import WidgetSettings value = WidgetSettings.get_value_by_key("CGApp:connection_port") if value: port_text.set_value(value) elif WebContainer.get_web().get_selected_app() == 'Houdini': port_text.set_value("13000") else: port_text.set_value("4444") port_text.add_behavior({ 'type': 'change', 'cbjs_action': ''' var value = bvr.src_el.value; value = parseInt(value); var kwargs = { 'data': value, 'key': 'CGApp:connection_port' } var cmd = "pyasm.web.WidgetSettingSaveCbk" var server = TacticServerStub.get(); server.execute_cmd(cmd, kwargs); // FIXME: this is dangerous use of a global var app.port = value; ''' }) return widget
def get_format_value(my, value, format): if format not in ['Checkbox'] and value == '': return '' # ------------------------------------------------ # Integer if format == '-1234': if not value: # Case where value is '', 0, 0.0, -0.0 . value = 0 value = "%0.0f" % my.convert_to_float(value) elif format == '-1,234': if not value: value = 0 # Group the value into three numbers seperated by a comma. value = my.number_format(value, places=0) # ------------------------------------------------ # Float elif format == '-1234.12': if not value: value = 0 value = "%0.2f" % my.convert_to_float(value) elif format == '-1,234.12': # break the value up by 3s if not value: value = 0 value = my.number_format(value, places=2) # ------------------------------------------------ # Percentage elif format == '-13%': if not value: value = 0 value = my.convert_to_float(value) * 100 value = "%0.0f" % my.convert_to_float(value) + "%" elif format == '-12.95%': if not value: value = 0 value = my.convert_to_float(value) * 100 value = "%0.2f" % my.convert_to_float(value) + "%" # ------------------------------------------------ # Currency elif format == '-$1,234': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True) value = value[0:-3] elif format == '-$1,234.00': if not value: value = 0 value = my.currency_format(value, grouping=True) elif format == '-$1,234.--': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True) value = value[0:-3] + ".--" elif format == '-$1,234.00 CAD': # break the value up by 3s if not value: value = 0 value = my.currency_format(value, grouping=True, monetary=True) # ------------------------------------------------ # Date elif format == '31/12/99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y") elif format == 'December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%B %d, %Y") elif format == '31/12/1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%Y") elif format == 'Dec 31, 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%b %d, %y") elif format == 'Dec 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%b %d, %Y") elif format == '31 Dec, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d %b, %Y") elif format == '31 December 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d %B %Y") elif format == 'Fri, Dec 31, 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a, %b %d, %y") elif format == 'Fri 31/Dec 99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a %d/%b %y") elif format == 'Fri, December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%a, %B %d, %Y") elif format == 'Friday, December 31, 1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%A, %B %d, %Y") elif format == '12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%d") elif format == '99-12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%y-%m-%d") elif format == '1999-12-31': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%Y-%m-%d") elif format == '12-31-1999': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%d-%Y") elif format == '12/99': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%m-%y") elif format == '31/Dec': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%b") elif format == 'December': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%B") elif format == '52': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%U") # ------------------------------------------------ # Time elif format == '13:37': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%H:%M") elif format == '13:37:46': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%H:%M:%S") elif format == '01:37 PM': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%I:%M %p") elif format == '01:37:46 PM': if not value: value = '' else: value = parser.parse(value) from pyasm.common import SPTDate timezone = my.get_option('timezone') if not timezone: pass elif timezone == "local": value = SPTDate.convert_to_local(value) else: value = SPTDate.convert_to_timezone(value, "EDT") value = value.strftime("%I:%M:%S %p") elif format == '31/12/99 13:37': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y %H:%M") elif format == '31/12/99 13:37:46': if not value: value = '' else: value = parser.parse(value) value = value.strftime("%d/%m/%y %H:%M:%S") elif format == 'DATETIME': if not value: value = '' else: value = parser.parse(value) setting = ProdSetting.get_value_by_key('DATETIME') if not setting: setting = "%Y-%m-%d %H:%M" value = value.strftime(setting) elif format == 'DATE': if not value: value = '' else: value = parser.parse(value) setting = ProdSetting.get_value_by_key('DATE') if not setting: setting = "%Y-%m-%d" value = value.strftime(setting) # ------------------------------------------------ # Scientific elif format == '-1.23E+03': if not value: value = '' else: try: value = "%.2e" % my.convert_to_float(value) except: value = "0.00" elif format == '-1.234E+03': if not value: value = '' else: try: value = "%.2e" % my.convert_to_float(value) except: value = "0.00" # ------------------------------------------------ # Boolean # false = 0, true = 1 elif format in ['True|False']: if value: value = 'True' else: value = 'False' elif format in ['true|false']: if value: value = 'true' else: value = 'false' elif format == 'Checkbox': div = DivWdg() div.add_class("spt_boolean_top") from pyasm.widget import CheckboxWdg checkbox = CheckboxWdg(my.get_name()) checkbox.set_option("value", "true") if value: checkbox.set_checked() div.add(checkbox) div.add_class('spt_format_checkbox_%s' % my.get_name()) version = my.parent_wdg.get_layout_version() if version == "2": pass else: checkbox.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var cached_data = {}; var value_wdg = bvr.src_el; var top_el = bvr.src_el.getParent(".spt_boolean_top"); spt.dg_table.edit.widget = top_el; var key_code = spt.kbd.special_keys_map.ENTER; spt.dg_table.inline_edit_cell_cbk( value_wdg, cached_data ); ''' }) value = div # ------------------------------------------------ # Timecode elif format in [ 'MM:SS.FF', 'MM:SS:FF', 'MM:SS', 'HH:MM:SS.FF', 'HH:MM:SS:FF', 'HH:MM:SS' ]: fps = my.get_option('fps') if not fps: fps = 24 else: fps = int(fps) timecode = TimeCode(frames=value, fps=fps) value = timecode.get_timecode(format) # ------------------------------------------------ # Text formats elif format in ['wiki']: pass return value
def get_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("padding: 10px") top.add_style("min-width: 400px") from tactic.ui.app import HelpButtonWdg help_wdg = HelpButtonWdg(alias="exporting-csv-data") top.add(help_wdg) help_wdg.add_style("float: right") help_wdg.add_style("margin-top: -3px") if not my.check(): top.add(DivWdg('Error: %s' %my.error_msg)) top.add(HtmlElement.br(2)) return super(CsvExportWdg, my).get_display() if my.search_type_list and my.search_type_list[0] != my.search_type: st = SearchType.get(my.search_type_list[0]) title_div =DivWdg('Exporting related items [%s]' % st.get_title()) top.add(title_div) top.add(HtmlElement.br()) my.search_type = my.search_type_list[0] my.view = my.related_view if my.mode != 'export_all': num = len(my.selected_search_keys) else: search = Search(my.search_type) num = search.get_count() msg_div = DivWdg('Total: %s items to export'% num) msg_div.add_style("font-size: 12px") msg_div.add_style("font-weight: bold") msg_div.add_style('margin-left: 4px') top.add(msg_div) if num > 300: msg_div.add_behavior({'type':'load', 'cbjs_action': "spt.alert('%s items are about to be exported. It may take a while.')" %num}) top.add(HtmlElement.br()) div = DivWdg(css='spt_csv_export', id='csv_export_action') div.add_color("background", "background", -10) div.add_style("padding: 10px") div.add_style("margin: 5px") div.add_styles('max-height: 350px; overflow: auto') table = Table( css='minimal') table.add_color("color", "color") div.add(table) table.set_id('csv_export_table') table.center() cb_name = 'csv_column_name' master_cb = CheckboxWdg('master_control') master_cb.set_checked() master_cb.add_behavior({'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var inputs = spt.api.Utility.get_inputs(bvr.src_el.getParent('.spt_csv_export'),'%s'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = !inputs[i].checked; ''' %cb_name}) span = SpanWdg('Select Columns To Export') span.add_style('font-weight','600') table.add_row_cell(span) table.add_row_cell(HtmlElement.br()) tr = table.add_row() tr.add_style('border-bottom: 1px groove #777') td = table.add_cell(master_cb) label = HtmlElement.i('toggle all') label.add_style('color: #888') table.add_cell(label) col1 = table.add_col() col1.add_style('width: 35px') col2 = table.add_col() if not my.search_type or not my.view: return table # use overriding element names and derived titles if available config = WidgetConfigView.get_by_search_type(my.search_type, my.view) if my.element_names and config: filtered_columns = my.element_names titles = [] for name in my.element_names: title = config.get_element_title(name) titles.append(title) else: # excluding FunctionalTableElement filtered_columns = [] titles = [] if not config: columns = search.get_columns() filtered_columns = columns titles = ['n/a'] * len(filtered_columns) else: columns = config.get_element_names() filtered_columns = columns titles = config.get_element_titles() """ # commented out until it is decided 2.5 widgets will # use this class to differentiate between reg and functional element from pyasm.widget import FunctionalTableElement for column in columns: widget = config.get_display_widget(column) if isinstance(widget, FunctionalTableElement): continue filtered_columns.append(column) """ for idx, column in enumerate(filtered_columns): table.add_row() cb = CheckboxWdg(cb_name) cb.set_option('value', column) cb.set_checked() table.add_cell(cb) title = titles[idx] table.add_cell('<b>%s</b> (%s) '%(title, column)) action_div = DivWdg() widget = DivWdg() table.add_row_cell(widget) widget.add_style("margin: 20px 0 10px 0px") cb = CheckboxWdg('include_id', label=" Include ID") cb.set_default_checked() widget.add(cb) hint = HintWdg('To update entries with specific ID later, please check this option. For new inserts in this or other table later on, uncheck this option.') widget.add(hint) label = string.capwords(my.mode.replace('_', ' ')) button = ActionButtonWdg(title=label, size='l') is_export_all = my.mode == 'export_all' button.add_behavior({ 'type': "click_up", 'cbfn_action': 'spt.dg_table_action.csv_export', 'element': 'csv_export', 'column_names': 'csv_column_name', 'search_type': my.search_type, 'view': my.view, 'search_keys' : my.selected_search_keys, 'is_export_all' : is_export_all }) my.close_action = "var popup = bvr.src_el.getParent('.spt_popup');spt.popup.close(popup)" if my.close_action: close_button = ActionButtonWdg(title='Close') close_button.add_behavior({ 'type': "click", 'cbjs_action': my.close_action }) table = Table() action_div.add(table) table.center() table.add_row() td = table.add_cell(button) td.add_style("width: 130px") table.add_cell(close_button) action_div.add("<br clear='all'/>") top.add(div) top.add(HtmlElement.br()) top.add(action_div) if my.is_test: rtn_data = {'columns': my.element_names, 'count': len(my.selected_search_keys)} if my.mode == 'export_matched': rtn_data['sql'] = my.table.search_wdg.search.get_statement() from pyasm.common import jsondumps rtn_data = jsondumps(rtn_data) return rtn_data return top