def get_display(self): key = "LicenseManager" div = DivWdg() div.set_id(key) div.add_class("spt_upload") from tactic.ui.widget import ActionButtonWdg #browse = ActionButtonWdg(title="Browse", tip="Click to browse for license file and renew") on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var file_name = file.name; // clean up the file name the way it is done in the server file_name = spt.path.get_filesystem_name(file_name); var server = TacticServerStub.get(); spt.app_busy.show("Renewing license ..."); var cmd = 'tactic.ui.app.RenewLicenseCbk'; var kwargs = { file_name: file_name }; try { server.execute_cmd(cmd, kwargs); spt.app_busy.hide(); spt.refresh_page(); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.notify.show_message("License renewal ["+file_name+"] successful"); } else { alert('Error: file object cannot be found.') } spt.app_busy.hide();''' browse = UploadButtonWdg( title="Browse", tip="Click to browse for license file and renew", on_complete=on_complete) browse.add_style("margin-left: auto") browse.add_style("margin-right: auto") div.add(browse) info_div = DivWdg() div.add(info_div) info_div.add_class("spt_license_info") return div
def get_display(self): key = "LicenseManager" div = DivWdg() div.set_id(key) div.add_class("spt_upload") from tactic.ui.widget import ActionButtonWdg #browse = ActionButtonWdg(title="Browse", tip="Click to browse for license file and renew") on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var file_name = file.name; // clean up the file name the way it is done in the server file_name = spt.path.get_filesystem_name(file_name); var server = TacticServerStub.get(); spt.app_busy.show("Renewing license ..."); var cmd = 'tactic.ui.app.RenewLicenseCbk'; var kwargs = { file_name: file_name }; try { server.execute_cmd(cmd, kwargs); spt.app_busy.hide(); spt.refresh_page(); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.notify.show_message("License renewal ["+file_name+"] successful"); } else { alert('Error: file object cannot be found.') } spt.app_busy.hide();''' browse = UploadButtonWdg(title="Browse", tip="Click to browse for license file and renew", on_complete=on_complete) browse.add_style("margin-left: auto") browse.add_style("margin-right: auto") div.add(browse) info_div = DivWdg() div.add(info_div) info_div.add_class("spt_license_info") return div
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
def get_upload_wdg(my): '''get search type select and upload wdg''' widget = DivWdg(css='spt_import_csv') widget.add_color('color','color') widget.add_color('background','background') widget.add_style('width: 600px') # get the search type title = DivWdg("<b>Select sType to import data into:</b> ") widget.add( title ) title.add_style("float: left") # handle new search_types new_search_type = CheckboxWdg("new_search_type_checkbox") new_search_type.add_event("onclick", "toggle_display('new_search_type_div')") #span = SpanWdg(css="med") #span.add(new_search_type) #span.add("Create new type") #span.add(" ... or ... ") #widget.add(span) new_search_type_div = DivWdg() new_search_type_div.set_id("new_search_type_div") name_input = TextWdg("asset_name") title = TextWdg("asset_title") description = TextAreaWdg("asset_description") key='csv_import' table = Table() table.set_id('csv_main_body') table.add_style("margin: 10px 10px") table.add_col().set_attr('width','140') table.add_col().set_attr('width','400') table.add_row() table.add_header("Search Type: ").set_attr('align','left') table.add_cell(name_input) table.add_row() table.add_header("Title: ").set_attr('align','left') table.add_cell(title) table.add_row() table.add_header("Description: ").set_attr('align','left') table.add_cell(description) new_search_type_div.add(table) new_search_type_div.add_style("display: none") #widget.add(new_search_type_div) div = DivWdg() search_type_select = SearchTypeSelectWdg("search_type_filter", mode=SearchTypeSelectWdg.ALL) search_type_select.add_empty_option("-- Select --") if not search_type_select.get_value(): search_type_select.set_value(my.search_type) search_type_select.set_persist_on_submit() div.add(search_type_select) widget.add(div) search_type_select.add_behavior( {'type': 'change', \ 'cbjs_action': "spt.panel.load('csv_import_main','%s', {}, {\ 'search_type_filter': bvr.src_el.value});" %(Common.get_full_class_name(my)) } ) if my.search_type: sobj = None try: sobj = SObjectFactory.create(my.search_type) except ImportError: widget.add(HtmlElement.br()) widget.add(SpanWdg('WARNING: Import Error encountered. Please choose another search type.', css='warning')) return widget required_columns = sobj.get_required_columns() if required_columns: widget.add(HtmlElement.br()) req_span = SpanWdg("Required Columns: ", css='med') req_span.add_color('color','color') widget.add(req_span) #required_columns = ['n/a'] req_span.add(', '.join(required_columns)) widget.add( HtmlElement.br() ) if my.file_path: hidden = HiddenWdg("file_path", my.file_path) widget.add(hidden) if my.web_url: file_span = FloatDivWdg('URL: <i>%s</i> ' %my.web_url, css='med') else: file_span = FloatDivWdg('File uploaded: <i>%s</i> ' %os.path.basename(my.file_path), css='med') file_span.add_color('color','color') file_span.add_style('margin: 8px 0 0 10px') file_span.add_style('font-size: 14px') widget.add(file_span) button = ActionButtonWdg(title='Change') button.add_style('float','left') button.add_behavior( {'type': 'click_up', \ 'cbjs_action': "spt.panel.load('csv_import_main','%s', {}, {\ 'search_type_filter': '%s'});" %(Common.get_full_class_name(my), my.search_type) } ) widget.add(button) widget.add("<br clear='all'/>") widget.add(HtmlElement.br()) return widget widget.add("<br/>") widget.add_style("overflow-y: auto") msg = DivWdg() widget.add(msg) msg.add( "<div style='float: left; padding-left: 100px; padding-top: 6px'><b>Upload a csv file: </b></div>") msg.add_border() msg.add_style("width: 400px") msg.add_color("background", "background3") msg.add_style("padding: 20px") msg.add_style("margin: 30 auto") msg.add_style("text-align: center") ticket = Environment.get_security().get_ticket_key() on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var file_name = file.name; // clean up the file name the way it is done in the server file_name = spt.path.get_filesystem_name(file_name); var server = TacticServerStub.get(); var class_name = 'tactic.ui.widget.CsvImportWdg'; var values = spt.api.Utility.get_input_values('csv_import_main'); values['is_refresh'] = true; values['file_name'] = file_name; values['html5_ticket'] = '%s'; try { var info = spt.panel.load('csv_import_main', class_name, {}, values); spt.app_busy.hide(); } catch(e) { spt.alert(spt.exception.handler(e)); } } else { alert('Error: file object cannot be found.') } spt.app_busy.hide();'''%ticket from tactic.ui.input import UploadButtonWdg browse = UploadButtonWdg(name='new_csv_upload', title="Browse", tip="Click to choose a csv file",\ on_complete=on_complete, ticket=ticket) browse.add_style('float: left') msg.add(browse) # this is now only used in the copy and paste Upload button for backward-compatibility upload_wdg = SimpleUploadWdg(key=key, show_upload=False) upload_wdg.add_style('display: none') msg.add(upload_wdg) #widget.add(span) msg.add("<br/><br/>-- OR --</br/><br/>") msg.add("<b>Published URL: </b>") text = TextWdg("web_url") msg.add(text) msg.add("<br/><br/>-- OR --</br/><br/>") msg.add("<b>Copy and Paste from a Spreadsheet: </b>") text = TextAreaWdg("data") text.add_style('width: 33em') text.add_class("spt_import_cut_paste") msg.add(text) button = ActionButtonWdg(title="Parse") button.add_style("margin: 5px auto") msg.add(button) button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_import_top"); var el = top.getElement(".spt_import_cut_paste"); var applet = spt.Applet.get(); var value = el.value; var csv = []; // convert to a csv file! lines = value.split("\\n"); for (var i = 0; i < lines.length; i++) { if (lines[i] == '') { continue; } var parts = lines[i].split("\\t"); var new_line = []; for (var j = 0; j < parts.length; j++) { if (parts[j] == '') { new_line.push(''); } else { new_line.push('"'+parts[j]+'"'); } } new_line = new_line.join(","); csv.push(new_line); } csv = csv.join("\\n") // FIXME: need to get a local temp directory var path = spt.browser.os_is_Windows() ? "C:/sthpw/copy_n_paste.csv" : "/tmp/sthpw/copy_n_paste.csv"; applet.create_file(path, csv); // upload the file applet.upload_file(path) applet.rmtree(path); var top = bvr.src_el.getParent(".spt_import_csv"); var hidden = top.getElement(".spt_upload_hidden"); hidden.value = path; var file_name = spt.path.get_basename(hidden.value); file_name = spt.path.get_filesystem_name(file_name); var class_name = 'tactic.ui.widget.CsvImportWdg'; var values = spt.api.Utility.get_input_values('csv_import_main'); values['is_refresh'] = true; values['file_name'] = file_name; var info = spt.panel.load('csv_import_main', class_name, {}, values); ''' } ) return widget
def get_display(my): key = "LicenseManager" div = DivWdg() div.set_id(key) div.add_class("spt_upload") # override the column # SWF upload is deprecated """ column_input = HiddenWdg("file_name") div.add(column_input) # the button div that will get replaced by the swf wrapper_div = DivWdg() wrapper_div.add_style("padding: 5px") wrapper_div.add_style("float: left") button_div = DivWdg() wrapper_div.add(button_div) div.add(wrapper_div) button_id = "%sButton" % key button_div.set_id(button_id) button_div.add_class("spt_upload_button") button_div.add_style("display: block") # add a upload button so it does not require edit_pressed from tactic.ui.widget import TextBtnWdg install_div = DivWdg() install_div.add_style("padding: 8px") install_button = TextBtnWdg(label="Install License", size='medium') behavior = { 'type': 'click_up', 'key': key, 'cbjs_action': "spt.Upload.upload_cbk(bvr)" } install_button.add_behavior(behavior) install_div.add(install_button) div.add(install_div) div.add("<br/>") # add a stats widget stats_div = DivWdg() stats_div.add_style("float: right") stats_div.add_class("spt_upload_stats") div.add(stats_div) from tactic.ui.widget import UploadProgressWdg upload_progress = UploadProgressWdg() div.add(upload_progress) # add the onload behavior for this widget to initialize the swf load_div = DivWdg() behavior = { 'type': 'load', 'cbfn_action': "spt.Upload.setup_cbk", 'key': key, 'settings': { 'upload_complete_handler': 'spt.Upload.license_complete', } } load_div.add_behavior(behavior) div.add(load_div) """ from tactic.ui.widget import ActionButtonWdg #browse = ActionButtonWdg(title="Browse", tip="Click to browse for license file and renew") on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var file_name = file.name; // clean up the file name the way it is done in the server file_name = spt.path.get_filesystem_name(file_name); var server = TacticServerStub.get(); spt.app_busy.show("Renewing license ..."); var cmd = 'tactic.ui.app.RenewLicenseCbk'; var kwargs = { file_name: file_name }; try { server.execute_cmd(cmd, kwargs); spt.app_busy.hide(); spt.refresh_page(); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.notify.show_message("License renewal ["+file_name+"] successful"); } else { alert('Error: file object cannot be found.') } spt.app_busy.hide();''' browse = UploadButtonWdg( title="Browse", tip="Click to browse for license file and renew", on_complete=on_complete) browse.add_style("margin-left: auto") browse.add_style("margin-right: auto") div.add(browse) info_div = DivWdg() div.add(info_div) info_div.add_class("spt_license_info") return div
def get_upload_wdg(my): '''get search type select and upload wdg''' widget = DivWdg(css='spt_import_csv') widget.add_color('color','color') widget.add_color('background','background') widget.add_style('width: 600px') # get the search type title = DivWdg("<b>Select sType to import data into:</b> ") widget.add( title ) title.add_style("float: left") # handle new search_types new_search_type = CheckboxWdg("new_search_type_checkbox") new_search_type.add_event("onclick", "toggle_display('new_search_type_div')") #span = SpanWdg(css="med") #span.add(new_search_type) #span.add("Create new type") #span.add(" ... or ... ") #widget.add(span) new_search_type_div = DivWdg() new_search_type_div.set_id("new_search_type_div") name_input = TextWdg("asset_name") title = TextWdg("asset_title") description = TextAreaWdg("asset_description") key='csv_import' table = Table() table.set_id('csv_main_body') table.add_style("margin: 10px 10px") table.add_col().set_attr('width','140') table.add_col().set_attr('width','400') table.add_row() table.add_header("Search Type: ").set_attr('align','left') table.add_cell(name_input) table.add_row() table.add_header("Title: ").set_attr('align','left') table.add_cell(title) table.add_row() table.add_header("Description: ").set_attr('align','left') table.add_cell(description) new_search_type_div.add(table) new_search_type_div.add_style("display: none") #widget.add(new_search_type_div) div = DivWdg() search_type_select = SearchTypeSelectWdg("search_type_filter", mode=SearchTypeSelectWdg.ALL) search_type_select.add_empty_option("-- Select --") if not search_type_select.get_value(): search_type_select.set_value(my.search_type) search_type_select.set_persist_on_submit() div.add(search_type_select) widget.add(div) search_type_select.add_behavior( {'type': 'change', \ 'cbjs_action': "spt.panel.load('csv_import_main','%s', {}, {\ 'search_type_filter': bvr.src_el.value});" %(Common.get_full_class_name(my)) } ) if my.search_type: sobj = None try: sobj = SObjectFactory.create(my.search_type) except ImportError: widget.add(HtmlElement.br()) widget.add(SpanWdg('WARNING: Import Error encountered. Please choose another search type.', css='warning')) return widget required_columns = sobj.get_required_columns() if required_columns: widget.add(HtmlElement.br()) req_span = SpanWdg("Required Columns: ", css='med') req_span.add_color('color','color') widget.add(req_span) #required_columns = ['n/a'] req_span.add(', '.join(required_columns)) widget.add( HtmlElement.br() ) if my.file_path: hidden = HiddenWdg("file_path", my.file_path) widget.add(hidden) if my.web_url: file_span = FloatDivWdg('URL: <i>%s</i> ' %my.web_url, css='med') else: file_span = FloatDivWdg('File uploaded: <i>%s</i> ' %os.path.basename(my.file_path), css='med') file_span.add_color('color','color') file_span.add_style('margin: 8px 0 0 10px') file_span.add_style('font-size: 14px') widget.add(file_span) button = ActionButtonWdg(title='Change') button.add_style('float','left') button.add_behavior( {'type': 'click_up', \ 'cbjs_action': "spt.panel.load('csv_import_main','%s', {}, {\ 'search_type_filter': '%s'});" %(Common.get_full_class_name(my), my.search_type) } ) widget.add(button) widget.add("<br clear='all'/>") widget.add(HtmlElement.br()) return widget widget.add("<br/>") widget.add_style("overflow-y: auto") msg = DivWdg() widget.add(msg) msg.add( "<div style='float: left; padding-left: 100px; padding-top: 6px'><b>Upload a csv file: </b></div>") msg.add_border() msg.add_style("width: 400px") msg.add_color("background", "background3") msg.add_style("padding: 20px") msg.add_style("margin: 30 auto") msg.add_style("text-align: center") ticket = Environment.get_security().get_ticket_key() on_complete = '''var server = TacticServerStub.get(); var file = spt.html5upload.get_file(); if (file) { var file_name = file.name; // clean up the file name the way it is done in the server //file_name = spt.path.get_filesystem_name(file_name); var server = TacticServerStub.get(); var class_name = 'tactic.ui.widget.CsvImportWdg'; var values = spt.api.Utility.get_input_values('csv_import_main'); values['is_refresh'] = true; values['file_name'] = file_name; values['html5_ticket'] = '%s'; try { var info = spt.panel.load('csv_import_main', class_name, {}, values); spt.app_busy.hide(); } catch(e) { spt.alert(spt.exception.handler(e)); } } else { alert('Error: file object cannot be found.') } spt.app_busy.hide();'''%ticket from tactic.ui.input import UploadButtonWdg browse = UploadButtonWdg(name='new_csv_upload', title="Browse", tip="Click to choose a csv file",\ on_complete=on_complete, ticket=ticket) browse.add_style('float: left') msg.add(browse) # this is now only used in the copy and paste Upload button for backward-compatibility upload_wdg = SimpleUploadWdg(key=key, show_upload=False) upload_wdg.add_style('display: none') msg.add(upload_wdg) #widget.add(span) msg.add("<br/><br/>-- OR --</br/><br/>") msg.add("<b>Published URL: </b>") text = TextWdg("web_url") msg.add(text) msg.add("<br/><br/>-- OR --</br/><br/>") msg.add("<b>Copy and Paste from a Spreadsheet: </b>") text = TextAreaWdg("data") text.add_style('width: 33em') text.add_class("spt_import_cut_paste") msg.add(text) button = ActionButtonWdg(title="Parse") button.add_style("margin: 5px auto") msg.add(button) button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_import_top"); var el = top.getElement(".spt_import_cut_paste"); var applet = spt.Applet.get(); var value = el.value; var csv = []; // convert to a csv file! lines = value.split("\\n"); for (var i = 0; i < lines.length; i++) { if (lines[i] == '') { continue; } var parts = lines[i].split("\\t"); var new_line = []; for (var j = 0; j < parts.length; j++) { if (parts[j] == '') { new_line.push(''); } else { new_line.push('"'+parts[j]+'"'); } } new_line = new_line.join(","); csv.push(new_line); } csv = csv.join("\\n") // FIXME: need to get a local temp directory var path = spt.browser.os_is_Windows() ? "C:/sthpw/copy_n_paste.csv" : "/tmp/sthpw/copy_n_paste.csv"; applet.create_file(path, csv); // upload the file applet.upload_file(path) applet.rmtree(path); var top = bvr.src_el.getParent(".spt_import_csv"); var hidden = top.getElement(".spt_upload_hidden"); hidden.value = path; var file_name = spt.path.get_basename(hidden.value); file_name = spt.path.get_filesystem_name(file_name); var class_name = 'tactic.ui.widget.CsvImportWdg'; var values = spt.api.Utility.get_input_values('csv_import_main'); values['is_refresh'] = true; values['file_name'] = file_name; var info = spt.panel.load('csv_import_main', class_name, {}, values); ''' } ) return widget