From e7aed8607168d3c8954fbced97c20d1e08714e2a Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Wed, 22 Sep 2021 11:35:12 +0200
Subject: [PATCH] seeds

---
 .../admin/application_controller.rb           |  6 ++
 .../server/languages_controller.rb            | 62 +++++++++++++++++++
 .../server/universities_controller.rb         |  1 +
 app/models/language.rb                        | 18 ++++++
 app/views/server/languages/_form.html.erb     | 14 +++++
 app/views/server/languages/edit.html.erb      |  3 +
 app/views/server/languages/index.html.erb     | 27 ++++++++
 app/views/server/languages/new.html.erb       |  3 +
 app/views/server/languages/show.html.erb      | 10 +++
 .../universities/_university.json.jbuilder    |  2 -
 .../server/universities/index.json.jbuilder   |  1 -
 .../server/universities/show.json.jbuilder    |  1 -
 config/locales/fr.yml                         |  3 +
 config/routes.rb                              |  2 +
 config/server_navigation.rb                   |  1 +
 db/migrate/20210922091537_create_languages.rb | 10 +++
 db/schema.rb                                  |  9 ++-
 db/seeds.rb                                   |  3 +
 test/controllers/languages_controller_test.rb | 48 ++++++++++++++
 test/fixtures/languages.yml                   | 18 ++++++
 test/models/language_test.rb                  | 17 +++++
 test/system/languages_test.rb                 | 45 ++++++++++++++
 22 files changed, 299 insertions(+), 5 deletions(-)
 create mode 100644 app/controllers/server/languages_controller.rb
 create mode 100644 app/models/language.rb
 create mode 100644 app/views/server/languages/_form.html.erb
 create mode 100644 app/views/server/languages/edit.html.erb
 create mode 100644 app/views/server/languages/index.html.erb
 create mode 100644 app/views/server/languages/new.html.erb
 create mode 100644 app/views/server/languages/show.html.erb
 delete mode 100644 app/views/server/universities/_university.json.jbuilder
 delete mode 100644 app/views/server/universities/index.json.jbuilder
 delete mode 100644 app/views/server/universities/show.json.jbuilder
 create mode 100644 db/migrate/20210922091537_create_languages.rb
 create mode 100644 test/controllers/languages_controller_test.rb
 create mode 100644 test/fixtures/languages.yml
 create mode 100644 test/models/language_test.rb
 create mode 100644 test/system/languages_test.rb

diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb
index 5ed9a73d7..95c1434d3 100644
--- a/app/controllers/admin/application_controller.rb
+++ b/app/controllers/admin/application_controller.rb
@@ -2,6 +2,7 @@ class Admin::ApplicationController < ApplicationController
   layout 'admin/layouts/application'
 
   before_action :authenticate_user!
+  before_action :set_locale
 
   protected
 
@@ -20,4 +21,9 @@ class Admin::ApplicationController < ApplicationController
     object.persisted? ? add_breadcrumb(object, [:admin, object, options])
                       : add_breadcrumb('Créer')
   end
+
+  def set_locale
+    return unless current_user
+    # I18n.locale = current_user.locale
+  end
 end
