participa

June 17, 2026 · View on GitHub

Citizen Participation and Open Government application.

This is the open-source repository for "participa", based on Decidim.

Customizations

  • Decidim::Home, customizes the main page of Decidim.
  • Decidim::Admin::SearchUser, adds a search bar to Admin/users dashboard.
  • Decidim::Process::Extended, customizes Decidim Participatory processes.
  • Decidim::Regulations, adds Regulations, a new type of Participatory process.
  • Decidim::Admin::Extended, customize admin menu adding custom configurations.
  • Decidim::Recaptcha, use recaptcha instead invisible captcha.
  • Static pages admin: adds attachment and gallery support to Decidim::Admin::StaticPage (form, command and controller helper) via decorators.
  • Proposals admin index: adds an "Attachments" column with ascending/descending sort support (see app/overrides/decidim/admin/proposals_index_attachments_th.rb, app/overrides/decidim/admin/proposals_tr_attachments_td.rb, and app/decorators/decidim/proposals/proposal_decorator.rb).

Decidim Core Overrides

Customizations applied on top of Decidim core via decorators (app/decorators/) and Deface view overrides (app/overrides/).

Google Maps URL for meetings

Adds an optional Google Maps URL field to in-person and hybrid meetings, allowing admins to link participants directly to the meeting location on Google Maps.

Behavior:

  • Field is visible only in the admin meeting form.
  • Shown/hidden dynamically by the existing meeting-type JavaScript: visible when type is In-person or Hybrid, hidden for Online.
  • On the public meeting show page, the address text becomes a clickable link that opens Google Maps in a new browser tab when a URL is set.
  • The address renders as plain text when no URL is set, or for online meetings.

Implementation files:

FilePurpose
db/migrate/20260427100000_add_google_maps_url_to_meetings.rbAdds google_maps_url column to decidim_meetings_meetings
app/decorators/decidim/meetings/admin/meeting_form_decorator.rbAdds google_maps_url attribute + URL validation to the admin form
app/decorators/decidim/meetings/admin/create_meeting_decorator.rbPersists google_maps_url when creating a meeting
app/decorators/decidim/meetings/admin/update_meeting_decorator.rbPersists google_maps_url when updating a meeting
app/overrides/decidim/meetings/admin/meetings/form_google_maps_url.rbDeface override — inserts the field in the admin form view
app/decorators/decidim/address_cell_decorator.rbDecorator — overrides AddressCell#address to wrap the address in a Google Maps link
config/locales/{en,ca,es}_meetings.ymlTranslations (new files)
config/locales/oc_meetings.ymlOccitan translations (updated)

Deploying the app

An opinionated guide to deploy this app to Heroku can be found at https://github.com/codegram/decidim-deploy-heroku.

Setting up the application

You will need to do some steps before having the app working properly once you've deployed it:

  1. Open a Rails console in the server: bundle exec rails console
  2. Create a System Admin user:
user = Decidim::System::Admin.new(email: <email>, password: <password>, password_confirmation: <password>)
user.save!
  1. Visit <your app url>/system and login with your system admin credentials
  2. Create a new organization. Check the locales you want to use for that organization, and select a default locale.
  3. Set the correct default host for the organization, otherwise the app will not work properly. Note that you need to include any subdomain you might be using.
  4. Fill the rest of the form and submit it.

You're good to go!

Machine translations

To enable automatic machine translations it should:

  1. be defined an "ENABLE_MACHINE_TRANSLATIONS" ENV var set to "true":
# Figjam example
ENABLE_MACHINE_TRANSLATIONS: "true"
  1. from "Configuration/Configuration" in the admin panel, the "Enable machine translations" checkbox must be selected and then click "Save". After that, a new "Machine translation display priority [] Original text first [x] Translated text first" option is displayed. Probably the second option is the more user friendly.

Testing

Run bin/rake decidim:generate_external_test_app to generate a dummy application to test both the application and the modules.

Require missing factories in spec/factories.rb

Add require "rails_helper" to your specs and execute them from the root directory, i.e.:

bundle exec rake --backtrace -t

# or

bundle exec rspec decidim-process-extended/spec/serializers/decidim/participatory_processes/participatory_process_serializer_spec.rb`

Open Data

Public information from Participatory processes can be accessed at https://analisi.transparenciacatalunya.cat/, which is powered by Socrata.

The data is periodically updated using the soda-ruby gem to access the Socrata Open Data API.

The necessary credentials are:

SODA_DOMAIN: "soda.demo.socrata.com"
SODA_USERNAME: "user@example.com"
SODA_PASSWORD: "password"
SODA_APP_TOKEN: "app_token"
SODA_DATASET_IDENTIFIER: "dataset_identifier"

There are two rake tasks available to interact with this data:

  • rake open_data:participatory_processes:export to export the data to a CSV file
  • rake open_data:participatory_processes:publish_to_socrata to update the remote Socrata dataset

The logic of these rake tasks has been extracted to a Module in lib/open_data.rb, and ParticipatoryProcessSocrataSerializer, located at decidim-process-extended/app/serializers/decidim/participatory_processes, is the Class responsible for transforming the objects into data for the Socrata dataset.