decidim 0.0.1 → 0.0.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.

Files changed (313) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +4 -5
  3. data/.eslintignore +2 -0
  4. data/.eslintrc.json +2 -0
  5. data/.gitignore +1 -0
  6. data/.inch.yml +5 -0
  7. data/.mention-bot +8 -0
  8. data/.rubocop.yml +8 -31
  9. data/.ruby-version +1 -1
  10. data/.travis.yml +24 -14
  11. data/Dockerfile +1 -3
  12. data/Gemfile +1 -3
  13. data/Gemfile.lock +175 -138
  14. data/README.md +63 -5
  15. data/Rakefile +1 -1
  16. data/codecov.yml +1 -0
  17. data/decidim-admin/Rakefile +1 -1
  18. data/decidim-admin/app/assets/javascripts/decidim/admin/application.js.es6 +0 -1
  19. data/decidim-admin/app/assets/stylesheets/decidim/admin/_foundation_and_overrides.scss +1 -0
  20. data/decidim-admin/app/assets/stylesheets/decidim/admin/_icons.scss +9 -0
  21. data/decidim-admin/app/assets/stylesheets/decidim/admin/application.scss +1 -0
  22. data/decidim-admin/app/commands/decidim/admin/create_feature.rb +3 -1
  23. data/decidim-admin/app/commands/decidim/admin/create_participatory_process.rb +26 -14
  24. data/decidim-admin/app/commands/decidim/admin/destroy_feature.rb +5 -0
  25. data/decidim-admin/app/commands/decidim/admin/destroy_participatory_process_step.rb +29 -0
  26. data/decidim-admin/app/commands/decidim/admin/update_feature.rb +47 -0
  27. data/decidim-admin/app/commands/decidim/admin/update_organization.rb +3 -1
  28. data/decidim-admin/app/controllers/decidim/admin/features_controller.rb +37 -2
  29. data/decidim-admin/app/controllers/decidim/admin/participatory_process_step_activations_controller.rb +0 -16
  30. data/decidim-admin/app/controllers/decidim/admin/participatory_process_steps_controller.rb +10 -3
  31. data/decidim-admin/app/controllers/decidim/admin/static_pages_controller.rb +4 -4
  32. data/decidim-admin/app/controllers/decidim/admin/user_groups_controller.rb +32 -0
  33. data/decidim-admin/app/controllers/decidim/admin/users_controller.rb +87 -0
  34. data/decidim-admin/app/forms/decidim/admin/category_form.rb +1 -7
  35. data/decidim-admin/app/forms/decidim/admin/feature_form.rb +26 -0
  36. data/decidim-admin/app/forms/decidim/admin/organization_form.rb +2 -0
  37. data/decidim-admin/app/forms/decidim/admin/participatory_process_step_form.rb +1 -1
  38. data/decidim-admin/app/forms/decidim/admin/static_page_form.rb +2 -3
  39. data/decidim-admin/app/models/decidim/admin/abilities/admin_user.rb +6 -0
  40. data/decidim-admin/app/views/decidim/admin/features/_feature.html.erb +4 -1
  41. data/decidim-admin/app/views/decidim/admin/features/_form.html.erb +49 -0
  42. data/decidim-admin/app/views/decidim/admin/features/_settings_fields.html.erb +5 -0
  43. data/decidim-admin/app/views/decidim/admin/features/edit.html.erb +9 -0
  44. data/decidim-admin/app/views/decidim/admin/features/index.html.erb +6 -0
  45. data/decidim-admin/app/views/decidim/admin/features/new.html.erb +1 -1
  46. data/decidim-admin/app/views/decidim/admin/organization/_form.html.erb +8 -0
  47. data/decidim-admin/app/views/decidim/admin/participatory_process_attachments/_form.html.erb +1 -1
  48. data/decidim-admin/app/views/decidim/admin/participatory_process_steps/index.html.erb +2 -6
  49. data/decidim-admin/app/views/decidim/admin/user_groups/index.html.erb +32 -0
  50. data/decidim-admin/app/views/decidim/admin/users/_form.html.erb +6 -0
  51. data/decidim-admin/app/views/decidim/admin/users/index.html.erb +54 -0
  52. data/decidim-admin/app/views/decidim/admin/users/new.html.erb +11 -0
  53. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +2 -0
  54. data/decidim-admin/app/views/layouts/decidim/admin/participatory_process.html.erb +1 -1
  55. data/decidim-admin/config/i18n-tasks.yml +1 -0
  56. data/decidim-admin/config/locales/ca.yml +103 -5
  57. data/decidim-admin/config/locales/en.yml +57 -4
  58. data/decidim-admin/config/locales/es.yml +103 -5
  59. data/decidim-admin/config/routes.rb +11 -0
  60. data/decidim-admin/decidim-admin.gemspec +2 -3
  61. data/decidim-admin/lib/decidim/admin/features/base_controller.rb +7 -3
  62. data/decidim-admin/lib/decidim/admin/test/factories.rb +8 -0
  63. data/decidim-admin/spec/commands/create_category_spec.rb +2 -1
  64. data/decidim-admin/spec/commands/create_feature_spec.rb +21 -2
  65. data/decidim-admin/spec/commands/create_participatory_process_spec.rb +13 -1
  66. data/decidim-admin/spec/commands/create_static_page_spec.rb +1 -1
  67. data/decidim-admin/spec/commands/destroy_participatory_process_step_spec.rb +45 -0
  68. data/decidim-admin/spec/commands/update_category_spec.rb +2 -1
  69. data/decidim-admin/spec/commands/update_feature_spec.rb +79 -0
  70. data/decidim-admin/spec/commands/update_organization_spec.rb +3 -2
  71. data/decidim-admin/spec/commands/update_static_page_spec.rb +3 -2
  72. data/decidim-admin/spec/factories.rb +2 -9
  73. data/decidim-admin/spec/features/admin_manages_features_spec.rb +84 -2
  74. data/decidim-admin/spec/features/admin_manages_organization_admins_spec.rb +71 -0
  75. data/decidim-admin/spec/features/admin_manages_user_groups_spec.rb +24 -0
  76. data/decidim-admin/spec/forms/category_form_spec.rb +3 -7
  77. data/decidim-admin/spec/forms/organization_form_spec.rb +8 -2
  78. data/decidim-admin/spec/forms/participatory_process_form_spec.rb +2 -1
  79. data/decidim-admin/spec/forms/participatory_process_step_form_spec.rb +2 -21
  80. data/decidim-admin/spec/forms/scope_form_spec.rb +1 -1
  81. data/decidim-admin/spec/forms/static_page_form_spec.rb +2 -7
  82. data/decidim-admin/spec/models/abilities/admin_user_spec.rb +22 -0
  83. data/decidim-admin/spec/shared/manage_process_attachments_examples.rb +2 -1
  84. data/decidim-admin/spec/shared/manage_process_steps_examples.rb +2 -15
  85. data/decidim-admin/spec/spec_helper.rb +3 -1
  86. data/decidim-api/Rakefile +1 -1
  87. data/decidim-api/decidim-api.gemspec +3 -3
  88. data/decidim-api/spec/factories.rb +2 -2
  89. data/decidim-api/spec/spec_helper.rb +3 -1
  90. data/decidim-comments/Rakefile +1 -1
  91. data/decidim-comments/app/assets/javascripts/decidim/comments/bundle.js +0 -0
  92. data/decidim-comments/app/commands/decidim/comments/vote_comment.rb +38 -0
  93. data/decidim-comments/app/frontend/application/icon.component.jsx +9 -4
  94. data/decidim-comments/app/frontend/application/icon.component.test.jsx +12 -2
  95. data/decidim-comments/app/frontend/comments/add_comment_form.component.jsx +43 -11
  96. data/decidim-comments/app/frontend/comments/add_comment_form.mutation.graphql +1 -4
  97. data/decidim-comments/app/frontend/comments/comment.component.jsx +67 -7
  98. data/decidim-comments/app/frontend/comments/comment.component.test.jsx +49 -1
  99. data/decidim-comments/app/frontend/comments/comment_data.fragment.graphql +3 -0
  100. data/decidim-comments/app/frontend/comments/comment_order_selector.component.jsx +51 -6
  101. data/decidim-comments/app/frontend/comments/comment_order_selector.component.test.jsx +12 -1
  102. data/decidim-comments/app/frontend/comments/comment_thread.component.jsx +11 -5
  103. data/decidim-comments/app/frontend/comments/comment_thread.component.test.jsx +13 -3
  104. data/decidim-comments/app/frontend/comments/comment_thread.fragment.graphql +1 -3
  105. data/decidim-comments/app/frontend/comments/comments.component.jsx +37 -11
  106. data/decidim-comments/app/frontend/comments/comments.component.test.jsx +44 -7
  107. data/decidim-comments/app/frontend/comments/comments.query.graphql +2 -2
  108. data/decidim-comments/app/frontend/comments/down_vote.fragment.graphql +6 -0
  109. data/decidim-comments/app/frontend/comments/down_vote.mutation.graphql +7 -0
  110. data/decidim-comments/app/frontend/comments/down_vote_button.component.jsx +84 -0
  111. data/decidim-comments/app/frontend/comments/down_vote_button.component.test.jsx +48 -0
  112. data/decidim-comments/app/frontend/comments/up_vote.fragment.graphql +6 -0
  113. data/decidim-comments/app/frontend/comments/up_vote.mutation.graphql +7 -0
  114. data/decidim-comments/app/frontend/comments/up_vote_button.component.jsx +84 -0
  115. data/decidim-comments/app/frontend/comments/up_vote_button.component.test.jsx +48 -0
  116. data/decidim-comments/app/frontend/comments/vote_button.component.jsx +19 -0
  117. data/decidim-comments/app/frontend/comments/vote_button_component.test.jsx +38 -0
  118. data/decidim-comments/app/frontend/support/generate_comments_data.js +7 -2
  119. data/decidim-comments/app/helpers/decidim/comments/comments_helper.rb +1 -1
  120. data/decidim-comments/app/models/decidim/comments/application_record.rb +9 -0
  121. data/decidim-comments/app/models/decidim/comments/comment.rb +19 -4
  122. data/decidim-comments/app/models/decidim/comments/comment_vote.rb +22 -0
  123. data/decidim-comments/app/models/decidim/comments/seed.rb +27 -0
  124. data/decidim-comments/app/queries/decidim/comments/comments_with_replies.rb +88 -0
  125. data/decidim-comments/app/resolvers/decidim/comments/vote_comment_resolver.rb +20 -0
  126. data/decidim-comments/app/types/decidim/comments/comment_mutation_type.rb +19 -0
  127. data/decidim-comments/app/types/decidim/comments/comment_type.rb +38 -2
  128. data/decidim-comments/config/locales/en.yml +1 -0
  129. data/decidim-comments/db/migrate/20161130143508_create_comments.rb +4 -2
  130. data/decidim-comments/db/migrate/20161219150806_create_comment_votes.rb +13 -0
  131. data/decidim-comments/decidim-comments.gemspec +0 -3
  132. data/decidim-comments/lib/decidim/comments/mutation_extensions.rb +9 -0
  133. data/decidim-comments/lib/decidim/comments/query_extensions.rb +3 -5
  134. data/decidim-comments/lib/decidim/comments/test/factories.rb +22 -0
  135. data/decidim-comments/spec/commands/vote_comment_spec.rb +124 -0
  136. data/decidim-comments/spec/factories.rb +2 -9
  137. data/decidim-comments/spec/features/comments_spec.rb +37 -0
  138. data/decidim-comments/spec/models/comment_spec.rb +34 -0
  139. data/decidim-comments/spec/models/comment_vote_spec.rb +44 -0
  140. data/decidim-comments/spec/models/seed_spec.rb +19 -0
  141. data/decidim-comments/spec/queries/comments_with_replies_spec.rb +86 -0
  142. data/decidim-comments/spec/spec_helper.rb +3 -1
  143. data/decidim-comments/spec/support/dummy.rb +1 -1
  144. data/decidim-comments/spec/types/comment_mutation_type_spec.rb +46 -0
  145. data/decidim-comments/spec/types/comment_type_spec.rb +57 -3
  146. data/{decidim-api → decidim-comments}/spec/types/mutation_type_spec.rb +11 -0
  147. data/decidim-dev/README.md +7 -11
  148. data/decidim-dev/decidim-dev.gemspec +5 -4
  149. data/decidim-dev/lib/decidim/dev.rb +20 -0
  150. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.docx +0 -0
  151. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.odt +0 -0
  152. data/decidim-dev/lib/decidim/dev/assets/Exampledocument.pdf +0 -0
  153. data/decidim-dev/lib/decidim/dev/assets/avatar.svg +14 -0
  154. data/decidim-dev/lib/decidim/dev/assets/city.jpeg +0 -0
  155. data/decidim-dev/lib/decidim/dev/assets/city2.jpeg +0 -0
  156. data/decidim-dev/lib/decidim/dev/assets/city3.jpeg +0 -0
  157. data/decidim-dev/lib/decidim/dev/assets/malicious.jpg +0 -0
  158. data/decidim-dev/lib/decidim/{common_rake.rb → dev/common_rake.rb} +1 -1
  159. data/decidim-dev/lib/decidim/{dummy_authorization_handler.rb → dev/dummy_authorization_handler.rb} +4 -4
  160. data/decidim-dev/lib/decidim/{test → dev/test}/authorization_shared_examples.rb +0 -8
  161. data/decidim-dev/lib/decidim/{test → dev/test}/base_spec_helper.rb +4 -1
  162. data/decidim-dev/lib/decidim/{test → dev/test}/i18n_spec.rb +1 -1
  163. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/action_mailer.rb +0 -0
  164. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/active_job.rb +0 -0
  165. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/authenticated_controller_context.rb +0 -0
  166. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/authorization_handlers.rb +1 -1
  167. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/capybara.rb +3 -10
  168. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/database_cleaner.rb +0 -0
  169. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/engine_routes.rb +0 -0
  170. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/factory_girl.rb +0 -0
  171. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/feature.rb +10 -0
  172. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/feature_context.rb +2 -2
  173. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/helpers.rb +4 -0
  174. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/i18n.rb +1 -0
  175. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/bind-polyfill.js +18 -0
  176. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/object-assign-polyfill.js +24 -0
  177. data/decidim-dev/lib/decidim/dev/test/rspec_support/phantomjs_polyfills/promise.js +233 -0
  178. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/translation_helpers.rb +0 -0
  179. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/warden.rb +0 -0
  180. data/decidim-dev/lib/decidim/{test → dev/test}/rspec_support/wisper.rb +0 -0
  181. data/decidim-dev/lib/generators/decidim/dummy_generator.rb +2 -2
  182. data/decidim-dev/lib/generators/decidim/templates/decidim_dev.rb +2 -0
  183. data/decidim-meetings/Rakefile +1 -1
  184. data/decidim-meetings/app/assets/images/decidim/meetings/icon.svg +1 -0
  185. data/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb +2 -0
  186. data/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb +2 -0
  187. data/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +30 -6
  188. data/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb +14 -0
  189. data/decidim-meetings/app/helpers/decidim/meetings/application_helper.rb +10 -0
  190. data/decidim-meetings/app/models/decidim/meetings/meeting.rb +18 -1
  191. data/decidim-meetings/app/services/decidim/meetings/meeting_search.rb +48 -0
  192. data/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb +9 -2
  193. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters.html.erb +24 -0
  194. data/decidim-meetings/app/views/decidim/meetings/meetings/_meetings.html.erb +30 -0
  195. data/decidim-meetings/app/views/decidim/meetings/meetings/_tags.html.erb +10 -0
  196. data/decidim-meetings/app/views/decidim/meetings/meetings/index.html.erb +8 -26
  197. data/decidim-meetings/app/views/decidim/meetings/meetings/index.js.erb +2 -0
  198. data/decidim-meetings/app/views/decidim/meetings/meetings/show.html.erb +1 -0
  199. data/decidim-meetings/config/locales/ca.yml +7 -0
  200. data/decidim-meetings/config/locales/en.yml +7 -0
  201. data/decidim-meetings/config/locales/es.yml +7 -0
  202. data/decidim-meetings/db/migrate/20161130121354_create_meetings.rb +2 -0
  203. data/decidim-meetings/decidim-meetings.gemspec +2 -0
  204. data/decidim-meetings/lib/decidim/meetings/feature.rb +7 -2
  205. data/decidim-meetings/lib/decidim/meetings/list_engine.rb +3 -0
  206. data/decidim-meetings/spec/commands/create_meeting_spec.rb +21 -0
  207. data/decidim-meetings/spec/commands/update_meeting_spec.rb +17 -2
  208. data/decidim-meetings/spec/factories.rb +3 -3
  209. data/decidim-meetings/spec/features/explore_meetings_spec.rb +53 -0
  210. data/decidim-meetings/spec/forms/meeting_form_spec.rb +19 -1
  211. data/decidim-meetings/spec/models/meeting_spec.rb +20 -0
  212. data/decidim-meetings/spec/services/meeting_search_spec.rb +146 -0
  213. data/decidim-meetings/spec/shared/admin_shared_context.rb +4 -2
  214. data/decidim-meetings/spec/shared/manage_meetings_examples.rb +5 -2
  215. data/decidim-meetings/spec/spec_helper.rb +1 -1
  216. data/decidim-pages/Rakefile +1 -1
  217. data/decidim-pages/app/assets/images/decidim/pages/icon.svg +3 -0
  218. data/decidim-pages/app/commands/decidim/pages/admin/update_page.rb +1 -2
  219. data/decidim-pages/app/forms/decidim/pages/admin/page_form.rb +0 -1
  220. data/decidim-pages/app/views/decidim/pages/admin/pages/_form.html.erb +0 -1
  221. data/decidim-pages/app/views/decidim/pages/application/show.html.erb +3 -3
  222. data/decidim-pages/config/i18n-tasks.yml +1 -0
  223. data/decidim-pages/config/locales/ca.yml +5 -1
  224. data/decidim-pages/config/locales/en.yml +5 -1
  225. data/decidim-pages/config/locales/es.yml +5 -1
  226. data/decidim-pages/db/migrate/20170110145040_remove_commentable_flag_from_pages.rb +5 -0
  227. data/decidim-pages/lib/decidim/pages/feature.rb +13 -3
  228. data/decidim-pages/spec/commands/update_page_spec.rb +2 -1
  229. data/decidim-pages/spec/factories.rb +2 -2
  230. data/decidim-pages/spec/features/admin_spec.rb +0 -11
  231. data/decidim-pages/spec/features/page_show_spec.rb +13 -10
  232. data/decidim-pages/spec/forms/page_form_spec.rb +4 -4
  233. data/decidim-pages/spec/spec_helper.rb +3 -1
  234. data/decidim-proposals/Rakefile +1 -1
  235. data/decidim-proposals/app/assets/config/decidim_proposals_manifest.css +1 -0
  236. data/decidim-proposals/app/assets/config/decidim_proposals_manifest.js +1 -0
  237. data/decidim-proposals/app/assets/images/decidim/proposals/icon.svg +1 -0
  238. data/decidim-proposals/app/assets/javascripts/decidim/proposals/social_share.js +2 -0
  239. data/decidim-proposals/app/assets/stylesheets/decidim/proposals/social_share.css.scss +14 -0
  240. data/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb +5 -3
  241. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposals_controller.rb +3 -3
  242. data/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb +25 -0
  243. data/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb +33 -6
  244. data/decidim-proposals/app/forms/decidim/proposals/admin/proposal_form.rb +7 -6
  245. data/decidim-proposals/app/forms/decidim/proposals/proposal_form.rb +6 -6
  246. data/decidim-proposals/app/helpers/decidim/proposals/application_helper.rb +3 -1
  247. data/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb +27 -0
  248. data/decidim-proposals/app/models/decidim/proposals/proposal.rb +8 -0
  249. data/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb +20 -0
  250. data/decidim-proposals/app/services/decidim/proposals/proposal_search.rb +39 -11
  251. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/_form.html.erb +2 -2
  252. data/decidim-proposals/app/views/decidim/proposals/proposal_votes/create.js.erb +5 -0
  253. data/decidim-proposals/app/views/decidim/proposals/proposals/_count.html.erb +1 -0
  254. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters.html.erb +26 -0
  255. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposal.html.erb +11 -2
  256. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposals.html.erb +4 -0
  257. data/decidim-proposals/app/views/decidim/proposals/proposals/_share.html.erb +33 -0
  258. data/decidim-proposals/app/views/decidim/proposals/proposals/_vote_button.html.erb +13 -0
  259. data/decidim-proposals/app/views/decidim/proposals/proposals/_votes_count.html.erb +6 -0
  260. data/decidim-proposals/app/views/decidim/proposals/proposals/index.html.erb +11 -11
  261. data/decidim-proposals/app/views/decidim/proposals/proposals/index.js.erb +5 -0
  262. data/decidim-proposals/app/views/decidim/proposals/proposals/show.html.erb +31 -4
  263. data/decidim-proposals/config/i18n-tasks.yml +1 -0
  264. data/decidim-proposals/config/initializers/social_share_button.rb +4 -0
  265. data/decidim-proposals/config/locales/ca.yml +28 -2
  266. data/decidim-proposals/config/locales/en.yml +27 -1
  267. data/decidim-proposals/config/locales/es.yml +28 -2
  268. data/decidim-proposals/db/migrate/20170112115253_create_proposal_votes.rb +12 -0
  269. data/decidim-proposals/db/migrate/20170113114245_add_text_search_indexes.rb +6 -0
  270. data/decidim-proposals/db/migrate/20170118120151_add_counter_cache_votes_to_proposals.rb +5 -0
  271. data/decidim-proposals/decidim-proposals.gemspec +2 -1
  272. data/decidim-proposals/lib/decidim/proposals/engine.rb +8 -1
  273. data/decidim-proposals/lib/decidim/proposals/feature.rb +30 -4
  274. data/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb +10 -3
  275. data/decidim-proposals/spec/factories.rb +9 -4
  276. data/decidim-proposals/spec/features/admin_manages_proposals_spec.rb +2 -0
  277. data/decidim-proposals/spec/features/process_admin_manages_proposals_spec.rb +2 -0
  278. data/decidim-proposals/spec/features/proposals_spec.rb +41 -31
  279. data/decidim-proposals/spec/features/vote_proposal_spec.rb +78 -0
  280. data/decidim-proposals/spec/forms/decidim/proposals/proposal_form_spec.rb +11 -10
  281. data/decidim-proposals/spec/helpers/proposal_votes_helper_spec.rb +28 -0
  282. data/decidim-proposals/spec/lib/decidim/proposals/feature_spec.rb +1 -1
  283. data/decidim-proposals/spec/models/decidim/proposals/proposal_spec.rb +20 -3
  284. data/decidim-proposals/spec/models/decidim/proposals/proposal_vote_spec.rb +43 -0
  285. data/decidim-proposals/spec/services/decidim/proposals/proposal_search_spec.rb +50 -4
  286. data/decidim-proposals/spec/shared/manage_proposals_examples.rb +1 -1
  287. data/decidim-proposals/spec/spec_helper.rb +1 -1
  288. data/decidim-system/Rakefile +1 -1
  289. data/decidim-system/app/commands/decidim/system/register_organization.rb +13 -12
  290. data/decidim-system/decidim-system.gemspec +2 -3
  291. data/decidim-system/spec/factories.rb +1 -1
  292. data/decidim-system/spec/spec_helper.rb +3 -1
  293. data/docs/social_providers.md +41 -0
  294. data/karma.conf.js +4 -2
  295. data/lib/generators/decidim/app_generator.rb +6 -0
  296. data/lib/generators/decidim/demo_generator.rb +2 -2
  297. data/lib/generators/decidim/install_generator.rb +5 -4
  298. data/lib/generators/decidim/templates/Gemfile.erb +3 -5
  299. data/lib/generators/decidim/templates/initializer.rb +1 -1
  300. data/lib/generators/decidim/templates/secrets.yml.erb +26 -0
  301. data/lib/generators/decidim/templates/social_share_button.rb +7 -0
  302. data/package.json +16 -6
  303. data/webpack.config.js +23 -8
  304. data/yarn.lock +401 -345
  305. metadata +130 -48
  306. data/Gemfile.common +0 -1
  307. data/decidim-admin/Gemfile +0 -6
  308. data/decidim-comments/Gemfile +0 -6
  309. data/decidim-comments/package.json +0 -21
  310. data/decidim-dev/Gemfile +0 -6
  311. data/decidim-dev/lib/decidim/test/rspec_support/bullet.rb +0 -15
  312. data/decidim-dev/lib/generators/decidim/templates/bullet.rb +0 -6
  313. data/decidim-system/Gemfile +0 -6
