Skip to content

Example — Model metadata

Category: Small (no AI) · Script: examples/small/02_model_info.py Minimal (2 lines): examples/minimal/info.py

Metadata for BIOMD0000000206 (Teusink / Wolf glycolysis).


How to run

pip install -e "src/praisonai-bio"
python examples/small/02_model_info.py

Needs: Internet.


Tested output

Live capture from ./scripts/capture_example_outputs.sh.

Click to view full output
<!doctype html>
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!-- Consider adding an manifest.appcache: h5bp.com/d/Offline -->
<!--[if gt IE 8]> <html class="no-js" lang="en"> <![endif]-->
<html lang="en">
<head>

<meta charset="utf-8">
<!-- Use the .htaccess and remove these lines to avoid edge case issues.
   More info: h5bp.com/b/378 -->
<!-- Not yet implemented -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- Describe what this page is about -->
<meta name="description" content="BioModels is a repository of freely-available mathematical models of biological and biomedical systems. It hosts a vast selection of physiologically and pharmaceutically
relevant mechanistic models in standard formats."/>
<meta name="keywords" content="BioModels Database, biomodels, systems biology, bioinformatics, computational
    modelling, systems modelling, model repository, model database, SBML, PharmML, COMBINE Archive, OMEX,
    public domain">
<meta name="author" content="BioModels"/>
<meta name="google" content="notranslate"/>
<meta name="google-site-verification" content="Lw3ylc1DHWxe6umaxo3tA-Dm-QWs5YsG1b1EXIhNmPw"/>
<meta name="ebi:masthead-color" content="#254146">
<meta name="ebi:masthead-image" content="//ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/images/backgrounds/embl-ebi-background.jpg"/>
<!-- Mobile viewport optimized: j.mp/bplateviewport -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons -->
<link rel="apple-touch-icon" sizes="57x57" href="https://www.biomodels.org/images/biomodels/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="https://www.biomodels.org/images/biomodels/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="https://www.biomodels.org/images/biomodels/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="https://www.biomodels.org/images/biomodels/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="https://www.biomodels.org/images/biomodels/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="https://www.biomodels.org/images/biomodels/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="https://www.biomodels.org/images/biomodels/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://www.biomodels.org/images/biomodels/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://www.biomodels.org/images/biomodels/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192"  href="https://www.biomodels.org/images/biomodels/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://www.biomodels.org/images/biomodels/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="https://www.biomodels.org/images/biomodels/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="https://www.biomodels.org/images/biomodels/favicon-16x16.png">
<link rel="manifest" href="https://www.biomodels.org/images/biomodels/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="https://www.biomodels.org/images/biomodels/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<!-- If you link to any other sites frequently, consider optimising performance with a DNS prefetch -->
<link rel="dns-prefetch" href="https://ebi.emblstatic.net/" />
<!-- CSS: implied media=all -->
<!-- CSS concatenated and minified via ant build script -->
<link rel="stylesheet" type="text/css"
      href="https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/css/ebi-global.css"
      media="none" onload="if(media!=='all') media='all'">
<link rel="stylesheet" type="text/css"
      href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.3/fonts.css"
      media="none" onload="if(media!=='all') media='all'">
<!-- you can replace this with [projectname]-colours.css. See http://frontier.ebi.ac.uk/web/style/colour
for details of how to do this -->
<style>
    /* You have the option of setting a maximum width for your page, and making sure everything is centered */
    body {
        margin: 2px 5px auto;
    }
    li.divider {
        border-top: 1px solid #999;
    }
    #local-masthead nav ul.menu li:hover {
        background: rgb(0,124,130);
    }
</style>
<link rel="stylesheet" type="text/css" href="/css/common.css">
<!-- end CSS-->
<script src="https://code.jquery.com/jquery-1.11.1.min.js"
        integrity="sha256-VAvG3sHdS5LqTT+5A/aeq/bZGa/Uj04xKxY8KM/w9EE=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"
        integrity="sha256-xNjb53/rY+WmG+4L6tTl9m6PpqknWZvRt0rO1SRnJzw=" crossorigin="anonymous"></script>
