From 3a2aa6ea1a98bbeca7cb8e3332bca7ae74557b63 Mon Sep 17 00:00:00 2001 From: Philipp Fischbeck Date: Sat, 2 Feb 2019 17:53:02 +0100 Subject: [PATCH] Add ability to accept or decline translations --- ...slations.coffee => translations.js.coffee} | 3 +++ .../admin/translations_controller.rb | 20 ++++++++++++++----- app/models/problem.rb | 2 +- app/views/admin/translations/index.html.erb | 6 ++++-- app/views/admin/translations/show.html.erb | 14 +++++++++++++ config/locales/views/admin/de.yml | 14 ++++++++++++- config/locales/views/application/de.yml | 3 +++ config/routes.rb | 6 +++++- ...190202113250_add_status_to_translations.rb | 15 ++++++++++++++ .../admin/translations_controller_test.rb | 14 ++++++++++++- test/models/problem_test.rb | 1 + 11 files changed, 87 insertions(+), 11 deletions(-) rename app/assets/javascripts/admin/{translations.coffee => translations.js.coffee} (73%) create mode 100644 db/migrate/20190202113250_add_status_to_translations.rb diff --git a/app/assets/javascripts/admin/translations.coffee b/app/assets/javascripts/admin/translations.js.coffee similarity index 73% rename from app/assets/javascripts/admin/translations.coffee rename to app/assets/javascripts/admin/translations.js.coffee index 24f83d1..42cfbbe 100644 --- a/app/assets/javascripts/admin/translations.coffee +++ b/app/assets/javascripts/admin/translations.js.coffee @@ -1,3 +1,6 @@ # Place all the behaviors and hooks related to the matching controller here. # All this logic will automatically be available in application.js. # You can use CoffeeScript in this file: http://coffeescript.org/ + +$(document).on "turbolinks:load", -> + $('[data-toggle="tooltip"]').tooltip() \ No newline at end of file diff --git a/app/controllers/admin/translations_controller.rb b/app/controllers/admin/translations_controller.rb index db013f0..aef7ebc 100644 --- a/app/controllers/admin/translations_controller.rb +++ b/app/controllers/admin/translations_controller.rb @@ -1,18 +1,28 @@ class Admin::TranslationsController < AdminController - before_action :set_translation, only: :show + before_action :set_translation, only: [:show, :accept, :decline] # GET /translations - # GET /translations.json def index - @translations = Translation.paginate(page: params[:page]) + @translations = Translation.pending.order(created_at: :desc).paginate(page: params[:page]) end # GET /translations/1 - # GET /translations/1.json def show end + def accept + raise t('.must_be_pending') unless @translation.pending? + @translation.problem.set_translation(@translation) + redirect_to @translation.problem, notice: t('.success_message') + end + + def decline + raise t('.must_be_pending') unless @translation.pending? + @translation.declined! + redirect_to admin_translations_path, notice: t('.success_message') + end + def set_translation - @translation = Translation.find(params[:id]) + @translation = Translation.find(params[:translation_id]) end end diff --git a/app/models/problem.rb b/app/models/problem.rb index e281d17..6a712f6 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -15,7 +15,7 @@ class Problem < ApplicationRecord if self.is_translated? self.translation.outdated! end - self.translation = translation + self.update(translation: translation) self.translation.in_use! end diff --git a/app/views/admin/translations/index.html.erb b/app/views/admin/translations/index.html.erb index 9c17d93..0476261 100644 --- a/app/views/admin/translations/index.html.erb +++ b/app/views/admin/translations/index.html.erb @@ -6,7 +6,8 @@ - + + @@ -14,7 +15,8 @@ <% @translations.each do |translation| %> - + + <% end %> diff --git a/app/views/admin/translations/show.html.erb b/app/views/admin/translations/show.html.erb index 72febdf..4e9e2a1 100644 --- a/app/views/admin/translations/show.html.erb +++ b/app/views/admin/translations/show.html.erb @@ -4,6 +4,20 @@

<%= @translation.title %> <%= t 'problems.show.problem_subtitle', id: @translation.problem_id %>