@@ -8,23 +8,40 @@ module Decidim
8
8
 
9
9
  it { is_expected.to be_valid }
10
10
 
11
+ it "has a votes association returning proposal votes" do
12
+ expect(subject.votes.count).to eq(0)
13
+ end
14
+
11
15
  context "when the category is from another feature" do
12
- subject { create(:proposal, category: create(:category))}
16
+ subject { build(:proposal, category: create(:category))}
13
17
 
14
18
  it { is_expected.to be_invalid}
15
19
  end
16
20
 
17
21
  context "when the author is from another organization" do
18
- subject { create(:proposal, author: create(:user))}
22
+ subject { build(:proposal, author: create(:user))}
19
23
 
20
24
  it { is_expected.to be_invalid}
21
25
  end
22
26
 
23
27
  context "when the scope is from another organization" do
24
- subject { create(:proposal, scope: create(:scope))}
28
+ subject { build(:proposal, scope: create(:scope))}
25
29
 
26
30
  it { is_expected.to be_invalid}
27
31
  end
32
+
33
+ describe "#voted_by?" do
34
+ let(:user) { create(:user, organization: subject.organization) }
35
+
36
+ it "returns false if the proposal is not voted by the given user" do
37
+ expect(subject.voted_by?(user)).to be_falsey
38
+ end
39
+
40
+ it "returns true if the proposal is not voted by the given user" do
41
+ create(:proposal_vote, proposal: subject, author: user)
42
+ expect(subject.voted_by?(user)).to be_truthy
43
+ end
44
+ end
28
45
  end
