decidim 0.23.5 → 0.24.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of decidim might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Rakefile +1 -0
- data/docs/README.adoc +74 -0
- data/docs/antora.yml +7 -0
- data/docs/modules/configure/pages/environment_variables.adoc +69 -0
- data/docs/modules/configure/pages/index.adoc +16 -0
- data/docs/modules/configure/pages/initializer.adoc +376 -0
- data/docs/modules/customize/assets/images/header-snippet.png +0 -0
- data/docs/modules/customize/assets/images/menu.png +0 -0
- data/docs/modules/customize/assets/images/organization-colors.png +0 -0
- data/docs/modules/customize/pages/authorizations.adoc +22 -0
- data/docs/{customization/code.md → modules/customize/pages/code.adoc} +12 -9
- data/docs/{customization/gemfile.md → modules/customize/pages/gemfile.adoc} +5 -4
- data/docs/modules/customize/pages/images.adoc +7 -0
- data/docs/modules/customize/pages/javascript.adoc +59 -0
- data/docs/modules/customize/pages/menu.adoc +25 -0
- data/docs/modules/customize/pages/oauth.adoc +33 -0
- data/docs/modules/customize/pages/styles.adoc +64 -0
- data/docs/modules/customize/pages/texts.adoc +30 -0
- data/docs/modules/customize/pages/users_registration_mode.adoc +17 -0
- data/docs/{customization/views.md → modules/customize/pages/views.adoc} +13 -13
- data/docs/modules/develop/assets/images/barcelona.png +0 -0
- data/docs/modules/develop/assets/images/helsinki.png +0 -0
- data/docs/modules/develop/assets/images/indices.png +0 -0
- data/docs/{advanced/api.md → modules/develop/pages/api.adoc} +2 -2
- data/docs/{advanced/authorship.md → modules/develop/pages/authorable.adoc} +5 -5
- data/docs/modules/develop/pages/c4_component.adoc +91 -0
- data/docs/modules/develop/pages/c4_container.adoc +42 -0
- data/docs/modules/develop/pages/c4_context.adoc +35 -0
- data/docs/{advanced/components.md → modules/develop/pages/components.adoc} +47 -10
- data/docs/{advanced/content_blocks.md → modules/develop/pages/content_blocks.adoc} +16 -13
- data/docs/{advanced/content_processors.md → modules/develop/pages/content_processors.adoc} +25 -19
- data/docs/modules/develop/pages/data-picker.adoc +85 -0
- data/docs/modules/develop/pages/deploy.adoc +15 -0
- data/docs/modules/develop/pages/docker.adoc +12 -0
- data/docs/{advanced/embeddable.md → modules/develop/pages/embeddable.adoc} +6 -6
- data/docs/{advanced/endorsable.md → modules/develop/pages/endorsable.adoc} +31 -25
- data/docs/{advanced/fixing_locales.md → modules/develop/pages/fixing_locales.adoc} +36 -23
- data/docs/{advanced/followers.md → modules/develop/pages/followable.adoc} +9 -8
- data/docs/modules/develop/pages/guide.adoc +16 -0
- data/docs/modules/develop/pages/guide_architecture.adoc +17 -0
- data/docs/modules/develop/pages/guide_changelog.adoc +8 -0
- data/docs/modules/develop/pages/guide_commands.adoc +86 -0
- data/docs/modules/develop/pages/guide_development_app.adoc +44 -0
- data/docs/modules/develop/pages/guide_development_with_custom_seed_data.adoc +31 -0
- data/docs/modules/develop/pages/guide_development_with_localhost_ssl.adoc +63 -0
- data/docs/modules/develop/pages/guide_example_apps.adoc +59 -0
- data/docs/modules/develop/pages/guide_git_conventions.adoc +75 -0
- data/docs/modules/develop/pages/guide_github_projects.adoc +42 -0
- data/docs/modules/develop/pages/guide_semver.adoc +7 -0
- data/docs/{advanced/how_to_fix_metrics.md → modules/develop/pages/how_to_fix_metrics.adoc} +76 -59
- data/docs/modules/develop/pages/machine_translations.adoc +42 -0
- data/docs/modules/develop/pages/managing_translations_i18n.adoc +24 -0
- data/docs/modules/develop/pages/maps.adoc +499 -0
- data/docs/modules/develop/pages/metrics.adoc +119 -0
- data/docs/{advanced/modules.md → modules/develop/pages/modules.adoc} +16 -6
- data/docs/{advanced/newsletter_templates.md → modules/develop/pages/newsletter_templates.adoc} +12 -10
- data/docs/{advanced/notifications.md → modules/develop/pages/notifications.adoc} +40 -38
- data/docs/{advanced/open-data.md → modules/develop/pages/open-data.adoc} +4 -3
- data/docs/modules/develop/pages/permissions.adoc +92 -0
- data/docs/{advanced/profiling.md → modules/develop/pages/profiling.adoc} +15 -12
- data/docs/modules/develop/pages/releases.adoc +148 -0
- data/docs/modules/develop/pages/reportable.adoc +31 -0
- data/docs/modules/develop/pages/security.adoc +33 -0
- data/docs/{advanced/share_tokens.md → modules/develop/pages/share_tokens.adoc} +18 -14
- data/docs/{advanced/templates.md → modules/develop/pages/templates.adoc} +14 -12
- data/docs/{advanced/testing.md → modules/develop/pages/testing.adoc} +21 -20
- data/docs/{advanced/activity_log.md → modules/develop/pages/traceable.adoc} +31 -26
- data/docs/modules/develop/pages/turbolinks.adoc +7 -0
- data/docs/{advanced/view_hooks.md → modules/develop/pages/view_hooks.adoc} +29 -23
- data/docs/modules/develop/pages/view_models_aka_cells.adoc +105 -0
- data/docs/modules/install/pages/checklist.adoc +39 -0
- data/docs/modules/install/pages/index.adoc +148 -0
- data/docs/{manual-installation.md → modules/install/pages/manual.adoc} +54 -42
- data/docs/modules/install/pages/update.adoc +95 -0
- data/docs/{services/activejob.md → modules/services/pages/activejob.adoc} +3 -3
- data/docs/modules/services/pages/elections_bulletin_board.adoc +52 -0
- data/docs/{services/etherpad.md → modules/services/pages/etherpad.adoc} +15 -12
- data/docs/modules/services/pages/maps.adoc +311 -0
- data/docs/modules/services/pages/smtp.adoc +10 -0
- data/docs/modules/services/pages/social_providers.adoc +122 -0
- data/lib/decidim/gem_manager.rb +5 -5
- data/lib/decidim/version.rb +1 -1
- metadata +135 -98
- data/README.md +0 -157
- data/docs/advanced/add_authorizable_action.md +0 -63
- data/docs/advanced/adding_fixtures_aka_dummy_content.md +0 -9
- data/docs/advanced/data-picker.md +0 -83
- data/docs/advanced/deploy.md +0 -9
- data/docs/advanced/how_to_create_a_module.md +0 -9
- data/docs/advanced/machine_translation_service.md +0 -12
- data/docs/advanced/managing_translations_i18n.md +0 -24
- data/docs/advanced/metrics.md +0 -114
- data/docs/advanced/permissions.md +0 -23
- data/docs/advanced/releases.md +0 -114
- data/docs/advanced/tradeoffs.md +0 -14
- data/docs/advanced/view_models_aka_cells.md +0 -99
- data/docs/checklist.md +0 -55
- data/docs/customization/authorizations.md +0 -5
- data/docs/customization/images.md +0 -7
- data/docs/customization/javascript.md +0 -9
- data/docs/customization/machine_translations.md +0 -30
- data/docs/customization/maps.md +0 -610
- data/docs/customization/oauth.md +0 -50
- data/docs/customization/styles.md +0 -11
- data/docs/customization/texts.md +0 -27
- data/docs/customization/users_registration_mode.md +0 -17
- data/docs/development_guide.md +0 -166
- data/docs/getting_started.md +0 -191
- data/docs/possible_flows_for_proposal.png +0 -0
- data/docs/services/analytics.md +0 -23
- data/docs/services/elections_bulletin_board.md +0 -38
- data/docs/services/maps.md +0 -362
- data/docs/services/social_providers.md +0 -98
@@ -0,0 +1,44 @@
|
|
1
|
+
= Development App
|
2
|
+
|
3
|
+
In order to start developing you will need what is called a `development_app`. This is nearly the same as a new Decidim app (that you can create with `decidim app_name`) but with a Gemfile pre-configured for local development and some other small config modifications.
|
4
|
+
You need it in order to have a Rails application configured to lookup Decidim modules from your filesystem. This way changes in your modules will be directly observed by this `development_app`.
|
5
|
+
|
6
|
+
You can create a `development_app` from inside the project's root folder with the command:
|
7
|
+
|
8
|
+
[source,console]
|
9
|
+
----
|
10
|
+
git clone https://github.com/decidim/decidim.git
|
11
|
+
cd decidim
|
12
|
+
bundle install
|
13
|
+
bundle exec rake development_app
|
14
|
+
cd development_app
|
15
|
+
----
|
16
|
+
|
17
|
+
A development_app/ entry appears in the .gitignore file, so you don't have to worry about committing the development app by mistake.
|
18
|
+
|
19
|
+
On creation, this steps are automatically invoked by the generator:
|
20
|
+
|
21
|
+
* create a `config/database.yml`
|
22
|
+
* `bundle install`
|
23
|
+
* `bin/rails decidim:upgrade`
|
24
|
+
* `bin/rails db:migrate db:seed`
|
25
|
+
|
26
|
+
If the default database.yml does not suit your needs you can always configure it at your will and run this steps manually.
|
27
|
+
|
28
|
+
The last command will set your database and add some example data (called "seed data") so that you can start trying Decidim. We don't recommend using seed data for production environments, but it's useful for local development and staging environments.
|
29
|
+
|
30
|
+
Once the app is created you are ready to start the server:
|
31
|
+
|
32
|
+
* `bin/rails s`
|
33
|
+
|
34
|
+
== Migrations
|
35
|
+
|
36
|
+
When creating new migrations in Decidim's modules, you will need to "apply" this migrations to your development_app. The way to do this is by copying the migration from your module into the db/migrate dir of your development_app. Luckily we already have a script that automates this: it copies all missing migrations in development_app/db/migrate. The command is:
|
37
|
+
|
38
|
+
[source,console]
|
39
|
+
----
|
40
|
+
bin/rails decidim:upgrade
|
41
|
+
----
|
42
|
+
|
43
|
+
Anyway we recommend re-creating your development_app every once in a while.
|
44
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
= Development with custom seed data
|
2
|
+
|
3
|
+
The seed data is not only useful for local development, but also for staging environments to showcase your work to your clients. In this case, you might need to customize some of that seed data to make sure it fits your needs.
|
4
|
+
|
5
|
+
== Customizing seed data via the `db/seeds.rb` file
|
6
|
+
|
7
|
+
One way to customize the seed data is to use the `db/seeds.rb` file in your application. You'll see a call to generate the Decidim seeds:
|
8
|
+
|
9
|
+
[source,ruby]
|
10
|
+
----
|
11
|
+
Decidim.seed!
|
12
|
+
----
|
13
|
+
|
14
|
+
This will generate all the needed seed data. But after that you might want to, for example, create some specific scopes, or change the default user password. You can do anything from that file.
|
15
|
+
|
16
|
+
== Customizing the seed data via environment variables
|
17
|
+
|
18
|
+
Some specific pieces of the seed data can be customized via environment variables. This is specially useful to set the SMTP credentials or the System Admin password.
|
19
|
+
|
20
|
+
If you set the variables _before_ creating the seeds data, the values in those variables will be used.
|
21
|
+
|
22
|
+
* `SMTP_FROM_LABEL`: The name used to send emails.
|
23
|
+
* `SMTP_FROM_EMAIL`: The email where emails will be sent from.
|
24
|
+
* `SMTP_USERNAME`: The username required by your email sending system.
|
25
|
+
* `SMTP_PASSWORD`: The password required by your email sending system.
|
26
|
+
* `SMTP_ADDRESS`: The address where your email sending system lives.
|
27
|
+
* `SMTP_PORT`: The port used to connect to your email sending system.
|
28
|
+
* `DECIDIM_SYSTEM_USER_PASSWORD`: The password for the System user. Useful to hide access to the System panel, where the SMTP config can be retrieved in plain text.
|
29
|
+
|
30
|
+
This is useful, for example, to set up a staging application open to anyone, and use Sendgrid as a mailing system. By changing the default password only you will be able to access the System panel, so nobody will be able to see the credentials used to connect to Sendgrid.
|
31
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
= Testing SSL in localhost
|
2
|
+
|
3
|
+
In some cases is useful to access the `localhost` environment under SSL (ie: `https://localhost:3000/`).
|
4
|
+
|
5
|
+
A typical use case is when you want to test login integration with 3rd party systems using OAuth (which in the latest versions only the HTTPS protocol is allowed).
|
6
|
+
|
7
|
+
Using Puma, the default server for Rails, you can easily do the trick by creating a self-signed certificate and using it when starting your development environment.
|
8
|
+
|
9
|
+
== Create a self-signed certificate for localhost
|
10
|
+
|
11
|
+
First you need a SSL certificate for the `localhost` domain (you only need to execute this command once):
|
12
|
+
|
13
|
+
[source,bash]
|
14
|
+
----
|
15
|
+
openssl req -x509 -out localhost.crt -keyout localhost.key \
|
16
|
+
-newkey rsa:2048 -nodes -sha256 \
|
17
|
+
-subj '/CN=localhost' -extensions EXT -config <( \
|
18
|
+
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
|
19
|
+
----
|
20
|
+
|
21
|
+
This will generate two files: `localhost.crt` and `localhost.key`, you can store them anywhere you want to use them later. In this example we'll suppose we have them in the folder `certs` in our root user home:
|
22
|
+
|
23
|
+
[source,bash]
|
24
|
+
----
|
25
|
+
mkdir ~/certs/
|
26
|
+
mv localhost.crt ~/certs/
|
27
|
+
mv localhost.key ~/certs/
|
28
|
+
----
|
29
|
+
|
30
|
+
== Starting development in SSL mode
|
31
|
+
|
32
|
+
Once you have your certificate is generated, just use the next command in order to start puma instead of the typical `bin/rails s`:
|
33
|
+
|
34
|
+
[source,bash]
|
35
|
+
----
|
36
|
+
bin/rails s -b "ssl://127.0.0.1:3000?key=$HOME/certs/localhost.key&cert=$HOME/certs/localhost.crt"
|
37
|
+
----
|
38
|
+
|
39
|
+
Now you are ready to visit your favorite browser at the address `https://localhost:3000/` (note "https").
|
40
|
+
|
41
|
+
Note: Your browser is going to complain as this is a self-signed certificate, that's ok for development, just add an exception and accept the certificate.
|
42
|
+
|
43
|
+
Also take into account that starting Puma in SSL mode will disable accessing it in non-ssl mode (normal `http` protocol).
|
44
|
+
|
45
|
+
== Testing tenants using lvh.me
|
46
|
+
|
47
|
+
You can also test the multi-tenant capabilities of Decidim by using alternative domains or subdomains that points to your local machine. `lvh.me` is a service that does just that without configuring anything in your machine (an alternative is to add entries in your `/etc/hosts` with a testing domain of your choice). Just point your browser to any subdomain of `lvh.me` and you'll be in your own machine.
|
48
|
+
|
49
|
+
Just access your `/system` admin and create new organization with some subdomain of `lvh.me`: `organization.lvh.me`, `tenant2.lvh.me`, etc.
|
50
|
+
|
51
|
+
You can combine this with the previously generated certificate (your browser is going to complaint but just tell it to proceed vising the site).
|
52
|
+
|
53
|
+
Finally remember to add the port as `lvh.me` do not forwards anything, for instance (use `http` or `https` depending on how you've started Rails):
|
54
|
+
|
55
|
+
`http://someorg.lvh.me:3000/`
|
56
|
+
|
57
|
+
`https://someorg.lvh.me:3000/`
|
58
|
+
|
59
|
+
`http://anotherorg.lvh.me:3000/`
|
60
|
+
|
61
|
+
`https://anotherorg.lvh.me:3000/`
|
62
|
+
|
63
|
+
etc.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
= Example Apps
|
2
|
+
|
3
|
+
If you have worked in the past with Ruby on Rails, you'll notice quickly that Decidim is *not* your typical Ruby on Rails Vanilla App.
|
4
|
+
|
5
|
+
We've tried using http://decide.es[Consul] but we found some problems on reutilization, adaptation, modularization and configuration. You can read more about that on https://alabs.gitbooks.io/propuesta-de-cambios-en-la-arquitectura-de-consul/content/[Propuesta de Cambios de Arquitectura de Consul (in spanish only)]. As a summary, we decided to try with a model based in https://guides.rubyonrails.org/engines.html[RoR Engines]. A good resource regarding this approach is https://cbra.info/[Component Based Rails Applications].
|
6
|
+
|
7
|
+
== What this means
|
8
|
+
|
9
|
+
This means that:
|
10
|
+
|
11
|
+
. Decidim is a https://rubygems.org/gems/decidim[gem], available in rubygems.org. You can install it with the command `gem install decidim`
|
12
|
+
. Decidim is a command line generator of Ruby on Rails applications. After you've install it you can generate a new RoR app with `decidim HelloWorld`
|
13
|
+
. This app has a dependency the gem itself. You can see this in the Gemfile of the generated app.
|
14
|
+
. This app can be extended by making changes in the app (see xref:customize:index.adoc[Customising]) and by working with https://decidim.org/modules[Modules].
|
15
|
+
|
16
|
+
== Examples
|
17
|
+
|
18
|
+
Here are some good examples of what can be done with Decidim:
|
19
|
+
|
20
|
+
=== Helsinki OmaStadi
|
21
|
+
|
22
|
+
See the website at https://omastadi.hel.fi/
|
23
|
+
|
24
|
+
See the source code at https://github.com/City-of-Helsinki/decidim-helsinki/
|
25
|
+
|
26
|
+
image::helsinki.png[Helsinki OmaStadi]
|
27
|
+
|
28
|
+
Some highlights:
|
29
|
+
|
30
|
+
* They have their https://github.com/City-of-Helsinki/decidim-helsinki/blob/b9a09e570eb6090dee93f2ee73b5951882c74755/Gemfile[Gemfile] with lots of modules with their own code. Some of them are also in ruybgems (like `decidim-access_requests`, `decidim-antivirus`, `decidim-mpassid`, `decidim-process_groups_content_block`, `decidim-suomifi`, `decidim-term_customizer`), others are only in Github (`decidim-accountability_simple`, `decidim-apiauth`, `decidim-combined_budgeting`, `decidim-plans`, `decidim-redirects`). They even use a module made by other organization in the community (`decidim-budgets_enhanced`)
|
31
|
+
* They have their UI customized to their needs. See the https://github.com/City-of-Helsinki/decidim-helsinki/tree/a7396a312cc04198654a86d66c2a7de556c212af/app/assets/stylesheets[CSS] and https://github.com/City-of-Helsinki/decidim-helsinki/tree/a7396a312cc04198654a86d66c2a7de556c212af/app/views[HTML (views)].
|
32
|
+
* They have an awesome READE explaining how it works and what changes have made.
|
33
|
+
|
34
|
+
=== Decidim Barcelona
|
35
|
+
|
36
|
+
See the website at https://decidim.barcelona
|
37
|
+
|
38
|
+
See the source code at https://github.com/AjuntamentdeBarcelona/decidim-barcelona
|
39
|
+
|
40
|
+
image::barcelona.png[Decidim Barcelona]
|
41
|
+
|
42
|
+
Some highlights:
|
43
|
+
|
44
|
+
* In the https://github.com/AjuntamentdeBarcelona/decidim-barcelona/blob/4d88ec6106c5f29354a1fd069dd50d7d123e492a/Gemfile#L7[Gemfile], they use some modules that are local only, as folders in the repository using the "path" Bundler directive: `decidim-dataviz`, `decidim-stats`, `decidim-valid_auth`
|
45
|
+
* For the footer (FEDER logo notice) they use the `deface` gem instead of overriding. See https://github.com/AjuntamentdeBarcelona/decidim-barcelona/pull/300[Pull Request].
|
46
|
+
|
47
|
+
=== inDICEs
|
48
|
+
|
49
|
+
See the website at https://participate.indices-culture.eu/
|
50
|
+
|
51
|
+
See the source code at https://github.com/Platoniq/decidim-indices
|
52
|
+
|
53
|
+
image::indices.png[inDICEs]
|
54
|
+
|
55
|
+
Some highlights:
|
56
|
+
|
57
|
+
* In the https://github.com/Platoniq/decidim-indices/blob/ef6d862900ed440aa5ee94c9618648650f3342c6/Gemfile#L13[Gemfile], they use modules on their git repositories: `decidim-decidim_awesome`, `decidim-direct_verifications`, `decidim-notify` and `decidim-term_customizer`.
|
58
|
+
* They have their UI customized to their needs.
|
59
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
= Git Conventions
|
2
|
+
|
3
|
+
== GitFlow Branching model
|
4
|
+
|
5
|
+
The Decidim respository follows the GitFlow branching model. There are good documentations on it at:
|
6
|
+
|
7
|
+
* https://nvie.com/posts/a-successful-git-branching-model/[the original post]
|
8
|
+
* https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow[Atlassian tutorial]
|
9
|
+
|
10
|
+
This model introduces the `develop` branch as a kind of queue for new features to enter into the next release.
|
11
|
+
|
12
|
+
In summary, Decidim developers that work on `+feature/...+` or `+fix/...+` branches will branch off from `develop` and must be merged back into `develop`.
|
13
|
+
|
14
|
+
Then, to start a new feature branch off from `develop` in the following way:
|
15
|
+
|
16
|
+
[source,bash]
|
17
|
+
----
|
18
|
+
git checkout develop
|
19
|
+
git checkout -b feature/xxx
|
20
|
+
----
|
21
|
+
|
22
|
+
Implement the feature, and open a Pull Request as normal, but against `develop` branch. As this is the most common operation, `develop` is the default branch instead of `master`.
|
23
|
+
|
24
|
+
Please note that Decidim does not use the `master` branch.
|
25
|
+
|
26
|
+
== Naming branches
|
27
|
+
|
28
|
+
We would like to have all branches following this namings:
|
29
|
+
|
30
|
+
|===
|
31
|
+
| Branch prefix | Comment
|
32
|
+
|
33
|
+
| chore/
|
34
|
+
| Internal work. For instance, automatisms, etc. No production code change.
|
35
|
+
|
36
|
+
| ci/
|
37
|
+
| For continous integration related tasks. No production code change.
|
38
|
+
|
39
|
+
| deps/
|
40
|
+
| For dependency management tasks.
|
41
|
+
|
42
|
+
| doc/
|
43
|
+
| For changes to the documentation.
|
44
|
+
|
45
|
+
| feature/
|
46
|
+
| For new features for the users or for the Decidim command.
|
47
|
+
|
48
|
+
| fix/
|
49
|
+
| For feature bugfixing.
|
50
|
+
|
51
|
+
| release/
|
52
|
+
| With MAYOR.MINOR-stable. For instance, release/0.22-stable
|
53
|
+
|
54
|
+
| refactor/
|
55
|
+
| For refactorings related with production code.
|
56
|
+
|
57
|
+
| test/
|
58
|
+
| When adding missing tests, refactoring tests, improving coverage, etc.
|
59
|
+
|
60
|
+
| backport/
|
61
|
+
| We only offer support for the last mayor version.
|
62
|
+
|===
|
63
|
+
|
64
|
+
== Git commit messages and Pull Request titles
|
65
|
+
|
66
|
+
We recommend following https://chris.beams.io/posts/git-commit/[this guide] for making good git commit messages. It also applies to Pull Request titles. The summary is:
|
67
|
+
|
68
|
+
. Separate subject from body with a blank line
|
69
|
+
. Limit the subject line to 50 characters
|
70
|
+
. Capitalize the subject line
|
71
|
+
. Do not end the subject line with a period
|
72
|
+
. Use the imperative mood in the subject line
|
73
|
+
. Wrap the body at 72 characters
|
74
|
+
. Use the body to explain what and why vs. how
|
75
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
= GitHub Projects Workflow
|
2
|
+
|
3
|
+
This is an internal document on how we're organizing the development of Decidim with external contractors through Github projects.
|
4
|
+
|
5
|
+
There are three teams:
|
6
|
+
|
7
|
+
1. Product team: formed by representatives of the Barcelona City Council, Localret and Decidim Association who make functional decisions. They have the product vision and ensure that all the developments that are merged are coherent and consistent. You can summon them by mentioning in GitHub at @decidim/product
|
8
|
+
2. Contractors: depends on the project. Most of the current developments are funded by the city of Barcelona, and the teams depend on the contract that has won the public procurement process. If there's any published contract we link it in the description of the project.
|
9
|
+
3. Maintainers: developers that make the releases, review the Pull Requests, update dependencies and generally take care of all the Decidim source code. You can summon them by mentioning in GitHub at @decidim/core
|
10
|
+
|
11
|
+
We follow some rules of Agile Development (mostly Scrum and KanBan).
|
12
|
+
|
13
|
+
== Explanation of the columns
|
14
|
+
|
15
|
+
=== Product Backlog
|
16
|
+
|
17
|
+
The Product team prepares all the issues following the same template and order them by priority.
|
18
|
+
|
19
|
+
=== Sprint Backlog
|
20
|
+
|
21
|
+
Issues fully refined than will be tackled on the Sprint. Each Sprint has a duration of 3 weeks.
|
22
|
+
The issues in this column will be agreed upon at the beginning of the Sprint between the Product Team and Contractors.
|
23
|
+
|
24
|
+
=== Doing
|
25
|
+
|
26
|
+
Issues on active development by Contractors.
|
27
|
+
|
28
|
+
=== Ready
|
29
|
+
|
30
|
+
Issues completed by Contractors. Ready to be tested and reviewed by Product Team.
|
31
|
+
|
32
|
+
=== QA Testing
|
33
|
+
|
34
|
+
Issues on functional testing and review by Product Team.
|
35
|
+
|
36
|
+
=== Technical Review
|
37
|
+
|
38
|
+
Quality and technical peer review by Maintainers.
|
39
|
+
|
40
|
+
=== Done
|
41
|
+
|
42
|
+
Merged by Maintainers. The issue can be closed.
|
@@ -0,0 +1,7 @@
|
|
1
|
+
= Semantic Versioning
|
2
|
+
|
3
|
+
For releases we follow https://semver.org/[Semantic Versioning recommendations]. Some details in our case:
|
4
|
+
|
5
|
+
* Until v1 there could be changes in the API. We'll let you know on the Release Notes for a given version
|
6
|
+
* Upgrading on patch versions should be safe (for instance from 0.20.0 to 0.20.1). The only things that we add are bug fixes and new languages.
|
7
|
+
|
@@ -1,43 +1,44 @@
|
|
1
|
-
|
1
|
+
= How to fix metrics
|
2
2
|
|
3
3
|
At the request of some instances, we have analyzed the issues related to metrics and looked for possible solutions.
|
4
4
|
|
5
|
-
|
5
|
+
== Problems
|
6
6
|
|
7
7
|
We have identified two main problems:
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
* Metrics generation crashing, which cause ``MetricJob``s to run again and again.
|
10
|
+
* Peaks in generated metrics, sudden changes from day to day when displaying metrics.
|
11
11
|
|
12
|
-
|
12
|
+
=== Metrics generation crashing
|
13
13
|
|
14
14
|
We have identified only one culprit here: "orphans" records, meaning records whose related component or participatory space cannot be found in the database. This is because in a previous decidim release `PartipatorySpaces` could be deleted but they were not deleted properly. So any application that has deleted a participatory space in the past, will probably have unrelated records that will make some metrics calculation crash.
|
15
15
|
|
16
|
-
|
16
|
+
=== Peaks in generated metrics
|
17
17
|
|
18
|
-
If somehow the metrics jobs fail to execute for a period of time, big differences can appear in metrics. So first make sure that you have metrics for every day, if not
|
18
|
+
If somehow the metrics jobs fail to execute for a period of time, big differences can appear in metrics. So first make sure that you have metrics for every day, if not https://github.com/decidim/decidim/blob/develop/docs/advanced/metrics.md[generate them].
|
19
19
|
|
20
20
|
If you have metrics generated for almost everyday and still see drastic changes from day to day, take into account that changing the visibility of a component or participatory space (making them private or unpublishing them) will naturally cause big differences in generated metrics.
|
21
21
|
|
22
|
-
Finally, if you see that the differences in some days are multiples of a previous generated metric, meaning suddenly you have exactly the double or the triple of a calculated metric, it's very likely that you have duplicate generated metrics. We have only seen this problem with instances using Sidekiq, not Delayed Job. We do not know the cause of this, but it seems to be a known issue
|
22
|
+
Finally, if you see that the differences in some days are multiples of a previous generated metric, meaning suddenly you have exactly the double or the triple of a calculated metric, it's very likely that you have duplicate generated metrics. We have only seen this problem with instances using Sidekiq, not Delayed Job. We do not know the cause of this, but it seems to be a known issue https://blog.francium.tech/avoiding-duplicate-jobs-in-sidekiq-dcbb1aca1e20[Avoiding duplicate jobs in Sidekiq].
|
23
23
|
|
24
|
-
|
24
|
+
== Solutions
|
25
25
|
|
26
26
|
We cannot offer a definitive solution for duplicate metrics, other than to delete old duplicate metrics and generate them again. If this problem persists, however, consider using Delayed Job.
|
27
27
|
For a given metric type (`rake decidim:metrics:list`) that has duplicates:
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
* Option 1: Remove individually each metric record per day.
|
30
|
+
* Option 2: Delete all metric records and recalculate them. https://github.com/decidim/decidim/blob/release/0.18-stable/CHANGELOG.md#participants-metrics[CHANGELOG] of decidim version 0.18 has an example for "participants".
|
31
31
|
|
32
32
|
For orphan records, you can do the following:
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
* Back up the database.
|
35
|
+
* Delete orphan records fromt the console (code is below).
|
36
|
+
* Delete "comments" metrics and recalculate them following the https://github.com/decidim/decidim/blob/release/0.18-stable/CHANGELOG.md#participants-metrics[aforementioned example].
|
37
37
|
|
38
|
-
|
38
|
+
=== Some queries that may help
|
39
39
|
|
40
|
-
|
40
|
+
[source,ruby]
|
41
|
+
----
|
41
42
|
GROUP_BY_FIELDS= %w(
|
42
43
|
day
|
43
44
|
metric_type
|
@@ -62,177 +63,193 @@ For orphan records, you can do the following:
|
|
62
63
|
SELECT count(1), #{GROUP_BY_FIELDS} FROM decidim_metrics GROUP BY #{GROUP_BY_FIELDS} HAVING COUNT(1) > 1;
|
63
64
|
EOSQL
|
64
65
|
end
|
65
|
-
|
66
|
+
----
|
66
67
|
|
67
|
-
|
68
|
+
=== Delete orphan records
|
68
69
|
|
69
70
|
"proposals", "meetings", "accountability", "debates", "pages", "budgets", "surveys"
|
70
71
|
|
71
|
-
|
72
|
+
==== Proposals
|
72
73
|
|
73
74
|
Delete proposals whose component does not have a participatory space and delete components of a proposal type that do not have a participatory space
|
74
75
|
|
75
|
-
|
76
|
+
[source,ruby]
|
77
|
+
----
|
76
78
|
Decidim::Component.where(manifest_name: "proposals").find_each(batch_size: 100) { |c|
|
77
79
|
if c.participatory_space.blank?
|
78
80
|
Decidim::Proposals::Proposal.where(component: c).destroy_all
|
79
81
|
c.destroy
|
80
82
|
end
|
81
83
|
}
|
82
|
-
|
84
|
+
----
|
83
85
|
|
84
86
|
Delete proposals that do not have a component
|
85
87
|
|
86
|
-
|
88
|
+
[source,ruby]
|
89
|
+
----
|
87
90
|
Decidim::Proposals::Proposal.find_each(batch_size: 100) { |proposal|
|
88
91
|
proposal.delete if proposal.component.blank?
|
89
92
|
}
|
90
|
-
|
93
|
+
----
|
91
94
|
|
92
|
-
|
95
|
+
==== Meetings
|
93
96
|
|
94
97
|
Delete meetings whose component has no participatory space and delete components of meeting type that do not have a participatory space
|
95
98
|
|
96
|
-
|
99
|
+
[source,ruby]
|
100
|
+
----
|
97
101
|
Decidim::Component.where(manifest_name: "meetings").find_each(batch_size: 100) { |c|
|
98
102
|
if c.participatory_space.blank?
|
99
103
|
Decidim::Meetings::Meeting.where(component: c).destroy_all
|
100
104
|
c.destroy
|
101
105
|
end
|
102
106
|
}
|
103
|
-
|
107
|
+
----
|
104
108
|
|
105
109
|
Delete meetings that do not have a component
|
106
110
|
|
107
|
-
|
111
|
+
[source,ruby]
|
112
|
+
----
|
108
113
|
Decidim::Meetings::Meeting.find_each(batch_size: 100) { |meeting|
|
109
114
|
meeting.delete if meeting.component.blank?
|
110
115
|
}
|
111
|
-
|
116
|
+
----
|
112
117
|
|
113
|
-
|
118
|
+
==== Debates
|
114
119
|
|
115
120
|
Delete debates that its component has no participatory space and the debate components that do not have a participatory space
|
116
121
|
|
117
|
-
|
122
|
+
[source,ruby]
|
123
|
+
----
|
118
124
|
Decidim::Component.where(manifest_name: "debates").find_each(batch_size: 100) { |c|
|
119
125
|
if c.participatory_space.blank?
|
120
126
|
Decidim::Debates::Debate.where(component: c).destroy_all
|
121
127
|
c.destroy
|
122
128
|
end
|
123
129
|
}
|
124
|
-
|
130
|
+
----
|
125
131
|
|
126
132
|
Destroy debates that do not have a component
|
127
133
|
|
128
|
-
|
134
|
+
[source,ruby]
|
135
|
+
----
|
129
136
|
Decidim::Debates::Debate.find_each(batch_size: 100) { |debate|
|
130
137
|
debate.delete if debate.component.blank?
|
131
138
|
}
|
132
|
-
|
139
|
+
----
|
133
140
|
|
134
|
-
|
141
|
+
==== Posts
|
135
142
|
|
136
143
|
Destroy posts whose component has no participatory space and blog components that do not have a participatory space
|
137
144
|
|
138
|
-
|
145
|
+
[source,ruby]
|
146
|
+
----
|
139
147
|
Decidim::Component.where(manifest_name: "blogs").find_each(batch_size: 100) { |c|
|
140
148
|
if c.participatory_space.blank?
|
141
149
|
Decidim::Blogs::Post.where(component: c).destroy_all
|
142
150
|
c.destroy
|
143
151
|
end
|
144
152
|
}
|
145
|
-
|
153
|
+
----
|
146
154
|
|
147
155
|
Destroy posts that do not have a component
|
148
156
|
|
149
|
-
|
157
|
+
[source,ruby]
|
158
|
+
----
|
150
159
|
Decidim::Blogs::Post.find_each(batch_size: 100) { |post|
|
151
160
|
post.delete if post.component.blank?
|
152
161
|
}
|
153
|
-
|
162
|
+
----
|
154
163
|
|
155
|
-
|
164
|
+
==== Accountability
|
156
165
|
|
157
166
|
Destroy results whose component has no participatory space and components of accountability type that do not have a participatory space
|
158
167
|
|
159
|
-
|
168
|
+
[source,ruby]
|
169
|
+
----
|
160
170
|
Decidim::Component.where(manifest_name: "accountability").find_each(batch_size: 100) { |c|
|
161
171
|
if c.participatory_space.blank?
|
162
172
|
Decidim::Accountability::Result.where(component: c).destroy_all
|
163
173
|
c.destroy
|
164
174
|
end
|
165
175
|
}
|
166
|
-
|
176
|
+
----
|
167
177
|
|
168
178
|
Destroy results that do not have a component
|
169
179
|
|
170
|
-
|
180
|
+
[source,ruby]
|
181
|
+
----
|
171
182
|
Decidim::Accountability::Result.find_each(batch_size: 100) { |result|
|
172
183
|
result.delete if result.component.blank?
|
173
184
|
}
|
174
|
-
|
185
|
+
----
|
175
186
|
|
176
|
-
|
187
|
+
==== Pages
|
177
188
|
|
178
189
|
Destroy page components that do not have a participatory space
|
179
190
|
|
180
|
-
|
191
|
+
[source,ruby]
|
192
|
+
----
|
181
193
|
Decidim::Component.where(manifest_name: "pages").find_each(batch_size: 100) { |c|
|
182
194
|
if c.participatory_space.blank?
|
183
195
|
c.destroy
|
184
196
|
end
|
185
197
|
}
|
186
|
-
|
198
|
+
----
|
187
199
|
|
188
|
-
|
200
|
+
==== Budgets
|
189
201
|
|
190
202
|
Destroy projects whose component has no participatory space and budget components that do not have a participatory space
|
191
203
|
|
192
|
-
|
204
|
+
[source,ruby]
|
205
|
+
----
|
193
206
|
Decidim::Component.where(manifest_name: "budgets").find_each(batch_size: 100) { |c|
|
194
207
|
if c.participatory_space.blank?
|
195
208
|
Decidim::Budgets::Project.where(component: c).destroy_all
|
196
209
|
c.destroy
|
197
210
|
end
|
198
211
|
}
|
199
|
-
|
212
|
+
----
|
200
213
|
|
201
214
|
Destroy results that do not have a component
|
202
215
|
|
203
|
-
|
216
|
+
[source,ruby]
|
217
|
+
----
|
204
218
|
Decidim::Budgets::Project.find_each(batch_size: 100) { |project|
|
205
219
|
project.delete if project.component.blank?
|
206
220
|
}
|
207
|
-
|
221
|
+
----
|
208
222
|
|
209
|
-
|
223
|
+
==== Surveys
|
210
224
|
|
211
|
-
|
225
|
+
[source,ruby]
|
226
|
+
----
|
212
227
|
Decidim::Component.where(manifest_name: "surveys").find_each(batch_size: 100) { |c|
|
213
228
|
if c.participatory_space.blank?
|
214
229
|
Decidim::Surveys::Survey.where(component: c).destroy_all
|
215
230
|
c.destroy
|
216
231
|
end
|
217
232
|
}
|
218
|
-
|
233
|
+
----
|
219
234
|
|
220
235
|
Destroy surveys that do not have a component
|
221
236
|
|
222
|
-
|
237
|
+
[source,ruby]
|
238
|
+
----
|
223
239
|
Decidim::Surveys::Survey.find_each(batch_size: 100) { |survey|
|
224
240
|
survey.delete if survey.component.blank?
|
225
241
|
}
|
226
|
-
|
242
|
+
----
|
227
243
|
|
228
|
-
|
244
|
+
==== Comments
|
229
245
|
|
230
246
|
Destroy comments whose commentable root is a proposal that does not have a participatory space.
|
231
247
|
|
232
|
-
|
248
|
+
[source,ruby]
|
249
|
+
----
|
233
250
|
proposal_ids = Decidim::Comments::Comment.where(decidim_root_commentable_type: "Decidim::Proposals::Proposal").pluck(:decidim_root_commentable_id)
|
234
251
|
|
235
252
|
proposal_ids_without_space = Decidim::Proposals::Proposal.where(id: proposal_ids).find_all{|p| p.participatory_space.blank? }.pluck(:id)
|
236
253
|
|
237
254
|
Decidim::Comments::Comment.where(decidim_root_commentable_type: "Decidim::Proposals::Proposal", decidim_root_commentable_id: proposal_ids_without_space).destroy_all
|
238
|
-
|
255
|
+
----
|