+<% if @translation.problem.is_translated? %> + +<% else %> + +<% end %> +<% if @translation.pending? %> + <%= link_to admin_translation_decline_path(@translation), method: :post, class: 'btn btn-default btn-sm pull-right' do %> + <%= icon :remove %> <%= t '.decline_translation' %> + <% end %> + <%= link_to admin_translation_accept_path(@translation), method: :post, class: 'btn btn-default btn-sm pull-right' do %> + <%= icon :ok %> <%= t '.accept_translation' %> + <% end %> +<% end %> + <%= panel do %>
<%= sanitize @translation.content %> diff --git a/config/locales/views/admin/de.yml b/config/locales/views/admin/de.yml index 4a41b80..2f1e4a9 100644 --- a/config/locales/views/admin/de.yml +++ b/config/locales/views/admin/de.yml @@ -9,4 +9,16 @@ de: update_problem_count: success_message: "Problem-Anzahl wurde erfolgreich aktualisiert!" failure_message: "Problem-Anzahl konnte nicht aktualisiert werden! Grund: %{error}" - no_problem_count: "Keine Problem-Anzahl gegeben!" \ No newline at end of file + no_problem_count: "Keine Problem-Anzahl gegeben!" + translations: + must_be_pending: "Übersetzung muss ausstehend sein, um akzeptiert oder abgelehnt zu werden!" + show: + accept_translation: "Akzeptieren" + decline_translation: "Ablehnen" + visit_current_translation: "Aktuelle Übersetzung anschauen" + already_translated: "Dieses Problem wurde bereits übersetzt." + is_new_translation: "Dieses Problem hat bisher keine Übersetzung." + accept: + success_message: "Übersetzung wurde erfolgreich akzeptiert!" + decline: + success_message: "Übersetzung wurde erfolgreich abgelehnt!" \ No newline at end of file diff --git a/config/locales/views/application/de.yml b/config/locales/views/application/de.yml index 550a87e..cccda7c 100644 --- a/config/locales/views/application/de.yml +++ b/config/locales/views/application/de.yml @@ -1,6 +1,9 @@ # ruby encoding: utf-8 de: + attributes: + created_at: Erstellt + updated_at: Aktualisiert application: site_title: "Projekt Euler" sign_in: 'Einloggen' diff --git a/config/routes.rb b/config/routes.rb index 49fc368..cb13527 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,6 +26,10 @@ Rails.application.routes.draw do namespace :admin do get '', to: 'dashboard#index', as: 'dashboard_index' post '/update_problem_count', to: 'dashboard#update_problem_count', as: 'dashboard_update_problem_count' - resources :translations, only: [:index, :show] + resources :translations, only: [:index] do + get '', to: 'translations#show', as: '' + post 'accept', to: 'translations#accept' + post 'decline', to: 'translations#decline' + end end end \ No newline at end of file diff --git a/db/migrate/20190202113250_add_status_to_translations.rb b/db/migrate/20190202113250_add_status_to_translations.rb new file mode 100644 index 0000000..86583d5 --- /dev/null +++ b/db/migrate/20190202113250_add_status_to_translations.rb @@ -0,0 +1,15 @@ +class AddStatusToTranslations < ActiveRecord::Migration[5.2] + def change + add_column :translations, :status, :integer, default: 0 + + reversible do |dir| + dir.up do + Problem.all.each do |problem| + if problem.is_translated? + problem.translation.in_use! + end + end + end + end + end +end diff --git a/test/controllers/admin/translations_controller_test.rb b/test/controllers/admin/translations_controller_test.rb index 31bc4d0..4536ae0 100644 --- a/test/controllers/admin/translations_controller_test.rb +++ b/test/controllers/admin/translations_controller_test.rb @@ -6,6 +6,7 @@ class Admin::TranslationsControllerTest < ActionDispatch::IntegrationTest setup do login @translation = translations(:translation_one) + @translation_alternative = translations(:translation_two_alternative) end test "should get index" do get admin_translations_url @@ -14,8 +15,19 @@ class Admin::TranslationsControllerTest < ActionDispatch::IntegrationTest end test "should show translation" do - get admin_translation_url(id: @translation) + get admin_translation_url(translation_id: @translation) assert_response :success end + test "should accept translation" do + post admin_translation_accept_path(@translation_alternative) + assert_redirected_to problem_path(2) + assert_equal @translation_alternative, Problem.find(2).translation + end + + test "should decline translation" do + post admin_translation_decline_path(@translation_alternative) + assert_redirected_to admin_translations_path + assert Translation.find(@translation_alternative.id).declined? + end end diff --git a/test/models/problem_test.rb b/test/models/problem_test.rb index 44bc6b5..eff3db1 100644 --- a/test/models/problem_test.rb +++ b/test/models/problem_test.rb @@ -18,6 +18,7 @@ class ProblemTest < ActiveSupport::TestCase problems(:two).set_translation(translations(:translation_two_alternative)) assert translations(:translation_two).outdated? assert translations(:translation_two_alternative).in_use? + assert_equal translations(:translation_two_alternative), problems(:two).translation end test "should have correct original url" do
<%= Translation.human_attribute_name(:id) %><%= Translation.human_attribute_name(:created_at) %><%= Translation.human_attribute_name(:problem_id) %> <%= Translation.human_attribute_name(:title) %>
<%= translation.id %>
<%= time_ago_in_words(translation.created_at) %>
<%= translation.problem_id %> <%= link_to translation.title, [:admin, translation] %>