29
46
  end
30
47
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ module Decidim
5
+ module Proposals
6
+ describe ProposalVote do
7
+ let!(:organization) { create(:organization) }
8
+ let!(:feature) { create(:feature, organization: organization)}
9
+ let!(:participatory_process) { create(:participatory_process, organization: organization) }
10
+ let!(:author) { create(:user, organization: organization) }
11
+ let!(:proposal) { create(:proposal, feature: feature, author: author)}
12
+ let!(:proposal_vote) { create(:proposal_vote, proposal: proposal, author: author) }
13
+
14
+ it "is valid" do
15
+ expect(proposal_vote).to be_valid
16
+ end
17
+
18
+ it "has an associated author" do
19
+ expect(proposal_vote.author).to be_a(Decidim::User)
20
+ end
21
+
22
+ it "has an associated proposal" do
23
+ expect(proposal_vote.proposal).to be_a(Decidim::Proposals::Proposal)
24
+ end
25
+
26
+ it "validates uniqueness for author and proposal combination" do
27
+ expect {
28
+ create(:proposal_vote, proposal: proposal, author: author)
29
+ }.to raise_error(ActiveRecord::RecordInvalid)
30
+ end
31
+
32
+ context "when proposal and author have different organization" do
33
+ let(:other_author) { create(:user) }
34
+ let(:other_proposal) { create(:proposal) }
35
+
36
+ it "is invalid" do
37
+ proposal_vote = build(:proposal_vote, proposal: other_proposal, author: other_author)
38
+ expect(proposal_vote).to be_invalid
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -4,13 +4,25 @@ module Decidim
4
4
  module Proposals
