diff --git a/.gitignore b/.gitignore index 87bc84f..5ad4e7a 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,5 @@ tailwind.config.js Capfile config/deploy.rb config/deploy + +lib/assets/custom_census.csv diff --git a/README.md b/README.md index 7db0aaf..affc35c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,22 @@ Free Open-Source participatory democracy, citizen participation and open governm This is the open-source repository for decidim_inspire, based on [Decidim](https://github.com/decidim/decidim). +## Custom census authorization handler + +This authorization handler allows users to be directly verified with their birthdates by checking the census in a CSV file. + +You need to create a CSV file `lib/asses/census.csv` with two columns: `email` and `birthdate`. For example: + +```csv +email,date_of_birth +john.doe@example.org,1956-03-14 +jane.smith@example.org,1998-12-06 +``` + +The verification will succeed if the user is in the census and introduces the same birthdate as the one in the CSV. + +This authorization handler will allow us to work with the [Decidim Kids](https://github.com/AjuntamentdeBarcelona/decidim-module-kids) module. + ## Setting up the application You will need to do some steps before having the app working properly once you have deployed it: diff --git a/app/services/custom_census_authorization_handler.rb b/app/services/custom_census_authorization_handler.rb new file mode 100644 index 0000000..9f29d1f --- /dev/null +++ b/app/services/custom_census_authorization_handler.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +# Checks the authorization against the census for Barcelona. +require "digest/md5" + +# This class performs a check against the census file in order to verify the citizen's residence. +class CustomCensusAuthorizationHandler < Decidim::AuthorizationHandler + attribute :date_of_birth, Date + + validates :date_of_birth, presence: true + + validate :present_in_census + + def metadata + super.merge(date_of_birth: parsed_date_of_birth) + end + + def unique_id + Digest::MD5.hexdigest("#{user.email}-#{Rails.application.secrets.secret_key_base}") + end + + private + + def parsed_date_of_birth + @parsed_date_of_birth ||= date_of_birth&.strftime("%Y-%m-%d") + end + + def present_in_census + result = census.find { |row| row["email"] == user.email } + return errors.add(:base, I18n.t("custom_census_authorization_handler.errors.not_found")) unless result + + errors.add(:date_of_birth, I18n.t("custom_census_authorization_handler.errors.invalid_date_of_birth")) unless result["date_of_birth"] == parsed_date_of_birth + end + + def census + @census ||= CSV.read(Rails.root.join("lib/assets/custom_census.csv"), headers: true) + end +end diff --git a/app/views/custom_census_authorization/_form.html.erb b/app/views/custom_census_authorization/_form.html.erb new file mode 100644 index 0000000..5aaef1b --- /dev/null +++ b/app/views/custom_census_authorization/_form.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= form.date_select :date_of_birth, start_year: 1900, end_year: 1.year.ago.year, default: 20.years.ago, prompt: { day: t(".date_select.day"), month: t(".date_select.month"), year: t(".date_select.year") } %> +
+ + <%= form.hidden_field :handler_name %> +
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 621c5a1..e106c5b 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -11,3 +11,5 @@ ignore_missing: - layouts.decidim.footer.cc_by_license - layouts.decidim.footer.decidim_logo - layouts.decidim.footer.made_with_open_source + - custom_census_authorization.form.* + - custom_census_authorization_handler.errors.* diff --git a/config/initializers/decidim.rb b/config/initializers/decidim.rb index 253e436..1b35fa5 100644 --- a/config/initializers/decidim.rb +++ b/config/initializers/decidim.rb @@ -494,3 +494,9 @@ # Inform Decidim about the assets folder Decidim.register_assets_path File.expand_path("app/packs", Rails.application.root) + +Decidim::Verifications.register_workflow(:custom_census_authorization_handler) do |auth| + auth.form = "CustomCensusAuthorizationHandler" + auth.renewable = true + auth.time_between_renewals = 1.day +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 63f1c3e..12b9d2a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1 +1,27 @@ en: + activemodel: + attributes: + custom_census_authorization_handler: + date_of_birth: Date of birth + custom_census_authorization: + form: + date_select: + day: Day + month: Month + year: Year + custom_census_authorization_handler: + errors: + not_found: The user is not present in the census + invalid_date_of_birth: The date of birth is not correct + decidim: + authorization_handlers: + custom_census_authorization_handler: + explanation: Verify against the custom census authorization handler + fields: + date_of_birth: Date of birth + name: Custom census + verifications: + authorizations: + first_login: + actions: + custom_census_authorization_handler: Verify against the custom census authorization handler