20190531180304_initialize_knowledge_base.rb 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. # Using older 5.0 migration to stick to Integer primary keys. Otherwise migration fails in MySQL.
  2. class InitializeKnowledgeBase < ActiveRecord::Migration[5.0]
  3. def change
  4. return if ActiveRecord::Base.connection.table_exists? 'knowledge_bases'
  5. create_table :knowledge_bases do |t|
  6. t.string :iconset, limit: 30, null: false
  7. t.string :color_highlight, limit: 9, null: false
  8. t.string :color_header, limit: 9, null: false
  9. t.string :homepage_layout, null: false
  10. t.string :category_layout, null: false
  11. t.boolean :active, null: false, default: true
  12. t.string :custom_address
  13. t.timestamps null: false
  14. end
  15. create_table :knowledge_base_locales do |t|
  16. t.belongs_to :knowledge_base, null: false, foreign_key: { to_table: :knowledge_bases }
  17. t.belongs_to :system_locale, null: false, foreign_key: { to_table: :locales }
  18. t.boolean :primary, null: false, default: false
  19. t.timestamps null: false
  20. end
  21. create_table :knowledge_base_translations do |t|
  22. t.string :title, limit: 250, null: false
  23. t.string :footer_note, null: false
  24. t.references :kb_locale, null: false, foreign_key: { to_table: :knowledge_base_locales }
  25. t.references :knowledge_base, null: false, foreign_key: { to_table: :knowledge_bases, on_delete: :cascade }
  26. t.timestamps null: false
  27. end
  28. create_table :knowledge_base_categories do |t|
  29. t.references :knowledge_base, null: false, foreign_key: { to_table: :knowledge_bases }
  30. t.references :parent, null: true, foreign_key: { to_table: :knowledge_base_categories }
  31. t.string :category_icon, null: false, limit: 30
  32. t.integer :position, null: false, index: true
  33. t.timestamps null: false
  34. end
  35. create_table :knowledge_base_category_translations do |t|
  36. t.string :title, limit: 250, null: false
  37. t.references :kb_locale, null: false, foreign_key: { to_table: :knowledge_base_locales }
  38. t.references :category, null: false, foreign_key: { to_table: :knowledge_base_categories, on_delete: :cascade }
  39. t.timestamps null: false
  40. end
  41. create_table :knowledge_base_answers do |t|
  42. t.references :category, null: false, foreign_key: { to_table: :knowledge_base_categories }
  43. t.boolean :promoted, null: false, default: false
  44. t.text :internal_note, null: true, limit: 1.megabyte
  45. t.integer :position, null: false, index: true
  46. t.timestamp :archived_at, limit: 3, null: true
  47. t.references :archived_by, foreign_key: { to_table: :users }
  48. t.timestamp :internal_at, limit: 3, null: true
  49. t.references :internal_by, foreign_key: { to_table: :users }
  50. t.timestamp :published_at, limit: 3, null: true
  51. t.references :published_by, foreign_key: { to_table: :users }
  52. t.timestamps null: false
  53. end
  54. create_table :knowledge_base_answer_translation_contents do |t| # rubocop:disable Rails/CreateTableWithTimestamps
  55. t.text :body, null: true, limit: 20.megabytes + 1
  56. end
  57. create_table :knowledge_base_answer_translations do |t|
  58. t.string :title, limit: 250, null: false
  59. t.references :kb_locale, null: false, foreign_key: { to_table: :knowledge_base_locales }
  60. t.references :answer, null: false, foreign_key: { to_table: :knowledge_base_answers, on_delete: :cascade }
  61. t.references :content, null: false, foreign_key: { to_table: :knowledge_base_answer_translation_contents }
  62. t.references :created_by, null: false, foreign_key: { to_table: :users }
  63. t.references :updated_by, null: false, foreign_key: { to_table: :users }
  64. t.timestamps null: false
  65. end
  66. create_table :knowledge_base_menu_items do |t|
  67. t.references :kb_locale, null: false, foreign_key: { to_table: :knowledge_base_locales, on_delete: :cascade }
  68. t.integer :position, null: false, index: true
  69. t.string :title, null: false, limit: 100
  70. t.string :url, null: false, limit: 500
  71. t.boolean :new_tab, null: false, default: false
  72. t.timestamps
  73. end
  74. Setting.create_if_not_exists(
  75. title: 'Kb multi-lingual support',
  76. name: 'kb_multi_lingual_support',
  77. area: 'Kb::Core',
  78. description: 'Support of multi-lingual Knowledge Base.',
  79. options: {},
  80. state: true,
  81. preferences: { online_service_disable: true },
  82. frontend: true
  83. )
  84. Setting.create_if_not_exists(
  85. title: 'Kb active',
  86. name: 'kb_active',
  87. area: 'Kb::Core',
  88. description: 'Defines if KB navbar button is enabled. Updated in KnowledgeBase callback.',
  89. state: false,
  90. preferences: {
  91. prio: 1,
  92. trigger: ['menu:render'],
  93. authentication: true,
  94. permission: ['admin.knowledge_base'],
  95. },
  96. frontend: true
  97. )
  98. Setting.create_if_not_exists(
  99. title: 'Kb active publicly',
  100. name: 'kb_active_publicly',
  101. area: 'Kb::Core',
  102. description: 'Defines if KB navbar button is enabled for users without KB permission. Updated in CanBePublished callback.',
  103. state: false,
  104. preferences: {
  105. prio: 1,
  106. trigger: ['menu:render'],
  107. authentication: true,
  108. permission: [],
  109. },
  110. frontend: true
  111. )
  112. return if !Setting.find_by(name: 'system_init_done')
  113. Permission.create_if_not_exists(
  114. name: 'admin.knowledge_base',
  115. note: 'Create and setup %s',
  116. preferences: {
  117. translations: ['Knowledge Base']
  118. }
  119. )
  120. Permission.create_if_not_exists(
  121. name: 'knowledge_base',
  122. note: 'Manage %s',
  123. preferences: {
  124. translations: ['Knowledge Base'],
  125. disabled: true,
  126. }
  127. )
  128. Permission.create_if_not_exists(
  129. name: 'knowledge_base.reader',
  130. note: 'Access %s',
  131. preferences: {
  132. translations: ['Knowledge Base']
  133. }
  134. )
  135. Permission.create_if_not_exists(
  136. name: 'knowledge_base.editor',
  137. note: 'Manage %s',
  138. preferences: {
  139. translations: ['Knowledge Base Editor']
  140. }
  141. )
  142. Role.with_permissions(['admin']).each do |role|
  143. role.permission_grant('knowledge_base.editor')
  144. end
  145. Role.with_permissions(['ticket.agent']).each do |role|
  146. role.permission_grant('knowledge_base.reader')
  147. end
  148. end
  149. end