decidim 0.0.5 → 0.0.6

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.

Files changed (360) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.json +2 -1
  3. data/Gemfile.lock +121 -112
  4. data/README.md +28 -10
  5. data/Rakefile +1 -1
  6. data/decidim-admin/README.md +1 -1
  7. data/decidim-admin/app/assets/stylesheets/decidim/admin/_sidebar.scss +30 -1
  8. data/decidim-admin/app/assets/stylesheets/decidim/admin/_tables.scss +3 -0
  9. data/decidim-admin/app/assets/stylesheets/decidim/admin/application.scss +3 -0
  10. data/decidim-admin/app/commands/decidim/admin/create_participatory_process.rb +4 -1
  11. data/decidim-admin/app/commands/decidim/admin/create_participatory_process_admin.rb +26 -7
  12. data/decidim-admin/app/commands/decidim/admin/create_participatory_process_group.rb +54 -0
  13. data/decidim-admin/app/commands/decidim/admin/create_participatory_process_step.rb +0 -1
  14. data/decidim-admin/app/commands/decidim/admin/destroy_participatory_process_step.rb +3 -1
  15. data/decidim-admin/app/commands/decidim/admin/hide_resource.rb +37 -0
  16. data/decidim-admin/app/commands/decidim/admin/reorder_participatory_process_steps.rb +1 -0
  17. data/decidim-admin/app/commands/decidim/admin/unreport_resource.rb +33 -0
  18. data/decidim-admin/app/commands/decidim/admin/update_participatory_process.rb +4 -2
  19. data/decidim-admin/app/commands/decidim/admin/update_participatory_process_group.rb +57 -0
  20. data/decidim-admin/app/commands/decidim/admin/update_participatory_process_step.rb +1 -2
  21. data/decidim-admin/app/controllers/decidim/admin/application_controller.rb +4 -0
  22. data/decidim-admin/app/controllers/decidim/admin/categories_controller.rb +1 -1
  23. data/decidim-admin/app/controllers/decidim/admin/feature_permissions_controller.rb +2 -2
  24. data/decidim-admin/{lib → app/controllers}/decidim/admin/features/base_controller.rb +0 -0
  25. data/decidim-admin/app/controllers/decidim/admin/moderations_controller.rb +64 -0
  26. data/decidim-admin/app/controllers/decidim/admin/newsletters_controller.rb +1 -1
  27. data/decidim-admin/app/controllers/decidim/admin/participatory_process_groups_controller.rb +86 -0
  28. data/decidim-admin/app/controllers/decidim/admin/participatory_process_publications_controller.rb +1 -1
  29. data/decidim-admin/app/controllers/decidim/admin/participatory_process_step_activations_controller.rb +1 -1
  30. data/decidim-admin/app/controllers/decidim/admin/participatory_process_step_ordering_controller.rb +1 -1
  31. data/decidim-admin/app/controllers/decidim/admin/participatory_process_steps_controller.rb +1 -1
  32. data/decidim-admin/app/controllers/decidim/admin/participatory_process_user_roles_controller.rb +3 -3
  33. data/decidim-admin/app/controllers/decidim/admin/participatory_processes_controller.rb +3 -2
  34. data/decidim-admin/app/forms/decidim/admin/organization_form.rb +1 -0
  35. data/decidim-admin/app/forms/decidim/admin/participatory_process_form.rb +12 -1
  36. data/decidim-admin/app/forms/decidim/admin/participatory_process_group_form.rb +23 -0
  37. data/decidim-admin/app/forms/decidim/admin/participatory_process_step_form.rb +0 -1
  38. data/decidim-admin/app/forms/decidim/admin/participatory_process_user_role_form.rb +5 -1
  39. data/decidim-admin/app/helpers/decidim/admin/application_helper.rb +1 -0
  40. data/decidim-admin/app/helpers/decidim/admin/process_groups_for_select_helper.rb +20 -0
  41. data/decidim-admin/app/helpers/decidim/admin/processes_for_select_helper.rb +22 -0
  42. data/decidim-admin/app/models/decidim/admin/abilities/admin_user.rb +2 -0
  43. data/decidim-admin/app/models/decidim/admin/abilities/participatory_process_admin.rb +4 -0
  44. data/decidim-admin/app/models/decidim/admin/participatory_process_user_role.rb +1 -1
  45. data/decidim-admin/app/queries/decidim/admin/process_admins.rb +43 -0
  46. data/decidim-admin/app/views/decidim/admin/moderations/index.html.erb +65 -0
  47. data/decidim-admin/app/views/decidim/admin/organization/_form.html.erb +4 -0
  48. data/decidim-admin/app/views/decidim/admin/participatory_process_groups/_form.html.erb +17 -0
  49. data/decidim-admin/app/views/decidim/admin/participatory_process_groups/edit.html.erb +13 -0
  50. data/decidim-admin/app/views/decidim/admin/participatory_process_groups/index.html.erb +38 -0
  51. data/decidim-admin/app/views/decidim/admin/participatory_process_groups/new.html.erb +11 -0
  52. data/decidim-admin/app/views/decidim/admin/participatory_process_groups/show.html.erb +23 -0
  53. data/decidim-admin/app/views/decidim/admin/participatory_process_steps/_form.html.erb +0 -4
  54. data/decidim-admin/app/views/decidim/admin/participatory_process_steps/show.html.erb +4 -5
  55. data/decidim-admin/app/views/decidim/admin/participatory_process_user_roles/index.html.erb +27 -24
  56. data/decidim-admin/app/views/decidim/admin/participatory_processes/_form.html.erb +10 -1
  57. data/decidim-admin/app/views/decidim/admin/participatory_processes/show.html.erb +15 -1
  58. data/decidim-admin/app/views/layouts/decidim/admin/_header.html.erb +1 -0
  59. data/decidim-admin/app/views/layouts/decidim/admin/_language_chooser.html.erb +14 -0
  60. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +2 -0
  61. data/decidim-admin/app/views/layouts/decidim/admin/participatory_process.html.erb +5 -0
  62. data/decidim-admin/config/i18n-tasks.yml +3 -1
  63. data/decidim-admin/config/locales/ca.yml +83 -3
  64. data/decidim-admin/config/locales/en.yml +81 -1
  65. data/decidim-admin/config/locales/es.yml +81 -1
  66. data/decidim-admin/config/locales/eu.yml +340 -1
  67. data/decidim-admin/config/locales/fi.yml +464 -0
  68. data/decidim-admin/config/routes.rb +8 -0
  69. data/decidim-admin/db/seeds.rb +1 -1
  70. data/decidim-admin/lib/decidim/admin/engine.rb +1 -0
  71. data/decidim-admin/spec/commands/create_participatory_process_admin_spec.rb +10 -4
  72. data/decidim-admin/spec/commands/create_participatory_process_spec.rb +6 -1
  73. data/decidim-admin/spec/commands/hide_resource_spec.rb +41 -0
  74. data/decidim-admin/spec/commands/unreport_resource_spec.rb +42 -0
  75. data/decidim-admin/spec/commands/update_organization_spec.rb +1 -0
  76. data/decidim-admin/spec/features/admin_invite_spec.rb +1 -0
  77. data/decidim-admin/spec/features/admin_manages_feature_permissions_spec.rb +1 -1
  78. data/decidim-admin/spec/features/admin_manages_organization_admins_spec.rb +1 -1
  79. data/decidim-admin/spec/features/admin_manages_participatory_process_groups_spec.rb +107 -0
  80. data/decidim-admin/spec/features/admin_manages_participatory_processes_spec.rb +5 -0
  81. data/decidim-admin/spec/features/admin_manages_user_groups_spec.rb +11 -4
  82. data/decidim-admin/spec/forms/organization_form_spec.rb +2 -0
  83. data/decidim-admin/spec/forms/participatory_process_group_form_spec.rb +86 -0
  84. data/decidim-admin/spec/forms/participatory_process_step_form_spec.rb +0 -10
  85. data/decidim-admin/spec/forms/participatory_process_user_role_form_spec.rb +4 -0
  86. data/decidim-admin/spec/models/abilities/admin_user_spec.rb +3 -2
  87. data/decidim-admin/spec/models/abilities/participatory_process_admin_spec.rb +7 -0
  88. data/decidim-admin/spec/queries/process_admins_spec.rb +23 -0
  89. data/decidim-admin/spec/shared/manage_process_admins_examples.rb +2 -0
  90. data/decidim-admin/spec/shared/manage_process_steps_examples.rb +0 -10
  91. data/decidim-api/decidim-api.gemspec +1 -1
  92. data/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb +9 -1
  93. data/decidim-budgets/app/controllers/decidim/budgets/admin/projects_controller.rb +13 -1
  94. data/decidim-budgets/app/forms/decidim/budgets/admin/project_form.rb +5 -1
  95. data/decidim-budgets/app/models/decidim/budgets/order.rb +3 -0
  96. data/decidim-budgets/app/models/decidim/budgets/project.rb +9 -1
  97. data/decidim-budgets/app/services/decidim/budgets/project_search.rb +0 -5
  98. data/decidim-budgets/app/views/decidim/budgets/admin/projects/_form.html.erb +5 -3
  99. data/decidim-budgets/app/views/decidim/budgets/admin/projects/index.html.erb +9 -0
  100. data/decidim-budgets/app/views/decidim/budgets/line_items/update_budget.js.erb +1 -0
  101. data/decidim-budgets/app/views/decidim/budgets/projects/_filters.html.erb +2 -2
  102. data/decidim-budgets/app/views/decidim/budgets/projects/_filters_small_view.html.erb +18 -0
  103. data/decidim-budgets/app/views/decidim/budgets/projects/_project.html.erb +17 -2
  104. data/decidim-budgets/app/views/decidim/budgets/projects/_project_budget_button.html.erb +2 -2
  105. data/decidim-budgets/app/views/decidim/budgets/projects/_tags.html.erb +1 -1
  106. data/decidim-budgets/app/views/decidim/budgets/projects/index.html.erb +2 -1
  107. data/decidim-budgets/app/views/decidim/budgets/projects/show.html.erb +7 -1
  108. data/decidim-budgets/config/i18n-tasks.yml +1 -0
  109. data/decidim-budgets/config/locales/ca.yml +18 -3
  110. data/decidim-budgets/config/locales/en.yml +15 -0
  111. data/decidim-budgets/config/locales/es.yml +17 -2
  112. data/decidim-budgets/config/locales/eu.yml +97 -1
  113. data/decidim-budgets/config/locales/fi.yml +123 -0
  114. data/decidim-budgets/db/migrate/20170215132708_add_reference_to_projects.rb +7 -0
  115. data/decidim-budgets/lib/decidim/budgets/feature.rb +4 -2
  116. data/decidim-budgets/lib/decidim/budgets/seeds/Exampledocument.pdf +0 -0
  117. data/decidim-budgets/lib/decidim/budgets/seeds/city.jpeg +0 -0
  118. data/decidim-budgets/lib/decidim/budgets/test/factories.rb +21 -1
  119. data/decidim-budgets/spec/commands/add_line_item_spec.rb +10 -1
  120. data/decidim-budgets/spec/features/comments_spec.rb +10 -0
  121. data/decidim-budgets/spec/features/orders_spec.rb +47 -3
  122. data/decidim-budgets/spec/models/project_spec.rb +16 -1
  123. data/decidim-budgets/spec/services/project_search_spec.rb +9 -0
  124. data/decidim-budgets/spec/shared/admin_shared_context.rb +1 -1
  125. data/decidim-budgets/spec/shared/manage_projects_examples.rb +22 -0
  126. data/decidim-comments/app/assets/javascripts/decidim/comments/bundle.js +0 -0
  127. data/decidim-comments/app/commands/decidim/comments/create_comment.rb +9 -1
  128. data/decidim-comments/app/frontend/application/icon.component.jsx +1 -1
  129. data/decidim-comments/app/frontend/comments/add_comment_form.component.jsx +11 -10
  130. data/decidim-comments/app/frontend/comments/add_comment_form.component.test.jsx +5 -5
  131. data/decidim-comments/app/frontend/comments/comment.component.jsx +91 -1
  132. data/decidim-comments/app/frontend/comments/comment.component.test.jsx +18 -0
  133. data/decidim-comments/app/frontend/comments/comment_data.fragment.graphql +2 -0
  134. data/decidim-comments/app/frontend/comments/comment_order_selector.component.jsx +4 -5
  135. data/decidim-comments/app/frontend/comments/comments.query.graphql +1 -0
  136. data/decidim-comments/app/mailers/decidim/comments/comment_notification_mailer.rb +8 -0
  137. data/decidim-comments/app/models/decidim/comments/abilities/admin_user.rb +25 -0
  138. data/decidim-comments/app/models/decidim/comments/abilities/process_admin_user.rb +33 -0
  139. data/decidim-comments/app/models/decidim/comments/comment.rb +7 -1
  140. data/decidim-comments/app/models/decidim/comments/comment_vote.rb +3 -1
  141. data/decidim-comments/app/queries/decidim/comments/sorted_comments.rb +1 -0
  142. data/decidim-comments/app/views/decidim/comments/comment_notification_mailer/comment_created.html.erb +1 -1
  143. data/decidim-comments/app/views/decidim/comments/comment_notification_mailer/reply_created.html.erb +1 -1
  144. data/decidim-comments/config/locales/ca.yml +11 -0
  145. data/decidim-comments/config/locales/en.yml +12 -2
  146. data/decidim-comments/config/locales/es.yml +11 -0
  147. data/decidim-comments/config/locales/eu.yml +38 -1
  148. data/decidim-comments/config/locales/fi.yml +66 -0
  149. data/decidim-comments/lib/decidim/comments.rb +2 -0
  150. data/decidim-comments/lib/decidim/comments/admin.rb +9 -0
  151. data/decidim-comments/lib/decidim/comments/admin_engine.rb +22 -0
  152. data/decidim-comments/lib/decidim/comments/api/comment_type.rb +12 -0
  153. data/decidim-comments/lib/decidim/comments/commentable.rb +0 -2
  154. data/decidim-comments/lib/decidim/comments/engine.rb +1 -0
  155. data/decidim-comments/lib/decidim/comments/test/factories.rb +3 -0
  156. data/decidim-comments/spec/commands/create_comment_spec.rb +11 -0
  157. data/decidim-comments/spec/features/admin_manages_comments_spec.rb +23 -0
  158. data/decidim-comments/spec/features/comments_spec.rb +5 -173
  159. data/decidim-comments/spec/features/process_admin_manages_comments_spec.rb +24 -0
  160. data/decidim-comments/spec/features/report_comment_spec.rb +20 -0
  161. data/decidim-comments/spec/models/abilities/admin_user_spec.rb +20 -0
  162. data/decidim-comments/spec/models/abilities/process_admin_user_spec.rb +21 -0
  163. data/decidim-comments/spec/models/comment_spec.rb +1 -0
  164. data/decidim-comments/spec/queries/sorted_comments_spec.rb +11 -0
  165. data/decidim-comments/spec/shared/admin_shared_context.rb +11 -0
  166. data/decidim-comments/spec/types/comment_type_spec.rb +19 -0
  167. data/decidim-dev/config/locales/ca.yml +1 -1
  168. data/decidim-dev/config/locales/en.yml +1 -1
  169. data/decidim-dev/config/locales/es.yml +1 -1
  170. data/decidim-dev/config/locales/eu.yml +1 -1
  171. data/decidim-dev/config/locales/fi.yml +5 -0
  172. data/decidim-dev/decidim-dev.gemspec +3 -1
  173. data/decidim-dev/lib/decidim/dev/test/base_spec_helper.rb +1 -28
  174. data/decidim-dev/lib/decidim/dev/test/rspec_support/feature.rb +11 -0
  175. data/{decidim-meetings/spec/support → decidim-dev/lib/decidim/dev/test/rspec_support}/geocoder.rb +5 -1
  176. data/decidim-dev/lib/decidim/dev/test/rspec_support/html_matchers.rb +6 -0
  177. data/decidim-dev/lib/decidim/dev/test/rspec_support/i18n.rb +3 -0
  178. data/decidim-dev/lib/decidim/dev/test/rspec_support/webmock.rb +2 -0
  179. data/decidim-dev/lib/decidim/dev/test/spec_helper.rb +37 -0
  180. data/decidim-dev/lib/generators/decidim/dummy_generator.rb +5 -0
  181. data/decidim-dev/lib/generators/decidim/templates/autoprefixer.yml +8 -0
  182. data/decidim-dev/lib/generators/decidim/templates/autoprefixer_initializer.rb +16 -0
  183. data/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb +6 -17
  184. data/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb +6 -7
  185. data/decidim-meetings/app/controllers/decidim/meetings/application_controller.rb +1 -0
  186. data/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +14 -9
  187. data/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb +12 -1
  188. data/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb +1 -1
  189. data/decidim-meetings/app/helpers/decidim/meetings/application_helper.rb +2 -1
  190. data/decidim-meetings/app/helpers/decidim/meetings/map_helper.rb +10 -32
  191. data/decidim-meetings/app/models/decidim/meetings/meeting.rb +2 -1
  192. data/decidim-meetings/app/services/decidim/meetings/meeting_search.rb +0 -5
  193. data/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb +5 -3
  194. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters.html.erb +5 -3
  195. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +1 -1
  196. data/decidim-meetings/app/views/decidim/meetings/meetings/_meetings.html.erb +11 -1
  197. data/decidim-meetings/app/views/decidim/meetings/meetings/_tags.html.erb +1 -1
  198. data/decidim-meetings/app/views/decidim/meetings/meetings/index.html.erb +27 -32
  199. data/decidim-meetings/app/views/decidim/meetings/meetings/index.js.erb +2 -2
  200. data/decidim-meetings/app/views/decidim/meetings/meetings/show.html.erb +2 -15
  201. data/decidim-meetings/config/i18n-tasks.yml +1 -1
  202. data/decidim-meetings/config/locales/ca.yml +18 -3
  203. data/decidim-meetings/config/locales/en.yml +20 -3
  204. data/decidim-meetings/config/locales/es.yml +18 -3
  205. data/decidim-meetings/config/locales/eu.yml +75 -1
  206. data/decidim-meetings/config/locales/fi.yml +98 -0
  207. data/decidim-meetings/db/migrate/20170215132546_add_reference_to_meetings.rb +7 -0
  208. data/decidim-meetings/decidim-meetings.gemspec +0 -2
  209. data/decidim-meetings/lib/decidim/meetings/admin_engine.rb +0 -26
  210. data/decidim-meetings/lib/decidim/meetings/list_engine.rb +1 -9
  211. data/decidim-meetings/spec/commands/create_meeting_spec.rb +6 -14
  212. data/decidim-meetings/spec/commands/update_meeting_spec.rb +10 -29
  213. data/decidim-meetings/spec/features/explore_meetings_spec.rb +37 -13
  214. data/decidim-meetings/spec/forms/meeting_form_spec.rb +15 -1
  215. data/decidim-meetings/spec/models/meeting_spec.rb +1 -0
  216. data/decidim-meetings/spec/services/meeting_search_spec.rb +9 -0
  217. data/decidim-meetings/spec/shared/admin_shared_context.rb +1 -1
  218. data/decidim-meetings/spec/shared/manage_meetings_examples.rb +97 -1
  219. data/decidim-meetings/spec/spec_helper.rb +0 -5
  220. data/decidim-pages/app/commands/decidim/pages/admin/update_page.rb +1 -4
  221. data/decidim-pages/app/commands/decidim/pages/create_page.rb +1 -4
  222. data/decidim-pages/app/forms/decidim/pages/admin/page_form.rb +0 -3
  223. data/decidim-pages/app/models/decidim/pages/page.rb +8 -12
  224. data/decidim-pages/app/views/decidim/pages/admin/pages/_form.html.erb +0 -1
  225. data/decidim-pages/app/views/decidim/pages/application/show.html.erb +0 -1
  226. data/decidim-pages/config/locales/ca.yml +0 -1
  227. data/decidim-pages/config/locales/en.yml +0 -1
  228. data/decidim-pages/config/locales/es.yml +0 -1
  229. data/decidim-pages/config/locales/eu.yml +14 -1
  230. data/decidim-pages/config/locales/fi.yml +22 -0
  231. data/decidim-pages/db/migrate/20170220091402_remove_page_feature_titles.rb +5 -0
  232. data/decidim-pages/lib/decidim/pages/engine.rb +1 -0
  233. data/decidim-pages/lib/decidim/pages/feature.rb +4 -1
  234. data/decidim-pages/spec/commands/create_page_spec.rb +1 -2
  235. data/decidim-pages/spec/commands/update_page_spec.rb +0 -1
  236. data/decidim-pages/spec/factories.rb +6 -1
  237. data/decidim-pages/spec/features/admin_spec.rb +1 -17
  238. data/decidim-pages/spec/features/comments_spec.rb +10 -0
  239. data/decidim-pages/spec/features/page_show_spec.rb +1 -10
  240. data/decidim-pages/spec/forms/page_form_spec.rb +0 -21
  241. data/decidim-pages/spec/models/page_spec.rb +2 -4
  242. data/decidim-proposals/app/commands/decidim/proposals/admin/create_proposal.rb +4 -1
  243. data/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb +4 -1
  244. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposals_controller.rb +4 -0
  245. data/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb +12 -6
  246. data/decidim-proposals/app/forms/decidim/proposals/admin/proposal_form.rb +13 -2
  247. data/decidim-proposals/app/forms/decidim/proposals/proposal_form.rb +13 -2
  248. data/decidim-proposals/app/helpers/decidim/proposals/application_helper.rb +3 -0
  249. data/decidim-proposals/app/helpers/decidim/proposals/map_helper.rb +19 -0
  250. data/decidim-proposals/app/helpers/decidim/proposals/proposal_order_helper.rb +16 -0
  251. data/decidim-proposals/app/models/decidim/proposals/abilities/admin_user.rb +2 -0
  252. data/decidim-proposals/app/models/decidim/proposals/abilities/current_user.rb +3 -0
  253. data/decidim-proposals/app/models/decidim/proposals/abilities/process_admin_user.rb +2 -1
  254. data/decidim-proposals/app/models/decidim/proposals/proposal.rb +12 -3
  255. data/decidim-proposals/app/services/decidim/proposals/proposal_search.rb +0 -5
  256. data/decidim-proposals/app/views/decidim/proposals/admin/proposal_answers/edit.html.erb +1 -1
  257. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/_form.html.erb +8 -2
  258. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/index.html.erb +12 -14
  259. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters.html.erb +2 -2
  260. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters_small_view.html.erb +1 -1
  261. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
  262. data/decidim-proposals/app/views/decidim/proposals/proposals/_tags.html.erb +1 -1
  263. data/decidim-proposals/app/views/decidim/proposals/proposals/index.html.erb +27 -0
  264. data/decidim-proposals/app/views/decidim/proposals/proposals/new.html.erb +8 -2
  265. data/decidim-proposals/app/views/decidim/proposals/proposals/show.html.erb +18 -1
  266. data/decidim-proposals/config/i18n-tasks.yml +3 -1
  267. data/decidim-proposals/config/locales/ca.yml +11 -8
  268. data/decidim-proposals/config/locales/en.yml +9 -6
  269. data/decidim-proposals/config/locales/es.yml +14 -11
  270. data/decidim-proposals/config/locales/eu.yml +119 -1
  271. data/decidim-proposals/config/locales/fi.yml +143 -0
  272. data/decidim-proposals/db/migrate/20170215113152_create_proposal_reports.rb +14 -0
  273. data/decidim-proposals/db/migrate/20170215131720_add_report_count_to_proposals.rb +5 -0
  274. data/decidim-proposals/db/migrate/20170215132030_add_reference_to_proposals.rb +7 -0
  275. data/decidim-proposals/db/migrate/20170220152416_add_hidden_at_to_proposals.rb +5 -0
  276. data/decidim-proposals/db/migrate/20170228105156_add_geolocalization_fields_to_proposals.rb +7 -0
  277. data/decidim-proposals/db/migrate/20170307085300_migrate_proposal_reports_data_to_reports.rb +26 -0
  278. data/decidim-proposals/decidim-proposals.gemspec +1 -1
  279. data/decidim-proposals/lib/decidim/proposals/feature.rb +4 -3
  280. data/decidim-proposals/lib/decidim/proposals/test/factories.rb +8 -0
  281. data/decidim-proposals/spec/features/admin_manages_proposals_spec.rb +3 -0
  282. data/decidim-proposals/spec/features/comments_spec.rb +11 -0
  283. data/decidim-proposals/spec/features/process_admin_manages_proposals_spec.rb +3 -0
  284. data/decidim-proposals/spec/features/proposals_spec.rb +98 -15
  285. data/decidim-proposals/spec/features/report_proposal_spec.rb +19 -0
  286. data/decidim-proposals/spec/helpers/proposal_order_helper_spec.rb +30 -0
  287. data/decidim-proposals/spec/models/decidim/proposals/proposal_spec.rb +2 -0
  288. data/decidim-proposals/spec/services/decidim/proposals/proposal_search_spec.rb +9 -0
  289. data/decidim-proposals/spec/shared/create_proposal_examples.rb +29 -2
  290. data/decidim-proposals/spec/shared/manage_proposals_examples.rb +95 -26
  291. data/decidim-proposals/spec/shared/proposal_form_examples.rb +29 -1
  292. data/decidim-results/app/forms/decidim/results/admin/result_form.rb +9 -1
  293. data/decidim-results/app/models/decidim/results/result.rb +2 -1
  294. data/decidim-results/app/services/decidim/results/result_search.rb +0 -5
  295. data/decidim-results/app/views/decidim/results/admin/results/_form.html.erb +5 -3
  296. data/decidim-results/app/views/decidim/results/results/_filters.html.erb +2 -2
  297. data/decidim-results/app/views/decidim/results/results/_filters_small_view.html.erb +18 -0
  298. data/decidim-results/app/views/decidim/results/results/_tags.html.erb +1 -1
  299. data/decidim-results/app/views/decidim/results/results/index.html.erb +1 -0
  300. data/decidim-results/app/views/decidim/results/results/show.html.erb +1 -0
  301. data/decidim-results/config/i18n-tasks.yml +2 -0
  302. data/decidim-results/config/locales/ca.yml +15 -2
  303. data/decidim-results/config/locales/en.yml +15 -2
  304. data/decidim-results/config/locales/es.yml +15 -2
  305. data/decidim-results/config/locales/eu.yml +57 -1
  306. data/decidim-results/config/locales/fi.yml +77 -0
  307. data/decidim-results/db/migrate/20170215132624_add_reference_to_results.rb +7 -0
  308. data/decidim-results/lib/decidim/results/test/factories.rb +6 -0
  309. data/decidim-results/spec/features/comments_spec.rb +10 -0
  310. data/decidim-results/spec/features/explore_results_spec.rb +27 -0
  311. data/decidim-results/spec/models/result_spec.rb +1 -0
  312. data/decidim-results/spec/services/result_search_spec.rb +9 -0
  313. data/decidim-results/spec/shared/admin_shared_context.rb +1 -1
  314. data/decidim-system/README.md +45 -8
  315. data/decidim-system/app/commands/decidim/system/register_organization.rb +3 -0
  316. data/decidim-system/app/commands/decidim/system/update_organization.rb +2 -0
  317. data/decidim-system/app/controllers/decidim/system/application_controller.rb +2 -0
  318. data/decidim-system/app/forms/decidim/system/register_organization_form.rb +1 -0
  319. data/decidim-system/app/forms/decidim/system/update_organization_form.rb +18 -0
  320. data/decidim-system/app/views/decidim/system/organizations/edit.html.erb +10 -0
  321. data/decidim-system/app/views/decidim/system/organizations/new.html.erb +33 -19
  322. data/decidim-system/config/locales/ca.yml +3 -0
  323. data/decidim-system/config/locales/en.yml +3 -0
  324. data/decidim-system/config/locales/es.yml +3 -0
  325. data/decidim-system/config/locales/eu.yml +3 -0
  326. data/decidim-system/config/locales/fi.yml +68 -0
  327. data/decidim-system/db/seeds.rb +1 -1
  328. data/decidim-system/decidim-system.gemspec +1 -1
  329. data/decidim-system/lib/decidim/system/engine.rb +1 -0
  330. data/decidim-system/spec/commands/decidim/system/register_organization_spec.rb +3 -0
  331. data/decidim-system/spec/commands/decidim/system/update_organization_spec.rb +53 -0
  332. data/decidim-system/spec/features/organizations_spec.rb +5 -0
  333. data/docs/analytics.md +23 -0
  334. data/docs/how_to_create_a_plugin.md +3 -1
  335. data/lib/generators/decidim/app_generator.rb +4 -0
  336. data/lib/generators/decidim/demo_generator.rb +1 -1
  337. data/lib/generators/decidim/install_generator.rb +8 -1
  338. data/lib/generators/decidim/review_app_generator.rb +53 -0
  339. data/lib/generators/decidim/templates/Gemfile.erb +1 -5
  340. data/lib/generators/decidim/templates/app.json.erb +1 -1
  341. data/lib/generators/decidim/templates/carrierwave.rb +2 -2
  342. data/lib/generators/decidim/templates/decidim_controller.rb.erb +5 -0
  343. data/lib/generators/decidim/templates/initializer.rb +4 -0
  344. data/package.json +4 -4
  345. data/yarn.lock +106 -165
  346. metadata +100 -54
  347. data/decidim-meetings/app/assets/config/decidim_meetings_manifest.js +0 -2
  348. data/decidim-meetings/app/assets/javascripts/decidim/meetings/map.js.es6.erb +0 -97
  349. data/decidim-meetings/app/assets/stylesheets/decidim/meetings/map.css +0 -3
  350. data/decidim-meetings/app/services/decidim/meetings/static_map_generator.rb +0 -50
  351. data/decidim-meetings/app/views/decidim/meetings/meetings/_address_details.html.erb +0 -5
  352. data/decidim-meetings/spec/controllers/meetings_controller_spec.rb +0 -41
  353. data/decidim-meetings/spec/services/static_map_generator_spec.rb +0 -33
  354. data/decidim-meetings/vendor/assets/javascripts/leaflet-svg-icon.js +0 -179
  355. data/decidim-meetings/vendor/assets/javascripts/leaflet-tilelayer-here.js +0 -166
  356. data/decidim-meetings/vendor/assets/javascripts/leaflet.js +0 -9
  357. data/decidim-meetings/vendor/assets/javascripts/leaflet.markercluster.js +0 -7
  358. data/decidim-meetings/vendor/assets/stylesheets/MarkerCluster.Default.css +0 -60
  359. data/decidim-meetings/vendor/assets/stylesheets/MarkerCluster.css +0 -14
  360. data/decidim-meetings/vendor/assets/stylesheets/leaflet.css +0 -624
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
- RSpec.shared_examples "create a proposal" do |with_author|
3
+ RSpec.shared_examples "create a proposal" do |with_author|
4
4
  let(:feature) { create(:proposal_feature) }