5
5
  describe ProposalSearch do
6
6
  let(:feature) { create(:feature) }
7
+ let(:user) { create(:user, organization: feature.organization) }
7
8
  let!(:proposal) { create(:proposal, feature: feature)}
8
9
  let(:page) { 1 }
9
10
 
10
- describe "proposals" do
11
+ describe "results" do
11
12
  let(:random_seed) { 0.2 }
13
+ let(:activity) { [] }
14
+ let(:search_text) { nil }
12
15
 
13
- subject { described_class.new(feature, page, random_seed).proposals }
16
+ subject do
17
+ described_class.new({
18
+ feature: feature,
19
+ page: page,
20
+ random_seed: random_seed,
21
+ activity: activity,
22
+ search_text: search_text,
23
+ current_user: user
24
+ }).results
25
+ end
14
26
 
15
27
  context "when given a random seed" do
16
28
  it "sets the seed at the database" do
@@ -35,15 +47,49 @@ module Decidim
35
47
 
36
48
  it "filters the proposals per page" do
37
49
  create_list(:proposal, 3, feature: feature)
38
- proposals = described_class.new(feature, page, random_seed, 2).proposals
50
+ proposals = described_class.new({
51
+ feature: feature,
52
+ per_page: 2,
53
+ page: page,
54
+ random_seed: random_seed
55
+ }).results
39
56
 
