tasuku 0.1.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/app/controllers/tasuku/taskables/code/responses_controller.rb +32 -0
  4. data/app/controllers/tasuku/taskables/questions/answers_controller.rb +1 -0
  5. data/app/helpers/tasuku/url_helper.rb +11 -0
  6. data/app/models/tasuku/task.rb +1 -0
  7. data/app/models/tasuku/task_requirement.rb +5 -0
  8. data/app/models/tasuku/taskables/code/request.rb +7 -0
  9. data/app/models/tasuku/taskables/code/response.rb +22 -0
  10. data/app/models/tasuku/taskables/code.rb +7 -0
  11. data/app/models/tasuku/taskables/question/option.rb +1 -0
  12. data/app/views/tasuku/taskables/_illustration.html.erb +7 -0
  13. data/app/views/tasuku/taskables/code/requests/_request.html.erb +9 -0
  14. data/app/views/tasuku/taskables/code/responses/_form.html.erb +5 -0
  15. data/app/views/tasuku/taskables/image/requests/_request.html.erb +1 -3
  16. data/app/views/tasuku/taskables/questions/_question.html.erb +2 -3
  17. data/app/views/tasuku/taskables/questions/answers/_form.html.erb +3 -1
  18. data/app/views/tasuku/taskables/text/requests/_request.html.erb +1 -3
  19. data/app/views/tasuku/taskables/url/requests/_request.html.erb +1 -3
  20. data/config/locales/en.yml +155 -11
  21. data/config/locales/nb.yml +14 -4
  22. data/config/routes.rb +6 -0
  23. data/db/migrate/20140611084458_add_video_urls.rb +8 -0
  24. data/db/migrate/20140813073552_create_tasuku_taskables_code_requests.rb +10 -0
  25. data/db/migrate/20140813075643_create_tasuku_taskables_code_responses.rb +11 -0
  26. data/db/migrate/20140813080116_add_reply_to_option.rb +5 -0
  27. data/db/migrate/20140910112050_create_tasuku_task_requirements.rb +10 -0
  28. data/db/migrate/20140926105940_add_description_to_code_requests.rb +5 -0
  29. data/lib/tasuku/concerns/illustratable.rb +3 -0
  30. data/lib/tasuku/concerns/models/requirables/inverse_requirable.rb +12 -0
  31. data/lib/tasuku/concerns/models/requirables/requirable.rb +35 -0
  32. data/lib/tasuku/concerns/models/requirables.rb +4 -0
  33. data/lib/tasuku/concerns/models/taskables/code/request.rb +19 -0
  34. data/lib/tasuku/concerns/models/taskables/code.rb +3 -0
  35. data/lib/tasuku/concerns/models/taskables.rb +1 -0
  36. data/lib/tasuku/concerns/models.rb +1 -0
  37. data/lib/tasuku/seeds.rb +3 -0
  38. data/lib/tasuku/version.rb +1 -1
  39. data/spec/controllers/tasuku/taskables/code/responses_controller_spec.rb +38 -0
  40. data/spec/controllers/tasuku/taskables/questions/answers_controller_spec.rb +21 -0
  41. data/spec/dummy/app/controllers/application_controller.rb +1 -0
  42. data/spec/dummy/config/routes.rb +2 -1
  43. data/spec/dummy/db/development.sqlite3 +0 -0
  44. data/spec/dummy/db/schema.rb +30 -1
  45. data/spec/dummy/db/seeds.rb +1 -1
  46. data/spec/dummy/db/test.sqlite3 +0 -0
  47. data/spec/dummy/log/development.log +7584 -57
  48. data/spec/dummy/log/test.log +37002 -13558
  49. data/spec/dummy/public/uploads/{tasks/taskables/image/request/image/1 → tasuku/taskables/image/request/image/2}/doge.jpg +0 -0
  50. data/spec/dummy/public/uploads/{tasks/taskables/image/response/image/1 → tasuku/taskables/question/image/2}/doge.jpg +0 -0
  51. data/spec/dummy/public/uploads/{tasks/taskables/question/image/1 → tasuku/taskables/text/request/image/2}/doge.jpg +0 -0
  52. data/spec/dummy/public/uploads/{tasks/taskables/text/request/image/1 → tasuku/taskables/url/request/image/2}/doge.jpg +0 -0
  53. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  54. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  55. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  56. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  57. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  58. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  59. data/spec/factories/tasuku_responses.rb +6 -0
  60. data/spec/factories/tasuku_task_requirements.rb +8 -0
  61. data/spec/factories/tasuku_taskables_code_requests.rb +8 -0
  62. data/spec/factories/tasuku_taskables_code_responses.rb +6 -0
  63. data/spec/factories/tasuku_taskables_question_options.rb +1 -0
  64. data/spec/models/tasuku/task_requirement_spec.rb +9 -0
  65. data/spec/models/tasuku/task_spec.rb +42 -0
  66. data/spec/models/tasuku/taskables/code/request_spec.rb +6 -0
  67. data/spec/models/tasuku/taskables/code/response_spec.rb +27 -0
  68. data/spec/spec_helper.rb +4 -0
  69. data/spec/support/shared_examples_for_redirectable.rb +9 -0
  70. data/spec/views/tasuku/taskables/code/requests/_request.html.erb_spec.rb +5 -0
  71. data/spec/views/tasuku/taskables/illustration_spec.rb +19 -0
  72. data/spec/views/tasuku/taskables/image/requests/_request.html.erb_spec.rb +8 -9
  73. data/spec/views/tasuku/taskables/questions/_question.html.erb_spec.rb +8 -9
  74. data/spec/views/tasuku/taskables/text/requests/_request.html.erb_spec.rb +8 -9
  75. data/spec/views/tasuku/taskables/url/requests/_request.html.erb_spec.rb +8 -9
  76. metadata +110 -31
  77. data/lib/tasks/concerns/models/taskables/image.rb +0 -3
  78. data/lib/tasks/concerns/models/taskables/text.rb +0 -3
  79. data/lib/tasks/concerns/models/taskables/url.rb +0 -3
  80. data/lib/tasks/concerns/models/taskables.rb +0 -7
  81. data/lib/tasks/concerns/models.rb +0 -4
  82. data/spec/dummy/public/uploads/tasks/taskables/url/request/image/1/doge.jpg +0 -0
  83. data/spec/dummy/public/uploads/tmp/1402401935-55786-0961/doge.jpg +0 -0
  84. data/spec/dummy/public/uploads/tmp/1402401935-55786-2854/doge.jpg +0 -0
  85. data/spec/dummy/public/uploads/tmp/1402402180-56033-5455/doge.jpg +0 -0
  86. data/spec/dummy/public/uploads/tmp/1402402180-56033-5512/doge.jpg +0 -0
  87. data/spec/factories/tasks_taskables_taskable_responses.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 91fd68be24466c75a16e67d93379f4005e00abf0