5
5
  let(:organization) { feature.organization }
6
6
  let(:form) do
@@ -13,11 +13,16 @@ RSpec.shared_examples "create a proposal" do |with_author|
13
13
  end
14
14
  let(:author) { create(:user, organization: organization) } if with_author
15
15
 
16
+ let(:address) { nil }
17
+ let(:latitude) { 40.1234 }
18
+ let(:longitude) { 2.1234 }
19
+
16
20
  describe "call" do
17
21
  let(:form_params) do
18
22
  {
19
23
  title: "A reasonable proposal title",
20
- body: "A reasonable proposal body"
24
+ body: "A reasonable proposal body",
25
+ address: address
21
26
  }
22
27
  end
23
28
 
@@ -64,6 +69,28 @@ RSpec.shared_examples "create a proposal" do |with_author|
64
69
  expect(proposal.author).to eq(author)
65
70
  end
66
71
  end
72
+
73
+ context "when geocoding is enabled" do
74
+ let(:feature) { create(:proposal_feature, :with_geocoding_enabled) }
75
+
76
+ context "when the address is present" do
77
+ let(:address) { "Carrer Pare Llaurador 113, baixos, 08224 Terrassa" }
78
+
79
+ before do
80
+ Geocoder::Lookup::Test.add_stub(address, [
81
+ { 'latitude' => latitude, 'longitude' => longitude }
82
+ ])
83
+ end
84
+
85
+ it "sets the latitude and longitude" do
86
+ command.call
87
+ proposal = Decidim::Proposals::Proposal.last
88
+
89
+ expect(proposal.latitude).to eq(latitude)
90
+ expect(proposal.longitude).to eq(longitude)
91
+ end
92
+ end
93
+ end
67
94
  end
