def get_vendor_wdg(self): div = DivWdg() div.set_name("Vendor") vendors = [ "SQLite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # unfortunately, Sqlite is capitalized incorectly in the code vendor_codes = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] vendor_icons = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # get 3rd party vendors for vendor in vendors: vendor_div = DivWdg() div.add(vendor_div) vendor_div.add_style("margin: 10px") radio = RadioWdg("vendor") div.add(radio) radio.set_option("value", vendor) div.add(vendor) return div
def get_vendor_wdg(my): div = DivWdg() div.set_name("Vendor") vendors = [ "SQLite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # unfortunately, Sqlite is capitalized incorectly in the code vendor_codes = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] vendor_icons = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # get 3rd party vendors for vendor in vendors: vendor_div = DivWdg() div.add(vendor_div) vendor_div.add_style("margin: 10px") radio = RadioWdg("vendor") div.add(radio) radio.set_option("value", vendor) div.add(vendor) return div
def get_display(my): top = my.top top.add_class("spt_changelist_content") my.set_as_panel(top) top.add_color("color", "color") top.add_color("background", "background") #top.add_border() #top.add_style("padding", "10px") top.add_style("min-width: 600px") top.add_style("min-height: 400px") top.add_behavior( { 'type': 'load', 'cbjs_action': scm_get_onload_js() } ) sync_dir = Environment.get_sandbox_dir() # HARD CODED project = Project.get() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() location = '//%s' % depot changelist = my.kwargs.get("changelist") if not changelist: changelist = WidgetSettings.get_value_by_key("current_changelist") else: WidgetSettings.set_value_by_key("current_changelist", changelist) if not changelist: changelist = 'default' changelists = my.kwargs.get("changelists") if not changelists: changelists = [] elif isinstance(changelists, basestring): changelists = changelists.replace("'", '"') changelists = jsonloads(changelists) top.add_behavior( { 'type': 'load', 'sync_dir': sync_dir, 'depot': depot, 'cbjs_action': ''' spt.scm.sync_dir = bvr.sync_dir; spt.scm.depot = bvr.depot; ''' } ) inner = DivWdg() top.add(inner) table = Table() inner.add(table) table.add_style("width: 100%") table.add_color("background", "background", -3) table.add_row() th = table.add_header("") th = table.add_header("Changelist") th.add_style("text-align: left") th = table.add_header("Description") th.add_style("text-align: left") th = table.add_header("# Items") th.add_style("text-align: left") th = table.add_header("Status") th.add_style("text-align: left") th = table.add_header("View") th.add_style("text-align: left") th = table.add_header("Delete") th.add_style("text-align: left") #table.set_unique_id() #table.add_smart_styles("spt_changelist_item", { # 'text-align: right' # } )) bgcolor = table.get_color("background", -8) table.add_relay_behavior( { 'type': 'mouseover', 'bvr_match_class': 'spt_changelist_item', 'bgcolor': bgcolor, 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); ''' } ) table.add_relay_behavior( { 'type': 'mouseout', 'bvr_match_class': 'spt_changelist_item', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ''); ''' } ) table.add_relay_behavior( { 'type': 'mouseup', 'bvr_match_class': "spt_changelist_radio", 'cbjs_action': ''' var changelist = bvr.src_el.value; var top = bvr.src_el.getParent(".spt_changelist_content"); top.setAttribute("spt_changelist", changelist); spt.app_busy.show("Loading Changelists Information"); spt.changelist.load(bvr.src_el, changelist); spt.app_busy.hide(); ''' } ) for c in changelists: num_items = len(c.get("info")) name = c.get("change") tr = table.add_row() tr.add_class("spt_changelist_item") radio = RadioWdg("changelist") radio.add_class("spt_changelist_radio") table.add_cell(radio) radio.set_option("value", name) if name == changelist: radio.set_checked() table.add_cell(name) table.add_cell(c.get("desc")) table.add_cell(num_items) table.add_cell(c.get("status")) if num_items: icon = IconButtonWdg(title="View", icon=IconWdg.ZOOM) icon.add_behavior( { 'type': 'click_up', 'changelist': c.get("change"), 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_changelist_content"); top.setAttribute("spt_changelist", bvr.changelist); spt.app_busy.show("Loading Changelist"); spt.changelist.load(bvr.src_el, bvr.changelist); spt.app_busy.hide(); ''' } ) else: icon = '' table.add_cell(icon) if not num_items and name != 'default': icon = IconButtonWdg(title="Delete Changelist", icon=IconWdg.DELETE) else: icon = "" table.add_cell(icon) inner.add("<hr/>") files = my.kwargs.get("files") if isinstance(files, basestring): files = files.replace("'", '"') files = jsonloads(files) if files == None: inner.add_behavior( { 'type': 'load', 'location': location, 'changelist': changelist, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.changelist = {} spt.changelist.load = function(el, changelist) { var applet = spt.Applet.get(); var changelists = spt.scm.run("get_changelists_by_user",[]); var dflt = { 'change': 'default', 'status': 'pending' } changelists.push(dflt); changelists = changelists.reverse(); for (var i = 0; i < changelists.length; i++) { var info = spt.scm.run("get_changelist_files",[changelists[i].change]); changelists[i]['info'] = info; } // get the current chnage list var files = spt.scm.run("get_changelist_files",[changelist]); var path_info = {}; var sizes = []; for ( var i = 0; i < files.length; i++) { // FIXME: perforce specific var path = files[i].depotFile; path = path.replace(bvr.location, bvr.sync_dir); files[i].path = path; var size; if (applet.exists(path)) { var info = applet.get_path_info(path); size = info.size; } else { size = 0; } sizes.push(size); path_info[path] = 'editable'; } //var ret_val = spt.scm.status(bvr.sync_dir); //console.log(ret_val); var class_name = 'tactic.ui.checkin.changelist_wdg.ChangelistWdg'; var kwargs = { files: files, sizes: sizes, changelist: changelist, changelists: changelists, path_info: path_info, } var top = el.getParent(".spt_changelist_content"); spt.panel.load(top, class_name, kwargs); } spt.changelist.load(bvr.src_el, bvr.changelist); ''' } ) content = DivWdg() inner.add(content) content.add_class("spt_changelist_content") if files == None: loading_wdg = DivWdg() content.add(loading_wdg) loading_wdg.add("<b>Loading ...</b>") loading_wdg.add_style("padding: 30px") elif files: title_wdg = DivWdg() title_wdg.add_style("height: 15px") title_wdg.add("Changelist: [%s]" % changelist) content.add(title_wdg) title_wdg.add_gradient("background", "background", -5) title_wdg.add_style("padding: 5px") title_wdg.add_border() #button = SingleButtonWdg(tip='Add New Changelist', icon=IconWdg.ADD) #content.add(button) content.add("<br/>") paths = [x.get("path") for x in files] sizes = my.kwargs.get("sizes") path_info = my.kwargs.get("path_info") from scm_dir_list_wdg import ScmDirListWdg # dummy search_key search_key = "sthpw/virtual?code=xx001" dir_list_wdg = ScmDirListWdg( base_dir=sync_dir, paths=paths, sizes=sizes, path_info=path_info, all_open=True, #search_key=search_key ) content.add(dir_list_wdg) else: content.add("Changelist: [%s]" % changelist) content.add("<br/>"*2) no_files_wdg = DivWdg() content.add(no_files_wdg) no_files_wdg.add_style("padding: 20px") no_files_wdg.add_border() no_files_wdg.add("No files in changelist") no_files_wdg.add_color("color", "color3") no_files_wdg.add_color("background", "background3") no_files_wdg.add_style("font-weight: bold") no_files_wdg.add_style("text-align: center") return top
def get_display(self): top = self.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("width", "400px") top.add_border() top.add_class("spt_delete_project_tool_top") site = self.kwargs.get("site") set_site = self.kwargs.get("set_site") if set_site != False and site: Site.set_site(site) login = Environment.get_user_name() security = Environment.get_security() if not security.is_admin() and not security.is_in_group(self.delete_group): top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Only Admin can delete projects") top.add_style("padding: 50px") top.add_style("text-align: center") if set_site and site: Site.pop_site() return top project_code = self.kwargs.get("project_code") # check if delete permissions exist for this site and project security = Environment.get_security() if False and not security.check_access("project", project_code, "delete"): top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Not permitted to delete this project") top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top if project_code: project = Project.get_by_code(project_code) if not project: top.add(IconWdg(icon=IconWdg.WARNING)) top.add("No project [%s] exists in this database" % project_code) top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top search_key = project.get_search_key() else: search_key = self.kwargs.get("search_key") project = Search.get_by_search_key(search_key) if project: project_code = project.get_code() title_wdg = DivWdg() if project: top.add(title_wdg) title_wdg.add(IconWdg(icon=IconWdg.WARNING)) title_wdg.add("Deleting Project: %s" % project.get_value("title") ) title_wdg.add_color("background", "background", -5) title_wdg.add_style("padding: 5px") title_wdg.add_style("font-weight: bold") title_wdg.add_style("font-size: 14px") content = DivWdg() top.add(content) content.add_style("padding: 10px") if not search_key: warning_msg = "Projects must be deleted individually" content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") return top warning_msg = "Deleting a project will delete the database associated with this project. All data and files will be lost. Please consider carefully before proceeding." if warning_msg: warning_wdg = DivWdg(warning_msg, css='warning') content.add(warning_wdg) warning_wdg.add_style("margin: 20 10px") content.add("<br/>") if not project_code: content.add("This project [%s] has been deleted."%search_key) return top elif not project: content.add("This project [%s] has been deleted."%project_code) return top assert project_code assert project content.add("<br/>") content.add("<b>NOTE: These items will be deleted, but the sTypes entries in search_objects table will be retained.</b> ") content.add("<br/>") content.add("<br/>") total_items_wdg = DivWdg() total_items = 0 content.add(total_items_wdg) # find all of the sTypes details_wdg = DivWdg() content.add(details_wdg) details_wdg.add_style("max-height: 300px") details_wdg.add_style("overflow-y: auto") details_wdg.add_style("padding-left: 15px") details_wdg.add_border() search_types = project.get_search_types() related_types = [] for search_type_obj in search_types: search_type_wdg = DivWdg() title = search_type_obj.get_title() search_type = search_type_obj.get_value("search_type") search_type_wdg.add_style("margin-top: 5px") search_type_wdg.add_style("margin-bottom: 5px") details_wdg.add(search_type_wdg) search_type_wdg.add(title) search_type_wdg.add(" (%s)" % search_type ) search = Search( search_type, project_code=project_code ) count = search.get_count() total_items += count search_type_wdg.add(" - %s item(s)" % count) # TODO: this is similar to SearchType.get_related_types(). streamline at some point. related_types = self.get_related_types(search_type) for related_type in related_types: try: search = Search(related_type) except Exception as e: print("WARNING: ", e) continue full_search_type = "%s?project=%s" % (search_type, project_code) if related_type.startswith("sthpw/"): search.add_filter("search_type", full_search_type) count = search.get_count() if count == 0: continue total_items += count related_wdg = DivWdg() related_wdg.add_style('padding-left: 25px') search_type_wdg.add(related_wdg) related_wdg.add(related_type) related_wdg.add(" - %s item(s)" % count) if total_items: total_items_wdg.add("Total # of items to be deleted: ") total_items_wdg.add(total_items) total_items_wdg.add_style("font-size: 14px") total_items_wdg.add_style("font-weight: bold") total_items_wdg.add("<br/>") content.add("<br/>"*2) content.add("<b>Do you wish to continue deleting? </b>") radio = RadioWdg("mode") radio.add_class("spt_mode_radio") radio.set_value("delete") radio.add_style("margin-left: 15") radio.add_style("margin-top: 5") content.add(radio) content.add("<br/>"*3) #content.add("<b>Or do you just wish to retire the project? </b>") #radio = RadioWdg("mode") #radio.add_class("spt_mode_radio") #radio.set_value("retire") #content.add(radio) #content.add(radio) #content.add("<br/>"*2) #button = ActionButtonWdg(title="Retire") #content.add(button) #button.add_style("float: left") buttons = Table() content.add(buttons) buttons.add_row() buttons.add_style("margin-left: auto") buttons.add_style("margin-right: auto") buttons.add_style("width: 250px") button = ActionButtonWdg(title="Delete", color="danger") buttons.add_cell(button) command_class = self.kwargs.get("command_class") if not command_class: command_class = 'tactic.ui.tools.DeleteProjectCmd' on_complete = self.kwargs.get("on_complete") button.add_behavior( { 'type': 'click_up', #'search_type': search_type, 'project_code': project_code, 'site': site, 'related_types': related_types, 'command_class': command_class, 'on_complete': on_complete, 'cbjs_action': ''' spt.app_busy.show("Deleting"); var class_name = bvr.command_class; var kwargs = { 'site': bvr.site, 'project_code': bvr.project_code, 'related_types': bvr.related_types }; var top = bvr.src_el.getParent(".spt_delete_project_tool_top"); var radios = top.getElements(".spt_mode_radio"); //if (!radios[0].checked && !radios[1].checked) { if (!radios[0].checked) { spt.alert("Please confirm the delete by checking the radio button."); spt.app_busy.hide(); return; } var mode = 'retire'; if (radios[0].checked == true) { mode = 'delete'; } if (mode == 'retire') { return; } var success = false; var server = TacticServerStub.get(); setTimeout(function() { spt.app_busy.show("Deleting Project ["+bvr.project_code+"]") var error_message = "Error deleting project ["+bvr.project_code+"]"; try { server.start({'title': 'Deleted Project ', 'description': 'Deleted Project [' + bvr.project_code + ']'}); server.execute_cmd(class_name, kwargs); success = true; } catch(e) { error_message = spt.exception.handler(e); } spt.app_busy.hide(); if (success) { if (bvr.on_complete) { on_complete = function() { eval(bvr.on_complete); } on_complete(); } spt.notify.show_message("Successfully deleted project ["+bvr.project_code+"]"); spt.tab.set_main_body_tab(); spt.tab.reload_selected(); } else { if (error_message.test(/does not exist/)) error_message += '. You are advised to sign out and log in again.'; spt.error(error_message); } var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); server.finish(); }, 100); ''' } ) button = ActionButtonWdg(title="Cancel") buttons.add_cell(button) button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); ''' } ) if site: Site.pop_site() return top
def get_display(my): top = my.top top.add_class("spt_changelist_content") my.set_as_panel(top) top.add_color("color", "color") top.add_color("background", "background") #top.add_border() #top.add_style("padding", "10px") top.add_style("min-width: 600px") top.add_style("min-height: 400px") top.add_behavior({'type': 'load', 'cbjs_action': scm_get_onload_js()}) sync_dir = Environment.get_sandbox_dir() # HARD CODED project = Project.get() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() location = '//%s' % depot changelist = my.kwargs.get("changelist") if not changelist: changelist = WidgetSettings.get_value_by_key("current_changelist") else: WidgetSettings.set_value_by_key("current_changelist", changelist) if not changelist: changelist = 'default' changelists = my.kwargs.get("changelists") if not changelists: changelists = [] elif isinstance(changelists, basestring): changelists = changelists.replace("'", '"') changelists = jsonloads(changelists) top.add_behavior({ 'type': 'load', 'sync_dir': sync_dir, 'depot': depot, 'cbjs_action': ''' spt.scm.sync_dir = bvr.sync_dir; spt.scm.depot = bvr.depot; ''' }) inner = DivWdg() top.add(inner) table = Table() inner.add(table) table.add_style("width: 100%") table.add_color("background", "background", -3) table.add_row() th = table.add_header("") th = table.add_header("Changelist") th.add_style("text-align: left") th = table.add_header("Description") th.add_style("text-align: left") th = table.add_header("# Items") th.add_style("text-align: left") th = table.add_header("Status") th.add_style("text-align: left") th = table.add_header("View") th.add_style("text-align: left") th = table.add_header("Delete") th.add_style("text-align: left") #table.set_unique_id() #table.add_smart_styles("spt_changelist_item", { # 'text-align: right' # } )) bgcolor = table.get_color("background", -8) table.add_relay_behavior({ 'type': 'mouseover', 'bvr_match_class': 'spt_changelist_item', 'bgcolor': bgcolor, 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); ''' }) table.add_relay_behavior({ 'type': 'mouseout', 'bvr_match_class': 'spt_changelist_item', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ''); ''' }) table.add_relay_behavior({ 'type': 'mouseup', 'bvr_match_class': "spt_changelist_radio", 'cbjs_action': ''' var changelist = bvr.src_el.value; var top = bvr.src_el.getParent(".spt_changelist_content"); top.setAttribute("spt_changelist", changelist); spt.app_busy.show("Loading Changelists Information"); spt.changelist.load(bvr.src_el, changelist); spt.app_busy.hide(); ''' }) for c in changelists: num_items = len(c.get("info")) name = c.get("change") tr = table.add_row() tr.add_class("spt_changelist_item") radio = RadioWdg("changelist") radio.add_class("spt_changelist_radio") table.add_cell(radio) radio.set_option("value", name) if name == changelist: radio.set_checked() table.add_cell(name) table.add_cell(c.get("desc")) table.add_cell(num_items) table.add_cell(c.get("status")) if num_items: icon = IconButtonWdg(title="View", icon=IconWdg.ZOOM) icon.add_behavior({ 'type': 'click_up', 'changelist': c.get("change"), 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_changelist_content"); top.setAttribute("spt_changelist", bvr.changelist); spt.app_busy.show("Loading Changelist"); spt.changelist.load(bvr.src_el, bvr.changelist); spt.app_busy.hide(); ''' }) else: icon = '' table.add_cell(icon) if not num_items and name != 'default': icon = IconButtonWdg(title="Delete Changelist", icon=IconWdg.DELETE) else: icon = "" table.add_cell(icon) inner.add("<hr/>") files = my.kwargs.get("files") if isinstance(files, basestring): files = files.replace("'", '"') files = jsonloads(files) if files == None: inner.add_behavior({ 'type': 'load', 'location': location, 'changelist': changelist, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.changelist = {} spt.changelist.load = function(el, changelist) { var applet = spt.Applet.get(); var changelists = spt.scm.run("get_changelists_by_user",[]); var dflt = { 'change': 'default', 'status': 'pending' } changelists.push(dflt); changelists = changelists.reverse(); for (var i = 0; i < changelists.length; i++) { var info = spt.scm.run("get_changelist_files",[changelists[i].change]); changelists[i]['info'] = info; } // get the current chnage list var files = spt.scm.run("get_changelist_files",[changelist]); var path_info = {}; var sizes = []; for ( var i = 0; i < files.length; i++) { // FIXME: perforce specific var path = files[i].depotFile; path = path.replace(bvr.location, bvr.sync_dir); files[i].path = path; var size; if (applet.exists(path)) { var info = applet.get_path_info(path); size = info.size; } else { size = 0; } sizes.push(size); path_info[path] = 'editable'; } //var ret_val = spt.scm.status(bvr.sync_dir); //console.log(ret_val); var class_name = 'tactic.ui.checkin.changelist_wdg.ChangelistWdg'; var kwargs = { files: files, sizes: sizes, changelist: changelist, changelists: changelists, path_info: path_info, } var top = el.getParent(".spt_changelist_content"); spt.panel.load(top, class_name, kwargs); } spt.changelist.load(bvr.src_el, bvr.changelist); ''' }) content = DivWdg() inner.add(content) content.add_class("spt_changelist_content") if files == None: loading_wdg = DivWdg() content.add(loading_wdg) loading_wdg.add("<b>Loading ...</b>") loading_wdg.add_style("padding: 30px") elif files: title_wdg = DivWdg() title_wdg.add_style("height: 15px") title_wdg.add("Changelist: [%s]" % changelist) content.add(title_wdg) title_wdg.add_gradient("background", "background", -5) title_wdg.add_style("padding: 5px") title_wdg.add_border() #button = SingleButtonWdg(tip='Add New Changelist', icon=IconWdg.ADD) #content.add(button) content.add("<br/>") paths = [x.get("path") for x in files] sizes = my.kwargs.get("sizes") path_info = my.kwargs.get("path_info") from scm_dir_list_wdg import ScmDirListWdg # dummy search_key search_key = "sthpw/virtual?code=xx001" dir_list_wdg = ScmDirListWdg( base_dir=sync_dir, paths=paths, sizes=sizes, path_info=path_info, all_open=True, #search_key=search_key ) content.add(dir_list_wdg) else: content.add("Changelist: [%s]" % changelist) content.add("<br/>" * 2) no_files_wdg = DivWdg() content.add(no_files_wdg) no_files_wdg.add_style("padding: 20px") no_files_wdg.add_border() no_files_wdg.add("No files in changelist") no_files_wdg.add_color("color", "color3") no_files_wdg.add_color("background", "background3") no_files_wdg.add_style("font-weight: bold") no_files_wdg.add_style("text-align: center") return top
def get_data_wdg(my): div = DivWdg() from pyasm.biz import Pipeline from pyasm.widget import SelectWdg search_type_obj = SearchType.get(my.search_type) base_type = search_type_obj.get_base_key() search = Search("sthpw/pipeline") search.add_filter("search_type", base_type) pipelines = search.get_sobjects() if pipelines: pipeline = pipelines[0] process_names = pipeline.get_process_names() if process_names: table = Table() div.add(table) table.add_row() table.add_cell("Process: ") select = SelectWdg("process") table.add_cell(select) process_names.append("---") process_names.append("publish") process_names.append("icon") select.set_option("values", process_names) #### buttons = Table() div.add(buttons) buttons.add_row() button = IconButtonWdg(title="Add Data", icon=IconWdg.FOLDER) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) dialog_data_div = DivWdg() dialog_data_div.add_color("background", "background") dialog_data_div.add_style("padding", "20px") dialog.add(dialog_data_div) # Order folders by date name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") if SearchType.column_exists(my.search_type, "relative_dir"): category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "none") category_div.add(checkbox) category_div.add(" No categories") category_div.add_style("margin-bottom: 5px") checkbox.set_option("checked", "true") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_day") category_div.add(checkbox) category_div.add(" Categorize files by Day") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_week") category_div.add(checkbox) category_div.add(" Categorize files by Week") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_year") category_div.add(checkbox) category_div.add(" Categorize files by Year") category_div.add_style("margin-bottom: 5px") """ checkbox = RadioWdg("category") checkbox.set_option("value", "custom") name_div.add(checkbox) name_div.add(" Custom") """ name_div.add("<br/>") hidden = HiddenWdg(name="parent_key") dialog_data_div.add(hidden) hidden.add_class("spt_parent_key") parent_key = my.kwargs.get("parent_key") or "" if parent_key: hidden.set_value(parent_key) dialog_data_div.add("Keywords:<br/>") dialog.add(dialog_data_div) text = TextAreaWdg(name="keywords") dialog_data_div.add(text) text.add_class("spt_keywords") text.add_style("padding: 1px") dialog_data_div.add("<br/>"*2) extra_data = my.kwargs.get("extra_data") if not isinstance(extra_data, basestring): extra_data = jsondumps(extra_data) dialog_data_div.add("Extra Data (JSON):<br/>") text = TextAreaWdg(name="extra_data") dialog_data_div.add(text) if extra_data != "null": text.set_value(extra_data) text.add_class("spt_extra_data") text.add_style("padding: 1px") #### TEST Image options """ button = IconButtonWdg(title="Resize", icon=IconWdg.FILM) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) try: from spt.tools.convert import ConvertOptionsWdg convert_div = DivWdg() dialog.add(convert_div) convert_div.add_style("padding: 20px") convert_div.add_color("background", "background") convert_div.add_class("spt_image_convert") convert = ConvertOptionsWdg() convert_div.add(convert) except: pass """ # use base name for name """ name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") checkbox = CheckboxWdg("use_file_name") name_div.add(checkbox) name_div.add(" Use name of file for name") name_div.add("<br/>") checkbox = CheckboxWdg("use_base_name") name_div.add(checkbox) name_div.add(" Remove extension") name_div.add("<br/>") checkbox = CheckboxWdg("file_keywords") name_div.add(checkbox) name_div.add(" Use file name for keywords") """ return div
def get_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("width", "400px") top.add_border() top.add_class("spt_delete_project_tool_top") project_code = my.kwargs.get("project_code") if project_code: project = Project.get_by_code(project_code) else: search_key = my.kwargs.get("search_key") project = Search.get_by_search_key(search_key) if project: project_code = project.get_code() title_wdg = DivWdg() if project: top.add(title_wdg) title_wdg.add(IconWdg(icon=IconWdg.WARNING)) title_wdg.add("Deleting Project: %s" % project.get_value("title")) title_wdg.add_gradient("background", "background", -10, -10) title_wdg.add_style("padding: 5px") title_wdg.add_style("font-weight: bold") title_wdg.add_style("font-size: 14px") content = DivWdg() top.add(content) content.add_style("padding: 10px") if not search_key: warning_msg = "Projects must be deleted individually" content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") return top warning_msg = "Deleting a project will delete the database associated with this project. All data will be lost. Please consider carefully before proceeding." if warning_msg: content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") if not project_code: content.add("This project [%s] has been deleted." % search_key) return top elif not project: content.add("This project [%s] has been deleted." % project_code) return top assert project_code assert project content.add("<br/>") content.add( "<b>WARNING: These items will be deleted, but the sTypes entries in search_objects table will be retained.</b> " ) content.add("<br/>") content.add("<br/>") total_items_wdg = DivWdg() total_items = 0 content.add(total_items_wdg) # find all of the sTypes details_wdg = DivWdg() content.add(details_wdg) details_wdg.add_style("max-height: 300px") details_wdg.add_style("overflow-y: auto") details_wdg.add_style("padding-left: 15px") details_wdg.add_border() search_types = project.get_search_types() related_types = [] for search_type_obj in search_types: search_type_wdg = DivWdg() title = search_type_obj.get_title() search_type = search_type_obj.get_value("search_type") search_type_wdg.add_style("margin-top: 5px") search_type_wdg.add_style("margin-bottom: 5px") details_wdg.add(search_type_wdg) search_type_wdg.add(title) search_type_wdg.add(" (%s)" % search_type) search = Search(search_type, project_code=project_code) count = search.get_count() total_items += count search_type_wdg.add(" - %s item(s)" % count) # TODO: this is similar to SearchType.get_related_types(). streamline at some point. related_types = my.get_related_types(search_type) for related_type in related_types: search = Search(related_type) full_search_type = "%s?project=%s" % (search_type, project_code) if related_type.startswith("sthpw/"): search.add_filter("search_type", full_search_type) count = search.get_count() if count == 0: continue total_items += count related_wdg = DivWdg() related_wdg.add_style('padding-left: 25px') search_type_wdg.add(related_wdg) related_wdg.add(related_type) related_wdg.add(" - %s item(s)" % count) if total_items: total_items_wdg.add("Total # of items to be deleted: ") total_items_wdg.add(total_items) total_items_wdg.add_style("font-size: 14px") total_items_wdg.add_style("font-weight: bold") total_items_wdg.add("<br/>") content.add("<br/>" * 2) content.add("<b>Do you wish to continue deleting? </b>") radio = RadioWdg("mode") radio.add_class("spt_mode_radio") radio.set_value("delete") content.add(radio) content.add("<br/>" * 2) #content.add("<b>Or do you just wish to retire the project? </b>") #radio = RadioWdg("mode") #radio.add_class("spt_mode_radio") #radio.set_value("retire") #content.add(radio) #content.add(radio) #content.add("<br/>"*2) #button = ActionButtonWdg(title="Retire") #content.add(button) #button.add_style("float: left") buttons = Table() content.add(buttons) buttons.add_row() buttons.add_style("margin-left: auto") buttons.add_style("margin-right: auto") buttons.add_style("width: 250px") button = ActionButtonWdg(title="Delete") buttons.add_cell(button) button.add_behavior({ 'type': 'click_up', #'search_type': search_type, 'project_code': project_code, 'related_types': related_types, 'cbjs_action': ''' spt.app_busy.show("Deleting"); var class_name = "tactic.ui.tools.DeleteProjectCmd"; var kwargs = { 'project_code': bvr.project_code, 'related_types': bvr.related_types }; var top = bvr.src_el.getParent(".spt_delete_project_tool_top"); var radios = top.getElements(".spt_mode_radio"); //if (!radios[0].checked && !radios[1].checked) { if (!radios[0].checked) { spt.alert("Please confirm the delete by checking the radio button."); spt.app_busy.hide(); return; } var mode = 'retire'; if (radios[0].checked == true) { mode = 'delete'; } if (mode == 'retire') { return; } var success = false; var server = TacticServerStub.get(); setTimeout(function() { spt.app_busy.show("Deleting Project ["+bvr.project_code+"]") var error_message = "Error deleting project ["+bvr.project_code+"]"; try { server.start({'title': 'Deleted Project ', 'description': 'Deleted Project [' + bvr.project_code + ']'}); server.execute_cmd(class_name, kwargs); success = true; var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); server.finish(); } catch(e) { error_message = spt.exception.handler(e); } spt.app_busy.hide(); if (success) { spt.notify.show_message("Successfully deleted project ["+bvr.project_code+"]"); spt.tab.set_main_body_tab(); spt.tab.reload_selected(); } else { if (error_message.test(/does not exist/)) error_message += '. You are advised to sign out and log in again.'; spt.error(error_message); } }, 100); ''' }) button = ActionButtonWdg(title="Cancel") buttons.add_cell(button) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); ''' }) return top
def get_display(my): top = my.top my.set_as_panel(top) top.add_behavior( { 'type': 'load', 'cbjs_action': ''' spt.named_events.fire_event("side_bar|hide") ''' } ) top.add_style("width: 100%") top.add_color("background", "background", -10) top.add_style("padding-top: 10px") top.add_style("padding-bottom: 50px") top.add_class("spt_project_top") inner = DivWdg() top.add(inner) inner.add_style("width: 700px") inner.add_style("float: center") inner.add_border() inner.center() inner.add_style("padding: 30px") inner.add_color("background", "background") from tactic.ui.container import WizardWdg title = DivWdg() title.add("Create A New Project") wizard = WizardWdg(title=title, width="100%") inner.add(wizard) help_button = ActionButtonWdg(title="?", tip="Create Project Help", size='s') title.add(help_button) help_button.add_style("float: right") help_button.add_style("margin-top: -20px") help_button.add_style("margin-right: -10px") help_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_alias("create-new-project"); ''' }) info_page = DivWdg() wizard.add(info_page, 'Info') info_page.add_class("spt_project_top") info_page.add_style("font-size: 12px") info_page.add_color("background", "background") info_page.add_color("color", "color") info_page.add_style("padding: 20px") from tactic.ui.input import TextInputWdg info_page.add("<b>Project Title:</b> ") text = TextWdg("project_title") text.add_behavior( { 'type': 'blur', 'cbjs_action': ''' if (bvr.src_el.value == '') { spt.alert("You must enter a project title"); return; } '''}) #text = TextInputWdg(title="project_title") info_page.add(text) text.add_style("width: 250px") info_page.add(HtmlElement.br(3)) span = DivWdg() info_page.add(span) span.add_style("padding: 20px 20px 20px 20px") span.add(IconWdg("INFO", IconWdg.CREATE)) span.add_color("background", "background3") span.add("The project title can be descriptive and contain spaces and special characters.") info_page.add("<br/><br/><hr/><br/><br/>") text.add_behavior( { 'type': 'change', 'cbjs_action': ''' var title = bvr.src_el.value; if (title.length > 100) { spt.alert("Title cannot exceed 100 characters."); return; } var code = spt.convert_to_alpha_numeric(title); code = code.substring(0,30); var top = bvr.src_el.getParent(".spt_project_top"); var code_el = top.getElement(".spt_project_code"); code_el.value = code; ''' } ) info_page.add("<b>Project Code: </b>") text = TextWdg("project_code") #text = TextInputWdg(title="project_code") text.add_behavior( { 'type': 'blur', 'cbjs_action': ''' var value = bvr.src_el.value; var code = spt.convert_to_alpha_numeric(value); bvr.src_el.value = code; if (code == '') { spt.alert("You must enter a project code."); return; } if (spt.input.has_special_chars(code)) { spt.alert("Project code cannot contain special characters."); return; } if (code.test(/^\d/)) { spt.alert("Project code cannot start with a number."); return; } if (code.length > 30) { spt.alert("Project code cannot exceed 30 characters."); return; } ''' } ) info_page.add(text) text.add_style("width: 250px") text.add_class("spt_project_code") info_page.add(HtmlElement.br(4)) span = DivWdg() info_page.add(span) span.add_style("padding: 20px 20px 20px 20px") span.add(IconWdg("INFO", IconWdg.CREATE)) span.add_color("background", "background3") span.add("The project code is a very important key that will tie many components of the project together.") span.add("<br/><br/>") span.add("* Note: the project code must contain only alphanumeric characters [A-Z]/[0-9] and only an '_' as a separator") info_page.add(span) info_page.add("<br/>"*2) projects = Project.get_all_projects() info_page.add("<b>Is Main Project? </b>") checkbox = CheckboxWdg("is_main_project") default_project_code = Config.get_value("install", "default_project") info_page.add(checkbox) if default_project_code: default_project = Project.get_by_code(default_project_code) else: default_project = None if default_project: default_title = default_project.get_value("title") info_span = SpanWdg() info_page.add(info_span) info_span.add("%sCurrent: %s (%s)" % (" "*3, default_title, default_project_code)) info_span.add_style("font-size: 0.9em") info_span.add_style("font-style: italic") else: if len(projects) == 0: checkbox.set_checked() info_page.add("<br/>"*2) span = DivWdg() info_page.add(span) span.add_style("padding: 20px 20px 20px 20px") span.add(IconWdg("INFO", IconWdg.CREATE)) span.add_color("background", "background3") span.add("A TACTIC installation can have multiple projects, but one can be designated as the main project. This project will appear at the root of the url. This is meant for building custom project launcher which is based on a main project.") span.add("<br/>"*2) span.add("* Note: TACTIC may need to be restarted in order for this to take effect") info_page.add(span) info_page.add("<br/>") # add an icon for this project image_div = DivWdg() wizard.add(image_div, 'Preview Image') image_div.add_class("spt_image_top") image_div.add_color("background", "background") image_div.add_color("color", "color") image_div.add_style("padding: 20px") image_div.add("<b>Project Image: </b>") image_div.add("<br/>"*3) on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var top = bvr.src_el.getParent(".spt_image_top"); var text = top.getElement(".spt_image_path"); var display = top.getElement(".spt_path_display"); var check_icon = top.getElement(".spt_check_icon"); var server = TacticServerStub.get(); var ticket = spt.Environment.get().get_ticket(); display.innerHTML = "Uploaded: " + file.name; display.setStyle("padding", "10px"); check_icon.setStyle("display", ""); var filename = file.name; filename = spt.path.get_filesystem_name(filename); var kwargs = { ticket: ticket, filename: filename } try { var ret_val = server.execute_cmd("tactic.command.CopyFileToAssetTempCmd", kwargs); var info = ret_val.info; var path = info.web_path; text.value = info.lib_path; display.innerHTML = display.innerHTML + "<br/><br/><div style='text-align: center'><img style='width: 80px;' src='"+path+"'/></div>"; } catch(e) { spt.alert(spt.exception.handler(e)); } spt.app_busy.hide(); } else { spt.alert('Error: file object cannot be found.') } spt.app_busy.hide(); ''' button = UploadButtonWdg(title="Browse", on_complete=on_complete) button.add_style("margin-left: auto") button.add_style("margin-right: auto") image_div.add(button) text = HiddenWdg("project_image_path") text.add_class("spt_image_path") image_div.add(text) check_div = DivWdg() image_div.add(check_div) check_div.add_class("spt_check_icon") check_icon = IconWdg("Image uploaded", IconWdg.CHECK) check_div.add(check_icon) check_div.add_style("display: none") check_div.add_style("float: left") check_div.add_style("padding-top: 8px") path_div = DivWdg() image_div.add(path_div) path_div.add_class("spt_path_display") image_div.add(HtmlElement.br(3)) span = DivWdg() image_div.add(span) span.add_style("padding: 20px 20px 20px 20px") span.add_color("background", "background3") span.add(IconWdg("INFO", IconWdg.CREATE)) span.add("The project image is a small image that will be used in various places as a visual representation of this project.") info_page.add("<br/><br/>") # get all of the template projects that are installed copy_div = DivWdg() wizard.add(copy_div, "Template") copy_div.add_style("padding-top: 20px") template = ActionButtonWdg(title="Manage", tip="Manage Templates") copy_div.add(template) template.add_style("float: right") template.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.app.ProjectTemplateWdg' spt.panel.load_popup("Templates", class_name) ''' } ) template.add_style("margin-top: -5px") copy_div.add("<b>Copy From Template: </b>") search = Search("sthpw/project") search.add_filter("is_template", True) template_projects = search.get_sobjects() values = [x.get_value("code") for x in template_projects] labels = [x.get_value("title") for x in template_projects] # find all of the template projects installed template_dir = Environment.get_template_dir() import os if not os.path.exists(template_dir): paths = [] else: paths = os.listdir(template_dir); file_values = [] file_labels = [] for path in paths: if path.endswith("zip"): orig_path = '%s/%s'%(template_dir, path) path = path.replace(".zip", "") parts = path.split("-") plugin_code = parts[0] # skip if there is a matching project in the database #match_project = plugin_code.replace("_template", "") match_project = plugin_code old_style_plugin_code = re.sub( '_template$', '', plugin_code) if match_project in values: continue elif old_style_plugin_code in values: continue label = "%s (from file)" % Common.get_display_title(match_project) # for zip file, we want the path as well value = '%s|%s'%(plugin_code, orig_path) file_values.append(value) file_labels.append(label) if file_values: values.extend(file_values) labels.extend(file_labels) values.insert(0, "_empty") labels.insert(0, "- Empty Project -") select = SelectWdg("project_source") copy_div.add(select) select.set_option("values", values) select.set_option("labels", labels) #select.add_empty_option("-- Select --") select.add_behavior( { 'type': 'change', 'cbjs_action': ''' var value = bvr.src_el.value; var top = bvr.src_el.getParent(".spt_project_top"); var type = top.getElement(".spt_custom_project_top"); var namespace_option = top.getElement(".spt_custom_namespace_top"); var theme_el = top.getElement(".spt_theme_top"); if (bvr.src_el.value == "_empty") { spt.show(type); spt.show(namespace_option); spt.show(theme_el); } else { spt.hide(type); spt.hide(namespace_option); spt.hide(theme_el); } ''' } ) copy_div.add(HtmlElement.br(3)) span = DivWdg() copy_div.add(span) span.add_style("padding: 20px 20px 20px 20px") span.add(IconWdg("INFO", IconWdg.CREATE)) span.add_color("background", "background3") span.add("This will use the selected project template as a basis and copy all of the configuration elements. Only template projects should be copied.") #copy_div.add(HtmlElement.br(2)) #span = DivWdg("This will create an empty project with no predefined configuration.") #copy_div.add(span) # # Theme # theme_div = DivWdg() theme_div.add_class("spt_theme_top") theme_div.add_style("padding: 10px") theme_div.add_style("margin-top: 20px") copy_div.add(theme_div) theme_div.add("<b>Theme: </b> ") theme_div.add_style('padding-right: 6px') theme_select = SelectWdg('project_theme') theme_div.add(theme_select) # look in the plugins for all of the themes? from pyasm.biz import PluginUtil plugin_util = PluginUtil() data = plugin_util.get_plugins_data("theme") builtin_dir = Environment.get_builtin_plugin_dir() plugin_util = PluginUtil(base_dir=builtin_dir) data2 = plugin_util.get_plugins_data("theme") data = dict(data.items() + data2.items()) themes = data.keys() themes.sort() theme_select.set_option("values", themes) theme_select.add_empty_option('- No Theme -') default_theme = "TACTIC/default_theme" theme_select.set_value(default_theme) theme_select.add_behavior( { 'type': 'change', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_project_top"); var img_div = top.getElement(".spt_project_theme_div"); var theme = bvr.src_el.value; var img_els = img_div.getElements(".spt_project_theme_image"); for (var i = 0; i < img_els.length; i++) { if (theme == img_els[i].getAttribute("spt_theme") ) { img_els[i].setStyle("display", ""); } else { img_els[i].setStyle("display", "none"); } } ''' } ) theme_img_div = DivWdg() theme_div.add(theme_img_div) theme_img_div.add_class("spt_project_theme_div") for theme in themes: theme_item = DivWdg() theme_item.add_style("margin: 15px") theme_img_div.add(theme_item) theme_item.add_attr("spt_theme", theme) theme_item.add_class("spt_project_theme_image") if theme != default_theme: theme_item.add_style("display: none") table = Table() theme_item.add(table) table.add_row() if Environment.is_builtin_plugin(theme): theme_img = HtmlElement.img(src="/tactic/builtin_plugins/%s/media/screenshot.jpg" % theme) else: theme_img = HtmlElement.img(src="/tactic/plugins/%s/media/screenshot.jpg" % theme) theme_img.add_border() theme_img.set_box_shadow("1px 1px 1px 1px") theme_img.add_style("margin: 20px 10px") theme_img.add_style("width: 240px") plugin_data = data.get(theme) description = plugin_data.get("description") if not description: description = "No Description" table.add_cell(theme_img) table.add_cell( description ) theme_img_div.add_style("text-align: center") theme_img_div.add_style("margin: 10px") # # namespace # ns_div = DivWdg() ns_div.add_class("spt_custom_namespace_top") ns_div.add_style("padding: 10px") copy_div.add(ns_div) ns_div.add("<br/>") ns = HtmlElement.b("Namespace:") ns.add_style('padding-right: 6px') ns_div.add(ns) text = TextWdg('custom_namespace') text.add_class("spt_custom_namespace") text.add_behavior( { 'type': 'blur', 'cbjs_action': ''' var project_namespace = bvr.src_el.value; if (['sthpw','prod'].contains(project_namespace)) spt.alert('Namespace [' + project_namespace + '] is reserved.'); if (project_namespace.strip()=='') spt.alert('A "default" namespace will be used if you leave it empty.'); '''}) ns_div.add(text) hint = HintWdg('This will be used as the prefix for your sTypes. You can use your company name for instance') ns_div.add(hint) # is_template is_template_div = DivWdg() #is_template_div.add_style('display: none') is_template_div.add_class("spt_custom_project_top") is_template_div.add_style("padding: 10px") copy_div.add(is_template_div) is_template_div.add("<br/>") is_template_div.add("<b>Is this project a template: </b>") text = CheckboxWdg("custom_is_template") text.add_class("spt_custom_is_template") is_template_div.add(text) is_template_div.add(HtmlElement.br(2)) span = DivWdg("Template projects are used as a blueprint for generating new projects.") is_template_div.add(span) # Disabling for now ... advanced feature and may not be necessary #stypes_div = my.get_stypes_div() #is_template_div.add(stypes_div) last_page = DivWdg() wizard.add(last_page, "Complete") last_page.add_style("padding-top: 80px") last_page.add_style("padding-left: 30px") cb = RadioWdg('jump_project', label='Jump to New Project') cb.set_option("value", "project") #cb.set_option('disabled','disabled') cb.set_checked() last_page.add(cb) last_page.add(HtmlElement.br(2)) cb = RadioWdg('jump_project', label='Jump to Project Admin') cb.set_option("value", "admin") last_page.add(cb) last_page.add(HtmlElement.br(2)) cb = RadioWdg('jump_project', label='Create Another Project') cb.set_option("value", "new") last_page.add(cb) last_page.add(HtmlElement.br(5)) button_div = DivWdg() create_button = ActionButtonWdg(title="Create >>", tip="Create new project") wizard.add_submit_button(create_button) #button_div.add(create_button) create_button.add_style("float: right") create_button.add_behavior({ 'type': "click_up", 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_project_top"); var values = spt.api.Utility.get_input_values(top, null, null, null, {cb_boolean: true}); var project_code = values['project_code'][0]; if (project_code == '') { spt.alert("You must enter a project code."); return; } if (spt.input.has_special_chars(project_code)) { spt.alert("Project code cannot contain special characters."); return; } if (project_code.test(/^\d/)) { spt.alert("Project code cannot start with a number."); return; } if (values['project_title'] == '') { spt.alert("You must enter a project title"); return; } var project_source = values.project_source[0]; var project_image_path = values['project_image_path'][0]; var project_theme = values['project_theme'][0]; var options = { 'project_code': project_code, 'project_title': values['project_title'][0], 'project_image_path': project_image_path, 'project_theme': project_theme, } //'copy_pipelines': values['copy_pipelines'][0] var class_name; var busy_title; var busy_msg; var use_transaction; if (project_source == '') { spt.alert("Please select a template to copy or select create an empty project"); return; } else if (project_source != '_empty') { busy_title = "Copying Project"; busy_msg = "Copying project ["+project_source+"] ..."; use_transaction = false; class_name = 'tactic.command.ProjectTemplateInstallerCmd'; if (project_source.test(/\|/)) { var tmps = project_source.split('|'); project_source = tmps[0]; var path = tmps[1]; options['path'] = path; } options['template_code'] = project_source; options['force_database'] = true; } else { class_name = "tactic.command.CreateProjectCmd"; busy_title = "Creating New Project"; busy_msg = "Creating new project based on project info ..."; use_transaction = true; // use project code as the project type if namespace is not specified var project_namespace = values['custom_namespace'][0]; if (['sthpw','prod'].contains(project_namespace)) { spt.alert('Namespace [' + project_namespace + '] is reserved.'); return; } options['project_type'] = project_namespace ? project_namespace : project_code var is_template = values['custom_is_template']; if (is_template) { options['is_template'] = is_template[0]; } // This has been commented out in the UI //options['project_stype'] = values['project_stype'].slice(1); var is_main_project = values['is_main_project']; if (is_main_project) { options['is_main_project'] = is_main_project[0]; } } // Display app busy pop-up until create project command // has completed executing. spt.app_busy.show( busy_title, busy_msg ); setTimeout( function() { var ret_val = ''; var server = TacticServerStub.get(); try { ret_val = server.execute_cmd(class_name, options, {}, {use_transaction: true}); } catch(e) { spt.app_busy.hide(); spt.alert("Error: " + spt.exception.handler(e)); return; throw(e); } spt.api.Utility.clear_inputs(top); // show feedback at the end var jump = values['jump_project'][0]; if (jump == 'project' || jump == 'admin') { var location; if (jump == 'admin') { location = "/tactic/" + project_code + "/admin"; } else if (project_theme) { location = "/tactic/" + project_code + "/"; } else { location = "/tactic/" + project_code + "/admin/link/_startup"; } setTimeout( function() { document.location = location; }, 1000); } else { // Refresh header spt.panel.refresh(top); setTimeout( function() { spt.panel.refresh('ProjectSelectWdg'); }, 2800); spt.app_busy.hide(); } // don't hide because it gives the false impression that nothing // happened as it waits for the timeout //spt.app_busy.hide(); }, 0 ); ''' }) cancel_script = my.kwargs.get("cancel_script") if cancel_script: cancel_button = ActionButtonWdg(title="Cancel") cancel_button.add_style("float: left") cancel_button.add_behavior({ 'type': "click_up", 'cbjs_action': cancel_script }) button_div.add(cancel_button) create_button.add_style("margin-right: 15px") create_button.add_style("margin-left: 75px") button_div.add("<br clear='all'/>") last_page.add(button_div) inner.add(HtmlElement.br()) return top
class DeleteProjectToolWdg(DeleteToolWdg): # For now, project creation is not undoable def is_undoable(cls): return True is_undoable = classmethod(is_undoable) def get_related_types(my, search_type): # find all the relationships schema = Schema.get() related_types = schema.get_related_search_types(search_type) parent_type = schema.get_parent_type(search_type) child_types = schema.get_child_types(search_type) # some special considerations # FIXME: this needs to be more automatic. Should only be # deletable children (however, that will be defined) if search_type in ['sthpw/task', 'sthpw/note', 'sthpw/snapshot']: if "sthpw/project" in related_types: related_types.remove("sthpw/project") if "sthpw/login" in related_types: related_types.remove("sthpw/login") if "config/process" in related_types: related_types.remove("config/process") if parent_type in related_types: related_types.remove(parent_type) related_types.append('sthpw/note') related_types.append('sthpw/task') related_types.append('sthpw/snapshot') related_types.append('sthpw/work_hour') related_types.append('sthpw/pipeline') related_types.append('sthpw/sobject_list') return related_types def get_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("width", "400px") top.add_border() top.add_class("spt_delete_project_tool_top") login = Environment.get_user_name() if login != 'admin': top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Only Admin can delete projects") top.add_style("padding: 50px") top.add_style("text-align: center") return top site = my.kwargs.get("site") if site: Site.set_site(site) project_code = my.kwargs.get("project_code") # check if delete permissions exist for this site and project security = Environment.get_security() if False and not security.check_access("project", project_code, "delete"): top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Not permitted to delete this project") top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top if project_code: project = Project.get_by_code(project_code) if not project: top.add(IconWdg(icon=IconWdg.WARNING)) top.add("No project [%s] exists in this database" % project_code) top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top search_key = project.get_search_key() else: search_key = my.kwargs.get("search_key") project = Search.get_by_search_key(search_key) if project: project_code = project.get_code() title_wdg = DivWdg() if project: top.add(title_wdg) title_wdg.add(IconWdg(icon=IconWdg.WARNING)) title_wdg.add("Deleting Project: %s" % project.get_value("title")) title_wdg.add_color("background", "background", -5) title_wdg.add_style("padding: 5px") title_wdg.add_style("font-weight: bold") title_wdg.add_style("font-size: 14px") content = DivWdg() top.add(content) content.add_style("padding: 10px") if not search_key: warning_msg = "Projects must be deleted individually" content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") return top warning_msg = "Deleting a project will delete the database associated with this project. All data and files will be lost. Please consider carefully before proceeding." if warning_msg: warning_wdg = DivWdg(warning_msg, css='warning') content.add(warning_wdg) warning_wdg.add_style("margin: 20 10px") content.add("<br/>") if not project_code: content.add("This project [%s] has been deleted." % search_key) return top elif not project: content.add("This project [%s] has been deleted." % project_code) return top assert project_code assert project content.add("<br/>") content.add( "<b>NOTE: These items will be deleted, but the sTypes entries in search_objects table will be retained.</b> " ) content.add("<br/>") content.add("<br/>") total_items_wdg = DivWdg() total_items = 0 content.add(total_items_wdg) # find all of the sTypes details_wdg = DivWdg() content.add(details_wdg) details_wdg.add_style("max-height: 300px") details_wdg.add_style("overflow-y: auto") details_wdg.add_style("padding-left: 15px") details_wdg.add_border() search_types = project.get_search_types() related_types = [] for search_type_obj in search_types: search_type_wdg = DivWdg() title = search_type_obj.get_title() search_type = search_type_obj.get_value("search_type") search_type_wdg.add_style("margin-top: 5px") search_type_wdg.add_style("margin-bottom: 5px") details_wdg.add(search_type_wdg) search_type_wdg.add(title) search_type_wdg.add(" (%s)" % search_type) search = Search(search_type, project_code=project_code) count = search.get_count() total_items += count search_type_wdg.add(" - %s item(s)" % count) # TODO: this is similar to SearchType.get_related_types(). streamline at some point. related_types = my.get_related_types(search_type) for related_type in related_types: try: search = Search(related_type) except Exception, e: print "WARNING: ", e continue full_search_type = "%s?project=%s" % (search_type, project_code) if related_type.startswith("sthpw/"): search.add_filter("search_type", full_search_type) count = search.get_count() if count == 0: continue total_items += count related_wdg = DivWdg() related_wdg.add_style('padding-left: 25px') search_type_wdg.add(related_wdg) related_wdg.add(related_type) related_wdg.add(" - %s item(s)" % count) if total_items: total_items_wdg.add("Total # of items to be deleted: ") total_items_wdg.add(total_items) total_items_wdg.add_style("font-size: 14px") total_items_wdg.add_style("font-weight: bold") total_items_wdg.add("<br/>") content.add("<br/>" * 2) content.add("<b>Do you wish to continue deleting? </b>") radio = RadioWdg("mode") radio.add_class("spt_mode_radio") radio.set_value("delete") radio.add_style("margin-left: 15") radio.add_style("margin-top: 5") content.add(radio) content.add("<br/>" * 3) #content.add("<b>Or do you just wish to retire the project? </b>") #radio = RadioWdg("mode") #radio.add_class("spt_mode_radio") #radio.set_value("retire") #content.add(radio) #content.add(radio) #content.add("<br/>"*2) #button = ActionButtonWdg(title="Retire") #content.add(button) #button.add_style("float: left") buttons = Table() content.add(buttons) buttons.add_row() buttons.add_style("margin-left: auto") buttons.add_style("margin-right: auto") buttons.add_style("width: 250px") button = ActionButtonWdg(title="Delete", color="danger") buttons.add_cell(button) command_class = my.kwargs.get("command_class") if not command_class: command_class = 'tactic.ui.tools.DeleteProjectCmd' on_complete = my.kwargs.get("on_complete") button.add_behavior({ 'type': 'click_up', #'search_type': search_type, 'project_code': project_code, 'site': site, 'related_types': related_types, 'command_class': command_class, 'on_complete': on_complete, 'cbjs_action': ''' spt.app_busy.show("Deleting"); var class_name = bvr.command_class; var kwargs = { 'site': bvr.site, 'project_code': bvr.project_code, 'related_types': bvr.related_types }; var top = bvr.src_el.getParent(".spt_delete_project_tool_top"); var radios = top.getElements(".spt_mode_radio"); //if (!radios[0].checked && !radios[1].checked) { if (!radios[0].checked) { spt.alert("Please confirm the delete by checking the radio button."); spt.app_busy.hide(); return; } var mode = 'retire'; if (radios[0].checked == true) { mode = 'delete'; } if (mode == 'retire') { return; } var success = false; var server = TacticServerStub.get(); setTimeout(function() { spt.app_busy.show("Deleting Project ["+bvr.project_code+"]") var error_message = "Error deleting project ["+bvr.project_code+"]"; try { server.start({'title': 'Deleted Project ', 'description': 'Deleted Project [' + bvr.project_code + ']'}); server.execute_cmd(class_name, kwargs); success = true; var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); server.finish(); } catch(e) { error_message = spt.exception.handler(e); } spt.app_busy.hide(); if (success) { if (bvr.on_complete) { on_complete = function() { eval(bvr.on_complete); } on_complete(); } spt.notify.show_message("Successfully deleted project ["+bvr.project_code+"]"); spt.tab.set_main_body_tab(); spt.tab.reload_selected(); } else { if (error_message.test(/does not exist/)) error_message += '. You are advised to sign out and log in again.'; spt.error(error_message); } }, 100); ''' }) button = ActionButtonWdg(title="Cancel") buttons.add_cell(button) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); spt.popup.destroy(top); ''' }) if site: Site.pop_site() return top
def get_data_wdg(my): div = DivWdg() from pyasm.biz import Pipeline from pyasm.widget import SelectWdg search_type_obj = SearchType.get(my.search_type) base_type = search_type_obj.get_base_key() search = Search("sthpw/pipeline") search.add_filter("search_type", base_type) pipelines = search.get_sobjects() if pipelines: pipeline = pipelines[0] process_names = pipeline.get_process_names() if process_names: table = Table() div.add(table) table.add_row() table.add_cell("Process: ") select = SelectWdg("process") table.add_cell(select) process_names.append("---") process_names.append("publish") process_names.append("icon") select.set_option("values", process_names) #### buttons = Table() div.add(buttons) buttons.add_row() #button = IconButtonWdg(title="Fill in Data", icon=IconWdg.EDIT) button = ActionButtonWdg(title="Metadata") button.add_style("float: left") button.add_style("margin-top: -3px") buttons.add_cell(button) select_label = DivWdg("Update mode") select_label.add_style("float: left") select_label.add_style("margin-top: -3px") select_label.add_style("margin-left: 20px") buttons.add_cell(select_label) update_mode_option = my.kwargs.get("update_mode") if not update_mode_option: update_mode_option = "true" update_mode = SelectWdg(name="update mode") update_mode.add_class("spt_update_mode_select") update_mode.set_option("values", ["false", "true", "sequence"]) update_mode.set_option("labels", ["Off", "On", "Sequence"]) update_mode.set_option("default", update_mode_option) update_mode.add_style("float: left") update_mode.add_style("margin-top: -3px") update_mode.add_style("margin-left: 5px") update_mode.add_style("margin-right: 5px") buttons.add_cell(update_mode) update_info = DivWdg() update_info.add_class("glyphicon") update_info.add_class("glyphicon-info-sign") update_info.add_style("float: left") update_info.add_style("margin-top: -3px") update_info.add_style("margin-left: 10px") update_info.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.info("When update mode is on, if a file shares the name of one other file in the asset library, the file will update on ingest. If more than one file shares the name of an ingested asset, a new asset is created.<br> If sequence mode is selected, the system will update the sobject on ingest if a file sequence sharing the same name already exists.", {type: 'html'}); ''' }) buttons.add_cell(update_info) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x': -10, 'y': 10}) dialog_data_div = DivWdg() dialog_data_div.add_color("background", "background") dialog_data_div.add_style("padding", "20px") dialog.add(dialog_data_div) # Order folders by date name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") if SearchType.column_exists(my.search_type, "relative_dir"): category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "none") category_div.add(checkbox) category_div.add(" No categories") category_div.add_style("margin-bottom: 5px") checkbox.set_option("checked", "true") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_day") category_div.add(checkbox) category_div.add(" Categorize files by Day") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_week") category_div.add(checkbox) category_div.add(" Categorize files by Week") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_year") category_div.add(checkbox) category_div.add(" Categorize files by Year") category_div.add_style("margin-bottom: 5px") """ checkbox = RadioWdg("category") checkbox.set_option("value", "custom") name_div.add(checkbox) name_div.add(" Custom") """ name_div.add("<br/>") ingest_data_view = my.kwargs.get('ingest_data_view') from tactic.ui.panel import EditWdg sobject = SearchType.create(my.search_type) edit = EditWdg(search_key=sobject.get_search_key(), mode='view', view=ingest_data_view) dialog_data_div.add(edit) hidden = HiddenWdg(name="parent_key") dialog_data_div.add(hidden) hidden.add_class("spt_parent_key") parent_key = my.kwargs.get("parent_key") or "" if parent_key: hidden.set_value(parent_key) extra_data = my.kwargs.get("extra_data") if not isinstance(extra_data, basestring): extra_data = jsondumps(extra_data) if extra_data and extra_data != "null": # it needs a TextArea instead of Hidden because of JSON data text = TextAreaWdg(name="extra_data") text.add_style('display: none') text.set_value(extra_data) dialog_data_div.add(text) """ dialog_data_div.add("Keywords:<br/>") dialog.add(dialog_data_div) text = TextAreaWdg(name="keywords") dialog_data_div.add(text) text.add_class("spt_keywords") text.add_style("padding: 1px") dialog_data_div.add("<br/>"*2) text.add_class("spt_extra_data") text.add_style("padding: 1px") """ #### TEST Image options """ button = IconButtonWdg(title="Resize", icon=IconWdg.FILM) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) try: from spt.tools.convert import ConvertOptionsWdg convert_div = DivWdg() dialog.add(convert_div) convert_div.add_style("padding: 20px") convert_div.add_color("background", "background") convert_div.add_class("spt_image_convert") convert = ConvertOptionsWdg() convert_div.add(convert) except: pass """ # use base name for name """ name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") checkbox = CheckboxWdg("use_file_name") name_div.add(checkbox) name_div.add(" Use name of file for name") name_div.add("<br/>") checkbox = CheckboxWdg("use_base_name") name_div.add(checkbox) name_div.add(" Remove extension") name_div.add("<br/>") checkbox = CheckboxWdg("file_keywords") name_div.add(checkbox) name_div.add(" Use file name for keywords") """ return div
def get_versions_wdg(my): div = DivWdg() div.add_class("spt_imports") title_wdg = DivWdg() div.add(title_wdg) title_wdg.add("Imports found:") title_wdg.add_style("padding: 0px 0px 8px 0px") base_dir = my.kwargs.get("base_dir") imports_dir = "%s/imports" % base_dir if not os.path.exists(imports_dir): imports_dir = base_dir basenames = os.listdir(imports_dir) basenames.sort() basenames.reverse() div.add_relay_behavior({ 'type': 'mouseup', 'bvr_match_class': "spt_import_item", 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_imports"); var els = top.getElements(".spt_import_info"); for ( var i = 0; i < els.length; i++) { spt.hide(els[i]); } var el = bvr.src_el.getElement(".spt_import_info"); spt.show(el); ''' }) # find all the zip files count = 0 for basename in basenames: if not basename.endswith(".txt"): continue if basename.find("-files-") != -1: continue if basename.find("-data-") != -1: continue version_wdg = DivWdg() div.add(version_wdg) version_wdg.add_style("padding: 3px 3px 3px 12px") version_wdg.add_class("spt_import_item") radio = RadioWdg("basename") version_wdg.add(radio) radio.set_option("value", basename) if not count: radio.set_checked() version_wdg.add(basename) version_wdg.add("<br/>") # add info path = "%s/%s" % (imports_dir, basename) f = open(path) data = f.read() f.close() data = jsonloads(data) table = Table() version_wdg.add(table) table.add_class("spt_import_info") if count: table.add_style("display: none") table.set_max_width() table.add_style("margin-left: 40px") table.add_style("margin-right: 20px") version_wdg.add(table) for name, value in my.data.items(): name = Common.get_display_title(name) table.add_row() table.add_cell(name) table.add_cell(value) count += 1 if count == 0: msg_wdg = DivWdg() div.add(msg_wdg) msg_wdg.add("<i>No imports found</i>") msg_wdg.add_border() msg_wdg.add_style("padding: 20px") msg_wdg.add_style("padding: 10px") msg_wdg.add_style("text-align: center") msg_wdg.add_color("background", "background", -10) return div
def get_display(my): top = my.top top.add_class("spt_branch_content") my.set_as_panel(top) top.add_color("color", "color") top.add_color("background", "background") #top.add_border() #top.add_style("padding", "10px") top.add_style("min-width: 600px") top.add_style("min-height: 400px") top.add_behavior( { 'type': 'load', 'cbjs_action': scm_get_onload_js() } ) sync_dir = Environment.get_sandbox_dir() project = Project.get() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() location = '//%s' % depot branch = my.kwargs.get("branch") if not branch: branch = WidgetSettings.get_value_by_key("current_branch") else: WidgetSettings.set_value_by_key("current_branch", branch) if not branch: branch = 'main' branches = my.kwargs.get("branches") if not branches: branches = [] elif isinstance(branches, basestring): branches = branches.replace("'", '"') branches = jsonloads(branches) top.add_behavior( { 'type': 'load', 'depot': depot, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.scm.sync_dir = bvr.sync_dir; spt.scm.depot = bvr.depot; ''' } ) inner = DivWdg() top.add(inner) table = Table() inner.add(table) table.add_style("width: 100%") table.add_row() th = table.add_header("") th = table.add_header("Branches") th.add_style("text-align: left") th = table.add_header("Options") th.add_style("text-align: left") th = table.add_header("Owner") th.add_style("text-align: left") th = table.add_header("Check-out") th.add_style("text-align: left") bgcolor = table.get_color("background", -8) table.add_relay_behavior( { 'type': 'mouseover', 'bvr_match_class': 'spt_branch_item', 'bgcolor': bgcolor, 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); ''' } ) table.add_relay_behavior( { 'type': 'mouseout', 'bvr_match_class': 'spt_branch_item', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ''); ''' } ) table.add_relay_behavior( { 'type': 'mouseup', 'bvr_match_class': "spt_branch_radio", 'cbjs_action': ''' var value = bvr.src_el.value; spt.app_busy.show("Setting current branch to " + value); var server = TacticServerStub.get(); server.set_widget_setting("current_branch", value); var top = bvr.src_el.getParent(".spt_checkin_top"); top.removeAttribute("spt_sandbox_dir"); spt.panel.refresh(top); spt.app_busy.hide(); ''' } ) for c in branches: name = c.get("branch") tr = table.add_row() tr.add_class("spt_branch_item") radio = RadioWdg("branch") radio.add_class("spt_branch_radio") table.add_cell(radio) radio.set_option("value", name) if name == branch: radio.set_checked() table.add_cell(name) table.add_cell(c.get("Options")) table.add_cell(c.get("Owner")) icon = IconButtonWdg(title="Check-out", icon=IconWdg.CHECK_OUT_SM) table.add_cell(icon) icon.add_behavior( { 'type': 'click_up', 'branch': c.get("branch"), 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_branch_content"); top.setAttribute("spt_brange", bvr.branch); spt.app_busy.show("Checking out branch ["+bvr.branch+"]"); spt.scm.checkout("new_project/"+bvr.branch); spt.app_busy.hide(); ''' } ) inner.add("<hr/>") if my.kwargs.get("branches") == None: inner.add_behavior( { 'type': 'load', 'location': location, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.branch = {} spt.branch.load = function(el) { var branches = spt.scm.run("get_branches",[]); var class_name = 'tactic.ui.checkin.branch_wdg.BranchWdg'; var kwargs = { branches: branches, } var top = el.getParent(".spt_branch_content"); spt.panel.load(top, class_name, kwargs); } spt.branch.load(bvr.src_el); ''' } ) return top
def get_versions_wdg(self): div = DivWdg() div.add_class("spt_imports") title_wdg = DivWdg() div.add(title_wdg) title_wdg.add("Imports found:") title_wdg.add_style("padding: 0px 0px 8px 0px") base_dir = self.kwargs.get("base_dir") imports_dir = "%s/imports" % base_dir if not os.path.exists(imports_dir): imports_dir = base_dir basenames = os.listdir(imports_dir) basenames.sort() basenames.reverse() div.add_relay_behavior( { 'type': 'mouseup', 'bvr_match_class': "spt_import_item", 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_imports"); var els = top.getElements(".spt_import_info"); for ( var i = 0; i < els.length; i++) { spt.hide(els[i]); } var el = bvr.src_el.getElement(".spt_import_info"); spt.show(el); ''' } ) # find all the zip files count = 0 for basename in basenames: if not basename.endswith(".txt"): continue if basename.find("-files-") != -1: continue if basename.find("-data-") != -1: continue version_wdg = DivWdg() div.add(version_wdg) version_wdg.add_style("padding: 3px 3px 3px 12px") version_wdg.add_class("spt_import_item") radio = RadioWdg("basename") version_wdg.add(radio) radio.set_option("value", basename) if not count: radio.set_checked() version_wdg.add(basename) version_wdg.add("<br/>") # add info path = "%s/%s" % (imports_dir, basename) f = open(path) data = f.read() f.close() data = jsonloads(data) table = Table() version_wdg.add(table) table.add_class("spt_import_info") if count: table.add_style("display: none") table.set_max_width() table.add_style("margin-left: 40px") table.add_style("margin-right: 20px") version_wdg.add(table) for name, value in self.data.items(): name = Common.get_display_title(name) table.add_row() table.add_cell(name) table.add_cell(value) count += 1 if count == 0: msg_wdg = DivWdg() div.add(msg_wdg) msg_wdg.add("<i>No imports found</i>") msg_wdg.add_border() msg_wdg.add_style("padding: 20px") msg_wdg.add_style("padding: 10px") msg_wdg.add_style("text-align: center") msg_wdg.add_color("background", "background", -10) return div
def get_display(my): top = my.top top.add_class("spt_workspace_content") my.set_as_panel(top) top.add_color("color", "color") top.add_color("background", "background") top.add_style("min-width: 600px") top.add_style("min-height: 400px") # NOTE: is there ever a time when this is not loaded already? top.add_behavior( { 'type': 'load', 'cbjs_action': scm_get_onload_js() } ) sync_dir = Environment.get_sandbox_dir() project = Project.get() depot = project.get_value("location", no_exception=True) if not depot: depot = project.get_code() location = '//%s' % depot workspace = my.kwargs.get("workspace") if not workspace: workspace = WidgetSettings.get_value_by_key("current_workspace") else: WidgetSettings.set_value_by_key("current_workspace", workspace) if not workspace: workspace = 'main' workspaces = my.kwargs.get("workspaces") if not workspaces: workspaces = [] elif isinstance(workspaces, basestring): workspaces = workspaces.replace("'", '"') workspaces = jsonloads(workspaces) top.add_behavior( { 'type': 'load', 'depot': depot, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.scm.sync_dir = bvr.sync_dir; spt.scm.depot = bvr.depot; ''' } ) inner = DivWdg() top.add(inner) table = Table() inner.add(table) table.add_style("width: 100%") table.add_row() th = table.add_header("") th = table.add_header("Workspaces") th.add_style("text-align: left") th = table.add_header("Description") th.add_style("text-align: left") th = table.add_header("Owner") th.add_style("text-align: left") th = table.add_header("Root") th.add_style("text-align: left") bgcolor = table.get_color("background", -8) table.add_relay_behavior( { 'type': 'mouseover', 'bvr_match_class': 'spt_workspace_item', 'bgcolor': bgcolor, 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); ''' } ) table.add_relay_behavior( { 'type': 'mouseout', 'bvr_match_class': 'spt_workspace_item', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ''); ''' } ) table.add_relay_behavior( { 'type': 'mouseup', 'bvr_match_class': "spt_workspace_radio", 'cbjs_action': ''' var value = bvr.src_el.value; spt.app_busy.show("Setting current workspace to " + value); var server = TacticServerStub.get(); server.set_widget_setting("current_workspace", value); var top = bvr.src_el.getParent(".spt_checkin_top"); top.removeAttribute("spt_sandbox_dir"); spt.panel.refresh(top); spt.app_busy.hide(); ''' } ) for c in workspaces: name = c.get("client") tr = table.add_row() tr.add_class("spt_workspace_item") radio = RadioWdg("workspace") radio.add_class("spt_workspace_radio") table.add_cell(radio) radio.set_option("value", name) if name == workspace: radio.set_checked() table.add_cell(name) table.add_cell(c.get("Description")) table.add_cell(c.get("Owner")) table.add_cell(c.get("Root")) if not workspaces: ws_div = DivWdg() table.add_row() table.add_cell(ws_div) ws_div.add_style("height: 60px") ws_div.add_style("width: 300px") ws_div.add("<b>No workspaces defined</b>") ws_div.add_color("color", "color3") ws_div.add_color("background", "background3") ws_div.add_border() ws_div.add_style("margin-top: 30px") ws_div.add_style("margin-bottom: 30px") ws_div.add_style("margin-left: auto") ws_div.add_style("margin-right: auto") ws_div.add_style("padding-top: 30px") ws_div.add_style("text-align: center") inner.add("<hr/>") if my.kwargs.get("workspaces") == None: inner.add_behavior( { 'type': 'load', 'location': location, 'sync_dir': sync_dir, 'cbjs_action': ''' spt.workspace = {} spt.workspace.load = function(el) { var workspaces = spt.scm.run("get_workspaces",[]); console.log(workspaces); var class_name = 'tactic.ui.checkin.workspace_wdg.WorkspaceWdg'; var kwargs = { workspaces: workspaces, } var top = el.getParent(".spt_workspace_content"); spt.panel.load(top, class_name, kwargs); } spt.workspace.load(bvr.src_el); ''' } ) return top
def get_data_wdg(my): div = DivWdg() from pyasm.biz import Pipeline from pyasm.widget import SelectWdg search_type_obj = SearchType.get(my.search_type) base_type = search_type_obj.get_base_key() search = Search("sthpw/pipeline") search.add_filter("search_type", base_type) pipelines = search.get_sobjects() if pipelines: pipeline = pipelines[0] process_names = pipeline.get_process_names() if process_names: table = Table() div.add(table) table.add_row() table.add_cell("Process: ") select = SelectWdg("process") table.add_cell(select) process_names.append("---") process_names.append("publish") process_names.append("icon") select.set_option("values", process_names) #### buttons = Table() div.add(buttons) buttons.add_row() button = IconButtonWdg(title="Fill in Data", icon=IconWdg.EDIT) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x': -10, 'y': 10}) dialog_data_div = DivWdg() dialog_data_div.add_color("background", "background") dialog_data_div.add_style("padding", "20px") dialog.add(dialog_data_div) # Order folders by date name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") if SearchType.column_exists(my.search_type, "relative_dir"): category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "none") category_div.add(checkbox) category_div.add(" No categories") category_div.add_style("margin-bottom: 5px") checkbox.set_option("checked", "true") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_day") category_div.add(checkbox) category_div.add(" Categorize files by Day") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_week") category_div.add(checkbox) category_div.add(" Categorize files by Week") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_year") category_div.add(checkbox) category_div.add(" Categorize files by Year") category_div.add_style("margin-bottom: 5px") """ checkbox = RadioWdg("category") checkbox.set_option("value", "custom") name_div.add(checkbox) name_div.add(" Custom") """ name_div.add("<br/>") ingest_data_view = my.kwargs.get('ingest_data_view') from tactic.ui.panel import EditWdg sobject = SearchType.create(my.search_type) edit = EditWdg(search_key=sobject.get_search_key(), mode='view', view=ingest_data_view) dialog_data_div.add(edit) hidden = HiddenWdg(name="parent_key") dialog_data_div.add(hidden) hidden.add_class("spt_parent_key") parent_key = my.kwargs.get("parent_key") or "" if parent_key: hidden.set_value(parent_key) extra_data = my.kwargs.get("extra_data") if not isinstance(extra_data, basestring): extra_data = jsondumps(extra_data) if extra_data and extra_data != "null": # it needs a TextArea instead of Hidden because of JSON data text = TextAreaWdg(name="extra_data") text.add_style('display: none') text.set_value(extra_data) dialog_data_div.add(text) """ dialog_data_div.add("Keywords:<br/>") dialog.add(dialog_data_div) text = TextAreaWdg(name="keywords") dialog_data_div.add(text) text.add_class("spt_keywords") text.add_style("padding: 1px") dialog_data_div.add("<br/>"*2) text.add_class("spt_extra_data") text.add_style("padding: 1px") """ #### TEST Image options """ button = IconButtonWdg(title="Resize", icon=IconWdg.FILM) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) try: from spt.tools.convert import ConvertOptionsWdg convert_div = DivWdg() dialog.add(convert_div) convert_div.add_style("padding: 20px") convert_div.add_color("background", "background") convert_div.add_class("spt_image_convert") convert = ConvertOptionsWdg() convert_div.add(convert) except: pass """ # use base name for name """ name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") checkbox = CheckboxWdg("use_file_name") name_div.add(checkbox) name_div.add(" Use name of file for name") name_div.add("<br/>") checkbox = CheckboxWdg("use_base_name") name_div.add(checkbox) name_div.add(" Remove extension") name_div.add("<br/>") checkbox = CheckboxWdg("file_keywords") name_div.add(checkbox) name_div.add(" Use file name for keywords") """ return div
def get_data_wdg(my): div = DivWdg() from pyasm.biz import Pipeline from pyasm.widget import SelectWdg search_type_obj = SearchType.get(my.search_type) base_type = search_type_obj.get_base_key() search = Search("sthpw/pipeline") search.add_filter("search_type", base_type) pipelines = search.get_sobjects() if pipelines: pipeline = pipelines[0] process_names = pipeline.get_process_names() if process_names: table = Table() div.add(table) table.add_row() table.add_cell("Process: ") select = SelectWdg("process") table.add_cell(select) process_names.append("---") process_names.append("publish") process_names.append("icon") select.set_option("values", process_names) #### buttons = Table() div.add(buttons) buttons.add_row() #button = IconButtonWdg(title="Fill in Data", icon=IconWdg.EDIT) button = ActionButtonWdg(title="Metadata") button.add_style("float: left") button.add_style("margin-top: -3px") buttons.add_cell(button) select_label = DivWdg("Update mode"); select_label.add_style("float: left") select_label.add_style("margin-top: -3px") select_label.add_style("margin-left: 20px") buttons.add_cell(select_label) update_mode_option = my.kwargs.get("update_mode") if not update_mode_option: update_mode_option = "true" update_mode = SelectWdg(name="update mode") update_mode.add_class("spt_update_mode_select") update_mode.set_option("values", ["false", "true", "sequence"]) update_mode.set_option("labels", ["Off", "On", "Sequence"]) update_mode.set_option("default", update_mode_option) update_mode.add_style("float: left") update_mode.add_style("margin-top: -3px") update_mode.add_style("margin-left: 5px") update_mode.add_style("margin-right: 5px") buttons.add_cell(update_mode) update_info = DivWdg() update_info.add_class("glyphicon") update_info.add_class("glyphicon-info-sign") update_info.add_style("float: left") update_info.add_style("margin-top: -3px") update_info.add_style("margin-left: 10px") update_info.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.info("When update mode is on, if a file shares the name of one other file in the asset library, the file will update on ingest. If more than one file shares the name of an ingested asset, a new asset is created.<br> If sequence mode is selected, the system will update the sobject on ingest if a file sequence sharing the same name already exists.", {type: 'html'}); ''' } ) buttons.add_cell(update_info); dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) dialog_data_div = DivWdg() dialog_data_div.add_color("background", "background") dialog_data_div.add_style("padding", "20px") dialog.add(dialog_data_div) # Order folders by date name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") if SearchType.column_exists(my.search_type, "relative_dir"): category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "none") category_div.add(checkbox) category_div.add(" No categories") category_div.add_style("margin-bottom: 5px") checkbox.set_option("checked", "true") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_day") category_div.add(checkbox) category_div.add(" Categorize files by Day") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_week") category_div.add(checkbox) category_div.add(" Categorize files by Week") category_div.add_style("margin-bottom: 5px") category_div = DivWdg() name_div.add(category_div) checkbox = RadioWdg("category") checkbox.set_option("value", "by_year") category_div.add(checkbox) category_div.add(" Categorize files by Year") category_div.add_style("margin-bottom: 5px") """ checkbox = RadioWdg("category") checkbox.set_option("value", "custom") name_div.add(checkbox) name_div.add(" Custom") """ name_div.add("<br/>") ingest_data_view = my.kwargs.get('ingest_data_view') from tactic.ui.panel import EditWdg sobject = SearchType.create(my.search_type) edit = EditWdg(search_key =sobject.get_search_key(), mode='view', view=ingest_data_view ) dialog_data_div.add(edit) hidden = HiddenWdg(name="parent_key") dialog_data_div.add(hidden) hidden.add_class("spt_parent_key") parent_key = my.kwargs.get("parent_key") or "" if parent_key: hidden.set_value(parent_key) extra_data = my.kwargs.get("extra_data") if not isinstance(extra_data, basestring): extra_data = jsondumps(extra_data) if extra_data and extra_data != "null": # it needs a TextArea instead of Hidden because of JSON data text = TextAreaWdg(name="extra_data") text.add_style('display: none') text.set_value(extra_data) dialog_data_div.add(text) """ dialog_data_div.add("Keywords:<br/>") dialog.add(dialog_data_div) text = TextAreaWdg(name="keywords") dialog_data_div.add(text) text.add_class("spt_keywords") text.add_style("padding: 1px") dialog_data_div.add("<br/>"*2) text.add_class("spt_extra_data") text.add_style("padding: 1px") """ #### TEST Image options """ button = IconButtonWdg(title="Resize", icon=IconWdg.FILM) buttons.add_cell(button) dialog = DialogWdg(display="false", show_title=False) div.add(dialog) dialog.set_as_activator(button, offset={'x':-10,'y':10}) try: from spt.tools.convert import ConvertOptionsWdg convert_div = DivWdg() dialog.add(convert_div) convert_div.add_style("padding: 20px") convert_div.add_color("background", "background") convert_div.add_class("spt_image_convert") convert = ConvertOptionsWdg() convert_div.add(convert) except: pass """ # use base name for name """ name_div = DivWdg() dialog_data_div.add(name_div) name_div.add_style("margin: 15px 0px") checkbox = CheckboxWdg("use_file_name") name_div.add(checkbox) name_div.add(" Use name of file for name") name_div.add("<br/>") checkbox = CheckboxWdg("use_base_name") name_div.add(checkbox) name_div.add(" Remove extension") name_div.add("<br/>") checkbox = CheckboxWdg("file_keywords") name_div.add(checkbox) name_div.add(" Use file name for keywords") """ return div