def data_package_id(filename=None): form = DataPackageIDForm() eml_node = load_eml(filename=filename) # Process POST # if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST': save = False if is_dirty_form(form): save = True if save: data_package_id = form.data_package_id.data create_data_package_id(data_package_id, filename) set_active_packageid(data_package_id) form.md5.data = form_md5(form) new_page = PAGE_TITLE this_page = PAGE_DATA_PACKAGE_ID new_page = handle_hidden_buttons(new_page, this_page) return redirect(url_for(new_page, filename=filename)) # Process GET data_package_id = eml_node.attribute_value('packageId') form.data_package_id.data = data_package_id if data_package_id else '' form.md5.data = form_md5(form) set_current_page('data_package_id') help = get_helps(['data_package_id']) return render_template('data_package_id.html', form=form, help=help, title='Data Package ID')
def rp_select_get(filename=None, form=None, rp_name=None, rp_singular=None, rp_plural=None, help=None, node_id=None, project_node_id=None): # Process GET eml_node = load_eml(filename=filename) rp_list = list_responsible_parties(eml_node, rp_name, project_node_id=project_node_id) title = rp_plural # rp_name.capitalize() related_project = project_node_id is not None if related_project: rp_singular = 'Related ' + rp_singular rp_plural = 'Related ' + rp_plural return render_template('responsible_party_select.html', title=title, rp_list=rp_list, form=form, rp_singular=rp_singular, rp_plural=rp_plural, help=help, relatedProject=related_project)
def taxonomic_coverage_select(filename=None): form = TaxonomicCoverageSelectForm(filename=filename) # Process POST if request.method == 'POST': form_value = request.form form_dict = form_value.to_dict(flat=False) url = select_post(filename, form, form_dict, 'POST', PAGE_TAXONOMIC_COVERAGE_SELECT, PAGE_TEMPORAL_COVERAGE_SELECT, PAGE_MAINTENANCE, PAGE_TAXONOMIC_COVERAGE) return redirect(url) # Process GET title = "Taxonomic Coverage" txc_list = [] eml_node = load_eml(filename=filename) if eml_node: dataset_node = eml_node.find_child(names.DATASET) if dataset_node: txc_list = list_taxonomic_coverages(dataset_node) set_current_page('taxonomic_coverage') help = [get_help('taxonomic_coverages')] return render_template('taxonomic_coverage_select.html', title=title, txc_list=txc_list, form=form, help=help)
def check_eml(filename: str): # global evaluation, metapype_validation_errs, metapype_evaluation global evaluation evaluation = [] eml_node = load_eml(filename) check_dataset_title(eml_node, filename) check_data_tables(eml_node, filename) check_creators(eml_node, filename) check_contacts(eml_node, filename) check_associated_parties(eml_node, filename) check_metadata_providers(eml_node, filename) check_dataset_abstract(eml_node, filename) check_keywords(eml_node, filename) check_intellectual_rights(eml_node, filename) check_coverage(eml_node, filename) check_geographic_coverage(eml_node, filename) check_maintenance(eml_node, filename) check_method_steps(eml_node, filename) check_project(eml_node, filename) check_other_entities(eml_node, filename) check_data_package_id(eml_node, filename) return format_output(evaluation)
def geographic_coverage_select(filename=None): form = GeographicCoverageSelectForm(filename=filename) # Process POST if request.method == 'POST': form_value = request.form form_dict = form_value.to_dict(flat=False) url = select_post(filename, form, form_dict, 'POST', PAGE_GEOGRAPHIC_COVERAGE_SELECT, PAGE_INTELLECTUAL_RIGHTS, PAGE_TEMPORAL_COVERAGE_SELECT, PAGE_GEOGRAPHIC_COVERAGE) return redirect(url) # Process GET gc_list = [] title = "Geographic Coverage" eml_node = load_eml(filename=filename) if eml_node: dataset_node = eml_node.find_child(names.DATASET) if dataset_node: gc_list = list_geographic_coverages(dataset_node) set_current_page('geographic_coverage') help = get_helps(['geographic_coverages', 'geographic_coverages_csv_file']) return render_template('geographic_coverage_select.html', title=title, gc_list=gc_list, form=form, help=help)
def cull_uploads(package_name=None): # Remove uploads not represented in the metadata. # Formerly, Import Package removed all uploads on the assumption that it was a new package. # But, we may want to replace the metadata without losing the uploads. This is especially # true when the "without data" form of the package is being used to replace the existing # package in order to update the metadata without losing the uploads. eml_node = load_eml(filename=package_name) # Get all of the uploads represented in the metadata object_names = [] object_name_nodes = [] eml_node.find_all_descendants(names.OBJECTNAME, object_name_nodes) for object_name_node in object_name_nodes: if object_name_node.content: object_names.append(object_name_node.content) # Remove any uploads that aren't in the list user_path = user_data.get_user_folder_name( ) # os.path.join(current_path, USER_DATA_DIR) upload_folder = os.path.join(user_path, 'uploads', package_name) to_delete = [ file for file in os.listdir(upload_folder) if file not in object_names ] for file in to_delete: os.remove(os.path.join(user_path, 'uploads', package_name, file))
def funding_award_select(filename=None, project_node_id=None): form = AwardSelectForm(filename=filename) # Process POST if request.method == 'POST': form_value = request.form form_dict = form_value.to_dict(flat=False) node_id = None new_page = PAGE_FUNDING_AWARD_SELECT if form_dict: for key in form_dict: val = form_dict[key][0] # value is the first list element if val == BTN_SAVE_AND_CONTINUE: new_page = PAGE_PROJECT elif val[0:4] == 'Back': new_page = PAGE_PROJECT elif val == BTN_EDIT: new_page = PAGE_FUNDING_AWARD node_id = key elif val == BTN_REMOVE: new_page = PAGE_FUNDING_AWARD_SELECT node_id = key eml_node = load_eml(filename=filename) remove_child(node_id=node_id) save_both_formats(filename=filename, eml_node=eml_node) elif val == UP_ARROW: new_page = PAGE_FUNDING_AWARD_SELECT node_id = key process_up_button(filename, node_id) elif val == DOWN_ARROW: new_page = PAGE_FUNDING_AWARD_SELECT node_id = key process_down_button(filename, node_id) elif val[0:3] == 'Add': new_page = PAGE_FUNDING_AWARD node_id = '1' else: new_page = check_val_for_hidden_buttons( val, new_page, PAGE_FUNDING_AWARD_SELECT) if form.validate_on_submit(): if node_id and project_node_id: url = url_for(new_page, filename=filename, node_id=node_id, project_node_id=project_node_id) elif project_node_id: url = url_for(new_page, filename=filename, project_node_id=project_node_id) else: url = url_for(new_page, filename=filename, node_id=node_id) return redirect(url) # Process GET return funding_award_select_get(filename=filename, form=form, project_node_id=project_node_id)
def get_abstract(filename, form): # Process GET eml_node = load_eml(filename=filename) abstract_node = eml_node.find_single_node_by_path( [names.DATASET, names.ABSTRACT]) if abstract_node: try: form.abstract.data = display_texttype_node(abstract_node) except InvalidXMLError as exc: flash('The XML is invalid. Please make corrections.', 'error') return render_get_abstract_page(form, filename)
def clear_taxonomic_coverage(package_name): # When user selects Clear Taxonomic Coverage to get rid of coverage imported from XML, we delete it and # set the flag that says its OK for ezEML to handle even though the package was imported from XML. eml_node = load_eml(filename=package_name) coverage_node = eml_node.find_single_node_by_path([names.DATASET, names.COVERAGE]) if coverage_node: taxonomic_coverage_nodes = coverage_node.find_all_children(names.TAXONOMICCOVERAGE) for taxonomic_coverage_node in taxonomic_coverage_nodes: coverage_node.remove_child(taxonomic_coverage_node) Node.delete_node_instance(taxonomic_coverage_node.id) clear_taxonomy_imported_from_xml(eml_node, package_name)
def render_get_abstract_page(form, filename): eml_node = load_eml(filename) form.md5.data = form_md5(form) set_current_page('abstract') help = [get_help('abstract'), get_help('nav')] return render_template( 'abstract.html', title='Abstract', model_has_complex_texttypes=model_has_complex_texttypes(eml_node), filename=filename, form=form, help=help)
def publication_info(filename=None): form = PublicationInfoForm() # Process POST # if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST': if 'Next' in request.form: new_page = PAGE_METHOD_STEP_SELECT elif BTN_HIDDEN_CHECK in request.form: new_page = PAGE_CHECK elif BTN_HIDDEN_SAVE in request.form: new_page = PAGE_PUBLICATION_INFO elif BTN_HIDDEN_DOWNLOAD in request.form: new_page = PAGE_DOWNLOAD elif BTN_HIDDEN_NEW in request.form: new_page = PAGE_CREATE elif BTN_HIDDEN_OPEN in request.form: new_page = PAGE_OPEN elif BTN_HIDDEN_CLOSE in request.form: new_page = PAGE_CLOSE else: new_page = PAGE_PUBLISHER save = False if is_dirty_form(form): save = True if save: pubplace = form.pubplace.data pubdate = form.pubdate.data create_pubinfo(pubplace=pubplace, pubdate=pubdate, filename=filename) return redirect(url_for(new_page, filename=filename)) # Process GET eml_node = load_eml(filename=filename) pubplace_node = eml_node.find_single_node_by_path( [names.DATASET, names.PUBPLACE]) if pubplace_node: form.pubplace.data = pubplace_node.content pubdate_node = eml_node.find_single_node_by_path( [names.DATASET, names.PUBDATE]) if pubdate_node: form.pubdate.data = pubdate_node.content form.md5.data = form_md5(form) set_current_page('publication_info') help = get_helps(['pubplace', 'pubdate']) return render_template('publication_info.html', help=help, form=form, title='Publication Info')
def maintenance(filename=None): form = MaintenanceForm(filename=filename) eml_node = load_eml(filename=filename) if eml_node: dataset_node = eml_node.find_child(names.DATASET) if not dataset_node: dataset_node = Node(names.DATASET, parent=eml_node) add_child(eml_node, dataset_node) # Process POST if request.method == 'POST' and BTN_CANCEL in request.form: url = url_for(PAGE_MAINTENANCE, filename=filename) return redirect(url) if request.method == 'POST' and form.validate_on_submit(): save = False if is_dirty_form(form): save = True if save: maintenace_description = form.description.data valid, msg = is_valid_xml_fragment(maintenace_description, names.MAINTENANCE) if not valid: flash(invalid_xml_error_message(msg, False, names.DESCRIPTION), 'error') return render_get_maintenance_page(eml_node, form, filename) update_frequency = form.update_frequency.data create_maintenance(dataset_node, maintenace_description, update_frequency) save_both_formats(filename=filename, eml_node=eml_node) form_value = request.form form_dict = form_value.to_dict(flat=False) new_page = PAGE_MAINTENANCE if form_dict: for key in form_dict: val = form_dict[key][0] # value is the first list element if val == BTN_SAVE_AND_CONTINUE: new_page = PAGE_PUBLISHER else: new_page = handle_hidden_buttons(new_page, PAGE_MAINTENANCE) return redirect(url_for(new_page, filename=filename)) # Process GET if dataset_node: maintenance_node = dataset_node.find_child(names.MAINTENANCE) if maintenance_node: populate_maintenance_form(form, maintenance_node) return render_get_maintenance_page(eml_node, form, filename)
def remove_keyword(filename, node_id): eml_node = load_eml(filename=filename) if node_id: keyword_node = Node.get_node_instance(node_id) if keyword_node: keyword_set_node = keyword_node.parent remove_child(node_id=node_id) # if we've just removed the last keyword under the keywordSet, remove the keywordSet if not keyword_set_node.find_all_children(names.KEYWORD): parent_node = keyword_set_node.parent parent_node.remove_child(keyword_set_node) save_both_formats(filename=filename, eml_node=eml_node)
def access_select_get(filename=None, form=None): # Process GET access_rules_list = [] title = 'Access Rules' eml_node = load_eml(filename=filename) if eml_node: access_rules_list = list_access_rules(eml_node) return render_template('access_select.html', title=title, filename=filename, ar_list=access_rules_list, form=form)
def render_get_intellectual_rights_page(form, filename, font_family): eml_node = load_eml(filename) form.md5.data = form_md5(form) set_current_page('intellectual_rights') help = [get_help('intellectual_rights')] return render_template( 'intellectual_rights.html', title='Intellectual Rights', font_family=font_family, model_has_complex_texttypes=model_has_complex_texttypes(eml_node), filename=filename, form=form, help=help)
def title(filename=None): form = TitleForm() # Process POST # if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST': new_page = PAGE_DATA_TABLE_SELECT save = False if is_dirty_form(form): save = True if save: create_title(title=form.title.data, filename=filename) form.md5.data = form_md5(form) if 'Next' in request.form: new_page = PAGE_DATA_TABLE_SELECT elif BTN_HIDDEN_CHECK in request.form: new_page = PAGE_CHECK elif BTN_HIDDEN_SAVE in request.form: new_page = PAGE_TITLE elif BTN_HIDDEN_DOWNLOAD in request.form: new_page = PAGE_DOWNLOAD elif BTN_HIDDEN_NEW in request.form: new_page = PAGE_CREATE elif BTN_HIDDEN_OPEN in request.form: new_page = PAGE_OPEN elif BTN_HIDDEN_CLOSE in request.form: new_page = PAGE_CLOSE return redirect(url_for(new_page, filename=filename)) # Process GET eml_node = load_eml(filename=filename) dataset_node = eml_node.find_child(child_name=names.DATASET) title_node = dataset_node.find_child(names.TITLE) if title_node: form.title.data = title_node.content form.md5.data = form_md5(form) set_current_page('title') help = get_helps(['title', 'nav', 'welcome']) first_usage = is_first_usage() return render_template('title.html', title='Title', form=form, help=help, is_first_usage=first_usage)
def data_package_id(filename=None): form = DataPackageIDForm() eml_node = load_eml(filename=filename) # Process POST # if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST': new_page = PAGE_TITLE save = False if is_dirty_form(form): save = True if save: data_package_id = form.data_package_id.data create_data_package_id(data_package_id, filename) set_active_packageid(data_package_id) form.md5.data = form_md5(form) if 'Next' in request.form: new_page = PAGE_CHECK elif BTN_HIDDEN_CHECK in request.form: new_page = PAGE_CHECK elif BTN_HIDDEN_SAVE in request.form: new_page = PAGE_DATA_PACKAGE_ID elif BTN_HIDDEN_DOWNLOAD in request.form: new_page = PAGE_DOWNLOAD elif BTN_HIDDEN_NEW in request.form: new_page = PAGE_CREATE elif BTN_HIDDEN_OPEN in request.form: new_page = PAGE_OPEN elif BTN_HIDDEN_CLOSE in request.form: new_page = PAGE_CLOSE return redirect(url_for(new_page, filename=filename)) # Process GET data_package_id = eml_node.attribute_value('packageId') form.data_package_id.data = data_package_id if data_package_id else '' form.md5.data = form_md5(form) set_current_page('data_package_id') help = get_helps(['data_package_id']) return render_template('data_package_id.html', form=form, help=help, title='Data Package ID')
def funding_award_select_get(filename=None, form=None, node_id=None): # Process GET title = 'Funding Awards' # entity_name = '' eml_node = load_eml(filename=filename) funding_award_list = list_funding_awards(eml_node, node_id) set_current_page('project') related_project = node_id is not None help = [get_help('awards')] return render_template('award_select.html', title=title, filename=filename, award_list=funding_award_list, form=form, help=help, related_project=related_project)
def publisher(filename=None): method = request.method node_id = '1' if filename: eml_node = load_eml(filename=filename) dataset_node = eml_node.find_child(names.DATASET) if dataset_node: publisher_node = dataset_node.find_child(names.PUBLISHER) if publisher_node: node_id = publisher_node.id set_current_page('publisher') help = [get_help('publisher')] return responsible_party(filename=filename, node_id=node_id, method=method, node_name=names.PUBLISHER, back_page=PAGE_CONTACT_SELECT, title='Publisher', next_page=PAGE_PUBLICATION_INFO, save_and_continue=True, help=help)
def keyword_select_get(filename=None, form=None): # Process GET kw_list = [] title = 'Keywords' eml_node = load_eml(filename=filename) if eml_node: kw_list = list_keywords(eml_node) set_current_page('keyword') help = [get_help('keywords')] return render_template('keyword_select.html', title=title, filename=filename, kw_list=kw_list, form=form, help=help)
def related_project_select_get(filename=None, form=None): # Process GET project_list = [] title = 'Related Projects' eml_node = load_eml(filename=filename) if eml_node: project_list = list_related_projects(eml_node) set_current_page('project') help = [get_help('related_project')] return render_template('related_project_select.html', title=title, filename=filename, project_list=project_list, form=form, help=help)
def access_select_post(filename=None, form=None, form_dict=None, method=None, this_page=None, back_page=None, next_page=None, edit_page=None): node_id = '' new_page = '' if form_dict: for key in form_dict: val = form_dict[key][0] # value is the first list element if val == 'Back': new_page = back_page elif val == 'Next': new_page = next_page elif val == 'Edit': new_page = edit_page node_id = key elif val == 'Remove': new_page = this_page node_id = key eml_node = load_eml(filename=filename) remove_child(node_id=node_id) save_both_formats(filename=filename, eml_node=eml_node) elif val == UP_ARROW: new_page = this_page node_id = key process_up_button(filename, node_id) elif val == DOWN_ARROW: new_page = this_page node_id = key process_down_button(filename, node_id) elif val[0:3] == 'Add': new_page = edit_page node_id = '1' if form.validate_on_submit(): if new_page == edit_page: return url_for(new_page, filename=filename, node_id=node_id) elif new_page == this_page: return url_for(new_page, filename=filename, node_id=node_id) elif new_page == back_page or new_page == next_page: return url_for(new_page, filename=filename)
def load_geo_coverage_from_csv(csv_filename, filename): eml_node = load_eml(filename=filename) data_frame = pd.read_csv(csv_filename, comment='#', encoding='utf8') required_columns = ['geographicDescription', 'northBoundingCoordinate', 'southBoundingCoordinate', 'eastBoundingCoordinate', 'westBoundingCoordinate'] optional_columns = ['minimumAltitude', 'maximumAltitude', 'altitudeUnits'] has_required_columns = False has_optional_columns = False if list(data_frame.columns) == required_columns: has_required_columns = True if list(data_frame.columns) == required_columns + optional_columns: has_required_columns = True has_optional_columns = True if not has_required_columns: raise ValueError('Geographic coverage file does not have expected column names.') expected_types_error_msg = 'Geographic coverage file does not have expected variable types in columns. Note that ' \ 'numerical values must be written with a decimal point.' if not has_optional_columns: if list(data_frame.dtypes) != [np.object, np.float64, np.float64, np.float64, np.float64]: raise ValueError(expected_types_error_msg) else: if list(data_frame.dtypes)[1:-1] != [np.float64, np.float64, np.float64, np.float64, np.float64, np.float64]: raise ValueError(expected_types_error_msg) for index, row in data_frame.iterrows(): if has_optional_columns: add_geo_coverage_node(eml_node, row[0], row[1], row[2], row[3], row[4], str(row[5]) if not pd.isna(row[5]) else None, str(row[6]) if not pd.isna(row[6]) else None, str(row[7]) if not pd.isna(row[7]) else None) else: add_geo_coverage_node(eml_node, row[0], row[1], row[2], row[3], row[4]) save_both_formats(filename=filename, eml_node=eml_node)
def abstract(filename=None): form = AbstractForm(filename=filename) # Process POST if request.method == 'POST': if 'Next' in request.form: new_page = PAGE_KEYWORD_SELECT elif BTN_HIDDEN_CHECK in request.form: new_page = PAGE_CHECK elif BTN_HIDDEN_SAVE in request.form: new_page = PAGE_ABSTRACT elif BTN_HIDDEN_DOWNLOAD in request.form: new_page = PAGE_DOWNLOAD elif BTN_HIDDEN_NEW in request.form: new_page = PAGE_CREATE elif BTN_HIDDEN_OPEN in request.form: new_page = PAGE_OPEN elif BTN_HIDDEN_CLOSE in request.form: new_page = PAGE_CLOSE else: submit_type = None new_page = PAGE_KEYWORD_SELECT if form.validate_on_submit(): if is_dirty_form(form): abstract = add_paragraph_tags(form.abstract.data) create_abstract(filename=filename, abstract=abstract) return redirect(url_for(new_page, filename=filename)) # Process GET eml_node = load_eml(filename=filename) abstract_node = eml_node.find_single_node_by_path( [names.DATASET, names.ABSTRACT]) if abstract_node: form.abstract.data = remove_paragraph_tags(abstract_node.content) form.md5.data = form_md5(form) set_current_page('abstract') help = [get_help('abstract'), get_help('nav')] return render_template('abstract.html', title='Abstract', filename=filename, form=form, help=help)
def publication_info(filename=None): form = PublicationInfoForm() # Process POST # if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST': new_page = PAGE_METHOD_STEP_SELECT this_page = PAGE_PUBLICATION_INFO new_page = handle_hidden_buttons(new_page, this_page) save = False if is_dirty_form(form): save = True if save: pubplace = form.pubplace.data pubdate = form.pubdate.data create_pubinfo(pubplace=pubplace, pubdate=pubdate, filename=filename) return redirect(url_for(new_page, filename=filename)) # Process GET eml_node = load_eml(filename=filename) pubplace_node = eml_node.find_single_node_by_path( [names.DATASET, names.PUBPLACE]) if pubplace_node: form.pubplace.data = pubplace_node.content pubdate_node = eml_node.find_single_node_by_path( [names.DATASET, names.PUBDATE]) if pubdate_node: form.pubdate.data = pubdate_node.content form.md5.data = form_md5(form) set_current_page('publication_info') help = get_helps(['pubplace', 'pubdate']) return render_template('publication_info.html', help=help, form=form, title='Publication Info')
def get_intellectual_rights(filename, form): eml_node = load_eml(filename=filename) intellectual_rights_node = eml_node.find_single_node_by_path( [names.DATASET, names.INTELLECTUALRIGHTS]) if intellectual_rights_node: ir_content = display_texttype_node(intellectual_rights_node) if INTELLECTUAL_RIGHTS_CC0 in ir_content: form.intellectual_rights_radio.data = 'CC0' form.intellectual_rights.data = '' elif INTELLECTUAL_RIGHTS_CC_BY in ir_content: form.intellectual_rights_radio.data = 'CCBY' form.intellectual_rights.data = '' else: form.intellectual_rights_radio.data = "Other" form.intellectual_rights.data = display_texttype_node( intellectual_rights_node) font_family = 'Courier' if node_has_literal_children( intellectual_rights_node) else '' return render_get_intellectual_rights_page(filename=filename, form=form, font_family=font_family)
def title(filename=None): log_info(f'Title') form = TitleForm() # Process POST if request.method == 'POST' and form.validate_on_submit(): save = False if is_dirty_form(form): save = True if save: create_title(title=form.title.data, filename=filename) form.md5.data = form_md5(form) new_page = PAGE_DATA_TABLE_SELECT this_page = PAGE_TITLE new_page = handle_hidden_buttons(new_page, this_page) return redirect(url_for(new_page, filename=filename)) # Process GET eml_node = load_eml(filename=filename) dataset_node = eml_node.find_child(child_name=names.DATASET) title_node = dataset_node.find_child(names.TITLE) if title_node: form.title.data = title_node.content form.md5.data = form_md5(form) set_current_page('title') help = get_helps(['title', 'nav', 'welcome']) first_usage = is_first_usage() return render_template('title.html', title='Title', form=form, help=help, is_first_usage=first_usage)
def load_geo_coverage_from_csv(csv_filename, filename): eml_node = load_eml(filename=filename) data_frame = pd.read_csv(csv_filename, comment='#', encoding='utf8') if list(data_frame.columns) != [ 'geographicDescription', 'northBoundingCoordinate', 'southBoundingCoordinate', 'eastBoundingCoordinate', 'westBoundingCoordinate' ]: raise ValueError( 'Geographic coverage file does not have expected column names.') if list(data_frame.dtypes) != [ np.object, np.float64, np.float64, np.float64, np.float64 ]: raise ValueError( 'Geographic coverage file does not have expected variable types in columns.' ) for index, row in data_frame.iterrows(): add_geo_coverage_node(eml_node, row[0], row[1], row[2], row[3], row[4]) save_both_formats(filename=filename, eml_node=eml_node)
def access(filename=None, node_id=None): eml_node = load_eml(filename=filename) if eml_node: access_node = eml_node.find_child(names.ACCESS) else: return if not access_node: access_node = Node(names.ACCESS, parent=eml_node) add_child(eml_node, access_node) form = AccessForm(filename=filename, node_id=node_id) # form = AccessForm() # Process POST if request.method == 'POST': if BTN_CANCEL in request.form: url = url_for(PAGE_ACCESS_SELECT, filename=filename) return redirect(url) next_page = PAGE_ACCESS_SELECT # Save or Back sends us back to the list of access rules if form.validate_on_submit(): if is_dirty_form(form): submit_type = 'Save Changes' else: submit_type = 'Back' if submit_type == 'Save Changes': userid = form.userid.data permission = form.permission.data allow_node = Node(names.ALLOW, parent=access_node) create_access_rule(allow_node, userid, permission) if node_id and len(node_id) != 1: old_allow_node = Node.get_node_instance(node_id) if old_allow_node: access_parent_node = old_allow_node.parent access_parent_node.replace_child( old_allow_node, allow_node) else: msg = f"No 'allow' node found in the node store with node id {node_id}" raise Exception(msg) else: add_child(access_node, allow_node) save_both_formats(filename=filename, eml_node=eml_node) url = url_for(next_page, filename=filename) return redirect(url) # Process GET if node_id == '1': form.init_md5() else: allow_nodes = access_node.find_all_children(names.ALLOW) if allow_nodes: for allow_node in allow_nodes: if node_id == allow_node.id: populate_access_rule_form(form, allow_node) break return render_template('access.html', title='Access Rule', form=form, filename=filename)
def taxonomic_coverage(filename=None, node_id=None, taxon=None): form = TaxonomicCoverageForm(filename=filename) # Process POST if request.method == 'POST' and BTN_CANCEL in request.form: url = url_for(PAGE_TAXONOMIC_COVERAGE_SELECT, filename=filename) return redirect(url) if request.method == 'POST' and form.validate_on_submit(): save = False if is_dirty_form(form): save = True # flash(f'save: {save}') form_value = request.form have_links = False if 'Fill' in form_value: source = form.taxonomic_authority.data if source == 'ITIS': source_type = TaxonomySourceEnum.ITIS elif source == 'NCBI': source_type = TaxonomySourceEnum.NCBI elif source == "WORMS": source_type = TaxonomySourceEnum.WORMS try: source_name = '' for choice in form.taxonomic_authority.choices: if choice[0] == source: source_name = choice[1] break hierarchy = fill_taxonomic_coverage(form.taxon_value.data, source_type, source_name) if hierarchy: # set the taxon rank dropdown appropriately rank = hierarchy[0][0].capitalize() if (rank, rank) in form.taxon_rank.choices: form.taxon_rank.data = rank # see if we should display a Links column for taxon in hierarchy: if taxon[4]: have_links = True break except ValueError as e: flash(str(e)) hierarchy = [(form.taxon_rank.data, form.taxon_value.data, '', '')] form.hierarchy.data = hierarchy form.hidden_taxon_rank.data = form.taxon_rank.data form.hidden_taxon_value.data = form.taxon_value.data form.hidden_taxonomic_authority.data = form.taxonomic_authority.data help = get_helps(['taxonomic_coverage_fill_hierarchy']) return render_template( 'taxonomic_coverage.html', title='Taxonomic Coverage', form=form, hierarchy=hierarchy, taxon_rank=form.taxon_rank.data, taxon_value=form.taxon_value.data, taxonomic_authority=form.taxonomic_authority.data, help=help, have_links=have_links) form_dict = form_value.to_dict(flat=False) new_page = PAGE_TAXONOMIC_COVERAGE_SELECT if form_dict: for key in form_dict: val = form_dict[key][0] # value is the first list element if val == BTN_HIDDEN_NEW: new_page = PAGE_CREATE break elif val == BTN_HIDDEN_OPEN: new_page = PAGE_OPEN break elif val == BTN_HIDDEN_CLOSE: new_page = PAGE_CLOSE break if save: if not form.taxon_value.data and not form.taxon_rank.data: return redirect(url_for(new_page, filename=filename)) submitted_hierarchy = form_value.get('hierarchy') if isinstance(form_value.get('hierarchy'), str) and form_value.get('hierarchy'): # convert hierarchy string to list submitted_hierarchy = ast.literal_eval( form_value.get('hierarchy')) form.hierarchy.data = submitted_hierarchy # if we're saving after doing 'Fill Hierarchy', fill in the values we've been passed if form_value.get('hidden_taxon_rank'): form.taxon_rank.data = form_value.get('hidden_taxon_rank') form.taxon_value.data = form_value.get('hidden_taxon_value') form.taxonomic_authority.data = form_value.get( 'hidden_taxonomic_authority') elif not submitted_hierarchy: # we don't have a hierarchy, so construct a fake hierarchy to be used by create_taxonomic_coverage() form.hierarchy.data = [(form_value.get('taxon_rank'), form_value.get('taxon_value'), '', '', '', '')] if not form_value.get('taxon_rank'): flash('Taxon Rank is required.') return redirect( url_for(PAGE_TAXONOMIC_COVERAGE, filename=filename, node_id=node_id, taxon=form.taxon_value.data)) eml_node = load_eml(filename=filename) dataset_node = eml_node.find_child(names.DATASET) if not dataset_node: dataset_node = Node(names.DATASET) coverage_node = dataset_node.find_child(names.COVERAGE) if not coverage_node: coverage_node = Node(names.COVERAGE, parent=dataset_node) add_child(dataset_node, coverage_node) txc_node = Node(names.TAXONOMICCOVERAGE, parent=coverage_node) create_taxonomic_coverage(txc_node, form.general_taxonomic_coverage.data, form.hierarchy.data, form.taxonomic_authority.data) if node_id and len(node_id) != 1: old_txc_node = Node.get_node_instance(node_id) if old_txc_node: coverage_parent_node = old_txc_node.parent coverage_parent_node.replace_child(old_txc_node, txc_node) else: msg = f"No node found in the node store with node id {node_id}" raise Exception(msg) else: add_child(coverage_node, txc_node) save_both_formats(filename=filename, eml_node=eml_node) return redirect(url_for(new_page, filename=filename)) # Process GET have_links = False if node_id == '1': form.init_md5() if taxon: form.taxon_value.data = taxon else: eml_node = load_eml(filename=filename) dataset_node = eml_node.find_child(names.DATASET) if dataset_node: coverage_node = dataset_node.find_child(names.COVERAGE) if coverage_node: txc_nodes = coverage_node.find_all_children( names.TAXONOMICCOVERAGE) if txc_nodes: for txc_node in txc_nodes: if node_id == txc_node.id: have_links = populate_taxonomic_coverage_form( form, txc_node) help = get_helps(['taxonomic_coverage_fill_hierarchy']) set_current_page('taxonomic_coverage') return render_template('taxonomic_coverage.html', title='Taxonomic Coverage', form=form, hierarchy=form.hierarchy.data, have_links=have_links, help=help)