40
57
  expect(proposals.total_pages).to eq(2)
41
58
  expect(proposals.total_count).to eq(4)
42
59
  end
60
+
61
+ describe "when the filter includes search_text" do
62
+ let(:search_text) { "dog" }
63
+
64
+ it "returns the proposals containing the search in the title or the body" do
65
+ create_list(:proposal, 3, feature: feature)
66
+ create(:proposal, title: "A dog", feature: feature)
67
+ create(:proposal, body: "There is a dog in the office", feature: feature)
68
+
69
+ expect(subject.total_count).to eq(2)
70
+ end
71
+ end
72
+
73
+ describe "when the filter includes activity" do
74
+ let(:activity) { ["voted"] }
75
+
76
+ it "returns the proposals voted by the user" do
77
+ create_list(:proposal, 3, feature: feature)
78
+ create(:proposal_vote, proposal: Proposal.first, author: user)
79
+
80
+ expect(subject.total_count).to eq(1)
81
+ end
82
+ end
43
83
  end
44
84
 
45
85
  describe "random_seed" do
46
- subject { described_class.new(feature, page, random_seed).random_seed }
86
+ subject do
87
+ described_class.new({
88
+ feature: feature,
89
+ page: page,
90
+ random_seed: random_seed
91
+ }).random_seed
92
+ end
47
93
 
