voluntary_translation 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.
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.0.1 (October 13, 2013) ##
2
+
3
+ * Initial version.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = VoluntaryTranslation
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'VoluntaryTranslation'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
@@ -0,0 +1,7 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
4
+ jQuery ->
5
+ $('#story_output_language_tokens').tokenInput '/users/languages.json',
6
+ theme: 'facebook'
7
+ prePopulate: $('#story_output_language_tokens').data('load')
@@ -0,0 +1,3 @@
1
+ class Product::Translation < ::Product
2
+ include ::Product::ProjectManagement
3
+ end
@@ -0,0 +1,4 @@
1
+ class Product::Translation::Column < Column
2
+ belongs_to :story, class_name: 'Product::Translation::Story', inverse_of: :column
3
+ has_many :tasks, dependent: :destroy, class_name: 'Product::Translation::Task', inverse_of: :column
4
+ end
@@ -0,0 +1,70 @@
1
+ class Product::Translation::Story < Story
2
+ has_many :columns, dependent: :destroy, class_name: 'Product::Translation::Column', inverse_of: :story
3
+ has_many :tasks, dependent: :destroy, class_name: 'Product::Translation::Task', inverse_of: :story
4
+
5
+ field :input_language, type: String
6
+ field :output_languages, type: Array
7
+
8
+ validates :input_language, presence: true
9
+ validates :output_languages, presence: true
10
+
11
+ attr_accessible :input_language, :output_languages, :output_language_tokens, :columns_attributes
12
+
13
+ accepts_nested_attributes_for :columns, allow_destroy: true, reject_if: ->(t) { t['key'].blank? or t['text'].blank? }
14
+
15
+ after_save :create_tasks
16
+
17
+ state_machine :state, initial: :new do
18
+ state :tasks_defined do
19
+ validates_associated :columns
20
+ validate :presence_of_columns
21
+ end
22
+
23
+ #after_transition on: :active, do: :create_tasks
24
+ end
25
+
26
+ def self.for_user(user)
27
+ active.where(:output_languages.in => user.languages)
28
+ end
29
+
30
+ def output_language_tokens=(tokens)
31
+ self.output_languages = tokens.split(',')
32
+ end
33
+
34
+ def output_language_tokens
35
+ options = []
36
+
37
+ User.languages.each do |language|
38
+ next unless (output_languages || []).include?(language.second)
39
+
40
+ options << { id: language.second, name: language.first }
41
+ end
42
+
43
+ options
44
+ end
45
+
46
+ private
47
+
48
+ def presence_of_tasks; ; end
49
+
50
+ def presence_of_columns
51
+ unless columns.any?
52
+ errors[:base] << I18n.t(
53
+ 'activerecord.errors.models.story.attributes.base.missing_columns'
54
+ )
55
+ end
56
+ end
57
+
58
+ def create_tasks
59
+ return unless state_changed? && state == 'active'
60
+
61
+ output_languages.each do |output_language|
62
+ columns.each do |column|
63
+ tasks.create!(
64
+ column_id: column.id, name: column.key, text: column.text,
65
+ input_language: input_language, output_language: output_language
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,28 @@
1
+ class Product::Translation::Task < ::Task
2
+ belongs_to :story, class_name: 'Product::Translation::Story', inverse_of: :task
3
+ belongs_to :column, class_name: 'Product::Translation::Column', inverse_of: :task
4
+
5
+ field :input_language, type: String
6
+ field :output_language, type: String
7
+
8
+ validates :text, presence: true
9
+ validates :input_language, presence: true
10
+ validates :output_language, presence: true
11
+
12
+ attr_accessible :column_id, :input_language, :output_language
13
+
14
+ protected
15
+
16
+ # validates :name, presence: true, uniqueness: { scope: [:story_id, :output_language] }
17
+ def name_valid?
18
+ return unless name_changed?
19
+
20
+ if name.present?
21
+ if Task.where(name: name, story_id: story_id, output_language: output_language).any?
22
+ errors.add(:name, I18n.t('errors.messages.taken'))
23
+ end
24
+ else
25
+ errors.add(:name, I18n.t('errors.messages.blank'))
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ <% content_for(:javascript_includes) { javascript_include_tag 'voluntary_translation/stories' } %>
2
+
3
+ <%= simple_form_for(@story, html: {class: 'form-vertical'}) do |f| %>
4
+ <%= render partial: 'shared/form/error_messages', locals: { resource: @story } %>
5
+
6
+ <% unless @story.new_record? %>
7
+ <div class="form-actions">
8
+ <%= f.button :submit %>
9
+ </div>
10
+ <% end %>
11
+
12
+ <div class="form-inputs">
13
+ <%= @story.project ? f.hidden_field(:project_id) : f.input(:project_id, collection: Project.all) %>
14
+ <%= f.input :name %>
15
+ <%= f.input :text, as: :text, input_html: {style: 'width:500px; height:100px;'} %>
16
+ <%= f.input :input_language, collection: all_language_options %>
17
+ <%= f.input :output_language_tokens, as: :string, input_html: { data: { load: resource.output_language_tokens } } unless Rails.env == 'test' %>
18
+ </div>
19
+
20
+ <div class="form-actions">
21
+ <%= f.button :submit %>
22
+ </div>
23
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <%= simple_form_for(@story, html: {class: 'floating_form form-vertical'}) do |f| %>
2
+ <%= render partial: 'shared/form/error_messages', locals: { resource: @story } %>
3
+ <% if step == :activate %>
4
+ <input type="hidden" name="next_step" value="1"/>
5
+ <% end %>
6
+ <div class="form-inputs">
7
+ <%= render partial: 'columns/collection', locals: {
8
+ collection: @story.columns.select{|t| !t.new_record? },
9
+ options: { current_parent: @story, append_new_link: false }
10
+ }
11
+ %>
12
+ </div>
13
+
14
+ <div class="form-actions">
15
+ <%= f.button :submit, t('general.events.activate') %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,35 @@
1
+ <%= simple_form_for(@story, @step_presenter.form_options) do |f| %>
2
+ <%= render partial: 'shared/form/error_messages', locals: { resource: @story } %>
3
+ <% if step == :setup_tasks %>
4
+ <input type="hidden" name="next_step" value="1"/>
5
+ <% end %>
6
+
7
+ <div class="form-actions">
8
+ <div class="control-group string required" style="display: block">
9
+ <div class="controls">
10
+ <%= f.button :submit, t('stories.steps.setup_tasks.update') %>
11
+
12
+ &nbsp;&nbsp;&nbsp;&nbsp;
13
+ <%= link_to_add_fields(
14
+ t('stories.steps.setup_tasks.add_column'), f, :columns, target: 'setup_columns_input'
15
+ ) %>
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+ <div id="setup_columns_input" class="form-inputs">
21
+ <%= f.simple_fields_for :columns do |column_form| %>
22
+ <%= render_product_specific_partial_if_available(
23
+ column_form.object, 'stories/column_fields', f: column_form
24
+ ) %>
25
+ <% end %>
26
+ </div>
27
+
28
+ <div class="form-actions">
29
+ <div class="control-group string required" style="display: block">
30
+ <div class="controls">
31
+ <%= f.button :submit, t('stories.steps.setup_tasks.update') %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <h3><%= resource.name %></h3>
2
+
3
+ <strong><%= t('activerecord.attributes.general.state') %>:</strong> <%= resource.state %>
4
+
5
+ <strong><%= t('activerecord.attributes.task.input_language') %>:</strong> <%= resource.input_language %>
6
+
7
+ <strong><%= t('activerecord.attributes.task.output_language') %>:</strong> <%= resource.output_language %>
8
+
9
+ <h4><%= t('tasks.show.story_text') %></h4>
10
+
11
+ <%= resource.story.text %>
12
+
13
+ <% if resource.text.present? %>
14
+ <h4><%= t('tasks.show.text') %></h4>
15
+
16
+ <%= resource.text %>
17
+ <% end %>
18
+
19
+ <h4><%= t('activerecord.models.result') %></h4>
@@ -0,0 +1,6 @@
1
+ en:
2
+ activerecord:
3
+ attributes:
4
+ task:
5
+ input_language: Input Language
6
+ output_language: Output Language
@@ -0,0 +1,6 @@
1
+ en:
2
+ workflow:
3
+ user:
4
+ products:
5
+ translation:
6
+ title: Translation
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Rails.application.routes.draw do
2
+ end
@@ -0,0 +1,13 @@
1
+ class AddTranslationProduct < ActiveRecord::Migration
2
+ def up
3
+ area = Area.where(name: 'General').first
4
+
5
+ product = Product.new(name: 'Translation', text: 'Dummy', area_ids: [area.id])
6
+ product.user_id = User.where(name: 'Master').first.id
7
+ product.save!
8
+ end
9
+
10
+ def down
11
+ Product.where(name: 'Translation').first.destroy
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :voluntary_translation do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,6 @@
1
+ require 'voluntary'
2
+
3
+ require 'voluntary_translation/engine'
4
+
5
+ module VoluntaryTranslation
6
+ end
@@ -0,0 +1,5 @@
1
+ module VoluntaryTranslation
2
+ class Engine < ::Rails::Engine
3
+ config.i18n.load_path += Dir[File.expand_path("../../../config/locales/**/*.{rb,yml}", __FILE__)]
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module VoluntaryTranslation
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: voluntary_translation
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mathias Gawlista
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: voluntary
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.1.0
30
+ description: Translation product for crowdsourcing engine voluntary.
31
+ email:
32
+ - gawlista@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - app/assets/javascripts/voluntary_translation/stories.js.coffee
38
+ - app/models/product/translation/column.rb
39
+ - app/models/product/translation/story.rb
40
+ - app/models/product/translation/task.rb
41
+ - app/models/product/translation.rb
42
+ - app/views/products/types/translation/stories/steps/_activate.html.erb
43
+ - app/views/products/types/translation/stories/steps/_setup_tasks.html.erb
44
+ - app/views/products/types/translation/stories/_form.html.erb
45
+ - app/views/products/types/translation/workflow/tasks/_work_head.html.erb
46
+ - config/locales/resources/product/translation/task/en.yml
47
+ - config/locales/workflow/en.yml
48
+ - config/routes.rb
49
+ - db/migrate/20131006062915_add_translation_product.rb
50
+ - lib/tasks/voluntary_translation_tasks.rake
51
+ - lib/voluntary_translation/engine.rb
52
+ - lib/voluntary_translation/version.rb
53
+ - lib/voluntary_translation.rb
54
+ - CHANGELOG.md
55
+ - MIT-LICENSE
56
+ - Rakefile
57
+ - README.rdoc
58
+ homepage: http://github.com/volontariat/voluntary_translation
59
+ licenses: []
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ segments:
71
+ - 0
72
+ hash: 792462451
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ segments:
80
+ - 0
81
+ hash: 792462451
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 1.8.23
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: Translation product for crowdsourcing engine voluntary.
88
+ test_files: []