Browse Source

Fixes #4381 - Ticket templates are missing active flag.

Dusan Vuckovic 2 years ago
parent
commit
0f7d08e724

+ 2 - 4
app/assets/javascripts/app/models/template.coffee

@@ -1,14 +1,12 @@
 class App.Template extends App.Model
-  @configure 'Template', 'name', 'options', 'user_id', 'updated_at'
+  @configure 'Template', 'name', 'options', 'user_id', 'updated_at', 'active'
   @extend Spine.Model.Ajax
   @url: @apiPath + '/templates'
   @configure_attributes = [
     { name: 'name',        display: __('Name'),     tag: 'input', type: 'text', limit: 100, null: false },
     { name: 'options',     display: __('Actions'),  tag: 'ticket_perform_action', user_action: false, article_body_only: true, no_richtext_uploads: true, sender_type: true, skip_unknown_attributes: true, null: true },
     { name: 'updated_at',  display: __('Updated'),  tag: 'datetime', readonly: 1 },
-
-    # TODO: Extend model to support storing of the active flag.
-    # { name: 'active',      display: __('Active'),   tag: 'active', default: true },
+    { name: 'active',      display: __('Active'),   tag: 'active', default: true },
   ]
   @configure_delete = true
   @configure_clone = true

+ 2 - 2
app/controllers/templates_controller.rb

@@ -55,7 +55,7 @@ curl http://localhost/api/v1/templates.json -v -u #{login}:#{password}
 =end
 
   def index
-    model_index_render(Template, params)
+    model_index_render(policy_scope(Template), params)
   end
 
 =begin
@@ -76,7 +76,7 @@ curl http://localhost/api/v1/templates/#{id}.json -v -u #{login}:#{password}
 =end
 
   def show
-    model_show_render(Template, params)
+    model_show_render(policy_scope(Template), params)
   end
 
 =begin

+ 2 - 0
app/models/template.rb

@@ -4,6 +4,8 @@ class Template < ApplicationModel
   include ChecksClientNotification
   include Template::Assets
 
+  scope :active, -> { where(active: true) }
+
   store     :options
   validates :name, presence: true
 

+ 2 - 1
app/policies/controllers/templates_controller_policy.rb

@@ -1,5 +1,6 @@
 # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
 
 class Controllers::TemplatesControllerPolicy < Controllers::ApplicationControllerPolicy
-  default_permit!(['ticket.agent', 'admin.template'])
+  default_permit!('admin.template')
+  permit! %i[index show], to: ['admin.template', 'ticket.agent']
 end

+ 4 - 0
app/policies/template_policy.rb

@@ -0,0 +1,4 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+class TemplatePolicy < ApplicationPolicy
+end

+ 17 - 0
app/policies/template_policy/scope.rb

@@ -0,0 +1,17 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+class TemplatePolicy < ApplicationPolicy
+  class Scope < ApplicationPolicy::Scope
+
+    def resolve
+      if user.permissions?('admin.template')
+        scope.all
+      elsif user.permissions?('ticket.agent')
+        scope.active
+      else
+        scope.none
+      end
+    end
+
+  end
+end

+ 3 - 2
db/migrate/20120101000010_create_ticket.rb

@@ -397,8 +397,9 @@ class CreateTicket < ActiveRecord::Migration[4.2]
     create_table :templates do |t|
       t.column :name,                 :string,  limit: 250,  null: false
       t.column :options,              :text,    limit: 10.megabytes + 1, null: false
-      t.column :updated_by_id,        :integer,              null: false
-      t.column :created_by_id,        :integer,              null: false
+      t.column :active,               :boolean, null: false, default: true
+      t.column :updated_by_id,        :integer, null: false
+      t.column :created_by_id,        :integer, null: false
       t.timestamps limit: 3, null: false
     end
     add_index :templates, [:name]

+ 14 - 0
db/migrate/20221205151816_issue_4381_templates_active_field.rb

@@ -0,0 +1,14 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+class Issue4381TemplatesActiveField < ActiveRecord::Migration[6.1]
+  def change
+    # return if it's a new setup
+    return if !Setting.exists?(name: 'system_init_done')
+
+    change_table :templates do |t|
+      t.boolean :active, default: true, null: false
+    end
+
+    Template.reset_column_information
+  end
+end

+ 1 - 0
spec/factories/template.rb

@@ -6,6 +6,7 @@ FactoryBot.define do
     options       { { 'ticket.title': { value: 'Some dummy title' } } }
     updated_by_id { 1 }
     created_by_id { 1 }
+    active        { true }
 
     transient do
       title { 'Title dummy.' }

+ 51 - 0
spec/policies/template_policy/scope_spec.rb

@@ -0,0 +1,51 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe TemplatePolicy::Scope do
+  subject(:scope) { described_class.new(user, original_collection) }
+
+  let(:original_collection) { Template }
+
+  let(:active_template) { create(:template, :dummy_data, active: true) }
+  let(:inactive_template) { create(:template, :dummy_data, active: false) }
+
+  before do
+    Template.destroy_all
+    active_template && inactive_template
+  end
+
+  describe '#resolve' do
+    context 'without user' do
+      let(:user) { nil }
+
+      it 'throws exception' do
+        expect { scope.resolve }.to raise_error %r{Authentication required}
+      end
+    end
+
+    context 'with customer' do
+      let(:user) { create(:customer) }
+
+      it 'returns empty' do
+        expect(scope.resolve).to be_empty
+      end
+    end
+
+    context 'with agent' do
+      let(:user) { create(:agent) }
+
+      it 'returns active template only' do
+        expect(scope.resolve).to match_array [active_template]
+      end
+    end
+
+    context 'with admin' do
+      let(:user) { create(:admin) }
+
+      it 'returns all templates' do
+        expect(scope.resolve).to match_array [active_template, inactive_template]
+      end
+    end
+  end
+end

Some files were not shown because too many files changed in this diff