<form id="dataset-edit" method="post" |
<form id="dataset-edit" method="post" |
py:attrs="{'class':'has-errors'} if errors else {}" |
py:attrs="{'class':'has-errors'} if errors else {}" |
xmlns:i18n="http://genshi.edgewall.org/i18n" |
xmlns:i18n="http://genshi.edgewall.org/i18n" |
xmlns:py="http://genshi.edgewall.org/" |
xmlns:py="http://genshi.edgewall.org/" |
xmlns:xi="http://www.w3.org/2001/XInclude"> |
xmlns:xi="http://www.w3.org/2001/XInclude"> |
|
|
|
|
<div class="error-explanation" py:if="error_summary"> |
<div class="error-explanation" py:if="error_summary"> |
<h2>Errors in form</h2> |
<h2>Errors in form</h2> |
<p>The form contains invalid entries:</p> |
<p>The form contains invalid entries:</p> |
<ul> |
<ul> |
<li py:for="key, error in error_summary.items()">${"%s: %s" % (key, error)} |
<li py:for="key, error in error_summary.items()">${"%s: %s" % (key, error)} |
<py:if test="key=='Resources'"> |
<py:if test="key=='Resources'"> |
<ul> |
<ul> |
<py:for each="idx, errordict in enumerate(errors.get('resources', []))"> |
<py:for each="idx, errordict in enumerate(errors.get('resources', []))"> |
<li py:if="errordict"> |
<li py:if="errordict"> |
Resource ${idx}: |
Resource ${idx}: |
<ul> |
<ul> |
<li py:for="thiskey, thiserror in errordict.items()">${thiskey}: <py:for each="errorinfo in thiserror">${errorinfo}; </py:for></li> |
<li py:for="thiskey, thiserror in errordict.items()">${thiskey}: <py:for each="errorinfo in thiserror">${errorinfo}; </py:for></li> |
</ul> |
</ul> |
</li> |
</li> |
</py:for> |
</py:for> |
</ul> |
</ul> |
</py:if> |
</py:if> |
</li> |
</li> |
</ul> |
</ul> |
</div> |
</div> |
|
|
<fieldset id="basic-information"> |
<fieldset id="basic-information"> |
<dl> |
<dl> |
<dt class="title-label"><label class="field_opt" for="title">Title</label></dt> |
<dt class="title-label"><label class="field_opt" for="title">Title</label></dt> |
<dd class="title-field"> |
<dd class="title-field"> |
<input id="title" |
<input id="title" |
class="js-title" |
class="js-title" |
name="title" type="text" |
name="title" type="text" |
value="${data.get('title', '')}" |
value="${data.get('title', '')}" |
placeholder="${_('A short descriptive title for the dataset')}" |
placeholder="${_('A short descriptive title for the dataset')}" |
/> |
/> |
</dd> |
</dd> |
<dd class="title-instructions field_error" py:if="errors.get('title', '')">${errors.get('title', '')}</dd> |
<dd class="title-instructions field_error" py:if="errors.get('title', '')">${errors.get('title', '')}</dd> |
|
|
<dt class="name-label"><label class="field_req" for="name">Url</label></dt> |
<dt class="name-label"><label class="field_req" for="name">Url</label></dt> |
<dd class="name-field"> |
<dd class="name-field"> |
<span class="js-url-text url-text">${url(controller='package', action='index')+'/'}<span class="js-url-viewmode js-url-suffix"> </span><a href="#" style="display: none;" class="url-edit js-url-editlink js-url-viewmode">(edit)</a></span> |
<span class="js-url-text url-text">${url(controller='package', action='index')+'/'}<span class="js-url-viewmode js-url-suffix"> </span><a href="#" style="display: none;" class="url-edit js-url-editlink js-url-viewmode">(edit)</a></span> |
<input style="display: none;" id="name" maxlength="100" name="name" type="text" class="url-input js-url-editmode js-url-input" value="${data.get('name', '')}" /> |
<input style="display: none;" id="name" maxlength="100" name="name" type="text" class="url-input js-url-editmode js-url-input" value="${data.get('name', '')}" /> |
<p class="js-url-is-valid"> </p> |
<p class="js-url-is-valid"> </p> |
</dd> |
</dd> |
<dd style="display: none;" class="js-url-editmode name-instructions basic">2+ characters, lowercase, using only 'a-z0-9' and '-_'</dd> |
<dd style="display: none;" class="js-url-editmode name-instructions basic">2+ characters, lowercase, using only 'a-z0-9' and '-_'</dd> |
<dd class="js-url-editmode name-instructions field_error" py:if="errors.get('name', '')">${errors.get('name', '')}</dd> |
<dd class="js-url-editmode name-instructions field_error" py:if="errors.get('name', '')">${errors.get('name', '')}</dd> |
|
|
<dt class="homepage-label"><label class="field_opt" for="url">Home Page</label></dt> |
<dt class="homepage-label"><label class="field_opt" for="url">Home Page</label></dt> |
<dd class="homepage-field"><input id="url" name="url" type="text" value="${data.get('url', '')}"/></dd> |
<dd class="homepage-field"><input id="url" name="url" type="text" value="${data.get('url', '')}"/></dd> |
<dd class="homepage-instructions instructions basic">The URL for the web page describing the data (not the data itself).</dd> |
<dd class="homepage-instructions instructions basic">The URL for the web page describing the data (not the data itself).</dd> |
<dd class="homepage-instructions hints">e.g. http://www.example.com/growth-figures.html</dd> |
<dd class="homepage-instructions hints">e.g. http://www.example.com/growth-figures.html</dd> |
<dd class="homepage-instructions field_error" py:if="errors.get('url', '')">${errors.get('url', '')}</dd> |
<dd class="homepage-instructions field_error" py:if="errors.get('url', '')">${errors.get('url', '')}</dd> |
|
|
<dt class="license-label"><label class="field_opt" for="license_id">License</label></dt> |
<dt class="license-label"><label class="field_opt" for="license_id">License</label></dt> |
<dd class="license-field"> |
<dd class="license-field"> |
<select id="license_id" name="license_id"> |
<select id="license_id" name="license_id"> |
<py:for each="licence_desc, licence_id in c.licences"> |
<py:for each="licence_desc, licence_id in c.licences"> |
<option value="${licence_id}" py:attrs="{'selected': 'selected' if data.get('license_id', '') == licence_id else None}" >${licence_desc}</option> |
<option value="${licence_id}" py:attrs="{'selected': 'selected' if data.get('license_id', '') == licence_id else None}" >${licence_desc}</option> |
</py:for> |
</py:for> |
</select> |
</select> |
</dd> |
</dd> |
<dd class="license-instructions instructions basic">The licence under which the dataset is released.</dd> |
<dd class="license-instructions instructions basic">The licence under which the dataset is released.</dd> |
|
|
<dt class="description-label"><label class="field_opt" for="notes">Description</label></dt> |
<dt class="description-label"><label class="field_opt" for="notes">Description</label></dt> |
<dd class="description-field"><div class="markdown-editor"> |
<dd class="description-field"><div class="markdown-editor"> |
<ul class="button-row"> |
<ul class="button-row"> |
<li><button class="pretty-button js-markdown-edit depressed">Edit</button></li> |
<li><button class="pretty-button js-markdown-edit depressed">Edit</button></li> |
<li><button class="pretty-button js-markdown-preview">Preview</button></li> |
<li><button class="pretty-button js-markdown-preview">Preview</button></li> |
</ul> |
</ul> |
<textarea class="markdown-input" name="notes" id="notes" placeholder="${_('Start with a summary sentence ...')}">${data.get('notes','')}</textarea> |
<textarea class="markdown-input" name="notes" id="notes" placeholder="${_('Start with a summary sentence ...')}">${data.get('notes','')}</textarea> |
<div class="markdown-preview" style="display: none;"></div> |
<div class="markdown-preview" style="display: none;"></div> |
<span class="hints">You can use <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">Markdown formatting</a> here.</span> |
<span class="hints">You can use <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">Markdown formatting</a> here.</span> |
<!-- |
<!-- |
<dd class="instructions basic">The main description of the dataset</dd> |
<dd class="instructions basic">The main description of the dataset</dd> |
<dd class="instructions further">It is often displayed with the dataset title. In particular, it should start with a short sentence that describes the dataset succinctly, because the first few words alone may be used in some views of the datasets.</dd> |
<dd class="instructions further">It is often displayed with the dataset title. In particular, it should start with a short sentence that describes the dataset succinctly, because the first few words alone may be used in some views of the datasets.</dd> |
--> |
--> |
</div></dd> |
</div></dd> |
</dl> |
</dl> |
</fieldset> |
</fieldset> |
|
|
<fieldset id="resources"> |
<fieldset id="resources"> |
<div class="instructions basic"><h3>Resources: the files and APIs associated with this dataset</h3></div> |
<div class="instructions basic"><h3>Resources: the files and APIs associated with this dataset</h3></div> |
<table class="resource-table-edit"> |
<table class="resource-table-edit"> |
<thead> |
<thead> |
<tr> |
<tr> |
<th class="field_req resource-url">Resource</th> |
<th class="field_req resource-url">Resource</th> |
<th class="resource-delete-link"></th> |
<th class="resource-delete-link"></th> |
</tr> |
</tr> |
</thead> |
</thead> |
<tbody class="js-resource-editor"> |
<tbody class="js-resource-editor"> |
</tbody> |
</tbody> |
</table> |
</table> |
|
|
|
|
<div class="resource-add"> |
<div class="resource-add"> |
<ul class="button-row"> |
<ul class="button-row"> |
<li><h4>Add a resource:</h4></li> |
<li><h4>Add a resource:</h4></li> |
<li><button class="pretty-button js-link-file">Link to a file</button></li> |
<li><button class="pretty-button js-link-file">Link to a file</button></li> |
<li><button class="pretty-button js-link-api">Link to an API</button></li> |
<li><button class="pretty-button js-link-api">Link to an API</button></li> |
<li class="js-upload-file ckan-logged-in" style="display: none;"><button class="pretty-button js-upload-file">Upload a file</button></li> |
<li class="js-upload-file ckan-logged-in" style="display: none;"><button class="pretty-button js-upload-file">Upload a file</button></li> |
</ul> |
</ul> |
</div> |
</div> |
</fieldset> |
</fieldset> |
|
|
<fieldset id="groups"> |
<fieldset id="groups"> |
<h3>Groups</h3> |
<h3>Groups</h3> |
<dl> |
<dl> |
<py:for each="num, group in enumerate(data.get('groups', []))"> |
<py:for each="num, group in enumerate(data.get('groups', []))"> |
<?python |
<?python |
authorized_group = [group_authz for group_authz in c.groups_authz if group_authz['id'] == group['id']] |
authorized_group = [group_authz for group_authz in c.groups_authz if group_authz['id'] == group['id']] |
authorized_group = authorized_group[0] if authorized_group else None |
authorized_group = authorized_group[0] if authorized_group else None |
?> |
?> |
|
|
<dt py:if="'id' in group"> |
<dt py:if="'id' in group"> |
<input type="${'checkbox' if authorized_group else 'hidden'}" name="groups__${num}__id" checked="checked" value="${group['id']}" /> |
<input type="${'checkbox' if authorized_group else 'hidden'}" name="groups__${num}__id" checked="checked" value="${group['id']}" /> |
<input type="hidden" name="groups__${num}__name" value="${group.get('name', authorized_group['name'] if authorized_group else '')}" /> |
<input type="hidden" name="groups__${num}__name" value="${group.get('name', authorized_group['name'] if authorized_group else '')}" /> |
</dt> |
</dt> |
<dd py:if="'id' in group"><label for="groups__${num}__checked">${group.get('name', authorized_group['name'] if authorized_group else '')}</label></dd> |
<dd py:if="'id' in group"><label for="groups__${num}__checked">${group.get('name', authorized_group['name'] if authorized_group else '')}</label></dd> |
</py:for> |
</py:for> |
|
|
<dt>Group</dt> |
<dt>Group</dt> |
<dd py:if="c.groups_available"> |
<dd py:if="c.groups_available"> |
<select id="groups__${len(data.get('groups', []))}__id" name="groups__${len(data.get('groups', []))}__id"> |
<select id="groups__${len(data.get('groups', []))}__id" name="groups__${len(data.get('groups', []))}__id"> |
<option selected="selected" value="">(None)</option> |
<option selected="selected" value="">(None)</option> |
<py:for each="group in c.groups_available"> |
<py:for each="group in c.groups_available"> |
<option value="${group['id']}" >${group['name']}</option> |
<option value="${group['id']}" >${group['name']}</option> |
</py:for> |
</py:for> |
</select> |
</select> |
</dd> |
</dd> |
<dd py:if="not c.groups_available"><em>Cannot add any groups.</em></dd> |
<dd py:if="not c.groups_available"><em>Cannot add any groups.</em></dd> |
</dl> |
</dl> |
<h3>Tags</h3> |
<h3>Tags</h3> |
<dl> |
<dl> |
<dt class="tags-label"><label class="field_opt" for="tags">Tags</label></dt> |
<dt class="tags-label"><label class="field_opt" for="tags">Tags</label></dt> |
<dd class="tags-field"> |
<dd class="tags-field"> |
<input class="long autocomplete-tag" id="tag_string" name="tag_string" size="60" type="text" |
<input class="long autocomplete-tag" id="tag_string" name="tag_string" size="60" type="text" |
value="${data.get('tag_string') or ', '.join([tag['name'] for tag in data.get('tags', []) if not tag.get('vocabulary_id')])}" /> |
value="${data.get('tag_string') or ', '.join([tag['name'] for tag in data.get('tags', []) if not tag.get('vocabulary_id')])}" /> |
</dd> |
</dd> |
<dd class="tags-instructions instructions basic" i18n:msg="">Comma-separated terms that may link this dataset to similar ones. For more information on conventions, see <a href="http://wiki.okfn.org/ckan/doc/faq#TagConventions">this wiki page</a>.</dd> |
<dd class="tags-instructions instructions basic" i18n:msg="">Comma-separated terms that may link this dataset to similar ones. For more information on conventions, see <a href="http://wiki.okfn.org/ckan/doc/faq#TagConventions">this wiki page</a>.</dd> |
<dd class="tags-instructions hints">e.g. pollution, rivers, water quality</dd> |
<dd class="tags-instructions hints">e.g. pollution, rivers, water quality</dd> |
<dd class="tags-instructions field_error" py:if="errors.get('tag_string', '')">${errors.get('tag_string', '')}</dd> |
<dd class="tags-instructions field_error" py:if="errors.get('tag_string', '')">${errors.get('tag_string', '')}</dd> |
</dl> |
</dl> |
<h3>Tags with Vocabulary</h3> |
<h3 py:if="c.vocab_tags">Tags With Example Vocabulary</h3> |
<dl> |
<dl py:if="c.vocab_tags"> |
<dt class="tags-label"><label class="field_opt" for="tags_vocab">Tags</label></dt> |
|
<dd class="tags-field"> |
<!-- <h3>Musical Genre</h3> --> |
<select id="vocab_tags" name="vocab_tags" size="60" multiple="multiple"> |
<!-- <dl> --> |
<py:for each="tag in c.vocab_tags"> |
<!-- <dt class="tags-label"><label class="field_opt" for="tags_vocab">Tags</label></dt> --> |
<py:choose test=""> |
<!-- <dd class="tags-field"> --> |
<option py:when="tag in data.get('vocab_tags_selected', [])" selected="selected" value="${tag}">${tag}</option> |
<!-- <select id="genre_tags" class="chzn-select" name="genre_tags" size="60" multiple="multiple"> --> |
<option py:otherwise="" value="${tag}">${tag}</option> |
<!-- <py:for each="tag in c.genre_tags"> --> |
</py:choose> |
<!-- <py:choose test=""> --> |
</py:for> |
<!-- <option py:when="tag in data.get('genre_tags_selected', [])" selected="selected" value="${tag}">${tag}</option> --> |
</select> |
<!-- <option py:otherwise="" value="${tag}">${tag}</option> --> |
</dd> |
<!-- </py:choose> --> |
<dd class="tags-instructions instructions basic" i18n:msg="">Similar to standard CKAN tags, but these use a fixed vocabulary.</dd> |
<!-- </py:for> --> |
<dd class="tags-instructions field_error" py:if="errors.get('vocab_tag_string', '')">${errors.get('vocab_tag_string', '')}</dd> |
<!-- </select> --> |
</dl> |
<!-- </dd> --> |
|
<!-- <dd class="tags-instructions field_error" py:if="errors.get('genre_tag_string', '')">${errors.get('genre_tag_string', '')}</dd> --> |
|
<!-- </dl> --> |
|
|
|
<!-- <h3>Composer</h3> --> |
|
<!-- <dl> --> |
|
<!-- <dt class="tags-label"><label class="field_opt" for="tags_vocab">Tags</label></dt> --> |
|
<!-- <dd class="tags-field"> --> |
|
<!-- <select id="composer_tags" class="chzn-select" name="composer_tags" size="60" multiple="multiple"> --> |
|
<!-- <py:for each="tag in c.composer_tags"> --> |
|
<!-- <py:choose test=""> --> |
|
<!-- <option py:when="tag in data.get('composer_tags_selected', [])" selected="selected" value="${tag}">${tag}</option> --> |
|
<!-- <option py:otherwise="" value="${tag}">${tag}</option> --> |
|
<!-- </py:choose> --> |
|
<!-- </py:for> --> |
|
<!-- </select> --> |
|
<!-- </dd> --> |
|
<!-- <dd class="tags-instructions field_error" py:if="errors.get('composer_tag_string', '')">${errors.get('composer_tag_string', '')}</dd> --> |
|
<!-- </dl> --> |
|
|
</fieldset> |
</fieldset> |
<fieldset id='further-information'> |
<fieldset id='further-information'> |
<dl> |
<dl> |
<dt><label class="field_opt" for="author">Author</label></dt> |
<dt><label class="field_opt" for="author">Author</label></dt> |
<dd><input id="author" name="author" type="text" value="${data.get('author', '')}" /></dd> |
<dd><input id="author" name="author" type="text" value="${data.get('author', '')}" /></dd> |
<dd class="instructions basic">The name of the main contact, for enquiries about this particular dataset, using the e-mail address in the following field.</dd> |
<dd class="instructions basic">The name of the main contact, for enquiries about this particular dataset, using the e-mail address in the following field.</dd> |
|
|
<dt><label class="field_opt" for="author_email">Author email</label></dt> |
<dt><label class="field_opt" for="author_email">Author email</label></dt> |
<dd><input id="author_email" name="author_email" type="text" value="${data.get('author_email', '')}" /></dd> |
<dd><input id="author_email" name="author_email" type="text" value="${data.get('author_email', '')}" /></dd> |
|
|
<dt><label class="field_opt" for="maintainer">Maintainer</label></dt> |
<dt><label class="field_opt" for="maintainer">Maintainer</label></dt> |
<dd><input id="maintainer" name="maintainer" type="text" value="${data.get('maintainer', '')}" /></dd> |
<dd><input id="maintainer" name="maintainer" type="text" value="${data.get('maintainer', '')}" /></dd> |
<dd class="instructions basic">If there is another important contact person (in addition to the person in the Author field) then provide details here.</dd> |
<dd class="instructions basic">If there is another important contact person (in addition to the person in the Author field) then provide details here.</dd> |
|
|
<dt><label class="field_opt" for="maintainer_email">Maintainer email</label></dt> |
<dt><label class="field_opt" for="maintainer_email">Maintainer email</label></dt> |
<dd><input id="maintainer_email" name="maintainer_email" type="text" value="${data.get('maintainer_email', '')}" /></dd> |
<dd><input id="maintainer_email" name="maintainer_email" type="text" value="${data.get('maintainer_email', '')}" /></dd> |
|
|
<dt><label class="field_opt" for="version">Version</label></dt> |
<dt><label class="field_opt" for="version">Version</label></dt> |
<dd><input id="version" maxlength="100" name="version" type="text" value="${data.get('version', '')}" /></dd> |
<dd><input id="version" maxlength="100" name="version" type="text" value="${data.get('version', '')}" /></dd> |
<dd class="instructions basic">A number representing the version (if applicable)</dd> |
<dd class="instructions basic">A number representing the version (if applicable)</dd> |
<dd class="hints">e.g. 1.2.0</dd> |
<dd class="hints">e.g. 1.2.0</dd> |
|
|
<dt py:if="c.is_sysadmin or c.auth_for_change_state"><label class="field_opt" for="state">State</label></dt> |
<dt py:if="c.is_sysadmin or c.auth_for_change_state"><label class="field_opt" for="state">State</label></dt> |
<dd py:if="c.is_sysadmin or c.auth_for_change_state"> |
<dd py:if="c.is_sysadmin or c.auth_for_change_state"> |
<select id="state" name="state" > |
<select id="state" name="state" > |
<option py:attrs="{'selected': 'selected' if data.get('state') == 'active' else None}" value="active">active</option> |
<option py:attrs="{'selected': 'selected' if data.get('state') == 'active' else None}" value="active">active</option> |
<option py:attrs="{'selected': 'selected' if data.get('state') == 'deleted' else None}" value="deleted">deleted</option> |
<option py:attrs="{'selected': 'selected' if data.get('state') == 'deleted' else None}" value="deleted">deleted</option> |
</select> |
</select> |
</dd> |
</dd> |
|
|
</dl> |
</dl> |
</fieldset> |
</fieldset> |
|
|
<fieldset id='extras'> |
<fieldset id='extras'> |
<dl> |
<dl> |
<dt><label class="field_req" for="published_by">Published by *</label></dt> |
<dt><label class="field_req" for="published_by">Published by *</label></dt> |
<dd> |
<dd> |
<select id="published_by" name="published_by"> |
<select id="published_by" name="published_by"> |
<py:for each="published_name, published_desc in c.publishers"> |
<py:for each="published_name, published_desc in c.publishers"> |
<option value="${published_name}" py:attrs="{'selected': 'selected' if data.get('published_by', '') == published_name else None}" > |
<option value="${published_name}" py:attrs="{'selected': 'selected' if data.get('published_by', '') == published_name else None}" > |
${published_desc} |
${published_desc} |
</option> |
</option> |
</py:for> |
</py:for> |
</select> |
</select> |
</dd> |
</dd> |
<dd class="instructions basic">The organisation credited with or associated with the publication of this data.</dd> |
<dd class="instructions basic">The organisation credited with or associated with the publication of this data.</dd> |
|
|
<py:with vars="extras = data.get('extras', [])"> |
<py:with vars="extras = data.get('extras', [])"> |
<py:for each="num, extra in enumerate(data.get('extras', []))"> |
<py:for each="num, extra in enumerate(data.get('extras', []))"> |
<dt><label for="extras__${num}__value">${extra.get('key')}</label></dt> |
<dt><label for="extras__${num}__value">${extra.get('key')}</label></dt> |
<dd> |
<dd> |
<input id="extras__${num}__key" name="extras__${num}__key" type="hidden" value="${extra.get('key')}" /> |
<input id="extras__${num}__key" name="extras__${num}__key" type="hidden" value="${extra.get('key')}" /> |
<input id="extras__${num}__value" name="extras__${num}__value" type="text" value="${extra.get('value')}" /> |
<input id="extras__${num}__value" name="extras__${num}__value" type="text" value="${extra.get('value')}" /> |
<input type="checkbox" name="extras__${num}__deleted" checked="${extra.get('deleted')}">Delete</input> |
<input type="checkbox" name="extras__${num}__deleted" checked="${extra.get('deleted')}">Delete</input> |
</dd> |
</dd> |
</py:for> |
</py:for> |
|
|
<py:for each="num in range(len(extras), len(extras) + 4)"> |
<py:for eac |