From 1dfef1df9ffdb5f9956cea7b3defb64c41bcc405 Mon Sep 17 00:00:00 2001 From: anonymous <anonymous> Date: Tue, 5 Mar 2019 14:59:32 +0100 Subject: [PATCH] ODPSH-283: change layout --- ckanext/odsh/controller.py | 6 +- .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo | Bin 6022 -> 6116 bytes .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po | 5 + ckanext/odsh/plugin.py | 2 + ckanext/odsh/public/odsh.css | 4 + .../templates/package/resource_edit_base.html | 41 ++++ .../odsh/templates/package/resource_read.html | 195 ++++++++++++++++++ .../package/snippets/resource_form.html | 27 ++- .../package/snippets/resource_info.html | 23 ++- 9 files changed, 280 insertions(+), 23 deletions(-) create mode 100644 ckanext/odsh/templates/package/resource_edit_base.html create mode 100644 ckanext/odsh/templates/package/resource_read.html diff --git a/ckanext/odsh/controller.py b/ckanext/odsh/controller.py index fe5f398a..ef199a6e 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 GIT binary patch delta 1689 zcmZqEf1+Q1Pl#nI0|Ns?5(5K+3<Cp$4l{^{z&30Q3_=VH47O|x4BQM13;}EqbunxV z46F<c43%sQ4D1XH4E0d?b~XkEeg+1H$!rV^Tnr2hi`f_$1Q{3@*0C`#C@?TE9AIN$ zkYr$BcnA@%XZQ_O$jc6~K!P1&unIfGVl8$C1~!lb*cli&85kH`*clik7#JA*pyKK5 z3=9Gc3=Dbf5R2;B85qPE7#Jq9Lmak(9paD;P;+-f^&MnqVBlk@XJ9zN&cGnbz`$^w zoq<7>fq~&II|BnR0|SFF2Lpo&0|SF12Lpo$0|SE_2LppF0|P@e2SmP-1LBi*4v;|% z3=26R4&MOfZ-eSP$^r4%Ee=S?JmX+skYZq9_{PD&z*5h^z#z!Uz`(=6z#zs6F-Vz{ zfkBsnfx(Cq;;;lxh{0u?3=A9$3=B1#kPvBws_%h{&*o%c5NBXuSi%XhXb&d?0}BHK z!x^Z$i%{_goRE<Gz{$W+4>Ir<CnSiNxgZYU<AP|E<$?sE5*Nf`Ehuda6}RDnIK+hu z;zMsP1_n^_3Fm@DMKsi$TrLI%VFm_<A})xB+PEMNox{aY4^9+YxFA7)m5YHvlYxQZ zH<Yi+4M{ZK+zbqI3=9l8P<}TzBoVIRhD6axZb;O;<Ay{D4-W%_JOcxR8V`i;#sf)9 z2~fJ22ND8pJoO9=ObiSR6QBww^Dr<-GcYi$<zZmZV_;x7$-}_l#lXPugNK2^f`Ng- znU{fK0wV)M4KE}O@bW_vqclIn119_s@hE;slx9HbQhtcfoA@D#a|V>ZzMh|fL5+cd z;V3`E#c!Yn@CZOONC`lq#6SQN74`y<)b1_-3Hk^DNYup(Kzx`5<<|-@Feo!HFmwno zFeouFFsu=Pgy4CozIRZ%{;L2aas7b`FbP6ZJEtHdB;*7c7_=D}7_0;#4oMS)7*r|< ziGnGD5QlFRgrtFsf{>`VD+oygzXc(2%_{`)kg5=bZ!H9lf_jEvAxIp>3PIw&TnG|` z3xyzwW<6BnVIc+vBL)VBn?eu^d4wSj*AWIA#9$;02@xA8-&q)vh<$}2Asi$O@mQrW zBqaNUK@O~EV3;Nh3DOl%jXR<AVPS|v&Vm&(Fx(b~r0%!EklgSQs_qw*W)Xongii#L z{Uk&n=4yyQ9BL^7vXFtnUIgOMK#)8r|3`>0FlaC^Fl35A^8F+c1_pCbQ7Hlm>K`JI z#3(KbNn~!KkRZ+xg@j0#D8z?*MHv{h7#J9yh%zuJGB7aki$TmY6oW)zych$6Ap-+L zw-_WU_KGnuxPpq#%VLnk^F$2dv+rUMpMpvgP)Wri4vA}daRvrU1_lNjaRvrw1_p*Q zaY&Ty+APU-kC9U$D784hv?w`s@+bC2UKmFqIlnY-b0NnL4nDuc+*FVvs45M?b^*t{ Ps>F;Ogy812f;U+K5RIS* delta 1605 zcmaE&-=<%GPl#nI0|Ns?0s{ks3<xuWcnB=R#=s!Nz`!8O#=yYMz`$U@22p3j#=yYJ zz`zj6#=yYNz`zg>l}~45VBlw9U?^r|VBlh4U}$DzU=U<rVCZ9GU{GLSU|7J$z#z%M zz;F;EUe9nFs_-q;fFDqUS=b>KbFnipuz?)F&cMLQz`&rw&cGnSz`&pf6?bQ6U=Uzn zVDMvySQO9Bz#zuJz);8zaaadC#32*dAr77m)whtHfq{>qo`GQnI|G9#0|Uc$b_NDj z1_p++><kPl3=9mP*%=r_7#J8NI2agY85kIJIT#pt85kJ6IUqiW<bW7h%mFfpfuWKE zqP~Lz5>j(HAR)1mgMmScfq`Ks2Ll5O0|Ubq4h9Au1_p+kAbs@=3=GdW7#MUJ7#O~C zKpdjX2{G7`lYxPQfq}uE6A}U*oDhrrq2h6z3=HB73=HX<5R2+LAr|yQ)lGqlFXn`V z+-9i0y_}E`ImXGrP|wG}z;F?&@c}0!$euzKzJ=1?pyL0b4q@kl_>hl_fdQ0Uq_`kK zFUJLOfB_c+gD?XFgDDrpL!Mj^hsJY3(m**EB&26>G1N0?GB7agg9^NWD&XU0V31>A zV9@7=Xz=5PB)WWVNYwOjL!x9OHzX>~b2Bi=GcYi`gz`CgAZbS#N}KUOLco)Ufq{vE zfgzX&qA!f6o`FG{fq|ibhk-$lfq|iihk?P1fq`K+4+Db*0|NsaF9X8_Mg|6ZUP#<u z;DaQ-dwdWdeCLCR%ko3wR2xcL@I!p=$`475(NKO7KLdjr0|P?`Kg7Z7>-ixDoQEp7 z%MXd;&-{?6U=o0&ZY}{x8ju!%#GR4=#D}_2zJmY*gEA;_3NSDzF)%RX3qV3}5>($t zD7`}flD76k`SnKyAgT6@03;+H3NSEeGcYjxg&LqK2nl)*L5Pb}1tD?YDhP>!iGq;0 zT`vgn@o^~st{^1HzY0Qv`oACpII1OuARcxW0;iFBhCm^R##A8&1|tRrhH4>*MeBqh zE<Gm%G3bgABn0k3`A>x)iS4}*BuKvqK|CTY3<)^{VMwC15Qc=HmoUVfXega3401?4 z14BMkVXZJEHTMfcvfX5;!Z}cS8I;~249RZ0pa!23hB)*#)SQRH5Qlz-%Ks8(V9;P- zVBi*kWOEY{1_pBm28JXN1_n7${+}fRNqjp+Ac^XQ2qb9vL?I!fBMR|hyeI>M76SuA zn<xW=A_D`%Mp1}?mqj5_#wf<XU<fLx#2_IWF9z{>sTd@!w247HHd74Z(M4hm462}# zX_*)#jt`14Fjz7$Fx(SkU~mSNeBzKei`i_+c8_tgDo4%c4IJAzCaZJEPo5%}zL{6( GIx7How2kfn diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po index a830fe66..1509ae70 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 c4ef9e84..b9eb1174 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 63be49a1..8fada201 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 00000000..2554eaa6 --- /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 00000000..a7ffbc0b --- /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 c32a5ebe..0fa7d66a 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 3c6eb41b..f3635797 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 -- GitLab