<title>Login | BioModels</title>
    <script type="text/javascript">
        $.appName = "biomodels";
        $.serverUrl = "https://www.biomodels.org";
        var helpHidden=1;

            var helpWidth=-1;
            var maxWidth=-1;
            var maxHelpWidth=800;
            var minHelpWidth=50;
            var stepWidth=30;
            var syncResize=0;
            function adjustWidth(newWidth) {
                if (syncResize==1) {
                    var delta= helpWidth - newWidth;
                    var mainWidth=$("#mainframe" ).width();
                    if (maxWidth==-1) {
                        maxWidth=mainWidth;
                    }
                    if (maxWidth<(mainWidth+delta)) {
                        mainWidth=maxWidth;
                    }
                    else {
                        mainWidth+=delta;
                    }
                    $( "#mainframe" ).width(mainWidth);
                    helpWidth=newWidth;
                }
            }
            function hideHelp() {
                $( "#helpPanel" ).removeClass("helpHeightWorkaround")
                adjustWidth(0);
                $( "#helpPanel" ).hide();
                helpHidden=1;
                helpWidth=-1;
                $('#toggleHelp').text("More about this page");
                $('#toggleHelp').attr("title", "Access help for this page");
            }
            function showHelp() {
                $( "#helpPanel" ).addClass("helpHeightWorkaround")
                helpWidth=-1;
                $("html, body").animate({ scrollTop: 0 }, "medium");
                $( "#helpPanel" ).width(800);
                    $( "#helpPanel" ).show();
                    adjustWidth(800);
                    $( "#helpPanel" ).position({
                        my: "right-1 bottom",
                        at: "right-1 bottom",
                        of: ".main-menu"
                    });
                    helpHidden=0;
                    $('#toggleHelp').text("Hide help");
                    $('#toggleHelp').attr("title", "Hide help");
                }
                var isDragged=false;

        $(function() {


            $("#helpPanel").resizable({
                        handles: 'n,e,s,w',
                        maxWidth: maxHelpWidth,
                        animate: true,
                        resize: function( event, ui ) {
                            if (helpWidth==-1) {
                                helpWidth=ui.originalSize.width;
                            }
                            adjustWidth(ui.size.width);
                        }
            });
            $( "#helpPanel").draggable({ cursor: "move",
                                          revert: false,
                                          containment: "body",
                                          start: function() {
                                            isDragged=true;
                                          },
                                          stop: function( event, ui ) {
                                            isDragged=false;
                                          }
                                        });
            $( "#helpPanel" ).hide();
            $("#toolbar").mouseleave(function() {
                if (isDragged) {
                    $( "#helpPanel" ).draggable( "disable" );
                    $( "#helpPanel" ).draggable( "enable" );
                }
            })
            $( "#expand" ).button({
                text: false,
                icons: {
                    primary: "ui-icon-circle-plus"
                }
            }).click(function() {
                 helpWidth=$("#helpPanel" ).width();
                if (maxHelpWidth<(helpWidth+stepWidth)) {
                    helpWidth=maxHelpWidth;
                }
                else {
                    helpWidth+=stepWidth;
                }
                var windowRight = document.body.getBoundingClientRect ().right
                console.log(windowRight);
                $( "#helpPanel" ).width(helpWidth);
                var el= document.getElementById ("helpPanel");
                var helpRight = el.getBoundingClientRect ().right
                if (helpRight > windowRight) {
                    var offset = helpRight - windowRight + 10
                    $('#helpPanel').animate({
                        'marginLeft' : "-=" + offset + "px"
                    });
                }
            });
            $( "#contract" ).button({
                text: false,
                icons: {
                    primary: "ui-icon-circle-minus"
                }
            }).click(function() {
                 helpWidth=$("#helpPanel" ).width();
                if (minHelpWidth>helpWidth-stepWidth) {
                    helpWidth=minHelpWidth
                }
                else {
                    helpWidth-=stepWidth;
                }
                $( "#helpPanel" ).width(helpWidth);
                var addedPercentage = (helpWidth - 400) / 400
                var basic = 99+addedPercentage;
                $( "#helpFrame" ).width(basic+"%");
            });
            $( "#close" ).button({
                text: false,
                icons: {
                    primary: "ui-icon-circle-close"
                }
            }).click(function() {
                hideHelp();
            });
            $( "#snap" ).button({
                text: false,
                icons: {
                    primary: "ui-icon-arrowrefresh-1-e"
                }
            }).click(function() {
                hideHelp();
                showHelp();
            });
            $( "#outlink" ).button({
                text: false,
                icons: {
                    primary: "ui-icon-extlink"
                }
            }).click(function() {
                hideHelp();
                window.open('https://www.biomodels.org/user-guide/login.html','_blank');
                    });
                    $('#toggleHelp').click(function(event) {
                        event.preventDefault();
                        if (helpHidden==1) {
                            showHelp();
                        }
                        else {
                            hideHelp();
                        }
                    });

        });

</script>
    <script src="/js/jummp.js" type="text/javascript"></script>
    <script src="/js/notification.js" type="text/javascript"></script>
    <link rel="stylesheet" href="/css/notification.css" />
    <link rel="stylesheet" href="/css/biomodels/layout.css" />
    <link rel="stylesheet" href="/css/biomodels/biomodels.css" />
    <link rel="stylesheet" href="/css/jqueryui/smoothness/jquery-ui-1.10.3.custom.min.css" />

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="layout" content="biomodels/main"/>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="biomodels/main"/>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css"/>
<link rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
    .field-icon {
        float: right;
        margin-left: -25px;
        margin-top: -42px;
        margin-right: 10px;
        position: relative;
        z-index: 2;
    }