68
95
  end
69
96
  end
@@ -1,6 +1,16 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
3
  RSpec.shared_examples "manage proposals" do
4
+ let(:address) { "Carrer Pare Llaurador 113, baixos, 08224 Terrassa" }
5
+ let(:latitude) { 40.1234 }
6
+ let(:longitude) { 2.1234 }
7
+
8
+ before do
9
+ Geocoder::Lookup::Test.add_stub(address, [
10
+ { 'latitude' => latitude, 'longitude' => longitude }
11
+ ])
12
+ end
13
+
4
14
  context "previewing proposals" do
5
15
  it "allows the user to preview the proposal" do
6
16
  new_window = window_opened_by { click_link proposal.title }
@@ -15,7 +25,8 @@ RSpec.shared_examples "manage proposals" do
15
25
  context "creation" do
16
26
  context "when official_proposals setting is enabled" do
17
27
  before do
18
- current_feature.update_attributes(settings: { official_proposals_enabled: true } )
28
+ current_feature.settings[:official_proposals_enabled] = true
29
+ current_feature.save
19
30
  end
20
31
 
21
32
  context "when creation is enabled" do
@@ -29,57 +40,115 @@ RSpec.shared_examples "manage proposals" do
29
40
  )
30
41
  end
31
42
 
32
- context "when scoped_proposals setting is enabled" do
43
+ context "when process is not related to any scope" do
33
44
  before do
