decidim-budgets 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +23 -0
- data/Rakefile +2 -0
- data/app/assets/config/decidim_budgets_manifest.js +1 -0
- data/app/assets/images/decidim/budgets/icon.svg +4 -0
- data/app/assets/javascripts/decidim/budgets/projects.js.es6 +28 -0
- data/app/assets/stylesheets/decidim/budgets/_budgets.scss +1 -0
- data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +32 -0
- data/app/assets/stylesheets/decidim/budgets/budget/_budget-meter.scss +78 -0
- data/app/assets/stylesheets/decidim/budgets/budget/_progress.scss +17 -0
- data/app/commands/decidim/budgets/add_line_item.rb +43 -0
- data/app/commands/decidim/budgets/admin/create_project.rb +52 -0
- data/app/commands/decidim/budgets/admin/update_project.rb +56 -0
- data/app/commands/decidim/budgets/cancel_order.rb +36 -0
- data/app/commands/decidim/budgets/checkout.rb +34 -0
- data/app/commands/decidim/budgets/remove_line_item.rb +35 -0
- data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +27 -0
- data/app/controllers/decidim/budgets/admin/application_controller.rb +14 -0
- data/app/controllers/decidim/budgets/admin/projects_controller.rb +69 -0
- data/app/controllers/decidim/budgets/application_controller.rb +13 -0
- data/app/controllers/decidim/budgets/line_items_controller.rb +43 -0
- data/app/controllers/decidim/budgets/orders_controller.rb +38 -0
- data/app/controllers/decidim/budgets/projects_controller.rb +44 -0
- data/app/forms/decidim/budgets/admin/project_form.rb +44 -0
- data/app/helpers/decidim/budgets/application_helper.rb +12 -0
- data/app/helpers/decidim/budgets/projects_helper.rb +29 -0
- data/app/models/decidim/budgets/application_record.rb +9 -0
- data/app/models/decidim/budgets/line_item.rb +20 -0
- data/app/models/decidim/budgets/order.rb +52 -0
- data/app/models/decidim/budgets/project.rb +15 -0
- data/app/services/decidim/budgets/project_search.rb +58 -0
- data/app/views/decidim/budgets/admin/projects/_form.html.erb +31 -0
- data/app/views/decidim/budgets/admin/projects/edit.html.erb +9 -0
- data/app/views/decidim/budgets/admin/projects/index.html.erb +27 -0
- data/app/views/decidim/budgets/admin/projects/new.html.erb +9 -0
- data/app/views/decidim/budgets/line_items/update_budget.js.erb +21 -0
- data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +30 -0
- data/app/views/decidim/budgets/projects/_budget_excess.html.erb +14 -0
- data/app/views/decidim/budgets/projects/_budget_summary.html.erb +46 -0
- data/app/views/decidim/budgets/projects/_count.html.erb +1 -0
- data/app/views/decidim/budgets/projects/_filters.html.erb +24 -0
- data/app/views/decidim/budgets/projects/_linked_projects.html.erb +12 -0
- data/app/views/decidim/budgets/projects/_order_progress.html.erb +34 -0
- data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +25 -0
- data/app/views/decidim/budgets/projects/_order_total_budget.html.erb +1 -0
- data/app/views/decidim/budgets/projects/_project.html.erb +40 -0
- data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +9 -0
- data/app/views/decidim/budgets/projects/_projects.html.erb +8 -0
- data/app/views/decidim/budgets/projects/_tags.html.erb +10 -0
- data/app/views/decidim/budgets/projects/index.html.erb +26 -0
- data/app/views/decidim/budgets/projects/index.js.erb +2 -0
- data/app/views/decidim/budgets/projects/show.html.erb +48 -0
- data/config/i18n-tasks.yml +4 -0
- data/config/locales/ca.yml +84 -0
- data/config/locales/en.yml +95 -0
- data/config/locales/es.yml +84 -0
- data/db/migrate/20170127114122_create_projects.rb +15 -0
- data/db/migrate/20170130095615_create_orders.rb +13 -0
- data/db/migrate/20170130101825_create_line_items.rb +10 -0
- data/lib/decidim/budgets/admin.rb +9 -0
- data/lib/decidim/budgets/admin_engine.rb +22 -0
- data/lib/decidim/budgets/feature.rb +59 -0
- data/lib/decidim/budgets/list_engine.rb +30 -0
- data/lib/decidim/budgets/test/factories.rb +43 -0
- data/lib/decidim/budgets.rb +11 -0
- metadata +210 -0
@@ -0,0 +1,8 @@
|
|
1
|
+
<div class="card card--list budget-list">
|
2
|
+
<% projects.each do |project| %>
|
3
|
+
<div id="project-<%= project.id %>-item" class="card--list__item">
|
4
|
+
<%= render partial: 'project', locals: { project: project } %>
|
5
|
+
</div>
|
6
|
+
<% end %>
|
7
|
+
</div>
|
8
|
+
<%= decidim_paginate projects, random_seed: random_seed %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% if project.category.present? || project.scope.present? %>
|
2
|
+
<ul class="tags tags--project" >
|
3
|
+
<% if project.category.present? %>
|
4
|
+
<li><%= link_to translated_attribute(project.category.name), decidim_budgets.projects_path(filter: { category_id: project.category.id }) %></li>
|
5
|
+
<% end %>
|
6
|
+
<% if project.scope.present? %>
|
7
|
+
<li><%= link_to project.scope.name, decidim_budgets.projects_path(filter: { scope_id: [project.scope.id] }) %></li>
|
8
|
+
<% end %>
|
9
|
+
</ul>
|
10
|
+
<% end %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<% content_for(:title, t(".title")) %>
|
2
|
+
|
3
|
+
<% if current_user.present? %>
|
4
|
+
<div class="row column">
|
5
|
+
<%= render partial: "budget_summary", locals: { include_heading: true } %>
|
6
|
+
</div>
|
7
|
+
<% end %>
|
8
|
+
<div class="row columns">
|
9
|
+
<h2 class="section-heading">
|
10
|
+
<%= render partial: "count" %>
|
11
|
+
</h2>
|
12
|
+
</div>
|
13
|
+
<div class="row">
|
14
|
+
<div class="columns mediumlarge-4 large-3">
|
15
|
+
<div class="card card--secondary show-for-mediumlarge" >
|
16
|
+
<%= render partial: "filters" %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<div id="projects" class="columns mediumlarge-8 large-9">
|
20
|
+
<%= render partial: "projects" %>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<%= javascript_include_tag("decidim/filters") %>
|
25
|
+
<%= javascript_include_tag("decidim/budgets/projects") %>
|
26
|
+
<%= render partial: "decidim/shared/login_modal" %>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<% content_for(:title, translated_attribute(project.title)) %>
|
2
|
+
|
3
|
+
<div class="row column view-header">
|
4
|
+
<% if current_user.present? %>
|
5
|
+
<%= render partial: "budget_summary", locals: { include_heading: false } %>
|
6
|
+
<% end %>
|
7
|
+
<%= link_to projects_path, class: "muted-link" do %>
|
8
|
+
<%= icon "chevron-left", class: "icon--small" %>
|
9
|
+
<%= t('.view_all_projects') %>
|
10
|
+
<% end %>
|
11
|
+
<h2 class="heading2"><%= translated_attribute project.title %></h2>
|
12
|
+
</div>
|
13
|
+
<div class="row">
|
14
|
+
<div id="project" class="columns section view-side mediumlarge-4 mediumlarge-push-8
|
15
|
+
large-3 large-push-9">
|
16
|
+
<div class="card extra">
|
17
|
+
<div class="card__content">
|
18
|
+
<div class="m-bottom">
|
19
|
+
<span class="definition-data__title"><%= t('.budget') %></span>
|
20
|
+
<span class="definition-data__number"><%= budget_to_currency project.budget %></span>
|
21
|
+
</div>
|
22
|
+
<div id="project-<%= project.id %>-budget-button">
|
23
|
+
<%= render partial: 'project_budget_button', locals: { project: project } %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<div class="columns mediumlarge-8 mediumlarge-pull-4">
|
29
|
+
<div class="section">
|
30
|
+
<%== translated_attribute project.short_description %>
|
31
|
+
<%= render partial: "tags", locals: { project: project } %>
|
32
|
+
</div>
|
33
|
+
<div class="section">
|
34
|
+
<h3 class="section-heading"><%= t(".project_description") %></h3>
|
35
|
+
<%== translated_attribute project.description %>
|
36
|
+
</div>
|
37
|
+
<%= linked_resources_for project, :proposals, "included_proposals" %>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<%= content_for :expanded do %>
|
42
|
+
<% if feature_settings.comments_always_enabled || current_settings.comments_enabled %>
|
43
|
+
<%= comments_for project, votable: true %>
|
44
|
+
<% end %>
|
45
|
+
<% end %>
|
46
|
+
|
47
|
+
<%= javascript_include_tag("decidim/budgets/projects") %>
|
48
|
+
<%= render partial: "decidim/shared/login_modal" %>
|
@@ -0,0 +1,84 @@
|
|
1
|
+
ca:
|
2
|
+
decidim:
|
3
|
+
budgets:
|
4
|
+
actions:
|
5
|
+
confirm_destroy: Estàs segur que vols eliminar aquest projecte?
|
6
|
+
destroy: Esborrar
|
7
|
+
edit: Editar
|
8
|
+
new: Nou %{name}
|
9
|
+
title: Accions
|
10
|
+
admin:
|
11
|
+
models:
|
12
|
+
project:
|
13
|
+
name: Projecte
|
14
|
+
projects:
|
15
|
+
create:
|
16
|
+
invalid: Hi ha hagut un problema creant aquest projecte
|
17
|
+
success: Projecte creat correctament
|
18
|
+
edit:
|
19
|
+
title: Editar projecte
|
20
|
+
update: Actualitzar projecte
|
21
|
+
index:
|
22
|
+
title: Projectes
|
23
|
+
new:
|
24
|
+
create: Crear projecte
|
25
|
+
title: Nou resultat
|
26
|
+
update:
|
27
|
+
invalid: Hi ha hagut un problema actualitzant aquest projecte
|
28
|
+
success: Projecte actualitzat correctament
|
29
|
+
models:
|
30
|
+
project:
|
31
|
+
fields:
|
32
|
+
title: Títol
|
33
|
+
projects:
|
34
|
+
budget_confirm:
|
35
|
+
are_you_sure: Estàs d'acord? Un cop hagis confirmat el teu vot, no podràs canviar-lo.
|
36
|
+
cancel: Cancel·lar
|
37
|
+
confirm: Confirmar
|
38
|
+
description: Aquests són els projectes que has seleccionat per formar part del pressupost.
|
39
|
+
title: Confirmar vot
|
40
|
+
budget_excess:
|
41
|
+
close: Tancar
|
42
|
+
description: Aquest projecte sobrepassa el pressupost màxim i no es pot afegir. Si ho desitges, pots eliminar un projecte ja seleccionat per afegir aquest o votart amb les seves preferències.
|
43
|
+
ok: D'acord
|
44
|
+
title: Pressupost superat
|
45
|
+
budget_summary:
|
46
|
+
assigned: 'Assignat:'
|
47
|
+
cancel_order: eliminar el teu vot i començar de nou
|
48
|
+
checked_out:
|
49
|
+
description: Ja has votat pel pressupost. Si ha canviat d'idea, pots %{cancel_link}.
|
50
|
+
title: Vot pels pressupostos completat
|
51
|
+
description: "En quins projectes creus que hem de destinar el pressupost? Has d'assignar com a mínim %{minimum_budget} als projectes que desitges i votar amb les teves preferències per definir el pressupost."
|
52
|
+
title: Tu decideixes el pressupost
|
53
|
+
count:
|
54
|
+
projects_count:
|
55
|
+
one: 1 projecte
|
56
|
+
other: "%{count} projectes"
|
57
|
+
filters:
|
58
|
+
category: Categoria
|
59
|
+
scopes: Àmbits
|
60
|
+
search: Cerca
|
61
|
+
index:
|
62
|
+
title: Títol
|
63
|
+
order_progress:
|
64
|
+
vote: Votar
|
65
|
+
order_selected_projects:
|
66
|
+
remove: Esborrar
|
67
|
+
selected_projects:
|
68
|
+
one: projecte seleccionat
|
69
|
+
other: projectes seleccionats
|
70
|
+
view: Veure
|
71
|
+
project:
|
72
|
+
add: Afegir
|
73
|
+
remove: Esborrar
|
74
|
+
project_budget_button:
|
75
|
+
add: Afegir
|
76
|
+
added: Afegit
|
77
|
+
show:
|
78
|
+
budget: Pressupost
|
79
|
+
project_description: Descripció del projecte
|
80
|
+
view_all_projects: Veure tots els projectes
|
81
|
+
features:
|
82
|
+
budgets:
|
83
|
+
name: Pressupostos
|
84
|
+
total_budget: Pressupost total
|
@@ -0,0 +1,95 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
decidim:
|
4
|
+
budgets:
|
5
|
+
actions:
|
6
|
+
confirm_destroy: Are you sure you want to delete this project?
|
7
|
+
destroy: Delete
|
8
|
+
edit: Edit
|
9
|
+
new: New %{name}
|
10
|
+
title: Actions
|
11
|
+
admin:
|
12
|
+
models:
|
13
|
+
project:
|
14
|
+
name: Project
|
15
|
+
projects:
|
16
|
+
create:
|
17
|
+
invalid: There's been a problem creating this project
|
18
|
+
success: Project successfully created
|
19
|
+
destroy:
|
20
|
+
success: Project successfully destroyed
|
21
|
+
edit:
|
22
|
+
title: Edit project
|
23
|
+
update: Update project
|
24
|
+
index:
|
25
|
+
title: Projects
|
26
|
+
new:
|
27
|
+
create: Create project
|
28
|
+
title: New result
|
29
|
+
update:
|
30
|
+
invalid: There's been a problem updating this project
|
31
|
+
success: Project successfully updated
|
32
|
+
models:
|
33
|
+
project:
|
34
|
+
fields:
|
35
|
+
title: Title
|
36
|
+
projects:
|
37
|
+
budget_confirm:
|
38
|
+
are_you_sure: Do you agree? Once you have confirmed your vote, you can not change it.
|
39
|
+
cancel: Cancel
|
40
|
+
confirm: Confirm
|
41
|
+
description: These are the projects you have chosen to be part of the budget.
|
42
|
+
title: Confirm vote
|
43
|
+
budget_excess:
|
44
|
+
close: Close
|
45
|
+
description: This project exceeds the maximum budget and can not be added. If you want, you can delete a project you have already selected to add, or make your vote with your preferences.
|
46
|
+
ok: OK
|
47
|
+
title: Maximum budget exceeded
|
48
|
+
budget_summary:
|
49
|
+
are_you_sure: Are you sure you want to cancel your vote?
|
50
|
+
assigned: 'Assigned:'
|
51
|
+
cancel_order: delete your vote and start over
|
52
|
+
checked_out:
|
53
|
+
description: You've already voted for the budget. If you've changed your mind, you can %{cancel_link}.
|
54
|
+
title: Budget vote completed
|
55
|
+
description: "What projects do you think we should allocate budget for? Assign at least %{minimum_budget} to the projects you want and vote with your preferences to define the budget."
|
56
|
+
title: You decide the budget
|
57
|
+
count:
|
58
|
+
projects_count:
|
59
|
+
one: 1 project
|
60
|
+
other: "%{count} projects"
|
61
|
+
filters:
|
62
|
+
category: Category
|
63
|
+
scopes: Scopes
|
64
|
+
search: Search
|
65
|
+
index:
|
66
|
+
title: Title
|
67
|
+
order_progress:
|
68
|
+
vote: Vote
|
69
|
+
order_selected_projects:
|
70
|
+
remove: Remove
|
71
|
+
selected_projects:
|
72
|
+
one: project selected
|
73
|
+
other: projects selected
|
74
|
+
view: View
|
75
|
+
project:
|
76
|
+
add: Add
|
77
|
+
remove: Remove
|
78
|
+
project_budget_button:
|
79
|
+
add: Add
|
80
|
+
added: Added
|
81
|
+
show:
|
82
|
+
budget: Budget
|
83
|
+
project_description: Project description
|
84
|
+
view_all_projects: View all projects
|
85
|
+
features:
|
86
|
+
budgets:
|
87
|
+
name: Budgets
|
88
|
+
orders:
|
89
|
+
checkout:
|
90
|
+
error: An error ocurred while processing your vote
|
91
|
+
success: Your vote has been accepted successfully
|
92
|
+
destroy:
|
93
|
+
error: An error ocurred while canceling your vote
|
94
|
+
success: Your vote has been canceled successfully
|
95
|
+
total_budget: Total budget
|
@@ -0,0 +1,84 @@
|
|
1
|
+
es:
|
2
|
+
decidim:
|
3
|
+
budgets:
|
4
|
+
actions:
|
5
|
+
confirm_destroy: '¿Estás seguro de que deseas eliminar este proyecto?'
|
6
|
+
destroy: Borrar
|
7
|
+
edit: Editar
|
8
|
+
new: Nuevo %{name}
|
9
|
+
title: Acciones
|
10
|
+
admin:
|
11
|
+
models:
|
12
|
+
project:
|
13
|
+
name: Proyecto
|
14
|
+
projects:
|
15
|
+
create:
|
16
|
+
invalid: Ha habido un problema al crear este proyecto
|
17
|
+
success: Proyecto creado con éxito
|
18
|
+
edit:
|
19
|
+
title: Editar proyecto
|
20
|
+
update: Actualizar proyecto
|
21
|
+
index:
|
22
|
+
title: Proyectos
|
23
|
+
new:
|
24
|
+
create: Crear proyecto
|
25
|
+
title: Nuevo resultado
|
26
|
+
update:
|
27
|
+
invalid: Ha habido un problema al actualizar este proyecto
|
28
|
+
success: Proyecto actualizado correctamente
|
29
|
+
models:
|
30
|
+
project:
|
31
|
+
fields:
|
32
|
+
title: Título
|
33
|
+
projects:
|
34
|
+
budget_confirm:
|
35
|
+
are_you_sure: '¿Estás de acuerdo? Una vez que hayas confirmado tu voto, no puedes cambiarlo.'
|
36
|
+
cancel: Cancelar
|
37
|
+
confirm: Confirmar
|
38
|
+
description: Estos son los proyectos que has elegido para formar parte del presupuesto.
|
39
|
+
title: Confirmar voto
|
40
|
+
budget_excess:
|
41
|
+
close: Cerrar
|
42
|
+
description: Este proyecto sobrepasa el presupuesto máximo y no se puede añadir. Si lo deseas, puede eliminar un proyecto que ya hayas seleccionado o votar con tus preferencias.
|
43
|
+
ok: De acuerdo
|
44
|
+
title: Presupuesto excedido
|
45
|
+
budget_summary:
|
46
|
+
assigned: 'Asignado:'
|
47
|
+
cancel_order: eliminar tu voto y empezar de nuevo
|
48
|
+
checked_out:
|
49
|
+
description: Ya has votado para el presupuesto. Si has cambiado de idea, puedes %{cancel_link}.
|
50
|
+
title: Voto enviado correctamente
|
51
|
+
description: "¿Qué proyectos crees que deberíamos asignar el presupuesto? Asigna por lo menos %{minimum_budget} a los proyectos que desees y vota para definir el presupuesto."
|
52
|
+
title: Tú decides el presupuesto
|
53
|
+
count:
|
54
|
+
projects_count:
|
55
|
+
one: 1 proyecto
|
56
|
+
other: "%{count} proyectos"
|
57
|
+
filters:
|
58
|
+
category: Categoría
|
59
|
+
scopes: Ámbitos
|
60
|
+
search: Buscar
|
61
|
+
index:
|
62
|
+
title: Título
|
63
|
+
order_progress:
|
64
|
+
vote: Votar
|
65
|
+
order_selected_projects:
|
66
|
+
remove: Eliminar
|
67
|
+
selected_projects:
|
68
|
+
one: proyecto seleccionado
|
69
|
+
other: proyectos seleccionados
|
70
|
+
view: Ver
|
71
|
+
project:
|
72
|
+
add: Añadir
|
73
|
+
remove: Eliminar
|
74
|
+
project_budget_button:
|
75
|
+
add: Añadir
|
76
|
+
added: Añadido
|
77
|
+
show:
|
78
|
+
budget: Presupuesto
|
79
|
+
project_description: Descripción del proyecto
|
80
|
+
view_all_projects: Ver todos los proyectos
|
81
|
+
features:
|
82
|
+
budgets:
|
83
|
+
name: Presupuestos
|
84
|
+
total_budget: Presupuesto total
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateProjects < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :decidim_budgets_projects do |t|
|
4
|
+
t.jsonb :title
|
5
|
+
t.jsonb :description
|
6
|
+
t.jsonb :short_description
|
7
|
+
t.integer :budget, null: false
|
8
|
+
t.references :decidim_feature, index: true
|
9
|
+
t.references :decidim_scope, index: true
|
10
|
+
t.references :decidim_category, index: true
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateOrders < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :decidim_budgets_orders do |t|
|
4
|
+
t.references :decidim_user, index: true
|
5
|
+
t.references :decidim_feature, index: true
|
6
|
+
t.datetime :checked_out_at
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :decidim_budgets_orders, [:decidim_user_id, :decidim_feature_id], unique: true, name: "decidim_budgets_order_user_feature_unique"
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateLineItems < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :decidim_budgets_line_items do |t|
|
4
|
+
t.references :decidim_order, index: true
|
5
|
+
t.references :decidim_project, index: true
|
6
|
+
end
|
7
|
+
|
8
|
+
add_index :decidim_budgets_line_items, [:decidim_order_id, :decidim_project_id], unique: true, name: "decidim_budgets_line_items_order_project_unique"
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Budgets
|
4
|
+
# This is the engine that runs on the public interface of `decidim-budgets`.
|
5
|
+
# It mostly handles rendering the created projects associated to a participatory
|
6
|
+
# process.
|
7
|
+
class AdminEngine < ::Rails::Engine
|
8
|
+
isolate_namespace Decidim::Budgets::Admin
|
9
|
+
|
10
|
+
paths["db/migrate"] = nil
|
11
|
+
|
12
|
+
routes do
|
13
|
+
resources :projects
|
14
|
+
root to: "projects#index"
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_seed
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency "decidim/features/namer"
|
4
|
+
|
5
|
+
Decidim.register_feature(:budgets) do |feature|
|
6
|
+
feature.engine = Decidim::Budgets::ListEngine
|
7
|
+
feature.admin_engine = Decidim::Budgets::AdminEngine
|
8
|
+
feature.icon = "decidim/budgets/icon.svg"
|
9
|
+
feature.stylesheet = "decidim/budgets/budgets"
|
10
|
+
|
11
|
+
feature.on(:before_destroy) do |instance|
|
12
|
+
raise StandardError, "Can't remove this feature" if Decidim::Budgets::Project.where(feature: instance).any?
|
13
|
+
end
|
14
|
+
|
15
|
+
feature.register_resource do |resource|
|
16
|
+
resource.model_class_name = "Decidim::Budgets::Project"
|
17
|
+
resource.template = "decidim/budgets/projects/linked_projects"
|
18
|
+
end
|
19
|
+
|
20
|
+
feature.settings(:global) do |settings|
|
21
|
+
settings.attribute :total_budget, type: :integer, default: 100_000_000
|
22
|
+
settings.attribute :vote_threshold_percent, type: :integer, default: 70
|
23
|
+
settings.attribute :comments_always_enabled, type: :boolean, default: true
|
24
|
+
end
|
25
|
+
|
26
|
+
feature.settings(:step) do |settings|
|
27
|
+
settings.attribute :comments_enabled, type: :boolean, default: true
|
28
|
+
end
|
29
|
+
|
30
|
+
feature.seeds do
|
31
|
+
Decidim::ParticipatoryProcess.all.each do |process|
|
32
|
+
next unless process.steps.any?
|
33
|
+
|
34
|
+
feature = Decidim::Feature.create!(
|
35
|
+
name: Decidim::Features::Namer.new(process.organization.available_locales, :budgets).i18n_name,
|
36
|
+
manifest_name: :budgets,
|
37
|
+
participatory_process: process
|
38
|
+
)
|
39
|
+
|
40
|
+
3.times do
|
41
|
+
project = Decidim::Budgets::Project.create!(
|
42
|
+
feature: feature,
|
43
|
+
scope: process.organization.scopes.sample,
|
44
|
+
category: process.categories.sample,
|
45
|
+
title: Decidim::Faker::Localized.sentence(2),
|
46
|
+
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
47
|
+
Decidim::Faker::Localized.paragraph(3)
|
48
|
+
end,
|
49
|
+
short_description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
50
|
+
Decidim::Faker::Localized.paragraph(3)
|
51
|
+
end,
|
52
|
+
budget: Faker::Number.number(8)
|
53
|
+
)
|
54
|
+
|
55
|
+
Decidim::Comments::Seed.comments_for(project)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "searchlight"
|
3
|
+
require "kaminari"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module Budgets
|
7
|
+
# This is the engine that runs on the public interface of `decidim-budgets`.
|
8
|
+
# It mostly handles rendering the created projects associated to a participatory
|
9
|
+
# process.
|
10
|
+
class ListEngine < ::Rails::Engine
|
11
|
+
isolate_namespace Decidim::Budgets
|
12
|
+
|
13
|
+
routes do
|
14
|
+
resources :projects, only: [:index, :show]
|
15
|
+
resource :order, only: [:destroy] do
|
16
|
+
member do
|
17
|
+
post :checkout
|
18
|
+
end
|
19
|
+
resource :line_item, only: [:create, :destroy]
|
20
|
+
end
|
21
|
+
|
22
|
+
root to: "projects#index"
|
23
|
+
end
|
24
|
+
|
25
|
+
initializer "decidim_budgets.assets" do |app|
|
26
|
+
app.config.assets.precompile += %w(decidim_budgets_manifest.js)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "decidim/faker/localized"
|
3
|
+
require "decidim/dev"
|
4
|
+
|
5
|
+
FactoryGirl.define do
|
6
|
+
factory :budget_feature, class: Decidim::Feature do
|
7
|
+
name { Decidim::Features::Namer.new(participatory_process.organization.available_locales, :budgets).i18n_name }
|
8
|
+
manifest_name :budgets
|
9
|
+
participatory_process
|
10
|
+
|
11
|
+
trait :with_total_budget_and_vote_threshold_percent do
|
12
|
+
transient do
|
13
|
+
total_budget 100_000_000
|
14
|
+
vote_threshold_percent 70
|
15
|
+
end
|
16
|
+
|
17
|
+
settings do
|
18
|
+
{
|
19
|
+
total_budget: total_budget,
|
20
|
+
vote_threshold_percent: vote_threshold_percent
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
factory :project, class: Decidim::Budgets::Project do
|
27
|
+
title { Decidim::Faker::Localized.sentence(3) }
|
28
|
+
description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
|
29
|
+
short_description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
|
30
|
+
budget { Faker::Number.number(8) }
|
31
|
+
feature { create(:budget_feature) }
|
32
|
+
end
|
33
|
+
|
34
|
+
factory :order, class: Decidim::Budgets::Order do
|
35
|
+
feature { create(:budget_feature) }
|
36
|
+
user { create(:user, organization: feature.organization) }
|
37
|
+
end
|
38
|
+
|
39
|
+
factory :line_item, class: Decidim::Budgets::LineItem do
|
40
|
+
order
|
41
|
+
project { create(:project, feature: order.feature) }
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "decidim/budgets/admin"
|
3
|
+
require "decidim/budgets/list_engine"
|
4
|
+
require "decidim/budgets/admin_engine"
|
5
|
+
require "decidim/budgets/feature"
|
6
|
+
|
7
|
+
module Decidim
|
8
|
+
# Base module for this engine.
|
9
|
+
module Budgets
|
10
|
+
end
|
11
|
+
end
|