diff --git a/app/controllers/server/languages_controller.rb b/app/controllers/server/languages_controller.rb
new file mode 100644
index 000000000..05a3de530
--- /dev/null
+++ b/app/controllers/server/languages_controller.rb
@@ -0,0 +1,62 @@
+class Server::LanguagesController < Server::ApplicationController
+  load_and_authorize_resource
+
+  def index
+    breadcrumb
+  end
+
+  def show
+    breadcrumb
+  end
+
+  def new
+    breadcrumb
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb 'Modifier'
+  end
+
+  def create
+    breadcrumb
+    if @language.save
+      redirect_to @language, notice: "Language was successfully created."
+    else
+      render :new, status: :unprocessable_entity
+    end
+  end
+
+  def update
+    breadcrumb
+    add_breadcrumb 'Modifier'
+    if @language.update(language_params)
+      redirect_to @language, notice: "Language was successfully updated."
+    else
+      render :edit, status: :unprocessable_entity
+    end
+  end
+
+  def destroy
+    @language.destroy
+    redirect_to languages_url, notice: "Language was successfully destroyed."
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb Language.model_name.human(count: 2), server_languages_path
+    if @language
+      if @language.persisted?
+        add_breadcrumb @language, [:server, @language]
+      else
+        add_breadcrumb 'Créer'
+      end
+    end
+  end
+
+  def language_params
+    params.require(:language).permit(:name, :iso_code)
+  end
+end
diff --git a/app/controllers/server/universities_controller.rb b/app/controllers/server/universities_controller.rb
index 196f639dc..efd9c6e57 100644
--- a/app/controllers/server/universities_controller.rb
+++ b/app/controllers/server/universities_controller.rb
@@ -33,6 +33,7 @@ class Server::UniversitiesController < Server::ApplicationController
 
   def update
     breadcrumb
+    add_breadcrumb 'Modifier'
     respond_to do |format|
       if @university.update(university_params)
         format.html { redirect_to [:server, @university], notice: "University was successfully updated." }
diff --git a/app/models/language.rb b/app/models/language.rb
new file mode 100644
index 000000000..b6f2b20ac
--- /dev/null
+++ b/app/models/language.rb
@@ -0,0 +1,18 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+class Language < ApplicationRecord
+
+  validates_uniqueness_of :iso_code
+
+  def to_s
+    "#{name}"
+  end
+end
diff --git a/app/views/server/languages/_form.html.erb b/app/views/server/languages/_form.html.erb
new file mode 100644
index 000000000..17a932c39
--- /dev/null
+++ b/app/views/server/languages/_form.html.erb
@@ -0,0 +1,14 @@
+<%= simple_form_for [:server, language] do |f| %>
+  <div class="row">
+    <div class="col-md-8">
+      <%= f.input :name %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :iso_code %>
+    </div>
+  </div>
+
+  <% content_for :buttons do %>
+    <%= submit f %>
+  <% end %>
+<% end %>
diff --git a/app/views/server/languages/edit.html.erb b/app/views/server/languages/edit.html.erb
new file mode 100644
index 000000000..78b30fd4b
--- /dev/null
+++ b/app/views/server/languages/edit.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, @language %>
+
+<%= render 'form', language: @language %>
diff --git a/app/views/server/languages/index.html.erb b/app/views/server/languages/index.html.erb
new file mode 100644
index 000000000..c051503a2
--- /dev/null
+++ b/app/views/server/languages/index.html.erb
@@ -0,0 +1,27 @@
+<% content_for :title, Language.model_name.human(count: 2) %>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Name</th>
+      <th>Iso code</th>
+      <th></th>
+    </tr>
+  </thead>
+
+  <tbody>
+    <% @languages.each do |language| %>
+      <tr>
+        <td><%= link_to language, [:server, language] %></td>
+        <td><%= language.iso_code %></td>
+        <td class="text-end">
+          <%= link_to t('edit'), edit_server_language_path(language), class: button_classes %>
+        </td>
+      </tr>
+    <% end %>
+  </tbody>
+</table>
+
+<% content_for :buttons do %>
+  <%= link_to t('create'), new_server_language_path, class: button_classes %>
+<% end %>
diff --git a/app/views/server/languages/new.html.erb b/app/views/server/languages/new.html.erb
new file mode 100644
index 000000000..ec8343274
--- /dev/null
+++ b/app/views/server/languages/new.html.erb
@@ -0,0 +1,3 @@
+<% content_for :title, Language.model_name.human %>
+
+<%= render 'form', language: @language %>
diff --git a/app/views/server/languages/show.html.erb b/app/views/server/languages/show.html.erb
new file mode 100644
index 000000000..56a8fc028
--- /dev/null
+++ b/app/views/server/languages/show.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, @language %>
+
+<p>
+  <strong>Iso code:</strong>
+  <%= @language.iso_code %>
+</p>
+
+<% content_for :buttons do %>
+  <%= link_to t('edit'), edit_server_language_path(@language), class: button_classes %>
+<% end %>
diff --git a/app/views/server/universities/_university.json.jbuilder b/app/views/server/universities/_university.json.jbuilder
deleted file mode 100644
index 9b20654a6..000000000
--- a/app/views/server/universities/_university.json.jbuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-json.extract! university, :id, :name, :address, :zipcode, :city, :country, :private, :created_at, :updated_at
-json.url university_url(university, format: :json)
diff --git a/app/views/server/universities/index.json.jbuilder b/app/views/server/universities/index.json.jbuilder
deleted file mode 100644
index 93258cd65..000000000
--- a/app/views/server/universities/index.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.array! @universities, partial: "universities/university", as: :university
diff --git a/app/views/server/universities/show.json.jbuilder b/app/views/server/universities/show.json.jbuilder
deleted file mode 100644
index c8b159aca..000000000
--- a/app/views/server/universities/show.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.partial! "universities/university", university: @university
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 505810077..ccc4744ce 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -13,6 +13,9 @@ fr:
       university:
         one: Université
         other: Universités