</style>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js"></script>

</head>
<!-- open body tag -->
<body class="level2 full-width">
<div id="mainframe">

<div id="skip-to">
    <a href="#content">Skip to main content</a>
</div>
<header id="masthead-black-bar" class="clearfix masthead-black-bar">
    <!-- EBML-EBI menu items will be rendered by the script in script.js -->
</header>
<div data-sticky-container class="sticky-container">
    <!-- Suggested layout containers -->
    <header id="masthead" class="masthead" data-sticky data-sticky-on="large" data-top-anchor="content:top"
            data-btm-anchor="content:bottom">
        <!-- local-title, local search -->
        <div class="masthead-inner row expanded">
            <div id="local-title"
                 class="hide-for-small-only medium-12 large-4 columns padding-top-none padding-bottom-none padding-left-none padding-right-none">
                <h1>
                    <a href="https://www.biomodels.org/" title="Back to BioModels homepage"
                    style="text-decoration: none; border-bottom-style: none">
                        <img src="https://www.biomodels.org/images/biomodels/logo_small.png"
                             title="BioModels Homepage"/>
                        <span class="hide-for-small-only">BioModels</span></a>
                </h1>
            </div>
            <!-- local-search -->
            <div id="localsearch" class="small-12 medium-12 large-8 columns float-right">

<style type="text/css">
    #clearsearch {
        display: block;
        outline: none;
        text-align: center;
        padding-left: 10px;
        padding-right: 8px;
    }
    .search_box_style {
        background-color: white;
        color: #0a0a0a;
        cursor: pointer;
        border: none;
    }
    .clearable {
        position: relative;
        text-align: left;
    }
    #domain_switcher {
        float: right;
    }
    .example-label {
        font-size: 0.8rem;
    }
</style>
<form id="local-search" name="local-search"
      action="/search" method="post">
    <fieldset><div class="row">
        <div class="input-group margin-bottom-none margin-top-large padding-bottom-medium">
            <div class="input-group-field columns large-3 medium-3 small-12" style="vertical-align: text-top">
                <select class="margin-bottom-none align-self-top" id="domain_switcher" name="domain_switcher" title="Please choose a domain">
                    <option value="biomodels_all">All Models</option>
                    <option value="biomodels">Individual Models</option>
                    <option value="biomodels_autogen">Autogenerated Models</option>
                </select>
                <br/><br/>
                <a class="help-text label-floating-left secondary label"
                   title="Learn more"
                   data-open="domainSwitcherExplanationBox">What is this box used for?</a>
                <input type="text" id="chosenDomain" name="chosenDomain" style="display: none" value="biomodels" aria-label="Choose a domain"/>
            </div>
            <div class="input-group-field columns large-8 medium-8 small-12">
                <input type="text" name="search_block_form" id="local-search-box"
                   placeholder="Search..." class="input-group-field search_box_style clearable"
                   title="Search"
                   tabindex="1" style="width: 100%;">
                <p id="example" class="example-label">
                    Examples:
                    <a href="/search?query=*%3A*" class="secondary label" title="Search all">*:*</a>
                    <a href="/search?query=MAPK+cascade" class="secondary label" title="Search by GO term">MAPK cascade</a>
                    <a href="/search?query=homo+sapiens" class="secondary label" title="Search by Taxonomy term">homo sapiens</a>
                    <a href="/search?query=lung+cancer" class="secondary label" title="Search by Disease term">lung cancer</a>
                    <a title="Search tips/tricks" data-open="searchTipsBox"
                       class="secondary label label-floating-right">Search tips</a>
                </p></div>
            <div class="input-group-button columns large-1 medium-2 small-12" style="float: left">
                <input id="btn-search-submit" class="button icon icon-functional" tabindex="2"
                       type="submit" name="searchSubmit" value="1" />
            </div>
        </div>
    </div></fieldset>