34
- current_feature.update_attributes(settings: { scoped_proposals_enabled: true } )
45
+ participatory_process.update_attributes(scope: nil)
35
46
  end
36
47
 
37
- it "can be filtered by scope" do
48
+ it "can be related to a scope" do
38
49
  find(".actions .new").click
39
50
 
40
51
  within "form" do
41
52
  expect(page).to have_content(/Scope/i)
42
53
  end
43
54
  end
55
+
56
+ it "creates a new proposal" do
57
+ find(".actions .new").click
58
+
59
+ within ".new_proposal" do
60
+ fill_in :proposal_title, with: "Make decidim great again"
61
+ fill_in :proposal_body, with: "Decidim is great but it can be better"
62
+ select category.name["en"], from: :proposal_category_id
63
+ select scope.name, from: :proposal_scope_id
64
+
65
+ find("*[type=submit]").click
66
+ end
67
+
68
+ within ".flash" do
69
+ expect(page).to have_content("successfully")
70
+ end
71
+
72
+ within "table" do
73
+ proposal = Decidim::Proposals::Proposal.last
74
+
75
+ expect(page).to have_content("Make decidim great again")
76
+ expect(proposal.body).to eq("Decidim is great but it can be better")
77
+ expect(proposal.category).to eq(category)
78
+ expect(proposal.scope).to eq(scope)
79
+ end
80
+ end
44
81
  end
