From dc8d95fd26a29f0da79b0b07115eae8915538fb2 Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 15:40:02 +0200
Subject: [PATCH 01/22] modified orgs pages
---
.../datasetapproval/assets/css/approval.css | 241 +++++++++++++++++-
1 file changed, 236 insertions(+), 5 deletions(-)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 7ebe0f7..386365b 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -4,6 +4,11 @@
flex-direction: row;
}
+/* .breadcrumb */
+.breadcrumb .active a{
+ color: #006D84 !important;
+}
+
/* Main CSS */
.main {
@@ -277,7 +282,7 @@
line-height: 24px;
letter-spacing: 0em;
text-align: left;
- font-family: Calibri;
+ font-family: Calibri, sans-serif;
font-size: 16px;
font-weight: 400;
line-height: 24px;
@@ -289,21 +294,34 @@
.form-group {
display: block;
position: relative;
- padding-left: 35px;
- margin-bottom: 12px;
+ margin-bottom: 24px;
cursor: pointer;
font-size: 18px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
+ width: 548px;
+ box-sizing: content-box;
+}
+
+.form-label {
+ font-weight: 400;
+ font-size: 20px;
+ line-height: 24px;
+ font-family: Calibri , sans-serif;
+}
+
+.form-group input[type="text"] {
+ border-radius: 3px;
+ height: 37px;
}
.checkbox label input {
position: absolute;
opacity: 0;
cursor: pointer;
- font-family: Calibri;
+ font-family: Calibri , sans-serif;
font-size: 12px;
font-weight: 100;
line-height: 20px;
@@ -328,7 +346,7 @@
.resource-form-buttons {
/* there are four buttons in the resource form */
- /* the first button should be aligned left and other buttons should be aligned rigght*/
+ /* the first button should be aligned left and other buttons should be aligned right*/
display: flex;
justify-content: space-between;
@@ -350,3 +368,216 @@
justify-content: right;
margin-top: 20px;
}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 6px 16px;
+ height: 32px;
+ border-radius: 5px;
+ font-family: Calibri , sans-serif;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ margin-left: 17px;
+ gap: 2px;
+}
+
+.btn-primary {
+ background: #006D84;
+}
+
+.btn-default {
+ background: #FFFFFF;
+ border: 2px solid #006D84;
+ color: #006D84;
+}
+
+.btn-default:hover, .btn-default:focus {
+ border-color: #006D84;
+ background-color: #FAFAFA;
+ color: #006D84;
+}
+
+.no-nav .col-md-9 {
+ width: 100%;
+}
+
+.row {
+ background-color: transparent;
+}
+
+/* Start Organizations Page */
+.row:has(form#organization-search-form) {
+ border: 2px solid #006D84;
+ border-radius: 5px;
+}
+
+.row:has(form#organization-search-form)::before {
+ display: none;
+}
+
+.row:has(form#organization-search-form) aside {
+ border-right: 1px solid #006D84;
+}
+
+.row:has(form#organization-search-form) .module-heading {
+ background-color: transparent;
+ border-color: #006D84;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ line-height: 20px;
+ padding: 12px;
+}
+
+.row:has(form#organization-search-form) .module-heading i {
+ margin-right: 2px;
+}
+
+.row:has(form#organization-search-form) .module-content p {
+ font-style: normal;
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 17px;
+ padding: 12px 0px;
+}
+
+form#organization-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
+/* End Organizations Page */
+
+/* Start Single organization page */
+.row:has(header.module-content.page-header){
+ border: 2px solid #006D84;
+ border-radius: 5px;
+ margin-bottom: 10px;
+}
+
+.row:has(header.module-content.page-header) aside {
+ padding: 10px 0;
+ border-right: 2px solid #006D84;
+}
+
+.row:has(header.module-content.page-header) aside h1{
+ font-size: 24px;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) aside h1 + p{
+ font-style: italic;
+ font-weight: 400;
+ font-size: 12px;
+ color: #4E4E4E;
+}
+
+.row:has(header.module-content.page-header) aside dd span{
+ font-weight: 700;
+ font-size: 40px;
+ line-height: 49px;
+ color: #3D3D3D;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2{
+ font-weight: 700;
+ font-size: 14px;
+ line-height: 17px;
+ color: #000000;
+ border:none;
+ background-color: transparent;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 i{
+ display: none;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 + p{
+ padding-top: 0;
+ padding-bottom: 16px;
+}
+
+.row:has(header.module-content.page-header) div.primary{
+ padding: 10px 0;
+}
+
+header.module-content.page-header, header.module-content.page-header .nav-tabs{
+ border-bottom: none;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a{
+ background: #D9D9D9;
+ color: #000;
+ border-radius: 5px 5px 0px 0px;
+ margin-right: 10px;
+ padding: 10px 24px;
+ font-family: Calibri,sans-serif;
+ font-style: normal;
+ font-size: 16px;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a{
+ background: #006D84;
+ color: #fff;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a i{
+ color: #006D84;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a i{
+ color: #fff;
+}
+
+form#organization-datasets-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-datasets-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-datasets-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-datasets-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-datasets-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
\ No newline at end of file
From 5cfb84e3d0b105dd6683f602c6962c6dbddc66e6 Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 20:41:21 +0200
Subject: [PATCH 02/22] added some styles
---
.../datasetapproval/assets/css/approval.css | 52 +++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 386365b..459a0b8 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -497,6 +497,11 @@ form#organization-search-form + ul.media-grid li {
color: #4E4E4E;
}
+.row:has(header.module-content.page-header) aside .nums{
+ border-top: 1px solid #006D84;
+ border-bottom: 1px solid #006D84;;
+}
+
.row:has(header.module-content.page-header) aside dd span{
font-weight: 700;
font-size: 40px;
@@ -580,4 +585,51 @@ form#organization-datasets-search-form + ul.media-grid{
form#organization-datasets-search-form + ul.media-grid li {
border-radius: 5px;
+}
+
+/* End Single organization Page */
+
+/* Start Datasets Page */
+form#dataset-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#dataset-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#dataset-search-form input + .input-group-btn{
+ display: none;
+}
+/* End Datasets Page */
+
+/* Start Dataset List */
+.dataset-list li{
+ padding: 14px 16px;
+ background-color: #E5E5E5;
+ border-radius: 5px;
+}
+
+.dataset-list li h2{
+ font-family: Calibri, sans-serif;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 29px;
+ color: #000000;
+}
+
+
+.dataset-list li .empty{
+ font-family: Calibri, sans-serif;
+ font-style: italic;
+ font-weight: 400;
+ font-size: 16px;
+ line-height: 20px;
+ color: #000000;
}
\ No newline at end of file
From 98b626eabab32d1151a5f5215f58fa79b34227b3 Mon Sep 17 00:00:00 2001
From: gavram
Date: Tue, 16 Apr 2024 10:30:24 +0200
Subject: [PATCH 03/22] Dataset schema corrected, not final version
---
ckanext/datasetapproval/dataset_schema.yaml | 346 ++++++++++++++------
1 file changed, 244 insertions(+), 102 deletions(-)
diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml
index 7223595..6a8c801 100644
--- a/ckanext/datasetapproval/dataset_schema.yaml
+++ b/ckanext/datasetapproval/dataset_schema.yaml
@@ -16,10 +16,6 @@ dataset_fields:
preset: dataset_slug
form_placeholder: eg. my-dataset
-- field_name: org
- label: Organization
- preset: org_autocomplete
-
- field_name: tag_string
label: Keywords
preset: tag_string_autocomplete
@@ -27,125 +23,275 @@ dataset_fields:
- field_name: theme
label: Theme
- preset: multiple_select
- form_snippet: multiple_select.html
- display_snippet: multiple_text.html
+ form_snippet: multiple_select_sublists.html
+ display_snippet: multiple_choice_sublists_links.html
validators: not_empty unicode_safe
choices:
- - value: addresses
- label: Addresses
- - value: administrative_units
- label: Administrative units
- - value: agricultural_and_aquaculture_facilities
- label: Agricultural and aquaculture facilities
- - value: area_management_restriction_regulation_zones_and_reporting_units
- label: Area management/restriction/regulation zones and reporting units
- - value: atmospheric_conditions
- label: Atmospheric conditions
- - value: bio_geographical_regions
- label: Bio-geographical regions
- - value: buildings
- label: Buildings
- - value: cadastral_parcels
- label: Cadastral parcels
- - value: coordinate_reference_systems
- label: Coordinate reference systems
- - value: elevation
- label: Elevation
- - value: energy_resources
- label: Energy resources
- - value: environmental_monitoring_facilities
- label: Environmental monitoring facilities
- - value: geographical_grid_systems
- label: Geographical grid systems
- - value: geographical_names
- label: Geographical names
- - value: geology
- label: Geology
- - value: habitats_and_biotopes
- label: Habitats and biotopes
- - value: human_health_and_safety
- label: Human health and safety
- - value: hydrography
- label: Hydrography
- - value: land_cover
- label: Land cover
- - value: land_use
- label: Land use
- - value: meteorological_geographical_features
- label: Meteorological geographical features
- - value: mineral_resources
- label: Mineral resources
- - value: natural_risk_zones
- label: Natural risk zones
- - value: oceanographic_geographical_features
- label: Oceanographic geographical features
- - value: orthoimagery
- label: Orthoimagery
- - value: population_distribution_demography
- label: Population distribution — demography
- - value: production_and_industrial_facilities
- label: Production and industrial facilities
- - value: protected_sites
- label: Protected sites
- - value: sea_regions
- label: Sea regions
- - value: soil
- label: Soil
- - value: species_distribution
- label: Species distribution
- - value: statistical_units
- label: Statistical units
- - value: transport_networks
- label: Transport networks
- - value: utility_and_governmental_services
- label: Utility and governmental services
+ - value: gemet
+ label: GEMET
+ sub_items:
+ - value: addresses
+ label: Addresses
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ad
+ - value: administrative_units
+ label: Administrative units
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/au
+ - value: agricultural_and_aquaculture_facilities
+ label: Agricultural and aquaculture facilities
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/af
+ - value: area_management/restriction/regulation_zones_and_reporting_units
+ label: Area management/restriction/regulation zones and reporting units
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/am
+ - value: atmospheric_conditions
+ label: Atmospheric conditions
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ac
+ - value: bio-geographical_regions
+ label: Bio-geographical regions
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/br
+ - value: buildings
+ label: Buildings
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/bu
+ - value: cadastral_parcels
+ label: Cadastral parcels
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/cp
+ - value: coordinate_reference_systems
+ label: Coordinate reference systems
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/rs
+ - value: elevation
+ label: Elevation
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/el
+ - value: energy_resources
+ label: Energy resources
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/er
+ - value: environmental_monitoring_facilities
+ label: Environmental monitoring facilities
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ef
+ - value: geographical_grid_systems
+ label: Geographical grid systems
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/gg
+ - value: geographical_names
+ label: Geographical names
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/gn
+ - value: geology
+ label: Geology
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ge
+ - value: habitats_and_biotopes
+ label: Habitats and biotopes
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hb
+ - value: human_health_and_safety
+ label: Human health and safety
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hh
+ - value: hydrography
+ label: Hydrography
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hy
+ - value: land_cover
+ label: Land cover
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/lc
+ - value: land_use
+ label: Land use
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/lu
+ - value: meteorological_geographical_features
+ label: Meteorological geographical features
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/mf
+ - value: mineral_resources
+ label: Mineral resources
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/mr
+ - value: natural_risk_zones
+ label: Natural risk zones
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/nz
+ - value: oceanographic_geographical_features
+ label: Oceanographic geographical features
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/of
+ - value: orthoimagery
+ label: Orthoimagery
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/oi
+ - value: "population_distribution_\xE2\u20AC\u201D_demography"
+ label: "Population distribution \xE2\u20AC\u201D demography"
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/pd
+ - value: production_and_industrial_facilities
+ label: Production and industrial facilities
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/pf
+ - value: protected_sites
+ label: Protected sites
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ps
+ - value: sea_regions
+ label: Sea regions
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/sr
+ - value: soil
+ label: Soil
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/so
+ - value: species_distribution
+ label: Species distribution
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/sd
+ - value: statistical_units
+ label: Statistical units
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/su
+ - value: transport_networks
+ label: Transport networks
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/tn
+ - value: utility_and_governmental_services
+ label: Utility and governmental services
+ url: https://www.eionet.europa.eu/gemet/en/inspire-themes/us
+
+ - value: cf_standard_names
+ label: CF standard names
+ sub_items:
+ - value: acoustic_area_backscattering_strength_in_sea_water
+ label: acoustic area backscattering strength in sea water
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_water
+ - value: acoustic_signal_roundtrip_travel_time_in_sea_water
+ label: acoustic signal roundtrip travel time in sea water
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_water
+ - value: acoustic_target_strength_in_sea_water
+ label: acoustic target strength in sea water
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_water
+ - value: acoustic_volume_backscattering_strength_in_sea_water
+ label: acoustic volume backscattering strength in sea water
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_water
+ - value: aerodynamic_particle_diameter
+ label: aerodynamic particle diameter
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameter
+ - value: aerodynamic_resistance
+ label: aerodynamic resistance
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistance
+ - value: aerosol_angstrom_exponent
+ label: "aerosol angstrom exponent\n DEPRECATED"
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponent
+ - value: aerosol_type_in_atmosphere_layer_in_air
+ label: aerosol type in atmosphere layer in air
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponentaerosol_type_in_atmosphere_layer_in_air
+ - value: age_of_sea_ice
+ label: age of sea ice
+ url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponentaerosol_type_in_atmosphere_layer_in_airage_of_sea_ice
- field_name: subject
label: Subject
- preset: multiple_select
+ form_snippet: multiple_select.html
+ display_snippet: multiple_choice_links.html
form_placeholder: The iso topic category, eg. https://inspire.ec.europa.eu/metadata-codelist/TopicCategory
validators: not_empty unicode_safe
choices:
- value: farming
label: farming
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=001
- value: biota
label: biota
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=002
- value: boundaries
label: boundaries
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=003
- value: climatologymeteorologyatmosphere
label: climatologyMeteorologyAtmosphere
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=004
- value: economy
label: economy
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=005
- value: elevation
label: elevation
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=006
- value: environment
label: environment
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=007
- value: geoscientificinformation
label: geoscientificInformation
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=008
- value: health
label: health
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=009
- value: imagerybasemapsearthcover
label: imageryBaseMapsEarthCover
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=010
- value: intelligencemilitary
label: intelligenceMilitary
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=011
- value: inlandwaters
label: inlandWaters
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=012
- value: location
label: location
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=013
- value: oceans
label: oceans
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=014
- value: planningcadastre
label: planningCadastre
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=015
- value: society
label: society
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=016
- value: structure
label: structure
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=017
- value: transportation
label: transportation
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=018
- value: utilitiescommunication
label: utilitiesCommunication
+ url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=019
+
+- field_name: type
+ label: Type
+ form_snippet: null
+ display_snippet: text.html
+
+- field_name: contact_points
+ label: Contact points
+ repeating_label: Contact point
+ repeating_subfields:
+ - field_name: first_name
+ label: First name
+ - field_name: last_name
+ label: Last name
+ - field_name: organisation
+ label: Organisation
+ - field_name: email
+ label: Email
+
+- field_name: creators
+ label: Creators
+ repeating_label: Creator
+ repeating_subfields:
+ - field_name: first_name
+ label: First name
+ required: false
+ - field_name: last_name
+ label: Last name
+ required: false
+ - field_name: organisation
+ label: Organisation
+ required: false
+ - field_name: email
+ label: Email
+ required: false
+
+- field_name: contributors
+ label: Contributors
+ repeating_label: Contributor
+ repeating_subfields:
+ - field_name: first_name
+ label: First name
+ required: false
+ - field_name: last_name
+ label: Last name
+ required: false
+ - field_name: organisation
+ label: Organisation
+ required: false
+ - field_name: email
+ label: Email
+ required: false
+
+- field_name: publisher
+ label: Publisher
+ form_snippet: null
+ display_snippet: text.html
+
+- field_name: doi_id
+ label: DOI Identifier
+ form_snippet: null
+ display_snippet: text.html
+ validators: unicode_safe
- field_name: notes
label: Description
@@ -159,19 +305,23 @@ dataset_fields:
form_snippet: null
display_snippet: text.html
-- field_name: has_part
- label: Has part
- preset: multiple_text
- validators: ignore_missing unicode_safe
- form_snippet: multiple_text.html
- display_snippet: multiple_text.html
+# - field_name: has_part
+# label: Has part
+# preset: multiple_text
+# validators: ignore_missing unicode_safe
+# form_snippet: multiple_text.html
+# display_snippet: multiple_text.html
+
+# - field_name: is_part_of
+# label: Is part of
+# preset: multiple_text
+# validators: ignore_missing unicode_safe
+# form_snippet: multiple_text.html
+# display_snippet: multiple_text.html
-- field_name: is_part_of
- label: Is part of
- preset: multiple_text
- validators: ignore_missing unicode_safe
- form_snippet: multiple_text.html
- display_snippet: multiple_text.html
+- field_name: releaseDate
+ label: Release date
+ display_snippet: date.html
# - filed_name: has_version
# label: Has Version
@@ -183,19 +333,6 @@ dataset_fields:
# form_snippet: null
# display_snippet: text.html
-- field_name: releaseDate
- label: Release date
- preset: date
- required: true
- validators: not_empty
- form_placeholder: eg. 2024-01-15
-
-- field_name: creators
- label: Creators
- preset: multiple_text
- validators: ignore_missing unicode_safe
- form_snippet: multiple_text.html
- display_snippet: multiple_text.html
- field_name: language
label: Language
@@ -318,6 +455,11 @@ dataset_fields:
display_snippet: text.html
form_snippet: null
+- field_name: terms_agreed
+ label: Terms
+ form_snippet: null
+ display_snippet: null
+ validators: ignore_missing
resource_fields:
@@ -337,4 +479,4 @@ resource_fields:
- field_name: format
label: Format
- preset: resource_format_autocomplete
+ preset: resource_format_autocomplete
\ No newline at end of file
From 02a9da8bcc1aa783e2d450dd8800c052e1379e98 Mon Sep 17 00:00:00 2001
From: gavram
Date: Tue, 16 Apr 2024 10:31:24 +0200
Subject: [PATCH 04/22] Add support for multiple select sublists and hyperlinks
rendering
---
ckanext/datasetapproval/actions.py | 48 +++++++
.../datasetapproval/assets/css/approval.css | 125 +++++++++++++++++-
.../assets/js/multiple-sublists.js | 30 +++++
ckanext/datasetapproval/assets/webassets.yml | 1 +
ckanext/datasetapproval/plugin.py | 18 +++
.../multiple_choice_links.html | 18 +++
.../multiple_choice_sublists_links.html | 20 +++
.../multiple_select_sublists.html | 36 +++++
8 files changed, 295 insertions(+), 1 deletion(-)
create mode 100644 ckanext/datasetapproval/assets/js/multiple-sublists.js
create mode 100644 ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html
create mode 100644 ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html
create mode 100644 ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 96e6d68..16404bc 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -4,6 +4,8 @@
from ckan.plugins import toolkit as tk
from ckanext.datasetapproval import mailer
from ckan import logic
+from ckanext.scheming.logic import scheming_dataset_schema_show
+from ckan import model
log = logging.getLogger()
@@ -63,8 +65,52 @@ def _add_or_update_org(context, package_dict):
return package_dict
+def get_dataset_schema():
+ context = {
+ 'model': model,
+ 'session': model.Session,
+ 'user': None,
+ 'ignore_auth': True
+ }
+
+ data_dict = {
+ 'type': 'dataset',
+ 'expanded': True
+ }
+
+ try:
+ schema_data = scheming_dataset_schema_show(context, data_dict)
+ return schema_data
+ except Exception as e:
+ print(f"Error retrieving dataset schema: {e}")
+ return None
+
+def clean_dictionary(data_dict):
+ schema = get_dataset_schema()
+ keys = []
+
+ for field_info in schema.get('dataset_fields', []):
+ if "repeating_subfields" in field_info.keys():
+ keys.append(field_info['field_name'])
+
+ cleaned_dict = dict(data_dict)
+
+ for key in keys:
+ if key in cleaned_dict:
+ remove_key = True
+ for entry in cleaned_dict[key]:
+ for value in entry.values():
+ if value != "":
+ remove_key = False
+ break
+ if remove_key:
+ del cleaned_dict[key]
+
+ return cleaned_dict
+
@tk.chained_action
def package_create(up_func, context, data_dict):
+ data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
@@ -73,6 +119,7 @@ def package_create(up_func, context, data_dict):
@tk.chained_action
def package_update(up_func, context, data_dict):
+ data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
@@ -81,6 +128,7 @@ def package_update(up_func, context, data_dict):
@tk.chained_action
def package_patch(up_func, context, data_dict):
+ data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 459a0b8..e491036 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -369,6 +369,67 @@
margin-top: 20px;
}
+/* Scheming multiple select with sublists */
+.multi-select ul, .multi-select ul .sub-items {
+ list-style: none; /* Removes list bullets */
+ padding-left: 0; /* Removes list padding */
+ margin-left: 0; /* Aligns with the multi-select container */
+}
+
+/* Main category title styles */
+/* Resets */
+.multi-select,
+.multi-select ul,
+.multi-select ul .sub-items {
+ list-style: none; /* Removes bullets */
+ padding-left: 0; /* Removes indentation */
+ margin: 0; /* Removes default margin */
+ margin-left: 10px; /* Indents the main category labels */
+}
+
+/* Styles for the main category labels and toggle arrow */
+.multi-select > ul > li > label {
+ cursor: pointer; /* Indicates the element is clickable */
+ vertical-align: middle; /* Aligns with the toggle arrow */
+ font-weight: normal; /* No bold font */
+}
+
+.toggle-sublist {
+ cursor: pointer; /* Indicates it's clickable */
+ user-select: none; /* Prevents text selection */
+ margin-right: 5px; /* Spacing between arrow and label */
+}
+
+/* Styles for sub-items list */
+.multi-select .sub-items {
+ display: none; /* Hide by default */
+ margin-top: 5px; /* Space between category label and sublist items */
+ padding-left: 30px; /* Aligns sublist items with the main items */
+}
+
+/* Styles for sublist items (labels and checkboxes) */
+.sub-items li {
+ display: flex;
+ align-items: center; /* Center aligns items vertically */
+ margin-bottom: 5px; /* Space between sublist items */
+}
+
+.sub-items li input[type="checkbox"] {
+ width: auto; /* Adjusts checkbox width */
+ margin-right: 10px; /* Space between checkbox and label */
+ margin-left: 20px; /* Indent checkbox to align with sublist items */
+}
+
+.sub-items li label {
+ font-weight: normal; /* No bold font */
+ white-space: nowrap; /* Ensures label text does not wrap */
+}
+
+/* Remove the :after content on labels, if it exists */
+.sub-items li label::after {
+ content: none;
+}
+
.btn {
display: inline-flex;
align-items: center;
@@ -632,4 +693,66 @@ form#dataset-search-form input + .input-group-btn{
font-size: 16px;
line-height: 20px;
color: #000000;
-}
\ No newline at end of file
+}
+
+
+/* Scheming multiple select with sublists */
+.multi-select ul, .multi-select ul .sub-items {
+ list-style: none; /* Removes list bullets */
+ padding-left: 0; /* Removes list padding */
+ margin-left: 0; /* Aligns with the multi-select container */
+}
+
+/* Main category title styles */
+/* Resets */
+.multi-select,
+.multi-select ul,
+.multi-select ul .sub-items {
+ list-style: none; /* Removes bullets */
+ padding-left: 0; /* Removes indentation */
+ margin: 0; /* Removes default margin */
+ margin-left: 10px; /* Indents the main category labels */
+}
+
+/* Styles for the main category labels and toggle arrow */
+.multi-select > ul > li > label {
+ cursor: pointer; /* Indicates the element is clickable */
+ vertical-align: middle; /* Aligns with the toggle arrow */
+ font-weight: normal; /* No bold font */
+}
+
+.toggle-sublist {
+ cursor: pointer; /* Indicates it's clickable */
+ user-select: none; /* Prevents text selection */
+ margin-right: 5px; /* Spacing between arrow and label */
+}
+
+/* Styles for sub-items list */
+.multi-select .sub-items {
+ display: none; /* Hide by default */
+ margin-top: 5px; /* Space between category label and sublist items */
+ padding-left: 30px; /* Aligns sublist items with the main items */
+}
+
+/* Styles for sublist items (labels and checkboxes) */
+.sub-items li {
+ display: flex;
+ align-items: center; /* Center aligns items vertically */
+ margin-bottom: 5px; /* Space between sublist items */
+}
+
+.sub-items li input[type="checkbox"] {
+ width: auto; /* Adjusts checkbox width */
+ margin-right: 10px; /* Space between checkbox and label */
+ margin-left: 20px; /* Indent checkbox to align with sublist items */
+}
+
+.sub-items li label {
+ font-weight: normal; /* No bold font */
+ white-space: nowrap; /* Ensures label text does not wrap */
+}
+
+/* Remove the :after content on labels, if it exists */
+.sub-items li label::after {
+ content: none;
+}
diff --git a/ckanext/datasetapproval/assets/js/multiple-sublists.js b/ckanext/datasetapproval/assets/js/multiple-sublists.js
new file mode 100644
index 0000000..e3feb0b
--- /dev/null
+++ b/ckanext/datasetapproval/assets/js/multiple-sublists.js
@@ -0,0 +1,30 @@
+document.addEventListener('DOMContentLoaded', function() {
+ // Handle parent checkbox change
+ document.querySelectorAll('.multi-select > ul > li > input[type="checkbox"]').forEach(function(parentCheckbox) {
+ parentCheckbox.addEventListener('change', function() {
+ var subItemsContainer = this.parentNode.querySelector('.sub-items');
+ if (subItemsContainer) {
+ // Display sub-items if parent is checked
+ subItemsContainer.style.display = this.checked ? 'block' : 'none';
+ // Deselect all sub-items if parent is deselected
+ if (!this.checked) {
+ subItemsContainer.querySelectorAll('input[type="checkbox"]').forEach(function(subCheckbox) {
+ subCheckbox.checked = false;
+ });
+ }
+ }
+ });
+ });
+
+ // Handle click on the toggle sublist arrows
+ document.querySelectorAll('.toggle-sublist').forEach(function(toggle) {
+ toggle.addEventListener('click', function() {
+ var sublist = this.parentNode.querySelector('.sub-items');
+ var isExpanded = sublist.style.display === 'block';
+ // Toggle the display of the sublist
+ sublist.style.display = isExpanded ? 'none' : 'block';
+ // Change the direction of the arrow based on the state
+ this.textContent = isExpanded ? '►' : '▼';
+ });
+ });
+});
\ No newline at end of file
diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml
index 87f68bf..d0b79ca 100644
--- a/ckanext/datasetapproval/assets/webassets.yml
+++ b/ckanext/datasetapproval/assets/webassets.yml
@@ -5,6 +5,7 @@ datasetapproval_js:
# - js/dataset-visibility.js
# - js/form-submit.js
- js/org-autocomplete.js
+ - js/multiple-sublists.js
extra:
preload:
- base/main
diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py
index 62dfede..ac73b93 100644
--- a/ckanext/datasetapproval/plugin.py
+++ b/ckanext/datasetapproval/plugin.py
@@ -1,5 +1,6 @@
# Standard library imports
import logging
+import json
import ckan.plugins as plugins
import ckan.plugins.toolkit as tk
@@ -9,6 +10,7 @@
from ckan.lib.plugins import DefaultPermissionLabels
from ckanext.datasetapproval import views
+from ckanext.datasetapproval.actions import get_dataset_schema
log = logging.getLogger(__name__)
@@ -22,6 +24,22 @@ class DatasetapprovalPlugin(
plugins.implements(plugins.IAuthFunctions)
plugins.implements(plugins.ITemplateHelpers)
plugins.implements(plugins.IPermissionLabels, inherit=True)
+ plugins.implements(plugins.IPackageController, inherit=True)
+
+ # IPackageController
+ def before_dataset_index(self, data_dict):
+ schema = get_dataset_schema()
+ field_names = []
+
+ for field_info in schema.get('dataset_fields', []):
+ if "repeating_subfields" in field_info.keys():
+ field_names.append(field_info['field_name'])
+
+ for field_name in field_names:
+ if field_name in data_dict and data_dict[field_name] is not None:
+ data_dict[field_name] = json.dumps(data_dict[field_name])
+
+ return data_dict
# IConfigurer
def update_config(self, config_):
diff --git a/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html
new file mode 100644
index 0000000..3c8fb35
--- /dev/null
+++ b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html
@@ -0,0 +1,18 @@
+{%- set values = data[field.field_name] -%}
+{%- set choices_list = [] -%}
+
+{%- for choice in h.scheming_field_choices(field) -%}
+ {%- if choice.value in values -%}
+ {%- do choices_list.append({'label':h.scheming_language_text(choice.label), 'url':h.scheming_language_text(choice.url)}) -%}
+ {%- endif -%}
+{%- endfor -%}
+
+{%- if choices_list|length == 1 -%}
+ {{ choices_list[0]['label'] }}
+{%- else -%}
+
+{%- endif -%}
diff --git a/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html
new file mode 100644
index 0000000..fe37001
--- /dev/null
+++ b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html
@@ -0,0 +1,20 @@
+{%- set values = data[field.field_name] -%}
+{%- set choices_list = [] -%}
+
+{%- for choice in h.scheming_field_choices(field) -%}
+ {% for sub_item in choice.sub_items %}
+ {%- if sub_item.value in values -%}
+ {%- do choices_list.append({'label':h.scheming_language_text(sub_item.label), 'url':h.scheming_language_text(sub_item.url)}) -%}
+ {%- endif -%}
+ {%- endfor -%}
+{%- endfor -%}
+
+{%- if choices_list|length == 1 -%}
+ {{ choices_list[0]['label'] }}
+{%- else -%}
+
+{%- endif -%}
diff --git a/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html b/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html
new file mode 100644
index 0000000..b9828bd
--- /dev/null
+++ b/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html
@@ -0,0 +1,36 @@
+{% import 'macros/form.html' as form %}
+
+{% macro help_text() %}
+ {%- snippet 'scheming/form_snippets/help_text.html', field=field -%}
+{% endmacro %}
+
+{%- call form.input_block(
+ "field-" + field.field_name,
+ label=h.scheming_language_text(field.label),
+ classes=field.classes if 'classes' in field else ['control-full'],
+ error=errors[field.field_name],
+ is_required=h.scheming_field_required(field),
+ extra_html=help_text()
+ ) -%}
+
+
+ {% for choice in h.scheming_field_choices(field) -%}
+ -
+ ►
+ {{ h.scheming_language_text(choice.label) }}
+ {%- if choice.sub_items -%}
+
+ {%- endif -%}
+
+ {% endfor %}
+
+
+{%- endcall -%}
\ No newline at end of file
From 3b995138a9351c27708507eb19cca190617e10cb Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 15:40:02 +0200
Subject: [PATCH 05/22] modified orgs pages
---
.../datasetapproval/assets/css/approval.css | 545 ++++++++++++++++++
1 file changed, 545 insertions(+)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index e491036..ff230e5 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -9,6 +9,11 @@
color: #006D84 !important;
}
+/* .breadcrumb */
+.breadcrumb .active a{
+ color: #006D84 !important;
+}
+
/* Main CSS */
.main {
@@ -756,3 +761,543 @@ form#dataset-search-form input + .input-group-btn{
.sub-items li label::after {
content: none;
}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 6px 16px;
+ height: 32px;
+ border-radius: 5px;
+ font-family: Calibri , sans-serif;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ margin-left: 17px;
+ gap: 2px;
+}
+
+.btn-primary {
+ background: #006D84;
+}
+
+.btn-default {
+ background: #FFFFFF;
+ border: 2px solid #006D84;
+ color: #006D84;
+}
+
+.btn-default:hover, .btn-default:focus {
+ border-color: #006D84;
+ background-color: #FAFAFA;
+ color: #006D84;
+}
+
+.no-nav .col-md-9 {
+ width: 100%;
+}
+
+.row {
+ background-color: transparent;
+}
+
+/* Start Organizations Page */
+.row:has(form#organization-search-form) {
+ border: 2px solid #006D84;
+ border-radius: 5px;
+}
+
+.row:has(form#organization-search-form)::before {
+ display: none;
+}
+
+.row:has(form#organization-search-form) aside {
+ border-right: 1px solid #006D84;
+}
+
+.row:has(form#organization-search-form) .module-heading {
+ background-color: transparent;
+ border-color: #006D84;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ line-height: 20px;
+ padding: 12px;
+}
+
+.row:has(form#organization-search-form) .module-heading i {
+ margin-right: 2px;
+}
+
+.row:has(form#organization-search-form) .module-content p {
+ font-style: normal;
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 17px;
+ padding: 12px 0px;
+}
+
+form#organization-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
+/* End Organizations Page */
+
+/* Start Single organization page */
+.row:has(header.module-content.page-header){
+ border: 2px solid #006D84;
+ border-radius: 5px;
+ margin-bottom: 10px;
+}
+
+.row:has(header.module-content.page-header) aside {
+ padding: 10px 0;
+ border-right: 2px solid #006D84;
+}
+
+.row:has(header.module-content.page-header) aside h1{
+ font-size: 24px;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) aside h1 + p{
+ font-style: italic;
+ font-weight: 400;
+ font-size: 12px;
+ color: #4E4E4E;
+}
+
+.row:has(header.module-content.page-header) aside .nums{
+ border-top: 1px solid #006D84;
+ border-bottom: 1px solid #006D84;;
+}
+
+.row:has(header.module-content.page-header) aside dd span{
+ font-weight: 700;
+ font-size: 40px;
+ line-height: 49px;
+ color: #3D3D3D;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2{
+ font-weight: 700;
+ font-size: 14px;
+ line-height: 17px;
+ color: #000000;
+ border:none;
+ background-color: transparent;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 i{
+ display: none;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 + p{
+ padding-top: 0;
+ padding-bottom: 16px;
+}
+
+.row:has(header.module-content.page-header) div.primary{
+ padding: 10px 0;
+}
+
+header.module-content.page-header, header.module-content.page-header .nav-tabs{
+ border-bottom: none;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a{
+ background: #D9D9D9;
+ color: #000;
+ border-radius: 5px 5px 0px 0px;
+ margin-right: 10px;
+ padding: 10px 24px;
+ font-family: Calibri,sans-serif;
+ font-style: normal;
+ font-size: 16px;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a{
+ background: #006D84;
+ color: #fff;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a i{
+ color: #006D84;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a i{
+ color: #fff;
+}
+
+form#organization-datasets-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-datasets-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-datasets-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-datasets-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-datasets-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
+
+/* End Single organization Page */
+
+/* Start Datasets Page */
+form#dataset-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#dataset-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#dataset-search-form input + .input-group-btn{
+ display: none;
+}
+/* End Datasets Page */
+
+/* Start Dataset List */
+.dataset-list li{
+ padding: 14px 16px;
+ background-color: #E5E5E5;
+ border-radius: 5px;
+}
+
+.dataset-list li h2{
+ font-family: Calibri, sans-serif;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 29px;
+ color: #000000;
+}
+
+
+.dataset-list li .empty{
+ font-family: Calibri, sans-serif;
+ font-style: italic;
+ font-weight: 400;
+ font-size: 16px;
+ line-height: 20px;
+ color: #000000;
+}
+
+
+/* Scheming multiple select with sublists */
+.multi-select ul, .multi-select ul .sub-items {
+ list-style: none; /* Removes list bullets */
+ padding-left: 0; /* Removes list padding */
+ margin-left: 0; /* Aligns with the multi-select container */
+}
+
+/* Main category title styles */
+/* Resets */
+.multi-select,
+.multi-select ul,
+.multi-select ul .sub-items {
+ list-style: none; /* Removes bullets */
+ padding-left: 0; /* Removes indentation */
+ margin: 0; /* Removes default margin */
+ margin-left: 10px; /* Indents the main category labels */
+}
+
+/* Styles for the main category labels and toggle arrow */
+.multi-select > ul > li > label {
+ cursor: pointer; /* Indicates the element is clickable */
+ vertical-align: middle; /* Aligns with the toggle arrow */
+ font-weight: normal; /* No bold font */
+}
+
+.toggle-sublist {
+ cursor: pointer; /* Indicates it's clickable */
+ user-select: none; /* Prevents text selection */
+ margin-right: 5px; /* Spacing between arrow and label */
+}
+
+/* Styles for sub-items list */
+.multi-select .sub-items {
+ display: none; /* Hide by default */
+ margin-top: 5px; /* Space between category label and sublist items */
+ padding-left: 30px; /* Aligns sublist items with the main items */
+}
+
+/* Styles for sublist items (labels and checkboxes) */
+.sub-items li {
+ display: flex;
+ align-items: center; /* Center aligns items vertically */
+ margin-bottom: 5px; /* Space between sublist items */
+}
+
+.sub-items li input[type="checkbox"] {
+ width: auto; /* Adjusts checkbox width */
+ margin-right: 10px; /* Space between checkbox and label */
+ margin-left: 20px; /* Indent checkbox to align with sublist items */
+}
+
+.sub-items li label {
+ font-weight: normal; /* No bold font */
+ white-space: nowrap; /* Ensures label text does not wrap */
+}
+
+/* Remove the :after content on labels, if it exists */
+.sub-items li label::after {
+ content: none;
+}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 6px 16px;
+ height: 32px;
+ border-radius: 5px;
+ font-family: Calibri , sans-serif;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ margin-left: 17px;
+ gap: 2px;
+}
+
+.btn-primary {
+ background: #006D84;
+}
+
+.btn-default {
+ background: #FFFFFF;
+ border: 2px solid #006D84;
+ color: #006D84;
+}
+
+.btn-default:hover, .btn-default:focus {
+ border-color: #006D84;
+ background-color: #FAFAFA;
+ color: #006D84;
+}
+
+.no-nav .col-md-9 {
+ width: 100%;
+}
+
+.row {
+ background-color: transparent;
+}
+
+/* Start Organizations Page */
+.row:has(form#organization-search-form) {
+ border: 2px solid #006D84;
+ border-radius: 5px;
+}
+
+.row:has(form#organization-search-form)::before {
+ display: none;
+}
+
+.row:has(form#organization-search-form) aside {
+ border-right: 1px solid #006D84;
+}
+
+.row:has(form#organization-search-form) .module-heading {
+ background-color: transparent;
+ border-color: #006D84;
+ font-style: normal;
+ font-weight: 700;
+ font-size: 16px;
+ line-height: 20px;
+ padding: 12px;
+}
+
+.row:has(form#organization-search-form) .module-heading i {
+ margin-right: 2px;
+}
+
+.row:has(form#organization-search-form) .module-content p {
+ font-style: normal;
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 17px;
+ padding: 12px 0px;
+}
+
+form#organization-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
+/* End Organizations Page */
+
+/* Start Single organization page */
+.row:has(header.module-content.page-header){
+ border: 2px solid #006D84;
+ border-radius: 5px;
+ margin-bottom: 10px;
+}
+
+.row:has(header.module-content.page-header) aside {
+ padding: 10px 0;
+ border-right: 2px solid #006D84;
+}
+
+.row:has(header.module-content.page-header) aside h1{
+ font-size: 24px;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) aside h1 + p{
+ font-style: italic;
+ font-weight: 400;
+ font-size: 12px;
+ color: #4E4E4E;
+}
+
+.row:has(header.module-content.page-header) aside dd span{
+ font-weight: 700;
+ font-size: 40px;
+ line-height: 49px;
+ color: #3D3D3D;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2{
+ font-weight: 700;
+ font-size: 14px;
+ line-height: 17px;
+ color: #000000;
+ border:none;
+ background-color: transparent;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 i{
+ display: none;
+}
+
+.row:has(header.module-content.page-header) aside .filters h2 + p{
+ padding-top: 0;
+ padding-bottom: 16px;
+}
+
+.row:has(header.module-content.page-header) div.primary{
+ padding: 10px 0;
+}
+
+header.module-content.page-header, header.module-content.page-header .nav-tabs{
+ border-bottom: none;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a{
+ background: #D9D9D9;
+ color: #000;
+ border-radius: 5px 5px 0px 0px;
+ margin-right: 10px;
+ padding: 10px 24px;
+ font-family: Calibri,sans-serif;
+ font-style: normal;
+ font-size: 16px;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a{
+ background: #006D84;
+ color: #fff;
+ font-weight: 700;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li a i{
+ color: #006D84;
+}
+
+.row:has(header.module-content.page-header) .nav-tabs li.active a i{
+ color: #fff;
+}
+
+form#organization-datasets-search-form select{
+ border: none;
+ background-color: transparent;
+ box-shadow: none;
+}
+
+form#organization-datasets-search-form input {
+ border: 2px solid #006D84;
+ border-radius: 10px;
+ box-sizing: border-box;
+ padding: 10px 26px;
+}
+
+form#organization-datasets-search-form input + .input-group-btn{
+ display: none;
+}
+
+form#organization-datasets-search-form + ul.media-grid{
+ background-color: #E1E1E1;
+ border-radius: 5px;
+ padding: 24px;
+}
+
+form#organization-datasets-search-form + ul.media-grid li {
+ border-radius: 5px;
+}
\ No newline at end of file
From ee40ef3f311d8180c8445eb825c44eaad5e64f99 Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Wed, 17 Apr 2024 09:33:22 +0200
Subject: [PATCH 06/22] remove unwanted css
---
.../datasetapproval/assets/css/approval.css | 649 +-----------------
1 file changed, 1 insertion(+), 648 deletions(-)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index ff230e5..9aa6dbb 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -653,651 +653,4 @@ form#organization-datasets-search-form + ul.media-grid li {
border-radius: 5px;
}
-/* End Single organization Page */
-
-/* Start Datasets Page */
-form#dataset-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#dataset-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#dataset-search-form input + .input-group-btn{
- display: none;
-}
-/* End Datasets Page */
-
-/* Start Dataset List */
-.dataset-list li{
- padding: 14px 16px;
- background-color: #E5E5E5;
- border-radius: 5px;
-}
-
-.dataset-list li h2{
- font-family: Calibri, sans-serif;
- font-style: normal;
- font-weight: 700;
- font-size: 24px;
- line-height: 29px;
- color: #000000;
-}
-
-
-.dataset-list li .empty{
- font-family: Calibri, sans-serif;
- font-style: italic;
- font-weight: 400;
- font-size: 16px;
- line-height: 20px;
- color: #000000;
-}
-
-
-/* Scheming multiple select with sublists */
-.multi-select ul, .multi-select ul .sub-items {
- list-style: none; /* Removes list bullets */
- padding-left: 0; /* Removes list padding */
- margin-left: 0; /* Aligns with the multi-select container */
-}
-
-/* Main category title styles */
-/* Resets */
-.multi-select,
-.multi-select ul,
-.multi-select ul .sub-items {
- list-style: none; /* Removes bullets */
- padding-left: 0; /* Removes indentation */
- margin: 0; /* Removes default margin */
- margin-left: 10px; /* Indents the main category labels */
-}
-
-/* Styles for the main category labels and toggle arrow */
-.multi-select > ul > li > label {
- cursor: pointer; /* Indicates the element is clickable */
- vertical-align: middle; /* Aligns with the toggle arrow */
- font-weight: normal; /* No bold font */
-}
-
-.toggle-sublist {
- cursor: pointer; /* Indicates it's clickable */
- user-select: none; /* Prevents text selection */
- margin-right: 5px; /* Spacing between arrow and label */
-}
-
-/* Styles for sub-items list */
-.multi-select .sub-items {
- display: none; /* Hide by default */
- margin-top: 5px; /* Space between category label and sublist items */
- padding-left: 30px; /* Aligns sublist items with the main items */
-}
-
-/* Styles for sublist items (labels and checkboxes) */
-.sub-items li {
- display: flex;
- align-items: center; /* Center aligns items vertically */
- margin-bottom: 5px; /* Space between sublist items */
-}
-
-.sub-items li input[type="checkbox"] {
- width: auto; /* Adjusts checkbox width */
- margin-right: 10px; /* Space between checkbox and label */
- margin-left: 20px; /* Indent checkbox to align with sublist items */
-}
-
-.sub-items li label {
- font-weight: normal; /* No bold font */
- white-space: nowrap; /* Ensures label text does not wrap */
-}
-
-/* Remove the :after content on labels, if it exists */
-.sub-items li label::after {
- content: none;
-}
-
-.btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- box-sizing: border-box;
- padding: 6px 16px;
- height: 32px;
- border-radius: 5px;
- font-family: Calibri , sans-serif;
- font-style: normal;
- font-weight: 700;
- font-size: 16px;
- margin-left: 17px;
- gap: 2px;
-}
-
-.btn-primary {
- background: #006D84;
-}
-
-.btn-default {
- background: #FFFFFF;
- border: 2px solid #006D84;
- color: #006D84;
-}
-
-.btn-default:hover, .btn-default:focus {
- border-color: #006D84;
- background-color: #FAFAFA;
- color: #006D84;
-}
-
-.no-nav .col-md-9 {
- width: 100%;
-}
-
-.row {
- background-color: transparent;
-}
-
-/* Start Organizations Page */
-.row:has(form#organization-search-form) {
- border: 2px solid #006D84;
- border-radius: 5px;
-}
-
-.row:has(form#organization-search-form)::before {
- display: none;
-}
-
-.row:has(form#organization-search-form) aside {
- border-right: 1px solid #006D84;
-}
-
-.row:has(form#organization-search-form) .module-heading {
- background-color: transparent;
- border-color: #006D84;
- font-style: normal;
- font-weight: 700;
- font-size: 16px;
- line-height: 20px;
- padding: 12px;
-}
-
-.row:has(form#organization-search-form) .module-heading i {
- margin-right: 2px;
-}
-
-.row:has(form#organization-search-form) .module-content p {
- font-style: normal;
- font-weight: 400;
- font-size: 14px;
- line-height: 17px;
- padding: 12px 0px;
-}
-
-form#organization-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#organization-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#organization-search-form input + .input-group-btn{
- display: none;
-}
-
-form#organization-search-form + ul.media-grid{
- background-color: #E1E1E1;
- border-radius: 5px;
- padding: 24px;
-}
-
-form#organization-search-form + ul.media-grid li {
- border-radius: 5px;
-}
-/* End Organizations Page */
-
-/* Start Single organization page */
-.row:has(header.module-content.page-header){
- border: 2px solid #006D84;
- border-radius: 5px;
- margin-bottom: 10px;
-}
-
-.row:has(header.module-content.page-header) aside {
- padding: 10px 0;
- border-right: 2px solid #006D84;
-}
-
-.row:has(header.module-content.page-header) aside h1{
- font-size: 24px;
- font-weight: 700;
-}
-
-.row:has(header.module-content.page-header) aside h1 + p{
- font-style: italic;
- font-weight: 400;
- font-size: 12px;
- color: #4E4E4E;
-}
-
-.row:has(header.module-content.page-header) aside .nums{
- border-top: 1px solid #006D84;
- border-bottom: 1px solid #006D84;;
-}
-
-.row:has(header.module-content.page-header) aside dd span{
- font-weight: 700;
- font-size: 40px;
- line-height: 49px;
- color: #3D3D3D;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2{
- font-weight: 700;
- font-size: 14px;
- line-height: 17px;
- color: #000000;
- border:none;
- background-color: transparent;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2 i{
- display: none;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2 + p{
- padding-top: 0;
- padding-bottom: 16px;
-}
-
-.row:has(header.module-content.page-header) div.primary{
- padding: 10px 0;
-}
-
-header.module-content.page-header, header.module-content.page-header .nav-tabs{
- border-bottom: none;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li a{
- background: #D9D9D9;
- color: #000;
- border-radius: 5px 5px 0px 0px;
- margin-right: 10px;
- padding: 10px 24px;
- font-family: Calibri,sans-serif;
- font-style: normal;
- font-size: 16px;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li.active a{
- background: #006D84;
- color: #fff;
- font-weight: 700;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li a i{
- color: #006D84;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li.active a i{
- color: #fff;
-}
-
-form#organization-datasets-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#organization-datasets-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#organization-datasets-search-form input + .input-group-btn{
- display: none;
-}
-
-form#organization-datasets-search-form + ul.media-grid{
- background-color: #E1E1E1;
- border-radius: 5px;
- padding: 24px;
-}
-
-form#organization-datasets-search-form + ul.media-grid li {
- border-radius: 5px;
-}
-
-/* End Single organization Page */
-
-/* Start Datasets Page */
-form#dataset-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#dataset-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#dataset-search-form input + .input-group-btn{
- display: none;
-}
-/* End Datasets Page */
-
-/* Start Dataset List */
-.dataset-list li{
- padding: 14px 16px;
- background-color: #E5E5E5;
- border-radius: 5px;
-}
-
-.dataset-list li h2{
- font-family: Calibri, sans-serif;
- font-style: normal;
- font-weight: 700;
- font-size: 24px;
- line-height: 29px;
- color: #000000;
-}
-
-
-.dataset-list li .empty{
- font-family: Calibri, sans-serif;
- font-style: italic;
- font-weight: 400;
- font-size: 16px;
- line-height: 20px;
- color: #000000;
-}
-
-
-/* Scheming multiple select with sublists */
-.multi-select ul, .multi-select ul .sub-items {
- list-style: none; /* Removes list bullets */
- padding-left: 0; /* Removes list padding */
- margin-left: 0; /* Aligns with the multi-select container */
-}
-
-/* Main category title styles */
-/* Resets */
-.multi-select,
-.multi-select ul,
-.multi-select ul .sub-items {
- list-style: none; /* Removes bullets */
- padding-left: 0; /* Removes indentation */
- margin: 0; /* Removes default margin */
- margin-left: 10px; /* Indents the main category labels */
-}
-
-/* Styles for the main category labels and toggle arrow */
-.multi-select > ul > li > label {
- cursor: pointer; /* Indicates the element is clickable */
- vertical-align: middle; /* Aligns with the toggle arrow */
- font-weight: normal; /* No bold font */
-}
-
-.toggle-sublist {
- cursor: pointer; /* Indicates it's clickable */
- user-select: none; /* Prevents text selection */
- margin-right: 5px; /* Spacing between arrow and label */
-}
-
-/* Styles for sub-items list */
-.multi-select .sub-items {
- display: none; /* Hide by default */
- margin-top: 5px; /* Space between category label and sublist items */
- padding-left: 30px; /* Aligns sublist items with the main items */
-}
-
-/* Styles for sublist items (labels and checkboxes) */
-.sub-items li {
- display: flex;
- align-items: center; /* Center aligns items vertically */
- margin-bottom: 5px; /* Space between sublist items */
-}
-
-.sub-items li input[type="checkbox"] {
- width: auto; /* Adjusts checkbox width */
- margin-right: 10px; /* Space between checkbox and label */
- margin-left: 20px; /* Indent checkbox to align with sublist items */
-}
-
-.sub-items li label {
- font-weight: normal; /* No bold font */
- white-space: nowrap; /* Ensures label text does not wrap */
-}
-
-/* Remove the :after content on labels, if it exists */
-.sub-items li label::after {
- content: none;
-}
-
-.btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- box-sizing: border-box;
- padding: 6px 16px;
- height: 32px;
- border-radius: 5px;
- font-family: Calibri , sans-serif;
- font-style: normal;
- font-weight: 700;
- font-size: 16px;
- margin-left: 17px;
- gap: 2px;
-}
-
-.btn-primary {
- background: #006D84;
-}
-
-.btn-default {
- background: #FFFFFF;
- border: 2px solid #006D84;
- color: #006D84;
-}
-
-.btn-default:hover, .btn-default:focus {
- border-color: #006D84;
- background-color: #FAFAFA;
- color: #006D84;
-}
-
-.no-nav .col-md-9 {
- width: 100%;
-}
-
-.row {
- background-color: transparent;
-}
-
-/* Start Organizations Page */
-.row:has(form#organization-search-form) {
- border: 2px solid #006D84;
- border-radius: 5px;
-}
-
-.row:has(form#organization-search-form)::before {
- display: none;
-}
-
-.row:has(form#organization-search-form) aside {
- border-right: 1px solid #006D84;
-}
-
-.row:has(form#organization-search-form) .module-heading {
- background-color: transparent;
- border-color: #006D84;
- font-style: normal;
- font-weight: 700;
- font-size: 16px;
- line-height: 20px;
- padding: 12px;
-}
-
-.row:has(form#organization-search-form) .module-heading i {
- margin-right: 2px;
-}
-
-.row:has(form#organization-search-form) .module-content p {
- font-style: normal;
- font-weight: 400;
- font-size: 14px;
- line-height: 17px;
- padding: 12px 0px;
-}
-
-form#organization-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#organization-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#organization-search-form input + .input-group-btn{
- display: none;
-}
-
-form#organization-search-form + ul.media-grid{
- background-color: #E1E1E1;
- border-radius: 5px;
- padding: 24px;
-}
-
-form#organization-search-form + ul.media-grid li {
- border-radius: 5px;
-}
-/* End Organizations Page */
-
-/* Start Single organization page */
-.row:has(header.module-content.page-header){
- border: 2px solid #006D84;
- border-radius: 5px;
- margin-bottom: 10px;
-}
-
-.row:has(header.module-content.page-header) aside {
- padding: 10px 0;
- border-right: 2px solid #006D84;
-}
-
-.row:has(header.module-content.page-header) aside h1{
- font-size: 24px;
- font-weight: 700;
-}
-
-.row:has(header.module-content.page-header) aside h1 + p{
- font-style: italic;
- font-weight: 400;
- font-size: 12px;
- color: #4E4E4E;
-}
-
-.row:has(header.module-content.page-header) aside dd span{
- font-weight: 700;
- font-size: 40px;
- line-height: 49px;
- color: #3D3D3D;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2{
- font-weight: 700;
- font-size: 14px;
- line-height: 17px;
- color: #000000;
- border:none;
- background-color: transparent;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2 i{
- display: none;
-}
-
-.row:has(header.module-content.page-header) aside .filters h2 + p{
- padding-top: 0;
- padding-bottom: 16px;
-}
-
-.row:has(header.module-content.page-header) div.primary{
- padding: 10px 0;
-}
-
-header.module-content.page-header, header.module-content.page-header .nav-tabs{
- border-bottom: none;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li a{
- background: #D9D9D9;
- color: #000;
- border-radius: 5px 5px 0px 0px;
- margin-right: 10px;
- padding: 10px 24px;
- font-family: Calibri,sans-serif;
- font-style: normal;
- font-size: 16px;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li.active a{
- background: #006D84;
- color: #fff;
- font-weight: 700;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li a i{
- color: #006D84;
-}
-
-.row:has(header.module-content.page-header) .nav-tabs li.active a i{
- color: #fff;
-}
-
-form#organization-datasets-search-form select{
- border: none;
- background-color: transparent;
- box-shadow: none;
-}
-
-form#organization-datasets-search-form input {
- border: 2px solid #006D84;
- border-radius: 10px;
- box-sizing: border-box;
- padding: 10px 26px;
-}
-
-form#organization-datasets-search-form input + .input-group-btn{
- display: none;
-}
-
-form#organization-datasets-search-form + ul.media-grid{
- background-color: #E1E1E1;
- border-radius: 5px;
- padding: 24px;
-}
-
-form#organization-datasets-search-form + ul.media-grid li {
- border-radius: 5px;
-}
\ No newline at end of file
+/* End Single organization Page */
\ No newline at end of file
From 2a90f00cba9050554930672981b277bf5106eba7 Mon Sep 17 00:00:00 2001
From: Sagar Ghimire
Date: Mon, 8 Apr 2024 12:18:56 +0545
Subject: [PATCH 07/22] [Improve][s]: User shoudn't be able edit dataset that
are already submitted for review
---
ckanext/datasetapproval/actions.py | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 16404bc..a3a88f0 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -29,9 +29,16 @@ def is_user_admin_of_org(org_id, user_id):
def publishing_check(context, data_dict):
- if context.get("allow_publish") or data_dict.get("state") == "inreview":
- return data_dict
- data_dict["state"] = "draft"
+ user_id = (
+ tk.current_user.id
+ if tk.current_user and not tk.current_user.is_anonymous
+ else None
+ )
+ org_id = data_dict.get("owner_org")
+ is_active = data_dict.get("state") in ["active", "publish", None, False]
+ if (is_user_is_editor(org_id, user_id) or is_unowned_dataset(org_id)) and is_active:
+ mailer.mail_package_review_request_to_admins(context, data_dict)
+ data_dict["state"] = "inreview"
return data_dict
def _add_or_update_org(context, package_dict):
From be320d6943f4226493fce0c57ae4022bdeb290d9 Mon Sep 17 00:00:00 2001
From: Sagar Ghimire
Date: Mon, 8 Apr 2024 14:19:11 +0545
Subject: [PATCH 08/22] [Fix][xs]: When sysadmin update dataset don't change
the state of inreview
---
ckanext/datasetapproval/actions.py | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index a3a88f0..73a5ea2 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -36,9 +36,24 @@ def publishing_check(context, data_dict):
)
org_id = data_dict.get("owner_org")
is_active = data_dict.get("state") in ["active", "publish", None, False]
- if (is_user_is_editor(org_id, user_id) or is_unowned_dataset(org_id)) and is_active:
+
+ is_user_editor = is_user_editor_of_org(org_id, user_id)
+ is_user_admin = is_user_admin_of_org(org_id, user_id)
+ is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin
+
+ if (is_user_editor or is_unowned_dataset(org_id)) and is_active:
mailer.mail_package_review_request_to_admins(context, data_dict)
data_dict["state"] = "inreview"
+
+ # if sysadmin is updating the dataset and it's already in review state
+ # then it should remain in review state
+ if data_dict.get("id"):
+ old_data_dict = tk.get_action("package_show")(
+ context, {"id": data_dict.get("id")}
+ )
+ if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview":
+ data_dict["state"] = old_data_dict.get("state")
+
return data_dict
def _add_or_update_org(context, package_dict):
From 68d156ea2093ef15dd16eddb903a7453c165b569 Mon Sep 17 00:00:00 2001
From: Sagar Ghimire
Date: Mon, 8 Apr 2024 18:39:03 +0545
Subject: [PATCH 09/22] [Fix][xs]: Cannot approve and reject bug fix
---
ckanext/datasetapproval/actions.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 73a5ea2..21ba6e7 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -47,13 +47,13 @@ def publishing_check(context, data_dict):
# if sysadmin is updating the dataset and it's already in review state
# then it should remain in review state
- if data_dict.get("id"):
+ _action_review = context.get("_action_review", False)
+ if not _action_review and data_dict.get("id"):
old_data_dict = tk.get_action("package_show")(
context, {"id": data_dict.get("id")}
)
if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview":
data_dict["state"] = old_data_dict.get("state")
-
return data_dict
def _add_or_update_org(context, package_dict):
@@ -197,7 +197,7 @@ def dataset_review(context, data_dict):
tk.get_action("package_patch")(
{
**context,
- "allow_publish": True,
+ "_action_review": True,
},
{"id": id, "state": states[action]},
)
From 726dcfaff6bf741643f42b5c3d1b3ff0dbf4759e Mon Sep 17 00:00:00 2001
From: Sagar Ghimire
Date: Thu, 11 Apr 2024 16:26:16 +0545
Subject: [PATCH 10/22] [Fix][xs]: Dataset publish step
---
ckanext/datasetapproval/actions.py | 42 +++++--------------
ckanext/datasetapproval/dataset_schema.yaml | 18 +++++---
ckanext/datasetapproval/plugin.py | 1 -
.../templates/package/read.html | 29 +++++--------
ckanext/datasetapproval/views/review.py | 5 +--
5 files changed, 36 insertions(+), 59 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 21ba6e7..f4904d9 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -29,31 +29,9 @@ def is_user_admin_of_org(org_id, user_id):
def publishing_check(context, data_dict):
- user_id = (
- tk.current_user.id
- if tk.current_user and not tk.current_user.is_anonymous
- else None
- )
- org_id = data_dict.get("owner_org")
- is_active = data_dict.get("state") in ["active", "publish", None, False]
-
- is_user_editor = is_user_editor_of_org(org_id, user_id)
- is_user_admin = is_user_admin_of_org(org_id, user_id)
- is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin
-
- if (is_user_editor or is_unowned_dataset(org_id)) and is_active:
- mailer.mail_package_review_request_to_admins(context, data_dict)
- data_dict["state"] = "inreview"
-
- # if sysadmin is updating the dataset and it's already in review state
- # then it should remain in review state
- _action_review = context.get("_action_review", False)
- if not _action_review and data_dict.get("id"):
- old_data_dict = tk.get_action("package_show")(
- context, {"id": data_dict.get("id")}
- )
- if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview":
- data_dict["state"] = old_data_dict.get("state")
+ if context.get("allow_publish"):
+ return data_dict
+ data_dict["state"] = "draft"
return data_dict
def _add_or_update_org(context, package_dict):
@@ -166,22 +144,24 @@ def publish_dataset(context, id):
else None
)
org_id = data_dict.get("owner_org")
+ data_dict["state"] = "active"
+ is_user_editor = is_user_editor_of_org(org_id, user_id)
is_user_admin = is_user_admin_of_org(org_id, user_id)
is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin
- if is_user_admin or is_sysadmin:
- data_dict["state"] = "active"
- else:
+ if is_user_editor or is_unowned_dataset(org_id):
mailer.mail_package_review_request_to_admins(context, data_dict)
data_dict["state"] = "inreview"
+
try:
- result = tk.get_action("package_update")(
+ data = tk.get_action("package_update")(
{**context, "allow_publish": True}, data_dict
)
+ print(data)
except Exception as e:
raise tk.ValidationError(str(e))
- return {"success": True, "package": result}
+ return {"success": True}
def dataset_review(context, data_dict):
@@ -197,7 +177,7 @@ def dataset_review(context, data_dict):
tk.get_action("package_patch")(
{
**context,
- "_action_review": True,
+ "allow_publish": True,
},
{"id": id, "state": states[action]},
)
diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml
index 6a8c801..cd5f5d7 100644
--- a/ckanext/datasetapproval/dataset_schema.yaml
+++ b/ckanext/datasetapproval/dataset_schema.yaml
@@ -333,6 +333,19 @@ dataset_fields:
# form_snippet: null
# display_snippet: text.html
+- field_name: releaseDate
+ label: Release date
+ preset: date
+ required: true
+ validators: not_empty
+ form_placeholder: eg. 2024-01-15
+
+- field_name: creators
+ label: Creators
+ preset: multiple_text
+ validators: ignore_missing unicode_safe
+ form_snippet: multiple_text.html
+ display_snippet: multiple_text.html
- field_name: language
label: Language
@@ -455,11 +468,6 @@ dataset_fields:
display_snippet: text.html
form_snippet: null
-- field_name: terms_agreed
- label: Terms
- form_snippet: null
- display_snippet: null
- validators: ignore_missing
resource_fields:
diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py
index ac73b93..8c0c40b 100644
--- a/ckanext/datasetapproval/plugin.py
+++ b/ckanext/datasetapproval/plugin.py
@@ -54,7 +54,6 @@ def get_actions(self):
"package_update": actions.package_update,
"dataset_review": actions.dataset_review,
"publish_dataset": actions.publish_dataset,
- "org_autocomplete": actions.org_autocomplete
}
# ITemplateHelpers
diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html
index e2f03cb..6235a26 100644
--- a/ckanext/datasetapproval/templates/package/read.html
+++ b/ckanext/datasetapproval/templates/package/read.html
@@ -2,28 +2,19 @@
{% block package_description %}
{% if (c.pkg_dict.state == "draft") %}
-
- {% if h.check_access('dataset_review', {'dataset_id':c.pkg.id }) %}
-
{% trans %}
- As an admin, you can publish this draft dataset directly. Please ensure all details are updated correctly before making it public. If changes are needed, you can return to the dataset manage page.
- {% endtrans %}
-
- {% trans %}Publish{% endtrans %}
-
- {% else %}
-
{% trans %}
- Your dataset is currently in draft. Please ensure all details are accurate before submitting for publication.
- Once ready, you can either submit your dataset for review or return to the dataset manage page to make further changes.
- {% endtrans %}
-
-
- {% trans %}Submit to review{% endtrans %}
-
- {% endif %}
+
+
{% trans %}
+ Your dataset is in draft. Ensure all details are correct before review. Click 'Send for Review' when ready, or if you wish to revisit and manage your dataset, click the 'Manage Dataset' button.
+ {% endtrans %}
+
+
+
{% endif %}
{% if (c.pkg_dict.state == "inreview") and h.check_access("dataset_review",{"dataset_id":c.pkg_dict.id }) %}
diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py
index 67db504..3e5f33c 100644
--- a/ckanext/datasetapproval/views/review.py
+++ b/ckanext/datasetapproval/views/review.py
@@ -103,9 +103,8 @@ def review_action(id, action):
"session": model.Session,
"user": tk.c.user,
}
- result = tk.get_action("publish_dataset")(context, id)
- if result.get("package").get("state") == "active":
- tk.h.flash_success(tk._("Dataset has been published."))
+ tk.get_action("publish_dataset")(context, id)
+ tk.h.flash_success(tk._("Dataset has been published."))
return tk.redirect_to(controller="dataset", action="read", id=id)
data_dict = {"dataset_id": id, "action": action}
From 7fa372aac8fcdb0644f8f7f167da0b22f2457a0e Mon Sep 17 00:00:00 2001
From: Sagar Ghimire
Date: Thu, 11 Apr 2024 17:35:09 +0545
Subject: [PATCH 11/22] [Fix][s] Different message admin and editor also admin
can edit dataset while in review
---
ckanext/datasetapproval/actions.py | 13 ++++-----
.../templates/package/read.html | 29 ++++++++++++-------
2 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index f4904d9..2d4eb1f 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -29,7 +29,7 @@ def is_user_admin_of_org(org_id, user_id):
def publishing_check(context, data_dict):
- if context.get("allow_publish"):
+ if context.get("allow_publish") or data_dict.get("state") == "inreview":
return data_dict
data_dict["state"] = "draft"
return data_dict
@@ -144,20 +144,19 @@ def publish_dataset(context, id):
else None
)
org_id = data_dict.get("owner_org")
- data_dict["state"] = "active"
- is_user_editor = is_user_editor_of_org(org_id, user_id)
is_user_admin = is_user_admin_of_org(org_id, user_id)
is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin
- if is_user_editor or is_unowned_dataset(org_id):
+ if not is_user_admin or not is_sysadmin:
mailer.mail_package_review_request_to_admins(context, data_dict)
data_dict["state"] = "inreview"
-
+ else:
+ data_dict["state"] = "active"
+
try:
- data = tk.get_action("package_update")(
+ tk.get_action("package_update")(
{**context, "allow_publish": True}, data_dict
)
- print(data)
except Exception as e:
raise tk.ValidationError(str(e))
diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html
index 6235a26..c848e61 100644
--- a/ckanext/datasetapproval/templates/package/read.html
+++ b/ckanext/datasetapproval/templates/package/read.html
@@ -2,19 +2,28 @@
{% block package_description %}
{% if (c.pkg_dict.state == "draft") %}
-
-
{% trans %}
- Your dataset is in draft. Ensure all details are correct before review. Click 'Send for Review' when ready, or if you wish to revisit and manage your dataset, click the 'Manage Dataset' button.
- {% endtrans %}
-
+
{% endif %}
{% if (c.pkg_dict.state == "inreview") and h.check_access("dataset_review",{"dataset_id":c.pkg_dict.id }) %}
From 8e40858fe6d794849e75fdc8a2afca8c503e378e Mon Sep 17 00:00:00 2001
From: Demenech
Date: Mon, 15 Apr 2024 20:43:18 -0300
Subject: [PATCH 12/22] feat(dataset): add steps to dataset creation
---
ckanext/datasetapproval/templates/package/read.html | 2 +-
ckanext/datasetapproval/templates/page.html | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html
index c848e61..e2f03cb 100644
--- a/ckanext/datasetapproval/templates/package/read.html
+++ b/ckanext/datasetapproval/templates/package/read.html
@@ -17,7 +17,7 @@
{% endtrans %}
- {% trans %}Send for Review{% endtrans %}
+ {% trans %}Submit to review{% endtrans %}
{% endif %}
diff --git a/ckanext/datasetapproval/templates/page.html b/ckanext/datasetapproval/templates/page.html
index 8fc7544..d1bfe45 100644
--- a/ckanext/datasetapproval/templates/page.html
+++ b/ckanext/datasetapproval/templates/page.html
@@ -2,7 +2,6 @@
{% block styles %}
{{ super() }}
{% asset 'datasetapproval/datasetapproval_css' %}
- {% asset 'datasetapproval/datasetapproval_js' %}
{% endblock %}
{% block primary %}
From 0bedb3e235066a701704c2d8167e3c1ff7386983 Mon Sep 17 00:00:00 2001
From: Demenech
Date: Mon, 15 Apr 2024 20:55:56 -0300
Subject: [PATCH 13/22] fix(dataset): prevent 'published' message from showing
when user submits a dataset to review
---
ckanext/datasetapproval/actions.py | 4 ++--
ckanext/datasetapproval/views/review.py | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 2d4eb1f..6cc7544 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -154,13 +154,13 @@ def publish_dataset(context, id):
data_dict["state"] = "active"
try:
- tk.get_action("package_update")(
+ result = tk.get_action("package_update")(
{**context, "allow_publish": True}, data_dict
)
except Exception as e:
raise tk.ValidationError(str(e))
- return {"success": True}
+ return {"success": True, "package": result }
def dataset_review(context, data_dict):
diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py
index 3e5f33c..99fe03a 100644
--- a/ckanext/datasetapproval/views/review.py
+++ b/ckanext/datasetapproval/views/review.py
@@ -103,8 +103,9 @@ def review_action(id, action):
"session": model.Session,
"user": tk.c.user,
}
- tk.get_action("publish_dataset")(context, id)
- tk.h.flash_success(tk._("Dataset has been published."))
+ result = tk.get_action("publish_dataset")(context, id)
+ if result.get("package").get("state") != "inreview":
+ tk.h.flash_success(tk._("Dataset has been published."))
return tk.redirect_to(controller="dataset", action="read", id=id)
data_dict = {"dataset_id": id, "action": action}
From 79bce651624b9dd53700a8237a8e7a6bc9718c99 Mon Sep 17 00:00:00 2001
From: Demenech
Date: Mon, 15 Apr 2024 21:03:53 -0300
Subject: [PATCH 14/22] fix(dataset): fix sysadmin not being able to directly
publish dataset
---
ckanext/datasetapproval/actions.py | 9 ++++-----
ckanext/datasetapproval/views/review.py | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 6cc7544..16404bc 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -147,12 +147,11 @@ def publish_dataset(context, id):
is_user_admin = is_user_admin_of_org(org_id, user_id)
is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin
- if not is_user_admin or not is_sysadmin:
+ if is_user_admin or is_sysadmin:
+ data_dict["state"] = "active"
+ else:
mailer.mail_package_review_request_to_admins(context, data_dict)
data_dict["state"] = "inreview"
- else:
- data_dict["state"] = "active"
-
try:
result = tk.get_action("package_update")(
{**context, "allow_publish": True}, data_dict
@@ -160,7 +159,7 @@ def publish_dataset(context, id):
except Exception as e:
raise tk.ValidationError(str(e))
- return {"success": True, "package": result }
+ return {"success": True, "package": result}
def dataset_review(context, data_dict):
diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py
index 99fe03a..67db504 100644
--- a/ckanext/datasetapproval/views/review.py
+++ b/ckanext/datasetapproval/views/review.py
@@ -104,7 +104,7 @@ def review_action(id, action):
"user": tk.c.user,
}
result = tk.get_action("publish_dataset")(context, id)
- if result.get("package").get("state") != "inreview":
+ if result.get("package").get("state") == "active":
tk.h.flash_success(tk._("Dataset has been published."))
return tk.redirect_to(controller="dataset", action="read", id=id)
From 87f569b78efe190b11164d88c0546bb3498d2608 Mon Sep 17 00:00:00 2001
From: Demenech
Date: Mon, 15 Apr 2024 21:23:36 -0300
Subject: [PATCH 15/22] feat(dataset): add custom org field with autocomplete
---
ckanext/datasetapproval/actions.py | 72 ++++++++------------
ckanext/datasetapproval/assets/webassets.yml | 2 +-
ckanext/datasetapproval/dataset_schema.yaml | 6 +-
ckanext/datasetapproval/plugin.py | 1 +
ckanext/datasetapproval/templates/page.html | 1 +
5 files changed, 35 insertions(+), 47 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 16404bc..3c4323a 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -4,8 +4,6 @@
from ckan.plugins import toolkit as tk
from ckanext.datasetapproval import mailer
from ckan import logic
-from ckanext.scheming.logic import scheming_dataset_schema_show
-from ckan import model
log = logging.getLogger()
@@ -65,54 +63,12 @@ def _add_or_update_org(context, package_dict):
return package_dict
-def get_dataset_schema():
- context = {
- 'model': model,
- 'session': model.Session,
- 'user': None,
- 'ignore_auth': True
- }
-
- data_dict = {
- 'type': 'dataset',
- 'expanded': True
- }
-
- try:
- schema_data = scheming_dataset_schema_show(context, data_dict)
- return schema_data
- except Exception as e:
- print(f"Error retrieving dataset schema: {e}")
- return None
-
-def clean_dictionary(data_dict):
- schema = get_dataset_schema()
- keys = []
-
- for field_info in schema.get('dataset_fields', []):
- if "repeating_subfields" in field_info.keys():
- keys.append(field_info['field_name'])
-
- cleaned_dict = dict(data_dict)
-
- for key in keys:
- if key in cleaned_dict:
- remove_key = True
- for entry in cleaned_dict[key]:
- for value in entry.values():
- if value != "":
- remove_key = False
- break
- if remove_key:
- del cleaned_dict[key]
-
- return cleaned_dict
-
@tk.chained_action
def package_create(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
+ data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -122,6 +78,7 @@ def package_update(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
+ data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -131,6 +88,7 @@ def package_patch(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
+ data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -207,3 +165,27 @@ def _org_autocomplete(context, data_dict):
def org_autocomplete(context, data_dict):
logic.check_access('group_autocomplete', context, data_dict)
return _org_autocomplete(context, data_dict)
+
+
+def _org_autocomplete(context, data_dict):
+ q = data_dict['q']
+ limit = data_dict.get('limit', 20)
+ model = context['model']
+
+ query = model.Group.search_by_name_or_title(q, group_type="org",
+ is_org=False, limit=limit)
+
+ org_list = []
+ for group in query.all():
+ result_dict = {}
+ for k in ['id', 'name', 'title']:
+ result_dict[k] = getattr(group, k)
+ org_list.append(result_dict)
+
+ return org_list
+
+
+@tk.side_effect_free
+def org_autocomplete(context, data_dict):
+ logic.check_access('group_autocomplete', context, data_dict)
+ return _org_autocomplete(context, data_dict)
diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml
index d0b79ca..712190a 100644
--- a/ckanext/datasetapproval/assets/webassets.yml
+++ b/ckanext/datasetapproval/assets/webassets.yml
@@ -5,7 +5,6 @@ datasetapproval_js:
# - js/dataset-visibility.js
# - js/form-submit.js
- js/org-autocomplete.js
- - js/multiple-sublists.js
extra:
preload:
- base/main
@@ -15,3 +14,4 @@ datasetapproval_css:
output: ckanext-datasetapproval/%(version)s-approval.css
contents:
- css/approval.css
+
diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml
index cd5f5d7..60cf908 100644
--- a/ckanext/datasetapproval/dataset_schema.yaml
+++ b/ckanext/datasetapproval/dataset_schema.yaml
@@ -16,6 +16,10 @@ dataset_fields:
preset: dataset_slug
form_placeholder: eg. my-dataset
+- field_name: org
+ label: Organization
+ preset: org_autocomplete
+
- field_name: tag_string
label: Keywords
preset: tag_string_autocomplete
@@ -487,4 +491,4 @@ resource_fields:
- field_name: format
label: Format
- preset: resource_format_autocomplete
\ No newline at end of file
+ preset: resource_format_autocomplete
diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py
index 8c0c40b..ac73b93 100644
--- a/ckanext/datasetapproval/plugin.py
+++ b/ckanext/datasetapproval/plugin.py
@@ -54,6 +54,7 @@ def get_actions(self):
"package_update": actions.package_update,
"dataset_review": actions.dataset_review,
"publish_dataset": actions.publish_dataset,
+ "org_autocomplete": actions.org_autocomplete
}
# ITemplateHelpers
diff --git a/ckanext/datasetapproval/templates/page.html b/ckanext/datasetapproval/templates/page.html
index d1bfe45..8fc7544 100644
--- a/ckanext/datasetapproval/templates/page.html
+++ b/ckanext/datasetapproval/templates/page.html
@@ -2,6 +2,7 @@
{% block styles %}
{{ super() }}
{% asset 'datasetapproval/datasetapproval_css' %}
+ {% asset 'datasetapproval/datasetapproval_js' %}
{% endblock %}
{% block primary %}
From de887b3146752ff3d325e9910fd5602b39e4c4fb Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 15:40:02 +0200
Subject: [PATCH 16/22] modified orgs pages
---
ckanext/datasetapproval/assets/css/approval.css | 5 -----
1 file changed, 5 deletions(-)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 9aa6dbb..175c120 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -9,11 +9,6 @@
color: #006D84 !important;
}
-/* .breadcrumb */
-.breadcrumb .active a{
- color: #006D84 !important;
-}
-
/* Main CSS */
.main {
From 7104934da0f4d07d95b1e6823e4072ded51d3e5c Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 20:41:21 +0200
Subject: [PATCH 17/22] added some styles
---
ckanext/datasetapproval/assets/css/approval.css | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 175c120..a6cb464 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -563,6 +563,11 @@ form#organization-search-form + ul.media-grid li {
border-bottom: 1px solid #006D84;;
}
+.row:has(header.module-content.page-header) aside .nums{
+ border-top: 1px solid #006D84;
+ border-bottom: 1px solid #006D84;;
+}
+
.row:has(header.module-content.page-header) aside dd span{
font-weight: 700;
font-size: 40px;
From 58375b139bcbad77bf585133fe2656f5ebb49876 Mon Sep 17 00:00:00 2001
From: gavram
Date: Tue, 16 Apr 2024 10:30:24 +0200
Subject: [PATCH 18/22] Dataset schema corrected, not final version
---
ckanext/datasetapproval/dataset_schema.yaml | 24 ++++++---------------
1 file changed, 6 insertions(+), 18 deletions(-)
diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml
index 60cf908..6a8c801 100644
--- a/ckanext/datasetapproval/dataset_schema.yaml
+++ b/ckanext/datasetapproval/dataset_schema.yaml
@@ -16,10 +16,6 @@ dataset_fields:
preset: dataset_slug
form_placeholder: eg. my-dataset
-- field_name: org
- label: Organization
- preset: org_autocomplete
-
- field_name: tag_string
label: Keywords
preset: tag_string_autocomplete
@@ -337,19 +333,6 @@ dataset_fields:
# form_snippet: null
# display_snippet: text.html
-- field_name: releaseDate
- label: Release date
- preset: date
- required: true
- validators: not_empty
- form_placeholder: eg. 2024-01-15
-
-- field_name: creators
- label: Creators
- preset: multiple_text
- validators: ignore_missing unicode_safe
- form_snippet: multiple_text.html
- display_snippet: multiple_text.html
- field_name: language
label: Language
@@ -472,6 +455,11 @@ dataset_fields:
display_snippet: text.html
form_snippet: null
+- field_name: terms_agreed
+ label: Terms
+ form_snippet: null
+ display_snippet: null
+ validators: ignore_missing
resource_fields:
@@ -491,4 +479,4 @@ resource_fields:
- field_name: format
label: Format
- preset: resource_format_autocomplete
+ preset: resource_format_autocomplete
\ No newline at end of file
From 58f88486d8bb77ff56228a7c164ed17d32868084 Mon Sep 17 00:00:00 2001
From: gavram
Date: Tue, 16 Apr 2024 10:31:24 +0200
Subject: [PATCH 19/22] Add support for multiple select sublists and hyperlinks
rendering
---
ckanext/datasetapproval/actions.py | 45 ++++++++++++++
.../datasetapproval/assets/css/approval.css | 61 +++++++++++++++++++
ckanext/datasetapproval/assets/webassets.yml | 1 +
3 files changed, 107 insertions(+)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index 3c4323a..d98b028 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -4,6 +4,8 @@
from ckan.plugins import toolkit as tk
from ckanext.datasetapproval import mailer
from ckan import logic
+from ckanext.scheming.logic import scheming_dataset_schema_show
+from ckan import model
log = logging.getLogger()
@@ -63,6 +65,49 @@ def _add_or_update_org(context, package_dict):
return package_dict
+def get_dataset_schema():
+ context = {
+ 'model': model,
+ 'session': model.Session,
+ 'user': None,
+ 'ignore_auth': True
+ }
+
+ data_dict = {
+ 'type': 'dataset',
+ 'expanded': True
+ }
+
+ try:
+ schema_data = scheming_dataset_schema_show(context, data_dict)
+ return schema_data
+ except Exception as e:
+ print(f"Error retrieving dataset schema: {e}")
+ return None
+
+def clean_dictionary(data_dict):
+ schema = get_dataset_schema()
+ keys = []
+
+ for field_info in schema.get('dataset_fields', []):
+ if "repeating_subfields" in field_info.keys():
+ keys.append(field_info['field_name'])
+
+ cleaned_dict = dict(data_dict)
+
+ for key in keys:
+ if key in cleaned_dict:
+ remove_key = True
+ for entry in cleaned_dict[key]:
+ for value in entry.values():
+ if value != "":
+ remove_key = False
+ break
+ if remove_key:
+ del cleaned_dict[key]
+
+ return cleaned_dict
+
@tk.chained_action
def package_create(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index a6cb464..26ef9b1 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -430,6 +430,67 @@
content: none;
}
+/* Scheming multiple select with sublists */
+.multi-select ul, .multi-select ul .sub-items {
+ list-style: none; /* Removes list bullets */
+ padding-left: 0; /* Removes list padding */
+ margin-left: 0; /* Aligns with the multi-select container */
+}
+
+/* Main category title styles */
+/* Resets */
+.multi-select,
+.multi-select ul,
+.multi-select ul .sub-items {
+ list-style: none; /* Removes bullets */
+ padding-left: 0; /* Removes indentation */
+ margin: 0; /* Removes default margin */
+ margin-left: 10px; /* Indents the main category labels */
+}
+
+/* Styles for the main category labels and toggle arrow */
+.multi-select > ul > li > label {
+ cursor: pointer; /* Indicates the element is clickable */
+ vertical-align: middle; /* Aligns with the toggle arrow */
+ font-weight: normal; /* No bold font */
+}
+
+.toggle-sublist {
+ cursor: pointer; /* Indicates it's clickable */
+ user-select: none; /* Prevents text selection */
+ margin-right: 5px; /* Spacing between arrow and label */
+}
+
+/* Styles for sub-items list */
+.multi-select .sub-items {
+ display: none; /* Hide by default */
+ margin-top: 5px; /* Space between category label and sublist items */
+ padding-left: 30px; /* Aligns sublist items with the main items */
+}
+
+/* Styles for sublist items (labels and checkboxes) */
+.sub-items li {
+ display: flex;
+ align-items: center; /* Center aligns items vertically */
+ margin-bottom: 5px; /* Space between sublist items */
+}
+
+.sub-items li input[type="checkbox"] {
+ width: auto; /* Adjusts checkbox width */
+ margin-right: 10px; /* Space between checkbox and label */
+ margin-left: 20px; /* Indent checkbox to align with sublist items */
+}
+
+.sub-items li label {
+ font-weight: normal; /* No bold font */
+ white-space: nowrap; /* Ensures label text does not wrap */
+}
+
+/* Remove the :after content on labels, if it exists */
+.sub-items li label::after {
+ content: none;
+}
+
.btn {
display: inline-flex;
align-items: center;
diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml
index 712190a..69cab7c 100644
--- a/ckanext/datasetapproval/assets/webassets.yml
+++ b/ckanext/datasetapproval/assets/webassets.yml
@@ -5,6 +5,7 @@ datasetapproval_js:
# - js/dataset-visibility.js
# - js/form-submit.js
- js/org-autocomplete.js
+ - js/multiple-sublists.js
extra:
preload:
- base/main
From 01cbcefbc525b29de900f090e7005819ae369ec2 Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Tue, 16 Apr 2024 15:40:02 +0200
Subject: [PATCH 20/22] modified orgs pages
---
ckanext/datasetapproval/assets/css/approval.css | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 26ef9b1..708b5d4 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -9,6 +9,11 @@
color: #006D84 !important;
}
+/* .breadcrumb */
+.breadcrumb .active a{
+ color: #006D84 !important;
+}
+
/* Main CSS */
.main {
From 90c787debb0232ab7b04a2d8ab179eb9568819dc Mon Sep 17 00:00:00 2001
From: gavram
Date: Tue, 16 Apr 2024 10:31:24 +0200
Subject: [PATCH 21/22] Add support for multiple select sublists and hyperlinks
rendering
---
.../datasetapproval/assets/css/approval.css | 61 +++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css
index 36384b1..656a073 100644
--- a/ckanext/datasetapproval/assets/css/approval.css
+++ b/ckanext/datasetapproval/assets/css/approval.css
@@ -496,6 +496,67 @@
content: none;
}
+/* Scheming multiple select with sublists */
+.multi-select ul, .multi-select ul .sub-items {
+ list-style: none; /* Removes list bullets */
+ padding-left: 0; /* Removes list padding */
+ margin-left: 0; /* Aligns with the multi-select container */
+}
+
+/* Main category title styles */
+/* Resets */
+.multi-select,
+.multi-select ul,
+.multi-select ul .sub-items {
+ list-style: none; /* Removes bullets */
+ padding-left: 0; /* Removes indentation */
+ margin: 0; /* Removes default margin */
+ margin-left: 10px; /* Indents the main category labels */
+}
+
+/* Styles for the main category labels and toggle arrow */
+.multi-select > ul > li > label {
+ cursor: pointer; /* Indicates the element is clickable */
+ vertical-align: middle; /* Aligns with the toggle arrow */
+ font-weight: normal; /* No bold font */
+}
+
+.toggle-sublist {
+ cursor: pointer; /* Indicates it's clickable */
+ user-select: none; /* Prevents text selection */
+ margin-right: 5px; /* Spacing between arrow and label */
+}
+
+/* Styles for sub-items list */
+.multi-select .sub-items {
+ display: none; /* Hide by default */
+ margin-top: 5px; /* Space between category label and sublist items */
+ padding-left: 30px; /* Aligns sublist items with the main items */
+}
+
+/* Styles for sublist items (labels and checkboxes) */
+.sub-items li {
+ display: flex;
+ align-items: center; /* Center aligns items vertically */
+ margin-bottom: 5px; /* Space between sublist items */
+}
+
+.sub-items li input[type="checkbox"] {
+ width: auto; /* Adjusts checkbox width */
+ margin-right: 10px; /* Space between checkbox and label */
+ margin-left: 20px; /* Indent checkbox to align with sublist items */
+}
+
+.sub-items li label {
+ font-weight: normal; /* No bold font */
+ white-space: nowrap; /* Ensures label text does not wrap */
+}
+
+/* Remove the :after content on labels, if it exists */
+.sub-items li label::after {
+ content: none;
+}
+
.btn {
display: inline-flex;
align-items: center;
From 7ae0199a5d6096e1b89e5bbad569192a2c0fa1d7 Mon Sep 17 00:00:00 2001
From: mohamedsalem401
Date: Wed, 17 Apr 2024 10:00:21 +0200
Subject: [PATCH 22/22] Remove unwanted changes
---
ckanext/datasetapproval/actions.py | 29 +-------------------
ckanext/datasetapproval/assets/webassets.yml | 1 -
2 files changed, 1 insertion(+), 29 deletions(-)
diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py
index d98b028..fd43909 100644
--- a/ckanext/datasetapproval/actions.py
+++ b/ckanext/datasetapproval/actions.py
@@ -113,7 +113,6 @@ def package_create(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
- data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -123,7 +122,6 @@ def package_update(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
- data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -133,7 +131,6 @@ def package_patch(up_func, context, data_dict):
data_dict = clean_dictionary(data_dict)
publishing_check(context, data_dict)
data_dict = _add_or_update_org(context, data_dict)
- data_dict = _add_or_update_org(context, data_dict)
result = up_func(context, data_dict)
return result
@@ -209,28 +206,4 @@ def _org_autocomplete(context, data_dict):
@tk.side_effect_free
def org_autocomplete(context, data_dict):
logic.check_access('group_autocomplete', context, data_dict)
- return _org_autocomplete(context, data_dict)
-
-
-def _org_autocomplete(context, data_dict):
- q = data_dict['q']
- limit = data_dict.get('limit', 20)
- model = context['model']
-
- query = model.Group.search_by_name_or_title(q, group_type="org",
- is_org=False, limit=limit)
-
- org_list = []
- for group in query.all():
- result_dict = {}
- for k in ['id', 'name', 'title']:
- result_dict[k] = getattr(group, k)
- org_list.append(result_dict)
-
- return org_list
-
-
-@tk.side_effect_free
-def org_autocomplete(context, data_dict):
- logic.check_access('group_autocomplete', context, data_dict)
- return _org_autocomplete(context, data_dict)
+ return _org_autocomplete(context, data_dict)
\ No newline at end of file
diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml
index 69cab7c..d0b79ca 100644
--- a/ckanext/datasetapproval/assets/webassets.yml
+++ b/ckanext/datasetapproval/assets/webassets.yml
@@ -15,4 +15,3 @@ datasetapproval_css:
output: ckanext-datasetapproval/%(version)s-approval.css
contents:
- css/approval.css
-