</form>
<script type="text/javascript">
    $(document).ready(function () {
        let domain = "";
        // biomodels is the default domain
        let chosenDomain = domain.length > 0 ? domain : "biomodels";
        $('#chosenDomain').val(chosenDomain);
        $('#domain_switcher').val(chosenDomain);
        const urlParams = new URLSearchParams(window.location.search);
        const query = urlParams.get('query');
        if (query) {
            $("#local-search-box").val(query);
        }
    });
    $(document).on('change', '#domain_switcher', {}, function(e) {
        e.preventDefault();
        let domain = $(this).val();
        $('#chosenDomain').val(domain);
    });
    /* Use event capturing (runs before other handlers) */
    document.getElementById('local-search').addEventListener('submit', function(e) {
        e.preventDefault();
        e.stopImmediatePropagation();
        const query = document.getElementById('local-search-box').value;
        const domain = document.getElementById('chosenDomain').value;
        const urlParams = new URLSearchParams(window.location.search);
        urlParams.set('query', query);
        urlParams.set('domain', domain);
        const searchPattern = /^\/search(?:\/|$)/i;
        let newURL;
        if (searchPattern.test(window.location.pathname)) {
            // Matches /search or /search/ but NOT /search-results
            newURL = window.location.pathname + '?' + urlParams.toString();
        } else {
            newURL = "https://www.biomodels.org/search?" + urlParams.toString();
        }
        window.location.href = newURL;
        return false;
    }, true); // true = use capture phase
</script>
            </div>
            <!-- local navigation bar -->

<div id="biomodels-toggle-bar" class="hide-for-medium">
    <button class="menu-icon" type="button" id="biomodels-hamburger"></button>
    <div class="title-bar-title">Menu</div>
</div>
<nav>
<div id="biomodels-menu">
<div class="top-bar-left">
<ul id="local-nav" class="main-menu dropdown menu"
    data-description="navigational" data-dropdown-menu role="menubar">
    <li class="main-menu-item"
        role="menuitem">
        <a href="https://www.biomodels.org/" title="Back to BioModels homepage">
            <i class="icon icon-generic" data-icon="H"></i> Home</a>
    </li>

    <li class="main-menu-item"
        role="menuitem">
        <a><i class="icon icon-common" data-icon="b"></i> Browse</a>
        <ul class="menu">
            <li><a href="/search?query=*%3A*">All
            models</a></li>
            <li><a
                href="/parameterSearch/index">BioModels Parameters Search</a>
            </li>
            <li><a href="/covid-19">COVID-19</a></li>

            <li><a href="/agedbrain">Neurodegeneration models</a></li>
            <li><a href="/path2models">Path2Models models</a></li>
            <li>
                <a href="/pdgsmm/index">
                    PDGSM models
                </a>
            </li>
            <li><a href="/reproducibility">Reproducibility</a></li>
        </ul>
    </li>
    <li class="main-menu-item"
        role="menuitem">
        <a href="/model/submission-guidelines-and-agreement">
            <i class="icon icon-common icon-submit"></i>&nbsp;Submit</a>
    </li>
    <li class="main-menu-item"role="menuitem">
        <a><i class="icon icon-common icon-cogs"></i>&nbsp;Curation</a>
        <ul class="menu">

            <li><a href="/curation/fbc">FBC</a></li>
        </ul>
    </li>
    <li class="main-menu-item"role="menuitem">
        <a><i class="icon icon-common icon-support"></i> Help</a>
        <ul class="menu">
            <li><a href="/faq">FAQs</a></li>
            <li class="divider"></li>
            <li><a href="https://www.biomodels.org/user-guide/manual.html" target="_blank">User Manual</a></li>
            <li class="divider"></li>
            <li><a href="/curation-docs">Curator's Zone</a></li>
            <li class="divider"></li>
            <li><a href="/dev">Developer's Zone</a></li>
            <li class="divider"></li>
            <li><a href="/courses">Courses</a></li>
            <li><a href="//www.ebi.ac.uk/biomodels/tools/converters/" target="_blank">Online converters</a></li>
        </ul>
    </li>
    <li class="main-menu-item"role="menuitem">
        <a><i class="icon icon-common icon-info"></i> About us</a>
        <ul class="menu">
            <li><a href="/privacy">Privacy Policy</a></li>

            <li><a href="/termsofuse">Terms of Use</a></li>
            <li class="divider"></li>
            <li><a href="/citation">Citation</a></li>
            <li><a href="/news">News</a></li>
            <li><a href="/acknowledgements">Acknowledgements</a></li>
            <li><a href="/jobs">Jobs</a></li>
            <li><a href="/jummp/curators">Curators</a></li>
            <li class="divider"></li>
            <li><a>Model of the Year</a>
                <ul class="menu">
                    <li><a href='/competition/model-of-the-year-2025'>MOY2025</a></li>
                    <li><a href='/competition/model-of-the-year-2024'>MOY2024</a></li>
                    <li><a href='/competition/model-of-the-year-2023'>MOY2023</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li class="main-menu-item"role="menuitem">
        <a href="/contact">
            <i class="icon icon-common icon-contact"></i> Contact us
        </a>
    </li>
    <li style="border-right: none" id="menuItemFeedback" data-open="rate_review_form"
        role="menuitem" class="main-menu-item">
        <!-- rate_review_form is the identifier of the modal feedback form defined in the footer.
             This form is rendered using the feedback template of the web plugin -->
        <a><i class="icon icon-common icon-comment"></i> Feedback</a>
    </li>
    <!-- If you need to include functional (as opposed to purely navigational) links in your local menu,
       add them here, and give them a class of "functional". Remember: you'll need a class of "last" for
       whichever one will show up last... For example: -->