48
94
  context "without a given random seed" do
49
95
  let(:random_seed) { nil }
@@ -19,7 +19,7 @@ RSpec.shared_examples "manage proposals" do
19
19
  fill_in :proposal_title, with: "Make decidim great again"
20
20
  fill_in :proposal_body, with: "Decidim is great but it can be better"
21
21
  select category.name["en"], from: :proposal_category_id
22
- select scope.name["en"], from: :proposal_scope_id
22
+ select scope.name, from: :proposal_scope_id
23
23
 
24
24
  find("*[type=submit]").click
25
25
  end
@@ -1,2 +1,2 @@
1
1
  ENV["ENGINE_NAME"] = File.dirname(File.dirname(__FILE__)).split("/").last
2
- require "decidim/test/base_spec_helper"
2
+ require "decidim/dev/test/base_spec_helper"
@@ -1,2 +1,2 @@
1
1
  # frozen_string_literal: true
2
- require "decidim/common_rake"
2
+ require "decidim/dev/common_rake"
@@ -22,9 +22,11 @@ module Decidim
22
22
  return broadcast(:invalid) if form.invalid?
23
23
 
24
24
  transaction do
25
- organization = create_organization
26
- invite_admin(organization)
27
- CreateDefaultPages.call(organization)
25
+ @organization = create_organization
26
+ CreateDefaultPages.call(@organization)
27
+ invite_form = invite_user_form(@organization)
28
+ return broadcast(:invalid) if invite_form.invalid?
29
+ Decidim::InviteUser.call(invite_form)
28
30
  end
29
31
 
30
32
  broadcast(:ok)
@@ -45,16 +47,15 @@ module Decidim
45
47
  )
46
48
  end
47
49
 
