Initial Redmine tooling and local plugin forks
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
# This file is a part of Redmine CRM (redmine_contacts) plugin,
|
||||
# customer relationship management plugin for Redmine
|
||||
#
|
||||
# Copyright (C) 2010-2018 RedmineUP
|
||||
# http://www.redmineup.com/
|
||||
#
|
||||
# redmine_contacts is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# redmine_contacts is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with redmine_contacts. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
class ContactsSetting < ActiveRecord::Base
|
||||
unloadable
|
||||
include Redmine::SafeAttributes
|
||||
|
||||
TAX_TYPE_EXCLUSIVE = 1
|
||||
TAX_TYPE_INCLUSIVE = 2
|
||||
|
||||
belongs_to :project
|
||||
|
||||
attr_protected :id if ActiveRecord::VERSION::MAJOR <= 4
|
||||
safe_attributes 'name', 'value', 'project_id'
|
||||
|
||||
cattr_accessor :settings
|
||||
acts_as_attachable
|
||||
|
||||
# Hash used to cache setting values
|
||||
@contacts_cached_settings = {}
|
||||
@contacts_cached_cleared_on = Time.now
|
||||
|
||||
validates_uniqueness_of :name, :scope => [:project_id]
|
||||
|
||||
# Returns the value of the setting named name
|
||||
def self.[](name, project_id)
|
||||
project_id = project_id.id if project_id.is_a?(Project)
|
||||
v = @contacts_cached_settings[hk(name, project_id)]
|
||||
v ? v : (@contacts_cached_settings[hk(name, project_id)] = find_or_default(name, project_id).value)
|
||||
end
|
||||
|
||||
def self.[]=(name, project_id, v)
|
||||
project_id = project_id.id if project_id.is_a?(Project)
|
||||
setting = find_or_default(name, project_id)
|
||||
setting.value = (v ? v : '')
|
||||
@contacts_cached_settings[hk(name, project_id)] = nil
|
||||
setting.save
|
||||
setting.value
|
||||
end
|
||||
|
||||
# Checks if settings have changed since the values were read
|
||||
# and clears the cache hash if it's the case
|
||||
# Called once per request
|
||||
def self.check_cache
|
||||
settings_updated_on = ContactsSetting.maximum(:updated_on)
|
||||
if settings_updated_on && @contacts_cached_cleared_on <= settings_updated_on
|
||||
clear_cache
|
||||
end
|
||||
end
|
||||
|
||||
# Clears the settings cache
|
||||
def self.clear_cache
|
||||
@contacts_cached_settings.clear
|
||||
@contacts_cached_cleared_on = Time.now
|
||||
logger.info 'Contacts settings cache cleared.' if logger
|
||||
end
|
||||
|
||||
def self.contact_name_format
|
||||
Setting.plugin_redmine_contacts['name_format'] || :firstname_lastname
|
||||
end
|
||||
|
||||
def self.vcard?
|
||||
Object.const_defined?(:Vcard)
|
||||
end
|
||||
|
||||
def self.spreadsheet?
|
||||
Object.const_defined?(:Spreadsheet)
|
||||
end
|
||||
|
||||
def self.monochrome_tags?
|
||||
!!Setting.plugin_redmine_contacts['monochrome_tags']
|
||||
end
|
||||
|
||||
def self.contacts_show_in_top_menu?
|
||||
!!Setting.plugin_redmine_contacts['contacts_show_in_top_menu']
|
||||
end
|
||||
|
||||
def self.contacts_show_in_app_menu?
|
||||
!!Setting.plugin_redmine_contacts['contacts_show_in_app_menu']
|
||||
end
|
||||
|
||||
def self.default_country
|
||||
Setting.plugin_redmine_contacts['default_country']
|
||||
end
|
||||
|
||||
def self.cross_project_contacts?
|
||||
Setting.plugin_redmine_contacts['cross_project_contacts'].to_i > 0
|
||||
end
|
||||
|
||||
# Finance
|
||||
|
||||
def self.default_currency
|
||||
Setting.plugin_redmine_contacts['default_currency'] || 'USD'
|
||||
end
|
||||
|
||||
def self.major_currencies
|
||||
currencies = Setting.plugin_redmine_contacts['major_currencies'].to_s.split(',').select { |c| !c.blank? }.map(&:strip)
|
||||
currencies = %w(USD EUR GBP RUB CHF) if currencies.blank?
|
||||
currencies.compact.uniq
|
||||
end
|
||||
|
||||
def self.default_tax
|
||||
Setting.plugin_redmine_contacts['default_tax'].to_f
|
||||
end
|
||||
|
||||
def self.tax_type
|
||||
((['1', '2'] & [Setting.plugin_redmine_contacts['tax_type'].to_s]).first || TAX_TYPE_EXCLUSIVE).to_i
|
||||
end
|
||||
|
||||
def self.tax_exclusive?
|
||||
ContactsSetting.tax_type == TAX_TYPE_EXCLUSIVE
|
||||
end
|
||||
|
||||
def self.thousands_delimiter
|
||||
([' ', ',', '.'] & [Setting.plugin_redmine_contacts['thousands_delimiter']]).first || ' '
|
||||
end
|
||||
|
||||
def self.decimal_separator
|
||||
([',', '.'] & [Setting.plugin_redmine_contacts['decimal_separator']]).first || '.'
|
||||
end
|
||||
|
||||
def self.disable_taxes?
|
||||
!!Setting.plugin_redmine_contacts['disable_taxes']
|
||||
end
|
||||
|
||||
def self.post_address_format
|
||||
unless Setting.plugin_redmine_contacts['post_address_format'].blank?
|
||||
Setting.plugin_redmine_contacts['post_address_format'].to_s.strip
|
||||
else
|
||||
"%street1%\n%street2%\n%city%, %postcode%\n%region%\n%country%"
|
||||
end
|
||||
end
|
||||
def self.deals_show_in_top_menu?
|
||||
!!Setting.plugin_redmine_contacts['deals_show_in_top_menu']
|
||||
end
|
||||
|
||||
def self.deals_show_in_app_menu?
|
||||
!!Setting.plugin_redmine_contacts['deals_show_in_app_menu']
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.hk(name, project_id)
|
||||
"#{name}-#{project_id.to_s}"
|
||||
end
|
||||
|
||||
# Returns the Setting instance for the setting named name
|
||||
# (record found in database or new record with default value)
|
||||
def self.find_or_default(name, project_id)
|
||||
name = name.to_s
|
||||
setting = find_by_name_and_project_id(name, project_id)
|
||||
setting ||= new(:name => name, :value => '', :project_id => project_id)
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user