diff --git a/app/controllers/admin/communication/extranets/alumni_controller.rb b/app/controllers/admin/communication/extranets/alumni_controller.rb index cc4f5fbc7e3bceb210998b6b7b516ac5fad56b6a..fc15ee3132c1a95bb2621a8cfcb685bbc930ccbf 100644 --- a/app/controllers/admin/communication/extranets/alumni_controller.rb +++ b/app/controllers/admin/communication/extranets/alumni_controller.rb @@ -4,7 +4,7 @@ class Admin::Communication::Extranets::AlumniController < Admin::Communication:: @alumni = @extranet.alumni @cohorts = @extranet.cohorts @years = @extranet.years - @organizations = @extranet.organizations + @organizations = @extranet.organizations.for_language_id(current_university.default_language_id) breadcrumb add_breadcrumb Communication::Extranet.human_attribute_name(:feature_alumni) end diff --git a/app/controllers/admin/communication/extranets/contacts_controller.rb b/app/controllers/admin/communication/extranets/contacts_controller.rb index 7a88f34f4bf16457a644bbd3094c79574c096291..6283e05b3c111c225d3b8c241221eee617bdec51 100644 --- a/app/controllers/admin/communication/extranets/contacts_controller.rb +++ b/app/controllers/admin/communication/extranets/contacts_controller.rb @@ -1,33 +1,35 @@ class Admin::Communication::Extranets::ContactsController < Admin::Communication::Extranets::ApplicationController def index - respond_to do |format| - format.html { - @people = current_university.people.ordered.page params[:persons_page] - @organizations = current_university.organizations.ordered.page params[:organizations_page] - } - format.xlsx { - # params[export] can be "people" oe "organizations" - export = params['export'] - case params['export'] - when 'people' - @people = @extranet.connected_people.ordered - when 'organizations' - @organizations = @extranet.connected_organizations.ordered - else - raise ActionController::RoutingError.new('Not Found') - end - - filename = "#{export}-#{Time.now.strftime("%Y%m%d%H%M%S")}.xlsx" - response.headers['Content-Disposition'] = "attachment; filename=#{filename}" - render "admin/university/#{export}/index" - } - end - - + @people = current_university.people + .for_language_id(current_university.default_language_id) + .ordered + .page(params[:persons_page]) + @organizations = current_university.organizations + .for_language_id(current_university.default_language_id) + .ordered + .page(params[:organizations_page]) breadcrumb add_breadcrumb Communication::Extranet.human_attribute_name(:feature_contacts) end + def export_people + @people = @extranet.connected_people + .for_language_id(current_university.default_language_id) + .ordered + filename = "people-#{Time.now.strftime("%Y%m%d%H%M%S")}.xlsx" + response.headers['Content-Disposition'] = "attachment; filename=#{filename}" + render "admin/university/people/index" + end + + def export_organizations + @organizations = @extranet.connected_organizations + .for_language_id(current_university.default_language_id) + .ordered + filename = "organizations-#{Time.now.strftime("%Y%m%d%H%M%S")}.xlsx" + response.headers['Content-Disposition'] = "attachment; filename=#{filename}" + render "admin/university/organizations/index" + end + def connect load_object @extranet.connect @object @@ -48,7 +50,6 @@ class Admin::Communication::Extranets::ContactsController < Admin::Communication head :ok end - protected def load_object diff --git a/app/controllers/admin/university/organizations_controller.rb b/app/controllers/admin/university/organizations_controller.rb index 181b171692144fc886481f591c25117f4f010cd1..075b7d2b4c118c85aa3cc725d8aa08885fd309c8 100644 --- a/app/controllers/admin/university/organizations_controller.rb +++ b/app/controllers/admin/university/organizations_controller.rb @@ -9,6 +9,7 @@ class Admin::University::OrganizationsController < Admin::University::Applicatio def index @organizations = apply_scopes(@organizations) + .for_language_id(current_university.default_language_id) .ordered respond_to do |format| @@ -26,15 +27,32 @@ class Admin::University::OrganizationsController < Admin::University::Applicatio def search @term = params[:term].to_s + language = Language.find_by(iso_code: params[:lang]) @organizations = current_university.organizations .search_by_siren_or_name(@term) .ordered + @organizations = @organizations.joins(:language) + .where(languages: { + iso_code: language.iso_code + }) if language.present? end def show breadcrumb end + def in_language + language = Language.find_by!(iso_code: params[:lang]) + translation = @organization.find_or_translate!(language) + if translation.newly_translated + # There's an attribute accessor named "newly_translated" that we set to true + # when we just created the translation. We use it to redirect to the form instead of the show. + redirect_to [:edit, :admin, translation.becomes(translation.class.base_class)] + else + redirect_to [:admin, translation.becomes(translation.class.base_class)] + end + end + def static @about = @organization @website = @organization.websites&.first diff --git a/app/controllers/extranet/organizations_controller.rb b/app/controllers/extranet/organizations_controller.rb index af318f25a12e5deabde835ae1e8818b5be56f243..99885416da54d68741d70faa8857f1a4f2bb171a 100644 --- a/app/controllers/extranet/organizations_controller.rb +++ b/app/controllers/extranet/organizations_controller.rb @@ -4,8 +4,9 @@ class Extranet::OrganizationsController < Extranet::ApplicationController def search @term = params[:term].to_s @organizations = current_university.organizations - .search_by_siren_or_name(@term) - .ordered + .for_language_id(current_user.language_id) + .search_by_siren_or_name(@term) + .ordered end def show diff --git a/app/models/communication/block/component/organization.rb b/app/models/communication/block/component/organization.rb index 1e095f8772e9780bdc62c9a15d4e6e11369e0fe1..1acd7bd0d9ccbfcb3a297ea22ea179d9ec22003e 100644 --- a/app/models/communication/block/component/organization.rb +++ b/app/models/communication/block/component/organization.rb @@ -1,7 +1,10 @@ class Communication::Block::Component::Organization < Communication::Block::Component::Base def organization - template.block.university.organizations.find_by(id: data) + template.block + .university + .organizations + .find_by(id: data) end def dependencies @@ -9,7 +12,8 @@ class Communication::Block::Component::Organization < Communication::Block::Comp end def translate! - # TODO: Traduction des Organisations à faire + return unless data.present? + @data = organization.find_or_translate!(template.language).id end end diff --git a/app/models/communication/block/component/person.rb b/app/models/communication/block/component/person.rb index a03a1538b4d8712ee68d0b73935403030c1772e6..334010b21acfa601c49b0b3471cc60d5b248534e 100644 --- a/app/models/communication/block/component/person.rb +++ b/app/models/communication/block/component/person.rb @@ -1,7 +1,10 @@ class Communication::Block::Component::Person < Communication::Block::Component::Base def person - template.block.university.people.find_by(id: data) + template.block + .university + .people + .find_by(id: data) end def dependencies diff --git a/app/models/university/organization.rb b/app/models/university/organization.rb index 0ff6fddf33b60316ff8d1ff01f1f495d210591f4..9cdd65b6915ff386e3e333d4b83de8864d5a2111 100644 --- a/app/models/university/organization.rb +++ b/app/models/university/organization.rb @@ -29,15 +29,21 @@ # zipcode :string # created_at :datetime not null # updated_at :datetime not null +# language_id :uuid indexed +# original_id :uuid indexed # university_id :uuid not null, indexed # # Indexes # +# index_university_organizations_on_language_id (language_id) +# index_university_organizations_on_original_id (original_id) # index_university_organizations_on_university_id (university_id) # # Foreign Keys # # fk_rails_35fcd198e0 (university_id => universities.id) +# fk_rails_3a9208fa29 (language_id => languages.id) +# fk_rails_5af11ea0cc (original_id => university_organizations.id) # class University::Organization < ApplicationRecord include AsIndirectObject @@ -49,6 +55,7 @@ class University::Organization < ApplicationRecord include WithGitFiles include WithPermalink include WithSlug + include WithTranslations include WithUniversity attr_accessor :created_from_extranet @@ -67,7 +74,7 @@ class University::Organization < ApplicationRecord has_one_attached_deletable :logo_on_dark_background validates_presence_of :name - validates_uniqueness_of :name, scope: :university_id + validates_uniqueness_of :name, scope: [:university_id, :language_id] validates :logo, size: { less_than: 1.megabytes } validates :logo_on_dark_background, size: { less_than: 1.megabytes } # Organization can be created from extranet with only their name. Be careful for future validators. diff --git a/app/services/filters/admin/university/alumni.rb b/app/services/filters/admin/university/alumni.rb index fec367846af24ff838282d58eb38449375bee766..17f2ed3fe355717d2bc719d8d53db89a36cfd198 100644 --- a/app/services/filters/admin/university/alumni.rb +++ b/app/services/filters/admin/university/alumni.rb @@ -3,7 +3,7 @@ module Filters def initialize(user) super add :for_alumni_organization, - user.university.organizations.ordered, + user.university.organizations.for_language_id(current_university.default_language_id).ordered, I18n.t( 'filters.attributes.element', element: University::Organization.model_name.human.downcase diff --git a/app/services/importers/hash_to_experience.rb b/app/services/importers/hash_to_experience.rb index 8f6e88ffb21358bf44118b21b202df29b990deea..6c3604a921f2e2aeb6ee5fe88df21ba6a65d0a79 100644 --- a/app/services/importers/hash_to_experience.rb +++ b/app/services/importers/hash_to_experience.rb @@ -51,19 +51,23 @@ module Importers # Search by SIREN+NIC, then SIREN, then name, or create it with everything if @company_siren.present? && @company_nic.present? obj = @university.organizations - .find_by siren: @company_siren, - nic: @company_nic + .for_language_id(current_university.default_language_id) + .find_by siren: @company_siren, + nic: @company_nic elsif @company_siren.present? obj = @university.organizations - .find_by siren: @company_siren + .for_language_id(current_university.default_language_id) + .find_by siren: @company_siren end obj ||= @university.organizations - .find_by name: @company_name + .for_language_id(current_university.default_language_id) + .find_by name: @company_name obj ||= @university.organizations - .where( name: @company_name, - siren: @company_siren, - nic: @company_nic) - .first_or_create + .for_language_id(current_university.default_language_id) + .where( name: @company_name, + siren: @company_siren, + nic: @company_nic) + .first_or_create obj end end diff --git a/app/views/admin/communication/blocks/components/organization/_edit.html.erb b/app/views/admin/communication/blocks/components/organization/_edit.html.erb index 48fb8775666bb52de24429db995dcbdfaeca9622..3d2a0a7e238311d692eed91fda2d36f8970ff960 100644 --- a/app/views/admin/communication/blocks/components/organization/_edit.html.erb +++ b/app/views/admin/communication/blocks/components/organization/_edit.html.erb @@ -1,5 +1,6 @@ -<%# TODO: Traduire les organisations %> -<% organizations = current_university.organizations.ordered %> +<% organizations = current_university.organizations + .for_language(block.language) + .ordered %> <% unless label.blank? %> <label class="form-label" :for="<%= dom_id.html_safe %>"> diff --git a/app/views/admin/communication/extranets/contacts/index.html.erb b/app/views/admin/communication/extranets/contacts/index.html.erb index 1d5c9c26f4d727027b62ff8b71e19afffaa0edaf..617da5e7977866a223e2f2fe142d95b5cc451b7f 100644 --- a/app/views/admin/communication/extranets/contacts/index.html.erb +++ b/app/views/admin/communication/extranets/contacts/index.html.erb @@ -2,7 +2,7 @@ <%= render 'admin/communication/extranets/sidebar' do %> <% action = link_to t('export'), - admin_communication_extranet_contacts_path(extranet_id: @extranet.id, export: 'people', format: :xlsx), + export_people_admin_communication_extranet_contacts_path(extranet_id: @extranet.id, format: :xlsx), class: button_classes('ms-1') if can?(:show, University::Person) %> <%= osuny_panel University::Person.model_name.human(count: 2), action: action do %> <div class="table-responsive"> @@ -21,7 +21,7 @@ <%= paginate @people, theme: 'bootstrap-5', param_name: :persons_page %> <% end %> <% action = link_to t('export'), - admin_communication_extranet_contacts_path(extranet_id: @extranet.id, export: 'organizations', format: :xlsx), + export_organizations_admin_communication_extranet_contacts_path(extranet_id: @extranet.id, format: :xlsx), class: button_classes('ms-1') if can?(:show, University::Person) %> <%= osuny_panel University::Organization.model_name.human(count: 2), action: action do %> <div class="table-responsive"> diff --git a/app/views/admin/university/organizations/show.html.erb b/app/views/admin/university/organizations/show.html.erb index 3b96834afb1074cbb29af9fa55d6f9909ad41bad..032e2489d340bdc6c98cec97da2fb16e89655082 100644 --- a/app/views/admin/university/organizations/show.html.erb +++ b/app/views/admin/university/organizations/show.html.erb @@ -18,20 +18,26 @@ ].each do |property| %> <% value = @organization.send property %> <% next if value.blank? %> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name(property) %> - <p><%= value %></p> + </div> + <div class="col-md-8"> + <p><%= value %></p> </div> <% end %> <% if @organization.country.present? %> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('country') %> + </div> + <div class="col-md-8"> <p><%= @organization.country_name %></p> </div> <% end %> <% if @organization.geolocated? %> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('geolocation') %> + </div> + <div class="col-md-8"> <p><%= @organization.geo_point.to_s %></p> </div> <% end %> @@ -40,9 +46,11 @@ <%= osuny_panel University::Organization.human_attribute_name('digital') do %> <div class="row pure__row--small"> <% unless @organization.url.blank? %> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('url') %> - <p><%= link_to @organization.url, + </div> + <div class="col-md-8"> + <p><%= link_to @organization.url, @organization.url, target: :_blank %></p> </div> @@ -56,8 +64,10 @@ ].each do |property| %> <% value = @organization.send property %> <% next if value.blank? %> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name(property) %> + </div> + <div class="col-md-8"> <p><%= value %></p> </div> <% end %> @@ -66,21 +76,29 @@ <%= osuny_panel University::Organization.human_attribute_name('legal') do %> <div class="row pure__row--small"> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('long_name') %> + </div> + <div class="col-md-8"> <p><%= @organization.long_name %></p> </div> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('kind') %> + </div> + <div class="col-md-8"> <p><%= @organization.kind_i18n %></p> </div> - <div class="col-xxl-6"> + <div class="col-md-4"> <%= osuny_label University::Organization.human_attribute_name('siren') %> + </div> + <div class="col-md-8"> <p><%= @organization.siren %></p> </div> </div> <% end %> + <%= osuny_separator %> + <%= render 'admin/communication/blocks/content/editor', about: @organization %> </div> @@ -92,6 +110,8 @@ <p><%= t @organization.active %></> <% end %> + <%= render 'admin/application/i18n/widget', about: @organization %> + <% if @organization.categories.any? %> <%= osuny_panel University::Organization.human_attribute_name('categories') do %> <ul class="list-unstyled"> diff --git a/app/views/admin/university/people/experiences/_experience_fields.html.erb b/app/views/admin/university/people/experiences/_experience_fields.html.erb index 820d47b06518502b08d69d3a148047b6e9d24450..2b05b2c361f0862379a9991bfc3e864ec01f4adb 100644 --- a/app/views/admin/university/people/experiences/_experience_fields.html.erb +++ b/app/views/admin/university/people/experiences/_experience_fields.html.erb @@ -10,7 +10,9 @@ hint = can?(:create, University::Organization) ? t('university.person.experienc <div class="row flex-fill"> <div class="col-md-6 col-xxl-4"> <%= f.association :organization, - collection: current_university.organizations.ordered, + collection: current_university.organizations + .for_language_id(current_university.default_language_id) + .ordered, include_blank: t('simple_form.include_blanks.defaults.organization'), hint: hint, required: true, diff --git a/config/routes/admin/communication.rb b/config/routes/admin/communication.rb index ef9c971ee0782a96ca3a25fbc54c56219323670f..f448c4dba79c173400f385e5270ce74463ee9344 100644 --- a/config/routes/admin/communication.rb +++ b/config/routes/admin/communication.rb @@ -81,6 +81,8 @@ namespace :communication do resources :alumni, only: :index, controller: 'extranets/alumni' resources :contacts, only: :index, controller: 'extranets/contacts' do collection do + get :export_people + get :export_organizations post :toggle post :connect post :disconnect diff --git a/config/routes/admin/university.rb b/config/routes/admin/university.rb index af658daef3fa0fbf537f1098cc0c5bc593d12dc2..10d8c533ac62025ac1d2e7a9e773f3a78ca7b09a 100644 --- a/config/routes/admin/university.rb +++ b/config/routes/admin/university.rb @@ -38,6 +38,7 @@ namespace :university do end member do get :static + get "/translations/:lang" => "organizations#in_language", as: :show_in_language end end root to: 'dashboard#index' diff --git a/db/migrate/20230705103400_addi18n_infos_to_university_organizations.rb b/db/migrate/20230705103400_addi18n_infos_to_university_organizations.rb new file mode 100644 index 0000000000000000000000000000000000000000..7e0d5a56596b80da32fa7666ceac7120698d45b9 --- /dev/null +++ b/db/migrate/20230705103400_addi18n_infos_to_university_organizations.rb @@ -0,0 +1,16 @@ +class Addi18nInfosToUniversityOrganizations < ActiveRecord::Migration[7.0] + def up + add_reference :university_organizations, :language, foreign_key: true, type: :uuid + add_reference :university_organizations, :original, foreign_key: {to_table: :university_organizations}, type: :uuid + + University::Organization.reset_column_information + University.all.find_each do |university| + university.organizations.update_all(language_id: university.default_language_id) + end + end + + def down + remove_reference :university_organizations, :language + remove_reference :university_organizations, :original + end +end diff --git a/db/schema.rb b/db/schema.rb index 414774df67b0f0196dee61b711ca319bea66ac28..fa52bb2e18d59a435196d29a5ff37709181ce345 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[7.0].define(version: 2023_07_05_073214) do +ActiveRecord::Schema[7.0].define(version: 2023_07_05_103400) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -944,6 +944,10 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_05_073214) do t.float "longitude" t.string "address_name" t.string "address_additional" + t.uuid "language_id" + t.uuid "original_id" + t.index ["language_id"], name: "index_university_organizations_on_language_id" + t.index ["original_id"], name: "index_university_organizations_on_original_id" t.index ["university_id"], name: "index_university_organizations_on_university_id" end @@ -1211,7 +1215,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_05_073214) do add_foreign_key "research_theses", "university_people", column: "director_id" add_foreign_key "universities", "languages", column: "default_language_id" add_foreign_key "university_organization_categories", "universities" + add_foreign_key "university_organizations", "languages" add_foreign_key "university_organizations", "universities" + add_foreign_key "university_organizations", "university_organizations", column: "original_id" add_foreign_key "university_organizations_categories", "university_organization_categories", column: "category_id" add_foreign_key "university_organizations_categories", "university_organizations", column: "organization_id" add_foreign_key "university_people", "languages" diff --git a/test/fixtures/university/organizations.yml b/test/fixtures/university/organizations.yml index cb758b3b35c137658843d246d4e05f1fd96d1806..9ee9c42200536c94ee4821c0c97d6d651802f99c 100644 --- a/test/fixtures/university/organizations.yml +++ b/test/fixtures/university/organizations.yml @@ -29,23 +29,31 @@ # zipcode :string # created_at :datetime not null # updated_at :datetime not null +# language_id :uuid indexed +# original_id :uuid indexed # university_id :uuid not null, indexed # # Indexes # +# index_university_organizations_on_language_id (language_id) +# index_university_organizations_on_original_id (original_id) # index_university_organizations_on_university_id (university_id) # # Foreign Keys # # fk_rails_35fcd198e0 (university_id => universities.id) +# fk_rails_3a9208fa29 (language_id => languages.id) +# fk_rails_5af11ea0cc (original_id => university_organizations.id) # default_organization: name: Organisation de test active: true university: default_university + language: fr noesya: name: noesya active: true university: default_university + language: fr diff --git a/test/models/university/organization_test.rb b/test/models/university/organization_test.rb index b358e842fff8fafabf0dc9309c869d602b8870b8..c3facdee2cc5023375bf0e3414dd6324ce9be09b 100644 --- a/test/models/university/organization_test.rb +++ b/test/models/university/organization_test.rb @@ -29,15 +29,21 @@ # zipcode :string # created_at :datetime not null # updated_at :datetime not null +# language_id :uuid indexed +# original_id :uuid indexed # university_id :uuid not null, indexed # # Indexes # +# index_university_organizations_on_language_id (language_id) +# index_university_organizations_on_original_id (original_id) # index_university_organizations_on_university_id (university_id) # # Foreign Keys # # fk_rails_35fcd198e0 (university_id => universities.id) +# fk_rails_3a9208fa29 (language_id => languages.id) +# fk_rails_5af11ea0cc (original_id => university_organizations.id) # require "test_helper"