+      language:
+        one: Langue
+        other: Langues
       user:
         one: Utilisateur
         other: Utilisateurs
diff --git a/config/routes.rb b/config/routes.rb
index 92dfc427e..540db86ee 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
 Rails.application.routes.draw do
+  resources :languages
   devise_for :users, controllers: {
     registrations: 'users/registrations',
     sessions: 'users/sessions'
@@ -15,6 +16,7 @@ Rails.application.routes.draw do
 
   namespace :server do
     resources :universities
+    resources :languages
     root to: 'dashboard#index'
   end
 
diff --git a/config/server_navigation.rb b/config/server_navigation.rb
index c94ce20eb..72d21f859 100644
--- a/config/server_navigation.rb
+++ b/config/server_navigation.rb
@@ -6,5 +6,6 @@ SimpleNavigation::Configuration.run do |navigation|
   navigation.items do |primary|
     primary.item :dashboard, t('dashboard'), server_root_path, { icon: 'tachometer-alt', highlights_on: %r{adminserver$} }
     primary.item :universities, University.model_name.human(count: 2), server_universities_path, { icon: 'university' }
+    primary.item :languages, Language.model_name.human(count: 2), server_languages_path, { icon: 'flag' }
   end
 end
diff --git a/db/migrate/20210922091537_create_languages.rb b/db/migrate/20210922091537_create_languages.rb
new file mode 100644
index 000000000..aff8421ea
--- /dev/null
+++ b/db/migrate/20210922091537_create_languages.rb
@@ -0,0 +1,10 @@
+class CreateLanguages < ActiveRecord::Migration[6.1]
+  def change
+    create_table :languages, id: :uuid do |t|
+      t.string :name
+      t.string :iso_code
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f5d944117..f7cf9f0e8 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2021_09_21_170648) do
+ActiveRecord::Schema.define(version: 2021_09_22_091537) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
@@ -137,6 +137,13 @@ ActiveRecord::Schema.define(version: 2021_09_21_170648) do
     t.index ["university_id"], name: "index_education_programs_on_university_id"
   end
 
+  create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.string "iso_code"
+    t.datetime "created_at", precision: 6, null: false
+    t.datetime "updated_at", precision: 6, null: false
+  end
+
   create_table "research_journal_articles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "title"
     t.text "text"
diff --git a/db/seeds.rb b/db/seeds.rb
index 91fe7b01f..1f63f50f7 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1,5 +1,8 @@
 University.create name: 'Osuny', identifier: 'demo'
 