</ul></div>
<div class="top-bar-right">
<ul class="main-menu dropdown menu"
        data-description="navigational" data-dropdown-menu role="menubar">


        <li class="main-menu-item functional first float-right "
            role="menuitem">
            <a href='/registration' class="icon icon-functional"
               data-icon="7">Register</a>
        </li>
        <li  class="active main-menu-item functional first float-right " 
            role="menuitem">
            <a href="https://www.biomodels.org/login/auth">
                <span class="icon icon-common icon-sign-in-alt">&nbsp;</span>Login
            </a>
        </li>

</ul>
</div></div>
</nav>
        </div><!-- /local-title -->
    </header>
</div>

<div id="content" role="main" class="row">
    <div data-sticky-container class="sticky-container">

            <!-- Facets search is unavailable -->

                <div id="main-content" class="small-12 medium-12 large-12 columns">
                    <div class="row" style="padding: 5px 0px 0px 0px">
    <div class="columns small-12 medium-12 large-12">
        <div class='flashNotificationDiv'>


                    <script type="text/javascript">
                        hideNow()

</script>


        </div>
    </div>
</div>


        <script type="text/javascript">
    // define the variables tied to the current user for later usages in common.js
    // Some of these variables are populated by the server-side ones
    var currentUsername = "";
    var currentEmail = "";
    var currentRealName = "";
    var currentOrcid = "";
    var actionName = "auth";

</script>
        <div id="login" class="row">
            <div class="small-12 medium-6 medium-centered large-4 large-centered columns">
                <form action="/j_spring_security_check" method="post" id="loginForm" class="cssform" autocomplete="on">
                    <div class="row column log-in-form">
                        <h3 class="text-center">Log in to your account</h3>
                        <label>Username
                            <input type='text' name='j_username' id='username' placeholder="Username">
                        </label>
                        <label>Password
                            <input type='password' name='j_password' id='password' placeholder="Password" autocomplete="on"/>
                            <span id="toggle-password"
                                  class="fa fa-fw fa-eye field-icon toggle-password"></span>
                        </label>
                        <label for='j_previousURL'>
                            <input type='text' name='j_previousURL' id='j_previousURL'  value=""
                                   style="display: none"/></label>
                        <label for="j_deviceInfo">
                            <input type='text' name='j_deviceInfo' id='j_deviceInfo' value=""
                                   style="display: none"/>
                        </label>
                        <p><button type="button" class="button expanded" id="btnLogIn">Log In</button></p>
                        <p class="text-center">
                            <a href="https://www.biomodels.org/forgotpassword">Forgot your password?</a></p>

                        <p class="text-center">
                            <a href="https://www.biomodels.org/registration">Register</a></p>

                    </div>
                </form>
            </div>
        </div>
        <!--
 common-script.gsp is as the placeholder to define scripts where they need to use
 Grails tag-libs or server side variables.
 -->
