Commit 59207834 authored by pm22d12's avatar pm22d12
Browse files

Add summary configuration task

parent bea65988
......@@ -63,6 +63,14 @@ def desactivate_download(queue, filename):
def get_downloads_with_error(queue):
try:
return get_configurations_summaries_with_error(queue)
except:
return get_downloads_configurations_with_error(queue)
def get_downloads_configurations_with_error(queue):
mapFile = {}
mapFile["ON"] = []
mapFile["OFF"] = []
......@@ -113,6 +121,65 @@ def get_downloads_with_error(queue):
return mapFile, map_file_id, map_file_id_test, mark_safe(text_error)
def get_configurations_summaries_with_error(queue):
mapFile = {}
mapFile["ON"] = []
mapFile["OFF"] = []
mapFile["TEST"] = []
map_file_id = {}
map_file_id_test = {}
text_error = ""
schema = get_schema(summary=True)
parser = objectify.makeparser(strip_cdata=False, schema=schema)
configuration_files_summary = tasks.read_configuration_files_summary(queue)
for filename in configuration_files_summary.keys():
mapFileName = {}
map = ""
error = ""
name, fileExtension = os.path.splitext(filename)
filesplit = name.split(".")
if fileExtension == ".xml" and filesplit[-1] == "download":
map = "ON"
elif fileExtension == ".xml" and filesplit[-1] == "test" and filesplit[-2] == "download":
map = "TEST"
elif fileExtension in (".OFF", ".BAD") and filesplit[-1] == "xml" and filesplit[-2] == "download":
map = "OFF"
elif filename[0:1] != '.':
error = f"<b>{filename}</b> is not a configuration file"
else:
continue
if error == "":
try:
file_data = objectify.fromstring(configuration_files_summary[filename], parser=parser)
mapData = []
mapData.append(file_data)
mapFileName[filename] = mapData
mapFile[map].append(mapFileName)
if map == "ON":
map_file_id[filename] = file_data.attrib['id']
if map == "TEST":
map_file_id_test[filename] = file_data.attrib['id']
except XMLSyntaxError as e:
error = f"<b>{filename}</b> => {str(e)}"
if error != "":
if text_error != "":
text_error += "<br>"
text_error += error
return mapFile, map_file_id, map_file_id_test, mark_safe(text_error)
def get_downloads(queue):
mapFile = {}
......@@ -146,7 +213,7 @@ def get_downloads(queue):
return mapFile, map_file_id, map_file_id_test
"""
def get_downloads_id(queue):
map_id = {}
......@@ -174,7 +241,7 @@ def get_downloads_id(queue):
map_id[id] = state
return map_id
"""
def filter_downloads(queue, pattern):
map_downloads = {}
......@@ -197,9 +264,13 @@ def filter_downloads(queue, pattern):
return map_downloads
def get_schema():
fileschema = os.path.join(
downloader_django.common.constants.XSD_DIR, 'conf_download.xsd')
def get_schema(summary=False):
if summary:
fileschema = os.path.join(
downloader_django.common.constants.XSD_DIR, 'summary_download.xsd')
else:
fileschema = os.path.join(
downloader_django.common.constants.XSD_DIR, 'conf_download.xsd')
schema = etree.XMLSchema(file=fileschema)
return schema
......@@ -338,12 +409,7 @@ def save_data_source(file_data, submitted_data):
parent_loc.protocol = submitted_data['type_remote']
if parent_loc.protocol in ("Ftp", "Sftp", "Https", "Https_opensearch", "Webdav"):
if submitted_data['user_remote']:
if parent_loc.find("login") is None:
dummy = etree.SubElement(parent_loc, "login")
parent_loc.login = submitted_data['user_remote']
if parent_loc.protocol in ("Ftp", "Sftp", "Ftps", "Https", "Https_opensearch", "Webdav"):
if submitted_data['server_remote']:
if parent_loc.find("server") is None:
......@@ -354,21 +420,32 @@ def save_data_source(file_data, submitted_data):
if parent_loc.find("port") is None:
dummy = etree.SubElement(parent_loc, "port")
parent_loc.port = submitted_data['port_remote']
elif parent_loc.find("port") is not None:
parent_loc.remove(parent_loc.port)
if parent_loc.find("login") is None:
dummy = etree.SubElement(parent_loc, "login")
if submitted_data['user_remote']:
parent_loc.login = submitted_data['user_remote']
else:
parent_loc.login = ""
if parent_loc.find("password") is None:
dummy = etree.SubElement(parent_loc, "password")
if submitted_data['passwd_remote']:
if parent_loc.find("password") is None:
dummy = etree.SubElement(parent_loc, "password")
parent_loc.password = submitted_data['passwd_remote']
else:
parent_loc.password = ""
protocol_options = ""
for opt in downloader_django.common.constants.PROTOCOL_OPTIONS:
value = submitted_data['protocol_option_' + opt]
if value:
protocol_options += "'" + opt + "': '" + value + "',"
if protocol_options == "":
if parent_loc.protocol not in ["Https", "Ftp"]:
if parent_loc.find("protocol_option") is not None:
parent_loc.remove(parent_loc.protocol_option)
elif parent_loc.protocol == "Https":
else:
protocol_options = ""
for opt in downloader_django.common.constants.PROTOCOL_OPTIONS[parent_loc.protocol]:
value = submitted_data['protocol_option_' + opt]
if value:
protocol_options += "'" + opt + "': '" + value + "',"
if parent_loc.find("protocol_option") is None:
dummy = etree.SubElement(parent_loc, "protocol_option")
parent_loc.protocol_option = protocol_options[:-1]
......@@ -381,6 +458,8 @@ def save_data_source(file_data, submitted_data):
parent_loc.remove(parent_loc.server)
if parent_loc.find("port") is not None:
parent_loc.remove(parent_loc.port)
if parent_loc.find("protocol_option") is not None:
parent_loc.remove(parent_loc.protocol_option)
if submitted_data['repos_remote']:
if parent_loc.find("rootpath") is None:
......
......@@ -25,8 +25,7 @@ from downloader_django.common.system import tasks
def activate(request, xml_filename):
is_success = downloaderXml.activate_download(request.session['queue'], xml_filename)
file_map, map_file_id, map_file_id_test = downloaderXml.get_downloads(request.session['queue'])
#add_test_status(request.session['queue'], file_map)
file_map, map_file_id, map_file_id_test, text_error = downloaderXml.get_downloads_with_error(request.session['queue'])
if is_success:
return render(
request,
......@@ -45,7 +44,7 @@ def activate(request, xml_filename):
def desactivate(request, xml_filename):
is_success = downloaderXml.desactivate_download(request.session['queue'], xml_filename)
file_map, map_file_id, map_file_id_test = downloaderXml.get_downloads(request.session['queue'])
file_map, map_file_id, map_file_id_test, text_error = downloaderXml.get_downloads_with_error(request.session['queue'])
#add_test_status(request.session['queue'], file_map)
if is_success:
return render(
......@@ -65,7 +64,7 @@ def desactivate(request, xml_filename):
def modetest(request, xml_filename):
is_success = downloaderXml.mode_test(request.session['queue'], xml_filename)
file_map, map_file_id, map_file_id_test = downloaderXml.get_downloads(request.session['queue'])
file_map, map_file_id, map_file_id_test, text_error = downloaderXml.get_downloads_with_error(request.session['queue'])
#add_test_status(request.session['queue'], file_map)
if is_success:
return render(
......@@ -158,7 +157,7 @@ def editdownload(request, xml_filename):
)
except XMLSyntaxError as e:
error = e
file_map, map_file_id, map_file_id_test = downloaderXml.get_downloads(request.session['queue'])
file_map, map_file_id, map_file_id_test, text_error = downloaderXml.get_configurations_summaries_with_error(request.session['queue'])
return render(
request,
'adminview/activateddownload.html',
......
......@@ -26,4 +26,4 @@ DOWNLOADER_TASKS = 'downloader.worker.celery_tasks.'
XSD_DIR = os.path.join(os.path.dirname(__file__), "../static/xsd")
PROTOCOL_OPTIONS = ['FileExtractor', 'Redirector']
PROTOCOL_OPTIONS = {'Https': ['FileExtractor', 'Redirector'], 'Ftp': ['FollowLinks', 'SkipPermissions']}
......@@ -37,6 +37,16 @@ def get_configuration_files(queue):
return []
def read_configuration_files_summary(queue):
result = settings.CELERY.send_task(
DOWNLOADER_TASKS + 'read_configuration_files_summary',
(),
queue=queue
)
result.get(timeout=RABBITMQ_TIMEOUT)
return result.info
def read_configuration_file(queue, filename):
try:
result = settings.CELERY.send_task(
......
......@@ -52,7 +52,7 @@ msgid "repos_remote.help"
msgstr "Base repository data path to crawl"
msgid "protocol_option.help"
msgstr "Additional options for https protocol (FileExtractor, Redirector...)"
msgstr "Additional options for protocol (FileExtractor, FollowLinks...)"
#: ====== tab Date extraction
......
......@@ -125,7 +125,7 @@
<xs:element name="server" minOccurs="0" maxOccurs="1"/>
<xs:element name="login" minOccurs="0" maxOccurs="1"/>
<xs:element name="password" minOccurs="0" maxOccurs="1"/>
<xs:element name="port" type="xs:positiveInteger" minOccurs="0" maxOccurs="1"/>
<xs:element name="port" type="positiveIntegerOrNull" minOccurs="0" maxOccurs="1"/>
</xs:all>
</xs:complexType>
......
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xs:element name="download_config" type="DownloadConfig"/>
<!-- Simple Types -->
<xs:simpleType name='non-empty-string'>
<xs:restriction base='xs:string'>
<xs:minLength value='1'/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="remoteTypeEnum">
<xs:restriction base="xs:string">
<xs:enumeration value='Ftp'/>
<xs:enumeration value='Ftps'/>
<xs:enumeration value='Sftp'/>
<xs:enumeration value='Https'/>
<xs:enumeration value='Https_opensearch'/>
<xs:enumeration value='Webdav'/>
<xs:enumeration value='Localpath'/>
<xs:enumeration value='Localpointer'/>
<xs:enumeration value='Localmove'/>
<xs:enumeration value='Onlynotify'/>
</xs:restriction>
</xs:simpleType>
<!-- Complex Types -->
<xs:complexType name="SourceLocation">
<xs:all>
<xs:element name="protocol" type="remoteTypeEnum" minOccurs="1" maxOccurs="1"/>
<xs:element name="protocol_option" minOccurs="0" maxOccurs="1"/>
<xs:element name="rootpath" type="non-empty-string" minOccurs="1" maxOccurs="1"/>
<xs:element name="server" minOccurs="0" maxOccurs="1"/>
<xs:element name="login" minOccurs="0" maxOccurs="1"/>
<xs:element name="password" minOccurs="0" maxOccurs="1"/>
<xs:element name="port" type="xs:positiveInteger" minOccurs="0" maxOccurs="1"/>
</xs:all>
</xs:complexType>
<xs:complexType name="dataSource">
<xs:all>
<xs:element name="location" type="SourceLocation" minOccurs="1" maxOccurs="1"/>
</xs:all>
</xs:complexType>
<xs:complexType name="dataDestination">
<xs:all>
<xs:element name="location" type="non-empty-string" minOccurs="1" maxOccurs="1"/>
</xs:all>
</xs:complexType>
<xs:complexType name="DownloadConfig">
<xs:all>
<xs:element name='data_source' type="dataSource" minOccurs="1" maxOccurs="1"/>
<xs:element name="data_destination" type="dataDestination" minOccurs="1" maxOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="non-empty-string" use="required"/>
</xs:complexType>
</xs:schema>
......@@ -39,7 +39,8 @@
: An error appear for download file <b><span id="sukerror">-file-</span> </b>'s status.</br>
</div>
{% endfor %} {% endfor %} {% for map in file_map.TEST %} {% for file, values in map.items %}
{% endfor %} {% endfor %}
{% for map in file_map.TEST %} {% for file, values in map.items %}
<div id="alert-500-error{% get_download_id values %}" class="alert alert-warning hide">
<button type="button" class="close" data-dismiss="alert">&times;</button>
......
......@@ -60,16 +60,16 @@
<div class="row-fluid">
<div style="margin-top: 0;">
<div class="span12">
<div class="span10">
<div class="span12">
<h2 style="padding-top: 1%;">Editing "{{ file_name }}" <c style="font-size: 16px;">({{file_data.attrib.id}})</c></h2>
<h2 style="padding-top: 5%;">Editing "{{ file_name }}" ({{file_data.attrib.id}})</h2>
<!-- <div id="wizard" data-role="wizard"> -->
<form id="wizard" class="form-horizontal" action="{% url 'dladmin:save' file_name %}"
method="post" accept-charset="utf-8">
{% csrf_token %}
<!-- Step 1 : Provider ============================================================= -->
<div class="active" data-title=" Source">
<h3 style="text-align: center; margin-bottom: 20px;">Describe here the location of the data to collect</h3>
<div class="control-group">
<label for="type_remote" class="control-label">Protocol</label>
<div id="type_remote_cg" rel="tooltip" data-placement="right"
......@@ -80,39 +80,39 @@
<!-- Ftp -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Ftp" value="Ftp"
{% if file_data.data_source.location.protocol == "Ftp" %} checked {% endif %} > ftp</input>
<span class="explain-point">&nbsp;&nbsp;(download from ftp to local storage)</span></br>
<span class="explain-point">&nbsp;&nbsp;(download from ftp to a local storage)</span></br>
<!-- Ftps -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Ftps" value="Ftps"
{% if file_data.data_source.location.protocol == "Ftps" %} checked {% endif %}> ftps </input>
<span class="explain-point">&nbsp;&nbsp;(download from ftps to local storage)</span></br>
<span class="explain-point">&nbsp;&nbsp;(download from ftps to a local storage)</span></br>
<!-- Sftp -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Sftp" value="Sftp"
{% if file_data.data_source.location.protocol == "Sftp" %} checked {% endif %}> sftp</input>
<span class="explain-point"> (download from sftp to local storage)</span></br>
<span class="explain-point"> (download from sftp to a local storage)</span></br>
<!-- https -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Https" value="Https"
{% if file_data.data_source.location.protocol == "Https" %} checked {% endif %}> https</input>
<span class="explain-point"> (download from https to local storage)</span></br>
<span class="explain-point"> (download from https to a local storage)</span></br>
<!-- Https_opensearch -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Https_opensearch" value="Https_opensearch"
{% if file_data.data_source.location.protocol == "Https_opensearch" %} checked {% endif %}> opensearch</input>
<span class="explain-point"> (Opensearch and download from https to local storage)</span></br>
<span class="explain-point"> (Opensearch and download from https to a local storage)</span></br>
<!-- Webdav -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Webdav" value="Webdav"
{% if file_data.data_source.location.protocol == "Webdav" %} checked {% endif %}> webdav</input>
<span class="explain-point"> (download from Webdav to local storage)</span></br>
<span class="explain-point"> (download from Webdav to a local storage)</span></br>
<!-- Localpath -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Localpath" value="Localpath"
{% if file_data.data_source.location.protocol == "Localpath" %} checked {% endif %}> local copy</input>
<span class="explain-point">&nbsp;&nbsp;(copy from local path into local storage)</span></br>
<span class="explain-point">&nbsp;&nbsp;(copy from local path into a local storage)</span></br>
<!-- Localmove-->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Localmove" value="Localmove"
{% if file_data.data_source.location.protocol == "Localmove" %} checked {% endif %}> local move</input>
<span class="explain-point">&nbsp;&nbsp;(move from local path into local storage)</span></br>
<span class="explain-point">&nbsp;&nbsp;(move from local path into a local storage)</span></br>
<!-- Localpointer -->
<input onchange="checkUrlData();" type="radio" name="type_remote" id="Localpointer" value="Localpointer"
{% if file_data.data_source.location.protocol == "Localpointer" %} checked {% endif %}> local symlink</input>
<span class="explain-point">&nbsp;&nbsp;(create symbolic link to local path into local storage)</span>
<span class="explain-point">&nbsp;&nbsp;(create symbolic link to local path into a local storage)</span>
<!-- OnlyNotify
<input onchange="checkUrlData();" type="radio" name="type_remote" id="OnlyNotify"
value="OnlyNotify"> notify only</input><span class="explain-point">&nbsp;&nbsp;(no
......@@ -138,7 +138,7 @@
<!-- port -->
<div class="control-group">
<label for="port_remote" class="control-label">port</label>
<label for="port_remote" class="control-label">Port</label>
<div class="controls">
<input rel="tooltip" data-placement="right"
data-original-title="{% trans 'port_remote.help' %}" onchange="genereUrl();"
......@@ -190,9 +190,39 @@
<a id="urlGenerated" href=""></a>
</div>
</div>
<!--<form action="" class="form-horizontal" enctype="multipart/form-data" method="post">-->
{% csrf_token %}
<div class="control-group" style="white-space: normal;margin-bottom:0px;margin-top:0px;">
<label for="protocol_options" class="control-label" style="white-space: normal;">Ftp protocol options</label>
<div class="controls">
<div class="input-prepend input-xxlarge" style="white-space: normal;margin-bottom:0px;margin-top:0px;">
<span class="add-on" style="width: 120px;border-radius: 3px 0 0 0;"><b>Option</b></span>
<input rel="tooltip" data-placement="left"
data-original-title="{% trans 'protocol_option.help' %}"
class="input-xxlarge" style="width: 410px;font-weight: bold;border-radius: 0 3px 0 0;"
type="text" id="protocol_option" name="protocol_option"
value="Value" disabled="disabled" />
</div>
</div>
</div>
{% for opt in protocol_options.Ftp %}
<div class="control-group" style="white-space: normal;margin-bottom:0px;margin-top:0px">
<div class="controls">
<div class="input-prepend input-xxlarge" style="white-space: normal;;margin-bottom:0px;margin-top:0px">
<span class="add-on" style="width: 120px;border-radius: 0 0 0 0;border-top-width: 0;"> {{ opt }}</span>
<input rel="tooltip" data-placement="left"
data-original-title="{% trans 'protocol_option.help' %}"
class="input-xxlarge" style="width: 410px;border-radius: 0 0 0 0;border-top-width: 0;"
type="text" id="protocol_option_{{ opt }}" name="protocol_option_{{ opt }}"
value="{% get_protocol_option file_data.data_source.location.protocol_option opt %}" />
</div>
</div>
</div>
{% endfor %}
</div>
<div id="protocoloptionscontrol">
<div id="protocoloptionshttps">
<!--<form action="" class="form-horizontal" enctype="multipart/form-data" method="post">-->
{% csrf_token %}
<div class="control-group" style="white-space: normal;margin-bottom:0px;margin-top:0px;">
......@@ -208,7 +238,7 @@
</div>
</div>
</div>
{% for opt in protocol_options %}
{% for opt in protocol_options.Https %}
<div class="control-group" style="white-space: normal;margin-bottom:0px;margin-top:0px">
<div class="controls">
<div class="input-prepend input-xxlarge" style="white-space: normal;;margin-bottom:0px;margin-top:0px">
......@@ -227,13 +257,15 @@
</div>
<!-- Step 2 : Data================================================================== -->
<div data-title=" Date extraction">
<h3>File metadata extraction</h3>
<div data-title=" Sensing time extraction">
<h3 style="text-align: center; margin-bottom: 20px;">
Describe here how to extract the start sensing time of your observation data. <br>
It is used to select these data based on time criteria and/or to store them with <br>respect to their sensing time.<br></h3>
<div class="control-group">
<label for="data_reader" class="control-label">Metadata extraction method</label>
<label for="data_reader" class="control-label">Sensing time extraction method</label>
<div id="data_reader_cg" rel="tooltip" data-placement="right"
data-original-title="{% trans 'data_reader.help' %}" class="controls well span5"
data-original-title="{% trans 'data_reader.help' %}" class="controls well span6"
style="margin-left: 20px;">
<!-- RegexpDataReader, DirRegexpDataReader, or NetCDFDataReader -->
<!-- if RegexpDataReader? -->
......@@ -241,15 +273,15 @@
<input type="radio" name="data_reader" id="RegexpDataReader"
onchange="checkRegexpDataReader();" value="RegexpDataReader"
{% if file_data.data_source.date_extraction.attrib.plugin == "RegexpDataReader" %} checked {% endif %}>
Regexp applied on filename </input></br>
Regexp applied to the filenames </input></br>
<input type="radio" name="data_reader" id="DirRegexpDataReader"
onchange="checkRegexpDataReader();" value="DirRegexpDataReader"
{% if file_data.data_source.date_extraction.attrib.plugin == "DirRegexpDataReader" %} checked {% endif %}>
Regexp applied on last directory name </input></br>
Regexp applied to the file's parent directories </input></br>
<input type="radio" name="data_reader" id="NetCDFDataReader"
onchange="checkRegexpDataReader();" value="NetCDFDataReader"
{% if file_data.data_source.date_extraction.attrib.plugin == "NetCDFDataReader" %} checked {% endif %}>
NetCDF global attribut </input></br>
Extract from a NetCDF global attribute</input></br>
</div>
</div>
</div>
......@@ -259,11 +291,11 @@
<div class="control-group">
<label for="metadata" class="control-label">Regexp parameters</label>
<div class="well span6" style="width: 500px;">
<div class="control well span6">
<div id="regexp_date_cg" class="control-group">
<label for="regexp_date" class="control-label mandatory" style="font-weight: bold;">Regexp
date * </label>
<label for="regexp_date" class="control-label mandatory" style="font-weight: bold;">
Regexp to extract date/time string *<br>(ex: .*([0-9]{8}T[0-9]{6}).*)</label>
<div class="controls">
<input rel="tooltip" data-placement="right"
data-original-title="{% trans 'regexp_date.help' %}" onmouseout="regexp();"
......@@ -275,19 +307,21 @@
</div>
<div class="control-group">
<label for="date_format" class="control-label">Date format</label>
<label for="date_format" class="control-label">
Date/Time format <br>(use a python datetime formatting string, ex: %Y-%m-%dT%H:%M:%S)</label>
<div class="controls">
<input rel="tooltip" data-placement="right"
data-original-title="{% trans 'date_format.help' %}" onmouseout="regexp();"
onchange="regexp();" onkeyup="regexp();" type="text" id="date_format"
name="date_format" value="{{ file_data.data_source.date_extraction.format }}" />
<!-- not empty msg err -->
<span id="file_name_cg_err" class="pull-right help-inline hide">Required</span>
<!-- not empty msg err -->
<span id="file_name_cg_err" class="pull-right help-inline hide">Required</span>
</div>
</div>
<div id="file_name_cg" class="control-group">
<label class="control-label">Test metadata extraction using filename or directory name</label>
<label class="control-label">
Test the sensing time extraction by entering a file or directory name</label>
<div class="controls">
<input onmouseout="regexp();" onchange="regexp();" onkeyup="regexp();"
class="input-xlarge" type="text" id="regexp_file" />
......@@ -305,12 +339,13 @@
<div id="dataNetCDFDataReader" style="margin-bottom: 40%;">
<div class="control-group">
<label for="metadata" class="control-label">NetCDF arameters</label>
<label for="metadata" class="control-label">NetCDF parameters</label>
<div class="well span6" style="width: 500px;">
<div id="netcdf_date_cg" class="control-group">
<label for="regexp_date2" class="control-label mandatory" style="font-weight: bold;">Global attribut name * </label>
<label for="regexp_date2" class="control-label mandatory" style="font-weight: bold;">
Name of the global attribute providing the sensing date/time (ex: time_coverage_start) * </label>
<div class="controls">
<input rel="tooltip" data-placement="right"
data-original-title="{% trans 'regexp_date2.help' %}" onmouseout="netcdf();"
......@@ -320,8 +355,8 @@
</div>
<div class="control-group">
<label for="date_format2" class="control-label mandatory" style="font-weight: bold;">Date
format * </label>
<label for="date_format2" class="control-label mandatory" style="font-weight: bold;">
Date/Time format (use a python datetime formatting string, ex: %Y-%m-%dT%H:%M:%S) * </label>
<div class="controls">
<input rel="tooltip" data-placement="right"
data-original-title="{% trans 'date_format2.help' %}" onmouseout="netcdf();"
......@@ -334,7 +369,8 @@
</div>
<div id="file_name_cg" class="control-group">
<label class="control-label">Test metadata extraction by selecting NetCDF file path</label>
<label class="control-label">
Test the sensing time extraction by entering a NetCDF local filepath</label>
<div class="controls">
<input onmouseout="netcdf();" onchange="netcdf();" onkeyup="netcdf();"
class="input-xlarge" type="text" id="netcdf_file" />
......@@ -508,7 +544,7 @@
</div>
<h3>browse advanced directories</h3>
<h3>Advanced directory browsing</h3>
<div id="directories_pattern_cg" class="control-group">
<label for="directories_pattern" class="control-label">Directories pattern</label>
<div class="controls">
......@@ -817,7 +853,7 @@
</div>
<!-- Step 6 : Advanced ============================================================ -->