4
- data.tar.gz: ce7bcd6b85315d1816ddbf646983224bd4b17c4e
3
+ metadata.gz: 955c630f90b4fe503c917430c9777d8c4c69e72f
4
+ data.tar.gz: f691fec1f524ca56689cdc798feef63fdbb739c7
5
5
  SHA512:
6
- metadata.gz: bb8da418ba435900c235a11d654bfc0aa3b0787504981e68bb8fa386dbe6e17e013743c0562c6fceb8fa96e1e3a1f2ef76625e1301f8cd9f5ed03ec5a5c87b1e
7
- data.tar.gz: 36ef622a0fb7890134e99def5df38b6e89a16da851b5d6bca744baf6ac1b03ef9590ce0cb79b90a895b41fd477a2218b05094f769ffaa57bbd1a9571f2a52faf
6
+ metadata.gz: f135ddf10bc15fd9f0f49c79e6e25ea1d1b6a55557916316e1d4862fec3d26e1298ca9a9348b7eb633cd5377060294e525eee0c83648ff21b949e3311b737cb1
7
+ data.tar.gz: 8b2c7b060126bb237659450230d91ff913da051098f9ec7c713065a78d660c264b9b4667a4c699e17cbd150a9301b259c2da33b287535262b5eac96752edb511
data/README.md CHANGED
@@ -6,6 +6,10 @@
6
6
  [![Code Climate](https://img.shields.io/codeclimate/github/hyperoslo/tasuku.svg)](https://codeclimate.com/github/hyperoslo/tasuku)
7
7
  [![Coverage Status](https://img.shields.io/coveralls/hyperoslo/tasuku.svg)](https://coveralls.io/r/hyperoslo/tasuku)
8
8
 
9
+ Tasuku is a framework for building tasks in Ruby on Rails. It ships with an array of tasks
10
+ ranging from reading articles to sharing photos. You can make your own tasks, too,
11
+ and we'd love for you to contribute if you do.
12
+
9
13
  ## Installation
10
14
 
11
15
  Add this line to your application's Gemfile:
@@ -16,10 +20,6 @@ And then execute:
16
20
 
17
21
  $ bundle
18
22
 
19
- Or install it yourself as:
20
-
21
- $ gem install tasuku
22
-
23
23
  Install the gem:
24
24
 
25
25
  $ rails generate tasuku:install
@@ -0,0 +1,32 @@
1
+ require_dependency 'tasuku/application_controller'
2
+
3
+ module Tasuku
4
+ class Taskables::Code::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_code_response).permit(:code)
26
+ end
27
+
28
+ def set_request
29
+ @request = Taskables::Code::Request.find params[:request_id]
30
+ end
31
+ end
32
+ end
@@ -7,6 +7,7 @@ module Tasuku
7
7
  before_action :set_question
8
8
 
9
9
  def create
10
+ return redirect_to :back, alert: I18n.t('tasuku.taskables.questions.answers.no_answers') unless params[:taskables_question_answer]
10
11
  answer = Taskables::Question::Answer.new
11
12
 
12
13
  answer_params[:option_ids].each do |num|
@@ -0,0 +1,11 @@
1
+ module Tasuku
2
+ module UrlHelper
3
+ def url_for(options)
4
+ begin
5
+ super options
6
+ rescue ActionController::UrlGenerationError
7
+ main_app.url_for options
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,6 @@
1
1
  module Tasuku
2
2
  class Task < ActiveRecord::Base
3
3
  include Concerns::Models::Task
4
+ include Concerns::Models::Requirables::Requirable
4
5
  end
5
6
  end
@@ -0,0 +1,5 @@
1
+ module Tasuku
2
+ class TaskRequirement < ActiveRecord::Base
3
+ include Concerns::Models::Requirables::InverseRequirable
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Tasuku
2
+ module Taskables
3
+ class Code::Request < ActiveRecord::Base
4
+ include Concerns::Models::Taskables::Code::Request
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,22 @@
1
+ module Tasuku
2
+ module Taskables
3
+ class Code::Response < ActiveRecord::Base
4
+ include Taskable::Submission
5
+
6
+ belongs_to :request
7
+ belongs_to :author, polymorphic: true
8
+
9
+ validates :author_id, :author_type, presence: true
10
+ validates :code, presence: true
11
+ validate :code_is_valid
12
+
13
+ request is: :request
14
+
15
+ private
16
+
17
+ def code_is_valid
18
+ errors.add :code, I18n.t('tasuku.taskables.codes.responses.invalid') unless code == request.code
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Tasuku
2
+ module Taskables::Code
3
+ def self.table_name_prefix
4
+ 'tasuku_taskables_code_'
5
+ end
6
+ end
7
+ end
@@ -7,3 +7,4 @@ module Tasuku
7
7
  validates_presence_of :text
8
8
  end
9
9
  end
10
+
@@ -0,0 +1,7 @@
1
+ <% if request.image? %>
2
+ <div class="image"><%= image_tag request.image %></div>
3
+ <% end %>
4
+
5
+ <% if request.video? %>
6
+ <div class="video"><%= embed_video(request, '100%', '100%') %></div>
7
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <div class="text"><%= request.text %></div>
2
+
3
+ <% if request.completed_by? current_author %>
4
+ <%= t 'tasks.taskables.codes.responses.already_submitted' %>
5
+ <% else %>
6
+ <div class="form">
7
+ <%= render partial: 'tasuku/taskables/code/responses/form', locals: { request: request } %>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= form_for request.responses.build, url: tasuku.code_request_responses_path(request_id: request.id), method: :post, html: { multipart: true } do |form| %>
2
+ <%= form.text_field :code %>
3
+
4
+ <%= form.submit t('tasuku.taskables.codes.responses.submit') %>
5
+ <% end %>
@@ -1,6 +1,4 @@
1
- <% if request.image? %>
2
- <div class="image"><%= image_tag request.image %></div>
3
- <% end %>
1
+ <%= render 'tasuku/taskables/illustration', request: request %>
4
2
 
5
3
  <div class="text"><%= request.text %></div>
6
4
  <div class="description"><%= request.description %></div>
@@ -1,6 +1,4 @@
1
- <% if question.image? %>
2
- <div class="image"><%= image_tag question.image %></div>
3
- <% end %>
1
+ <%= render 'tasuku/taskables/illustration', request: question %>
4
2
 
5
3
  <div class="text"><%= question.text %></div>
6
4
  <div class="description"><%= question.description %></div>
@@ -12,6 +10,7 @@
12
10
  <ul>
13
11
  <% answer.votes.each do |vote| %>
14
12
  <%= vote.option.text %>
13
+ <span class="reply"><%= vote.option.reply %></span>
15
14
  <% end %>
16
15
  </ul>
17
16
  <% end %>
@@ -12,5 +12,7 @@
12
12
  </div>
13
13
  <% end %>
14
14
 
15
- <%= form.submit t('tasuku.taskables.questions.answers.submit') %>
15
+ <%= form.submit t('tasuku.taskables.questions.answers.submit'), data: {
16
+ disable_with: t('tasuku.taskables.questions.answers.submitting')
17
+ } %>
16
18
  <% end %>
@@ -1,6 +1,4 @@
1
- <% if request.image? %>
2
- <div class="image"><%= image_tag request.image %></div>
3
- <% end %>
1
+ <%= render 'tasuku/taskables/illustration', request: request %>
4
2
 
5
3
  <div class="text"><%= request.text %></div>
6
4
  <div class="description"><%= request.description %></div>
@@ -1,6 +1,4 @@
1
- <% if request.image? %>
2
- <div class="image"><%= image_tag request.image %></div>
3
- <% end %>
1
+ <%= render 'tasuku/taskables/illustration', request: request %>
4
2
 
5
3
  <div class="text"><%= request.text %></div>
6
4
  <div class="description"><%= request.description %></div>
@@ -1,24 +1,168 @@
1
1
  en:
2
+ activerecord:
3
+ models:
4
+ tasuku/task:
5
+ one: Task
6
+ other: Tasks
7
+
8
+ tasuku/taskables/question:
9
+ one: Question
10
+ other: Questions
11
+
12
+ tasuku/taskables/question/option:
13
+ one: Option
14
+ other: Options
15
+
16
+ tasuku/taskables/question/vote:
17
+ one: Vote
18
+ other: Votes
19
+
20
+ tasuku/taskables/question/answer:
21
+ one: Answer
22
+ other: Answer
23
+
24
+ tasuku/taskables/verification:
25
+ one: Verification
26
+ other: Verifications
27
+
28
+ tasuku/taskables/verification/confirmation:
29
+ one: Verification confirmation
30
+ other: Verification confirmations
31
+
32
+ tasuku/taskables/image/request:
33
+ one: Image request
34
+ other: Image requests
35
+
36
+ tasuku/taskables/image/response:
37
+ one: Image response
38
+ other: Image responses
39
+
40
+ tasuku/taskables/text/request:
41
+ one: Text request
42
+ other: Text requests
43
+
44
+ tasuku/taskables/text/response:
45
+ one: Text response
46
+ other: Text responses
47
+
48
+ tasuku/taskables/url/request:
49
+ one: URL request
50
+ other: URL requests
51
+
52
+ tasuku/taskables/url/response:
53
+ one: URL response
54
+ other: URL responses
55
+
56
+ tasuku/taskables/code/request:
57
+ one: Code request
58
+ other: Code requests
59
+
60
+ tasuku/taskables/code/response:
61
+ one: Code response
62
+ other: Code responses
63
+
64
+ tasuku/task_requirement:
65
+ one: Task requirement
66
+ other: Task requirements
67
+
68
+ attributes:
69
+ defaults: &DEFAULT_ATTRS
70
+ created_at: Created at
71
+ updated_at: Updated at
72
+ text: Text
73
+ verification: Verification
74
+ task: Task
75
+ request: Request
76
+ responses: Response
77
+ votes: Votes
78
+ description: Description
79
+
80
+ tasuku/task:
81
+ <<: *DEFAULT_ATTRS
82
+ taskable_type: Taskable type
83
+ taskable: Taskable
84
+
85
+ tasuku/taskables/question:
86
+ <<: *DEFAULT_ATTRS
87
+ multiple: Multiple choice
88
+ show_statistics: Show statistics
89
+ options: Options
90
+
91
+ tasuku/taskables/question/option:
92
+ <<: *DEFAULT_ATTRS
93
+ question: Question
94
+ correct: Correct answer
95
+ answers: Answers
96
+
97
+ tasuku/taskables/question/vote:
98
+ <<: *DEFAULT_ATTRS
99
+ option: Option
100
+ answer: Answer
101
+
102
+ tasuku/taskables/question/answer:
103
+ <<: *DEFAULT_ATTRS
104
+ option: Option
105
+ author: Author
106
+ option_id: Option
107
+
108
+ tasuku/taskables/verification:
109
+ <<: *DEFAULT_ATTRS
110
+ verifiable: Verifiable
111
+ confirmations: Confirmations
112
+
113
+ tasuku/taskables/verification/confirmation:
114
+ <<: *DEFAULT_ATTRS
115
+
116
+ tasuku/taskables/image/request:
117
+ <<: *DEFAULT_ATTRS
118
+
119
+ tasuku/taskables/image/response:
120
+ <<: *DEFAULT_ATTRS
121
+ image: Image
122
+
123
+ tasuku/taskables/text/request:
124
+ <<: *DEFAULT_ATTRS
125
+
126
+ tasuku/taskables/text/response:
127
+ <<: *DEFAULT_ATTRS
128
+ text: Text
129
+
130
+ tasuku/taskables/url/request:
131
+ <<: *DEFAULT_ATTRS
132
+
133
+ tasuku/taskables/url/response:
134
+ <<: *DEFAULT_ATTRS
135
+
2
136
  tasuku:
3
137
  taskables:
4
138
  verifications:
5
139
  confirmations:
6
- confirm: 'Confirm'
140
+ confirm: Confirm
141
+ confirming: Confirming...
7
142
  questions:
8
143
  answers:
9
- submit: 'Submit'
10
- already_answered: 'You have already answered this question'
11
- can_only_vote_once: 'You may only select one alternative'
144
+ already_answered: You have already answered this question
145
+ can_only_vote_once: You may only select one alternative
146
+ submit: Submit
147
+ submitting: Submitting...
148
+ no_answers: No answer chosen
12
149
  images:
13
150
  responses:
14
- already_uploaded: 'You have already uploaded an image'
15
- upload: 'Upload'
16
- uploading: 'Uploading...'
151
+ already_uploaded: You have already uploaded an image
152
+ upload: Upload
153
+ uploading: Uploading...
17
154
  texts:
18
155
  responses:
19
- already_responded: 'You have already submitted a text'
20
- respond: 'Submit'
156
+ already_responded: You have already submitted a text
157
+ respond: Submit
158
+ responding: Responding...
21
159
  urls:
22
160
  responses:
23
- already_answered: 'You have already answered'
24
- answer: 'Answer'
161
+ already_answered: You have already answered
162
+ answer: Answer
163
+ answering: Answering...
164
+ codes:
165
+ responses:
166
+ invalid: Invalid code
167
+ already_submitted: You have already submitted a code
168
+ submit: Submit code
@@ -31,13 +31,13 @@ nb:
31
31
  tasuku/taskables/text/response:
32
32
  one: Svar på tekstforespørsler
33
33
  other: Svar på tekstforespørsler
34
- tasks/taskables/verification/confirmation:
34
+ tasuku/taskables/verification/confirmation:
35
35
  one: Bekreftelse
36
36
  other: Bekreftelser
37
- tasks/taskables/url/request:
37
+ tasuku/taskables/url/request:
38
38
  one: URL-forespørsel
39
39
  other: URL-forespørsler
40
- tasks/taskables/url/response:
40
+ tasuku/taskables/url/response:
41
41
  one: Svar på URL-forespørsel
42
42
  other: Svar på URL-forespørsler
43
43
  attributes:
@@ -100,11 +100,14 @@ nb:
100
100
  verifications:
101
101
  confirmations:
102
102
  confirm: 'Bekreft'
103
+ confirming: 'Bekrefter...'
103
104
  questions:
104
105
  answers:
105
- submit: 'Svar'
106
106
  already_answered: 'Du har allerede svart på spørsmålet'
107
107
  can_only_vote_once: 'Du kan kun avgi ett svar'
108
+ submit: 'Svar'
109
+ submitting: 'Sender inn...'
110
+ no_answers: 'Du valgte ingen svar'
108
111
  images:
109
112
  responses:
110
113
  already_uploaded: 'Du har allerede lastet opp et bilde'
@@ -115,7 +118,14 @@ nb:
115
118
  already_responded: 'Du har allerede sendt inn svartekst'
116
119
  response: 'Svar'
117
120
  respond: 'Svar'
121
+ responding: 'Sender inn...'
118
122
  urls:
119
123
  responses:
120
124
  already_answered: 'Du har allerede oppgitt en addresse'
121
125
  answer: 'Svar'
126
+ answering: 'Sender inn...'
127
+ codes:
128
+ responses:
129
+ invalid: 'Ugyldig kode'
130
+ already_submitted: 'Du har allerede oppgitt koden'
131
+ submit: 'Oppgi kode'
data/config/routes.rb CHANGED
@@ -31,5 +31,11 @@ Tasuku::Engine.routes.draw do
31
31
  resources :responses, only: [:create]
32
32
  end
33
33
  end
34
+
35
+ namespace :code do
36
+ resources :requests, only: [] do
37
+ resources :responses, only: [:create]
38
+ end
39
+ end
34
40
  end
35
41
  end
@@ -0,0 +1,8 @@
1
+ class AddVideoUrls < ActiveRecord::Migration
2
+ def change
3
+ add_column :tasuku_taskables_questions, :video_url, :string
4
+ add_column :tasuku_taskables_image_requests, :video_url, :string
5
+ add_column :tasuku_taskables_url_requests, :video_url, :string
6
+ add_column :tasuku_taskables_text_requests, :video_url, :string
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ class CreateTasukuTaskablesCodeRequests < ActiveRecord::Migration
2
+ def change
3
+ create_table :tasuku_taskables_code_requests do |t|
4
+ t.string :text
5
+ t.string :code
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateTasukuTaskablesCodeResponses < ActiveRecord::Migration
2
+ def change
3
+ create_table :tasuku_taskables_code_responses do |t|
4
+ t.string :code
5
+ t.references :request
6
+ t.references :author, polymorphic: true
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddReplyToOption < ActiveRecord::Migration
2
+ def change
3
+ add_column :tasuku_taskables_question_options, :reply, :text
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class CreateTasukuTaskRequirements < ActiveRecord::Migration
2
+ def change
3
+ create_table :tasuku_task_requirements do |t|
4
+ t.integer :task_id, index: true
5
+ t.integer :requirement_id, index: true
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddDescriptionToCodeRequests < ActiveRecord::Migration
2
+ def change
3
+ add_column :tasuku_taskables_code_requests, :description, :text
4
+ end
5
+ end
@@ -3,7 +3,10 @@ module Tasuku
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
+ include Embeddable
7
+
6
8
  mount_uploader :image, ImageUploader
9
+ embeddable :video, from: :video_url
7
10
  end
8
11
  end
9
12
  end
@@ -0,0 +1,12 @@
1
+ module Tasuku
2
+ module Concerns::Models::Requirables::InverseRequirable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ belongs_to :task
7
+ belongs_to :requirement, class_name: "Task"
8
+
9
+ validates :task, :requirement, presence: true
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ module Tasuku
2
+ module Concerns::Models::Requirables::Requirable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ has_many :task_requirements
7
+ has_many :requirements, through: :task_requirements
8
+ has_many :inverse_tasks, class_name: "TaskRequirement", foreign_key: :requirement_id
9
+ has_many :required_for, through: :inverse_tasks, source: :task
10
+
11
+ accepts_nested_attributes_for :requirements, allow_destroy: true
12
+
13
+ def locked? author
14
+ required_task_ids = self.task_requirements.pluck :requirement_id
15
+ return false if required_task_ids.empty?
16
+
17
+ completed_task_ids = Tasuku::Task.completed_by(author).
18
+ where('tasuku_taskables_taskable_responses.task_id IN (?)', required_task_ids)
19
+
20
+ completed_task_ids.length.eql?(required_task_ids.length) ? false : true
21
+ end
22
+
23
+ def locked_by_tasks author
24
+ completed_task_ids = Tasuku::Task.completed_by(author).pluck(:id) || []
25
+
26
+ scope = self.requirements
27
+ scope = scope.where(
28
+ 'tasuku_task_requirements.requirement_id NOT IN (?)', completed_task_ids
29
+ ) unless completed_task_ids.empty?
30
+
31
+ scope
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module Tasuku::Concerns::Models::Requirables
2
+ require 'tasuku/concerns/models/requirables/requirable'
3
+ require 'tasuku/concerns/models/requirables/inverse_requirable'
4
+ end
@@ -0,0 +1,19 @@
1
+ module Tasuku
2
+ module Concerns::Models::Taskables::Code::Request
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include ::Tasks::Taskables::Taskable
7
+
8
+ has_many :responses
9
+
10
+ validates :text, :code, presence: true
11
+
12
+ responses are: :responses
13
+
14
+ def to_s
15
+ text
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Tasuku::Concerns::Models::Taskables::Code
2
+ require "tasuku/concerns/models/taskables/code/request"
3
+ end
@@ -4,4 +4,5 @@ module Tasuku::Concerns::Models::Taskables
4
4
  require 'tasuku/concerns/models/taskables/text'
5
5
  require 'tasuku/concerns/models/taskables/url'
6
6
  require 'tasuku/concerns/models/taskables/verification'
7
+ require 'tasuku/concerns/models/taskables/code'
7
8
  end
@@ -1,4 +1,5 @@
1
1
  module Tasuku::Concerns::Models
2
2
  require 'tasuku/concerns/models/task'
3
3
  require 'tasuku/concerns/models/taskables'
4
+ require 'tasuku/concerns/models/requirables'
4
5
  end
data/lib/tasuku/seeds.rb CHANGED
@@ -7,6 +7,9 @@ task = Tasks::Task.create! taskable: url_request
7
7
  text_request = Tasks::Taskables::Text::Request.create! text: 'Write something'
8
8
  task = Tasks::Task.create! taskable: text_request
9
9
 
10
+ code_request = Tasks::Taskables::Code::Request.create! text: 'Enter the code', code: '1337'
11
+ task = Tasks::Task.create! taskable: code_request
12
+
10
13
  question = Tasks::Taskables::Question.create! text: 'Choose something'
11
14
  option = Tasks::Taskables::Question::Option.create! question: question, text: 'One option'
12
15
  option = Tasks::Taskables::Question::Option.create! question: question, text: 'Another option'
@@ -1,3 +1,3 @@
1
1
  module Tasuku
2
- VERSION = '0.1.1'
2
+ VERSION = '1.0.1'
3
3
  end