+Language.where(name: 'French', iso_code: 'fr').first_or_create
+Language.where(name: 'English', iso_code: 'en').first_or_create
+
 Administration::Qualiopi::Criterion.destroy_all
 Administration::Qualiopi::Criterion.create [
   {
diff --git a/test/controllers/languages_controller_test.rb b/test/controllers/languages_controller_test.rb
new file mode 100644
index 000000000..e7d19856b
--- /dev/null
+++ b/test/controllers/languages_controller_test.rb
@@ -0,0 +1,48 @@
+require "test_helper"
+
+class LanguagesControllerTest < ActionDispatch::IntegrationTest
+  setup do
+    @language = languages(:one)
+  end
+
+  test "should get index" do
+    get languages_url
+    assert_response :success
+  end
+
+  test "should get new" do
+    get new_language_url
+    assert_response :success
+  end
+
+  test "should create language" do
+    assert_difference('Language.count') do
+      post languages_url, params: { language: { iso_code: @language.iso_code, name: @language.name } }
+    end
+
+    assert_redirected_to language_url(Language.last)
+  end
+
+  test "should show language" do
+    get language_url(@language)
+    assert_response :success
+  end
+
+  test "should get edit" do
+    get edit_language_url(@language)
+    assert_response :success
+  end
+
+  test "should update language" do
+    patch language_url(@language), params: { language: { iso_code: @language.iso_code, name: @language.name } }
+    assert_redirected_to language_url(@language)
+  end
+
+  test "should destroy language" do
+    assert_difference('Language.count', -1) do
+      delete language_url(@language)
+    end
+
+    assert_redirected_to languages_url
+  end
+end
diff --git a/test/fixtures/languages.yml b/test/fixtures/languages.yml
new file mode 100644
index 000000000..45b6db808
--- /dev/null
+++ b/test/fixtures/languages.yml
@@ -0,0 +1,18 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+
+one:
+  name: MyString
+  iso_code: MyString
+
+two:
+  name: MyString
+  iso_code: MyString
diff --git a/test/models/language_test.rb b/test/models/language_test.rb
new file mode 100644
index 000000000..e43f8ceee
--- /dev/null
+++ b/test/models/language_test.rb
@@ -0,0 +1,17 @@
+# == Schema Information
+#
+# Table name: languages
+#
+#  id         :uuid             not null, primary key
+#  iso_code   :string
+#  name       :string
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+require "test_helper"
+
+class LanguageTest < ActiveSupport::TestCase
+  # test "the truth" do
+  #   assert true
+  # end
+end
diff --git a/test/system/languages_test.rb b/test/system/languages_test.rb
new file mode 100644
index 000000000..b5d0360f2
--- /dev/null
+++ b/test/system/languages_test.rb
@@ -0,0 +1,45 @@
+require "application_system_test_case"
+
+class LanguagesTest < ApplicationSystemTestCase
+  setup do
+    @language = languages(:one)
+  end
+
+  test "visiting the index" do
+    visit languages_url
+    assert_selector "h1", text: "Languages"
+  end
+
+  test "creating a Language" do
+    visit languages_url
+    click_on "New Language"
+
+    fill_in "Iso code", with: @language.iso_code
+    fill_in "Name", with: @language.name
+    click_on "Create Language"
+
+    assert_text "Language was successfully created"
+    click_on "Back"
+  end
+
+  test "updating a Language" do
+    visit languages_url
+    click_on "Edit", match: :first
+
+    fill_in "Iso code", with: @language.iso_code
+    fill_in "Name", with: @language.name
+    click_on "Update Language"
+
+    assert_text "Language was successfully updated"
+    click_on "Back"
+  end
+
+  test "destroying a Language" do
+    visit languages_url
+    page.accept_confirm do
+      click_on "Destroy", match: :first
+    end
+
+    assert_text "Language was successfully destroyed"
+  end
+end
-- 
GitLab