diff --git a/ckanext/odsh/controller.py b/ckanext/odsh/controller.py index fe5f398ae8bd4782d3c1efac6e82c1927080d7a7..ef199a6eb6c7eb541d2cec4b7add93b9089bbb26 100644 --- a/ckanext/odsh/controller.py +++ b/ckanext/odsh/controller.py @@ -1,6 +1,7 @@ import ckan.lib.base as base from ckan.controllers.home import HomeController from ckan.controllers.user import UserController +from ckan.controllers.package import PackageController import ckan.lib.helpers as h import ckan.authz as authz from ckan.common import c @@ -47,4 +48,7 @@ class OdshUserController(UserController): def activity(self, id, offset=0): if not authz.is_sysadmin(c.user): abort(404) - return super(OdshUserController,self).activity(id, offset) \ No newline at end of file + return super(OdshUserController,self).activity(id, offset) + +class OdshPackageController(PackageController): + pass \ No newline at end of file diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo index df98f848b8ed36651acda1d0be0cca2610f49b6f..eddb1e77090bdd18b98bd194e8214063a87575fb 100644 Binary files a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo and b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo differ diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po index a830fe668b37f59dd1df844b9d0b968da244f9f5..1509ae707e8da37b969000ccebb1ef8ef57f57e0 100644 --- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po +++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po @@ -318,3 +318,8 @@ msgstr "Veröffentlichungsdatum aufsteigend" msgid "Issued Descending" msgstr "Veröffentlichungsdatum absteigend" +msgid "Name Resource" +msgstr "Name Ressource" + +msgid "Resource count" +msgstr "Anzahl Ressourcen" \ No newline at end of file diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py index c4ef9e846aca0e71cac798ddaebcf01e73627241..b9eb1174b5f04021fcf69b21648265cfeeaee7d2 100644 --- a/ckanext/odsh/plugin.py +++ b/ckanext/odsh/plugin.py @@ -267,6 +267,8 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm map.connect('home', '/', controller='ckanext.odsh.controller:OdshRouteController', action='start') + map.redirect('/dataset/{id}/resource/{resource_id}', '/dataset/{id}') + # redirect all user routes to custom controller with SubMapper(map, controller='ckanext.odsh.controller:OdshUserController') as m: m.connect('/user/edit', action='edit') diff --git a/ckanext/odsh/public/odsh.css b/ckanext/odsh/public/odsh.css index 63be49a19db3a4ccf40c4635e36155b183dbfa1e..8fada201122c22c36fbc690d2b1bb06c0715658c 100644 --- a/ckanext/odsh/public/odsh.css +++ b/ckanext/odsh/public/odsh.css @@ -1550,6 +1550,8 @@ font-weight: 100; .required-text{ font-size: 14px; + margin-top: 20px; + display: block; } .error-reange-search{ @@ -1700,6 +1702,7 @@ a:hover.tooltips_cls span { width:60%; } +.resource-edit-form .row-fluid .span6, .dataset-edit-form .span6 { width:60%; @@ -1714,6 +1717,7 @@ a:hover.tooltips_cls span { { display: inline-block; } + .dataset-edit-form .row-fluid .span3 { display: inline-block; diff --git a/ckanext/odsh/templates/package/resource_edit_base.html b/ckanext/odsh/templates/package/resource_edit_base.html new file mode 100644 index 0000000000000000000000000000000000000000..2554eaa67daeabff843a3eb2ae2efe1bee4e3f60 --- /dev/null +++ b/ckanext/odsh/templates/package/resource_edit_base.html @@ -0,0 +1,41 @@ +{% extends "package/base.html" %} + +{% set logged_in = true if c.userobj else false %} +{% set res = c.resource %} + +{% block breadcrumb_content_selected %}{% endblock %} + +{% block breadcrumb_content %} + {{ super() }} + {% if res %} + <li>{% link_for h.resource_display_name(res)|truncate(30), controller='package', action='resource_read', id=pkg.name, resource_id=res.id %}</li> + <li{% block breadcrumb_edit_selected %} class="active"{% endblock %}><a href="">{{ _('Edit') }}</a></li> + {% endif %} +{% endblock %} + +{% block content_action %} +{% endblock %} + +{% block content_primary_nav %} +{% endblock %} + +{% block primary_content_inner %} +<div class="odsh-dataset-heading"> + <span>Ressource {%if(res.name)%}"{{res.name}}"{%endif%} bearbeiten</span> + {% if res %} + {% link_for _('back'), controller='package', action='resource_read', id=pkg.name, resource_id=res.id, class_='btn pull-right', icon='arrow-left' %} + {% endif %} +<span class="clear"></span> +</div> + <h1 class="hide-heading">{% block form_title %}{{ _('Edit resource') }}{% endblock %}</h1> + {% block form %}{% endblock %} +{% endblock %} + +{% block secondary_content %} + {% snippet 'package/snippets/resource_info.html', res=res,pkg=pkg %} +{% endblock %} + +{% block scripts %} + {{ super() }} + {% resource 'vendor/fileupload' %} +{% endblock %} diff --git a/ckanext/odsh/templates/package/resource_read.html b/ckanext/odsh/templates/package/resource_read.html new file mode 100644 index 0000000000000000000000000000000000000000..a7ffbc0b3b8795e22939f9b78c1ad9b58c84f88d --- /dev/null +++ b/ckanext/odsh/templates/package/resource_read.html @@ -0,0 +1,195 @@ +{% extends "package/base.html" %} + +{% set res = c.resource %} + +{% block head_extras -%} + {{ super() }} + {% set description = h.markdown_extract(h.get_translated(res, 'description'), extract_length=200) if res.description else h.markdown_extract(h.get_translated(c.package, 'notes'), extract_length=200) %} + <meta property="og:title" content="{{ h.dataset_display_name(c.package) }} - {{ h.resource_display_name(res) }} - {{ g.site_title }}"> + <meta property="og:description" content="{{ description|forceescape }}"> +{% endblock -%} + +{% block subtitle %}{{ h.dataset_display_name(c.package) }} - {{ h.resource_display_name(res) }}{% endblock %} + +{% block breadcrumb_content_selected %}{% endblock %} + +{% block breadcrumb_content %} + {{ super() }} + <li class="active"><a href="">{{ h.resource_display_name(res)|truncate(30) }}</a></li> +{% endblock %} + +{% block pre_primary %} + {% block resource %} + <section class="module module-resource"> + {% block resource_inner %} + <div class="module-content"> + <div class="actions"> + {% block resource_actions %} + <ul> + {% block resource_actions_inner %} + {% if h.check_access('package_update', {'id':pkg.id }) %} + <li>{% link_for _('Manage'), controller='package', action='resource_edit', id=pkg.name, resource_id=res.id, class_='btn', icon='wrench' %}</li> + {% endif %} + {% if res.url and h.is_url(res.url) %} + <li> + <a class="btn btn-primary resource-url-analytics resource-type-{{ res.resource_type }}" href="{{ res.url }}"> + {% if res.resource_type in ('listing', 'service') %} + <i class="fa fa-eye"></i> {{ _('View') }} + {% elif res.resource_type == 'api' %} + <i class="fa fa-key"></i> {{ _('API Endpoint') }} + {% elif (not res.has_views or not res.can_be_previewed) and not res.url_type == 'upload' %} + <i class="fa fa-external-link"></i> {{ _('Go to resource') }} + {% else %} + <i class="fa fa-arrow-circle-o-down"></i> {{ _('Download') }} + {% endif %} + </a> + </li> + {% endif %} + {% endblock %} + </ul> + {% endblock %} + </div> + {% block resource_content %} + {% block resource_read_title %}<h1 class="page-heading">{{ h.resource_display_name(res) | truncate(50) }}</h1>{% endblock %} + {% block resource_read_url %} + {% if res.url and h.is_url(res.url) %} + <p class="muted ellipsis">{{ _('URL:') }} <a class="resource-url-analytics" href="{{ res.url }}" title="{{ res.url }}">{{ res.url }}</a></p> + {% elif res.url %} + <p class="muted break-word">{{ _('URL:') }} {{ res.url }}</p> + {% endif %} + {% endblock %} + <div class="prose notes" property="rdfs:label"> + {% if res.description %} + {{ h.render_markdown(res.description) }} + {% endif %} + {% if not res.description and c.package.notes %} + <h3>{{ _('From the dataset abstract') }}</h3> + <blockquote>{{ h.markdown_extract(h.get_translated(c.package, 'notes')) }}</blockquote> + <p>{% trans dataset=c.package.title, url=h.url_for(controller='package', action='read', id=c.package['name']) %}Source: <a href="{{ url }}">{{ dataset }}</a>{% endtrans %} + {% endif %} + </div> + {% endblock %} + </div> + {% block data_preview %} + {% block resource_view %} + {% block resource_view_nav %} + {% set resource_preview = h.resource_preview(c.resource, c.package) %} + {% snippet "package/snippets/resource_views_list.html", + views=resource_views, + pkg=pkg, + is_edit=false, + view_id=current_resource_view['id'], + resource_preview=resource_preview, + resource=c.resource, + extra_class="nav-tabs-plain" + %} + {% endblock %} + <div class="module-content"> + {% block resource_view_content %} + <div class="resource-view"> + {% set resource_preview = h.resource_preview(c.resource, c.package) %} + {% set views_created = res.has_views or resource_preview %} + {% if views_created %} + {% if resource_preview and not current_resource_view %} + {{ h.resource_preview(c.resource, c.package) }} + {% else %} + {% for resource_view in resource_views %} + {% if resource_view == current_resource_view %} + {% snippet 'package/snippets/resource_view.html', + resource_view=resource_view, + resource=c.resource, + package=c.package + %} + {% endif %} + {% endfor %} + {% endif %} + {% else %} + {# Views not created #} + <div class="module-content data-viewer-info"> + <p>{{ _("There are no views created for this resource yet.") }}</p> + {% if h.check_access('resource_view_create', {'resource_id': c.resource.id}) %} + <p class="muted"> + <i class="fa fa-info-circle"></i> + {{ _("Not seeing the views you were expecting?")}} + <a href="javascript:void(0);" data-toggle="collapse" data-target="#data-view-info"> + {{ _('Click here for more information.') }}</a> + </p> + <div id="data-view-info" class="collapse"> + <p>{{ _('Here are some reasons you may not be seeing expected views:') }}</p> + <ul> + <li>{{ _("No view has been created that is suitable for this resource")}}</li> + <li>{{ _("The site administrators may not have enabled the relevant view plugins")}}</li> + <li>{{ _("If a view requires the DataStore, the DataStore plugin may not be enabled, or the data may not have been pushed to the DataStore, or the DataStore hasn't finished processing the data yet")}}</li> + </ul> + </div> + {% endif %} + </div> + {% endif %} + </div> + {% endblock %} + </div> + {% endblock %} + {% endblock %} + {% endblock %} + </section> + {% endblock %} +{% endblock %} + +{% block primary_content %} + {% block resource_additional_information %} + {% if res %} + <section class="module"> + {% block resource_additional_information_inner %} + <div class="module-content"> + <h2>{{ _('Additional Information') }}</h2> + <table class="table table-striped table-bordered table-condensed" data-module="table-toggle-more"> + <thead> + <tr> + <th scope="col">{{ _('Field') }}</th> + <th scope="col">{{ _('Value') }}</th> + </tr> + </thead> + <tbody> + <tr> + <th scope="row">{{ _('Data last updated') }}</th> + <td>{{ h.render_datetime(res.last_modified) or h.render_datetime(res.created) or _('unknown') }}</td> + </tr> + <tr> + <th scope="row">{{ _('Metadata last updated') }}</th> + <td>{{ h.render_datetime(res.revision_timestamp) or h.render_datetime(res.created) or _('unknown') }}</td> + </tr> + <tr> + <th scope="row">{{ _('Created') }}</th> + <td>{{ h.render_datetime(res.created) or _('unknown') }}</td> + </tr> + <tr> + <th scope="row">{{ _('Format') }}</th> + <td>{{ res.mimetype_inner or res.mimetype or res.format or _('unknown') }}</td> + </tr> + <tr> + <th scope="row">{{ _('License') }}</th> + <td>{% snippet "snippets/license.html", pkg_dict=pkg, text_only=True %}</td> + </tr> + {% for key, value in h.format_resource_items(res.items()) %} + <tr class="toggle-more"><th scope="row">{{ key }}</th><td>{{ value }}</td></tr> + {% endfor %} + </tbody> + </table> + </div> + {% endblock %} + </section> + {% endif %} + {% endblock %} +{% endblock %} + +{% block secondary_content %} + + {% block resources_list %} + {% snippet "package/snippets/resources.html", pkg=pkg, active=res.id %} + {% endblock %} + + {% block resource_license %} + {% snippet "snippets/social.html" %} + {% endblock %} +{% endblock %} + diff --git a/ckanext/odsh/templates/package/snippets/resource_form.html b/ckanext/odsh/templates/package/snippets/resource_form.html index c32a5ebed6346d83cdbf54e0f0a3294f1e932a28..0fa7d66a069c1c72d494c32d3e62d140a038bb2f 100644 --- a/ckanext/odsh/templates/package/snippets/resource_form.html +++ b/ckanext/odsh/templates/package/snippets/resource_form.html @@ -3,9 +3,10 @@ {% set data = data or {} %} {% set errors = errors or {} %} +{% set active = data and data.state=='active' %} {% set action = form_action or h.url_for(controller='package', action='new_resource', id=pkg_name) %} -<form id="resource-edit" class="dataset-form dataset-resource-form" method="post" action="{{ action }}" data-module="basic-form resource-form" +<form id="resource-edit" class="dataset-form dataset-resource-form {%if(active)%}resource-edit-form{%endif%}" method="post" action="{{ action }}" data-module="basic-form resource-form" enctype="multipart/form-data" novalidate> {% block stages %} <div class='search-form'> @@ -39,10 +40,6 @@ {% endblock %} {% block basic_fields_description %} - {% set error_string = _('odsh_resource_description_error_label') if errors.description %} - {{ form.markdown('description', id='field-description', label=_('Description'), - placeholder=_('Enter description of the dataset'), value=data.description, error=error_string, - is_required=false) }} {% endblock %} {% endblock basic_fields %} @@ -73,7 +70,7 @@ {% set format_attrs = {'data-module': 'odsh_guessformat', 'data-module-formats':h.odsh_upload_known_formats()} %} {% set error_string = _('odsh_resource_format_error_label') if errors.format %} - {% call form.input('format', id='field-format', label=_('Format'), placeholder=_('eg. CSV, XML or JSON'), value=data.format, error=error_string, is_required=true, classes=['control-medium'],attrs=format_attrs) %} + {% call form.input('format', id='field-format', label=_('Format'), placeholder=_('eg. CSV, XML or JSON'), value=data.format, error=error_string, is_required=true, classes=['control-full'],attrs=format_attrs) %} {% endcall %} {% endblock %} {% endblock %} @@ -82,15 +79,6 @@ <div class="span6"> <div class="form-actions resource-buttons"> - {% block delete_button %} - {% if data.id %} - {% if h.check_access('resource_delete', {'id': data.id}) %} - <a class="btn btn-danger pull-left" href="{% url_for controller='package', action='resource_delete', resource_id=data.id, id=pkg_name %}" - data-module="confirm-action" data-module-content="{{ _('Are you sure you want to delete this resource?') }}">{% - block delete_button_text %}{{ _('Delete') }}{% endblock %}</a> - {% endif %} - {% endif %} - {% endblock %} {% if stage %} {% block previous_button %} <button class="btn btn-arrow-right" name="save" value="go-dataset" type="submit">{{ _('back') }}</button> @@ -101,6 +89,15 @@ {% endif %} </div> <div class="form-actions"> + {% block delete_button %} + {% if data.id %} + {% if h.check_access('resource_delete', {'id': data.id}) %} + <a class="btn btn-danger pull-left" href="{% url_for controller='package', action='resource_delete', resource_id=data.id, id=pkg_name %}" + data-module="confirm-action" data-module-content="{{ _('Are you sure you want to delete this resource?') }}">{% + block delete_button_text %}{{ _('Delete') }}{% endblock %}</a> + {% endif %} + {% endif %} + {% endblock %} {% if stage %} {% block save_button %} <button class="btn btn-primary btn-arrow-right" name="save" value="go-metadata" type="submit">{% block diff --git a/ckanext/odsh/templates/package/snippets/resource_info.html b/ckanext/odsh/templates/package/snippets/resource_info.html index 3c6eb41b34d30604330da309afe8f3da1a11077a..f36357975003a37c901716a755f2c20f528b3b11 100644 --- a/ckanext/odsh/templates/package/snippets/resource_info.html +++ b/ckanext/odsh/templates/package/snippets/resource_info.html @@ -10,12 +10,21 @@ Example: #} <div class="module context-info"> <div class="module-content"> - <h1 class="heading">{{ h.resource_display_name(res) or res.id }}</h1> - <div class="nums"> - <dl> - <dt>{{ _('Format') }}</dt> - <dd>{{ h.get_translated(res, 'format') }}</dd> - </dl> - </div> + <div class="info-detail"> + <div>{{ _('dataset') }}:</div> + {{ h.dataset_display_name(pkg) }} + </div> + <div class="info-detail"> + <div>{{ _('Name Resource') }}:</div> + {{ res.name }} + </div> + <div class="info-detail"> + <div>{{ _('Resource count') }}:</div> + {{ pkg.resources|count}} + </div> + <div class="info-detail"> + <div>{{ _('Format') }}:</div> + <div class="label dataformat-label">{{res.format}}</div> + </div> </div> </div> \ No newline at end of file