diff --git a/Gemfile b/Gemfile index c28ecb2d6d2ddb82c8cbd78e90e2c59f24607352..a1eae116bce4500a9144a9e65503c69cb76cdff1 100644 --- a/Gemfile +++ b/Gemfile @@ -23,10 +23,10 @@ gem "delayed_job_web" gem "devise" gem "devise-i18n" gem "enum_help" -gem "faceted_search"#, path: "../../noesya/faceted_search" +# gem "faceted_search"#, path: "../../noesya/faceted_search" +gem "faceted_search" gem "font-awesome-sass" gem "front_matter_parser" -gem "gdpr", "~> 1.2.5" gem "geocoder", "~> 1.8" gem "geo_point" gem "gitlab" diff --git a/Gemfile.lock b/Gemfile.lock index 10a3a71f782a71c32c4a4705020b5f6f6c7a6408..a93bf9338577c783ee930fcacd32ed6240440ff5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,7 +93,7 @@ GEM i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.1) + addressable (2.8.3) public_suffix (>= 2.0.2, < 6.0) angularjs-rails (1.8.0) annotate (3.2.0) @@ -102,8 +102,8 @@ GEM autoprefixer-rails (10.4.13.0) execjs (~> 2) aws-eventstream (1.2.0) - aws-partitions (1.726.0) - aws-sdk-core (3.170.0) + aws-partitions (1.742.0) + aws-sdk-core (3.171.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.5) @@ -111,7 +111,7 @@ GEM aws-sdk-kms (1.63.0) aws-sdk-core (~> 3, >= 3.165.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.119.1) + aws-sdk-s3 (1.120.1) aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) @@ -135,7 +135,7 @@ GEM builder (3.2.4) byebug (11.1.3) cancancan (3.3.0) - capybara (3.38.0) + capybara (3.39.0) addressable matrix mini_mime (>= 0.1.3) @@ -154,7 +154,7 @@ GEM caxlsx (>= 3.0) cocoon (1.2.15) concurrent-ruby (1.2.2) - countries (5.3.1) + countries (5.3.2) unaccent (~> 0.3) country_select (8.0.1) countries (~> 5.0) @@ -176,7 +176,7 @@ GEM delayed_job (> 2.0.3) rack-protection (>= 1.5.5) sinatra (>= 1.4.4) - devise (4.9.0) + devise (4.9.2) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -194,7 +194,7 @@ GEM ethon (0.16.0) ffi (>= 1.15.0) execjs (2.8.1) - faceted_search (3.6.1) + faceted_search (3.6.2) font-awesome-sass rails (>= 5.2.0) faraday (2.7.4) @@ -221,13 +221,9 @@ GEM ffi (1.15.5) figaro (1.2.0) thor (>= 0.14.0, < 2) - font-awesome-sass (6.3.0) + font-awesome-sass (6.4.0) sassc (~> 2.0) front_matter_parser (1.0.1) - gdpr (1.2.5) - js_cookie_rails - rails - sassc-rails geo_calc (0.7.8) activesupport (>= 3.0.1) geo_units (~> 0.3.2) @@ -279,8 +275,6 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (6.0.1) railties (>= 3.2.16) - js_cookie_rails (2.2.0) - railties (>= 3.1) json (2.6.3) jwt (2.7.0) kamifusen (1.11.2) @@ -303,7 +297,7 @@ GEM listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.19.1) + loofah (2.20.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.8.1) @@ -329,7 +323,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.2) minitest (5.18.0) - msgpack (1.6.1) + msgpack (1.7.0) multi_xml (0.6.0) multipart-post (2.3.0) mustermann (3.0.0) @@ -346,7 +340,7 @@ GEM timeout net-smtp (0.3.3) net-protocol - nio4r (2.5.8) + nio4r (2.5.9) nokogiri (1.14.2-arm64-darwin) racc (~> 1.4) nokogiri (1.14.2-x86_64-darwin) @@ -383,7 +377,7 @@ GEM pg (1.4.6) popper_js (2.11.6) public_suffix (5.0.1) - puma (6.1.1) + puma (6.2.1) nio4r (~> 2.0) racc (1.6.2) rack (2.2.6.4) @@ -391,7 +385,7 @@ GEM rack (>= 1.2.0) rack-protection (3.0.5) rack - rack-test (2.0.2) + rack-test (2.1.0) rack (>= 1.3) rails (7.0.4.3) actioncable (= 7.0.4.3) @@ -461,7 +455,7 @@ GEM sawyer (0.9.2) addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) - selenium-webdriver (4.8.1) + selenium-webdriver (4.8.6) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) @@ -511,7 +505,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) thor (1.2.1) tilt (2.1.0) - time (0.2.1) + time (0.2.2) date timeout (0.3.2) typhoeus (1.4.0) @@ -527,9 +521,9 @@ GEM faraday-multipart (~> 1.0.4) httparty (~> 0.20) oauth2 (>= 2.0.8) - uri (0.12.0) + uri (0.12.1) vcr (6.1.0) - version_gem (1.1.1) + version_gem (1.1.2) warden (1.2.9) rack (>= 2.0.9) web-console (4.2.0) @@ -588,7 +582,6 @@ DEPENDENCIES figaro font-awesome-sass front_matter_parser - gdpr (~> 1.2.5) geo_point geocoder (~> 1.8) gitlab diff --git a/app/assets/javascripts/admin/appstack.js b/app/assets/javascripts/admin/appstack.js index 288469caaf16052c44adc410d92efad1a25c718e..b31c6e41d67e537bdcd274d4908f55cedcd19f17 100644 --- a/app/assets/javascripts/admin/appstack.js +++ b/app/assets/javascripts/admin/appstack.js @@ -7,7 +7,6 @@ //= require cropperjs/dist/cropper //= require jquery-cropper/dist/jquery-cropper //= require appstack/app -//= require gdpr/cookie_consent //= require sortablejs/Sortable //= require summernote/summernote-bs5 //= require slug/slug diff --git a/app/assets/javascripts/admin/plugins/codemirror.js b/app/assets/javascripts/admin/plugins/codemirror.js index 553e9afd748b24c9bf3dee73f9bd49c39d0b5d11..d5c5157e220cb3de930bef7fa961de2e3e9e65f8 100644 --- a/app/assets/javascripts/admin/plugins/codemirror.js +++ b/app/assets/javascripts/admin/plugins/codemirror.js @@ -22,27 +22,34 @@ window.codemirrorManager = { createInstance: function (textarea) { 'use strict'; - var mode = textarea.getAttribute('data-codemirror-mode'), + var config = this.defaultConfig(), + mode = textarea.getAttribute('data-codemirror-mode'), indentationLevel = window.parseInt(textarea.getAttribute('data-codemirror-indentation')); if (isNaN(indentationLevel)) { indentationLevel = 2; } + config['mode'] = mode; + config['indentUnit'] = indentationLevel; + return CodeMirror.fromTextArea(textarea, config); + }, - return CodeMirror.fromTextArea(textarea, { + defaultConfig: function () { + return { lineNumbers: true, matchBrackets: true, styleActiveLine: true, - indentUnit: indentationLevel, - viewportMargin: Infinity, - mode: mode - }); + indentUnit: 2, + lineWrapping: true, + viewportMargin: Infinity + } }, invoke: function () { 'use strict'; return { - init: this.init.bind(this) + init: this.init.bind(this), + defaultConfig: this.defaultConfig.bind(this) }; } }.invoke(); diff --git a/app/assets/javascripts/admin/plugins/sortable.js b/app/assets/javascripts/admin/plugins/sortable.js index ab073755a18f930db9ac6dc3c088b4a04ee10e64..13bd1be56b1f5ae2ba3ed5a47071bbac52906319 100644 --- a/app/assets/javascripts/admin/plugins/sortable.js +++ b/app/assets/javascripts/admin/plugins/sortable.js @@ -28,6 +28,7 @@ window.sortableManager = { animation: 150, fallbackOnBody: true, swapThreshold: 0.65, + forceFallback: true, onEnd: sortableType === 'inputs' ? this.updateViaInputs : this.updateViaXhr }); }, diff --git a/app/assets/javascripts/admin/pure.js b/app/assets/javascripts/admin/pure.js index 94017fb5f5845850521b0e158949325b6794e6f7..7446ed6e6b6deb58b3f342be5815f0c0e4422390 100644 --- a/app/assets/javascripts/admin/pure.js +++ b/app/assets/javascripts/admin/pure.js @@ -8,7 +8,6 @@ //= require jquery-cropper/dist/jquery-cropper // TODO remove appstack js //= require appstack/app -//= require gdpr/cookie_consent //= require sortablejs/Sortable //= require summernote/summernote-bs5 //= require slug/slug diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 19545a0bccd3fa9908e5b35280ed224190b74b3e..e8a0f2e802bc126febf0934d16a09fd55818ac04 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -8,7 +8,6 @@ //= require simple_form_password_with_hints //= require simple_form_bs5_file_input //= require summernote/summernote-bs5 -//= require gdpr/cookie_consent //= require autocomplete-rails //= require_tree ./application/plugins //= require_self diff --git a/app/assets/javascripts/devise.js b/app/assets/javascripts/devise.js index 26efc2d665f4a7e902f56e9075c6baec61b83df2..87f4ad18ee3ead168bb2e72b76cfb736557c7246 100644 --- a/app/assets/javascripts/devise.js +++ b/app/assets/javascripts/devise.js @@ -8,7 +8,6 @@ //= require simple_form_bs5_file_input //= require cropperjs/dist/cropper //= require jquery-cropper/dist/jquery-cropper -//= require gdpr/cookie_consent //= require_self //= require_tree ./admin/plugins diff --git a/app/assets/javascripts/extranet.js b/app/assets/javascripts/extranet.js index acfd1811ba7440b3a839c8868adee361bf550d1c..f82a3bacb14d7873d0bef0c38bd5f1f2832cafc4 100644 --- a/app/assets/javascripts/extranet.js +++ b/app/assets/javascripts/extranet.js @@ -10,7 +10,6 @@ //= require simple_form_password_with_hints //= require simple_form_bs5_file_input //= require summernote/summernote-bs5 -//= require gdpr/cookie_consent //= require autocomplete-rails //= require_tree ./application/plugins //= require_tree ./extranet diff --git a/app/assets/stylesheets/admin/appstack.sass b/app/assets/stylesheets/admin/appstack.sass index 3413526ba440914d25ccfa8aea3f2e44d45ddf3e..d2a849435d0051d3cd1b00934fd699d71e0f826d 100644 --- a/app/assets/stylesheets/admin/appstack.sass +++ b/app/assets/stylesheets/admin/appstack.sass @@ -6,7 +6,6 @@ @import 'simple_form_bs5_file_input' @import 'summernote-bs5' @import 'cropperjs/dist/cropper' -@import 'gdpr/cookie_consent' @import 'codemirror/lib/codemirror' @import '../commons/*' @import 'commons/*' diff --git a/app/assets/stylesheets/admin/pure.sass b/app/assets/stylesheets/admin/pure.sass index 3a2248c6d08bd76b573ece1fce347666a5d0c63a..b3638de514982db5fb02d87543400830c493721b 100644 --- a/app/assets/stylesheets/admin/pure.sass +++ b/app/assets/stylesheets/admin/pure.sass @@ -1,6 +1,7 @@ @import 'pure/utils' @import 'pure/fonts' @import 'pure/variables' +@import 'pure/grid' @import 'bootstrap' @import 'bootstrap-icons/font/bootstrap-icons' @import 'font-awesome' @@ -9,7 +10,6 @@ @import 'simple_form_bs5_file_input' @import 'summernote-bs5' @import 'cropperjs/dist/cropper' -@import 'gdpr/cookie_consent' @import 'codemirror/lib/codemirror' @import '../commons/*' @import 'commons/*' diff --git a/app/assets/stylesheets/admin/pure/grid.sass b/app/assets/stylesheets/admin/pure/grid.sass new file mode 100644 index 0000000000000000000000000000000000000000..ffdb47b85b9d4a40d07889a70e80e9d6f0ad4053 --- /dev/null +++ b/app/assets/stylesheets/admin/pure/grid.sass @@ -0,0 +1,4 @@ +* + --bs-gutter-x: 64px !important + @media (max-width: 768px) + --bs-gutter-x: 32px !important diff --git a/app/assets/stylesheets/admin/pure/variables.sass b/app/assets/stylesheets/admin/pure/variables.sass index bcd959e9ea98b566114aeabdef909d7929e94cca..1e3305457cad1f4d0d149afba451c0a6c4c7e375 100644 --- a/app/assets/stylesheets/admin/pure/variables.sass +++ b/app/assets/stylesheets/admin/pure/variables.sass @@ -26,8 +26,6 @@ $color-background-alt: #F5F5F5 $font-family-sans-serif: "Basier Square", sans-serif -$grid-gutter-width: 64px - $border-radius: 2px $border-radius-sm: $border-radius $border-radius-lg: $border-radius diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass index cbdad2dd5161fd3e130203aabb7e325e41f39451..407658cd3780ab5ca9bb1ff60e3db4f77441fd70 100644 --- a/app/assets/stylesheets/application.sass +++ b/app/assets/stylesheets/application.sass @@ -3,7 +3,6 @@ @import 'simple_form_password_with_hints' @import 'simple_form_bs5_file_input' @import 'cropperjs/dist/cropper' -@import 'gdpr/cookie_consent' @import 'faceted_search' @import 'commons/*' @import 'application/*' diff --git a/app/assets/stylesheets/extranet.sass b/app/assets/stylesheets/extranet.sass index 7beab43bb867d71afd0fe6afdbf4e304fc0976d3..de4182540a5c480f4ce792507521b2e02d6ebb41 100644 --- a/app/assets/stylesheets/extranet.sass +++ b/app/assets/stylesheets/extranet.sass @@ -6,7 +6,6 @@ @import 'simple_form_password_with_hints' @import 'simple_form_bs5_file_input' @import 'summernote-bs5' -@import 'gdpr/cookie_consent' @import 'cropperjs/dist/cropper' @import 'commons/summernote' @import 'commons/bootstrap-icons' diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb index c61a843e58791e9a9ef8d7a41d369eb5a5ead517..44877c2ca6c1bad74748e8d284e6308881751e23 100644 --- a/app/controllers/admin/application_controller.rb +++ b/app/controllers/admin/application_controller.rb @@ -1,7 +1,6 @@ class Admin::ApplicationController < ApplicationController layout 'admin/layouts/application' - include WithFeatures include Admin::Filterable def set_theme diff --git a/app/controllers/admin/communication/websites_controller.rb b/app/controllers/admin/communication/websites_controller.rb index d83628439f6b2d87ab09005347ef20cd8f185d65..5cb335ea0cc3ab1eba7974c7b9048584868525c6 100644 --- a/app/controllers/admin/communication/websites_controller.rb +++ b/app/controllers/admin/communication/websites_controller.rb @@ -5,7 +5,6 @@ class Admin::Communication::WebsitesController < Admin::Communication::Websites: def index @websites = apply_scopes(@websites).ordered.page(params[:page]) breadcrumb - add_breadcrumb Communication::Website.model_name.human(count: 2), admin_communication_websites_path end def show diff --git a/app/controllers/admin/research/journals/papers_controller.rb b/app/controllers/admin/research/journals/papers_controller.rb index 614f191a858dbb39778c5727dbb35a83ea1c4a78..4aa72926b27d94e6a251cfe42df09d4f3ffffc15 100644 --- a/app/controllers/admin/research/journals/papers_controller.rb +++ b/app/controllers/admin/research/journals/papers_controller.rb @@ -62,6 +62,11 @@ class Admin::Research::Journals::PapersController < Admin::Research::Journals::A private + # For Admin::Reorderable + def model + Research::Journal::Paper + end + def breadcrumb super add_breadcrumb Research::Journal::Paper.model_name.human(count: 2), admin_research_journal_papers_path @@ -72,7 +77,7 @@ class Admin::Research::Journals::PapersController < Admin::Research::Journals::A params.require(:research_journal_paper) .permit( :title, :slug, :text, :published, :published_at, :received_at, :accepted_at, - :summary, :abstract, :meta_description, :doi, + :summary, :abstract, :meta_description, :doi, :authors_list, :pdf, :references, :keywords, :research_journal_volume_id, :kind_id, person_ids: []) .merge(university_id: current_university.id) end diff --git a/app/controllers/admin/research/laboratories/application_controller.rb b/app/controllers/admin/research/laboratories/application_controller.rb index 343066b58ef9d47431ee5b74d56f9ceadc4e72fc..aa0479df79491d827528b39509d796fa34973553 100644 --- a/app/controllers/admin/research/laboratories/application_controller.rb +++ b/app/controllers/admin/research/laboratories/application_controller.rb @@ -6,6 +6,12 @@ class Admin::Research::Laboratories::ApplicationController < Admin::Research::Ap protected + def breadcrumb + super + add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path + add_breadcrumb @laboratory, [:admin, @laboratory] + end + def default_url_options return {} unless params.has_key? :laboratory_id { diff --git a/app/controllers/admin/research/laboratories_controller.rb b/app/controllers/admin/research/laboratories_controller.rb index 67621fc6420f7fd87216cd0a495d96df3c19f599..596d5ffee012358992dfa2558b2c3a8757645871 100644 --- a/app/controllers/admin/research/laboratories_controller.rb +++ b/app/controllers/admin/research/laboratories_controller.rb @@ -8,7 +8,6 @@ class Admin::Research::LaboratoriesController < Admin::Research::ApplicationCont def index @laboratories = apply_scopes(@laboratories).ordered.page(params[:page]) breadcrumb - add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path end def show @@ -51,6 +50,12 @@ class Admin::Research::LaboratoriesController < Admin::Research::ApplicationCont protected + def breadcrumb + super + add_breadcrumb Research::Laboratory.model_name.human(count: 2), admin_research_laboratories_path + breadcrumb_for @laboratory + end + def laboratory_params params.require(:research_laboratory) .permit(:name, :address, :zipcode, :city, :country) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2cafc0d28ff964e5ff23c672f4c9e60071a444c1..9a81171e5b9f3674e0d413d62d52893cb5cd4304 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,8 @@ class ApplicationController < ActionController::Base + include WithDomain include WithErrors + include WithFeatures include WithLocale - include WithDomain before_action :ensure_university, :authenticate_user! diff --git a/app/controllers/admin/application_controller/with_features.rb b/app/controllers/application_controller/with_features.rb similarity index 94% rename from app/controllers/admin/application_controller/with_features.rb rename to app/controllers/application_controller/with_features.rb index 8ba479e4723be421901213aa23d6901b86fbf5bd..76993e34ad0e6549bfd1b77eb2673d3ebfee4ac6 100644 --- a/app/controllers/admin/application_controller/with_features.rb +++ b/app/controllers/application_controller/with_features.rb @@ -1,4 +1,4 @@ -module Admin::ApplicationController::WithFeatures +module ApplicationController::WithFeatures extend ActiveSupport::Concern included do diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb index a18cea80675c5043b2ab837d9314e0c19aeb753c..e1af31ce1eea741ddf330d6fa08343fce50337eb 100644 --- a/app/models/communication/block.rb +++ b/app/models/communication/block.rb @@ -12,16 +12,19 @@ # created_at :datetime not null # updated_at :datetime not null # about_id :uuid indexed => [about_type] +# heading_id :uuid indexed # university_id :uuid not null, indexed # # Indexes # +# index_communication_blocks_on_heading_id (heading_id) # index_communication_blocks_on_university_id (university_id) # index_communication_website_blocks_on_about (about_type,about_id) # # Foreign Keys # # fk_rails_18291ef65f (university_id => universities.id) +# fk_rails_90ac986fab (heading_id => communication_block_headings.id) # class Communication::Block < ApplicationRecord include Accessible diff --git a/app/models/communication/extranet/document/category.rb b/app/models/communication/extranet/document/category.rb index 91f8d0214a7c43a1855d10d939a118d9cb68f77a..5c56538726df9c72493be52bf0cd553a20264d54 100644 --- a/app/models/communication/extranet/document/category.rb +++ b/app/models/communication/extranet/document/category.rb @@ -26,7 +26,8 @@ class Communication::Extranet::Document::Category < ApplicationRecord belongs_to :extranet, class_name: 'Communication::Extranet' - has_many :documents + has_many :communication_extranet_documents, class_name: "Communication::Extranet::Document" + alias_attribute :documents, :communication_extranet_documents validates :name, presence: true diff --git a/app/models/communication/extranet/document/kind.rb b/app/models/communication/extranet/document/kind.rb index 7f3afa35591e32ab62a3f2e4c046eac1e3a8aa71..c5fa1d03b3245e90d062ee407d2c7add322790aa 100644 --- a/app/models/communication/extranet/document/kind.rb +++ b/app/models/communication/extranet/document/kind.rb @@ -26,7 +26,8 @@ class Communication::Extranet::Document::Kind < ApplicationRecord belongs_to :extranet, class_name: 'Communication::Extranet' - has_many :documents + has_many :communication_extranet_documents, class_name: "Communication::Extranet::Document" + alias_attribute :documents, :communication_extranet_documents validates :name, presence: true diff --git a/app/models/research/journal/paper.rb b/app/models/research/journal/paper.rb index 94aa3ad37a2ec379a4c5dad0b98511577eeea2ed..8de2e27f965e3562a2eafcf7dd32ad2adc367122 100644 --- a/app/models/research/journal/paper.rb +++ b/app/models/research/journal/paper.rb @@ -5,6 +5,7 @@ # id :uuid not null, primary key # abstract :text # accepted_at :date +# authors_list :text # doi :string # keywords :text # meta_description :text @@ -68,7 +69,7 @@ class Research::Journal::Paper < ApplicationRecord validates :title, presence: true - scope :ordered, -> { order(published_at: :desc, created_at: :desc) } + scope :ordered, -> { order(:position, published_at: :desc, created_at: :desc) } def for_website?(website) journal == website.about diff --git a/app/services/osuny/simple_navigation_renderer.rb b/app/services/osuny/simple_navigation_renderer.rb index b6857b68e21279677696b68b500714ad00d18d76..b1dcd9275ac3f0fdfcef8fad3ed1c1a3092b0e34 100644 --- a/app/services/osuny/simple_navigation_renderer.rb +++ b/app/services/osuny/simple_navigation_renderer.rb @@ -1,5 +1,5 @@ class Osuny::SimpleNavigationRenderer < SimpleNavigation::Renderer::Base - OPEN = "<div class=\"col-md-4 col-lg-3 mb-5\">" + OPEN = "<div class=\"col-sm-6 col-md-4 col-lg-3 mb-5\">" CLOSE = "</div>" attr_accessor :content, :index, :item diff --git a/app/views/admin/communication/blocks/edit.html.erb b/app/views/admin/communication/blocks/edit.html.erb index ef3bdd551b48abed3a1b9777a873eb1824610619..e0f924d33a0146637d75a04189a3613cacc8876f 100644 --- a/app/views/admin/communication/blocks/edit.html.erb +++ b/app/views/admin/communication/blocks/edit.html.erb @@ -121,6 +121,7 @@ toolbar: window.SUMMERNOTE_CONFIGS[config].toolbar, // Dependent of app/assets/javascripts/admin/plugins/summernote.js followingToolbar: true, disableDragAndDrop: true, + codemirror: window.codemirrorManager.defaultConfig(), callbacks: { onChange: function(contents, $editable) { element.value = contents; @@ -130,13 +131,11 @@ }); }, initCodemirror(element) { - var editor = CodeMirror.fromTextArea(element, { - lineNumbers: true, - styleActiveLine: true, - indentUnit: 2, - viewportMargin: Infinity, - mode: element.getAttribute('data-codemirror-mode') - }); + var config = window.codemirrorManager.defaultConfig(), + mode = element.getAttribute('data-codemirror-mode'), + editor; + config['mode'] = mode; + editor = CodeMirror.fromTextArea(element, config); editor.on("change", function (instance, changeObj) { element.value = instance.getValue(); element.dispatchEvent(new Event('input')); diff --git a/app/views/admin/dashboard/index.html.erb b/app/views/admin/dashboard/index.html.erb index 55aa138b2dcff0bdfdde3b336e4935d16527d6e0..80eba40611e439bd71505158b1944202b9adc468 100644 --- a/app/views/admin/dashboard/index.html.erb +++ b/app/views/admin/dashboard/index.html.erb @@ -101,7 +101,9 @@ <% if current_admin_theme == 'pure' %> <div class="row mt-5 pt-5"> <div class="col-lg-2"> - <%= image_tag "admin/university.jpg", class: 'img-fluid'%> + <%= link_to admin_university_root_path do %> + <%= image_tag "admin/university.jpg", class: 'img-fluid'%> + <% end %> </div> <div class="col-lg-4"> <%= osuny_panel University.model_name.human do %> @@ -141,9 +143,6 @@ <%= link_to t("#{term}"), t("#{term}_url"), target: '_blank', rel: 'noreferrer' %> </li> <% end %> - <li class="list-inline-item"> - <%= link_to t('cookies_consent_choice'), '', class: 'js-gdpr__cookie_consent__display_again' %> - </li> </ul> </div> <% end %> diff --git a/app/views/admin/dashboard/namespace.html.erb b/app/views/admin/dashboard/namespace.html.erb index 9521b0e0988dab33369764028a44af76a8c76faa..d3667f4a08fa35aaf2b8b29dba39679e8623cc02 100644 --- a/app/views/admin/dashboard/namespace.html.erb +++ b/app/views/admin/dashboard/namespace.html.erb @@ -12,10 +12,12 @@ class_name = part.first path = send part.last title = class_name.model_name.human(count: 2) - description = class_name.human_attribute_name('description') - # TODO - description = t 'administration.qualiopi.description' if class_name == Administration::Qualiopi - description = t 'activerecord.attributes.research/hal.description' if class_name == Research::Hal + # Exemples: + # administration.description.parts.qualiopi + # research.description.parts.researcher + # research.hal.description.parts.publication + key = "#{@namespace.to_s.underscore.gsub('/', '.')}.description.parts.#{class_name.to_s.demodulize.downcase}" + description = t "#{key}.description" %> <div class="col-lg-6 mt-5"> <%= osuny_panel title do %> @@ -30,8 +32,8 @@ <div class="offset-lg-1 col-lg-4"> <%= image_tag "admin/#{@namespace.to_s.underscore}.jpg", class: 'img-fluid pure__chapter__image'%> <p class="small text-lg-end mt-3"> - Illustration de Virginia Frances Sterrett. - Source : University of California Libraries, the Internet Archive. + Illustration de Virginia Frances Sterrett<br> + Source : University of California Libraries, the Internet Archive </p> </div> <% end %> diff --git a/app/views/admin/layouts/themes/_appstack.html.erb b/app/views/admin/layouts/themes/_appstack.html.erb index 331f7b38364abd8c6d9a9b7a46c14fb087a0b5b0..96264a0a66990ef247ed2d5b1fc2a8604521e200 100644 --- a/app/views/admin/layouts/themes/_appstack.html.erb +++ b/app/views/admin/layouts/themes/_appstack.html.erb @@ -27,7 +27,6 @@ </div> </div> <%= javascript_include_tag 'admin/appstack' %> - <%= render 'gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= render 'summernote_localization' %> </body> diff --git a/app/views/admin/layouts/themes/_pure.html.erb b/app/views/admin/layouts/themes/_pure.html.erb index 965029888465752746d75e9336121af843a8d2e2..b6e54cbba664e91fd9a116ee58858d6cf35de1f0 100644 --- a/app/views/admin/layouts/themes/_pure.html.erb +++ b/app/views/admin/layouts/themes/_pure.html.erb @@ -20,7 +20,6 @@ <%= render "admin/layouts/themes/pure/commands" %> <%= render "admin/layouts/themes/pure/footer" %> <%= javascript_include_tag 'admin/pure' %> - <%= render 'gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= render 'summernote_localization' %> </body> diff --git a/app/views/admin/layouts/themes/pure/_nav.html.erb b/app/views/admin/layouts/themes/pure/_nav.html.erb index 4e18def30d29207c87a930a3a8bddd84ffb88eac..5c34176bea861792e4764b0e404761586af15e82 100644 --- a/app/views/admin/layouts/themes/pure/_nav.html.erb +++ b/app/views/admin/layouts/themes/pure/_nav.html.erb @@ -42,7 +42,7 @@ context ||= :admin <div class="container-fluid"> <div class="row"> <%= render_navigation context: context, renderer: Osuny::SimpleNavigationRenderer %> - <div class="col-md-4 col-lg-3"> + <div class="col-sm-6 col-md-4 col-lg-3"> <% if current_user.picture.attached? && current_user.picture.variable? image = current_user.picture.variant(resize: '200x200') diff --git a/app/views/admin/research/journals/papers/_form.html.erb b/app/views/admin/research/journals/papers/_form.html.erb index 38964171148e7cbc473ad05352b31aa7181b5942..b3cd705d9edf20280240a5f00234c8fbfef3cd9c 100644 --- a/app/views/admin/research/journals/papers/_form.html.erb +++ b/app/views/admin/research/journals/papers/_form.html.erb @@ -6,6 +6,7 @@ <div class="col-md-8"> <%= osuny_panel t('content') do %> <%= f.input :title, as: :text, input_html: { rows: 3 } %> + <%= f.input :summary %> <%= f.input :abstract, as: :text, input_html: { rows: 8 } %> <%= f.input :pdf %> <%= f.input :doi %> @@ -41,6 +42,7 @@ .researchers .ordered, as: :check_boxes %> + <%= f.input :authors_list %> <%= f.association :kind, collection: @journal.kinds.ordered if @journal.kinds.any? %> <% end %> <%= render 'admin/application/meta_description/form', f: f, about: paper %> diff --git a/app/views/admin/research/journals/papers/_list.html.erb b/app/views/admin/research/journals/papers/_list.html.erb index aae767ac2b8b319769010821e6873a2f74786c99..2cfd0e29d761f738d376613ad0b33bc9526e6f6b 100644 --- a/app/views/admin/research/journals/papers/_list.html.erb +++ b/app/views/admin/research/journals/papers/_list.html.erb @@ -10,11 +10,10 @@ </thead> <tbody> <% papers.each do |paper| %> - <tr> + <tr class="<%= 'draft' unless paper.published? %>"> <td> <%= link_to paper, - admin_research_journal_paper_path(journal_id: paper.journal, id: paper), - class: "#{'draft' unless paper.published?}" %> + admin_research_journal_paper_path(journal_id: paper.journal, id: paper) %> </td> <td><%= link_to paper.volume, admin_research_journal_volume_path(paper.volume) if paper.volume %></td> <td><%= l(paper.published_at.to_time, format: :date_with_explicit_month) if paper.published_at.present? %></td> diff --git a/app/views/admin/research/journals/papers/show.html.erb b/app/views/admin/research/journals/papers/show.html.erb index 5718ef637b39b4cad79077e6c4ae1c8d0218bafd..9af4652babc147e2e8c8837b1bed4a3efa97c153 100644 --- a/app/views/admin/research/journals/papers/show.html.erb +++ b/app/views/admin/research/journals/papers/show.html.erb @@ -59,12 +59,16 @@ <% end %> <% if @paper.people.any? %> <%= osuny_label Research::Journal::Paper.human_attribute_name('people') %> - <ul class="list-unstyled mb-0"> + <ul class="list-unstyled"> <% @paper.people.each do |person| %> <li><%= link_to person, admin_research_researcher_path(person) %></li> <% end %> </ul> <% end %> + <% if @paper.authors_list.present? %> + <%= osuny_label Research::Journal::Paper.human_attribute_name('authors_list') %> + <p><%= @paper.authors_list %></p> + <% end %> <% end %> <%= render 'admin/application/meta_description/show', about: @paper %> </div> diff --git a/app/views/admin/research/journals/papers/static.html.erb b/app/views/admin/research/journals/papers/static.html.erb index 3177194e9bfb282ae92fa52a1f415024dde6c5c7..396ade972c97f3c506f255675234eb1eebfb2227 100644 --- a/app/views/admin/research/journals/papers/static.html.erb +++ b/app/views/admin/research/journals/papers/static.html.erb @@ -28,6 +28,8 @@ researchers: <% @about.people.each do |person| %> - "<%= person.slug %>" <% end %> +authors_list: > + <%= prepare_text_for_static @about.authors_list %> <%= render 'admin/application/meta_description/static' %> <%= render 'admin/application/summary/static' %> abstract: > diff --git a/app/views/admin/research/journals/volumes/show.html.erb b/app/views/admin/research/journals/volumes/show.html.erb index 540e195f935a3edd4eadafa857d899a20ee29554..f083f12cf6bcd80ee6f5431176b40a5b1b3ee0ec 100644 --- a/app/views/admin/research/journals/volumes/show.html.erb +++ b/app/views/admin/research/journals/volumes/show.html.erb @@ -21,7 +21,7 @@ </thead> <tbody data-sortable data-sort-url="<%= reorder_admin_research_journal_papers_path(journal_id: @journal.id) %>"> <% @papers.each do |paper| %> - <tr data-id="<%= paper.id %>"> + <tr data-id="<%= paper.id %>" class="<%= 'draft' unless paper.published? %>"> <% if can? :reorder, Research::Journal::Paper %> <td><i class="<%= Icon::DRAG %> handle"></i></td> <% end %> diff --git a/app/views/api/layouts/application.html.erb b/app/views/api/layouts/application.html.erb index 29a6ebea36ce213ade8cdce3702a2260918f7191..1053513aec3a9f60eb18b13556c008ad70ed8bce 100644 --- a/app/views/api/layouts/application.html.erb +++ b/app/views/api/layouts/application.html.erb @@ -23,7 +23,6 @@ <%= yield %> </main> <%= render 'footer' %> - <%= render 'gdpr/cookie_consent' %> <%= render 'bugsnag' %> </body> </html> diff --git a/app/views/application/_footer.html.erb b/app/views/application/_footer.html.erb index 530f5a966f9b8b3f19be1e545ee2823448ba94cd..abd05f1f855f16846bd4eefb57306e8110e027fc 100644 --- a/app/views/application/_footer.html.erb +++ b/app/views/application/_footer.html.erb @@ -1,27 +1,24 @@ -<footer class="pt-5"> - <div class="container text-center"> - <div class="mb-5"> +<footer class="mt-5 pt-5"> + <div class="container"> + <div class="mb-5 text-lg-center"> <%= image_tag 'osuny-black.svg', width: 80 %> </div> - <nav class="nav justify-content-center"> + <nav class="nav small d-block d-lg-flex justify-content-lg-center"> <%= link_to t('terms_of_service'), t('terms_of_service_url'), - class: 'nav-link', + class: 'nav-link ps-0', target: '_blank', rel: 'noreferrer' %> <%= link_to t('privacy_policy'), t('privacy_policy_url'), - class: 'nav-link', + class: 'nav-link ps-0', target: '_blank', rel: 'noreferrer' %> <%= link_to t('cookies_policy'), t('cookies_policy_url'), - class: 'nav-link', + class: 'nav-link ps-0', target: '_blank', rel: 'noreferrer' %> - <%= link_to t('cookies_consent_choice'), - '', - class: 'nav-link js-gdpr__cookie_consent__display_again' %> </nav> </div> </footer> diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index 08194d186dc16e87a888231f500e9a43dee4a33e..5bb6d917bb75447f5ad32f404aceade0130ceabe 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -4,7 +4,7 @@ <%= f.error_notification %> <div class="row"> - <div class="col-md-4"> + <div class="col-lg-6"> <%= f.input :email, required: true %> <%= f.input :first_name, required: true, @@ -13,15 +13,12 @@ <%= f.input :last_name, required: true, input_html: { autocomplete: "last_name" } %> - </div> - <div class="col-md-4"> <%= f.association :language, include_blank: false, label_method: lambda { |l| t("languages.#{l.iso_code.to_s}") } %> - <%= f.input :mobile_phone %> <%= f.input :admin_theme, include_blank: false %> </div> - <div class="col-md-4"> + <div class="col-lg-6"> <%= f.input :password, as: :password_with_hints, allow_password_uncloaking: true, @@ -35,6 +32,7 @@ hint: t(".leave_blank_if_you_don_t_want_to_change_it"), required: false, input_html: { autocomplete: "new-password" } %> + <%= f.input :mobile_phone %> <%= f.input :picture, as: :single_deletable_file, input_html: { accept: '.jpg,.jpeg,.png,.svg' }, diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb index 34db524df5ac26e9ec94e93f7afb440ab5d695eb..cc85287f0ac19054fb0b051522e7b1684be16a12 100644 --- a/app/views/devise/registrations/new.html.erb +++ b/app/views/devise/registrations/new.html.erb @@ -6,7 +6,7 @@ <%= f.error_notification %> <div class="row"> - <div class="col-md-6"> + <div class="col-lg-6"> <%= f.input :email, required: true, input_html: { autocomplete: "email" } %> @@ -22,7 +22,7 @@ label_method: lambda { |l| t("languages.#{l.iso_code.to_s}") }, include_blank: :translate %> </div> - <div class="col-md-6"> + <div class="col-lg-6"> <%= f.input :password, as: :password_with_hints, required: true, diff --git a/app/views/devise/two_factor_authentication/show.html.erb b/app/views/devise/two_factor_authentication/show.html.erb index 964870ab3d7a2c78b0fa0198938d3c72bffb8b79..5fab80bda2581319923c14e3fd135c57ccf599da 100644 --- a/app/views/devise/two_factor_authentication/show.html.erb +++ b/app/views/devise/two_factor_authentication/show.html.erb @@ -1,6 +1,8 @@ <%= content_for :title, t('.title') %> -<h4> +<h4 class="mb-5"><%= t('.title') %></h4> + +<p> <% if resource.direct_otp %> <% if resource.direct_otp_delivery_method == 'mobile_phone' %> <%= t('devise.two_factor_authentication.enter_code_direct_otp_mobile_phone', phone: masked_phone(resource.mobile_phone)) %> @@ -10,11 +12,11 @@ <% else %> <%= t('devise.two_factor_authentication.enter_code_totp') %> <% end %> -</h4> +</p> <%= simple_form_for(resource, url: user_two_factor_authentication_path, html: { method: :put, class: 'my-3' }) do |f| %> - <div class="row"> - <div class="col-md-6"> + <div class="row pure__row--small"> + <div class="col-lg-6"> <div class="form-inputs"> <div class="form-group required mt-0"> <%= text_field_tag :code, @@ -25,7 +27,7 @@ autofocus: true, autocomplete: 'off', class: 'form-control string required'%> - <p class="mt-2 mb-0"> + <p class="mt-2 mb-5"> <% if resource.direct_otp %> <%= link_to t('devise.two_factor_authentication.resend_code'), [:resend_code, resource_name, :two_factor_authentication] %> <% else %> @@ -38,11 +40,11 @@ </div> </div> </div> - <div class="col-md-6"> + <div class="col-lg-6"> <%= link_to t('devise.shared.links.sign_out'), destroy_user_session_path, method: :delete, - class: "btn btn-danger float-end" %> + class: "btn btn-outline-danger" %> <%= f.button :submit, t('devise.two_factor_authentication.validate'), class: "btn btn-primary" %> diff --git a/app/views/extranet/application/_footer.html.erb b/app/views/extranet/application/_footer.html.erb index 90c6d199b9fba77c8d58b1e512e88671c735f37f..6f774e2449b0e57f4d82608656fcf81e1aa8dd3c 100644 --- a/app/views/extranet/application/_footer.html.erb +++ b/app/views/extranet/application/_footer.html.erb @@ -45,10 +45,6 @@ about = current_extranet.about target: '_blank', rel: 'noreferrer' if current_extranet.has_cookies_policy? %> <%= link_to t('extranet.data'), data_path %> - <%= link_to t('cookies_consent_choice'), - '', - class: 'js-gdpr__cookie_consent__display_again' %> - <%= t 'extranet.osuny_html' %> </nav> </div> diff --git a/app/views/extranet/gdpr/_cookie_consent.html.erb b/app/views/extranet/gdpr/_cookie_consent.html.erb deleted file mode 100644 index 3a1cfe18e18ad1aff4e2fffef35dbf87a7a0dfd3..0000000000000000000000000000000000000000 --- a/app/views/extranet/gdpr/_cookie_consent.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<div class="gdpr__cookie_consent js-gdpr__cookie_consent"> - <div class="gdpr__cookie_consent__text"> - <%= t('gdpr.cookie_consent.text') %> - <%= t('gdpr.cookie_consent.learn_more_html', link: cookies_policy_path) %> - </div> - <div class="gdpr__cookie_consent__buttons"> - <button class="gdpr__cookie_consent__buttons__ok js-gdpr__cookie_consent__buttons__ok btn btn-primary btn-sm btn-xs"> <%= t('gdpr.cookie_consent.button_ok') %></button> - <button class="gdpr__cookie_consent__buttons__ko js-gdpr__cookie_consent__buttons__ko btn btn-primary btn-sm btn-xs"> <%= t('gdpr.cookie_consent.button_ko') %></button> - </div> -</div> \ No newline at end of file diff --git a/app/views/extranet/layouts/application.html.erb b/app/views/extranet/layouts/application.html.erb index 8b20a64470b47db0a214116ba3c18c4e12a065a1..ccad435576b5eec0aea0abed45ea8745def16a78 100644 --- a/app/views/extranet/layouts/application.html.erb +++ b/app/views/extranet/layouts/application.html.erb @@ -11,7 +11,6 @@ <%= yield %> </main> <%= render 'extranet/application/footer' %> - <%= render 'extranet/gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= javascript_include_tag 'extranet' %> <script src="https://example.osuny.org/js/extranet.js"></script> diff --git a/app/views/extranet/layouts/devise.html.erb b/app/views/extranet/layouts/devise.html.erb index f94aae6fee43e9285b0b021aa7c4ae9b779a4464..69ff30bdc1c2f7817e2ff0782323af130aab3621 100644 --- a/app/views/extranet/layouts/devise.html.erb +++ b/app/views/extranet/layouts/devise.html.erb @@ -24,12 +24,10 @@ <%= link_to t('terms_of_service'), terms_path, rel: 'noreferrer' if current_extranet.has_terms? %> <%= link_to t('privacy_policy'), privacy_policy_path, rel: 'noreferrer' if current_extranet.has_privacy_policy? %> <%= link_to t('cookies_policy'), cookies_policy_path, rel: 'noreferrer' if current_extranet.has_cookies_policy? %> - <%= link_to t('cookies_consent_choice'), '', class: 'js-gdpr__cookie_consent__display_again' %> </footer> </div> </div> </main> - <%= render 'extranet/gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= javascript_include_tag 'extranet' %> </body> diff --git a/app/views/extranet/pages/data.html.erb b/app/views/extranet/pages/data.html.erb index 9829d185e2b5fd62fa23b975bf54bec05ea8e2b6..4fc343aa0f4a3e1f1615ce10944ecfb3d7b1fe51 100644 --- a/app/views/extranet/pages/data.html.erb +++ b/app/views/extranet/pages/data.html.erb @@ -5,9 +5,14 @@ <div class="row"> <% @metrics.each do |metric| %> - <div class="col-md-3"> - <p class="h1 mb-0"><%= metric[:value] %></p> - <p><%= metric[:name] %></p> - </div> + <% + value = metric[:value] + next if value.zero? + name = metric[:name] + %> + <div class="col-md-3"> + <p class="h1 mb-0"><%= value %></p> + <p><%= name %></p> + </div> <% end %> </div> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d7a2782bd31e89f40eb05cc1090e87caeb0b5ed7..fa8ec3ad26ada8cec7b7640605039a938125412a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -17,7 +17,6 @@ <%= yield %> </main> <%= render 'footer' %> - <%= render 'gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= render 'summernote_localization' %> </body> diff --git a/app/views/layouts/devise.html.erb b/app/views/layouts/devise.html.erb index 6c3eb195df94f507849be3b7c6073a7cf27339bc..09a94714b1c8e7954b3b9da2e3093fe40d5a9bf9 100644 --- a/app/views/layouts/devise.html.erb +++ b/app/views/layouts/devise.html.erb @@ -12,29 +12,20 @@ </head> <body class="<%= body_classes %>"> <div class="container"> - <div class="row"> - <div class="col-sm-10 mx-auto"> - <h1 class="my-5 py-5 text-center"> - <%= link_to root_path do %> - <%= render 'logo' %> - <% end %> - </h1> - <div class="card"> - <div class="card-body text-start"> - <% unless notice.blank? %> - <div class="alert alert-success mt-2" role="alert"><%= notice.html_safe %></div> - <% end %> - <% unless alert.blank? %> - <div class="alert alert-danger mt-2" role="alert"><%= alert.html_safe %></div> - <% end %> - <%= yield %> - </div> - </div> - </div> - </div> + <h1 class="my-5 py-5 text-center"> + <%= link_to root_path do %> + <%= render 'logo' %> + <% end %> + </h1> + <% unless notice.blank? %> + <div class="alert alert-success mt-2" role="alert"><%= notice.html_safe %></div> + <% end %> + <% unless alert.blank? %> + <div class="alert alert-danger mt-2" role="alert"><%= alert.html_safe %></div> + <% end %> + <%= yield %> </div> <%= render 'footer' %> - <%= render 'gdpr/cookie_consent' %> <%= render 'bugsnag' %> <%= render 'summernote_localization' %> </body> diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb index 94970409dc65038c3e60da402c40b1473a3e3aae..c1e2f2441ab327ea3c49ce6ebdc5a3441e71ddaf 100644 --- a/config/initializers/simple_form_bootstrap.rb +++ b/config/initializers/simple_form_bootstrap.rb @@ -79,7 +79,7 @@ SimpleForm.setup do |config| config.wrappers :vertical_collection, item_wrapper_class: 'form-check', item_label_class: 'form-check-label', tag: 'fieldset', class: 'mb-3' do |b| b.use :html5 b.optional :readonly - b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba| + b.wrapper :legend_tag, tag: 'legend', class: 'form-label pt-0' do |ba| ba.use :label_text end b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid' @@ -91,7 +91,7 @@ SimpleForm.setup do |config| config.wrappers :vertical_collection_inline, item_wrapper_class: 'form-check form-check-inline', item_label_class: 'form-check-label', tag: 'fieldset', class: 'mb-3' do |b| b.use :html5 b.optional :readonly - b.wrapper :legend_tag, tag: 'legend', class: 'col-form-label pt-0' do |ba| + b.wrapper :legend_tag, tag: 'legend', class: 'form-label pt-0' do |ba| ba.use :label_text end b.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid' @@ -158,7 +158,7 @@ SimpleForm.setup do |config| b.optional :pattern b.optional :min_max b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label' + b.use :label, class: 'col-sm-3 form-label' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback' } @@ -184,7 +184,7 @@ SimpleForm.setup do |config| config.wrappers :horizontal_collection, item_wrapper_class: 'form-check', item_label_class: 'form-check-label', class: 'row mb-3' do |b| b.use :html5 b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label pt-0' + b.use :label, class: 'col-sm-3 form-label pt-0' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback d-block' } @@ -196,7 +196,7 @@ SimpleForm.setup do |config| config.wrappers :horizontal_collection_inline, item_wrapper_class: 'form-check form-check-inline', item_label_class: 'form-check-label', class: 'row mb-3' do |b| b.use :html5 b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label pt-0' + b.use :label, class: 'col-sm-3 form-label pt-0' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-check-input', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback d-block' } @@ -211,7 +211,7 @@ SimpleForm.setup do |config| b.optional :maxlength b.optional :minlength b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label' + b.use :label, class: 'col-sm-3 form-label' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-control', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback' } @@ -223,7 +223,7 @@ SimpleForm.setup do |config| config.wrappers :horizontal_select, class: 'row mb-3' do |b| b.use :html5 b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label' + b.use :label, class: 'col-sm-3 form-label' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-select', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback' } @@ -235,7 +235,7 @@ SimpleForm.setup do |config| config.wrappers :horizontal_multi_select, class: 'row mb-3' do |b| b.use :html5 b.optional :readonly - b.use :label, class: 'col-sm-3 col-form-label' + b.use :label, class: 'col-sm-3 form-label' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.wrapper class: 'd-flex flex-row justify-content-between align-items-center' do |bb| bb.use :input, class: 'form-select mx-1', error_class: 'is-invalid', valid_class: 'is-valid' @@ -251,7 +251,7 @@ SimpleForm.setup do |config| b.use :placeholder b.optional :readonly b.optional :step - b.use :label, class: 'col-sm-3 col-form-label pt-0' + b.use :label, class: 'col-sm-3 form-label pt-0' b.wrapper :grid_wrapper, class: 'col-sm-9' do |ba| ba.use :input, class: 'form-range', error_class: 'is-invalid', valid_class: 'is-valid' ba.use :full_error, wrap_with: { class: 'invalid-feedback' } diff --git a/config/locales/administration/en.yml b/config/locales/administration/en.yml index ce23b4dc0ca7a26af92318a5d25a3b6b9ecb3ad8..e0c0b5c419908f895e6f36d91d8f7e4decff4fcd 100644 --- a/config/locales/administration/en.yml +++ b/config/locales/administration/en.yml @@ -29,5 +29,6 @@ en: description: text: L'administration, sous ses multiples formes, se définit principalement par ses activités au service de l'intérêt général. L'administration agit dans l'intérêt général et respecte le principe de légalité. Elle est tenue à l'obligation de neutralité et au respect du principe de laïcité. Elle se conforme au principe d'égalité et garantit à chacun un traitement impartial. source: Code des relations entre le public et l'administration - qualiopi: - description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi \ No newline at end of file + parts: + qualiopi: + description: Help in checking the conformity of the training offer with the Qualiopi standard \ No newline at end of file diff --git a/config/locales/administration/fr.yml b/config/locales/administration/fr.yml index 3b955daa3605e95b9397bf31ec1a3858f676fc05..5b57ec79688ca012b705af04a0f053d04d03df39 100644 --- a/config/locales/administration/fr.yml +++ b/config/locales/administration/fr.yml @@ -29,5 +29,6 @@ fr: description: text: L'administration, sous ses multiples formes, se définit principalement par ses activités au service de l'intérêt général. L'administration agit dans l'intérêt général et respecte le principe de légalité. Elle est tenue à l'obligation de neutralité et au respect du principe de laïcité. Elle se conforme au principe d'égalité et garantit à chacun un traitement impartial. source: Code des relations entre le public et l'administration - qualiopi: - description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi \ No newline at end of file + parts: + qualiopi: + description: Aide à la vérification de la conformité de l'offre de formation avec la norme Qualiopi diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml index b829f6d995adec126a0beaca00c19e900969300b..64e53987fa5579d78d1862d6bb34e68a5079d767 100644 --- a/config/locales/communication/en.yml +++ b/config/locales/communication/en.yml @@ -68,7 +68,6 @@ en: about_type: About color: Couleur cookies_policy: Cookies policy - description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées favicon: Favicon (.png) feature_alumni: Alumni feature_contacts: Directory @@ -129,7 +128,6 @@ en: access_token: Access token created_at: Creation default_language: Default language - description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap git_branch: Git branch git_endpoint: Git endpoint git_provider: Git provider @@ -629,6 +627,11 @@ en: description: text: Communiquer, c'est mettre en commun; et mettre en commun, c'est l'acte qui nous constitue. Si l'on estime que cet acte est impossible, on refuse tout projet humain. source: Albert Jacquard, Petite philosophie à l'usage des non-philosophes, 1997 + parts: + website: + description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap + extranet: + description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées manage_authors: Manage authors number_of_posts: Nunber of posts website: diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml index 87a098e11f611aaf8fe77fd1fab402503a56c916..937454802264a93513e030d56d8b019f639cadd9 100644 --- a/config/locales/communication/fr.yml +++ b/config/locales/communication/fr.yml @@ -68,7 +68,6 @@ fr: about_type: Type d'extranet color: Couleur cookies_policy: Politique de cookies - description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées favicon: Favicon (.png) feature_alumni: Alumni feature_contacts: Annuaire @@ -129,7 +128,6 @@ fr: access_token: Access token created_at: Création default_language: Langue par défaut - description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap git_branch: Branche git_endpoint: Point d'accès Git git_provider: Provider Git @@ -629,6 +627,11 @@ fr: description: text: Communiquer, c'est mettre en commun; et mettre en commun, c'est l'acte qui nous constitue. Si l'on estime que cet acte est impossible, on refuse tout projet humain. source: Albert Jacquard, Petite philosophie à l'usage des non-philosophes, 1997 + parts: + website: + description: Espaces publics de diffusion d'information, sobre sur le plan écologique et accessible aux personnes en situation de handicap + extranet: + description: Espaces d'échanges sécurisés dédiés aux personnes authentifiées manage_authors: Gérer les auteur·rice·s number_of_posts: Nombre d'actualités website: diff --git a/config/locales/education/en.yml b/config/locales/education/en.yml index dfd4c369afe61c0ab0183e43a73ca2592fec2af5..73051d2483cdc4bf52dcc5371c58f3c88ae590cb 100644 --- a/config/locales/education/en.yml +++ b/config/locales/education/en.yml @@ -94,6 +94,17 @@ en: description: text: L’éducation est l’ensemble des processus et des procédés qui permettent à tout enfant humain d’accéder progressivement à la culture, l’accès à la culture étant ce qui distingue l’homme de l’animal. source: Olivier Reboul, La philosophie de l'éducation, 2018 + parts: + diploma: + description: Présentation des diplômes et de leurs caractéristiques + program: + description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives + teacher: + description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations + school: + description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives + alumnus: + description: Présentation des étudiants et étudiantes ayant étudié dans les différentes formations manage_programs: Manage programs manage_roles: Manage roles manage_teachers: Manage teachers diff --git a/config/locales/education/fr.yml b/config/locales/education/fr.yml index 73b87aa91267510676b1d9f11a5cd7a1ce285f4e..0b92fa951f7cfdd071ec508f36722dd99c96572a 100644 --- a/config/locales/education/fr.yml +++ b/config/locales/education/fr.yml @@ -31,7 +31,6 @@ fr: school: École year: Année education/diploma: - description: Présentation des diplômes et de leurs caractéristiques duration: Durée ects: Crédits ECTS level: Niveau @@ -44,7 +43,6 @@ fr: capacity: Capacité contacts: Contacts continuing: Formation continue - description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives diploma: Diplôme duration: Durée downloadable_summary: Document de synthèse téléchargeable @@ -77,7 +75,6 @@ fr: administrators: Équipe administrative city: Ville country: Pays - description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives name: Nom phone: Téléphone programs: Formations dispensées @@ -85,8 +82,6 @@ fr: url: Site Web websites: Sites Web associés zipcode: Code postal - university/person/teacher: - description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations admin: education: programs: @@ -99,6 +94,17 @@ fr: description: text: L’éducation est l’ensemble des processus et des procédés qui permettent à tout enfant humain d’accéder progressivement à la culture, l’accès à la culture étant ce qui distingue l’homme de l’animal. source: Olivier Reboul, La philosophie de l'éducation, 2018 + parts: + diploma: + description: Présentation des diplômes et de leurs caractéristiques + program: + description: Présentation exhaustive des formations, de leurs contenus, modalités pédagogiques et perspectives + teacher: + description: Présentation des enseignants et enseignantes, avec leur biographie et leurs enseignements dans les différentes formations + school: + description: Présentation des écoles, de leurs coordonnées, enseignements, équipes et informations administratives + alumnus: + description: Présentation des étudiants et étudiantes ayant étudié dans les différentes formations manage_programs: Gérer les formations manage_roles: Gérer les rôles manage_teachers: Gérer les enseignants·es diff --git a/config/locales/en.yml b/config/locales/en.yml index 85a703d66c0b73e6628130a3174cc0a88e4a1dc9..551e5fb3b8104a64070910aec3a0232cf3e89bd9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -46,7 +46,6 @@ en: summernote_locale: Summernote locale code user: admin_theme: Admin Theme - description: Personne utilisant Osuny, dotée d'un compte authentifié email: Email first_name: First name language: Favourite language @@ -202,8 +201,6 @@ en: empty: Folder is empty open: Open folder close: Close folder - gdpr: - privacy_policy: https://osuny.org/politique-de-confidentialite hello: "Hello %{name}!" home: Home imports: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 1e441444b1eb2e7cdc625f2a9c766e8050721f85..1fc37088e5c8ff952d9534c617e994326808d2da 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -46,7 +46,6 @@ fr: summernote_locale: Nom de la locale Summernote user: admin_theme: Thème de l'administration - description: Personne utilisant Osuny, dotée d'un compte authentifié email: Email first_name: Prénom language: Langue préférée @@ -202,8 +201,6 @@ fr: empty: Le dossier est vide open: Ouvrir le dossier close: Fermer le dossier - gdpr: - privacy_policy: https://osuny.org/politique-de-confidentialite hello: "Bonjour %{name} !" home: Accueil imports: diff --git a/config/locales/research/en.yml b/config/locales/research/en.yml index c4fb2a96bcc223eaf9c4d25a7fd34b6985c9475a..f1b08768dfd99f990341e15d3d8f1fe5e85b336b 100644 --- a/config/locales/research/en.yml +++ b/config/locales/research/en.yml @@ -36,15 +36,12 @@ en: one: Thesis other: Theses attributes: - research/hal: - description: Publications et auteur·e·s dans la base de données HAL research/hal/author: docid: HAL identifier first_name: First name full_name: Full name last_name: Last name research/hal/publication: - description: Publications scientifiques importées automatiquement de HAL docid: Identifier doi_url: URL DOI publication_date: Publication date @@ -52,11 +49,11 @@ en: url: URL hal_url: URL HAL research/journal: - description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche issn: ISSN title: Title research/journal/paper: abstract: Abstract + authors_list: Authors list doi: DOI keywords: Keywords pdf: PDF @@ -84,7 +81,6 @@ en: address: Address country: Country city: City - description: Structure de recherche hébergeant le travail des chercheur·e·s name: Name zipcode: Zipcode research/laboratory/axis: @@ -96,7 +92,6 @@ en: author: Author completed: Completed? completed_at: Completed at - description: Production scientifique permettant d'obtenir le titre de Docteur·e director: Director laboratory: Laboratory started_at: Started at @@ -109,12 +104,30 @@ en: description: text: La recherche scientifique est, à la fois, une démarche créatrice de connaissances motivée par la curiosité pure et une activité génératrice d’innovations qui augmentent les moyens d’action et de diagnostic sur la nature, l’homme et la société. Ces deux aspects de la recherche, le fondamental et l’appliqué, loin de s’opposer, sont complémentaires l’un de l’autre. La recherche fondamentale crée le socle de connaissances à partir duquel naissent les applications et, inversement, les avancées technologiques procurent les outils d’investigation de plus en plus perfectionnés qui conduisent à approfondir nos connaissances fondamentales. source: Serge Haroche, Prix Nobel de physique 2012 + parts: + hal: + description: Publications et auteur·e·s dans la base de données HAL + journal: + description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche + laboratory: + description: Structure de recherche hébergeant le travail des chercheur·e·s + researcher: + description: Personne physique liée à une université, une composante, un laboratoire, etc. + thesis: + description: Production scientifique permettant d'obtenir le titre de Docteur·e hal: + description: + parts: + author: + description: Profils des chercheur·e·s dans la base de données HAL + publication: + description: Publications scientifiques importées automatiquement de HAL title: HAL select_identifier: Select all the HAL authors that correspond to this researcher. Use the publications to be sure it's the same person. simple_form: hints: research_journal_paper: + authors_list: Type the authors list directly in this field if you don't want to use the checkboxes above doi: "You can type the DOI identifier without https://, for example “10.19182/perspective/31918â€" research_journal_volume: cover: JPG or PNG file diff --git a/config/locales/research/fr.yml b/config/locales/research/fr.yml index 895456f73ddbd7bcec3fc8c0c87c7413a95e72e7..aa30b2e68121d829cb4a8d6c68199c0570ac136a 100644 --- a/config/locales/research/fr.yml +++ b/config/locales/research/fr.yml @@ -36,16 +36,12 @@ fr: one: Thèse other: Thèses attributes: - research/hal: - description: Publications et auteur·e·s dans la base de données HAL research/hal/author: - description: Profils des chercheur·e·s dans la base de données HAL docid: Identifiant HAL first_name: Prénom full_name: Nom complet last_name: Nom research/hal/publication: - description: Publications scientifiques importées automatiquement de HAL docid: Identifiant doi_url: URL DOI publication_date: Date de publication @@ -53,11 +49,11 @@ fr: url: URL hal_url: URL HAL research/journal: - description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche issn: ISSN title: Titre research/journal/paper: abstract: Extrait + authors_list: Liste des auteur·e·s doi: DOI keywords: Mots clés pdf: PDF @@ -85,7 +81,6 @@ fr: address: Adresse country: Pays city: Ville - description: Structure de recherche hébergeant le travail des chercheur·e·s name: Nom zipcode: Code postal research/laboratory/axis: @@ -94,10 +89,9 @@ fr: text: Texte research/thesis: abstract: Résumé - author: Auteur·rice + author: Auteur·e completed: Complétée ? completed_at: Complétée le - description: Production scientifique permettant d'obtenir le titre de Docteur·e director: Directeur·rice laboratory: Laboratoire started_at: Commencée le @@ -110,11 +104,29 @@ fr: description: text: La recherche scientifique est, à la fois, une démarche créatrice de connaissances motivée par la curiosité pure et une activité génératrice d’innovations qui augmentent les moyens d’action et de diagnostic sur la nature, l’homme et la société. Ces deux aspects de la recherche, le fondamental et l’appliqué, loin de s’opposer, sont complémentaires l’un de l’autre. La recherche fondamentale crée le socle de connaissances à partir duquel naissent les applications et, inversement, les avancées technologiques procurent les outils d’investigation de plus en plus perfectionnés qui conduisent à approfondir nos connaissances fondamentales. source: Serge Haroche, Prix Nobel de physique 2012 + parts: + hal: + description: Publications et auteur·e·s dans la base de données HAL + journal: + description: Journaux en accès ouvert (open access) permettant aux chercheur·e·s de contribuer à la recherche + laboratory: + description: Structure de recherche hébergeant le travail des chercheur·e·s + researcher: + description: Personne physique liée à une université, une composante, un laboratoire, etc. + thesis: + description: Production scientifique permettant d'obtenir le titre de Docteur·e hal: + description: + parts: + author: + description: Profils des chercheur·e·s dans la base de données HAL + publication: + description: Publications scientifiques importées automatiquement de HAL select_identifier: Choisissez tou·te·s les auteur·e·s HAL correspondant à cette personne. Appuyez-vous sur les publications pour vérifier qu'il s'agit de la bonne personne. simple_form: hints: research_journal_paper: + authors_list: Tapez la liste des auteurs si vous n'utilisez pas les cases à cocher “Auteur·e·s†ci-dessus doi: "Vous pouvez saisir l'identifiant DOI sans https://, par exemple “10.19182/perspective/31918â€" research_journal_volume: cover: Fichier JPG ou PNG diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml index d34e017176ef0c82fa94f1f837227529c86248b7..a569d75d16de2579838d21c6c31c06a9bc89178a 100644 --- a/config/locales/university/en.yml +++ b/config/locales/university/en.yml @@ -68,7 +68,6 @@ en: communication_website_posts: Posts contacts: Contact information country: Country - description: Personne physique liée à une université, une composante, un laboratoire, etc. education_programs: Programs email: Email essentials: Essentials @@ -208,6 +207,13 @@ en: description: text: Une université est une institution d'enseignement supérieur, d'étude et de recherche, constituée par la réunion de divers établissements nommés suivant les traditions “collègesâ€, “facultésâ€, “institutsâ€, “départementsâ€, “centresâ€, “sectionsâ€, “unités†ou écoles spécifiques, mais aussi bibliothèque ou atelier, médiathèque ou musée, etc. formant un ensemble administratif cohérent avec un statut de droit défini, public, privé ou éventuellement mixte. source: Wikipedia + parts: + person: + description: Personne physique liée à une université, une composante, un laboratoire, etc. + organization: + description: Personne morale liée à une université, une composante, un laboratoire, etc. + user: + description: Personne utilisant Osuny, dotée d'un compte authentifié internal_key: Internal Key invoice_informations: Invoice informations manage_alumni: Manage alumni diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml index 04fec52d272960beb59ac8d4de712cd7de6e9de2..289fa01a0e68909af5584ef23b282b8d3b674a13 100644 --- a/config/locales/university/fr.yml +++ b/config/locales/university/fr.yml @@ -34,7 +34,6 @@ fr: categories: Catégories city: Ville country: Pays - description: Personne morale liée à une université, une composante, un laboratoire, etc. digital: Coordonnées numériques email: Email kind: Type @@ -68,7 +67,6 @@ fr: communication_website_posts: Actualités contacts: Coordonnées country: Pays - description: Personne physique liée à une université, une composante, un laboratoire, etc. education_programs: Formations email: Email essentials: Informations essentielles @@ -208,6 +206,13 @@ fr: description: text: Une université est une institution d'enseignement supérieur, d'étude et de recherche, constituée par la réunion de divers établissements nommés suivant les traditions “collègesâ€, “facultésâ€, “institutsâ€, “départementsâ€, “centresâ€, “sectionsâ€, “unités†ou écoles spécifiques, mais aussi bibliothèque ou atelier, médiathèque ou musée, etc. formant un ensemble administratif cohérent avec un statut de droit défini, public, privé ou éventuellement mixte. source: Wikipedia + parts: + person: + description: Personne physique liée à une université, une composante, un laboratoire, etc. + organization: + description: Personne morale liée à une université, une composante, un laboratoire, etc. + user: + description: Personne utilisant Osuny, dotée d'un compte authentifié internal_key: Clé interne invoice_informations: Données de facturation manage_alumni: Gérer les alumni diff --git a/config/routes/admin/administration.rb b/config/routes/admin/administration.rb index 1e2581e82cb84a7708069f067b5ef1fcb6dcbd03..cd5c1ac24aaba28f21c9a2bc72150c41da993670 100644 --- a/config/routes/admin/administration.rb +++ b/config/routes/admin/administration.rb @@ -2,6 +2,7 @@ namespace :administration do namespace :qualiopi do resources :criterions, only: [:index, :show] resources :indicators, only: [:index, :show] + root to: 'criterions#index' end root to: 'dashboard#index' end diff --git a/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb b/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb new file mode 100644 index 0000000000000000000000000000000000000000..cacd25eeb35bd8b2361aa821878e301f13aaeb83 --- /dev/null +++ b/db/migrate/20230405142031_add_authors_list_to_research_journal_papers.rb @@ -0,0 +1,5 @@ +class AddAuthorsListToResearchJournalPapers < ActiveRecord::Migration[7.0] + def change + add_column :research_journal_papers, :authors_list, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 61b664759abad49dedad4660b95e5a347b4d5248..90fb648f002649d4e932e84f13512ca13f023a81 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,13 +10,13 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do +ActiveRecord::Schema[7.0].define(version: 2023_04_05_142031) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" enable_extension "unaccent" - create_table "action_text_rich_texts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "action_text_rich_texts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name", null: false t.text "body" t.string "record_type", null: false @@ -26,7 +26,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true end - create_table "active_storage_attachments", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "active_storage_attachments", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false t.uuid "record_id", null: false @@ -36,7 +36,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true end - create_table "active_storage_blobs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "active_storage_blobs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "key", null: false t.string "filename", null: false t.string "content_type" @@ -50,13 +50,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_active_storage_blobs_on_university_id" end - create_table "active_storage_variant_records", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "active_storage_variant_records", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "blob_id", null: false t.string "variation_digest", null: false t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.integer "number" t.text "name" t.text "description" @@ -64,7 +64,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.datetime "updated_at", null: false end - create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "criterion_id", null: false t.integer "number" t.text "name" @@ -78,7 +78,23 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["criterion_id"], name: "index_administration_qualiopi_indicators_on_criterion_id" end - create_table "communication_blocks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_block_headings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.uuid "university_id", null: false + t.string "about_type", null: false + t.uuid "about_id", null: false + t.string "title" + t.integer "level", default: 2 + t.uuid "parent_id" + t.integer "position" + t.string "slug" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["about_type", "about_id"], name: "index_communication_block_headings_on_about" + t.index ["parent_id"], name: "index_communication_block_headings_on_parent_id" + t.index ["university_id"], name: "index_communication_block_headings_on_university_id" + end + + create_table "communication_blocks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "about_type" t.uuid "about_id" @@ -89,7 +105,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.datetime "updated_at", null: false t.string "title" t.boolean "published", default: true + t.uuid "heading_id" t.index ["about_type", "about_id"], name: "index_communication_website_blocks_on_about" + t.index ["heading_id"], name: "index_communication_blocks_on_heading_id" t.index ["university_id"], name: "index_communication_blocks_on_university_id" end @@ -175,7 +193,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_communication_extranet_posts_on_university_id" end - create_table "communication_extranets", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_extranets", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name" t.uuid "university_id", null: false t.string "host" @@ -207,7 +225,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_communication_extranets_on_university_id" end - create_table "communication_website_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_categories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "communication_website_id", null: false t.string "name" @@ -241,7 +259,22 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["communication_website_post_id", "communication_website_category_id"], name: "post_category" end - create_table "communication_website_git_files", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_connections", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.uuid "university_id", null: false + t.uuid "website_id", null: false + t.string "indirect_object_type", null: false + t.uuid "indirect_object_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "direct_source_type" + t.uuid "direct_source_id" + t.index ["direct_source_type", "direct_source_id"], name: "index_communication_website_connections_on_source" + t.index ["indirect_object_type", "indirect_object_id"], name: "index_communication_website_connections_on_object" + t.index ["university_id"], name: "index_communication_website_connections_on_university_id" + t.index ["website_id"], name: "index_communication_website_connections_on_website_id" + end + + create_table "communication_website_git_files", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "previous_path" t.string "about_type", null: false t.uuid "about_id", null: false @@ -253,7 +286,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_git_files_on_website_id" end - create_table "communication_website_imported_authors", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_authors", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.uuid "author_id" @@ -269,7 +302,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "idx_communication_website_imported_auth_on_website" end - create_table "communication_website_imported_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_categories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.uuid "category_id" @@ -287,7 +320,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "idx_communication_website_imported_cat_on_website" end - create_table "communication_website_imported_media", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_media", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "identifier" t.jsonb "data" t.text "file_url" @@ -302,7 +335,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_imported_media_on_website_id" end - create_table "communication_website_imported_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_pages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.uuid "page_id" @@ -326,7 +359,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_imported_pages_on_website_id" end - create_table "communication_website_imported_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_posts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.uuid "post_id" @@ -351,7 +384,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_imported_posts_on_website_id" end - create_table "communication_website_imported_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_imported_websites", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.integer "status", default: 0 @@ -361,7 +394,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_imported_websites_on_website_id" end - create_table "communication_website_menu_items", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_menu_items", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.uuid "menu_id", null: false @@ -381,7 +414,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_menu_items_on_website_id" end - create_table "communication_website_menus", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_menus", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "communication_website_id", null: false t.string "title" @@ -397,7 +430,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_communication_website_menus_on_university_id" end - create_table "communication_website_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_pages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "communication_website_id", null: false t.string "title" @@ -412,10 +445,10 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.text "github_path" t.string "featured_image_alt" t.text "text" + t.text "summary" t.string "breadcrumb_title" t.text "header_text" t.integer "kind" - t.text "summary" t.string "bodyclass" t.uuid "language_id", null: false t.text "featured_image_credit" @@ -429,7 +462,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_communication_website_pages_on_university_id" end - create_table "communication_website_permalinks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_permalinks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "website_id", null: false t.string "about_type", null: false @@ -443,7 +476,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["website_id"], name: "index_communication_website_permalinks_on_website_id" end - create_table "communication_website_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_website_posts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "communication_website_id", null: false t.string "title" @@ -469,7 +502,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_communication_website_posts_on_university_id" end - create_table "communication_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "communication_websites", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" t.string "url" @@ -521,7 +554,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["priority", "run_at"], name: "delayed_jobs_priority" end - create_table "education_academic_years", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "education_academic_years", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.integer "year" t.datetime "created_at", null: false @@ -536,7 +569,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_person_id", "education_academic_year_id"], name: "index_person_academic_year" end - create_table "education_cohorts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "education_cohorts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "program_id", null: false t.uuid "academic_year_id", null: false @@ -557,7 +590,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_person_id", "education_cohort_id"], name: "index_person_cohort" end - create_table "education_diplomas", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "education_diplomas", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name" t.string "short_name" t.integer "level", default: 0 @@ -571,7 +604,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_education_diplomas_on_university_id" end - create_table "education_programs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "education_programs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" t.integer "capacity" @@ -631,7 +664,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["education_program_id", "user_id"], name: "index_education_programs_users_on_program_id_and_user_id" end - create_table "education_schools", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "education_schools", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" t.string "address" @@ -647,7 +680,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_education_schools_on_university_id" end - create_table "imports", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "imports", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.integer "number_of_lines" t.jsonb "processing_errors" t.integer "kind" @@ -660,7 +693,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["user_id"], name: "index_imports_on_user_id" end - create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "languages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name" t.string "iso_code" t.datetime "created_at", null: false @@ -727,7 +760,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_journal_paper_kinds_on_university_id" end - create_table "research_journal_papers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_journal_papers", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "title" t.datetime "published_at", precision: nil t.uuid "university_id", null: false @@ -749,6 +782,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.date "received_at" t.date "accepted_at" t.string "doi" + t.text "authors_list" t.index ["kind_id"], name: "index_research_journal_papers_on_kind_id" t.index ["research_journal_id"], name: "index_research_journal_papers_on_research_journal_id" t.index ["research_journal_volume_id"], name: "index_research_journal_papers_on_research_journal_volume_id" @@ -763,7 +797,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["researcher_id"], name: "index_research_journal_papers_researchers_on_researcher_id" end - create_table "research_journal_volumes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_journal_volumes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "research_journal_id", null: false t.string "title" @@ -783,7 +817,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_journal_volumes_on_university_id" end - create_table "research_journals", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_journals", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "title" t.text "meta_description" @@ -794,7 +828,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_journals_on_university_id" end - create_table "research_laboratories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_laboratories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" t.string "address" @@ -806,7 +840,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_laboratories_on_university_id" end - create_table "research_laboratory_axes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_laboratory_axes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "research_laboratory_id", null: false t.string "name" @@ -820,7 +854,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_laboratory_axes_on_university_id" end - create_table "research_theses", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "research_theses", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "research_laboratory_id", null: false t.uuid "author_id", null: false @@ -838,7 +872,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_research_theses_on_university_id" end - create_table "universities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "universities", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.string "name" t.string "identifier" t.string "address" @@ -877,7 +911,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_university_organization_categories_on_university_id" end - create_table "university_organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "university_organizations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" t.string "long_name" @@ -915,7 +949,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["organization_id"], name: "index_university_organizations_categories_on_organization_id" end - create_table "university_people", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "university_people", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "user_id" t.string "last_name" @@ -971,7 +1005,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_university_person_categories_on_university_id" end - create_table "university_person_experiences", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "university_person_experiences", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "person_id", null: false t.uuid "organization_id", null: false @@ -985,7 +1019,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_university_person_experiences_on_university_id" end - create_table "university_person_involvements", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "university_person_involvements", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.uuid "person_id", null: false t.integer "kind" @@ -1000,7 +1034,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_university_person_involvements_on_university_id" end - create_table "university_roles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "university_roles", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "target_type" t.uuid "target_id" @@ -1012,7 +1046,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do t.index ["university_id"], name: "index_university_roles_on_university_id" end - create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + create_table "users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "first_name" t.string "last_name" @@ -1061,6 +1095,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "administration_qualiopi_indicators", "administration_qualiopi_criterions", column: "criterion_id" + add_foreign_key "communication_block_headings", "communication_block_headings", column: "parent_id" + add_foreign_key "communication_block_headings", "universities" + add_foreign_key "communication_blocks", "communication_block_headings", column: "heading_id" add_foreign_key "communication_blocks", "universities" add_foreign_key "communication_extranet_connections", "communication_extranets", column: "extranet_id" add_foreign_key "communication_extranet_connections", "universities" @@ -1085,6 +1122,8 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_20_125138) do add_foreign_key "communication_website_categories", "education_programs", column: "program_id" add_foreign_key "communication_website_categories", "languages" add_foreign_key "communication_website_categories", "universities" + add_foreign_key "communication_website_connections", "communication_websites", column: "website_id" + add_foreign_key "communication_website_connections", "universities" add_foreign_key "communication_website_git_files", "communication_websites", column: "website_id" add_foreign_key "communication_website_imported_authors", "communication_website_imported_websites", column: "website_id" add_foreign_key "communication_website_imported_authors", "universities"