tasuku 0.0.1

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.
Files changed (211) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +82 -0
  3. data/Rakefile +28 -0
  4. data/app/assets/javascripts/tasks/application.js +13 -0
  5. data/app/assets/stylesheets/tasks/application.css +15 -0
  6. data/app/controllers/tasks/application_controller.rb +13 -0
  7. data/app/controllers/tasks/taskables/image/responses_controller.rb +32 -0
  8. data/app/controllers/tasks/taskables/questions/answers_controller.rb +37 -0
  9. data/app/controllers/tasks/taskables/text/responses_controller.rb +32 -0
  10. data/app/controllers/tasks/taskables/url/responses_controller.rb +32 -0
  11. data/app/controllers/tasks/taskables/verifications/confirmations_controller.rb +28 -0
  12. data/app/controllers/tasks/tasks_controller.rb +7 -0
  13. data/app/helpers/tasks/application_helper.rb +7 -0
  14. data/app/helpers/tasks/taskables/verifications_helper.rb +18 -0
  15. data/app/models/tasks/task.rb +5 -0
  16. data/app/models/tasks/taskables.rb +7 -0
  17. data/app/models/tasks/taskables/image.rb +7 -0
  18. data/app/models/tasks/taskables/image/request.rb +7 -0
  19. data/app/models/tasks/taskables/image/response.rb +17 -0
  20. data/app/models/tasks/taskables/question.rb +7 -0
  21. data/app/models/tasks/taskables/question/answer.rb +39 -0
  22. data/app/models/tasks/taskables/question/option.rb +7 -0
  23. data/app/models/tasks/taskables/question/vote.rb +6 -0
  24. data/app/models/tasks/taskables/taskable.rb +31 -0
  25. data/app/models/tasks/taskables/taskable/response.rb +9 -0
  26. data/app/models/tasks/taskables/taskable/submission.rb +39 -0
  27. data/app/models/tasks/taskables/text.rb +7 -0
  28. data/app/models/tasks/taskables/text/request.rb +7 -0
  29. data/app/models/tasks/taskables/text/response.rb +15 -0
  30. data/app/models/tasks/taskables/url.rb +7 -0
  31. data/app/models/tasks/taskables/url/request.rb +5 -0
  32. data/app/models/tasks/taskables/url/response.rb +18 -0
  33. data/app/models/tasks/taskables/verification.rb +7 -0
  34. data/app/models/tasks/taskables/verification/confirmation.rb +12 -0
  35. data/app/uploaders/tasks/image_uploader.rb +58 -0
  36. data/app/views/tasks/taskables/image/requests/_request.html.erb +19 -0
  37. data/app/views/tasks/taskables/image/responses/_form.html.erb +8 -0
  38. data/app/views/tasks/taskables/image/responses/create.html.erb +2 -0
  39. data/app/views/tasks/taskables/questions/_question.html.erb +27 -0
  40. data/app/views/tasks/taskables/questions/answers/_form.html.erb +16 -0
  41. data/app/views/tasks/taskables/questions/answers/_statistics.html.erb +26 -0
  42. data/app/views/tasks/taskables/text/requests/_request.html.erb +19 -0
  43. data/app/views/tasks/taskables/text/responses/_form.html.erb +5 -0
  44. data/app/views/tasks/taskables/text/responses/create.html.erb +2 -0
  45. data/app/views/tasks/taskables/url/requests/_request.html.erb +19 -0
  46. data/app/views/tasks/taskables/url/responses/_form.html.erb +5 -0
  47. data/app/views/tasks/taskables/url/responses/create.html.erb +2 -0
  48. data/app/views/tasks/taskables/verifications/_verification.html.erb +1 -0
  49. data/app/views/tasks/taskables/verifications/confirmations/_form.html.erb +3 -0
  50. data/app/views/tasks/tasks/_task.html.erb +3 -0
  51. data/app/views/tasks/tasks/show.html.erb +1 -0
  52. data/config/locales/en.yml +24 -0
  53. data/config/locales/nb.yml +122 -0
  54. data/config/routes.rb +35 -0
  55. data/db/migrate/20140315151838_create_tasks_tasks.rb +9 -0
  56. data/db/migrate/20140315152116_create_tasks_taskables_verifications.rb +11 -0
  57. data/db/migrate/20140315153512_create_tasks_taskables_verification_confirmations.rb +13 -0
  58. data/db/migrate/20140316203422_create_tasks_taskables_questions.rb +9 -0
  59. data/db/migrate/20140316203812_create_tasks_taskables_question_options.rb +10 -0
  60. data/db/migrate/20140316204119_create_tasks_taskables_question_answers.rb +12 -0
  61. data/db/migrate/20140316221703_remove_unique_constraint_on_task_taskable_question_answer_index.rb +6 -0
  62. data/db/migrate/20140320123047_remove_unique_constraint_on_confirmation_author.rb +6 -0
  63. data/db/migrate/20140402132837_create_tasks_taskables_image_requests.rb +9 -0
  64. data/db/migrate/20140402135306_create_tasks_taskables_image_responses.rb +13 -0
  65. data/db/migrate/20140403090537_remove_unique_constraint_on_image_response_author.rb +6 -0
  66. data/db/migrate/20140404113158_add_description_to_taskables_questions.rb +5 -0
  67. data/db/migrate/20140404130151_add_description_to_tasks_taskables_image_requests.rb +5 -0
  68. data/db/migrate/20140512072931_create_tasks_taskables_url_requests.rb +10 -0
  69. data/db/migrate/20140512074135_create_tasks_taskables_url_responses.rb +13 -0
  70. data/db/migrate/20140512120632_create_tasks_taskables_question_votes.rb +10 -0
  71. data/db/migrate/20140512121254_add_multiple_to_question.rb +5 -0
  72. data/db/migrate/20140512131526_remove_option_id_from_questions.rb +21 -0
  73. data/db/migrate/20140514082129_create_tasks_taskables_text_requests.rb +10 -0
  74. data/db/migrate/20140514082143_create_tasks_taskables_text_responses.rb +13 -0
  75. data/db/migrate/20140520122938_add_correct_to_tasks_taskables_question_option.rb +5 -0
  76. data/db/migrate/20140521134515_add_show_statistics_to_tasks_taskables_question.rb +5 -0
  77. data/db/migrate/20140523091152_add_images.rb +8 -0
  78. data/db/migrate/20140604075046_add_obligatory_to_tasks_task.rb +5 -0
  79. data/db/migrate/20140605095241_create_tasks_taskables_taskable_responses.rb +10 -0
  80. data/db/migrate/20140605124021_add_task_to_response.rb +6 -0
  81. data/db/migrate/20140606072225_migrate_existing_date.rb +15 -0
  82. data/lib/generators/tasks/install/USAGE +8 -0
  83. data/lib/generators/tasks/install/install_generator.rb +23 -0
  84. data/lib/generators/tasks/install/templates/tasks.rb +3 -0
  85. data/lib/generators/tasks/views/USAGE +5 -0
  86. data/lib/generators/tasks/views/views_generator.rb +9 -0
  87. data/lib/tasks.rb +20 -0
  88. data/lib/tasks/concerns.rb +7 -0
  89. data/lib/tasks/concerns/controllers.rb +5 -0
  90. data/lib/tasks/concerns/controllers/tasks_controller.rb +18 -0
  91. data/lib/tasks/concerns/illustratable.rb +9 -0
  92. data/lib/tasks/concerns/models.rb +4 -0
  93. data/lib/tasks/concerns/models/task.rb +25 -0
  94. data/lib/tasks/concerns/models/taskables.rb +7 -0
  95. data/lib/tasks/concerns/models/taskables/image.rb +3 -0
  96. data/lib/tasks/concerns/models/taskables/image/request.rb +18 -0
  97. data/lib/tasks/concerns/models/taskables/question.rb +31 -0
  98. data/lib/tasks/concerns/models/taskables/text.rb +3 -0
  99. data/lib/tasks/concerns/models/taskables/text/request.rb +18 -0
  100. data/lib/tasks/concerns/models/taskables/url.rb +3 -0
  101. data/lib/tasks/concerns/models/taskables/url/request.rb +18 -0
  102. data/lib/tasks/concerns/models/taskables/verification.rb +20 -0
  103. data/lib/tasks/concerns/redirectable.rb +11 -0
  104. data/lib/tasks/concerns/verifiable.rb +9 -0
  105. data/lib/tasks/engine.rb +22 -0
  106. data/lib/tasks/seeds.rb +13 -0
  107. data/lib/tasks/tasks_tasks.rake +4 -0
  108. data/lib/tasks/version.rb +3 -0
  109. data/lib/tasuku.rb +1 -0
  110. data/spec/controllers/tasks/taskables/image/responses_controller_spec.rb +37 -0
  111. data/spec/controllers/tasks/taskables/questions/answers_controller_spec.rb +39 -0
  112. data/spec/controllers/tasks/taskables/text/responses_controller_spec.rb +37 -0
  113. data/spec/controllers/tasks/taskables/verifications/confirmations_controller_spec.rb +38 -0
  114. data/spec/controllers/tasks/tasks_controller_spec.rb +17 -0
  115. data/spec/dummy/README.rdoc +28 -0
  116. data/spec/dummy/Rakefile +6 -0
  117. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  118. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  119. data/spec/dummy/app/controllers/application_controller.rb +7 -0
  120. data/spec/dummy/app/helpers/application_helper.rb +5 -0
  121. data/spec/dummy/app/models/article.rb +3 -0
  122. data/spec/dummy/app/models/user.rb +2 -0
  123. data/spec/dummy/app/views/layouts/application.html.erb +17 -0
  124. data/spec/dummy/bin/bundle +3 -0
  125. data/spec/dummy/bin/rails +4 -0
  126. data/spec/dummy/bin/rake +4 -0
  127. data/spec/dummy/config.ru +4 -0
  128. data/spec/dummy/config/application.rb +29 -0
  129. data/spec/dummy/config/boot.rb +5 -0
  130. data/spec/dummy/config/database.yml +30 -0
  131. data/spec/dummy/config/environment.rb +5 -0
  132. data/spec/dummy/config/environments/development.rb +37 -0
  133. data/spec/dummy/config/environments/production.rb +83 -0
  134. data/spec/dummy/config/environments/test.rb +39 -0
  135. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  136. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  137. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  138. data/spec/dummy/config/initializers/inflections.rb +16 -0
  139. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  140. data/spec/dummy/config/initializers/session_store.rb +3 -0
  141. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  142. data/spec/dummy/config/locales/en.yml +23 -0
  143. data/spec/dummy/config/routes.rb +4 -0
  144. data/spec/dummy/config/secrets.yml +22 -0
  145. data/spec/dummy/db/migrate/20140315162017_create_users.rb +8 -0
  146. data/spec/dummy/db/migrate/20140315185502_create_articles.rb +8 -0
  147. data/spec/dummy/db/schema.rb +166 -0
  148. data/spec/dummy/db/seeds.rb +3 -0
  149. data/spec/dummy/db/test.sqlite3 +0 -0
  150. data/spec/dummy/log/development.log +90 -0
  151. data/spec/dummy/log/test.log +2568 -0
  152. data/spec/dummy/public/404.html +67 -0
  153. data/spec/dummy/public/422.html +67 -0
  154. data/spec/dummy/public/500.html +66 -0
  155. data/spec/dummy/public/favicon.ico +0 -0
  156. data/spec/dummy/public/uploads/tasks/taskables/image/request/image/1/doge.jpg +0 -0
  157. data/spec/dummy/public/uploads/tasks/taskables/image/response/image/1/doge.jpg +0 -0
  158. data/spec/dummy/public/uploads/tasks/taskables/question/image/1/doge.jpg +0 -0
  159. data/spec/dummy/public/uploads/tasks/taskables/text/request/image/1/doge.jpg +0 -0
  160. data/spec/dummy/public/uploads/tasks/taskables/url/request/image/1/doge.jpg +0 -0
  161. data/spec/dummy/spec/factories/articles.rb +6 -0
  162. data/spec/dummy/spec/factories/users.rb +6 -0
  163. data/spec/dummy/spec/models/article_spec.rb +4 -0
  164. data/spec/dummy/spec/models/user_spec.rb +4 -0
  165. data/spec/factories/tasks_taskables_image_requests.rb +7 -0
  166. data/spec/factories/tasks_taskables_image_responses.rb +8 -0
  167. data/spec/factories/tasks_taskables_question_answers.rb +17 -0
  168. data/spec/factories/tasks_taskables_question_options.rb +10 -0
  169. data/spec/factories/tasks_taskables_question_votes.rb +8 -0
  170. data/spec/factories/tasks_taskables_questions.rb +19 -0
  171. data/spec/factories/tasks_taskables_taskable_responses.rb +8 -0
  172. data/spec/factories/tasks_taskables_text_requests.rb +5 -0
  173. data/spec/factories/tasks_taskables_text_responses.rb +6 -0
  174. data/spec/factories/tasks_taskables_url_requests.rb +8 -0
  175. data/spec/factories/tasks_taskables_url_responses.rb +9 -0
  176. data/spec/factories/tasks_taskables_verification_confirmations.rb +8 -0
  177. data/spec/factories/tasks_taskables_verifications.rb +7 -0
  178. data/spec/factories/tasks_tasks.rb +14 -0
  179. data/spec/fixtures/doge.jpg +0 -0
  180. data/spec/helpers/tasks/taskables/verifications_helper_spec.rb +20 -0
  181. data/spec/lib/generators/views_generators_spec.rb +22 -0
  182. data/spec/lib/tasks/concerns/verifiable_spec.rb +23 -0
  183. data/spec/models/tasks/task_spec.rb +20 -0
  184. data/spec/models/tasks/taskables/image/request_spec.rb +6 -0
  185. data/spec/models/tasks/taskables/image/response_spec.rb +18 -0
  186. data/spec/models/tasks/taskables/question/answer_spec.rb +91 -0
  187. data/spec/models/tasks/taskables/question/option_spec.rb +6 -0
  188. data/spec/models/tasks/taskables/question/vote_spec.rb +6 -0
  189. data/spec/models/tasks/taskables/question_spec.rb +18 -0
  190. data/spec/models/tasks/taskables/taskable/response_spec.rb +7 -0
  191. data/spec/models/tasks/taskables/taskable/submission_spec.rb +30 -0
  192. data/spec/models/tasks/taskables/taskable_spec.rb +49 -0
  193. data/spec/models/tasks/taskables/text/request_spec.rb +6 -0
  194. data/spec/models/tasks/taskables/text/response_spec.rb +17 -0
  195. data/spec/models/tasks/taskables/url/request_spec.rb +6 -0
  196. data/spec/models/tasks/taskables/url/response_spec.rb +6 -0
  197. data/spec/models/tasks/taskables/verification/confirmation_spec.rb +6 -0
  198. data/spec/models/tasks/taskables/verification_spec.rb +18 -0
  199. data/spec/spec_helper.rb +31 -0
  200. data/spec/support/fixture.rb +3 -0
  201. data/spec/support/shared_examples_for_redirectable.rb +37 -0
  202. data/spec/support/trackable_submission_spec.rb +14 -0
  203. data/spec/views/tasks/taskables/image/requests/_request.html.erb_spec.rb +35 -0
  204. data/spec/views/tasks/taskables/image/responses/create.html.erb_spec.rb +4 -0
  205. data/spec/views/tasks/taskables/questions/_question.html.erb_spec.rb +35 -0
  206. data/spec/views/tasks/taskables/questions/answers/_form.html.erb_spec.rb +18 -0
  207. data/spec/views/tasks/taskables/text/requests/_request.html.erb_spec.rb +35 -0
  208. data/spec/views/tasks/taskables/url/requests/_request.html.erb_spec.rb +35 -0
  209. data/spec/views/tasks/taskables/verifications/confirmations/_form.html.erb_spec.rb +17 -0
  210. data/spec/views/tasks/tasks/show.html.erb_spec.rb +4 -0
  211. metadata +550 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 178d927e42e8632c3e04c9b4aac2cd3dddbed77e