48
- def invite_admin(organization)
49
- Decidim::User.invite!(
50
- {
51
- name: form.organization_admin_name,
52
- email: form.organization_admin_email,
53
- organization: organization,
54
- roles: ["admin"]
55
- },
56
- nil,
50
+ def invite_user_form(organization)
51
+ Decidim::InviteAdminForm.from_params(
52
+ name: form.organization_admin_name,
53
+ email: form.organization_admin_email,
54
+ roles: %w(admin),
57
55
  invitation_instructions: "organization_admin_invitation_instructions"
56
+ ).with_context(
57
+ current_user: form.current_user,
58
+ current_organization: organization
58
59
  )
59
60
  end
60
61
  end
@@ -20,11 +20,10 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency "devise-i18n", "~> 1.1.0"
21
21
  s.add_dependency "rectify", "~> 0.8.0"
22
22
  s.add_dependency "devise_invitable", "~> 1.7.0"
23
- s.add_dependency "foundation-rails", "~> 6.2.4.0"
24
23
  s.add_dependency "sassc-rails", "~> 1.3.0"
25
- s.add_dependency "jquery-rails", "~> 4.0"
24
+ s.add_dependency "jquery-rails", "~> 4.2.2"
26
25
  s.add_dependency "turbolinks", *Decidim.rails_version
27
- s.add_dependency "foundation_rails_helper", "~> 2.0.0"
26
+ s.add_dependency "foundation_rails_helper", "~> 3.0.0.rc"
28
27
  s.add_dependency "active_link_to", "~> 1.0.0"
29
28
 
30
29
  s.add_development_dependency "decidim-dev", Decidim.version
@@ -1,4 +1,4 @@
1
- require_relative "../../decidim-core/spec/factories"
1
+ require "decidim/core/test/factories"
2
2
 
3
3
  FactoryGirl.define do
4
4
  factory :admin, class: Decidim::System::Admin do
@@ -1,2 +1,4 @@
1
1
  ENV["ENGINE_NAME"] = File.dirname(File.dirname(__FILE__)).split("/").last
2
- require "decidim/test/base_spec_helper"
2
+ require "decidim/dev/test/base_spec_helper"
3
+
4
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,41 @@
1
+ # Social providers integration
2
+
3
+ If you want to enable sign up through social providers like Facebook you will need to generate app credentials and write them into the Rails secrets file: `config/secrets.yml`.
4
+
5
+ ## Facebook
6
+
7
+ 1. Navigate to [Facebook Developers Page](https://developers.facebook.com/)
8
+ 2. Follow the "Add a New App" link.
9
+ 3. Click the "Website" option.
10
+ 4. Fill in your application name and click "Create New Facebook App ID" button.
11
+ 5. Fill in the contact email info and category.
12
+ 6. Validate the captcha.
13
+ 7. Ignore the source code and fill in the URL field.
14
+ 8. Navigate to the application dashboard and copy the APP_ID and APP_SECRET
15
+ 9. Paste credentials in `config/secrets.yml`. Ensure the `enabled` attribute is `true`.
16
+
17
+ ## Twitter
18
+
19
+ 1. Navigate to [Twitter Developers Page](https://dev.twitter.com/)
20
+ 2. Follow the "My apps" link.
21
+ 3. Click the "Create New App" button.
22
+ 4. Fill in the `Name`, `Description` fields.
23
+ 5. Fill in the `Website` and `Callback URL` fields with the same value. If you are working on a development app you need to use `http://127.0.0.1:3000/` instead of `http://localhost:3000/`.
24
+ 5. Check the 'Developer Agreement' checkbox and click the 'Create your Twitter application' button.
25
+ 6. Navigate to the "Keys and Access Tokens" tab and copy the API_KEY and API_SECRET.
26
+ 8. (Optional) Navigate to the "Permissions" tab and check the "Request email addresses from users" checkbox.
27
+ 9. Paste credentials in `config/secrets.yml`. Ensure the `enabled` attribute is `true`.
28
+
29
+ ## Google
30
+
31
+ 1. Navigate to [Google Developers Page](https://console.developers.google.com)
32
+ 2. Follow the 'Create projecte' link.
33
+ 3. Fill in the name of your app.
34
+ 4. Navigate to the projecte dashboard and click on "Enable API"
35
+ 5. Click on `Google+ API` and then "Enable"
36
+ 6. Navigate to the project credentials page and click on `OAuth consent screen`.
37
+ 7. Fill in the `Product name` field
38
+ 8. Click on `Credentials` tab and click on "Create credentials" button. Select `OAuth client ID`.
39
+ 9. Select `Web applications`. Fill in the `Authorized Javascript origins` with your url. Then fill in the `Authorized redirect URIs` with your url and append the path `/users/auth/google_oauth2/callback`.
40
+ 10. Copy the CLIENT_ID AND CLIENT_SECRET
41
+ 11. Paste credentials in `config/secrets.yml`. Ensure the `enabled` attribute is `true`.
data/karma.conf.js CHANGED
@@ -9,11 +9,13 @@ module.exports = function(config) {
9
9
  config.set({
10
10
  basePath: '',
11
11
  frameworks: ['jasmine'],
12
- files: [testGlob, srcGlob],
12
+ files: [testGlob, srcGlob, 'decidim-core/**/*.component.js.es6', 'decidim-core/**/*.test.js'],
13
13
  exclude: ['decidim-*/app/frontend/entry.js'],
14
14
  preprocessors: {
15
15
  [testGlob]: ['webpack', 'sourcemap'],
16
- [srcGlob]: ['webpack']
16
+ [srcGlob]: ['webpack'],
17
+ 'decidim-core/**/*.test.js': ['webpack', 'sourcemap'],
18
+ 'decidim-core/**/*.component.js.es6': ['webpack']
17
19
  },
18
20
  webpack: webpackConfig,
19
21
  webpackMiddleware: { noInfo: true },
@@ -80,6 +80,12 @@ module Decidim
80
80
  ]
81
81
  end
82
82
 
83
+ def add_ignore_uploads
84
+ unless options["skip_git"]
85
+ append_file ".gitignore", "\n# Ignore public uploads\npublic/uploads"
86
+ end
87
+ end
88
+
83
89
  def remove_default_error_pages
84
90
  remove_file "public/404.html"
85
91
  remove_file "public/500.html"
@@ -11,16 +11,16 @@ module Decidim
11
11
  class DemoGenerator < Rails::Generators::Base
12
12
  def source_paths
13
13
  [
14
- File.expand_path("../../../../decidim-dev/lib/decidim", __FILE__)
14
+ File.expand_path("../../../../decidim-dev/lib/decidim/dev", __FILE__)
15
15
  ]
16
16
  end
17
17
 
18
18
  def authorization_handlers
19
19
  remove_file "app/services/example_authorization_handler.rb"
20
+ template "dummy_authorization_handler.rb", "app/services/decidim/dummy_authorization_handler.rb"
20
21
  gsub_file "config/initializers/decidim.rb",
21
22
  /ExampleAuthorizationHandler/,
22
23
  "Decidim::DummyAuthorizationHandler"
23
- template "dummy_authorization_handler.rb", "app/services/decidim/dummy_authorization_handler.rb"
24
24
  end
25
25
  end
26
26
  end
@@ -37,6 +37,11 @@ module Decidim
37
37
  def copy_initializer
38
38
  template "initializer.rb", "config/initializers/decidim.rb"
39
39
  template "carrierwave.rb", "config/initializers/carrierwave.rb"
40
+ template "social_share_button.rb", "config/initializers/social_share_button.rb"
41
+ end
42
+
43
+ def secrets
44
+ template "secrets.yml.erb", "config/secrets.yml", force: true
40
45
  end
41
46
 
42
47
  def remove_layout
@@ -84,10 +89,6 @@ module Decidim
84
89
  end
85
90
  end
86
91
 
87
- def secrets
88
- template "secrets.yml.erb", "config/secrets.yml", force: true
89
- end
90
-
91
92
  private
92
93
 
93
94
  def recreate_db
@@ -4,17 +4,15 @@ ruby '<%= RUBY_VERSION %>'
4
4
  <% if options[:path] %>
5
5
  gem "decidim", path: "<%= options[:path] %>"
6
6
  <% elsif options[:edge] %>
7
- gem "decidim", github: 'AjuntamentdeBarcelona/decidim'
7
+ gem "decidim", git: 'https://github.com/AjuntamentdeBarcelona/decidim.git'
8
8
  <% elsif options[:branch] %>
9
- gem "decidim", github: 'AjuntamentdeBarcelona/decidim', branch: "<%= options[:branch] %>"
9
+ gem "decidim", git: 'https://github.com/AjuntamentdeBarcelona/decidim.git', branch: "<%= options[:branch] %>"
10
10
  <% else %>
11
11
  gem "decidim", "<%= Gem::Specification.find_by_name("decidim").version %>"
12
12
  <% end %>
13
13
  gem 'puma', '~> 3.0'
14
14
  gem 'uglifier', '>= 1.3.0'
15
15
 
16
- gem "foundation_rails_helper", git: "https://github.com/sgruhier/foundation_rails_helper.git", tag: "df0bd8e"
17
-
18
16
  group :development, :test do
19
17
  gem 'byebug', platform: :mri
20
18
  end
@@ -24,7 +22,7 @@ group :development do
24
22
  gem 'listen', '~> 3.0.5'
25
23
  gem 'spring'
26
24
  gem 'spring-watcher-listen', '~> 2.0.0'
27
- gem 'faker', '~> 1.6.6'
25
+ gem 'faker', '~> <%= Gem::Specification.find_by_name("faker").version %>'
28
26
  end
29
27
 
30
28
  group :production do
@@ -5,5 +5,5 @@ Decidim.configure do |config|
5
5
  config.authorization_handlers = [ExampleAuthorizationHandler]
6
6
 
7
7
  # Uncomment this lines to set your preferred locales
8
- # config.available_locales = %{en ca es}
8
+ # config.available_locales = %i{en ca es}
9
9
  end
@@ -10,15 +10,41 @@
10
10
  # Make sure the secrets in this file are kept private
11
11
  # if you're sharing your code publicly.
12
12
 
13
+ default: &default
14
+ omniauth:
15
+ facebook:
16
+ # It must be a boolean. Remember ENV variables doesn't support booleans.
17
+ enabled: false
18
+ app_id: <%%= ENV["OMNIAUTH_FACEBOOK_APP_ID"] %>
19
+ app_secret: <%%= ENV["OMNIAUTH_FACEBOOK_APP_SECRET"] %>
20
+ twitter:
21
+ enabled: false
22
+ api_key: <%%= ENV["OMNIAUTH_TWITTER_API_KEY"] %>
23
+ api_secret: <%%= ENV["OMNIAUTH_TWITTER_API_SECRET"] %>
24
+ google_oauth2:
25
+ enabled: false
26
+ client_id: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_ID"] %>
27
+ client_secret: <%%= ENV["OMNIAUTH_GOOGLE_CLIENT_SECRET"] %>
28
+
13
29
  development:
30
+ <<: *default
14
31
  secret_key_base: <%= SecureRandom.hex(64) %>
15
32
 
16
33
  test:
34
+ <<: *default
17
35
  secret_key_base: <%= SecureRandom.hex(64) %>
36
+ omniauth:
37
+ facebook:
38
+ enabled: true
39
+ twitter:
40
+ enabled: true
41
+ google_oauth2:
42
+ enabled: true
18
43
 
19
44
  # Do not keep production secrets in the repository,
20
45
  # instead read values from the environment.
21
46
  production:
47
+ <<: *default
22
48
  secret_key_base: <%%= ENV["SECRET_KEY_BASE"] %>
23
49
  sendgrid: <%%= !ENV["SENDGRID_USERNAME"].blank? %>
24
50
  smtp_username: <%%= ENV["SMTP_USERNAME"] || ENV["SENDGRID_USERNAME"] %>