<script type="text/javascript">
function verifyCompromisedPassword(password) {
    const URL = "/usermanagement/verifyCompromisedPassword";
    fetch(URL, {
        method: 'POST',
        headers: {
            'Accept': 'application/json; charset=utf-8',
            'Content-Type': 'application/json; charset=utf-8'
        },
        body: JSON.stringify({'password': password})
    }).then(response => {
        if (!response.ok) {
            throw new Error('Network response failed!!!');
        }
        return response.json();
    }).then(data => {
        if (data["result"]) {
            let msg = "<h4 style='color: red'><b>Compromised Password Alert!</b></h4>";
            if (['editPassword', 'reset'].includes("auth")) {
                msg += "This password is known to cybercriminals far and wide! " +
                "It has been publicly exposed in one or more data breaches.";
            } else if ("auth" === 'auth') {
                msg += "This password has appeared in one or more data breaches which puts your account at " +
                "high risk of compromise. You should change your password immediately."
            }
            showNotification(msg);
        } else {
            clearNotification();
            hideNow();
        }
    }).catch(error => {
        console.error('Error: ', error);
    });
}
function checkCompromisedPasswordOnServerSide(username, password) {
    const URL = "/usermanagement/verifyCompromisedPasswordAndNotifyUser";
    fetch(URL, {
        method: 'POST',
        headers: {
            'Accept': 'application/json; charset=utf-8',
            'Content-Type': 'application/json; charset=utf-8'
        },
        body: JSON.stringify({'username': username, 'password': password})
    }).then(response => {
        if (!response.ok) {
            throw new Error('Network response failed!!!');
        }
        return response.json();
    }).then(data => {
        if (data["compromised"]) {
            console.log("Sent the verification compromised password to the server side.");
        } else {
            console.log("Cannot verify compromised password to the server side.");
        }
    }).catch(error => {
        console.error('Error: ', error);
    });
}
function checkPasswordStrength(password) {
    // source: https://martech.zone/javascript-password-strength/
    // Initialize variables
    let strength = 0;
    let strengthLevel;
    let tips = [];
    // Check password length
    let tip = "Make the password longer.";
    if (password.length < 10) {
        tips.push(tip);
    } else {
        strength += 1;
        // tips.splice( $.inArray(tip, tips), 1);
        tips = jQuery.grep(tips, function(value) { return value !== tip; });
    }
    // Check for mixed case
    tip = "Use both lowercase and uppercase letters.";
    if (password.match(/[a-z]/) && password.match(/[A-Z]/)) {
        strength += 1;
        // tips.splice( $.inArray(tip, tips), 1);
        tips = jQuery.grep(tips, function(value) { return value !== tip; });
    } else {
        tips.push(tip);
    }
    // Check for numbers
    tip = "Include at least one number.";
    if (password.match(/\d/)) {
        strength += 1;
        // tips.splice( $.inArray(tip, tips), 1);
        tips = jQuery.grep(tips, function(value) { return value !== tip; });
    } else {
        tips.push(tip);
    }
    // Check for special characters
    tip = "Include at least one special character.";
    if (password.match(/[^a-zA-Z\d]/)) {
        strength += 1;
        // tips.splice( $.inArray(tip, tips), 1);
        tips = jQuery.grep(tips, function(value) { return value !== tip; });
    } else {
        tips.push(tip);
    }
    // Return results
    if (strength < 2) {
         strengthLevel = "Easy to guess.";
    } else if (strength === 2) {
        strengthLevel = "Medium difficulty." ;
    } else if (strength === 3) {
        strengthLevel =  "Difficult.";
    } else {
        strengthLevel = "Extremely difficult.";
    }
    return { strength: strength, strengthLevel: strengthLevel, tips: tips };
}
function validateNewPassword(newPassword, newPasswordHelp, showWarning = false) {
    const newPasswordVal = newPassword.val();
    verifyCompromisedPassword(newPasswordVal);
    let s = checkPasswordStrength(newPasswordVal);
    let colourCode;
    let retVal = false;
    switch (s.strengthLevel) {
        case "Easy to guess.":
            colourCode = "red";
            if (showWarning) {
                toastr.error(s.strengthLevel);
            }
            break;
        case "Medium difficulty.":
            colourCode = "orange";
            if (showWarning) {
                toastr.warning(s.strengthLevel);
            }
            break;
        case "Difficult.":
            retVal = true;
            colourCode = "cornflowerblue";
            if (showWarning) {
                toastr.info(s.strengthLevel);
            }
            break;
        case "Extremely difficult.":
            retVal = true;
            colourCode = "green";
            if (showWarning) {
                toastr.success(s.strengthLevel);
            }
            break;
    }
    let msg = '<span style="color: ' + colourCode + '">' + s.strengthLevel + '</span>';
    if (s.tips.length !== 0) {
        msg += "<br/>" + s.tips.join("<br/>");
    }
    newPasswordHelp.show();
    newPasswordHelp.html(msg);
    return retVal;
}
function validateNewPasswordRpt(newPassword, newPasswordRpt, newPasswordRptHelp) {
    const newPasswordRptVal = newPasswordRpt.val();
    const newPasswordVal = newPassword.val();
    let retVal;
    if (newPasswordRptVal.length === 0) {
        retVal = false;
        newPasswordRptHelp.show();
        newPasswordRptHelp.html("Please retype your new password!");
    } else if (newPasswordVal !== newPasswordRptVal) {
        retVal = false;
        newPasswordRptHelp.show();
        newPasswordRptHelp.html("New password does not match!");
    } else {
        retVal = true;
        newPasswordRptHelp.hide();
    }
    return retVal;
}

