From b7f8e56d8246662f736c38679d1b2ca293565d43 Mon Sep 17 00:00:00 2001
From: Thorge Petersen <petersen@rz.uni-kiel.de>
Date: Mon, 27 Nov 2023 09:19:41 +0000
Subject: [PATCH] Display contact information on dataset page and use
 text-ellipsis for long description texts

---
 ckanext/odsh/assets/odsh.css                  |  69 +++++-
 ckanext/odsh/assets/odsh.js                   |  42 ++--
 ckanext/odsh/assets/odsh_adjust_ellipsis.js   |  79 ++++++
 ckanext/odsh/assets/webassets.yml             |   1 +
 ckanext/odsh/helpers.py                       |  14 ++
 ckanext/odsh/i18n/ckanext-odsh.pot            | 192 +++++++++------
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo  | Bin 22310 -> 23092 bytes
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po  | 224 +++++++++++-------
 ckanext/odsh/plugin.py                        |   1 +
 ckanext/odsh/templates/header.html            |   2 +-
 ckanext/odsh/templates/package/read.html      |  84 ++++---
 .../package/snippets/contact_details.html     |  80 +++++++
 .../snippets/contact_details_item.html        |  62 +++++
 .../package/snippets/resource_item.html       |  45 ++--
 ckanext/odsh/tests/test_odsh_helpers.py       |  68 ++++--
 15 files changed, 708 insertions(+), 255 deletions(-)
 create mode 100644 ckanext/odsh/assets/odsh_adjust_ellipsis.js
 create mode 100644 ckanext/odsh/templates/package/snippets/contact_details.html
 create mode 100644 ckanext/odsh/templates/package/snippets/contact_details_item.html

diff --git a/ckanext/odsh/assets/odsh.css b/ckanext/odsh/assets/odsh.css
index fc32a357..59b462b7 100644
--- a/ckanext/odsh/assets/odsh.css
+++ b/ckanext/odsh/assets/odsh.css
@@ -4,6 +4,7 @@
   --odsh-color-sh-blue: #003064;
   --odsh-color-sh-blue-light: #e4f2f8;
   --odsh-color-sh-blue-2: #0089ca;
+  --odsh-color-sh-grey-light: #f2f2f2;
   --odsh-color-sh-blue-grey: #657592;
   --odsh-color-sh-blue-dark: #001E49;
 }
@@ -773,7 +774,7 @@ label.rangesearch.disabled {
   }
 
   .is-table-row .row-fluid [class*="span"] {
-    float: none;
+    float: left;
     display: block;
   }
 }