4
+ data.tar.gz: 54d26f3a25a48853d7601e286b800daed8e2d118
5
+ SHA512:
6
+ metadata.gz: 8d66367eaa1020978555af13a58f8a0b4a998e78db97964a47b5ac5163f558976efc422b5e69cc3d5863337dcfcf5367e4042a31a4cfd7eadd4c142bbf4a4ff5
7
+ data.tar.gz: 3ef5129686febd7059ae1706e5e2af7740ee58b56edd4f559d0b352778f92e8cd73fa644380e178a00ef9f73588f2b71d3e835b491d6a297fc3afac96dd789c3
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # Tasuku
2
+
3
+ [![Gem Version](https://img.shields.io/gem/v/tasuku.svg)](https://rubygems.org/gems/tasuku)
4
+ [![Build Status](https://img.shields.io/travis/hyperoslo/tasuku.svg)](https://travis-ci.org/hyperoslo/tasuku)
5
+ [![Dependency Status](https://img.shields.io/gemnasium/hyperoslo/tasuku.svg)](https://gemnasium.com/hyperoslo/tasuku)
6
+ [![Code Climate](https://img.shields.io/codeclimate/github/hyperoslo/tasuku.svg)](https://codeclimate.com/github/hyperoslo/tasuku)
7
+ [![Coverage Status](https://img.shields.io/coveralls/hyperoslo/tasuku.svg)](https://coveralls.io/r/hyperoslo/tasuku)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'tasuku'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install tasuku
22
+
23
+ Install the gem:
24
+
25
+ $ rails generate tasks:install
26
+
27
+ Run the migrations:
28
+
29
+ $ rake db:migrate
30
+
31
+ Then you can change the default configurations:
32
+
33
+ ```ruby
34
+ # config/routes.rb
35
+ Rails.application.routes.draw do
36
+ mount Tasks::Engine, at: '/tasks'
37
+ end
38
+ ```
39
+
40
+ And the method to use in deriving the current user:
41
+
42
+ ```ruby
43
+ # config/initializers/tasks.rb
44
+ Tasks.configure do |config|
45
+ config.author = :current_user
46
+ end
47
+ ```
48
+
49
+ ### Views
50
+
51
+ Tasuku ships with views, but you can copy them to customize things to your liking:
52
+
53
+ ```
54
+ $ rails generate tasks:views
55
+ ```
56
+
57
+ Tasuku defaults to using your application's layout, so you'll need to prefix your own route helpers with `main_app` so Ruby on Rails knows where to look.
58
+
59
+ ## Usage
60
+
61
+ ...
62
+
63
+ ## Configuration
64
+
65
+ ...
66
+
67
+ ## Contributing
68
+
69
+ 1. Fork it
70
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
71
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
72
+ 4. Push to the branch (`git push origin my-new-feature`)
73
+ 5. Create new Pull Request
74
+
75
+ ## Credits
76
+
77
+ Hyper made this. We're a digital communications agency with a passion for good code,
78
+ and if you're using this library we probably want to hire you.
79
+
80
+ ## License
81
+
82
+ Tasks is available under the MIT license. See the LICENSE file for more info.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Tasks'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rspec/core'
23
+ require 'rspec/core/rake_task'
24
+
25
+ desc 'Run all specs in spec directory (excluding plugin specs)'
26
+ RSpec::Core::RakeTask.new spec: 'app:db:test:prepare'
27
+
28
+ task default: :spec
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,13 @@
1
+ module Tasks
2
+ class ApplicationController < ::ApplicationController
3
+ private
4
+
5
+ def after_completion_path_for resource
6
+ if defined? super
7
+ super
8
+ else
9
+ nil
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class Taskables::Image::ResponsesController < ApplicationController
5
+ include Concerns::Redirectable
6
+
7
+ before_action :set_request
8
+
9
+ def create
10
+ response = @request.responses.new response_params
11
+ response.author = send Tasks.config.author
12
+
13
+ respond_to do |format|
14
+ if response.save
15
+ format.html { redirect_to redirect_path_for(response) }
16
+ else
17
+ format.html { redirect_to :back, alert: response.errors.full_messages.to_sentence }
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def response_params
25
+ params.require(:taskables_image_response).permit(:image)
26
+ end
27
+
28
+ def set_request
29
+ @request = Taskables::Image::Request.find params[:request_id]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class Taskables::Questions::AnswersController < ApplicationController
5
+ include Concerns::Redirectable
6
+
7
+ before_action :set_question
8
+
9
+ def create
10
+ answer = Taskables::Question::Answer.new
11
+
12
+ answer_params[:option_ids].each do |num|
13
+ answer.votes.build option_id: num
14
+ end
15
+
16
+ answer.author = send Tasks.config.author
17
+
18
+ respond_to do |format|
19
+ if answer.save
20
+ format.html { redirect_to redirect_path_for(answer) }
21
+ else
22
+ format.html { redirect_to :back, alert: answer.errors.full_messages.to_sentence }
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def answer_params
30
+ params.require(:taskables_question_answer).permit(option_ids: [])
31
+ end
32
+
33
+ def set_question
34
+ @question = Taskables::Question.find params[:question_id]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class Taskables::Text::ResponsesController < ApplicationController
5
+ include Concerns::Redirectable
6
+
7
+ before_action :set_request
8
+
9
+ def create
10
+ response = @request.responses.new response_params
11
+ response.author = send Tasks.config.author
12
+
13
+ respond_to do |format|
14
+ if response.save
15
+ format.html { redirect_to redirect_path_for(response) }
16
+ else
17
+ format.html { redirect_to :back, alert: response.errors.full_messages.to_sentence }
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def response_params
25
+ params.require(:taskables_text_response).permit(:text)
26
+ end
27
+
28
+ def set_request
29
+ @request = Taskables::Text::Request.find params[:request_id]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class Taskables::URL::ResponsesController < ApplicationController
5
+ include Concerns::Redirectable
6
+
7
+ before_action :set_request
8
+
9
+ def create
10
+ response = @request.responses.new response_params
11
+ response.author = send Tasks.config.author
12
+
13
+ respond_to do |format|
14
+ if response.save
15
+ format.html { redirect_to redirect_path_for(response) }
16
+ else
17
+ format.html { redirect_to :back, alert: response.errors.full_messages.to_sentence }
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def response_params
25
+ params.require(:taskables_url_response).permit(:url)
26
+ end
27
+
28
+ def set_request
29
+ @request = Taskables::URL::Request.find params[:request_id]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class Taskables::Verifications::ConfirmationsController < ApplicationController
5
+ include Concerns::Redirectable
6
+
7
+ before_action :set_verification
8
+
9
+ def create
10
+ confirmation = @verification.confirmations.new
11
+ confirmation.author = send Tasks.config.author
12
+
13
+ respond_to do |format|
14
+ if confirmation.save
15
+ format.html { redirect_to redirect_path_for(confirmation) }
16
+ else
17
+ format.html { render text: 'Failed to confirm verification', status: :unprocessable_entity }
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def set_verification
25
+ @verification = Taskables::Verification.find params[:verification_id]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ require_dependency "tasks/application_controller"
2
+
3
+ module Tasks
4
+ class TasksController < ApplicationController
5
+ include Concerns::Controllers::TasksController
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Tasks
2
+ module ApplicationHelper
3
+ def current_author
4
+ send Tasks.config.author
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Tasks
2
+ module Taskables::VerificationsHelper
3
+
4
+ # Render a button to confirm the given verification.
5
+ #
6
+ # verification - A Verification instance.
7
+ #
8
+ # Example:
9
+ #
10
+ # confirm terms_of_service.verification
11
+ #
12
+ def confirm verification
13
+ render partial: 'tasks/taskables/verifications/confirmations/form.html.erb', locals: {
14
+ confirmation: verification.confirmations.build
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Tasks
2
+ class Task < ActiveRecord::Base
3
+ include Concerns::Models::Task
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Tasks
2
+ module Taskables
3
+ def self.table_name_prefix
4
+ 'tasks_taskables_'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Tasks
2
+ module Taskables::Image
3
+ def self.table_name_prefix
4
+ 'tasks_taskables_image_'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Tasks
2
+ module Taskables
3
+ class Image::Request < ActiveRecord::Base
4
+ include Concerns::Models::Taskables::Image::Request
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ module Tasks
2
+ module Taskables
3
+ class Image::Response < ActiveRecord::Base
4
+ include Taskable::Submission
5
+
6
+ mount_uploader :image, ImageUploader
7
+
8
+ belongs_to :request
9
+ belongs_to :author, polymorphic: true
10
+
11
+ validates :author_id, :author_type, presence: true
12
+ validates :image, presence: true
13
+
14
+ request is: :request
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ module Tasks
2
+ module Taskables
3
+ class Question < ActiveRecord::Base
4
+ include Concerns::Models::Taskables::Question
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ module Tasks
2
+ module Taskables
3
+ class Question::Answer < ActiveRecord::Base
4
+ include Taskable::Submission
5
+
6
+ belongs_to :author, polymorphic: true
7
+ has_many :votes, dependent: :destroy
8
+
9
+ validates :author_id, :author_type, presence: true
10
+ validates :votes, length: { minimum: 1 }
11
+ validate :can_only_answer_each_question_once
12
+ validate :can_only_vote_once_for_single_choice_questions
13
+
14
+ def question
15
+ if votes.any?
16
+ votes.first.option.question
17
+ else
18
+ raise StandardError, "Cannot derive question for #{self}, as it has no votes"
19
+ end
20
+ end
21
+
22
+ request is: :question
23
+
24
+ def correct?
25
+ votes.all? { |vote| vote.option.correct? }
26
+ end
27
+
28
+ private
29
+
30
+ def can_only_answer_each_question_once
31
+ errors.add :base, I18n.t('tasks.taskables.questions.answers.already_answered') if question.answers.find_by author: author
32
+ end
33
+
34
+ def can_only_vote_once_for_single_choice_questions
35
+ errors.add :base, I18n.t('tasks.taskables.questions.answers.can_only_vote_once') if question.single? && votes.many?
36
+ end
37
+ end
38
+ end
39
+ end