</script>
        <script type='text/javascript'>
            const referrer = document.referrer;
            const loginInput = $("#loginForm input");
            const loginForm = $("#loginForm");
            const loginUsername = $("#username");
            const loginPassword = $("#password");
            loginInput.focus(function() {
                if ($(this).data("reset") === undefined) {
                $(this).val("");
                $(this).data("reset", true);
                }
            });
            loginInput.on("keyup", function(event) {
                // magic value 13 is entered
                if (event.which === 13) {
                    loginForm.submit();
                    checkCompromisedPasswordOnServerSide(loginUsername.val(), loginPassword.val());
                }
            });
            const loginSubmit = $("#btnLogIn");
            loginSubmit.on("click", function() {
                const deviceInfo = $("#j_deviceInfo");
                $(deviceInfo).val(localStorage.getItem(loginUsername.val()));
                loginForm.submit();
                checkCompromisedPasswordOnServerSide(loginUsername.val(), loginPassword.val());
            });
            $(document).ready(function() {
                if (referrer.indexOf("biomodels/MODEL") > 0) {
                    const previousURL = $("#j_previousURL");
                    previousURL.val(referrer);
                }
            });
            loginPassword.on("focus", function() {
                clearNotification();
                hideNow();
            });
            loginPassword.on("blur", function() {
                // the function below was defined in the common-script.gsp template
                verifyCompromisedPassword($(this).val());
            });
        </script>
    <script type="text/javascript">
    $(".toggle-password").on("click", function() {
        $(this).toggleClass("fa-eye fa-eye-slash");
        let input = $("#password");
        if (["editPassword", "reset"].includes("auth")) {
            input = $("#newPassword");
        }
        if (input.attr("type") === "password") {
            input.attr("type", "text");
        } else {
            input.attr("type", "password");
        }
    });

</script>

                </div>


    </div>
</div>

