Skip to content

Commit

Permalink
organisations: implement multilingual description
Browse files Browse the repository at this point in the history
* Updates organisation model to implement multilingual description.
* Updates home template to use multilingual description.
* Closes #639.
  • Loading branch information
Garfield-fr committed Oct 15, 2021
1 parent f0ab504 commit 9f9feb9
Show file tree
Hide file tree
Showing 11 changed files with 186 additions and 15 deletions.
38 changes: 36 additions & 2 deletions data/organisations/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,24 @@
{
"code": "hepvs",
"name": "HEP Valais",
"description": "Description in **markdown**",
"description": [
{
"language": "de",
"value": "Description in German in **markdown** format"
},
{
"language": "en",
"value": "Description in English in **markdown** format"
},
{
"language": "fr",
"value": "Description in French in **markdown** format"
},
{
"language": "it",
"value": "Description in Italian in **markdown** format"
}
],
"isShared": true,
"isDedicated": true,
"platformName": "FREDI",
Expand All @@ -40,7 +57,24 @@
{
"code": "unifr",
"name": "Université de Fribourg",
"description": "#### Français\nFOLIA est le serveur de dépôt institutionnel de l'Université de Fribourg (Suisse). Il fournit un accès libre aux publications des chercheurs et chercheuses de l'Université. FOLIA est géré par la Bibliothèque cantonale et universitaire de Fribourg.\n#### Deutsch\nFOLIA ist das institutionelle Repositorium der Universität Freiburg (Schweiz). Es bietet freien Zugang zu den Publikationen der Forschenden der Universität. FOLIA wird von der Kantons- und Universitätsbibliothek Freiburg betreut.\n#### English\nFOLIA is the institutional repository of the University of Fribourg (Switzerland). It provides free access to the publications of the researchers of the University. FOLIA is managed by the Bibliothèque cantonale et universitaire de Fribourg.\n#### Italiano\nFOLIA è l'archivio istituzionale dell'Università di Friburgo (Svizzera). Fornisce un accesso gratuito alle pubblicazioni dei ricercatrici e ricercatori dell'Università. FOLIA è gestito dalla Bibliothèque cantonale et universitaire de Fribourg.",
"description": [
{
"language": "de",
"value": "FOLIA ist das institutionelle Repositorium der Universität Freiburg (Schweiz). Es bietet freien Zugang zu den Publikationen der Forschenden der Universität. FOLIA wird von der Kantons- und Universitätsbibliothek Freiburg betreut."
},
{
"language": "en",
"value": "FOLIA is the institutional repository of the University of Fribourg (Switzerland). It provides free access to the publications of the researchers of the University. FOLIA is managed by the Bibliothèque cantonale et universitaire de Fribourg."
},
{
"language": "fr",
"value": "FOLIA est le serveur de dépôt institutionnel de l'Université de Fribourg (Suisse). Il fournit un accès libre aux publications des chercheurs et chercheuses de l'Université. FOLIA est géré par la Bibliothèque cantonale et universitaire de Fribourg."
},
{
"language": "it",
"value": "FOLIA è l'archivio istituzionale dell'Università di Friburgo (Svizzera). Fornisce un accesso gratuito alle pubblicazioni dei ricercatrici e ricercatori dell'Università. FOLIA è gestito dalla Bibliothèque cantonale et universitaire de Fribourg."
}
],
"isShared": true,
"isDedicated": true,
"platformName": "# FOLIA\n#### Fribourg Open Library and Archive",
Expand Down
33 changes: 33 additions & 0 deletions sonar/common/jsonschemas/interface_language-v1.0.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"title": "language",
"type": "string",
"enum": [
"de",
"en",
"fr",
"it"
],
"form": {
"templateOptions": {
"sort": true
},
"options": [
{
"label": "lang_ger",
"value": "de"
},
{
"label": "lang_eng",
"value": "en"
},
{
"label": "lang_fre",
"value": "fr"
},
{
"label": "lang_ita",
"value": "it"
}
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,50 @@
"minLength": 1
},
"description": {
"title": "Description",
"description": "HTML markup admitted.",
"type": "string",
"minLength": 1,
"title": "Descriptions",
"type": "array",
"minItems": 1,
"items": {
"title": "Description",
"type": "object",
"additionalProperties": false,
"properties": {
"value": {
"title": "Value",
"type": "string",
"minLength": 1,
"form": {
"type": "markdown",
"templateOptions": {
"rows": 5
}
}
},
"language": {
"$ref": "interface_language-v1.0.0.json"
}
},
"propertiesOrder": [
"language",
"value"
],
"required": [
"value",
"language"
]
},
"form": {
"type": "markdown",
"templateOptions": {
"rows": 5
"validation": {
"validators": {
"uniqueValueKeysInObject": {
"keys": [
"language"
]
}
},
"messages": {
"uniqueValueKeysInObjectMessage": "Only one value per language is allowed"
}
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@
"type": "keyword"
},
"description": {
"type": "text"
"type": "object",
"properties": {
"language": {
"type": "keyword"
},
"value": {
"type": "text"
}
}
},
"name": {
"type": "text",
Expand Down
2 changes: 1 addition & 1 deletion sonar/modules/organisations/marshmallow/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class OrganisationMetadataSchemaV1(StrictKeysMixin):
pid = PersistentIdentifier()
code = SanitizedUnicode(required=True)
name = SanitizedUnicode(required=True)
description = SanitizedUnicode()
description = fields.List(fields.Dict())
isShared = fields.Boolean()
isDedicated = fields.Boolean()
allowedIps = SanitizedUnicode()
Expand Down
2 changes: 1 addition & 1 deletion sonar/modules/organisations/serializers/schemas/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class ExportSchemaV1(Schema):

code = fields.String(dump_only=True)
name = fields.String(dump_only=True)
description = fields.String(dump_only=True)
description = fields.List(fields.Dict(dump_only=True))
isShared = fields.Boolean(dump_only=True)
isDedicated = fields.Boolean(dump_only=True)
files = fields.Method('get_files', dump_only=True)
Expand Down
2 changes: 1 addition & 1 deletion sonar/theme/templates/sonar/frontpage.html
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ <h6 class="m-0 mt-1">
{% include config['SONAR_APP_ORGANISATION_CONFIG'][g.organisation.pid]['home_template'] %}
{% else %}
{% if g.organisation.get('description') %}
{{ g.organisation.description | markdown_filter | safe }}
{{ g.organisation.description | description_current_language(current_i18n.locale.language) | markdown_filter | safe }}
{% endif %}
{% endif %}
</div>
Expand Down
19 changes: 18 additions & 1 deletion sonar/theme/templates/sonar/partial/organisation.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
{# -*- coding: utf-8 -*-
Swiss Open Access Repository
Copyright (C) 2021 RERO

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, version 3 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#}

{% if g.get('organisation') and not g.organisation['isDedicated'] %}
<div class="bg-light py-4">
<div class="container">
Expand All @@ -11,7 +28,7 @@
<div class="col-12 col-lg-{{ '10' if thumbnail else '12' }}">
<h1 class="mb-2">{{ g.organisation.name }}</h1>
{% if g.organisation.get('description') %}
<p class="mb-3 text-justify">{{ g.organisation.description | markdown_filter | safe }}</p>
<p class="mb-3 text-justify">{{ g.organisation.description | description_current_language(current_i18n.locale.language) | markdown_filter | safe }}</p>
{% endif %}
<div class="row">
<div class="col-12 col-lg-4">
Expand Down
17 changes: 17 additions & 0 deletions sonar/theme/templates/sonar/partial/switch_aai_dropdown.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
{# -*- coding: utf-8 -*-
Swiss Open Access Repository
Copyright (C) 2021 RERO

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, version 3 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
#}

<div class="dropdown">
<button class="btn btn-outline-primary btn-block dropdown-toggle dropdown-toggle-custom" type="button" id="dropdownMenuButton"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Expand Down
15 changes: 15 additions & 0 deletions sonar/theme/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,3 +289,18 @@ def format_date(date, format='%d/%m/%Y'):
date = date.astimezone(timezone)

return date.strftime(format)


@blueprint.app_template_filter()
def description_current_language(description, language):
"""Extract description for current language.
:param description: Array of description.
:param language: Current language.
:return Description of current language
"""
if description:
result = [d for d in description if d['language'] == language]
if len(result):
return result[0]['value']
return ''
13 changes: 12 additions & 1 deletion tests/ui/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
from invenio_accounts.testutils import login_user_via_session, \
login_user_via_view

from sonar.theme.views import format_date, record_image_url
from sonar.theme.views import description_current_language, format_date, \
record_image_url


def test_error(client):
Expand Down Expand Up @@ -260,3 +261,13 @@ def test_format_date(app):
timezone = pytz.timezone('Europe/Zurich')
date = datetime(1984, 5, 10, 14, 30, tzinfo=timezone)
assert format_date(date, '%d/%m/%Y %H:%M') == '10/05/1984 14:30'


def test_description_current_language():
"""Test extract description by language."""
data = [
{ 'language': 'fr', 'value': 'description en français' },
{ 'language': 'en', 'value': 'description in english' }
]
assert data[0]['value'] == description_current_language(data, 'fr')
assert '' == description_current_language(data, 'de')

0 comments on commit 9f9feb9

Please sign in to comment.