45
82
 
46
- context "when scoped_proposals setting is not enabled" do
83
+ context "when process is related to a scope" do
47
84
  before do
48
- current_feature.update_attributes(settings: { scoped_proposals_enabled: false } )
85
+ participatory_process.update_attributes(scope: scope)
49
86
  end
50
87
 
51
- it "cannot be filtered by scope" do
88
+ it "cannot be related to a scope" do
52
89
  find(".actions .new").click
53
90
 
54
91
  within "form" do
55
92
  expect(page).not_to have_content(/Scope/i)
56
93
  end
57
94
  end
58
- end
59
95
 
60
- it "creates a new proposal" do
61
- find(".actions .new").click
96
+ it "creates a new proposal related to the process scope" do
97
+ find(".actions .new").click
62
98
 
63
- within ".new_proposal" do
64
- fill_in :proposal_title, with: "Make decidim great again"
65
- fill_in :proposal_body, with: "Decidim is great but it can be better"
66
- select category.name["en"], from: :proposal_category_id
67
- select scope.name, from: :proposal_scope_id
99
+ within ".new_proposal" do
100
+ fill_in :proposal_title, with: "Make decidim great again"
101
+ fill_in :proposal_body, with: "Decidim is great but it can be better"
102
+ select category.name["en"], from: :proposal_category_id
103
+ find("*[type=submit]").click
104
+ end
68
105
 