@@ -3026,4 +3027,70 @@ body.filters-modal div.row>aside.secondary.span3 {
 .metadata-links ul {
   list-style: none;
   padding-left: 0px;
+}
+
+section, .section {
+  margin-bottom: 48px;
+}
+
+.sub-section {
+  background-color: #F6F6F6;
+  text-align: left;
+}
+
+.sub-section h5 {
+  border-bottom: 2px solid #FFF;
+  padding: 10px;
+  margin: 0;
+  color: var(--odsh-color-sh-blue);
+}
+
+.details .details-item {
+  margin: 3px 0;
+}
+
+.sub-section .details a {
+  color: #4a4a4a;
+  margin: 0 10px;
+}
+
+
+.sub-section .table {
+  --bs-table-striped-bg: var(--odsh-color-sh-grey-light);
+}
+
+.sub-section table td {
+  border-color: white;
+}
+
+.sub-section .table > :not(:first-child) {
+  border-top: 0;
+}
+
+.ellipsis-action {
+  position: relative;
+  width: 100%;
+}
+
+.ellipsis-action .readless {
+  display: none;
+}
+
+.ellipsis-action > .ellipsis-overlay {
+  height: 35px;
+  background-color: #fff;
+  position: absolute;
+  top: -35px;
+  width: 100%;
+  background: linear-gradient(to bottom,white 0%,rgba(255,255,255,0) 1%,white 100%);
+}
+
+.resource-description .ellipsis-action > .ellipsis-overlay {
+  background-color: var(--odsh-color-sh-grey-light);
+  background: linear-gradient(to bottom,var(--odsh-color-sh-grey-light) 0%,rgba(255,255,255,0) 1%,var(--odsh-color-sh-grey-light) 100%);
+}
+
+li.resource-item:hover .resource-description .ellipsis-action > .ellipsis-overlay {
+  background-color: #EEEEEE;
+  background: linear-gradient(to bottom,#EEEEEE 0%,rgba(255,255,255,0) 1%,#EEEEEE 100%);
 }
\ No newline at end of file
diff --git a/ckanext/odsh/assets/odsh.js b/ckanext/odsh/assets/odsh.js
index 97cd4326..ca7e7493 100644
--- a/ckanext/odsh/assets/odsh.js
+++ b/ckanext/odsh/assets/odsh.js
@@ -1,29 +1,21 @@
-$(document).ready(function ()
-{
-    $('.mylabel').click(function ()
-    {
-        window.location = $(this).siblings('label').children('a').attr('href');
-    });
+$(document).ready(function () {
+  $('.mylabel').click(function () {
+    window.location = $(this).siblings('label').children('a').attr('href');
+  });
 
-    let search = function (score)
-    {
-        return function ()
-        {
-            // $('#label-score-'+score).toggleClass('checked')
-            $('#check-score-' + score).prop("checked", !$('#check-score-' + score).prop("checked"));
-            //  $('#check-score-'+score).val(1)
-            $("#dataset-search-box-form").submit(); //TODO: use default or inject
-        }
-    }
-    for (let i = 1; i <= 5; i++)
-    {
-        $('.search-score-' + i).click(search(i));
-        $('#check-score-' + i).click(function ()
-        {
-            $("#dataset-search-box-form").submit(); //TODO: use default or inject
-        });
+  let search = function (score) {
+    return function () {
+      // $('#label-score-'+score).toggleClass('checked')
+      $('#check-score-' + score).prop("checked", !$('#check-score-' + score).prop("checked"));
+      //  $('#check-score-'+score).val(1)
+      $("#dataset-search-box-form").submit(); //TODO: use default or inject
     }
+  }
+  for (let i = 1; i <= 5; i++) {
+    $('.search-score-' + i).click(search(i));
+    $('#check-score-' + i).click(function () {
+      $("#dataset-search-box-form").submit(); //TODO: use default or inject
+    });
+  }
 
 });
-
-
diff --git a/ckanext/odsh/assets/odsh_adjust_ellipsis.js b/ckanext/odsh/assets/odsh_adjust_ellipsis.js
new file mode 100644
index 00000000..f2d3adca
--- /dev/null
+++ b/ckanext/odsh/assets/odsh_adjust_ellipsis.js
@@ -0,0 +1,79 @@
+$(document).ready(function () {
+
+  function adjustEllipsis() {
+    $('.ellipsis-action').each(function () {
+      var ellipsisAction = $(this);
+      var targetId = ellipsisAction.data('target');
+      var targetContent = $(targetId);
+      var maxContentHeight = ellipsisAction.data('max-height') || 150;
+      var overlay = $('.ellipsis-overlay', ellipsisAction);
+      var readMoreLink = $('.readmore', ellipsisAction);
+      var readLessLink = $('.readless', ellipsisAction);
+  
+      // Reset styles to calculate content height
+      targetContent.css({
+        'max-height': 'none',
+        'overflow-y': 'visible'
+      });
+      
+      var contentHeight = targetContent.height();
+  
+      // Apply ellipsis functionality if necessary
+      if (contentHeight > maxContentHeight) {
+        ellipsisAction.show();
+        if (targetContent.hasClass("full-text")) {
+          toggleEllipsisActions(false);
+        } else {
+          targetContent.css({
+            'max-height': maxContentHeight + 'px',
+            'overflow-y': 'hidden'
+          });
+          toggleEllipsisActions(true);
+          if (overlay) overlay.show();
+        }
+      } else {
+        ellipsisAction.hide();
+      }
+  
+      function toggleEllipsisActions(showReadMore) {
+        readMoreLink.toggle(showReadMore);
+        readLessLink.toggle(!showReadMore);
+      }
+  
+      readMoreLink.off('click').on('click', function (event) {
+        event.preventDefault();
+        targetContent.css({
+          'max-height': 'none',
+          'overflow-y': 'visible'
+        });
+        targetContent.addClass("full-text");
+        if (overlay) overlay.hide();
+        toggleEllipsisActions(false);
+      });
+  
+      readLessLink.off('click').on('click', function (event) {
+        event.preventDefault();
+        targetContent.css({
+          'max-height': maxContentHeight + 'px',
+          'overflow-y': 'hidden'
+        });
+        targetContent.removeClass("full-text");
+        if (overlay) overlay.show();
+        toggleEllipsisActions(true);
+        $('html, body').animate({
+          scrollTop: targetContent.offset().top
+        }, 50);
+      });
+    });
+  }
+  
+  // Call the function on page load
+  adjustEllipsis();
+  
+  // Add an event listener for window resize
+  $(window).on('resize', function () {
+    // Call the adjustEllipsis function when window is resized
+    adjustEllipsis();
+  });  
+
+});
diff --git a/ckanext/odsh/assets/webassets.yml b/ckanext/odsh/assets/webassets.yml
index 37bb956c..3136df98 100644
--- a/ckanext/odsh/assets/webassets.yml
+++ b/ckanext/odsh/assets/webassets.yml
@@ -5,6 +5,7 @@ odsh_base_script:
     - vendor/jquery-ui-autocomplete/jquery-ui.js
     - autocomplete.js
     - odsh.js
+    - odsh_adjust_ellipsis.js
 
 odsh_base_style:
   output: ckanext-odsh/odsh_base.css
diff --git a/ckanext/odsh/helpers.py b/ckanext/odsh/helpers.py
index 968b901f..7ade4ebf 100644
--- a/ckanext/odsh/helpers.py
+++ b/ckanext/odsh/helpers.py
@@ -791,3 +791,17 @@ def format_resource_format(format_str):
         return format_str[:-5]
     else:
         return format_str
+
+
+def extract_email(text):
+    if not isinstance(text, str):
+        return None  # Return None for non-string inputs
+    
+    # Regular expression pattern to match email addresses
+    email_pattern = r'[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}'
+    
+    # Find all email addresses in the input text using the regular expression pattern
+    matches = re.findall(email_pattern, text)
+    
+    # If there are matches, return the first email address found, else return None
+    return matches[0] if matches else None
\ No newline at end of file
diff --git a/ckanext/odsh/i18n/ckanext-odsh.pot b/ckanext/odsh/i18n/ckanext-odsh.pot
index 919c1502..488cb5d1 100644
--- a/ckanext/odsh/i18n/ckanext-odsh.pot
+++ b/ckanext/odsh/i18n/ckanext-odsh.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ckanext-odsh 2.3.0\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2023-08-02 11:41+0200\n"
+"POT-Creation-Date: 2023-11-06 12:35+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 2.10.3\n"
 
-#: ckanext/odsh/plugin.py:234 ckanext/odsh/plugin.py:243 ckanext/odsh/plugin.py:249
+#: ckanext/odsh/plugin.py:232 ckanext/odsh/plugin.py:241 ckanext/odsh/plugin.py:247
 #: ckanext/odsh/templates/header.html:40
 #: ckanext/odsh/templates/organization/index.html:3
 #: ckanext/odsh/templates/organization/index.html:6
@@ -28,23 +28,23 @@ msgstr ""
 msgid "Organizations"
 msgstr ""
 
-#: ckanext/odsh/plugin.py:235 ckanext/odsh/plugin.py:246 ckanext/odsh/plugin.py:252
+#: ckanext/odsh/plugin.py:233 ckanext/odsh/plugin.py:244 ckanext/odsh/plugin.py:250
 msgid "Category"
 msgstr ""
 
-#: ckanext/odsh/plugin.py:236 ckanext/odsh/plugin.py:244 ckanext/odsh/plugin.py:250
+#: ckanext/odsh/plugin.py:234 ckanext/odsh/plugin.py:242 ckanext/odsh/plugin.py:248
 msgid "File format"
 msgstr ""
 
-#: ckanext/odsh/plugin.py:237 ckanext/odsh/plugin.py:245 ckanext/odsh/plugin.py:251
-#: ckanext/odsh/templates/package/resource_read.html:170
+#: ckanext/odsh/plugin.py:235 ckanext/odsh/plugin.py:243 ckanext/odsh/plugin.py:249
+#: ckanext/odsh/templates/package/resource_read.html:162
 #: ckanext/odsh/templates/package/snippets/info.html:75
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:91
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:98
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:111
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:118
 msgid "License"
 msgstr ""
 
-#: ckanext/odsh/plugin.py:239
+#: ckanext/odsh/plugin.py:237
 msgid "Open-Data-Eigenschaften"
 msgstr ""
 
@@ -91,6 +91,7 @@ msgstr ""
 #: ckanext/odsh/assets/odsh_image-upload.js:115
 #: ckanext/odsh/assets/odsh_image-upload.js:186
 #: ckanext/odsh/templates/organization/snippets/organization_form.html:19
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:35
 #: ckanext/odsh/templates/package/snippets/resource_form.html:31
 msgid "URL"
 msgstr ""
@@ -174,6 +175,8 @@ msgstr ""
 #: ckanext/odsh/harvest_templates/source/search.html:60
 #: ckanext/odsh/harvest_templates/source/search.html:62
 #: ckanext/odsh/templates/footer.html:12
+#: ckanext/odsh/templates/package/snippets/contact_details.html:70
+#: ckanext/odsh/templates/package/snippets/contact_details.html:74
 msgid "Contact"
 msgstr ""
 
@@ -230,31 +233,39 @@ msgstr ""
 msgid "Harvester"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:70 ckanext/odsh/templates/header.html:72
+#: ckanext/odsh/templates/header.html:68
+msgid "Sysadmin settings"
+msgstr ""
+
+#: ckanext/odsh/templates/header.html:70
+msgid "Admin"
+msgstr ""
+
+#: ckanext/odsh/templates/header.html:80 ckanext/odsh/templates/header.html:82
 msgid "View profile"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:77 ckanext/odsh/templates/header.html:80
+#: ckanext/odsh/templates/header.html:89 ckanext/odsh/templates/header.html:92
 msgid "Edit profile"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:85 ckanext/odsh/templates/header.html:87
+#: ckanext/odsh/templates/header.html:99 ckanext/odsh/templates/header.html:101
 #: ckanext/odsh/templates/user/logout.html:4
 msgid "Logout"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:95 ckanext/odsh/templates/header.html:96
+#: ckanext/odsh/templates/header.html:110 ckanext/odsh/templates/header.html:111
 #: ckanext/odsh/templates/user/login.html:3
 #: ckanext/odsh/templates/user/login.html:10
 #: ckanext/odsh/templates/user/login.html:16
 msgid "Login"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:101
+#: ckanext/odsh/templates/header.html:116
 msgid "Sign language"
 msgstr ""
 
-#: ckanext/odsh/templates/header.html:104
+#: ckanext/odsh/templates/header.html:119
 msgid "Simple language"
 msgstr ""
 
@@ -335,7 +346,7 @@ msgid "Raumbezug: Fehlender Wert"
 msgstr ""
 
 #: ckanext/odsh/templates/i18n_defaults.html:20
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:219
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:239
 msgid "Tags"
 msgstr ""
 
@@ -407,17 +418,27 @@ msgstr ""
 msgid "Start"
 msgstr ""
 
+#: ckanext/odsh/templates/home/index.html:20
+msgid ""
+"We promote transparency and innovation by publishing Schleswig-Holstein data "
+"in open, free and reusable formats."
+msgstr ""
+
+#: ckanext/odsh/templates/home/index.html:21
+msgid "Discover datasets"
+msgstr ""
+
 #: ckanext/odsh/templates/macros/form.html:410
 msgid "Custom"
 msgstr ""
 
 #: ckanext/odsh/templates/macros/form.html:410
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:60
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:92
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:143
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:189
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:240
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:287
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:80
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:112
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:163
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:209
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:260
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:307
 msgid "This field is required"
 msgstr ""
 
@@ -521,8 +542,8 @@ msgid "My Organization"
 msgstr ""
 
 #: ckanext/odsh/templates/organization/snippets/organization_form.html:21
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:28
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:33
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:48
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:53
 msgid "Description"
 msgstr ""
 
@@ -554,7 +575,6 @@ msgid "Save Organization"
 msgstr ""
 
 #: ckanext/odsh/templates/organization/snippets/organization_item.html:15
-#: ckanext/odsh/templates/snippets/package_item.html:76
 msgid "View {organization_name}"
 msgstr ""
 
@@ -649,7 +669,7 @@ msgid "Draft"
 msgstr ""
 
 #: ckanext/odsh/templates/package/read.html:41
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:270
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:290
 #: ckanext/odsh/templates/snippets/organization.html:24
 #: ckanext/odsh/templates/snippets/package_item.html:83
 msgid "Deleted"
@@ -660,7 +680,7 @@ msgid "Manage Dataset"
 msgstr ""
 
 #: ckanext/odsh/templates/package/read.html:54
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:246
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:266
 #: ckanext/odsh/templates/snippets/package_item.html:70
 msgid "Private"
 msgstr ""
@@ -683,28 +703,38 @@ msgid ""
 "href=\"%(is_replaced_by)s\">newer version</a>."
 msgstr ""
 
-#: ckanext/odsh/templates/package/read.html:103
+#: ckanext/odsh/templates/package/read.html:93
+#: ckanext/odsh/templates/package/snippets/resource_item.html:28
+msgid "Read more »"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:94
+#: ckanext/odsh/templates/package/snippets/resource_item.html:29
+msgid "« Read less"
+msgstr ""
+
+#: ckanext/odsh/templates/package/read.html:110
 msgid "Add new resource"
 msgstr ""
 
-#: ckanext/odsh/templates/package/read.html:113
+#: ckanext/odsh/templates/package/read.html:120
 #, python-format
 msgid ""
 "This record is part of the series <a href=\"%(url)s\">%(title)s</a>. You can "
 "browse to older and newer records."
 msgstr ""
 
-#: ckanext/odsh/templates/package/read.html:121
+#: ckanext/odsh/templates/package/read.html:128
 msgid "latest collection member"
 msgstr ""
 
-#: ckanext/odsh/templates/package/read.html:126
-#: ckanext/odsh/templates/package/read.html:131
+#: ckanext/odsh/templates/package/read.html:133
+#: ckanext/odsh/templates/package/read.html:138
 msgid "predecessor"
 msgstr ""
 
-#: ckanext/odsh/templates/package/read.html:136
-#: ckanext/odsh/templates/package/read.html:141
+#: ckanext/odsh/templates/package/read.html:143
+#: ckanext/odsh/templates/package/read.html:148
 msgid "successor"
 msgstr ""
 
@@ -742,69 +772,69 @@ msgstr ""
 msgid "Source: <a href=\"%(url)s\">%(dataset)s</a>"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:109
+#: ckanext/odsh/templates/package/resource_read.html:101
 msgid "There are no views created for this resource yet."
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:113
+#: ckanext/odsh/templates/package/resource_read.html:105
 msgid "Not seeing the views you were expecting?"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:115
+#: ckanext/odsh/templates/package/resource_read.html:107
 msgid "Click here for more information."
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:118
+#: ckanext/odsh/templates/package/resource_read.html:110
 msgid "Here are some reasons you may not be seeing expected views:"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:120
+#: ckanext/odsh/templates/package/resource_read.html:112
 msgid "No view has been created that is suitable for this resource"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:121
+#: ckanext/odsh/templates/package/resource_read.html:113
 msgid "The site administrators may not have enabled the relevant view plugins"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:122
+#: ckanext/odsh/templates/package/resource_read.html:114
 msgid ""
 "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"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:144
+#: ckanext/odsh/templates/package/resource_read.html:136
 msgid "Additional Information"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:148
+#: ckanext/odsh/templates/package/resource_read.html:140
 msgid "Field"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:149
+#: ckanext/odsh/templates/package/resource_read.html:141
 msgid "Value"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:154
+#: ckanext/odsh/templates/package/resource_read.html:146
 msgid "Data last updated"
 msgstr ""
 
+#: ckanext/odsh/templates/package/resource_read.html:147
+#: ckanext/odsh/templates/package/resource_read.html:151
 #: ckanext/odsh/templates/package/resource_read.html:155
 #: ckanext/odsh/templates/package/resource_read.html:159
-#: ckanext/odsh/templates/package/resource_read.html:163
-#: ckanext/odsh/templates/package/resource_read.html:167
 msgid "unknown"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:158
+#: ckanext/odsh/templates/package/resource_read.html:150
 msgid "Metadata last updated"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:162
+#: ckanext/odsh/templates/package/resource_read.html:154
 msgid "Created"
 msgstr ""
 
-#: ckanext/odsh/templates/package/resource_read.html:166
+#: ckanext/odsh/templates/package/resource_read.html:158
 #: ckanext/odsh/templates/package/snippets/resource_form.html:69
 #: ckanext/odsh/templates/package/snippets/resource_info.html:26
 msgid "Format"
@@ -812,12 +842,12 @@ msgstr ""
 
 #: ckanext/odsh/templates/package/search.html:69
 #: ckanext/odsh/templates/package/snippets/info.html:52
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:143
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:163
 msgid "Period"
 msgstr ""
 
 #: ckanext/odsh/templates/package/search.html:79
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:156
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:176
 #: ckanext/odsh/templates/snippets/search_form.html:115
 msgid "from"
 msgstr ""
@@ -837,7 +867,7 @@ msgid "wrong_start_date_for_search"
 msgstr ""
 
 #: ckanext/odsh/templates/package/search.html:94
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:170
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:190
 #: ckanext/odsh/templates/snippets/search_form.html:142
 msgid "to"
 msgstr ""
@@ -867,6 +897,26 @@ msgstr ""
 msgid "View preview"
 msgstr ""
 
+#: ckanext/odsh/templates/package/snippets/contact_details.html:72
+msgid "Creator"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:73
+msgid "Maintainer"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:75
+msgid "Publisher"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:76
+msgid "Originator"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:77
+msgid "Contributor"
+msgstr ""
+
 #: ckanext/odsh/templates/package/snippets/info.html:28
 #: ckanext/odsh/templates/snippets/package_item.html:99
 msgid "Category:"
@@ -884,12 +934,12 @@ msgid "Modified"
 msgstr ""
 
 #: ckanext/odsh/templates/package/snippets/info.html:89
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:329
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:349
 msgid "Musterdatensatz"
 msgstr ""
 
 #: ckanext/odsh/templates/package/snippets/info.html:99
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:234
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:254
 msgid "Spatial uri"
 msgstr ""
 
@@ -918,54 +968,58 @@ msgid "DCAT-AP.de metadata"
 msgstr ""
 
 #: ckanext/odsh/templates/package/snippets/package_basic_fields.html:10
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:14
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:15
 msgid "Title"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:20
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:21
 msgid "Enter title"
 msgstr ""
 
 #: ckanext/odsh/templates/package/snippets/package_basic_fields.html:37
+msgid "eg. my-dataset"
+msgstr ""
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:57
 msgid "Enter description"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:59
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:79
 msgid "Organization"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:67
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:87
 msgid ""
 "No\n"
 "                        organization"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:118
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:138
 #: ckanext/odsh/templates/user/snippets/login_form.html:23
 msgid "enter name"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:189
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:209
 msgid "Publication date"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:225
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:245
 msgid "odsh tags placeholder"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:239
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:259
 msgid "Visibility"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:246
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:266
 msgid "Public"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:260
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:280
 msgid "State"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:267
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:287
 msgid "Active"
 msgstr ""
 
@@ -1077,15 +1131,15 @@ msgstr ""
 msgid "Resource count"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:20
+#: ckanext/odsh/templates/package/snippets/resource_item.html:33
 msgid "File size"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:24
+#: ckanext/odsh/templates/package/snippets/resource_item.html:37
 msgid "Number of pages"
 msgstr ""
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:29
+#: ckanext/odsh/templates/package/snippets/resource_item.html:43
 msgid "download file"
 msgstr ""
 
diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo
index 19048e0f8754ccf02e9f6e0403cc210429c5b592..ec867b922cc9903c538c9d64fb2508e74012c98c 100644
GIT binary patch
delta 7513
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

delta 6751
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

diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
index 649b4796..147f24d5 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ckanext-odsh 2.0.0\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2023-08-02 11:41+0200\n"
-"PO-Revision-Date: 2023-08-02 11:41+0200\n"
+"POT-Creation-Date: 2023-11-06 12:35+0100\n"
+"PO-Revision-Date: 2023-11-06 12:40+0100\n"
 "Last-Translator: \n"
 "Language-Team: de <LL@li.org>\n"
 "Language: de\n"
@@ -18,10 +18,10 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Generated-By: Babel 2.3.4\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 3.0.1\n"
 
-#: ckanext/odsh/plugin.py:234 ckanext/odsh/plugin.py:243
-#: ckanext/odsh/plugin.py:249 ckanext/odsh/templates/header.html:40
+#: ckanext/odsh/plugin.py:232 ckanext/odsh/plugin.py:241
+#: ckanext/odsh/plugin.py:247 ckanext/odsh/templates/header.html:40
 #: ckanext/odsh/templates/organization/index.html:3
 #: ckanext/odsh/templates/organization/index.html:6
 #: ckanext/odsh/templates/organization/index.html:32
@@ -31,26 +31,26 @@ msgstr ""
 msgid "Organizations"
 msgstr "Herausgeber"
 
-#: ckanext/odsh/plugin.py:235 ckanext/odsh/plugin.py:246
-#: ckanext/odsh/plugin.py:252
+#: ckanext/odsh/plugin.py:233 ckanext/odsh/plugin.py:244
+#: ckanext/odsh/plugin.py:250
 msgid "Category"
 msgstr "Kategorie"
 
-#: ckanext/odsh/plugin.py:236 ckanext/odsh/plugin.py:244
-#: ckanext/odsh/plugin.py:250
+#: ckanext/odsh/plugin.py:234 ckanext/odsh/plugin.py:242
+#: ckanext/odsh/plugin.py:248
 msgid "File format"
 msgstr "Dateiformat"
 
-#: ckanext/odsh/plugin.py:237 ckanext/odsh/plugin.py:245
-#: ckanext/odsh/plugin.py:251
-#: ckanext/odsh/templates/package/resource_read.html:170
+#: ckanext/odsh/plugin.py:235 ckanext/odsh/plugin.py:243
+#: ckanext/odsh/plugin.py:249
+#: ckanext/odsh/templates/package/resource_read.html:162
 #: ckanext/odsh/templates/package/snippets/info.html:75
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:91
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:98
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:111
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:118
 msgid "License"
 msgstr "Lizenz"
 
-#: ckanext/odsh/plugin.py:239
+#: ckanext/odsh/plugin.py:237
 msgid "Open-Data-Eigenschaften"
 msgstr "Open-Data-Eigenschaften"
 
@@ -101,6 +101,7 @@ msgstr "Hochladen einer Datei auf Ihren Computer"
 #: ckanext/odsh/assets/odsh_image-upload.js:115
 #: ckanext/odsh/assets/odsh_image-upload.js:186
 #: ckanext/odsh/templates/organization/snippets/organization_form.html:19
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:35
 #: ckanext/odsh/templates/package/snippets/resource_form.html:31
 msgid "URL"
 msgstr "URL"
@@ -184,6 +185,8 @@ msgstr "Zur Startseite des Open-Data-Portals"
 #: ckanext/odsh/harvest_templates/source/search.html:60
 #: ckanext/odsh/harvest_templates/source/search.html:62
 #: ckanext/odsh/templates/footer.html:12
+#: ckanext/odsh/templates/package/snippets/contact_details.html:70
+#: ckanext/odsh/templates/package/snippets/contact_details.html:74
 msgid "Contact"
 msgstr "Kontakt"
 
@@ -242,31 +245,40 @@ msgstr "Infos"
 msgid "Harvester"
 msgstr "Harvester"
 
-#: ckanext/odsh/templates/header.html:70 ckanext/odsh/templates/header.html:72
+#: ckanext/odsh/templates/header.html:68
+msgid "Sysadmin settings"
+msgstr "Sysadmin Einstellungen"
+
+#: ckanext/odsh/templates/header.html:70
+msgid "Admin"
+msgstr "Admin"
+
+#: ckanext/odsh/templates/header.html:80 ckanext/odsh/templates/header.html:82
 msgid "View profile"
 msgstr "Mein Profil einsehen"
 
-#: ckanext/odsh/templates/header.html:77 ckanext/odsh/templates/header.html:80
+#: ckanext/odsh/templates/header.html:89 ckanext/odsh/templates/header.html:92
 msgid "Edit profile"
 msgstr "Mein Profil bearbeiten"
 
-#: ckanext/odsh/templates/header.html:85 ckanext/odsh/templates/header.html:87
+#: ckanext/odsh/templates/header.html:99 ckanext/odsh/templates/header.html:101
 #: ckanext/odsh/templates/user/logout.html:4
 msgid "Logout"
 msgstr "Logout"
 
-#: ckanext/odsh/templates/header.html:95 ckanext/odsh/templates/header.html:96
+#: ckanext/odsh/templates/header.html:110
+#: ckanext/odsh/templates/header.html:111
 #: ckanext/odsh/templates/user/login.html:3
 #: ckanext/odsh/templates/user/login.html:10
 #: ckanext/odsh/templates/user/login.html:16
 msgid "Login"
 msgstr "Login"
 
-#: ckanext/odsh/templates/header.html:101
+#: ckanext/odsh/templates/header.html:116
 msgid "Sign language"
 msgstr "Gebärdensprache"
 
-#: ckanext/odsh/templates/header.html:104
+#: ckanext/odsh/templates/header.html:119
 msgid "Simple language"
 msgstr "Einfache Sprache"
 
@@ -349,7 +361,7 @@ msgid "Raumbezug: Fehlender Wert"
 msgstr "Bitte geben Sie einen Ort ein"
 
 #: ckanext/odsh/templates/i18n_defaults.html:20
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:219
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:239
 msgid "Tags"
 msgstr "Schlagwörter"
 
@@ -421,17 +433,29 @@ msgstr "Willkommen"
 msgid "Start"
 msgstr "Start"
 
+#: ckanext/odsh/templates/home/index.html:20
+msgid ""
+"We promote transparency and innovation by publishing Schleswig-Holstein data "
+"in open, free and reusable formats."
+msgstr ""
+"Wir fördern Transparenz und Innovation, indem wir Daten aus Schleswig-"
+"Holstein in offenen, freien und wiederverwendbaren Formaten veröffentlichen."
+
+#: ckanext/odsh/templates/home/index.html:21
+msgid "Discover datasets"
+msgstr "weitere Distribution"
+
 #: ckanext/odsh/templates/macros/form.html:410
 msgid "Custom"
 msgstr "Benutzerdefiniert"
 
 #: ckanext/odsh/templates/macros/form.html:410
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:60
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:92
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:143
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:189
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:240
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:287
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:80
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:112
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:163
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:209
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:260
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:307
 msgid "This field is required"
 msgstr "Dieses Feld ist erforderlich"
 
@@ -535,8 +559,8 @@ msgid "My Organization"
 msgstr "Herausgeber"
 
 #: ckanext/odsh/templates/organization/snippets/organization_form.html:21
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:28
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:33
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:48
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:53
 msgid "Description"
 msgstr "Beschreibung"
 
@@ -571,7 +595,6 @@ msgid "Save Organization"
 msgstr "Herausgeber speichern"
 
 #: ckanext/odsh/templates/organization/snippets/organization_item.html:15
-#: ckanext/odsh/templates/snippets/package_item.html:76
 msgid "View {organization_name}"
 msgstr "{organization_name} anzeigen"
 
@@ -672,7 +695,7 @@ msgid "Draft"
 msgstr "Entwurf"
 
 #: ckanext/odsh/templates/package/read.html:41
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:270
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:290
 #: ckanext/odsh/templates/snippets/organization.html:24
 #: ckanext/odsh/templates/snippets/package_item.html:83
 msgid "Deleted"
@@ -683,7 +706,7 @@ msgid "Manage Dataset"
 msgstr "Datensatz bearbeiten"
 
 #: ckanext/odsh/templates/package/read.html:54
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:246
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:266
 #: ckanext/odsh/templates/snippets/package_item.html:70
 msgid "Private"
 msgstr "Privat"
@@ -704,17 +727,27 @@ msgstr ""
 #: ckanext/odsh/templates/package/read.html:81
 #, python-format
 msgid ""
-"Note: This dataset has been replaced with a <a href=\"%(is_replaced_by)s"
-"\">newer version</a>."
+"Note: This dataset has been replaced with a <a "
+"href=\"%(is_replaced_by)s\">newer version</a>."
 msgstr ""
-"Hinweis: Dieser Datensatz wurde durch eine <a href=\"%(is_replaced_by)s"
-"\">neuere Version</a> ersetzt."
+"Hinweis: Dieser Datensatz wurde durch eine <a "
+"href=\"%(is_replaced_by)s\">neuere Version</a> ersetzt."
+
+#: ckanext/odsh/templates/package/read.html:93
+#: ckanext/odsh/templates/package/snippets/resource_item.html:28
+msgid "Read more »"
+msgstr "Mehr erfahren »"
 
-#: ckanext/odsh/templates/package/read.html:103
+#: ckanext/odsh/templates/package/read.html:94
+#: ckanext/odsh/templates/package/snippets/resource_item.html:29
+msgid "« Read less"
+msgstr "« Weniger anzeigen"
+
+#: ckanext/odsh/templates/package/read.html:110
 msgid "Add new resource"
 msgstr "Neue Ressource hinzufügen"
 
-#: ckanext/odsh/templates/package/read.html:113
+#: ckanext/odsh/templates/package/read.html:120
 #, python-format
 msgid ""
 "This record is part of the series <a href=\"%(url)s\">%(title)s</a>. You can "
@@ -723,17 +756,17 @@ msgstr ""
 "Dieser Datensatz ist Bestandteil der Reihe <a href=\"%(url)s\">%(title)s</"
 "a>. Sie können zu älteren und neueren Datensätzen blättern."
 
-#: ckanext/odsh/templates/package/read.html:121
+#: ckanext/odsh/templates/package/read.html:128
 msgid "latest collection member"
 msgstr "Neuester Datensatz"
 
-#: ckanext/odsh/templates/package/read.html:126
-#: ckanext/odsh/templates/package/read.html:131
+#: ckanext/odsh/templates/package/read.html:133
+#: ckanext/odsh/templates/package/read.html:138
 msgid "predecessor"
 msgstr "Vorgänger"
 
-#: ckanext/odsh/templates/package/read.html:136
-#: ckanext/odsh/templates/package/read.html:141
+#: ckanext/odsh/templates/package/read.html:143
+#: ckanext/odsh/templates/package/read.html:148
 msgid "successor"
 msgstr "Nachfolger"
 
@@ -771,35 +804,35 @@ msgstr "Aus der Zusammenfassung des Datensatzes"
 msgid "Source: <a href=\"%(url)s\">%(dataset)s</a>"
 msgstr "Quelle: <a href=\"%(url)s\">%(dataset)s</a>"
 
-#: ckanext/odsh/templates/package/resource_read.html:109
+#: ckanext/odsh/templates/package/resource_read.html:101
 msgid "There are no views created for this resource yet."
 msgstr "Für diese Ressource sind noch keine Ansichten erstellt worden."
 
-#: ckanext/odsh/templates/package/resource_read.html:113
+#: ckanext/odsh/templates/package/resource_read.html:105
 msgid "Not seeing the views you were expecting?"
 msgstr "Sie sehen nicht die Ansichten, die Sie erwartet haben?"
 
-#: ckanext/odsh/templates/package/resource_read.html:115
+#: ckanext/odsh/templates/package/resource_read.html:107
 msgid "Click here for more information."
 msgstr "Klicken Sie hier für weitere Informationen."
 
-#: ckanext/odsh/templates/package/resource_read.html:118
+#: ckanext/odsh/templates/package/resource_read.html:110
 msgid "Here are some reasons you may not be seeing expected views:"
 msgstr ""
 "Hier sind einige Gründe, warum Sie möglicherweise nicht die erwarteten "
 "Ansichten sehen:"
 
-#: ckanext/odsh/templates/package/resource_read.html:120
+#: ckanext/odsh/templates/package/resource_read.html:112
 msgid "No view has been created that is suitable for this resource"
 msgstr "Es wurde keine Ansicht erstellt, die für diese Ressource geeignet ist"
 
-#: ckanext/odsh/templates/package/resource_read.html:121
+#: ckanext/odsh/templates/package/resource_read.html:113
 msgid "The site administrators may not have enabled the relevant view plugins"
 msgstr ""
 "Die Website-Administratoren haben möglicherweise die entsprechenden Ansichts-"
 "Plugins nicht aktiviert"
 
-#: ckanext/odsh/templates/package/resource_read.html:122
+#: ckanext/odsh/templates/package/resource_read.html:114
 msgid ""
 "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 "
@@ -810,38 +843,38 @@ msgstr ""
 "übertragen, oder der DataStore hat die Verarbeitung der Daten noch nicht "
 "abgeschlossen"
 
-#: ckanext/odsh/templates/package/resource_read.html:144
+#: ckanext/odsh/templates/package/resource_read.html:136
 msgid "Additional Information"
 msgstr "Zusätzliche Informationen"
 
-#: ckanext/odsh/templates/package/resource_read.html:148
+#: ckanext/odsh/templates/package/resource_read.html:140
 msgid "Field"
 msgstr "Feld"
 
-#: ckanext/odsh/templates/package/resource_read.html:149
+#: ckanext/odsh/templates/package/resource_read.html:141
 msgid "Value"
 msgstr "Wert"
 
-#: ckanext/odsh/templates/package/resource_read.html:154
+#: ckanext/odsh/templates/package/resource_read.html:146
 msgid "Data last updated"
 msgstr "Daten zuletzt aktualisiert"
 
+#: ckanext/odsh/templates/package/resource_read.html:147
+#: ckanext/odsh/templates/package/resource_read.html:151
 #: ckanext/odsh/templates/package/resource_read.html:155
 #: ckanext/odsh/templates/package/resource_read.html:159
-#: ckanext/odsh/templates/package/resource_read.html:163
-#: ckanext/odsh/templates/package/resource_read.html:167
 msgid "unknown"
 msgstr "unbekannt"
 
-#: ckanext/odsh/templates/package/resource_read.html:158
+#: ckanext/odsh/templates/package/resource_read.html:150
 msgid "Metadata last updated"
 msgstr "Metadaten zuletzt aktualisiert"
 
-#: ckanext/odsh/templates/package/resource_read.html:162
+#: ckanext/odsh/templates/package/resource_read.html:154
 msgid "Created"
 msgstr "Erstellt"
 
-#: ckanext/odsh/templates/package/resource_read.html:166
+#: ckanext/odsh/templates/package/resource_read.html:158
 #: ckanext/odsh/templates/package/snippets/resource_form.html:69
 #: ckanext/odsh/templates/package/snippets/resource_info.html:26
 msgid "Format"
@@ -849,12 +882,12 @@ msgstr "Format"
 
 #: ckanext/odsh/templates/package/search.html:69
 #: ckanext/odsh/templates/package/snippets/info.html:52
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:143
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:163
 msgid "Period"
 msgstr "Zeitraum"
 
 #: ckanext/odsh/templates/package/search.html:79
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:156
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:176
 #: ckanext/odsh/templates/snippets/search_form.html:115
 msgid "from"
 msgstr "von"
@@ -874,7 +907,7 @@ msgid "wrong_start_date_for_search"
 msgstr "Das Startdatum ist ungültig"
 
 #: ckanext/odsh/templates/package/search.html:94
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:170
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:190
 #: ckanext/odsh/templates/snippets/search_form.html:142
 msgid "to"
 msgstr "bis"
@@ -904,6 +937,26 @@ msgstr "Ansicht anzeigen"
 msgid "View preview"
 msgstr "Vorschau ansehen"
 
+#: ckanext/odsh/templates/package/snippets/contact_details.html:72
+msgid "Creator"
+msgstr "Autor"
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:73
+msgid "Maintainer"
+msgstr "Verwalter"
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:75
+msgid "Publisher"
+msgstr "Herausgeber"
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:76
+msgid "Originator"
+msgstr "Urheber"
+
+#: ckanext/odsh/templates/package/snippets/contact_details.html:77
+msgid "Contributor"
+msgstr "Bearbeiter"
+
 #: ckanext/odsh/templates/package/snippets/info.html:28
 #: ckanext/odsh/templates/snippets/package_item.html:99
 msgid "Category:"
@@ -921,12 +974,12 @@ msgid "Modified"
 msgstr "Zuletzt bearbeitet"
 
 #: ckanext/odsh/templates/package/snippets/info.html:89
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:329
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:349
 msgid "Musterdatensatz"
 msgstr "Musterdatensatz"
 
 #: ckanext/odsh/templates/package/snippets/info.html:99
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:234
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:254
 msgid "Spatial uri"
 msgstr "Raumbezug"
 
@@ -955,54 +1008,60 @@ msgid "DCAT-AP.de metadata"
 msgstr "Metadaten nach DCAT-AP.de"
 
 #: ckanext/odsh/templates/package/snippets/package_basic_fields.html:10
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:14
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:15
 msgid "Title"
 msgstr "Titel"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:20
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:21
 msgid "Enter title"
 msgstr "Titel eingeben"
 
 #: ckanext/odsh/templates/package/snippets/package_basic_fields.html:37
+#, fuzzy
+#| msgid "dataset"
+msgid "eg. my-dataset"
+msgstr "Datensatz"
+
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:57
 msgid "Enter description"
 msgstr "Beschreibung eingeben"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:59
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:79
 msgid "Organization"
 msgstr "Herausgeber"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:67
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:87
 msgid ""
 "No\n"
 "                        organization"
 msgstr "Kein Herausgeber"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:118
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:138
 #: ckanext/odsh/templates/user/snippets/login_form.html:23
 msgid "enter name"
 msgstr "Name eingeben"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:189
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:209
 msgid "Publication date"
 msgstr "Publikationsdatum"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:225
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:245
 msgid "odsh tags placeholder"
 msgstr "z.B. Energie; Politik; Umwelt; Alle; ..."
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:239
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:259
 msgid "Visibility"
 msgstr "Sichtbarkeit"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:246
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:266
 msgid "Public"
 msgstr "Öffentlich"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:260
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:280
 msgid "State"
 msgstr "Status"
 
-#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:267
+#: ckanext/odsh/templates/package/snippets/package_basic_fields.html:287
 msgid "Active"
 msgstr "Aktiv"
 
@@ -1118,15 +1177,15 @@ msgstr "Name Ressource"
 msgid "Resource count"
 msgstr "Anzahl Ressourcen"
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:20
+#: ckanext/odsh/templates/package/snippets/resource_item.html:33
 msgid "File size"
 msgstr "Dateigröße"
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:24
+#: ckanext/odsh/templates/package/snippets/resource_item.html:37
 msgid "Number of pages"
 msgstr "Seitenanzahl"
 
-#: ckanext/odsh/templates/package/snippets/resource_item.html:29
+#: ckanext/odsh/templates/package/snippets/resource_item.html:43
 msgid "download file"
 msgstr "Datei herunterladen"
 
@@ -1140,8 +1199,8 @@ msgid ""
 "<p class=\"empty\">This dataset has no data, <a href=\"%(url)s\">why not add "
 "some?</a></p>"
 msgstr ""
-"<p class=\"empty\">Dieser Datensatz enthält keine Daten, <a href=\"%(url)s"
-"\">Warum nicht welche hinzufügen?</a></p>"
+"<p class=\"empty\">Dieser Datensatz enthält keine Daten, <a "
+"href=\"%(url)s\">Warum nicht welche hinzufügen?</a></p>"
 
 #: ckanext/odsh/templates/package/snippets/resources_list.html:30
 msgid "This dataset has no data"
@@ -1486,6 +1545,9 @@ msgstr "Einloggen"
 msgid "Not authorized to see this page"
 msgstr "Nicht berechtigt, diese Seite zu sehen"
 
+#~ msgid "Contact Person"
+#~ msgstr "Ansprechstelle"
+
 #~ msgid "Enter search query for datasets"
 #~ msgstr "Suchanfrage für Datensätze eingeben"
 
diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py
index ee6126c9..e71e2322 100644
--- a/ckanext/odsh/plugin.py
+++ b/ckanext/odsh/plugin.py
@@ -331,6 +331,7 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
           'odsh_extract_error': helpers_odsh.odsh_extract_error,
           'odsh_extract_error_new': helpers_odsh.odsh_extract_error_new,
           'odsh_extract_value_from_extras': helpers_odsh.odsh_extract_value_from_extras,
+          'extract_email': helpers_odsh.extract_email,
           'odsh_create_checksum': helpers_odsh.odsh_create_checksum,
           'presorted_license_options': helpers_odsh.presorted_license_options,
           'odsh_has_more_facets': helpers_odsh.odsh_has_more_facets,
diff --git a/ckanext/odsh/templates/header.html b/ckanext/odsh/templates/header.html
index ed80dc23..429f730b 100644
--- a/ckanext/odsh/templates/header.html
+++ b/ckanext/odsh/templates/header.html
@@ -27,7 +27,7 @@
 
   <div class="container navigation-container">
     <div class='row navigation-row'>
-      <nav class="section navigation">
+      <nav class="navigation">
         <ul class="nav nav-pills">
           <li class="header-menu-mobile" data-module="odsh_toggle_menu">
             <a>{{ _('Menu') }}</a>
diff --git a/ckanext/odsh/templates/package/read.html b/ckanext/odsh/templates/package/read.html
index 03688153..11057ec8 100644
--- a/ckanext/odsh/templates/package/read.html
+++ b/ckanext/odsh/templates/package/read.html
@@ -54,47 +54,54 @@
             {{ _('Private') }}
           </span>
         </div>
-      {% endif %}
-    </h2>
-    <div class="dataset-stars">
-      {% if stars>-1%}
-        {% snippet "qa/stars.html", stars=stars %}
-      {% endif %}
+        {% endif %}
+      </h2>
+      <div class="dataset-stars">
+        {% if stars>-1%}
+          {% snippet "qa/stars.html", stars=stars %}
+        {% endif %}
+      </div>
     </div>
-  </div>
   {# {{ pkg.resources }} #}
 
-  {% block package_notes %}
-    <div class="btn btn-primary btn-lg show-filters" role="button">
-      <img src="/base/images/icon_info.svg" aria-hidden="true" />
-      {{ _('Detailed information') }}
-    </div>
-    {% if successor_url %}
-      <p class="hint-newer-version">
-        {% trans %}
-          Note: A <a href="{{ latest_collection_member }}">newer version</a> of this dataset is available.
-        {% endtrans %}
-      </p>
-    {% endif %}
-    {% if is_replaced_by %}
-      <div class="hint-newer-version">
-        {% trans %}
-          Note: This dataset has been replaced with a <a href="{{ is_replaced_by }}">newer version</a>.
-        {% endtrans %}
-      </div>
-    {% endif %}
-    {% if pkg.notes %}
-      <div class="notes embedded-content">
-        {{ h.render_markdown(h.get_translated(pkg, 'notes')) }}
-      </div>
-    {% endif %}
-    {% if version_notes %}
-      <div class="version-notes">
-        {{ version_notes }}
+    {% block package_notes %}
+      <div class="btn btn-primary btn-lg show-filters" role="button">
+        <img src="/base/images/icon_info.svg" aria-hidden="true" />
+        {{ _('Detailed information') }}
       </div>
-    {% endif %}
-  {% endblock package_notes %}
-{% endblock package_description %}
+      {% if successor_url %}
+        <p class="hint-newer-version">
+          {% trans %}
+            Note: A <a href="{{ latest_collection_member }}">newer version</a> of this dataset is available.
+          {% endtrans %}
+        </p>
+      {% endif %}
+      {% if is_replaced_by %}
+        <div class="hint-newer-version">
+          {% trans %}
+            Note: This dataset has been replaced with a <a href="{{ is_replaced_by }}">newer version</a>.
+          {% endtrans %}
+        </div>
+      {% endif %}
+      {% if pkg.notes %}
+        <div class="notes">
+          <div class="embedded-content" id="dataset-notes">
+            {{ h.render_markdown(h.get_translated(pkg, 'notes')) }}
+          </div>
+          <div class="ellipsis-action" data-target="#dataset-notes" data-max-height="250">
+            <div class="ellipsis-overlay"></div>
+            <a title="Read more" class="readmore" href="#">{% trans %}Read more »{% endtrans %}</a>
+            <a title="Read less" class="readless" href="#">{% trans %}« Read less{% endtrans %}</a>
+          </div>
+        </div>
+      {% endif %}
+      {% if version_notes %}
+        <div class="version-notes">
+          {{ version_notes }}
+        </div>
+      {% endif %}
+    {% endblock package_notes %}
+  {% endblock package_description %}
 
 {% block package_resources %}
   {% snippet "package/snippets/resources_list.html", pkg=pkg, resources=pkg.resources %}
@@ -147,6 +154,9 @@
   {% endif %} {# latest_collection_member #}
 {% endblock collection %}
 
+{% block contact %}
+  {% snippet "package/snippets/contact_details.html", pkg=pkg %}
+{% endblock contact %}
 
 <div class='tag-container'>
   {% for tag in pkg.tags %}
diff --git a/ckanext/odsh/templates/package/snippets/contact_details.html b/ckanext/odsh/templates/package/snippets/contact_details.html
new file mode 100644
index 00000000..1f6947d7
--- /dev/null
+++ b/ckanext/odsh/templates/package/snippets/contact_details.html
@@ -0,0 +1,80 @@
+{% set author_data = {
+  'name': pkg.author,
+  'email': h.extract_email(pkg.author_email),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'author_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'author_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'author_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'author_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'author_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'author_country')
+} %}
+
+{% set maintainer_data = {
+  'name': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_name'),
+  'email': h.extract_email(h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_email')),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'maintainer_country')
+} %}
+
+{% set contact_data = {
+  'name': h.odsh_extract_value_from_extras(pkg.extras, 'contact_name'),
+  'email': h.extract_email(h.odsh_extract_value_from_extras(pkg.extras, 'contact_email')),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'contact_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'contact_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'contact_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'contact_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'contact_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'contact_country')
+} %}
+
+{% set publisher_data = {
+  'name': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_name'),
+  'email': h.extract_email(h.odsh_extract_value_from_extras(pkg.extras, 'publisher_email')),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'publisher_country')
+} %}
+
+{% set originator_data = {
+  'name': h.odsh_extract_value_from_extras(pkg.extras, 'originator_name'),
+  'email': h.extract_email(h.odsh_extract_value_from_extras(pkg.extras, 'originator_email')),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'originator_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'originator_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'originator_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'originator_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'originator_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'originator_country')
+} %}
+
+{% set contributor_data = {
+  'name': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_name'),
+  'email': h.extract_email(h.odsh_extract_value_from_extras(pkg.extras, 'contributor_email')),
+  'tel': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_tel'),
+  'fax': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_fax'),
+  'city': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_city'),
+  'zip': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_zip'),
+  'street': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_street'),
+  'country': h.odsh_extract_value_from_extras(pkg.extras, 'contributor_country')
+} %}
+
+
+{% if author_data.name or maintainer_data.name or contact_data.name or publisher_data.name or originator_data.name or contributor_data.name %}
+<div class="section">
+  <h3>{{ _('Contact') }}</h3>
+
+  {% snippet "package/snippets/contact_details_item.html", data=author_data, title=_('Creator') %}
+  {% snippet "package/snippets/contact_details_item.html", data=maintainer_data, title=_('Maintainer') %}
+  {% snippet "package/snippets/contact_details_item.html", data=contact_data, title=_('Contact') %}
+  {% snippet "package/snippets/contact_details_item.html", data=publisher_data, title=_('Publisher') %}
+  {% snippet "package/snippets/contact_details_item.html", data=originator_data, title=_('Originator') %}
+  {% snippet "package/snippets/contact_details_item.html", data=contributor_data, title=_('Contributor') %}
+
+</div>
+{% endif %}
\ No newline at end of file
diff --git a/ckanext/odsh/templates/package/snippets/contact_details_item.html b/ckanext/odsh/templates/package/snippets/contact_details_item.html
new file mode 100644
index 00000000..c7d073fd
--- /dev/null
+++ b/ckanext/odsh/templates/package/snippets/contact_details_item.html
@@ -0,0 +1,62 @@
+{% if data and (data.name or data.email or data.street or data.tel) and title %}
+<div class="sub-section">
+  <h5>{{ title }}</h5>
+  <table class="table table-striped">
+    <tbody>
+      <tr>
+        <td>
+          {% if data.name %}
+          <p>
+            <span>{{ data.name }}</span>
+          </p>
+          {% endif %}
+          {% if data.street %}
+          <p>
+            {% if data.street %}
+            {{ data.street }}
+            {% endif %}
+            {% if data.zip and data.city %}
+            <br>
+            {{ data.zip }}
+            {{ data.city }}
+            {% endif %}
+            {% if data.country %}
+            <br>
+            {{ data.country }}
+            {% endif %}
+          </p>
+          {% endif %}
+          {% if data.email or data.tel or data.fax %}
+          <div class="details">
+            {% if data.email %}
+            <div class="details-item">
+              <i class="fa-solid fa-envelope"></i>
+              <a href="mailto:{{ data.email }}">
+                {{ data.email }}
+              </a>
+            </div>
+            {% endif %}
+            {% if data.tel %}
+            <div class="details-item">
+              <i class="fa-solid fa-phone"></i>
+              <a href="tel:{{ data.tel }}">
+                {{ data.tel }}
+              </a>
+            </div>
+            {% endif %}
+            {% if data.fax %}
+            <div class="details-item">
+              <i class="fa-solid fa-fax"></i>
+              <a href="fax:{{ data.fax }}">
+                {{ data.fax }}
+              </a>
+            </div>
+            {% endif %}
+          </div>
+          {% endif %}
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+{% endif %}
\ No newline at end of file
diff --git a/ckanext/odsh/templates/package/snippets/resource_item.html b/ckanext/odsh/templates/package/snippets/resource_item.html
index 7f2e4238..5c957ea6 100644
--- a/ckanext/odsh/templates/package/snippets/resource_item.html
+++ b/ckanext/odsh/templates/package/snippets/resource_item.html
@@ -10,28 +10,35 @@
 
 <li class="resource-item" data-id="{{ res.id }}">
   <div class="resource-title-container">
-    <div class="resource-title" title="{{ rtitle }}">
-      {% if res.name %}
+    {% if res.name %}
+      <div class="resource-title" title="{{ rtitle }}">
         <a href="{{ download }}" title="{{ res.name }}">
-          {{ h.resource_display_name(res) | truncate(50) }}
+          {{ h.resource_display_name(res) | truncate(120) }}
         </a>
-      {% endif %}
-    </div>
-    {% block resource_item_description %}
-      <div class="resource-description">
-        {% if res.description %}
-          <p class="description">
-            {{ h.markdown_extract(res.description, extract_length=100) }}
-          </p>
-        {% endif %}
-        {% if resource_size %}
-          <p>{{ _('File size') }}: {{ resource_size }}</p>
-        {% endif %}
-        {% set number_of_pages = res.get('number_of_pages') %}
-        {% if number_of_pages%}
-          <p>{{ _('Number of pages') }}: {{ number_of_pages }}</p>
-        {% endif %}
       </div>
+    {% endif %}
+    {% block resource_item_description %}
+      {% if res.description or resource_size %}
+        <div class="resource-description">
+          {% if res.description %}
+            <p class="description" id="resource-description-{{ res.id }}">
+              {{ h.markdown_extract(res.description, extract_length=0) }}
+            </p>
+            <div class="ellipsis-action" data-target="#resource-description-{{ res.id }}" data-max-height="75">
+              <div class="ellipsis-overlay"></div>
+              <a title="Read more" class="readmore" href="#">{% trans %}Read more »{% endtrans %}</a>
+              <a title="Read less" class="readless" href="#">{% trans %}« Read less{% endtrans %}</a>
+            </div>
+          {% endif %}
+          {% if resource_size %}
+            <p>{{ _('File size') }}: {{ resource_size }}</p>
+          {% endif %}
+          <!-- {% set number_of_pages = res.get('number_of_pages') %}
+          {% if number_of_pages%}
+            <p>{{ _('Number of pages') }}: {{ number_of_pages }}</p>
+          {% endif %} -->
+        </div>
+      {% endif %}
     {% endblock %}
     <div class="resource-icons">
       {% block resource_item_explore_links %}
diff --git a/ckanext/odsh/tests/test_odsh_helpers.py b/ckanext/odsh/tests/test_odsh_helpers.py
index fba58f02..cdb33260 100644
--- a/ckanext/odsh/tests/test_odsh_helpers.py
+++ b/ckanext/odsh/tests/test_odsh_helpers.py
@@ -2,34 +2,58 @@ import datetime
 from mock import patch
 import unittest
 
-from ckanext.odsh.helpers import is_within_last_month
+from ckanext.odsh.helpers import is_within_last_month, extract_email
 
-class Test_is_within_last_month(unittest.TestCase):
-    def test_it_returns_true_for_simple_query(self):
+class TestHelpers(unittest.TestCase):
+    # is_within_last_month
+    def test_within_last_month_with_same_month(self):
         date = datetime.date(2019, 4, 15)
         date_ref = datetime.date(2019, 4, 29)
-        assert is_within_last_month(date, date_ref)
-    
-    def test_it_uses_today_if_date_ref_missing(self):
-        date = datetime.date.today() - datetime.timedelta(days=20)
-        assert is_within_last_month(date)
-    
-    def test_it_returns_true_for_dates_in_different_years(self):
+        self.assertTrue(is_within_last_month(date, date_ref))
+
+    def test_within_last_month_with_different_years(self):
         date = datetime.date(2018, 12, 16)
         date_ref = datetime.date(2019, 1, 15)
-        assert is_within_last_month(date, date_ref)
-    
-    def test_it_returns_false_for_dates_in_different_years(self):
-        date = datetime.date(2018, 12, 15)
-        date_ref = datetime.date(2019, 1, 15)
-        assert is_within_last_month(date, date_ref)==False
-    
-    def test_it_returns_true_for_dates_in_differen_months(self):
+        self.assertTrue(is_within_last_month(date, date_ref))
+
+    def test_within_last_month_with_different_months(self):
         date = datetime.date(2018, 6, 16)
         date_ref = datetime.date(2018, 7, 10)
-        assert is_within_last_month(date, date_ref)
-    
-    def test_it_return_false_for_date_in_different_months(self):
+        self.assertTrue(is_within_last_month(date, date_ref))
+
+    def test_within_last_month_returns_false_for_invalid_dates(self):
+        date = datetime.date(2018, 12, 15)
+        date_ref = datetime.date(2019, 1, 15)
+        self.assertFalse(is_within_last_month(date, date_ref))
+
+    def test_within_last_month_returns_false_for_dates_in_different_months(self):
         date = datetime.date(2018, 6, 8)
         date_ref = datetime.date(2018, 7, 10)
-        assert is_within_last_month(date, date_ref)==False
+        self.assertFalse(is_within_last_month(date, date_ref))
+
+    def test_within_last_month_uses_today_if_date_ref_missing(self):
+        date = datetime.date.today() - datetime.timedelta(days=20)
+        self.assertTrue(is_within_last_month(date))
+
+    # extract_email
+    def test_extract_email_with_mailto_prefix(self):
+        email = extract_email("mailto:user1@example.com")
+        self.assertEqual(email, "user1@example.com")
+
+    def test_extract_email_without_mailto_prefix(self):
+        email = extract_email("user1@example.com")
+        self.assertEqual(email, "user1@example.com")
+
+    def test_extract_email_invalid_input(self):
+        email = extract_email("thisisnomail")
+        self.assertIsNone(email)
+
+        email = extract_email(None)
+        self.assertIsNone(email)
+
+    def test_extract_email_multiple_emails(self):
+        email = extract_email("Emails: user1@example.com, user2@example.com")
+        self.assertEqual(email, "user1@example.com")
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
-- 
GitLab