<footer id="local-footer" class="local-footer">
    <!-- Optional local footer (insert citation / project-specific copyright / etc here -->
    <div  id="footer" class="row">
        <div>
            <div class="small-12 medium-6 large-6 columns">
                <span style="font-size: small">Build: <a href="//bitbucket.org/biomodels/jummp-biomodels/commits/all?search=8f9b24217">8f9b24217</a> | Sat, 9 May 2026 12:04:37 +0100</span>
            </div>
            <div class="small-12 medium-6 large-6 columns" style="text-align: right">
                <span style="font-size: small">

            </div>
        </div>
        <div class="clear"></div>
    </div>
     <div id="elixir-banner" data-color="grey" data-name="This service"
          data-description="BioModels is an ELIXIR Deposition Database"
          data-more-information-link="//www.elixir-europe.org/platforms/data/elixir-deposition-databases"
          data-use-basic-styles="true"></div>
     <script defer="defer"
             src="https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/elixirBanner.js"></script>
     <style>
         .elixir-ribbon {
             padding: 1rem 0;
             /*background-color: rgb(79,138,156);*/
             background-color: rgb(0, 124, 130);
             /*background-color:#008080;*/
             vertical-align: middle;
         }
         .elixir-ribbon,
         .elixir-ribbon h5,
         .elixir-ribbon a,
         .elixir-ribbon a:active,
         .elixir-ribbon a:visited,
         .elixir-ribbon a:hover {
             color: #fff;
             text-decoration: none;
         }
         .elixir-ribbon a:hover {
             opacity: .8;
         }
         .elixir-ribbon .readmore {
             border-bottom: 1px dotted #fff;
         }
         .elixir-ribbon h5 {
             margin: 0;
         }
         .elixir-ribbon .elixir-logo-kite {
             background: 80% 58% url("https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.2/images/logos/assorted/elixir_kitemark-60px.png") no-repeat;
             position: relative;
             /*top: -5px;*/
             /*margin: 0 1rem -.5rem 0;*/
             margin-left: 1.25rem;
             height: 60px;
             width: 60px;
             display: inline-block;
             float: left;
             background-size: 60px;
             vertical-align: middle;
         }
         .elixir-ribbon .row {
             margin: 0 !important;
         }
     </style>
    <!-- End optional local footer -->
    <div id="global-footer" class="global-footer">
        <nav id="global-nav-expanded" class="row global-nav-expanded">
            <!-- Footer will be automatically inserted by footer.js -->
        </nav>
        <section id="ebi-footer-meta" class="row ebi-footer-meta">
            <!-- Footer meta will be automatically inserted by footer.js -->
        </section>
    </div>
     <div class="reveal" id="rate_review_form" data-reveal>
    <h3 id="messageTitle"
        style="border-bottom: 1px solid grey">Please give your feedback</h3>
    <button class="close-button" data-close aria-label="Close modal" type="button">
        <span aria-hidden="true">&times;</span>
    </button>
    <div class="contact-panel" id="feedback_panel" data-toggler=".is-active">
        <table class="responsive-table">

        <div class="rating">
            <span id="star5" class="star-icon">&#9734;</span>
            <span id="star4" class="star-icon">&#9734;</span>
            <span id="star3" class="star-icon">&#9734;</span>
            <span id="star2" class="star-icon">&#9734;</span>
            <span id="star1" class="star-icon">&#9734;</span></div>
        <input id="rateStar" name="rateStar" hidden required="true" />

        </table>
        <form action="">
            <div class="row">
                <label>Email (Optional)
                    <input type="email" id="emailAddress" placeholder="Email address">
                </label>
                <label>Additional comments (Optional)
                    <textarea id="additionalComment"
                              placeholder="Share details of your experience with this site."
                              rows="3"></textarea>
                </label>
            </div>
            <div class="contact-panel-actions">
                <input id="submitButtonRate" type="submit"
                       class="button submit-button" value="Submit">
            </div>
        </form>
    </div>
</div>

<div class="reveal" id="searchTipsBox" data-reveal>
    <h3 id="messageTitle"
        style="border-bottom: 1px solid grey">Search Tips/Tricks</h3>
    <button class="close-button" data-close aria-label="Close modal" type="button">
        <span aria-hidden="true">&times;</span>
    </button>
    <div class="search-tips-panel" id="searchTips_panel" data-toggler=".is-active">
        <ul>
            <li>Search is based on exact word matches. Make sure your <strong>spelling</strong> is correct.
            Example: the misspelled terms like <a href="/search?query=CelCycle" class="secondary label" title="Search by CelCycle term" target="_blank">CelCycle</a> (missing "l") will not find any results.</li>
            <li>Search for the phrase "Glucose" in the name field. Example: <a href="/search?query=name%3AGlucose" class="secondary label" title="Search by Glucose term in the &#39;name&#39; field" target="_blank">name:"Glucose"</a></li>
            <li>Matches all models having model elements that were annotated with Gene Ontology term cell growth. Example:
                <a href="/search?query=GO%3A0016049" class="secondary label" title="Search by Gene Ontology term cell growth" target="_blank">GO:0016049</a></li>
        </ul>
        <p><a href="https://www.biomodels.org/user-guide/model_search.html"
              target="_blank">Learn more about searching models</a></p>
    </div>
</div>
     <script>
    $(document).ready(() => {
        const elixirRibbon = $("div.elixir-ribbon > div.row > div.column");
        if (elixirRibbon.length) {
            elixirRibbon.removeClass("column");
            elixirRibbon.addClass("columns small-12 medium-6 large-6");
            $('<div class="columns small-12 medium-6 large-6">' +
                '<h5><a href="https://www.ebi.ac.uk/licencing" target="_blank">EMBL-EBI Licencing</a><br/>' +
                '<a href="https://www.ebi.ac.uk/long-term-data-preservation" target="_blank">' +
                'EMBL-EBI Data Preservation</a></h5></div>').insertAfter(elixirRibbon);
        }
    });
</script>
     <div class="reveal" id="domainSwitcherExplanationBox" data-reveal>
    <h3 id="messageTitle"
        style="border-bottom: 1px solid grey">What are BioModels domains?</h3>
    <button class="close-button" data-close aria-label="Close modal" type="button">
        <span aria-hidden="true">&times;</span>
    </button>
    <div class="explanation-panel" id="domainSwitcherExplanationPanel" data-toggler=".is-active">
        <p>This drop down box allows you to filter which models appear in the search results:
        <ul>
            <li><strong>Autogenerated Models</strong>: large-scale or automatically-generated submissions such as <a href="/path2models" target="_blank">Path2Models</a> or
            <a href="/pdgsmm/index" target="_blank">Patient-derived genome scale metabolic models (PDGSMM)</a> </li>
            <li><strong>Individual Models</strong>: models described in the literature that have been submitted individually to BioModels</li>
            <li><strong>All Models</strong>: the whole BioModels content</li>
        </ul>
        </p>
        <p>The default search domain is <strong>Individual Models</strong>.</p>
        <p><a href="https://www.biomodels.org/user-guide/model_search.html"
              target="_blank">Learn more about searching models</a></p>
    </div>
</div>
</footer>

        <div id="helpbutton">
            <a id="toggleHelp" title="Access help for this page" href="#">More about this page</a>
        </div>
        <div id="helpPanel">
            <div id="toolbar" class="ui-widget-header ui-corner-all">
                <button id="expand">Increase help size</button>
                <button id="contract">Decrease help size</button>
                <button id="snap">Reset help</button>
                <button id="outlink">Open in a new tab</button>
                <button id="close">Close</button>
            </div>
            <iframe id='helpFrame' src='https://www.biomodels.org/user-guide/login.html#contextSpecific/800'></iframe>
        </div>

</div>
<!-- JavaScript at the bottom for fast page loading -->
<script src="https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/script.js"></script>
<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<!-- The Foundation theme JavaScript -->
<script src="https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/libraries/foundation-6/js/foundation.js"></script>
<script src="https://ebi.emblstatic.net/web_guidelines/EBI-Framework/v1.3/js/foundationExtendEBI.js"></script>
<script type="text/JavaScript">$(document).foundation();</script>
<script type="text/JavaScript">$(document).foundationExtendEBI();</script>
<!-- customised scripts -->
<script src="/js/common.js" type="text/javascript"></script>
<!-- end scripts-->
</body>
</html>

← All examples