69
- find("*[type=submit]").click
70
- end
106
+ within ".flash" do
107
+ expect(page).to have_content("successfully")
108
+ end
109
+
110
+ within "table" do
111
+ proposal = Decidim::Proposals::Proposal.last
71
112
 
72
- within ".flash" do
73
- expect(page).to have_content("successfully")
113
+ expect(page).to have_content("Make decidim great again")
114
+ expect(proposal.body).to eq("Decidim is great but it can be better")
115
+ expect(proposal.category).to eq(category)
116
+ expect(proposal.scope).to eq(scope)
117
+ end
74
118
  end
75
119
 
76
- within "table" do
77
- proposal = Decidim::Proposals::Proposal.last
120
+ context "when geocoding is enabled" do
121
+ let!(:current_feature) do
122
+ create(:proposal_feature,
123
+ :with_geocoding_enabled,
124
+ manifest: manifest,
125
+ participatory_process: participatory_process)
126
+ end
78
127
 
79
- expect(page).to have_content("Make decidim great again")
80
- expect(proposal.body).to eq("Decidim is great but it can be better")
81
- expect(proposal.category).to eq(category)
82
- expect(proposal.scope).to eq(scope)
128
+ it "creates a new proposal related to the process scope" do
129
+ find(".actions .new").click
130
+
131
+ within ".new_proposal" do
132
+ fill_in :proposal_title, with: "Make decidim great again"
133
+ fill_in :proposal_body, with: "Decidim is great but it can be better"
134
+ fill_in :proposal_address, with: address
135
+ select category.name["en"], from: :proposal_category_id
136
+ find("*[type=submit]").click
137
+ end
138
+
139
+ within ".flash" do
140
+ expect(page).to have_content("successfully")
141
+ end
142
+
143
+ within "table" do
144
+ proposal = Decidim::Proposals::Proposal.last
145
+
146
+ expect(page).to have_content("Make decidim great again")
147
+ expect(proposal.body).to eq("Decidim is great but it can be better")
148
+ expect(proposal.category).to eq(category)
149
+ expect(proposal.scope).to eq(scope)
150
+ end
151
+ end
83
152
  end
