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> Submit</a>
</li>
<li class="main-menu-item"role="menuitem">
<a><i class="icon icon-common icon-cogs"></i> 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"> </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">×</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">☆</span>
<span id="star4" class="star-icon">☆</span>
<span id="star3" class="star-icon">☆</span>
<span id="star2" class="star-icon">☆</span>
<span id="star1" class="star-icon">☆</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">×</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 'name' 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">×</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>