From df062da16832f6e81f8e56424c15f3e742c573ca Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Wed, 6 Nov 2024 14:09:01 +0100
Subject: [PATCH 1/7] Fix DCAT_AP_HVD_CATEGORY_LEGISLATION duplicates bug
---
ckanext/schemingdcat/validators.py | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/ckanext/schemingdcat/validators.py b/ckanext/schemingdcat/validators.py
index f6f86d1..a953d6c 100644
--- a/ckanext/schemingdcat/validators.py
+++ b/ckanext/schemingdcat/validators.py
@@ -1152,11 +1152,10 @@ def validator(key, data, errors, context):
hvd_category = data.get(('hvd_category', ))
if hvd_category:
if isinstance(data.get(key), list):
- if not data[key]:
- data[key] = [DCAT_AP_HVD_CATEGORY_LEGISLATION]
- else:
+ if DCAT_AP_HVD_CATEGORY_LEGISLATION not in data[key]:
data[key].append(DCAT_AP_HVD_CATEGORY_LEGISLATION)
else:
- data[key] = [DCAT_AP_HVD_CATEGORY_LEGISLATION]
+ if data.get(key) != DCAT_AP_HVD_CATEGORY_LEGISLATION:
+ data[key] = [DCAT_AP_HVD_CATEGORY_LEGISLATION]
return validator
\ No newline at end of file
From ea8a45a5cfcc3c1a40722bc9b90895ecbb485845 Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Thu, 7 Nov 2024 11:42:40 +0100
Subject: [PATCH 2/7] Correct capitalization of "Land cover" in GeoDCAT-AP
theme (INSPIRE)
---
ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml | 2 +-
ckanext/schemingdcat/schemas/geodcat_ap/eu_geodcat_ap_full.yaml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml b/ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml
index eed5475..e5e86d3 100644
--- a/ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml
+++ b/ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml
@@ -2451,7 +2451,7 @@ dataset_fields:
es: Condiciones atmosféricas (AC)
value: http://inspire.ec.europa.eu/theme/ac
- label:
- en: Land Cover (LC)
+ en: Land cover (LC)
es: Cubierta terrestre (LC)
value: http://inspire.ec.europa.eu/theme/lc
- label:
diff --git a/ckanext/schemingdcat/schemas/geodcat_ap/eu_geodcat_ap_full.yaml b/ckanext/schemingdcat/schemas/geodcat_ap/eu_geodcat_ap_full.yaml
index b60592f..67ab939 100644
--- a/ckanext/schemingdcat/schemas/geodcat_ap/eu_geodcat_ap_full.yaml
+++ b/ckanext/schemingdcat/schemas/geodcat_ap/eu_geodcat_ap_full.yaml
@@ -2147,7 +2147,7 @@ dataset_fields:
es: Condiciones atmosféricas (AC)
value: http://inspire.ec.europa.eu/theme/ac
- label:
- en: Land Cover (LC)
+ en: Land cover (LC)
es: Cubierta terrestre (LC)
value: http://inspire.ec.europa.eu/theme/lc
- label:
From ead4bfc79068d6a63a748bbe6bd8b6a9681f7795 Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Thu, 7 Nov 2024 11:55:49 +0100
Subject: [PATCH 3/7] Fix org label breadcrumb navigation
---
.../schemingdcat/templates/package/base.html | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
create mode 100644 ckanext/schemingdcat/templates/package/base.html
diff --git a/ckanext/schemingdcat/templates/package/base.html b/ckanext/schemingdcat/templates/package/base.html
new file mode 100644
index 0000000..37b8482
--- /dev/null
+++ b/ckanext/schemingdcat/templates/package/base.html
@@ -0,0 +1,20 @@
+{% ckan_extends %}
+
+{% block breadcrumb_content %}
+ {% if pkg %}
+ {% set org = h.get_organization(pkg.organization.id) %}
+ {% set dataset = h.dataset_display_name(pkg) %}
+ {% if org %}
+ {% set organization = h.get_translated(org, 'title') or org.name %}
+ {% set group_type = org.type %}
+
{{ h.scheming_language_text(field.label) }} |
-
+ |
{% if res[field_name] is iterable and res[field_name] is not string %}
{% for item in res[field_name] %}
@@ -101,7 +101,7 @@
{% set field = h.scheming_field_by_name(schema.resource_fields, 'size') %}
{{ h.scheming_language_text(field.label) }} |
-
+ |
{{ h.localised_filesize(res[field_name]) }}
|
@@ -112,7 +112,7 @@
{% set field = h.scheming_field_by_name(schema.resource_fields, 'download_url') %}
{{ h.scheming_language_text(field.label) }} |
-
+ |
{{ h.link_to(res[field_name], res[field_name], target='_blank') }}
|
From 6392811c60f4758634340695562aa9c5004662eb Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Mon, 11 Nov 2024 00:49:46 +0100
Subject: [PATCH 5/7] Add informational message for sysadmin users managing
harvest sources and improve README
---
README.md | 153 +++++++++++++++++-
.../i18n/ckanext-schemingdcat.pot | 4 +
.../en/LC_MESSAGES/ckanext-schemingdcat.mo | Bin 30157 -> 30547 bytes
.../en/LC_MESSAGES/ckanext-schemingdcat.po | 4 +
.../es/LC_MESSAGES/ckanext-schemingdcat.mo | Bin 32233 -> 32636 bytes
.../es/LC_MESSAGES/ckanext-schemingdcat.po | 4 +
.../schemingdcat/templates/source/search.html | 10 ++
7 files changed, 173 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 70f55d7..8569a2e 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,9 @@
This CKAN extension provides functions and templates specifically designed to extend `ckanext-scheming` and `ckanext-dcat` and includes RDF profiles and Harvest enhancements to adapt CKAN Schema to multiple metadata profiles as: [GeoDCAT-AP](./ckanext/schemingdcat/schemas/geodcat_ap/es_geodcat_ap_full.yaml) or [DCAT-AP](./ckanext/schemingdcat/schemas/dcat_ap/eu_dcat_ap_full.yaml).
> [!WARNING]
-> This project requires [mjanez/ckanext-dcat](https://github.com/mjanez/ckanext-dcat) (for newer releases) or [ckan/ckanext-dcat](https://github.com/ckan/ckanext-dcat) (older), along with [ckan/ckanext-scheming](https://github.com/ckan/ckanext-scheming) and [ckan/ckanext-spatial](https://github.com/ckan/ckanext-spatial) to work properly. If you want to use custom schemas with multilingual support, you need to use `ckanext-fluent`. A fixed version is available at [mjanez/ckanext-fluent](https://github.com/mjanez/ckanext-fluent).
+> This project requires [mjanez/ckanext-dcat](https://github.com/mjanez/ckanext-dcat) (for newer releases) or [ckan/ckanext-dcat](https://github.com/ckan/ckanext-dcat) (older), along with [ckan/ckanext-scheming](https://github.com/ckan/ckanext-scheming) and [ckan/ckanext-spatial](https://github.com/ckan/ckanext-spatial) to work properly.
+> * If you want to use custom schemas with multilingual support, you need to use `ckanext-fluent`. A fixed version is available at [mjanez/ckanext-fluent](https://github.com/mjanez/ckanext-fluent).
+> * If you want to use custom harvesters, you need to use `ckanext-harvest`, an improved, more private version is avalaibe at [mjanez/ckanext-harvest](https://github.com/mjanez/ckanext-harvest).
> [!TIP]
> It is **recommended to use with:** [`ckan-docker`](https://github.com/mjanez/ckan-docker) deployment or only use [`ckan-pycsw`](https://github.com/mjanez/ckan-pycsw) to deploy a CSW Catalog.
@@ -124,7 +126,10 @@ To use custom schemas in `ckanext-scheming`:
```
### Harvest
-Add the [custom Harvesters](#harvesters) to the list of plugins as you need:
+**Requirement**:
+- If you want to use custom harvesters, you need to use `ckanext-harvest`, an improved, more private version is avalaibe at [mjanez/ckanext-harvest](https://github.com/mjanez/ckanext-harvest).
+
+Next add the [custom Harvesters](#harvesters) to the list of plugins as you need:
```ini
ckan.plugins = ... spatial_metadata ... dcat ... schemingdcat ... harvest ... schemingdcat_ckan_harvester schemingdcat_csw_harvester ...
@@ -800,6 +805,147 @@ The `ckan schemingdcat` command offers utilites:
ckan schemingdcat download-rdf-eu-vocabs
+### SQL Harvester
+The plugin includes a harvester for local databases using the custom schemas provided by `schemingdcat` and `ckanext-scheming`.
+
+To use it, you need to add the `schemingdcat_postgres_harvester` plugin to your options file:
+
+ ```ini
+ ckan.plugins = harvest schemingdcat schemingdcat_datasets ... schemingdcat_ckan_harvester schemingdcat_postgres_harvester
+ ```
+
+The SQL Harvester supports the following options:
+
+### Schema Generation Guide
+This guide will help you generate a schema that is compatible with our system. The schema is a JSON object that defines the mapping of fields in your database to the fields in our system.
+
+#### Field Mapping Structure
+The `dataset_field_mapping`/`distribution_field_mapping` is structured as follows (multilingual version):
+
+```json
+{
+ ...
+ "field_mapping_schema_version": 1,
+ "/": {
+ "": {
+ "languages": {
+ "": {
+ <"field_value": "/">,/<"field_name": "/">
+ },
+ ...
+ },
+ ...
+ },
+ ...
+ }
+}
+```
+
+* ``: The name of the field in the CKAN schema.
+ * ``: (Optional) The language code for multilingual fields. Must be a valid [ISO 639-1](https://localizely.com/iso-639-1-list/) language code. Now nested under the `languages` key.
+* `/`: (Optional) A fixed value or a list of fixed values to be assigned to the field for all records.
+* **Field Labels**: Field position or field name:
+ * `/`: (Optional) The name of the field in your database. Must be in the format `{schema}.{table}.{field}`.
+
+For fields that are not multilingual, you can use `field_name` directly without the `languages` key. For example:
+
+```json
+{
+ ...
+ "field_mapping_schema_version": 2,
+ "/": {
+ "": {
+ <"field_value": "/">,/<"field_name": "/">
+ },
+ ...
+ }
+}
+```
+
+```json
+{
+ "database_type":"postgres",
+ "credentials":{
+ "user":"u_fototeca",
+ "password":"u_fototeca",
+ "host":"localhost",
+ "port":5432,
+ "db":"fototeca"
+ },
+ "field_mapping_schema_version":1,
+ "dataset_field_mapping":{
+ "alternate_identifier": {
+ "field_name": "fototeca.vista_ckan.cod_vuelo",
+ "is_p_key": true,
+ "index": true,
+ "f_key_references": [
+ "fototeca.vuelos.cod_vuelo"
+ ]
+ },
+ "flight_color": {
+ "field_name": "fototeca.vista_ckan.color",
+ "f_key_references": [
+ "fototeca.l_color.color"
+ ]
+ },
+ },
+ "encoding": {
+ "field_value": "UTF-8"
+ },
+ "title_translated":{
+ "languages": {
+ "es":{
+ "field_name": "fototeca.vuelos.nom_vuelo",
+ }
+ }
+ }
+ },
+ "defaults_groups":[
+
+ ],
+ "defaults_tags":[
+
+ ],
+ "default_group_dicts":[
+
+ ]
+}
+```
+
+* `database_type`: The type of your database. Currently, only `postgres` is supported.
+* `credentials`: The credentials to connect to your database. Must include `username`, `password`, `host`, `port`, and `database name`.
+* `field_mapping_schema_version`: The version of the field mapping schema. Currently, only version `1` is supported.
+* `dataset_field_mapping`: The mapping of fields in your database to the fields in our system. Each field must be in the format `{schema}.{table}.{field}`.
+* Other properties of `ckanext-harvest`/`ckanext-schemingdcat`.
+
+#### Field Types
+There are two types of fields that can be defined in the configuration:
+
+1. **Regular Fields**: These fields have a field label to define the mapping or a fixed value for all their records.
+ - **Properties**: A field can have one of these three properties:
+ - **Fixed Value Fields (`field_value`)**: These fields have a fixed value that is assigned to all records. This is defined using the `field_value` property. If `field_value` is a list, `field_name` could be set at the same time, and the `field_value` extends the list obtained from the remote field.
+ - **Field Labels**: Field name in the database:
+ - **Name-Based Fields (`field_name`)**: These fields are defined by their name in the DB table. This is defined using the `field_name` property. To facilitate data retrieval from the database, especially regarding the identification of primary keys (`p_key`) and foreign keys (`f_key`), the following properties can be added to the `field_mapping` schema:
+ 1. **Primary Key Field (`is_p_key`)** [*Optional*]: This property will identify if the field is a primary key (`p_key`) or not if not indicated. This will facilitate join operations and references between tables.
+ 2. **Table References (`f_key_references`)** [*Optional* (`list`)]: For fields that are foreign keys, this property would specify which schemas, tables, and fields the foreign key refers to. For example, `["public.vuelo.id", "public.camara.id"]`. This is useful for automating joins between tables.
+ 3. **Index (`index`)** [*Optional*]: A boolean property to indicate if the field should be indexed to improve query efficiency. Although not specific to primary or foreign keys, it is relevant for query optimization. By default, its value is `false`.
+
+ The modified schema would allow for more efficient data retrieval and simplify the construction of the DataFrame, especially in complex scenarios with multiple tables and relationships. Here is an example of how the modified schema would look for a field that is a foreign key:
+
+ ```json
+ "dataset_field_mapping": {
+ "alternate_identifier": {
+ "field_name": "fototeca.vista_ckan.cod_vuelo",
+ "is_p_key": true,
+ "index": true,
+ "f_key_references": [
+ "fototeca.vuelos.cod_vuelo"
+ ]
+ }
+ }
+ ```
+
+2. **Multilingual Fields (`languages`)**: These fields have different values for different languages. Each language is represented as a separate object within the field object (`es`, `en`, ...). The language object can have `field_value`, and `field_name` properties, just like a regular field.
## DCAT Profiles
This plugin also contains a custom [`ckanext-dcat` profiles](./ckanext/schemingdcat/profiles) to serialize a CKAN dataset to a:
@@ -832,6 +978,9 @@ To define which profiles to use you can:
Note that in both cases the order in which you define them is important, as it will be the one that the profiles will be run on.
### Multilingual RDF support
+**Requirement**:
+- If you want to use custom schemas with multilingual support, you need to use `ckanext-fluent`. A fixed version is available at [mjanez/ckanext-fluent](https://github.com/mjanez/ckanext-fluent).
+
To add multilingual values from CKAN to RDF, the [`SchemingDCATRDFProfile` method `_object_value](./ckanext/schemingdcat/profiles/base.py)` can be called with optional parameter `multilang=true` (defaults to `false`)).
If `_object_value` is called with the `multilang=true`-parameter, but no language-attribute is found, the value will be added as Literal with the default language (en).
diff --git a/ckanext/schemingdcat/i18n/ckanext-schemingdcat.pot b/ckanext/schemingdcat/i18n/ckanext-schemingdcat.pot
index fa21b10..f90ca3e 100644
--- a/ckanext/schemingdcat/i18n/ckanext-schemingdcat.pot
+++ b/ckanext/schemingdcat/i18n/ckanext-schemingdcat.pot
@@ -852,6 +852,10 @@ msgstr ""
msgid "Last Modified"
msgstr ""
+#: ckanext/harvest/templates/source/search.html:25
+msgid "Only sysadmin users can manage harvest sources. Check the ckanext-harvest documentation for more information."
+msgstr ""
+
#: ckanext/harvest/templates/source/search.html:50
msgid "Search harvest sources..."
msgstr ""
diff --git a/ckanext/schemingdcat/i18n/en/LC_MESSAGES/ckanext-schemingdcat.mo b/ckanext/schemingdcat/i18n/en/LC_MESSAGES/ckanext-schemingdcat.mo
index 95ab594428a1484ad67a0910fcca053940894d4b..25da7a68104d03edc831f888a59c9e4658c4b1ac 100644
GIT binary patch
delta 8260
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
delta 7843
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
n6NxliK26?|SWb9sysadmin users can manage harvest sources. Check the ckanext-harvest documentation for more information."
+msgstr "Only sysadmin users can manage harvest sources. Check the ckanext-harvest documentation for more information."
+
#: ckanext/harvest/templates/source/search.html:50
msgid "Search harvest sources..."
msgstr "Search harvest sources..."
diff --git a/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.mo b/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.mo
index efe16bfe2008134679bebc869b651127ea1ed0d9..67876b23ae5768081756f6884a600fbf21bb51ad 100644
GIT binary patch
delta 7972
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
QO7owc(qr#WlfO^;AC%Do0{{R3
delta 7586
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
diff --git a/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.po b/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.po
index 0cca2bf..a1d9e2d 100644
--- a/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.po
+++ b/ckanext/schemingdcat/i18n/es/LC_MESSAGES/ckanext-schemingdcat.po
@@ -858,6 +858,10 @@ msgstr "Nombre descendente"
msgid "Last Modified"
msgstr "Última modificación"
+#: ckanext/harvest/templates/source/search.html:25
+msgid "Only sysadmin users can manage harvest sources. Check the ckanext-harvest documentation for more information."
+msgstr "Solo los usuarios sysadmin pueden gestionar las fuentes de cosecha. Comprueba la documentación de ckanext-harvest para más información."
+
#: ckanext/harvest/templates/source/search.html:50
msgid "Search harvest sources..."
msgstr "Buscar fuentes de cosecha..."
diff --git a/ckanext/schemingdcat/templates/source/search.html b/ckanext/schemingdcat/templates/source/search.html
index c7230b6..a5d5026 100644
--- a/ckanext/schemingdcat/templates/source/search.html
+++ b/ckanext/schemingdcat/templates/source/search.html
@@ -16,9 +16,19 @@ ckanext-scheming_dcat
- ckanext-dcat
- ckanext-scheming_spatial
+ - ckanext-harvest
+ {% block harvest_info %}
+ {% set quote_content %}
+ {% trans %}
+ Only sysadmin users can manage harvest sources. Check the ckanext-harvest documentation for more information.
+ {% endtrans %}
+ {% endset %}
+ {% snippet "schemingdcat/snippets/quote_alerts.html", alert_type='info', content=quote_content %}
+ {% endblock %}
+
{% block facets %}
From b3c2b0e6d280d7953ca0caf3bd2b9b753fb43de9 Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Mon, 11 Nov 2024 00:49:57 +0100
Subject: [PATCH 6/7] Refactor import statements to simplify access to CKAN
toolkit functions
---
ckanext/schemingdcat/logic/auth/ckan.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/ckanext/schemingdcat/logic/auth/ckan.py b/ckanext/schemingdcat/logic/auth/ckan.py
index 7c1b90c..4a13ffd 100644
--- a/ckanext/schemingdcat/logic/auth/ckan.py
+++ b/ckanext/schemingdcat/logic/auth/ckan.py
@@ -1,7 +1,7 @@
import logging
import typing
-import ckan.plugins.toolkit as toolkit
+import ckan.plugins as p
import ckan.logic as logic
import ckan.logic.auth as auth
@@ -12,7 +12,7 @@
_check_access = logic.check_access
# Credits to logic.auth.ckan: https://github.com/kartoza/ckanext-dalrrd-emc-dcpr
-@toolkit.chained_auth_function
+@p.toolkit.chained_auth_function
def package_update(next_auth, context, data_dict=None):
"""Custom auth for the package_update action.
@@ -24,7 +24,7 @@ def package_update(next_auth, context, data_dict=None):
if user.sysadmin:
final_result = next_auth(context, data_dict)
elif data_dict is not None:
- # NOTE: we do not call toolkit.get_action("package_show") here but rather do it
+ # NOTE: we do not call p.toolkit.get_action("package_show") here but rather do it
# the same as vanilla CKAN which uses a custom way to retrieve the object from
# the context - this is in order to ensure other extensions
# (e.g. ckanext.harvest) are able to function correctly
@@ -40,7 +40,7 @@ def package_update(next_auth, context, data_dict=None):
org_id = data_dict.get("owner_org", package.owner_org)
if org_id is not None:
# Using the schemingdcat_member_list action to obtain correct roles
- members = toolkit.get_action("schemingdcat_member_list")(
+ members = p.toolkit.get_action("schemingdcat_member_list")(
data_dict={"id": org_id, "object_type": "user"}
)
#log.debug('members:%s', members)
@@ -62,7 +62,7 @@ def package_update(next_auth, context, data_dict=None):
return final_result
-@toolkit.chained_auth_function
+@p.toolkit.chained_auth_function
def package_patch(
next_auth: typing.Callable, context: typing.Dict, data_dict: typing.Dict
):
@@ -93,7 +93,7 @@ def authorize_package_publish(
# beforehand, so we deny
owner_org = data_.get("owner_org", data_.get("group_id"))
if owner_org is not None:
- members = toolkit.get_action("member_list")(
+ members = p.toolkit.get_action("member_list")(
data_dict={"id": owner_org, "object_type": "user"}
)
admin_member_ids = [
From a48f23925ab131d0359156fbe13842e506da48a4 Mon Sep 17 00:00:00 2001
From: mjanez <96422458+mjanez@users.noreply.github.com>
Date: Mon, 11 Nov 2024 00:57:33 +0100
Subject: [PATCH 7/7] Add text truncation styles for links, texts, and lists in
metadata/resource info
- Avoid visual bugs.
- Improve responsive.
---
.../schemingdcat/assets/css/schemingdcat.css | 19 +++++++++----------
.../scheming/display_snippets/text.html | 1 +
.../schemingdcat/display_snippets/link.html | 2 +-
.../display_snippets/link_epsg.html | 2 +-
.../display_snippets/link_name.html | 2 +-
.../display_snippets/link_schema.html | 4 ++--
.../display_snippets/list_keywords.html | 2 +-
.../display_snippets/list_links.html | 2 +-
.../list_metadata_profiles.html | 2 +-
.../display_snippets/spatial_uris.html | 2 +-
.../schemingdcat/display_snippets/themes.html | 2 +-
.../display_snippets/themes_es.html | 2 +-
.../package/snippets/document_info.html | 12 ++++++------
.../package/snippets/metadata_info.html | 16 ++++++++--------
14 files changed, 35 insertions(+), 35 deletions(-)
create mode 100644 ckanext/schemingdcat/templates/scheming/display_snippets/text.html
diff --git a/ckanext/schemingdcat/assets/css/schemingdcat.css b/ckanext/schemingdcat/assets/css/schemingdcat.css
index bc44152..23babb4 100644
--- a/ckanext/schemingdcat/assets/css/schemingdcat.css
+++ b/ckanext/schemingdcat/assets/css/schemingdcat.css
@@ -958,17 +958,22 @@ img.spatial_uri-icon {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
+ display: block;
+ max-width: 100%;
+}
+.truncate-link {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: inline-block;
max-width: 100%;
+ vertical-align: middle;
}
/* Links list*/
.link-list {
list-style-type: "🔗 ";
vertical-align: middle;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- max-width: 100%;
}
.link-list li::marker {
@@ -1457,12 +1462,6 @@ img.item_image {
table-layout: fixed; /* Fija el layout de la tabla */
width: 100%; /* Asegura que la tabla ocupe el 100% del contenedor */
}
-/* Apply text truncation to cells in metadata_info */
-.truncate-text {
- overflow: hidden; /* Hides the text overflow */
- text-overflow: ellipsis; /* Adds ellipsis if text is too long */
-}
-
.table tr.toggle-separator {
display: table-row;
}
diff --git a/ckanext/schemingdcat/templates/scheming/display_snippets/text.html b/ckanext/schemingdcat/templates/scheming/display_snippets/text.html
new file mode 100644
index 0000000..7b24c9c
--- /dev/null
+++ b/ckanext/schemingdcat/templates/scheming/display_snippets/text.html
@@ -0,0 +1 @@
+{{ data[field.field_name] }}
\ No newline at end of file
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link.html
index 25827e0..e3d7fcf 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link.html
@@ -1 +1 @@
-{{ h.link_to(data[field.field_name], data[field.field_name], rel=field.display_property, target='_blank') }}
+{{ h.link_to(data[field.field_name], data[field.field_name], rel=field.display_property, target='_blank', class='truncate-link') }}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_epsg.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_epsg.html
index 1bd8d09..2e78709 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_epsg.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_epsg.html
@@ -1,4 +1,4 @@
{% if data[field.field_name] %}
{% set url_name = 'EPSG:' + h.schemingdcat_prettify_url_name(data[field.field_name]) %}
- {{ h.link_to(url_name, data[field.field_name], rel=field.display_property, target='_blank') }}
+ {{ h.link_to(url_name, data[field.field_name], rel=field.display_property, target='_blank', class='truncate-link') }}
{% endif %}
\ No newline at end of file
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_name.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_name.html
index 3359ec1..ba5fab0 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_name.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_name.html
@@ -1,3 +1,3 @@
{% set url_name = h.schemingdcat_prettify_url_name(data[field.field_name]) %}
-{{ h.link_to(url_name, data[field.field_name], rel=field.display_property, target='_blank') }}
+{{ h.link_to(url_name, data[field.field_name], rel=field.display_property, target='_blank', class='truncate-link') }}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_schema.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_schema.html
index 695c7d3..e902a0b 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_schema.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/link_schema.html
@@ -29,13 +29,13 @@
{% else %}
{% for val, label in filtered_choices %}
- {{ label }}
+ {{ label }}
{% endfor %}
{% endif %}
{% endblock %}
\ No newline at end of file
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_keywords.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_keywords.html
index 59abdfb..f7647cf 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_keywords.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_keywords.html
@@ -27,7 +27,7 @@
{% set value = h.scheming_clean_json_value(value.replace(' ', '')) %}
{% set label = h.scheming_clean_json_value(label.replace(' ', '')) %}
- {{ label }}
+ {{ label }}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_links.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_links.html
index 20eec72..55d35fd 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_links.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_links.html
@@ -20,7 +20,7 @@
{% for value in values if value|length %}
{% set value = h.scheming_clean_json_value(value.replace(' ', '')) %}
- {{ value }}
+ {{ value }}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_metadata_profiles.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_metadata_profiles.html
index 0a4d5d2..34dd34f 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_metadata_profiles.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/list_metadata_profiles.html
@@ -20,7 +20,7 @@
{% for value in values if value|length %}
{% set value = h.scheming_clean_json_value(value.replace(' ', '')) %}
- {{ value }}
+ {{ value }}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/spatial_uris.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/spatial_uris.html
index d4af475..ab01c8b 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/spatial_uris.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/spatial_uris.html
@@ -17,7 +17,7 @@
{% if val in spatial_uris_list %}
{% set img_url = h.url_for_static('/images/icons/theme_es/spain.svg') %}
- {{ label }}
+ {{ label }}
{% endif %}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes.html
index 56048c0..8f56b80 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes.html
@@ -17,7 +17,7 @@
{% if val in themes_list %}
{% set img_url = h.url_for_static('/images/icons/inspire/' + val.split('/')[-1].lower() + '.svg') %}
- {{ label }}
+ {{ label }}
{% endif %}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes_es.html b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes_es.html
index e58a970..da95d59 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes_es.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/display_snippets/themes_es.html
@@ -17,7 +17,7 @@
{% if val in themes_list %}
{% set img_url = h.url_for_static('/images/icons/theme_es/' + val.split('/')[-1].lower() + '.png') %}
- {{ label }}
+ {{ label }}
{% endif %}
{% endfor %}
diff --git a/ckanext/schemingdcat/templates/schemingdcat/package/snippets/document_info.html b/ckanext/schemingdcat/templates/schemingdcat/package/snippets/document_info.html
index df4662d..5822904 100644
--- a/ckanext/schemingdcat/templates/schemingdcat/package/snippets/document_info.html
+++ b/ckanext/schemingdcat/templates/schemingdcat/package/snippets/document_info.html
@@ -46,7 +46,7 @@
{{ h.scheming_language_text(field.label) }}
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
|
{{ h.scheming_language_text(field.label) }}
| | |