84
153
  end
85
154
  end
@@ -119,7 +188,7 @@ RSpec.shared_examples "manage proposals" do
119
188
  end
120
189
 
121
190
  within ".edit_proposal_answer" do
122
- fill_in_i18n(
191
+ fill_in_i18n_editor(
123
192
  :proposal_answer_answer,
124
193
  "#answer-tabs",
125
194
  en: "The proposal doesn't make any sense",
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
3
  RSpec.shared_examples "a proposal form" do
4
- let(:feature) { create(:feature)}
4
+ let(:feature) { create(:proposal_feature) }
5
5
  let(:title) { "Oriol for president!" }
6
6
  let(:body) { "Everything would be better" }
7
7
  let(:author) { create(:user, organization: feature.organization) }
@@ -9,6 +9,9 @@ RSpec.shared_examples "a proposal form" do
9
9
  let(:scope) { create(:scope, organization: feature.organization) }
10
10
  let(:category_id) { category.try(:id)}
11
11
  let(:scope_id) { scope.try(:id)}
12
+ let(:latitude) { 40.1234 }
13
+ let(:longitude) { 2.1234 }
14
+ let(:address) { nil }
12
15
  let(:params) do
13
16
  {
14
17
  title: title,
@@ -16,6 +19,7 @@ RSpec.shared_examples "a proposal form" do
16
19
  author: author,
17
20
  category_id: category_id,
18
21
  scope_id: scope_id,
22
+ address: address
19
23
  }
20
24
  end
21
25
 
@@ -62,6 +66,30 @@ RSpec.shared_examples "a proposal form" do
62
66
  it { is_expected.to be_invalid}
63
67
  end
64
68
 
69
+ context "when geocoding is enabled" do
70
+ let(:feature) { create(:proposal_feature, :with_geocoding_enabled) }
71
+
72
+ context "when the address is not present" do
73
+ it { is_expected.to be_invalid}
74
+ end
75
+
76
+ context "when the address is present" do
77
+ let(:address) { "Carrer Pare Llaurador 113, baixos, 08224 Terrassa" }
78
+
79
+ before do
80
+ Geocoder::Lookup::Test.add_stub(address, [
81
+ { 'latitude' => latitude, 'longitude' => longitude }
82
+ ])
83
+ end
84
+
85
+ it "validates the address and store its coordinates" do
86
+ expect(subject).to be_valid
87
+ expect(subject.latitude).to eq(latitude)
88
+ expect(subject.longitude).to eq(longitude)
89
+ end
90
+ end
91
+ end
92
+
65
93
  describe "category" do
66
94
  subject { form.category }
67
95
 
@@ -27,8 +27,16 @@ module Decidim
27
27
  @proposals ||= Decidim.find_resource_manifest(:proposals).try(:resource_scope, context.current_feature)&.order(title: :asc)&.pluck(:title, :id)
28
28
  end
29
29
 
30
+ def organization_scopes
31
+ current_organization.scopes
32
+ end
33
+
34
+ def process_scope
35
+ current_feature.participatory_process.scope
36
+ end
37
+
30
38
  def scope
31
- @scope ||= context.current_feature.scopes.where(id: decidim_scope_id).first
39
+ @scope ||= process_scope || organization_scopes.where(id: decidim_scope_id).first
32
40
  end
33
41
 
34
42
  def category
@@ -8,6 +8,7 @@ module Decidim
8
8
  include Decidim::HasFeature
9
9
  include Decidim::HasScope
10
10
  include Decidim::HasCategory
11
+ include Decidim::HasReference
11
12
  include Decidim::Comments::Commentable
12
13
 
13
14
  feature_manifest_name "results"
@@ -19,7 +20,7 @@ module Decidim
19
20
 
20
21
  # Public: Overrides the `accepts_new_comments?` Commentable concern method.
21
22
  def accepts_new_comments?
22
- commentable? && !feature.active_step_settings.comments_blocked
23
+ commentable? && !feature.active_step_settings.comments_blocked
23
24
  end
24
25
 
25
26
  # Public: Overrides the `comments_have_alignment?` Commentable concern method.
@@ -20,11 +20,6 @@ module Decidim
20
20
  .or(query.where(localized_search_text_in(:description), text: "%#{search_text}%"))
21
21
  end
22
22
 
23
- # Handle the scope_id filter
24
- def search_scope_id
25
- query.where(decidim_scope_id: scope_id)
26
- end
27
-
28
23
  private
29
24
 
30
25
  # Internal: builds the needed query to search for a text in the organization's
@@ -6,9 +6,11 @@
6
6
  <%= form.translated :editor, :description %>
7
7
  </div>
8
8
 
9
- <div class="field" >
10
- <%= form.collection_select :decidim_scope_id, current_organization.scopes, :id, :name, include_blank: true %>
11
- </div>
9
+ <% if !@form.process_scope %>
10
+ <div class="field" >
11
+ <%= form.collection_select :decidim_scope_id, organization_scopes, :id, :name %>
12
+ </div>
13
+ <% end %>
12
14
 
13
15
  <div class="field" >
14
16
  <%= form.categories_select :decidim_category_id, current_participatory_process.categories, include_blank: true, disable_parents: false %>
@@ -12,8 +12,8 @@
12
12
  </div>
13
13
  </div>
14
14
 
15
- <% if current_organization.scopes.any? %>
16
- <%= form.collection_check_boxes :scope_id, current_organization.scopes, lambda {|scope| scope.id.to_s}, :name, legend_title: t('.scopes') %>
15
+ <% if current_organization.scopes.any? && !current_participatory_process.scope %>
16
+ <%= form.collection_check_boxes :scope_id, search_organization_scopes, lambda {|scope| scope.id.to_s}, :name, legend_title: t('.scopes') %>
17
17
  <% end %>
18
18
 
19
19
  <% if current_feature.categories.any? %>
@@ -0,0 +1,18 @@
1
+ <div class="filters-controls hide-for-mediumlarge">
2
+ <button data-open="filter-box" class="filters-controls__trigger">
3
+ <%= t ".filter" %>
4
+ <%= icon "caret-bottom", class: "icon--small float-right", aria_label: t('.unfold'), role: "img" %>
5
+ </button>
6
+ </div>
7
+
8
+ <div class="reveal" id="filter-box" data-reveal>
9
+ <div class="reveal__header">
10
+ <h3 class="reveal__title"><%= t ".filter_by" %>:</h3>
11
+ <button class="close-button" data-close aria-label="<%= t(".close_modal") %>" type="button">
12
+ <span aria-hidden="true">&times;</span>
13
+ </button>
14
+ </div>
15
+ <div class="filters">
16
+ <%= render partial: "filters" %>
17
+ </div>
18
+ </div>
@@ -3,7 +3,7 @@
3
3
  <% if result.category.present? %>
4
4
  <li><%= link_to translated_attribute(result.category.name), decidim_results.results_path(filter: { category_id: result.category.id }) %></li>
5
5
  <% end %>
6
- <% if result.scope.present? %>
6
+ <% if !current_participatory_process.scope && result.scope.present? %>
7
7
  <li><%= link_to result.scope.name, decidim_results.results_path(filter: { scope_id: [result.scope.id] }) %></li>
8
8
  <% end %>
9
9
  </ul>
@@ -8,6 +8,7 @@
8
8
 
9
9
  <div class="row">
10
10
  <div class="columns mediumlarge-4 large-3">
11
+ <%= render partial: "filters_small_view"%>
11
12
  <div class="card card--secondary show-for-mediumlarge" >
12
13
  <%= render partial: "filters" %>
13
14
  </div>
@@ -38,6 +38,7 @@
38
38
  </div>
39
39
  </div>
40
40
  </div>
41
+ <%= feature_reference(result) %>
41
42
  <%= render partial: "decidim/shared/share_modal" %>
42
43
  </div>
43
44
  <div class="columns mediumlarge-8 mediumlarge-pull-4">
@@ -4,3 +4,5 @@ ignore_unused:
4
4
  - "decidim.features.results.name"
5
5
  - "decidim.features.results.settings.*"
6
6
  - "decidim.resource_links.*"
7
+ - activerecord.attributes.*
8
+ - activemodel.attributes.*
@@ -1,4 +1,12 @@
1
1
  ca:
2
+ activemodel:
3
+ attributes:
4
+ result:
5
+ decidim_category_id: Categoria
6
+ decidim_scope_id: Àmbit
7
+ description: Descripció
8
+ proposal_ids: Propostes incloses
9
+ title: Títol
2
10
  decidim:
3
11
  features:
4
12
  results:
@@ -10,9 +18,9 @@ ca:
10
18
  comments_blocked: Comentaris bloquejats
11
19
  resource_links:
12
20
  included_proposals:
13
- proposals: Propostes incloses en aquest resultat
21
+ result_proposals: Propostes incloses en aquest resultat
14
22
  meetings_through_proposals:
15
- meetings: Trobades relacionades
23
+ result_meetings: Trobades relacionades
16
24
  results:
17
25
  actions:
18
26
  confirm_destroy: Esteu segur que voleu suprimir aquest resultat?
@@ -54,6 +62,11 @@ ca:
54
62
  category: Categoria
55
63
  scopes: Àmbits
56
64
  search: Cerca
65
+ filters_small_view:
66
+ close_modal: Tancar finestra
67
+ filter: Filtra
68
+ filter_by: Filtra per
69
+ unfold: Desplega
57
70
  show:
58
71
  stats:
59
72
  attendees: Assistents