Merge branch 'develop' of git.znuny.com:zammad/zammad into develop
This commit is contained in:
commit
4c7309303f
287 changed files with 2093 additions and 2021 deletions
|
@ -99,14 +99,6 @@ Style/EmptyLinesAroundModuleBody:
|
|||
Description: "Keeps track of empty lines around module bodies."
|
||||
Enabled: false
|
||||
|
||||
Style/BlockDelimiters:
|
||||
Description: >-
|
||||
Avoid using {...} for multi-line blocks (multiline chaining is
|
||||
always ugly).
|
||||
Prefer {...} over do...end for single-line blocks.
|
||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks'
|
||||
Enabled: false
|
||||
|
||||
Style/MultilineBlockChain:
|
||||
Description: 'Avoid multi-line chains of blocks.'
|
||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks'
|
||||
|
|
|
@ -44,12 +44,12 @@ module ApplicationController::HandlesErrors
|
|||
|
||||
respond_to do |format|
|
||||
format.json { render json: humanize_error(e.message), status: status }
|
||||
format.any {
|
||||
format.any do
|
||||
@exception = e
|
||||
@traceback = !Rails.env.production?
|
||||
file = File.open(Rails.root.join('public', "#{status_code}.html"), 'r')
|
||||
render inline: file.read, status: status
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -22,14 +22,14 @@ module ApplicationController::LogsHttpAccess
|
|||
content_encoding: request.headers['Content-Encoding'],
|
||||
source: request.headers['User-Agent'] || request.headers['Server'],
|
||||
}
|
||||
request.headers.each { |key, value|
|
||||
request.headers.each do |key, value|
|
||||
next if key[0, 5] != 'HTTP_'
|
||||
request_data[:content] += if key == 'HTTP_COOKIE'
|
||||
"#{key}: xxxxx\n"
|
||||
else
|
||||
"#{key}: #{value}\n"
|
||||
end
|
||||
}
|
||||
end
|
||||
body = request.body.read
|
||||
if body
|
||||
request_data[:content] += "\n" + body
|
||||
|
@ -44,9 +44,9 @@ module ApplicationController::LogsHttpAccess
|
|||
content_encoding: nil,
|
||||
source: nil,
|
||||
}
|
||||
response.headers.each { |key, value|
|
||||
response.headers.each do |key, value|
|
||||
response_data[:content] += "#{key}: #{value}\n"
|
||||
}
|
||||
end
|
||||
body = response.body
|
||||
if body
|
||||
response_data[:content] += "\n" + body
|
||||
|
|
|
@ -111,9 +111,9 @@ module ApplicationController::RendersModels
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
generic_objects.each { |generic_object|
|
||||
generic_objects.each do |generic_object|
|
||||
list.push generic_object.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -121,10 +121,10 @@ module ApplicationController::RendersModels
|
|||
if params[:full]
|
||||
assets = {}
|
||||
item_ids = []
|
||||
generic_objects.each { |item|
|
||||
generic_objects.each do |item|
|
||||
item_ids.push item.id
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: item_ids,
|
||||
assets: assets,
|
||||
|
@ -133,9 +133,9 @@ module ApplicationController::RendersModels
|
|||
end
|
||||
|
||||
generic_objects_with_associations = []
|
||||
generic_objects.each { |item|
|
||||
generic_objects.each do |item|
|
||||
generic_objects_with_associations.push item.attributes_with_association_ids
|
||||
}
|
||||
end
|
||||
model_index_render_result(generic_objects_with_associations)
|
||||
end
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ class ApplicationsController < ApplicationController
|
|||
if params[:full]
|
||||
assets = {}
|
||||
item_ids = []
|
||||
all.each { |item|
|
||||
all.each do |item|
|
||||
item_ids.push item.id
|
||||
if !assets[:Application]
|
||||
assets[:Application] = {}
|
||||
|
@ -16,7 +16,7 @@ class ApplicationsController < ApplicationController
|
|||
application = item.attributes
|
||||
application[:clients] = Doorkeeper::AccessToken.where(application_id: item.id).count
|
||||
assets[:Application][item.id] = application
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: item_ids,
|
||||
assets: assets,
|
||||
|
|
|
@ -8,10 +8,10 @@ class CalendarsController < ApplicationController
|
|||
# calendars
|
||||
assets = {}
|
||||
calendar_ids = []
|
||||
Calendar.all.order(:name, :created_at).each { |calendar|
|
||||
Calendar.all.order(:name, :created_at).each do |calendar|
|
||||
calendar_ids.push calendar.id
|
||||
assets = calendar.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
ical_feeds = Calendar.ical_feeds
|
||||
timezones = Calendar.timezones
|
||||
|
|
|
@ -11,12 +11,12 @@ class ChannelsEmailController < ApplicationController
|
|||
not_used_email_address_ids = []
|
||||
accounts_fixed = []
|
||||
assets = {}
|
||||
Channel.order(:id).each { |channel|
|
||||
Channel.order(:id).each do |channel|
|
||||
if system_online_service && channel.preferences && channel.preferences['online_service_disable']
|
||||
email_addresses = EmailAddress.where(channel_id: channel.id)
|
||||
email_addresses.each { |email_address|
|
||||
email_addresses.each do |email_address|
|
||||
accounts_fixed.push email_address
|
||||
}
|
||||
end
|
||||
next
|
||||
end
|
||||
if channel.area == 'Email::Account'
|
||||
|
@ -26,15 +26,15 @@ class ChannelsEmailController < ApplicationController
|
|||
notification_channel_ids.push channel.id
|
||||
assets = channel.assets(assets)
|
||||
end
|
||||
}
|
||||
EmailAddress.all.each { |email_address|
|
||||
end
|
||||
EmailAddress.all.each do |email_address|
|
||||
next if system_online_service && email_address.preferences && email_address.preferences['online_service_disable']
|
||||
email_address_ids.push email_address.id
|
||||
assets = email_address.assets(assets)
|
||||
if !email_address.channel_id || !email_address.active || !Channel.find_by(id: email_address.channel_id)
|
||||
not_used_email_address_ids.push email_address.id
|
||||
end
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
accounts_fixed: accounts_fixed,
|
||||
assets: assets,
|
||||
|
@ -224,7 +224,7 @@ class ChannelsEmailController < ApplicationController
|
|||
# save settings
|
||||
if result[:result] == 'ok'
|
||||
|
||||
Channel.where(area: 'Email::Notification').each { |channel|
|
||||
Channel.where(area: 'Email::Notification').each do |channel|
|
||||
active = false
|
||||
if adapter =~ /^#{channel.options[:outbound][:adapter]}$/i
|
||||
active = true
|
||||
|
@ -239,7 +239,7 @@ class ChannelsEmailController < ApplicationController
|
|||
end
|
||||
channel.active = active
|
||||
channel.save
|
||||
}
|
||||
end
|
||||
end
|
||||
render json: result
|
||||
end
|
||||
|
@ -247,7 +247,7 @@ class ChannelsEmailController < ApplicationController
|
|||
private
|
||||
|
||||
def account_duplicate?(result, channel_id = nil)
|
||||
Channel.where(area: 'Email::Account').each { |channel|
|
||||
Channel.where(area: 'Email::Account').each do |channel|
|
||||
next if !channel.options
|
||||
next if !channel.options[:inbound]
|
||||
next if !channel.options[:inbound][:adapter]
|
||||
|
@ -261,7 +261,7 @@ class ChannelsEmailController < ApplicationController
|
|||
message: 'Account already exists!',
|
||||
}
|
||||
return true
|
||||
}
|
||||
end
|
||||
false
|
||||
end
|
||||
|
||||
|
|
|
@ -5,14 +5,14 @@ class ChannelsFacebookController < ApplicationController
|
|||
|
||||
def index
|
||||
assets = {}
|
||||
ExternalCredential.where(name: 'facebook').each { |external_credential|
|
||||
ExternalCredential.where(name: 'facebook').each do |external_credential|
|
||||
assets = external_credential.assets(assets)
|
||||
}
|
||||
end
|
||||
channel_ids = []
|
||||
Channel.where(area: 'Facebook::Account').order(:id).each { |channel|
|
||||
Channel.where(area: 'Facebook::Account').order(:id).each do |channel|
|
||||
assets = channel.assets(assets)
|
||||
channel_ids.push channel.id
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
assets: assets,
|
||||
channel_ids: channel_ids,
|
||||
|
|
|
@ -7,10 +7,10 @@ class ChannelsTelegramController < ApplicationController
|
|||
def index
|
||||
assets = {}
|
||||
channel_ids = []
|
||||
Channel.where(area: 'Telegram::Bot').order(:id).each { |channel|
|
||||
Channel.where(area: 'Telegram::Bot').order(:id).each do |channel|
|
||||
assets = channel.assets(assets)
|
||||
channel_ids.push channel.id
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
assets: assets,
|
||||
channel_ids: channel_ids
|
||||
|
|
|
@ -5,14 +5,14 @@ class ChannelsTwitterController < ApplicationController
|
|||
|
||||
def index
|
||||
assets = {}
|
||||
ExternalCredential.where(name: 'twitter').each { |external_credential|
|
||||
ExternalCredential.where(name: 'twitter').each do |external_credential|
|
||||
assets = external_credential.assets(assets)
|
||||
}
|
||||
end
|
||||
channel_ids = []
|
||||
Channel.where(area: 'Twitter::Account').order(:id).each { |channel|
|
||||
Channel.where(area: 'Twitter::Account').order(:id).each do |channel|
|
||||
assets = channel.assets(assets)
|
||||
channel_ids.push channel.id
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
assets: assets,
|
||||
channel_ids: channel_ids,
|
||||
|
|
|
@ -6,10 +6,10 @@ class ChatsController < ApplicationController
|
|||
def index
|
||||
chat_ids = []
|
||||
assets = {}
|
||||
Chat.order(:id).each { |chat|
|
||||
Chat.order(:id).each do |chat|
|
||||
chat_ids.push chat.id
|
||||
assets = chat.assets(assets)
|
||||
}
|
||||
end
|
||||
setting = Setting.find_by(name: 'chat')
|
||||
assets = setting.assets(assets)
|
||||
render json: {
|
||||
|
|
|
@ -62,7 +62,7 @@ module CreatesTicketArticles
|
|||
article.save!
|
||||
|
||||
# store inline attachments
|
||||
attachments_inline.each { |attachment|
|
||||
attachments_inline.each do |attachment|
|
||||
Store.add(
|
||||
object: 'Ticket::Article',
|
||||
o_id: article.id,
|
||||
|
@ -70,24 +70,24 @@ module CreatesTicketArticles
|
|||
filename: attachment[:filename],
|
||||
preferences: attachment[:preferences],
|
||||
)
|
||||
}
|
||||
end
|
||||
|
||||
# add attachments as param
|
||||
if params[:attachments].present?
|
||||
params[:attachments].each_with_index { |attachment, index|
|
||||
params[:attachments].each_with_index do |attachment, index|
|
||||
|
||||
# validation
|
||||
['mime-type', 'filename', 'data'].each { |key|
|
||||
['mime-type', 'filename', 'data'].each do |key|
|
||||
next if attachment[key]
|
||||
raise Exceptions::UnprocessableEntity, "Attachment needs '#{key}' param for attachment with index '#{index}'"
|
||||
}
|
||||
end
|
||||
|
||||
preferences = {}
|
||||
['charset', 'mime-type'].each { |key|
|
||||
['charset', 'mime-type'].each do |key|
|
||||
next if !attachment[key]
|
||||
store_key = key.tr('-', '_').camelize.gsub(/(.+)([A-Z])/, '\1_\2').tr('_', '-')
|
||||
preferences[store_key] = attachment[key]
|
||||
}
|
||||
end
|
||||
|
||||
if attachment[:data] !~ %r{^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$}
|
||||
raise Exceptions::UnprocessableEntity, "Invalid base64 for attachment with index '#{index}'"
|
||||
|
@ -100,7 +100,7 @@ module CreatesTicketArticles
|
|||
filename: attachment[:filename],
|
||||
preferences: preferences,
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# account time
|
||||
|
|
|
@ -16,7 +16,7 @@ module TicketStats
|
|||
volume_by_year = []
|
||||
now = Time.zone.now
|
||||
|
||||
(0..11).each { |month_back|
|
||||
(0..11).each do |month_back|
|
||||
date_to_check = now - month_back.month
|
||||
date_start = "#{date_to_check.year}-#{date_to_check.month}-01 00:00:00"
|
||||
date_end = "#{date_to_check.year}-#{date_to_check.month}-#{date_to_check.end_of_month.day} 00:00:00"
|
||||
|
@ -41,7 +41,7 @@ module TicketStats
|
|||
closed: closed,
|
||||
}
|
||||
volume_by_year.push data
|
||||
}
|
||||
end
|
||||
volume_by_year
|
||||
end
|
||||
|
||||
|
|
|
@ -243,14 +243,14 @@ class FirstStepsController < ApplicationController
|
|||
test_ticket_active = false
|
||||
end
|
||||
return result if test_ticket_active
|
||||
result.each { |item|
|
||||
result.each do |item|
|
||||
items = []
|
||||
item[:items].each { |local_item|
|
||||
item[:items].each do |local_item|
|
||||
next if local_item[:name] == 'Create a Test Ticket'
|
||||
items.push local_item
|
||||
}
|
||||
end
|
||||
item[:items] = items
|
||||
}
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ class FormController < ApplicationController
|
|||
|
||||
if params[:file]
|
||||
|
||||
params[:file].each { |file|
|
||||
params[:file].each do |file|
|
||||
Store.add(
|
||||
object: 'Ticket::Article',
|
||||
o_id: article.id,
|
||||
|
@ -138,7 +138,7 @@ class FormController < ApplicationController
|
|||
'Mime-Type' => file.content_type,
|
||||
}
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
|
|
|
@ -174,9 +174,9 @@ curl http://localhost/api/v1/getting_started -v -u #{login}:#{password}
|
|||
end
|
||||
|
||||
# set changed settings
|
||||
settings.each { |key, value|
|
||||
settings.each do |key, value|
|
||||
Setting.set(key, value)
|
||||
}
|
||||
end
|
||||
|
||||
render json: {
|
||||
result: 'ok',
|
||||
|
|
|
@ -25,11 +25,11 @@ class ImportOtrsController < ApplicationController
|
|||
response = UserAgent.request(params[:url])
|
||||
if !response.success? && response.code.to_s !~ /^40.$/
|
||||
message_human = ''
|
||||
translation_map.each { |key, message|
|
||||
translation_map.each do |key, message|
|
||||
if response.error.to_s =~ /#{Regexp.escape(key)}/i
|
||||
message_human = message
|
||||
end
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
result: 'invalid',
|
||||
message_human: message_human,
|
||||
|
@ -128,20 +128,20 @@ class ImportOtrsController < ApplicationController
|
|||
# check count of dynamic fields
|
||||
dynamic_field_count = 0
|
||||
dynamic_fields = Import::OTRS::Requester.load('DynamicField')
|
||||
dynamic_fields.each { |dynamic_field|
|
||||
dynamic_fields.each do |dynamic_field|
|
||||
next if dynamic_field['ValidID'].to_i != 1
|
||||
dynamic_field_count += 1
|
||||
}
|
||||
end
|
||||
if dynamic_field_count > 20
|
||||
issues.push 'otrsDynamicFields'
|
||||
end
|
||||
|
||||
# check if process exsists
|
||||
sys_configs = Import::OTRS::Requester.load('SysConfig')
|
||||
sys_configs.each { |sys_config|
|
||||
sys_configs.each do |sys_config|
|
||||
next if sys_config['Key'] != 'Process'
|
||||
issues.push 'otrsProcesses'
|
||||
}
|
||||
end
|
||||
|
||||
result = 'ok'
|
||||
if !issues.empty?
|
||||
|
|
|
@ -27,11 +27,11 @@ class ImportZendeskController < ApplicationController
|
|||
|
||||
if !response.success?
|
||||
message_human = ''
|
||||
translation_map.each { |key, message|
|
||||
translation_map.each do |key, message|
|
||||
if response.error.to_s =~ /#{Regexp.escape(key)}/i
|
||||
message_human = message
|
||||
end
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
result: 'invalid',
|
||||
message_human: message_human,
|
||||
|
|
|
@ -25,7 +25,7 @@ class Integration::CheckMkController < ApplicationController
|
|||
open_states = Ticket::State.by_category(:open)
|
||||
ticket_ids = Ticket.where(state: open_states).order(created_at: :desc).limit(5000).pluck(:id)
|
||||
ticket_ids_found = []
|
||||
ticket_ids.each { |ticket_id|
|
||||
ticket_ids.each do |ticket_id|
|
||||
ticket = Ticket.find_by(id: ticket_id)
|
||||
next if !ticket
|
||||
next if !ticket.preferences
|
||||
|
@ -36,7 +36,7 @@ class Integration::CheckMkController < ApplicationController
|
|||
|
||||
# found open ticket for service+host
|
||||
ticket_ids_found.push ticket.id
|
||||
}
|
||||
end
|
||||
|
||||
# new ticket, set meta data
|
||||
title = "#{params[:host]} is #{params[:state]}"
|
||||
|
@ -51,7 +51,7 @@ UserAgent: #{request.env['HTTP_USER_AGENT']}
|
|||
|
||||
# add article
|
||||
if params[:state].present? && ticket_ids_found.present?
|
||||
ticket_ids_found.each { |ticket_id|
|
||||
ticket_ids_found.each do |ticket_id|
|
||||
ticket = Ticket.find_by(id: ticket_id)
|
||||
next if !ticket
|
||||
article = Ticket::Article.create!(
|
||||
|
@ -62,7 +62,7 @@ UserAgent: #{request.env['HTTP_USER_AGENT']}
|
|||
subject: title,
|
||||
internal: false,
|
||||
)
|
||||
}
|
||||
end
|
||||
if (!auto_close && params[:state].match(/#{state_recovery_match}/i)) || !params[:state].match(/#{state_recovery_match}/i)
|
||||
render json: {
|
||||
result: 'ticket already open, added note',
|
||||
|
@ -81,12 +81,12 @@ UserAgent: #{request.env['HTTP_USER_AGENT']}
|
|||
return
|
||||
end
|
||||
state = Ticket::State.lookup(id: auto_close_state_id)
|
||||
ticket_ids_found.each { |ticket_id|
|
||||
ticket_ids_found.each do |ticket_id|
|
||||
ticket = Ticket.find_by(id: ticket_id)
|
||||
next if !ticket
|
||||
ticket.state_id = auto_close_state_id
|
||||
ticket.save!
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
result: "closed tickets with ids #{ticket_ids_found.join(',')}",
|
||||
ticket_ids: ticket_ids_found,
|
||||
|
|
|
@ -13,7 +13,7 @@ class Integration::SipgateController < ApplicationController
|
|||
block_caller_ids = config_inbound[:block_caller_ids] || []
|
||||
|
||||
# check if call need to be blocked
|
||||
block_caller_ids.each { |item|
|
||||
block_caller_ids.each do |item|
|
||||
next unless item[:caller_id] == params['from']
|
||||
xml = Builder::XmlMarkup.new(indent: 2)
|
||||
xml.instruct!
|
||||
|
@ -30,7 +30,7 @@ class Integration::SipgateController < ApplicationController
|
|||
end
|
||||
Cti::Log.process(params)
|
||||
return true
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
Cti::Log.process(params)
|
||||
|
@ -54,7 +54,7 @@ class Integration::SipgateController < ApplicationController
|
|||
to = params[:to]
|
||||
from = nil
|
||||
if to
|
||||
config_outbound.each { |row|
|
||||
config_outbound.each do |row|
|
||||
dest = row[:dest].gsub(/\*/, '.+?')
|
||||
next if to !~ /^#{dest}$/
|
||||
from = row[:caller_id]
|
||||
|
@ -62,7 +62,7 @@ class Integration::SipgateController < ApplicationController
|
|||
xml.Dial(callerId: from) { xml.Number(params[:to]) }
|
||||
end
|
||||
break
|
||||
}
|
||||
end
|
||||
if !content && default_caller_id
|
||||
from = default_caller_id
|
||||
content = xml.Response(onHangup: url, onAnswer: url) do
|
||||
|
|
|
@ -12,13 +12,13 @@ class LinksController < ApplicationController
|
|||
|
||||
assets = {}
|
||||
link_list = []
|
||||
links.each { |item|
|
||||
links.each do |item|
|
||||
link_list.push item
|
||||
if item['link_object'] == 'Ticket'
|
||||
ticket = Ticket.lookup(id: item['link_object_value'])
|
||||
assets = ticket.assets(assets)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: {
|
||||
|
|
|
@ -63,9 +63,9 @@ class LongPollingController < ApplicationController
|
|||
begin
|
||||
|
||||
# update last ping
|
||||
4.times {
|
||||
4.times do
|
||||
sleep 0.25
|
||||
}
|
||||
end
|
||||
#sleep 1
|
||||
Sessions.touch(client_id)
|
||||
|
||||
|
@ -82,9 +82,9 @@ class LongPollingController < ApplicationController
|
|||
render json: queue
|
||||
return
|
||||
end
|
||||
8.times {
|
||||
8.times do
|
||||
sleep 0.25
|
||||
}
|
||||
end
|
||||
#sleep 2
|
||||
if count.zero?
|
||||
render json: { event: 'pong' }
|
||||
|
|
|
@ -34,15 +34,15 @@ curl http://localhost/api/v1/monitoring/health_check?token=XXX
|
|||
|
||||
# channel check
|
||||
last_run_tolerance = Time.zone.now - 1.hour
|
||||
Channel.where(active: true).each { |channel|
|
||||
Channel.where(active: true).each do |channel|
|
||||
|
||||
# inbound channel
|
||||
if channel.status_in == 'error'
|
||||
message = "Channel: #{channel.area} in "
|
||||
%w(host user uid).each { |key|
|
||||
%w(host user uid).each do |key|
|
||||
next if !channel.options[key] || channel.options[key].empty?
|
||||
message += "key:#{channel.options[key]};"
|
||||
}
|
||||
end
|
||||
issues.push "#{message} #{channel.last_log_in}"
|
||||
end
|
||||
if channel.preferences && channel.preferences['last_fetch'] && channel.preferences['last_fetch'] < last_run_tolerance
|
||||
|
@ -52,32 +52,32 @@ curl http://localhost/api/v1/monitoring/health_check?token=XXX
|
|||
# outbound channel
|
||||
next if channel.status_out != 'error'
|
||||
message = "Channel: #{channel.area} out "
|
||||
%w(host user uid).each { |key|
|
||||
%w(host user uid).each do |key|
|
||||
next if !channel.options[key] || channel.options[key].empty?
|
||||
message += "key:#{channel.options[key]};"
|
||||
}
|
||||
end
|
||||
issues.push "#{message} #{channel.last_log_out}"
|
||||
}
|
||||
end
|
||||
|
||||
# unprocessable mail check
|
||||
directory = "#{Rails.root}/tmp/unprocessable_mail"
|
||||
if File.exist?(directory)
|
||||
count = 0
|
||||
Dir.glob("#{directory}/*.eml") { |_entry|
|
||||
Dir.glob("#{directory}/*.eml") do |_entry|
|
||||
count += 1
|
||||
}
|
||||
end
|
||||
if count.nonzero?
|
||||
issues.push "unprocessable mails: #{count}"
|
||||
end
|
||||
end
|
||||
|
||||
# scheduler check
|
||||
Scheduler.where(active: true).where.not(last_run: nil).each { |scheduler|
|
||||
Scheduler.where(active: true).where.not(last_run: nil).each do |scheduler|
|
||||
next if scheduler.period <= 300
|
||||
next if scheduler.last_run + scheduler.period.seconds > Time.zone.now - 5.minutes
|
||||
issues.push 'scheduler not running'
|
||||
break
|
||||
}
|
||||
end
|
||||
if Scheduler.where(active: true, last_run: nil).count == Scheduler.where(active: true).count
|
||||
issues.push 'scheduler not running'
|
||||
end
|
||||
|
@ -158,13 +158,13 @@ curl http://localhost/api/v1/monitoring/status?token=XXX
|
|||
tickets: Ticket,
|
||||
ticket_articles: Ticket::Article,
|
||||
}
|
||||
map.each { |key, class_name|
|
||||
map.each do |key, class_name|
|
||||
status[:counts][key] = class_name.count
|
||||
last = class_name.last
|
||||
status[:last_created_at][key] = if last
|
||||
last.created_at
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
render json: status
|
||||
end
|
||||
|
|
|
@ -71,9 +71,9 @@ curl http://localhost/api/v1/organizations -v -u #{login}:#{password}
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
organizations.each { |organization|
|
||||
organizations.each do |organization|
|
||||
list.push organization.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -81,10 +81,10 @@ curl http://localhost/api/v1/organizations -v -u #{login}:#{password}
|
|||
if params[:full]
|
||||
assets = {}
|
||||
item_ids = []
|
||||
organizations.each { |item|
|
||||
organizations.each do |item|
|
||||
item_ids.push item.id
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: item_ids,
|
||||
assets: assets,
|
||||
|
@ -92,9 +92,9 @@ curl http://localhost/api/v1/organizations -v -u #{login}:#{password}
|
|||
return
|
||||
end
|
||||
list = []
|
||||
organizations.each { |organization|
|
||||
organizations.each do |organization|
|
||||
list.push organization.attributes_with_association_ids
|
||||
}
|
||||
end
|
||||
render json: list
|
||||
end
|
||||
|
||||
|
@ -257,9 +257,9 @@ curl http://localhost/api/v1/organization/{id} -v -u #{login}:#{password} -H "Co
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
organization_all.each { |organization|
|
||||
organization_all.each do |organization|
|
||||
list.push organization.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -267,10 +267,10 @@ curl http://localhost/api/v1/organization/{id} -v -u #{login}:#{password} -H "Co
|
|||
# build result list
|
||||
if params[:label]
|
||||
organizations = []
|
||||
organization_all.each { |organization|
|
||||
organization_all.each do |organization|
|
||||
a = { id: organization.id, label: organization.name, value: organization.name }
|
||||
organizations.push a
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: organizations
|
||||
|
@ -280,10 +280,10 @@ curl http://localhost/api/v1/organization/{id} -v -u #{login}:#{password} -H "Co
|
|||
if params[:full]
|
||||
organization_ids = []
|
||||
assets = {}
|
||||
organization_all.each { |organization|
|
||||
organization_all.each do |organization|
|
||||
assets = organization.assets(assets)
|
||||
organization_ids.push organization.id
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: {
|
||||
|
@ -294,9 +294,9 @@ curl http://localhost/api/v1/organization/{id} -v -u #{login}:#{password} -H "Co
|
|||
end
|
||||
|
||||
list = []
|
||||
organization_all.each { |organization|
|
||||
organization_all.each do |organization|
|
||||
list.push organization.attributes_with_association_ids
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
end
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ class ReportsController < ApplicationController
|
|||
return if !get_params
|
||||
|
||||
result = {}
|
||||
get_params[:metric][:backend].each { |backend|
|
||||
get_params[:metric][:backend].each do |backend|
|
||||
condition = get_params[:profile].condition
|
||||
if backend[:condition]
|
||||
backend[:condition].merge(condition)
|
||||
|
@ -40,7 +40,7 @@ class ReportsController < ApplicationController
|
|||
selector: backend[:condition],
|
||||
params: backend[:params],
|
||||
)
|
||||
}
|
||||
end
|
||||
|
||||
#created = aggs(start, stop, range, 'created_at', profile.condition)
|
||||
#closed = aggs(start, stop, range, 'close_at', profile.condition)
|
||||
|
@ -76,7 +76,7 @@ class ReportsController < ApplicationController
|
|||
|
||||
# get data
|
||||
result = {}
|
||||
get_params[:metric][:backend].each { |backend|
|
||||
get_params[:metric][:backend].each do |backend|
|
||||
next if params[:downloadBackendSelected] != backend[:name]
|
||||
condition = get_params[:profile].condition
|
||||
if backend[:condition]
|
||||
|
@ -103,7 +103,7 @@ class ReportsController < ApplicationController
|
|||
type: 'application/vnd.ms-excel',
|
||||
disposition: 'attachment'
|
||||
)
|
||||
}
|
||||
end
|
||||
return if params[:sheet]
|
||||
|
||||
render json: result
|
||||
|
@ -117,10 +117,10 @@ class ReportsController < ApplicationController
|
|||
if params[:profile_id]
|
||||
profile = Report::Profile.find(params[:profile_id])
|
||||
else
|
||||
params[:profiles].each { |profile_id, active|
|
||||
params[:profiles].each do |profile_id, active|
|
||||
next if !active
|
||||
profile = Report::Profile.find(profile_id)
|
||||
}
|
||||
end
|
||||
end
|
||||
if !profile
|
||||
raise Exceptions::UnprocessableEntity, 'No such active profile'
|
||||
|
|
|
@ -29,14 +29,14 @@ class SearchController < ApplicationController
|
|||
# get priorities of result
|
||||
objects_in_order = []
|
||||
objects_in_order_hash = {}
|
||||
objects.each { |object|
|
||||
objects.each do |object|
|
||||
preferences = object.constantize.search_preferences(current_user)
|
||||
next if !preferences
|
||||
objects_in_order_hash[preferences[:prio]] = object
|
||||
}
|
||||
objects_in_order_hash.keys.sort.reverse_each { |prio|
|
||||
end
|
||||
objects_in_order_hash.keys.sort.reverse_each do |prio|
|
||||
objects_in_order.push objects_in_order_hash[prio]
|
||||
}
|
||||
end
|
||||
|
||||
# try search index backend
|
||||
assets = {}
|
||||
|
@ -46,7 +46,7 @@ class SearchController < ApplicationController
|
|||
# get direct search index based objects
|
||||
objects_with_direct_search_index = []
|
||||
objects_without_direct_search_index = []
|
||||
objects.each { |object|
|
||||
objects.each do |object|
|
||||
preferences = object.constantize.search_preferences(current_user)
|
||||
next if !preferences
|
||||
if preferences[:direct_search_index]
|
||||
|
@ -54,48 +54,48 @@ class SearchController < ApplicationController
|
|||
else
|
||||
objects_without_direct_search_index.push object
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# do only one query to index search backend
|
||||
if objects_with_direct_search_index.present?
|
||||
items = SearchIndexBackend.search(query, limit, objects_with_direct_search_index)
|
||||
items.each { |item|
|
||||
items.each do |item|
|
||||
require item[:type].to_filename
|
||||
record = Kernel.const_get(item[:type]).lookup(id: item[:id])
|
||||
next if !record
|
||||
assets = record.assets(assets)
|
||||
result.push item
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# e. g. do ticket query by Ticket class to handle ticket permissions
|
||||
objects_without_direct_search_index.each { |object|
|
||||
objects_without_direct_search_index.each do |object|
|
||||
object_result = search_generic_backend(object, query, limit, current_user, assets)
|
||||
if object_result.present?
|
||||
result = result.concat(object_result)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# sort order by object priority
|
||||
result_in_order = []
|
||||
objects_in_order.each { |object|
|
||||
result.each { |item|
|
||||
objects_in_order.each do |object|
|
||||
result.each do |item|
|
||||
next if item[:type] != object
|
||||
item[:id] = item[:id].to_i
|
||||
result_in_order.push item
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
result = result_in_order
|
||||
|
||||
else
|
||||
|
||||
# do query
|
||||
objects_in_order.each { |object|
|
||||
objects_in_order.each do |object|
|
||||
object_result = search_generic_backend(object, query, limit, current_user, assets)
|
||||
if object_result.present?
|
||||
result = result.concat(object_result)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
render json: {
|
||||
|
|
|
@ -7,9 +7,9 @@ module ExtraCollection
|
|||
collections[ Locale.to_app_model ] = Locale.where(active: true)
|
||||
|
||||
collections[ Taskbar.to_app_model ] = Taskbar.where(user_id: user.id)
|
||||
collections[ Taskbar.to_app_model ].each { |item|
|
||||
collections[ Taskbar.to_app_model ].each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
collections[ OnlineNotification.to_app_model ] = OnlineNotification.list(user, 200)
|
||||
assets = ApplicationModel.assets_of_object_list(collections[ OnlineNotification.to_app_model ], assets)
|
||||
|
@ -18,25 +18,25 @@ module ExtraCollection
|
|||
assets = RecentView.assets_of_object_list(collections[ RecentView.to_app_model ], assets)
|
||||
|
||||
collections[ Permission.to_app_model ] = []
|
||||
Permission.all.each { |item|
|
||||
Permission.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
collections[ Role.to_app_model ] = []
|
||||
Role.all.each { |item|
|
||||
Role.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
collections[ Group.to_app_model ] = []
|
||||
Group.all.each { |item|
|
||||
Group.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
collections[ Organization.to_app_model ] = []
|
||||
if user.organization_id
|
||||
Organization.where(id: user.organization_id).each { |item|
|
||||
Organization.where(id: user.organization_id).each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
[collections, assets]
|
||||
|
|
|
@ -5,42 +5,42 @@ module ExtraCollection
|
|||
|
||||
# all ticket stuff
|
||||
collections[ Macro.to_app_model ] = []
|
||||
Macro.all.each { |item|
|
||||
Macro.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
collections[ Ticket::StateType.to_app_model ] = []
|
||||
Ticket::StateType.all.each { |item|
|
||||
Ticket::StateType.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
collections[ Ticket::State.to_app_model ] = []
|
||||
Ticket::State.all.each { |item|
|
||||
Ticket::State.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
collections[ Ticket::Priority.to_app_model ] = []
|
||||
Ticket::Priority.all.each { |item|
|
||||
Ticket::Priority.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
collections[ Ticket::Article::Type.to_app_model ] = []
|
||||
Ticket::Article::Type.all.each { |item|
|
||||
Ticket::Article::Type.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
collections[ Ticket::Article::Sender.to_app_model ] = []
|
||||
Ticket::Article::Sender.all.each { |item|
|
||||
Ticket::Article::Sender.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
if user.permissions?(['ticket.agent', 'admin.channel_email'])
|
||||
|
||||
# all signatures
|
||||
collections[ Signature.to_app_model ] = []
|
||||
Signature.all.each { |item|
|
||||
Signature.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
# all email addresses
|
||||
collections[ EmailAddress.to_app_model ] = []
|
||||
EmailAddress.all.each { |item|
|
||||
EmailAddress.all.each do |item|
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
end
|
||||
[collections, assets]
|
||||
end
|
||||
|
|
|
@ -281,14 +281,14 @@ class SessionsController < ApplicationController
|
|||
permission_check('admin.session')
|
||||
assets = {}
|
||||
sessions_clean = []
|
||||
SessionHelper.list.each { |session|
|
||||
SessionHelper.list.each do |session|
|
||||
next if session.data['user_id'].blank?
|
||||
sessions_clean.push session
|
||||
next if session.data['user_id']
|
||||
user = User.lookup(id: session.data['user_id'])
|
||||
next if !user
|
||||
assets = user.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
sessions: sessions_clean,
|
||||
assets: assets,
|
||||
|
@ -307,12 +307,12 @@ class SessionsController < ApplicationController
|
|||
|
||||
# config
|
||||
config = {}
|
||||
Setting.select('name, preferences').where(frontend: true).each { |setting|
|
||||
Setting.select('name, preferences').where(frontend: true).each do |setting|
|
||||
next if setting.preferences[:authentication] == true && !current_user
|
||||
value = Setting.get(setting.name)
|
||||
next if !current_user && (value == false || value.nil?)
|
||||
config[setting.name] = value
|
||||
}
|
||||
end
|
||||
|
||||
# remember if we can to swich back to user
|
||||
if session[:switched_from_user_id]
|
||||
|
|
|
@ -6,10 +6,10 @@ class SettingsController < ApplicationController
|
|||
# GET /settings
|
||||
def index
|
||||
list = []
|
||||
Setting.all.each { |setting|
|
||||
Setting.all.each do |setting|
|
||||
next if setting.preferences[:permission] && !current_user.permissions?(setting.preferences[:permission])
|
||||
list.push setting
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
end
|
||||
|
||||
|
@ -93,13 +93,13 @@ class SettingsController < ApplicationController
|
|||
|
||||
def keep_certain_attributes
|
||||
setting = Setting.find(params[:id])
|
||||
[:name, :area, :state_initial, :frontend, :options].each { |key|
|
||||
[:name, :area, :state_initial, :frontend, :options].each do |key|
|
||||
params.delete(key)
|
||||
}
|
||||
end
|
||||
if !params[:preferences].empty?
|
||||
[:online_service_disable, :permission, :render].each { |key|
|
||||
[:online_service_disable, :permission, :render].each do |key|
|
||||
params[:preferences].delete(key)
|
||||
}
|
||||
end
|
||||
params[:preferences].merge!(setting.preferences)
|
||||
end
|
||||
params
|
||||
|
|
|
@ -53,16 +53,16 @@ curl http://localhost/api/v1/slas.json -v -u #{login}:#{password}
|
|||
# calendars
|
||||
assets = {}
|
||||
calendar_ids = []
|
||||
Calendar.all.each { |calendar|
|
||||
Calendar.all.each do |calendar|
|
||||
assets = calendar.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
# slas
|
||||
sla_ids = []
|
||||
Sla.all.each { |item|
|
||||
Sla.all.each do |item|
|
||||
sla_ids.push item.id
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: sla_ids,
|
||||
assets: assets,
|
||||
|
|
|
@ -7,13 +7,13 @@ class TagsController < ApplicationController
|
|||
def search
|
||||
list = Tag::Item.where('name_downcase LIKE ?', "#{params[:term].strip.downcase}%").order('name ASC').limit(params[:limit] || 10)
|
||||
results = []
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
result = {
|
||||
id: item.id,
|
||||
value: item.name,
|
||||
}
|
||||
results.push result
|
||||
}
|
||||
end
|
||||
render json: results
|
||||
end
|
||||
|
||||
|
@ -63,14 +63,14 @@ class TagsController < ApplicationController
|
|||
permission_check('admin.tag')
|
||||
list = Tag::Item.order('name ASC').limit(params[:limit] || 1000)
|
||||
results = []
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
result = {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
count: Tag.where(tag_item_id: item.id).count
|
||||
}
|
||||
results.push result
|
||||
}
|
||||
end
|
||||
render json: results
|
||||
end
|
||||
|
||||
|
|
|
@ -39,13 +39,13 @@ class TicketArticlesController < ApplicationController
|
|||
articles = []
|
||||
|
||||
if params[:expand]
|
||||
ticket.articles.each { |article|
|
||||
ticket.articles.each do |article|
|
||||
|
||||
# ignore internal article if customer is requesting
|
||||
next if article.internal == true && current_user.permissions?('ticket.customer')
|
||||
result = article.attributes_with_association_names
|
||||
articles.push result
|
||||
}
|
||||
end
|
||||
|
||||
render json: articles, status: :ok
|
||||
return
|
||||
|
@ -54,14 +54,14 @@ class TicketArticlesController < ApplicationController
|
|||
if params[:full]
|
||||
assets = {}
|
||||
record_ids = []
|
||||
ticket.articles.each { |article|
|
||||
ticket.articles.each do |article|
|
||||
|
||||
# ignore internal article if customer is requesting
|
||||
next if article.internal == true && current_user.permissions?('ticket.customer')
|
||||
|
||||
record_ids.push article.id
|
||||
assets = article.assets({})
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: record_ids,
|
||||
assets: assets,
|
||||
|
@ -69,12 +69,12 @@ class TicketArticlesController < ApplicationController
|
|||
return
|
||||
end
|
||||
|
||||
ticket.articles.each { |article|
|
||||
ticket.articles.each do |article|
|
||||
|
||||
# ignore internal article if customer is requesting
|
||||
next if article.internal == true && current_user.permissions?('ticket.customer')
|
||||
articles.push article.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: articles
|
||||
end
|
||||
|
||||
|
@ -224,11 +224,11 @@ class TicketArticlesController < ApplicationController
|
|||
|
||||
list = article.attachments || []
|
||||
access = false
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
if item.id.to_i == params[:id].to_i
|
||||
access = true
|
||||
end
|
||||
}
|
||||
end
|
||||
raise Exceptions::NotAuthorized, 'Requested file id is not linked with article_id.' if !access
|
||||
|
||||
# find file
|
||||
|
|
|
@ -12,7 +12,7 @@ class TicketOverviewsController < ApplicationController
|
|||
if !params[:view]
|
||||
index_and_lists = Ticket::Overviews.index(current_user)
|
||||
indexes = []
|
||||
index_and_lists.each { |index|
|
||||
index_and_lists.each do |index|
|
||||
assets = {}
|
||||
overview = Overview.lookup(id: index[:overview][:id])
|
||||
meta = {
|
||||
|
@ -22,7 +22,7 @@ class TicketOverviewsController < ApplicationController
|
|||
count: index[:count],
|
||||
}
|
||||
indexes.push meta
|
||||
}
|
||||
end
|
||||
render json: indexes
|
||||
return
|
||||
end
|
||||
|
@ -31,17 +31,17 @@ class TicketOverviewsController < ApplicationController
|
|||
|
||||
assets = {}
|
||||
result = {}
|
||||
index_and_lists.each { |index|
|
||||
index_and_lists.each do |index|
|
||||
next if index[:overview][:view] != params[:view]
|
||||
|
||||
overview = Overview.lookup(id: index[:overview][:id])
|
||||
assets = overview.assets(assets)
|
||||
index[:tickets].each { |ticket_meta|
|
||||
index[:tickets].each do |ticket_meta|
|
||||
ticket = Ticket.lookup(id: ticket_meta[:id])
|
||||
assets = ticket.assets(assets)
|
||||
}
|
||||
end
|
||||
result = index
|
||||
}
|
||||
end
|
||||
|
||||
render json: {
|
||||
assets: assets,
|
||||
|
|
|
@ -25,9 +25,9 @@ class TicketsController < ApplicationController
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
tickets.each { |ticket|
|
||||
tickets.each do |ticket|
|
||||
list.push ticket.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -35,10 +35,10 @@ class TicketsController < ApplicationController
|
|||
if params[:full]
|
||||
assets = {}
|
||||
item_ids = []
|
||||
tickets.each { |item|
|
||||
tickets.each do |item|
|
||||
item_ids.push item.id
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: item_ids,
|
||||
assets: assets,
|
||||
|
@ -80,9 +80,9 @@ class TicketsController < ApplicationController
|
|||
|
||||
# overwrite params
|
||||
if !current_user.permissions?('ticket.agent')
|
||||
[:owner, :owner_id, :customer, :customer_id, :organization, :organization_id, :preferences].each { |key|
|
||||
[:owner, :owner_id, :customer, :customer_id, :organization, :organization_id, :preferences].each do |key|
|
||||
clean_params.delete(key)
|
||||
}
|
||||
end
|
||||
clean_params[:customer_id] = current_user.id
|
||||
end
|
||||
|
||||
|
@ -124,9 +124,9 @@ class TicketsController < ApplicationController
|
|||
# create tags if given
|
||||
if params[:tags].present?
|
||||
tags = params[:tags].split(/,/)
|
||||
tags.each { |tag|
|
||||
tags.each do |tag|
|
||||
ticket.tag_add(tag)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# create article if given
|
||||
|
@ -145,11 +145,11 @@ class TicketsController < ApplicationController
|
|||
if params[:links].present?
|
||||
link = params[:links].permit!.to_h
|
||||
raise Exceptions::UnprocessableEntity, 'Invalid link structure' if !link.is_a? Hash
|
||||
link.each { |target_object, link_types_with_object_ids|
|
||||
link.each do |target_object, link_types_with_object_ids|
|
||||
raise Exceptions::UnprocessableEntity, 'Invalid link structure (Object)' if !link_types_with_object_ids.is_a? Hash
|
||||
link_types_with_object_ids.each { |link_type, object_ids|
|
||||
link_types_with_object_ids.each do |link_type, object_ids|
|
||||
raise Exceptions::UnprocessableEntity, 'Invalid link structure (Object->LinkType)' if !object_ids.is_a? Array
|
||||
object_ids.each { |local_object_id|
|
||||
object_ids.each do |local_object_id|
|
||||
link = Link.add(
|
||||
link_type: link_type,
|
||||
link_object_target: target_object,
|
||||
|
@ -157,9 +157,9 @@ class TicketsController < ApplicationController
|
|||
link_object_source: 'Ticket',
|
||||
link_object_source_value: ticket.id,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if params[:expand]
|
||||
|
@ -186,9 +186,9 @@ class TicketsController < ApplicationController
|
|||
|
||||
# overwrite params
|
||||
if !current_user.permissions?('ticket.agent')
|
||||
[:owner, :owner_id, :customer, :customer_id, :organization, :organization_id, :preferences].each { |key|
|
||||
[:owner, :owner_id, :customer, :customer_id, :organization, :organization_id, :preferences].each do |key|
|
||||
clean_params.delete(key)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
ticket.with_lock do
|
||||
|
@ -285,20 +285,20 @@ class TicketsController < ApplicationController
|
|||
|
||||
# get related assets
|
||||
ticket_ids_by_customer = []
|
||||
ticket_lists.each { |ticket_list|
|
||||
ticket_lists.each do |ticket_list|
|
||||
ticket_ids_by_customer.push ticket_list.id
|
||||
assets = ticket_list.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
ticket_ids_recent_viewed = []
|
||||
recent_views = RecentView.list(current_user, 8, 'Ticket').delete_if { |object| object['o_id'] == ticket.id }
|
||||
recent_views.each { |recent_view|
|
||||
recent_views.each do |recent_view|
|
||||
next if recent_view['object'] != 'Ticket'
|
||||
ticket_ids_recent_viewed.push recent_view['o_id']
|
||||
recent_view_ticket = Ticket.find(recent_view['o_id'])
|
||||
next if recent_view_ticket.state.state_type.name == 'merged'
|
||||
assets = recent_view_ticket.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: {
|
||||
|
@ -405,9 +405,9 @@ class TicketsController < ApplicationController
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
tickets.each { |ticket|
|
||||
tickets.each do |ticket|
|
||||
list.push ticket.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -490,9 +490,9 @@ class TicketsController < ApplicationController
|
|||
},
|
||||
},
|
||||
}
|
||||
conditions.each { |key, local_condition|
|
||||
conditions.each do |key, local_condition|
|
||||
user_tickets[key] = ticket_ids_and_assets(local_condition, current_user, limit, assets)
|
||||
}
|
||||
end
|
||||
|
||||
# generate stats by user
|
||||
condition = {
|
||||
|
@ -531,9 +531,9 @@ class TicketsController < ApplicationController
|
|||
},
|
||||
},
|
||||
}
|
||||
conditions.each { |key, local_condition|
|
||||
conditions.each do |key, local_condition|
|
||||
org_tickets[key] = ticket_ids_and_assets(local_condition, current_user, limit, assets)
|
||||
}
|
||||
end
|
||||
|
||||
# generate stats by org
|
||||
condition = {
|
||||
|
@ -566,14 +566,14 @@ class TicketsController < ApplicationController
|
|||
|
||||
# get related users
|
||||
article_ids = []
|
||||
ticket.articles.each { |article|
|
||||
ticket.articles.each do |article|
|
||||
|
||||
# ignore internal article if customer is requesting
|
||||
next if article.internal == true && current_user.permissions?('ticket.customer')
|
||||
|
||||
article_ids.push article.id
|
||||
assets = article.assets(assets)
|
||||
}
|
||||
end
|
||||
|
||||
# get links
|
||||
links = Link.list(
|
||||
|
@ -581,13 +581,13 @@ class TicketsController < ApplicationController
|
|||
link_object_value: ticket.id,
|
||||
)
|
||||
link_list = []
|
||||
links.each { |item|
|
||||
links.each do |item|
|
||||
link_list.push item
|
||||
if item['link_object'] == 'Ticket'
|
||||
linked_ticket = Ticket.lookup(id: item['link_object_value'])
|
||||
assets = linked_ticket.assets(assets)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# get tags
|
||||
tags = ticket.tag_list
|
||||
|
|
|
@ -12,7 +12,7 @@ class TimeAccountingsController < ApplicationController
|
|||
end_periode = start_periode.end_of_month
|
||||
|
||||
time_unit = {}
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each { |record|
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each do |record|
|
||||
if !time_unit[record[0]]
|
||||
time_unit[record[0]] = {
|
||||
time_unit: 0,
|
||||
|
@ -20,12 +20,12 @@ class TimeAccountingsController < ApplicationController
|
|||
}
|
||||
end
|
||||
time_unit[record[0]][:time_unit] += record[1]
|
||||
}
|
||||
end
|
||||
customers = {}
|
||||
organizations = {}
|
||||
agents = {}
|
||||
results = []
|
||||
time_unit.each { |ticket_id, local_time_unit|
|
||||
time_unit.each do |ticket_id, local_time_unit|
|
||||
ticket = Ticket.lookup(id: ticket_id)
|
||||
next if !ticket
|
||||
if !customers[ticket.customer_id]
|
||||
|
@ -61,7 +61,7 @@ class TimeAccountingsController < ApplicationController
|
|||
agent: agents[local_time_unit[:agent_id]],
|
||||
}
|
||||
results.push result
|
||||
}
|
||||
end
|
||||
|
||||
if params[:download]
|
||||
header = [
|
||||
|
@ -163,13 +163,13 @@ class TimeAccountingsController < ApplicationController
|
|||
},
|
||||
]
|
||||
result = []
|
||||
results.each { |row|
|
||||
row[:ticket].keys.each { |field|
|
||||
results.each do |row|
|
||||
row[:ticket].keys.each do |field|
|
||||
next if row[:ticket][field].blank?
|
||||
next if !row[:ticket][field].is_a?(ActiveSupport::TimeWithZone)
|
||||
|
||||
row[:ticket][field] = row[:ticket][field].iso8601
|
||||
}
|
||||
end
|
||||
|
||||
result_row = [
|
||||
row[:ticket]['number'],
|
||||
|
@ -198,7 +198,7 @@ class TimeAccountingsController < ApplicationController
|
|||
row[:ticket]['escalation_at'],
|
||||
]
|
||||
result.push result_row
|
||||
}
|
||||
end
|
||||
content = sheet("By Ticket #{year}-#{month}", header, result)
|
||||
send_data(
|
||||
content,
|
||||
|
@ -221,7 +221,7 @@ class TimeAccountingsController < ApplicationController
|
|||
end_periode = start_periode.end_of_month
|
||||
|
||||
time_unit = {}
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each { |record|
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each do |record|
|
||||
if !time_unit[record[0]]
|
||||
time_unit[record[0]] = {
|
||||
time_unit: 0,
|
||||
|
@ -229,10 +229,10 @@ class TimeAccountingsController < ApplicationController
|
|||
}
|
||||
end
|
||||
time_unit[record[0]][:time_unit] += record[1]
|
||||
}
|
||||
end
|
||||
|
||||
customers = {}
|
||||
time_unit.each { |ticket_id, local_time_unit|
|
||||
time_unit.each do |ticket_id, local_time_unit|
|
||||
ticket = Ticket.lookup(id: ticket_id)
|
||||
next if !ticket
|
||||
if !customers[ticket.customer_id]
|
||||
|
@ -248,11 +248,11 @@ class TimeAccountingsController < ApplicationController
|
|||
next
|
||||
end
|
||||
customers[ticket.customer_id][:time_unit] += local_time_unit[:time_unit]
|
||||
}
|
||||
end
|
||||
results = []
|
||||
customers.each { |_customer_id, content|
|
||||
customers.each do |_customer_id, content|
|
||||
results.push content
|
||||
}
|
||||
end
|
||||
|
||||
if params[:download]
|
||||
header = [
|
||||
|
@ -270,7 +270,7 @@ class TimeAccountingsController < ApplicationController
|
|||
}
|
||||
]
|
||||
result = []
|
||||
results.each { |row|
|
||||
results.each do |row|
|
||||
customer_name = User.find(row[:customer]['id']).fullname
|
||||
organization_name = ''
|
||||
if row[:organization].present?
|
||||
|
@ -278,7 +278,7 @@ class TimeAccountingsController < ApplicationController
|
|||
end
|
||||
result_row = [customer_name, organization_name, row[:time_unit]]
|
||||
result.push result_row
|
||||
}
|
||||
end
|
||||
content = sheet("By Customer #{year}-#{month}", header, result)
|
||||
send_data(
|
||||
content,
|
||||
|
@ -301,7 +301,7 @@ class TimeAccountingsController < ApplicationController
|
|||
end_periode = start_periode.end_of_month
|
||||
|
||||
time_unit = {}
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each { |record|
|
||||
Ticket::TimeAccounting.where('created_at >= ? AND created_at <= ?', start_periode, end_periode).pluck(:ticket_id, :time_unit, :created_by_id).each do |record|
|
||||
if !time_unit[record[0]]
|
||||
time_unit[record[0]] = {
|
||||
time_unit: 0,
|
||||
|
@ -309,10 +309,10 @@ class TimeAccountingsController < ApplicationController
|
|||
}
|
||||
end
|
||||
time_unit[record[0]][:time_unit] += record[1]
|
||||
}
|
||||
end
|
||||
|
||||
organizations = {}
|
||||
time_unit.each { |ticket_id, local_time_unit|
|
||||
time_unit.each do |ticket_id, local_time_unit|
|
||||
ticket = Ticket.lookup(id: ticket_id)
|
||||
next if !ticket
|
||||
next if !ticket.organization_id
|
||||
|
@ -324,11 +324,11 @@ class TimeAccountingsController < ApplicationController
|
|||
next
|
||||
end
|
||||
organizations[ticket.organization_id][:time_unit] += local_time_unit[:time_unit]
|
||||
}
|
||||
end
|
||||
results = []
|
||||
organizations.each { |_customer_id, content|
|
||||
organizations.each do |_customer_id, content|
|
||||
results.push content
|
||||
}
|
||||
end
|
||||
|
||||
if params[:download]
|
||||
header = [
|
||||
|
@ -342,14 +342,14 @@ class TimeAccountingsController < ApplicationController
|
|||
}
|
||||
]
|
||||
result = []
|
||||
results.each { |row|
|
||||
results.each do |row|
|
||||
organization_name = ''
|
||||
if row[:organization].present?
|
||||
organization_name = row[:organization]['name']
|
||||
end
|
||||
result_row = [organization_name, row[:time_unit]]
|
||||
result.push result_row
|
||||
}
|
||||
end
|
||||
content = sheet("By Organization #{year}-#{month}", header, result)
|
||||
send_data(
|
||||
content,
|
||||
|
@ -389,23 +389,23 @@ class TimeAccountingsController < ApplicationController
|
|||
format_header.set_bg_color('gray')
|
||||
format_header.set_color('white')
|
||||
count = 0
|
||||
header.each { |item|
|
||||
header.each do |item|
|
||||
if item[:width]
|
||||
worksheet.set_column(count, count, item[:width])
|
||||
end
|
||||
worksheet.write(2, count, item[:name], format_header)
|
||||
count += 1
|
||||
}
|
||||
end
|
||||
|
||||
row_count = 2
|
||||
result.each { |row|
|
||||
result.each do |row|
|
||||
row_count += 1
|
||||
row_item_count = 0
|
||||
row.each { |item|
|
||||
row.each do |item|
|
||||
worksheet.write(row_count, row_item_count, item)
|
||||
row_item_count += 1
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
workbook.close
|
||||
|
||||
|
|
|
@ -6,34 +6,34 @@ class UserAccessTokenController < ApplicationController
|
|||
def index
|
||||
tokens = Token.where(action: 'api', persistent: true, user_id: current_user.id).order('updated_at DESC, label ASC')
|
||||
token_list = []
|
||||
tokens.each { |token|
|
||||
tokens.each do |token|
|
||||
attributes = token.attributes
|
||||
attributes.delete('persistent')
|
||||
attributes.delete('name')
|
||||
token_list.push attributes
|
||||
}
|
||||
end
|
||||
local_permissions = current_user.permissions
|
||||
local_permissions_new = {}
|
||||
local_permissions.each { |key, _value|
|
||||
local_permissions.each do |key, _value|
|
||||
keys = Object.const_get('Permission').with_parents(key)
|
||||
keys.each { |local_key|
|
||||
keys.each do |local_key|
|
||||
next if local_permissions_new.key?([local_key])
|
||||
if local_permissions[local_key] == true
|
||||
local_permissions_new[local_key] = true
|
||||
next
|
||||
end
|
||||
local_permissions_new[local_key] = false
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
permissions = []
|
||||
Permission.all.where(active: true).order(:name).each { |permission|
|
||||
Permission.all.where(active: true).order(:name).each do |permission|
|
||||
next if !local_permissions_new.key?(permission.name) && !current_user.permissions?(permission.name)
|
||||
permission_attributes = permission.attributes
|
||||
if local_permissions_new[permission.name] == false
|
||||
permission_attributes['preferences']['disabled'] = true
|
||||
end
|
||||
permissions.push permission_attributes
|
||||
}
|
||||
end
|
||||
|
||||
render json: {
|
||||
tokens: token_list,
|
||||
|
|
|
@ -6,7 +6,7 @@ class UserDevicesController < ApplicationController
|
|||
def index
|
||||
devices = UserDevice.where(user_id: current_user.id).order('updated_at DESC, name ASC')
|
||||
devices_full = []
|
||||
devices.each { |device|
|
||||
devices.each do |device|
|
||||
attributes = device.attributes
|
||||
if device.location_details['city_name'] && !device.location_details['city_name'].empty?
|
||||
attributes['location'] += ", #{device.location_details['city_name']}"
|
||||
|
@ -21,7 +21,7 @@ class UserDevicesController < ApplicationController
|
|||
attributes['current'] = true
|
||||
end
|
||||
devices_full.push attributes
|
||||
}
|
||||
end
|
||||
model_index_render_result(devices_full)
|
||||
end
|
||||
|
||||
|
@ -32,12 +32,12 @@ class UserDevicesController < ApplicationController
|
|||
|
||||
# delete device and session's
|
||||
if user_device
|
||||
SessionHelper.list.each { |session|
|
||||
SessionHelper.list.each do |session|
|
||||
next if !session.data['user_id']
|
||||
next if !session.data['user_device_id']
|
||||
next if session.data['user_device_id'] != user_device.id
|
||||
SessionHelper.destroy( session.id )
|
||||
}
|
||||
end
|
||||
user_device.destroy
|
||||
end
|
||||
render json: {}, status: :ok
|
||||
|
|
|
@ -34,9 +34,9 @@ class UsersController < ApplicationController
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
list.push user.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -44,10 +44,10 @@ class UsersController < ApplicationController
|
|||
if params[:full]
|
||||
assets = {}
|
||||
item_ids = []
|
||||
users.each { |item|
|
||||
users.each do |item|
|
||||
item_ids.push item.id
|
||||
assets = item.assets(assets)
|
||||
}
|
||||
end
|
||||
render json: {
|
||||
record_ids: item_ids,
|
||||
assets: assets,
|
||||
|
@ -56,9 +56,9 @@ class UsersController < ApplicationController
|
|||
end
|
||||
|
||||
users_all = []
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
users_all.push User.lookup(id: user.id).attributes_with_association_ids
|
||||
}
|
||||
end
|
||||
render json: users_all, status: :ok
|
||||
end
|
||||
|
||||
|
@ -145,12 +145,12 @@ class UsersController < ApplicationController
|
|||
group_ids = []
|
||||
role_ids = []
|
||||
if count <= 2
|
||||
Role.where(name: %w(Admin Agent)).each { |role|
|
||||
Role.where(name: %w(Admin Agent)).each do |role|
|
||||
role_ids.push role.id
|
||||
}
|
||||
Group.all().each { |group|
|
||||
end
|
||||
Group.all().each do |group|
|
||||
group_ids.push group.id
|
||||
}
|
||||
end
|
||||
|
||||
# everybody else will go as customer per default
|
||||
else
|
||||
|
@ -384,9 +384,9 @@ class UsersController < ApplicationController
|
|||
|
||||
if params[:expand]
|
||||
list = []
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
list.push user.attributes_with_association_names
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
return
|
||||
end
|
||||
|
@ -394,14 +394,14 @@ class UsersController < ApplicationController
|
|||
# build result list
|
||||
if params[:label]
|
||||
users = []
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
realname = user.firstname.to_s + ' ' + user.lastname.to_s
|
||||
if user.email && user.email.to_s != ''
|
||||
realname = realname + ' <' + user.email.to_s + '>'
|
||||
end
|
||||
a = { id: user.id, label: realname, value: realname }
|
||||
users.push a
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: users
|
||||
|
@ -411,10 +411,10 @@ class UsersController < ApplicationController
|
|||
if params[:full]
|
||||
user_ids = []
|
||||
assets = {}
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
assets = user.assets(assets)
|
||||
user_ids.push user.id
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: {
|
||||
|
@ -425,9 +425,9 @@ class UsersController < ApplicationController
|
|||
end
|
||||
|
||||
list = []
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
list.push user.attributes_with_association_ids
|
||||
}
|
||||
end
|
||||
render json: list, status: :ok
|
||||
end
|
||||
|
||||
|
@ -464,14 +464,14 @@ class UsersController < ApplicationController
|
|||
# build result list
|
||||
if !params[:full]
|
||||
users = []
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
realname = user.firstname.to_s + ' ' + user.lastname.to_s
|
||||
if user.email && user.email.to_s != ''
|
||||
realname = realname + ' <' + user.email.to_s + '>'
|
||||
end
|
||||
a = { id: user.id, label: realname, value: realname }
|
||||
users.push a
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: users
|
||||
|
@ -480,10 +480,10 @@ class UsersController < ApplicationController
|
|||
|
||||
user_ids = []
|
||||
assets = {}
|
||||
user_all.each { |user|
|
||||
user_all.each do |user|
|
||||
assets = user.assets(assets)
|
||||
user_ids.push user.id
|
||||
}
|
||||
end
|
||||
|
||||
# return result
|
||||
render json: {
|
||||
|
@ -806,9 +806,9 @@ curl http://localhost/api/v1/users/preferences -v -u #{login}:#{password} -H "Co
|
|||
if params[:user]
|
||||
user = User.find(current_user.id)
|
||||
user.with_lock do
|
||||
params[:user].each { |key, value|
|
||||
params[:user].each do |key, value|
|
||||
user.preferences[key.to_sym] = value
|
||||
}
|
||||
end
|
||||
user.save!
|
||||
end
|
||||
end
|
||||
|
|
|
@ -33,13 +33,13 @@ returns
|
|||
|
||||
return data if !self['created_by_id'] && !self['updated_by_id']
|
||||
app_model_user = User.to_app_model
|
||||
%w(created_by_id updated_by_id).each { |local_user_id|
|
||||
%w(created_by_id updated_by_id).each do |local_user_id|
|
||||
next if !self[ local_user_id ]
|
||||
next if data[ app_model_user ] && data[ app_model_user ][ self[ local_user_id ] ]
|
||||
user = User.lookup(id: self[ local_user_id ])
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
|
||||
|
@ -57,7 +57,7 @@ get assets and record_ids of selector
|
|||
|
||||
# get assets of condition
|
||||
models = Models.all
|
||||
send(selector).each { |item, content|
|
||||
send(selector).each do |item, content|
|
||||
attribute = item.split(/\./)
|
||||
next if !attribute[1]
|
||||
begin
|
||||
|
@ -74,19 +74,19 @@ get assets and record_ids of selector
|
|||
next if !models[attribute_class][:reflections][reflection].klass
|
||||
attribute_ref_class = models[attribute_class][:reflections][reflection].klass
|
||||
if content['value'].instance_of?(Array)
|
||||
content['value'].each { |item_id|
|
||||
content['value'].each do |item_id|
|
||||
attribute_object = attribute_ref_class.find_by(id: item_id)
|
||||
if attribute_object
|
||||
assets = attribute_object.assets(assets)
|
||||
end
|
||||
}
|
||||
end
|
||||
else
|
||||
attribute_object = attribute_ref_class.find_by(id: content['value'])
|
||||
if attribute_object
|
||||
assets = attribute_object.assets(assets)
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
assets
|
||||
end
|
||||
|
||||
|
@ -134,7 +134,7 @@ get assets of object list
|
|||
=end
|
||||
|
||||
def assets_of_object_list(list, assets = {})
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
require item['object'].to_filename
|
||||
record = Kernel.const_get(item['object']).find(item['o_id'])
|
||||
assets = record.assets(assets)
|
||||
|
@ -146,7 +146,7 @@ get assets of object list
|
|||
user = User.find(item['updated_by_id'])
|
||||
assets = user.assets(assets)
|
||||
end
|
||||
}
|
||||
end
|
||||
assets
|
||||
end
|
||||
end
|
||||
|
|
|
@ -29,7 +29,7 @@ returns
|
|||
end
|
||||
|
||||
# set relations by id/verify if ref exists
|
||||
self.class.reflect_on_all_associations.map { |assoc|
|
||||
self.class.reflect_on_all_associations.map do |assoc|
|
||||
assoc_name = assoc.name
|
||||
next if association_attributes_ignored.include?(assoc_name)
|
||||
real_ids = assoc_name[0, assoc_name.length - 1] + '_ids'
|
||||
|
@ -40,7 +40,7 @@ returns
|
|||
list_of_items = [ params[real_ids] ]
|
||||
end
|
||||
list = []
|
||||
list_of_items.each { |item_id|
|
||||
list_of_items.each do |item_id|
|
||||
next if !item_id
|
||||
lookup = assoc.klass.lookup(id: item_id)
|
||||
|
||||
|
@ -49,12 +49,12 @@ returns
|
|||
raise ArgumentError, "No value found for '#{assoc_name}' with id #{item_id.inspect}"
|
||||
end
|
||||
list.push item_id
|
||||
}
|
||||
end
|
||||
send("#{real_ids}=", list)
|
||||
}
|
||||
end
|
||||
|
||||
# set relations by name/lookup
|
||||
self.class.reflect_on_all_associations.map { |assoc|
|
||||
self.class.reflect_on_all_associations.map do |assoc|
|
||||
assoc_name = assoc.name
|
||||
next if association_attributes_ignored.include?(assoc_name)
|
||||
real_ids = assoc_name[0, assoc_name.length - 1] + '_ids'
|
||||
|
@ -66,7 +66,7 @@ returns
|
|||
next if !params[real_values].instance_of?(Array)
|
||||
list = []
|
||||
class_object = assoc.klass
|
||||
params[real_values].each { |value|
|
||||
params[real_values].each do |value|
|
||||
lookup = nil
|
||||
if class_object == User
|
||||
if !lookup
|
||||
|
@ -84,9 +84,9 @@ returns
|
|||
raise ArgumentError, "No lookup value found for '#{assoc_name}': #{value.inspect}"
|
||||
end
|
||||
list.push lookup.id
|
||||
}
|
||||
end
|
||||
send("#{real_ids}=", list)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -110,12 +110,12 @@ returns
|
|||
|
||||
# get relations
|
||||
attributes = self.attributes
|
||||
self.class.reflect_on_all_associations.map { |assoc|
|
||||
self.class.reflect_on_all_associations.map do |assoc|
|
||||
next if association_attributes_ignored.include?(assoc.name)
|
||||
real_ids = assoc.name.to_s[0, assoc.name.to_s.length - 1] + '_ids'
|
||||
next if !respond_to?(real_ids)
|
||||
attributes[real_ids] = send(real_ids)
|
||||
}
|
||||
end
|
||||
|
||||
# special handling for group access associations
|
||||
if respond_to?(:group_ids_access_map)
|
||||
|
@ -145,21 +145,21 @@ returns
|
|||
|
||||
# get relations
|
||||
attributes = attributes_with_association_ids
|
||||
self.class.reflect_on_all_associations.map { |assoc|
|
||||
self.class.reflect_on_all_associations.map do |assoc|
|
||||
next if !respond_to?(assoc.name)
|
||||
next if association_attributes_ignored.include?(assoc.name)
|
||||
ref = send(assoc.name)
|
||||
next if !ref
|
||||
if ref.respond_to?(:first)
|
||||
attributes[assoc.name.to_s] = []
|
||||
ref.each { |item|
|
||||
ref.each do |item|
|
||||
if item[:login]
|
||||
attributes[assoc.name.to_s].push item[:login]
|
||||
next
|
||||
end
|
||||
next if !item[:name]
|
||||
attributes[assoc.name.to_s].push item[:name]
|
||||
}
|
||||
end
|
||||
if ref.count.positive? && attributes[assoc.name.to_s].empty?
|
||||
attributes.delete(assoc.name.to_s)
|
||||
end
|
||||
|
@ -171,7 +171,7 @@ returns
|
|||
end
|
||||
next if !ref[:name]
|
||||
attributes[assoc.name.to_s] = ref[:name]
|
||||
}
|
||||
end
|
||||
|
||||
# special handling for group access associations
|
||||
if respond_to?(:group_names_access_map)
|
||||
|
@ -182,12 +182,12 @@ returns
|
|||
{
|
||||
'created_by_id' => 'created_by',
|
||||
'updated_by_id' => 'updated_by',
|
||||
}.each { |source, destination|
|
||||
}.each do |source, destination|
|
||||
next if !attributes[source]
|
||||
user = User.lookup(id: attributes[source])
|
||||
next if !user
|
||||
attributes[destination] = user.login
|
||||
}
|
||||
end
|
||||
|
||||
filter_attributes(attributes)
|
||||
|
||||
|
@ -196,9 +196,9 @@ returns
|
|||
|
||||
def filter_attributes(attributes)
|
||||
# remove forbitten attributes
|
||||
%w(password token tokens token_ids).each { |item|
|
||||
%w(password token tokens token_ids).each do |item|
|
||||
attributes.delete(item)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -217,22 +217,22 @@ returns
|
|||
def association_id_validation(attribute_id, value)
|
||||
return true if value.nil?
|
||||
|
||||
attributes.each { |key, _value|
|
||||
attributes.each do |key, _value|
|
||||
next if key != attribute_id
|
||||
|
||||
# check if id is assigned
|
||||
next if !key.end_with?('_id')
|
||||
key_short = key.chomp('_id')
|
||||
|
||||
self.class.reflect_on_all_associations.map { |assoc|
|
||||
self.class.reflect_on_all_associations.map do |assoc|
|
||||
next if assoc.name.to_s != key_short
|
||||
item = assoc.class_name.constantize
|
||||
return false if !item.respond_to?(:find_by)
|
||||
ref_object = item.find_by(id: value)
|
||||
return false if !ref_object
|
||||
return true
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -298,13 +298,13 @@ returns
|
|||
end
|
||||
|
||||
data = {}
|
||||
params.each { |key, value|
|
||||
params.each do |key, value|
|
||||
data[key.to_sym] = value
|
||||
}
|
||||
end
|
||||
|
||||
data.symbolize_keys!
|
||||
available_attributes = attribute_names
|
||||
reflect_on_all_associations.map { |assoc|
|
||||
reflect_on_all_associations.map do |assoc|
|
||||
|
||||
assoc_name = assoc.name
|
||||
value = data[assoc_name]
|
||||
|
@ -360,7 +360,7 @@ returns
|
|||
# get association class and do lookup
|
||||
class_object = assoc.klass
|
||||
lookup_ids = []
|
||||
value.each { |item|
|
||||
value.each do |item|
|
||||
lookup = nil
|
||||
if class_object == User
|
||||
if item.instance_of?(String)
|
||||
|
@ -382,14 +382,14 @@ returns
|
|||
raise ArgumentError, "No lookup value found for '#{assoc_name}': #{item.inspect}"
|
||||
end
|
||||
lookup_ids.push lookup.id
|
||||
}
|
||||
end
|
||||
|
||||
# release data value
|
||||
data.delete(assoc_name)
|
||||
|
||||
# remember id reference
|
||||
data[ref_names.to_sym] = lookup_ids
|
||||
}
|
||||
end
|
||||
|
||||
data
|
||||
end
|
||||
|
|
|
@ -32,9 +32,9 @@ returns
|
|||
end
|
||||
|
||||
data = {}
|
||||
params.each { |key, value|
|
||||
params.each do |key, value|
|
||||
data[key.to_sym] = value
|
||||
}
|
||||
end
|
||||
|
||||
# ignore id for new objects
|
||||
if new_object && params[:id]
|
||||
|
@ -43,11 +43,11 @@ returns
|
|||
|
||||
# only use object attributes
|
||||
clean_params = {}
|
||||
new.attributes.each { |attribute, _value|
|
||||
new.attributes.each do |attribute, _value|
|
||||
next if !data.key?(attribute.to_sym)
|
||||
|
||||
# check reference records, referenced by _id attributes
|
||||
reflect_on_all_associations.map { |assoc|
|
||||
reflect_on_all_associations.map do |assoc|
|
||||
class_name = assoc.options[:class_name]
|
||||
next if !class_name
|
||||
name = "#{assoc.name}_id".to_sym
|
||||
|
@ -55,9 +55,9 @@ returns
|
|||
next if data[name].blank?
|
||||
next if assoc.klass.lookup(id: data[name])
|
||||
raise ArgumentError, "Invalid value for param '#{name}': #{data[name].inspect}"
|
||||
}
|
||||
end
|
||||
clean_params[attribute.to_sym] = data[attribute.to_sym]
|
||||
}
|
||||
end
|
||||
|
||||
# we do want to set this via database
|
||||
filter_unused_params(clean_params)
|
||||
|
@ -80,9 +80,9 @@ returns
|
|||
def filter_unused_params(data)
|
||||
|
||||
# we do want to set this via database
|
||||
[:action, :controller, :updated_at, :created_at, :updated_by_id, :created_by_id, :updated_by, :created_by].each { |key|
|
||||
[:action, :controller, :updated_at, :created_at, :updated_by_id, :created_by_id, :updated_by, :created_by].each do |key|
|
||||
data.delete(key)
|
||||
}
|
||||
end
|
||||
|
||||
data
|
||||
end
|
||||
|
|
|
@ -29,9 +29,9 @@ returns
|
|||
else
|
||||
where(name: data[:name])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
return loop_record if loop_record.name == data[:name]
|
||||
}
|
||||
end
|
||||
elsif data[:login]
|
||||
|
||||
# do lookup with == to handle case insensitive databases
|
||||
|
@ -40,9 +40,9 @@ returns
|
|||
else
|
||||
where(login: data[:login])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
return loop_record if loop_record.login == data[:login]
|
||||
}
|
||||
end
|
||||
elsif data[:email]
|
||||
|
||||
# do lookup with == to handle case insensitive databases
|
||||
|
@ -51,9 +51,9 @@ returns
|
|||
else
|
||||
where(email: data[:email])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
return loop_record if loop_record.email == data[:email]
|
||||
}
|
||||
end
|
||||
elsif data[:locale] && data[:source]
|
||||
|
||||
# do lookup with == to handle case insensitive databases
|
||||
|
@ -62,9 +62,9 @@ returns
|
|||
else
|
||||
where(locale: data[:locale], source: data[:source])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
return loop_record if loop_record.source == data[:source]
|
||||
}
|
||||
end
|
||||
end
|
||||
create(data)
|
||||
end
|
||||
|
@ -133,12 +133,12 @@ returns
|
|||
else
|
||||
where(name: data[:name])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.name == data[:name]
|
||||
loop_record.update!(data)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
record = new(data)
|
||||
record.save
|
||||
return record
|
||||
|
@ -150,12 +150,12 @@ returns
|
|||
else
|
||||
where(login: data[:login])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.login.casecmp(data[:login]).zero?
|
||||
loop_record.update!(data)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
record = new(data)
|
||||
record.save
|
||||
return record
|
||||
|
@ -167,12 +167,12 @@ returns
|
|||
else
|
||||
where(email: data[:email])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.email.casecmp(data[:email]).zero?
|
||||
loop_record.update!(data)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
record = new(data)
|
||||
record.save
|
||||
return record
|
||||
|
@ -184,12 +184,12 @@ returns
|
|||
else
|
||||
where(locale: data[:locale])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.locale.casecmp(data[:locale]).zero?
|
||||
loop_record.update!(data)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
record = new(data)
|
||||
record.save
|
||||
return record
|
||||
|
|
|
@ -38,12 +38,12 @@ returns
|
|||
else
|
||||
where(name: data[:name])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.name == data[:name]
|
||||
cache_set(data[:name], loop_record)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
return
|
||||
elsif data[:login]
|
||||
cache = cache_get(data[:login])
|
||||
|
@ -55,12 +55,12 @@ returns
|
|||
else
|
||||
where(login: data[:login])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.login == data[:login]
|
||||
cache_set(data[:login], loop_record)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
return
|
||||
elsif data[:email]
|
||||
cache = cache_get(data[:email])
|
||||
|
@ -72,12 +72,12 @@ returns
|
|||
else
|
||||
where(email: data[:email])
|
||||
end
|
||||
records.each { |loop_record|
|
||||
records.each do |loop_record|
|
||||
if loop_record.email == data[:email]
|
||||
cache_set(data[:email], loop_record)
|
||||
return loop_record
|
||||
end
|
||||
}
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ returns
|
|||
def search_index_attribute_lookup
|
||||
|
||||
attributes = self.attributes
|
||||
self.attributes.each { |key, value|
|
||||
self.attributes.each do |key, value|
|
||||
next if !value
|
||||
|
||||
# get attribute name
|
||||
|
@ -52,14 +52,14 @@ returns
|
|||
|
||||
# save name of ref object
|
||||
attributes[ attribute_name ] = value
|
||||
}
|
||||
end
|
||||
|
||||
ignored_attributes = self.class.instance_variable_get(:@search_index_attributes_ignored) || []
|
||||
return attributes if ignored_attributes.blank?
|
||||
|
||||
ignored_attributes.each { |attribute|
|
||||
ignored_attributes.each do |attribute|
|
||||
attributes.delete(attribute.to_s)
|
||||
}
|
||||
end
|
||||
|
||||
attributes
|
||||
end
|
||||
|
|
|
@ -17,7 +17,7 @@ module ApplicationModel::ChecksAttributeValuesAndLength
|
|||
|
||||
def check_attribute_values_and_length
|
||||
columns = self.class.columns_hash
|
||||
attributes.each { |name, value|
|
||||
attributes.each do |name, value|
|
||||
next if value.blank?
|
||||
next if !value.instance_of?(String)
|
||||
column = columns[name]
|
||||
|
@ -52,7 +52,7 @@ module ApplicationModel::ChecksAttributeValuesAndLength
|
|||
# strip 4 bytes utf8 chars if needed (mysql/mariadb will complain it)
|
||||
next if self[name].blank?
|
||||
self[name] = self[name].utf8_to_3bytesutf8
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -36,9 +36,9 @@ module ApplicationModel::HasCache
|
|||
keys.push "#{self.class}::#{login}"
|
||||
end
|
||||
|
||||
keys.each { |key|
|
||||
keys.each do |key|
|
||||
Cache.delete(key)
|
||||
}
|
||||
end
|
||||
|
||||
# delete old name / login caches
|
||||
if saved_changes?
|
||||
|
|
|
@ -108,11 +108,11 @@ returns
|
|||
|
||||
def self.timezones
|
||||
list = {}
|
||||
TZInfo::Timezone.all_country_zone_identifiers.each { |timezone|
|
||||
TZInfo::Timezone.all_country_zone_identifiers.each do |timezone|
|
||||
t = TZInfo::Timezone.get(timezone)
|
||||
diff = t.current_period.utc_total_offset / 60 / 60
|
||||
list[ timezone ] = diff
|
||||
}
|
||||
end
|
||||
list
|
||||
end
|
||||
|
||||
|
@ -168,14 +168,14 @@ returns
|
|||
end
|
||||
|
||||
# remove old ical entries if feed has changed
|
||||
public_holidays.each { |day, meta|
|
||||
public_holidays.each do |day, meta|
|
||||
next if !public_holidays[day]['feed']
|
||||
next if meta['feed'] == Digest::MD5.hexdigest(ical_url)
|
||||
public_holidays.delete(day)
|
||||
}
|
||||
end
|
||||
|
||||
# sync new ical feed dates
|
||||
events.each { |day, summary|
|
||||
events.each do |day, summary|
|
||||
if !public_holidays[day]
|
||||
public_holidays[day] = {}
|
||||
end
|
||||
|
@ -189,7 +189,7 @@ returns
|
|||
summary: summary,
|
||||
feed: Digest::MD5.hexdigest(ical_url)
|
||||
}
|
||||
}
|
||||
end
|
||||
self.last_log = nil
|
||||
if id
|
||||
Cache.write(
|
||||
|
@ -223,7 +223,7 @@ returns
|
|||
cals = Icalendar::Calendar.parse(cal_file)
|
||||
cal = cals.first
|
||||
events = {}
|
||||
cal.events.each { |event|
|
||||
cal.events.each do |event|
|
||||
if event.rrule
|
||||
|
||||
# loop till days
|
||||
|
@ -231,11 +231,11 @@ returns
|
|||
interval_frame_end = Date.parse("#{Time.zone.now + 3.years}-12-31")
|
||||
occurrences = event.occurrences_between(interval_frame_start, interval_frame_end)
|
||||
if occurrences.present?
|
||||
occurrences.each { |occurrence|
|
||||
occurrences.each do |occurrence|
|
||||
result = Calendar.day_and_comment_by_event(event, occurrence.start_time)
|
||||
next if !result
|
||||
events[result[0]] = result[1]
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
next if event.dtstart < Time.zone.now - 1.year
|
||||
|
@ -243,7 +243,7 @@ returns
|
|||
result = Calendar.day_and_comment_by_event(event, event.dtstart)
|
||||
next if !result
|
||||
events[result[0]] = result[1]
|
||||
}
|
||||
end
|
||||
events.sort.to_h
|
||||
end
|
||||
|
||||
|
@ -266,12 +266,12 @@ returns
|
|||
# if changed calendar is default, set all others default to false
|
||||
def sync_default
|
||||
return true if !default
|
||||
Calendar.find_each { |calendar|
|
||||
Calendar.find_each do |calendar|
|
||||
next if calendar.id == id
|
||||
next if !calendar.default
|
||||
calendar.default = false
|
||||
calendar.save
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -286,7 +286,7 @@ returns
|
|||
|
||||
# check if sla's are refer to an existing calendar
|
||||
default_calendar = Calendar.find_by(default: true)
|
||||
Sla.find_each { |sla|
|
||||
Sla.find_each do |sla|
|
||||
if !sla.calendar_id
|
||||
sla.calendar_id = default_calendar.id
|
||||
sla.save!
|
||||
|
@ -296,7 +296,7 @@ returns
|
|||
sla.calendar_id = default_calendar.id
|
||||
sla.save!
|
||||
end
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -311,7 +311,7 @@ returns
|
|||
|
||||
# fillup feed info
|
||||
before = public_holidays_was
|
||||
public_holidays.each { |day, meta|
|
||||
public_holidays.each do |day, meta|
|
||||
if before && before[day] && before[day]['feed']
|
||||
meta['feed'] = before[day]['feed']
|
||||
end
|
||||
|
@ -320,7 +320,7 @@ returns
|
|||
else
|
||||
false
|
||||
end
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,6 +15,7 @@ class Channel < ApplicationModel
|
|||
|
||||
# rubocop:disable Style/ClassVars
|
||||
@@channel_stream = {}
|
||||
@@channel_stream_started_till_at = {}
|
||||
# rubocop:enable Style/ClassVars
|
||||
|
||||
=begin
|
||||
|
@ -63,7 +64,7 @@ fetch one account
|
|||
self.status_in = result[:result]
|
||||
self.last_log_in = result[:notice]
|
||||
preferences[:last_fetch] = Time.zone.now
|
||||
save
|
||||
save!
|
||||
rescue => e
|
||||
error = "Can't use Channel::Driver::#{adapter.to_classname}: #{e.inspect}"
|
||||
logger.error error
|
||||
|
@ -71,7 +72,7 @@ fetch one account
|
|||
self.status_in = 'error'
|
||||
self.last_log_in = error
|
||||
preferences[:last_fetch] = Time.zone.now
|
||||
save
|
||||
save!
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -116,7 +117,7 @@ stream instance of account
|
|||
logger.error e.backtrace
|
||||
self.status_in = 'error'
|
||||
self.last_log_in = error
|
||||
save
|
||||
save!
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -132,7 +133,7 @@ stream all accounts
|
|||
def self.stream
|
||||
Thread.abort_on_exception = true
|
||||
|
||||
auto_reconnect_after = 25
|
||||
auto_reconnect_after = 180
|
||||
last_channels = []
|
||||
|
||||
loop do
|
||||
|
@ -140,12 +141,21 @@ stream all accounts
|
|||
|
||||
current_channels = []
|
||||
channels = Channel.where('active = ? AND area LIKE ?', true, '%::Account')
|
||||
channels.each { |channel|
|
||||
next if channel.options[:adapter] != 'twitter'
|
||||
channels.each do |channel|
|
||||
adapter = channel.options[:adapter]
|
||||
driver_class = Object.const_get("Channel::Driver::#{adapter.to_classname}")
|
||||
next if !driver_class.respond_to?(:streamable?)
|
||||
next if !driver_class.streamable?
|
||||
channel_id = channel.id.to_s
|
||||
|
||||
if @@channel_stream[channel_id].blank? && @@channel_stream_started_till_at[channel_id] && @@channel_stream_started_till_at[channel_id] > Time.zone.now - 65.seconds
|
||||
logger.info "skipp channel (#{channel_id}) for streaming, already tried to connect or connection was active within the last minute"
|
||||
next
|
||||
end
|
||||
|
||||
current_channels.push channel_id
|
||||
|
||||
# exit it channel has changed or connection is older then 25 min.
|
||||
# exit it channel has changed or connection is older then 180 minutes
|
||||
if @@channel_stream[channel_id]
|
||||
if @@channel_stream[channel_id][:updated_at] != channel.updated_at
|
||||
logger.info "channel (#{channel.id}) has changed, stop thread"
|
||||
|
@ -153,12 +163,14 @@ stream all accounts
|
|||
@@channel_stream[channel_id][:thread].join
|
||||
@@channel_stream[channel_id][:stream_instance].disconnect
|
||||
@@channel_stream[channel_id] = false
|
||||
@@channel_stream_started_till_at[channel_id] = Time.zone.now
|
||||
elsif @@channel_stream[channel_id][:started_at] && @@channel_stream[channel_id][:started_at] < Time.zone.now - auto_reconnect_after.minutes
|
||||
logger.info "channel (#{channel.id}) reconnect - thread is older then #{auto_reconnect_after} minutes, restart thread"
|
||||
@@channel_stream[channel_id][:thread].exit
|
||||
@@channel_stream[channel_id][:thread].join
|
||||
@@channel_stream[channel_id][:stream_instance].disconnect
|
||||
@@channel_stream[channel_id] = false
|
||||
@@channel_stream_started_till_at[channel_id] = Time.zone.now
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -174,37 +186,44 @@ stream all accounts
|
|||
sleep @@channel_stream.count
|
||||
|
||||
# start threads for each channel
|
||||
@@channel_stream[channel_id][:thread] = Thread.new {
|
||||
@@channel_stream[channel_id][:thread] = Thread.new do
|
||||
begin
|
||||
logger.info "Started stream channel for '#{channel.id}' (#{channel.area})..."
|
||||
channel.status_in = 'ok'
|
||||
channel.last_log_in = ''
|
||||
channel.save!
|
||||
@@channel_stream_started_till_at[channel_id] = Time.zone.now
|
||||
@@channel_stream[channel_id] ||= {}
|
||||
@@channel_stream[channel_id][:stream_instance] = channel.stream_instance
|
||||
@@channel_stream[channel_id][:stream_instance].stream
|
||||
@@channel_stream[channel_id][:stream_instance].disconnect
|
||||
@@channel_stream[channel_id] = false
|
||||
logger.info " ...stopped thread for '#{channel.id}'"
|
||||
@@channel_stream_started_till_at[channel_id] = Time.zone.now
|
||||
logger.info " ...stopped stream thread for '#{channel.id}'"
|
||||
rescue => e
|
||||
error = "Can't use channel (#{channel.id}): #{e.inspect}"
|
||||
error = "Can't use stream for channel (#{channel.id}): #{e.inspect}"
|
||||
logger.error error
|
||||
logger.error e.backtrace
|
||||
channel.status_in = 'error'
|
||||
channel.last_log_in = error
|
||||
channel.save
|
||||
channel.save!
|
||||
@@channel_stream[channel_id] = false
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# cleanup deleted channels
|
||||
last_channels.each { |channel_id|
|
||||
next if !@@channel_stream[channel_id.to_s]
|
||||
last_channels.each do |channel_id|
|
||||
next if @@channel_stream[channel_id].blank?
|
||||
next if current_channels.include?(channel_id)
|
||||
logger.info "channel (#{channel_id}) not longer active, stop thread"
|
||||
@@channel_stream[channel_id.to_s][:thread].exit
|
||||
@@channel_stream[channel_id.to_s][:thread].join
|
||||
@@channel_stream[channel_id.to_s][:stream_instance].disconnect
|
||||
@@channel_stream[channel_id.to_s] = false
|
||||
}
|
||||
logger.info "channel (#{channel_id}) not longer active, stop stream thread"
|
||||
@@channel_stream[channel_id][:thread].exit
|
||||
@@channel_stream[channel_id][:thread].join
|
||||
@@channel_stream[channel_id][:stream_instance].disconnect
|
||||
@@channel_stream[channel_id] = false
|
||||
@@channel_stream_started_till_at[channel_id] = Time.zone.now
|
||||
end
|
||||
|
||||
last_channels = current_channels
|
||||
|
||||
sleep 20
|
||||
|
@ -245,14 +264,14 @@ send via account
|
|||
result = driver_instance.send(adapter_options, mail_params, notification)
|
||||
self.status_out = 'ok'
|
||||
self.last_log_out = ''
|
||||
save
|
||||
save!
|
||||
rescue => e
|
||||
error = "Can't use Channel::Driver::#{adapter.to_classname}: #{e.inspect}"
|
||||
logger.error error
|
||||
logger.error e.backtrace
|
||||
self.status_out = 'error'
|
||||
self.last_log_out = error
|
||||
save
|
||||
save!
|
||||
raise error
|
||||
end
|
||||
result
|
||||
|
|
|
@ -40,24 +40,24 @@ returns
|
|||
end
|
||||
end
|
||||
if !access
|
||||
%w(inbound outbound).each { |key|
|
||||
%w(inbound outbound).each do |key|
|
||||
if attributes['options'] && attributes['options'][key] && attributes['options'][key]['options']
|
||||
attributes['options'][key]['options'].delete('password')
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
data[ self.class.to_app_model ][ id ] = attributes
|
||||
end
|
||||
|
||||
return data if !self['created_by_id'] && !self['updated_by_id']
|
||||
%w(created_by_id updated_by_id).each { |local_user_id|
|
||||
%w(created_by_id updated_by_id).each do |local_user_id|
|
||||
next if !self[ local_user_id ]
|
||||
next if data[ User.to_app_model ] && data[ User.to_app_model ][ self[ local_user_id ] ]
|
||||
user = User.lookup(id: self[ local_user_id ])
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
|
||||
|
|
|
@ -31,10 +31,10 @@ class Channel::Driver::Facebook
|
|||
|
||||
def send(options, fb_object_id, article, _notification = false)
|
||||
access_token = nil
|
||||
options['pages'].each { |page|
|
||||
options['pages'].each do |page|
|
||||
next if page['id'].to_s != fb_object_id.to_s
|
||||
access_token = page['access_token']
|
||||
}
|
||||
end
|
||||
if !access_token
|
||||
raise "No access_token found for fb_object_id: #{fb_object_id}"
|
||||
end
|
||||
|
@ -63,12 +63,26 @@ class Channel::Driver::Facebook
|
|||
def disconnect
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Channel::Driver::Facebook.streamable?
|
||||
|
||||
returns
|
||||
|
||||
true|false
|
||||
|
||||
=end
|
||||
|
||||
def self.streamable?
|
||||
false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def get_page(page_id)
|
||||
@pages.each { |page|
|
||||
@pages.each do |page|
|
||||
return page if page['id'].to_s == page_id.to_s
|
||||
}
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
|
@ -79,14 +93,14 @@ class Channel::Driver::Facebook
|
|||
older_import = 0
|
||||
older_import_max = 12
|
||||
|
||||
@sync['pages'].each { |page_to_sync_id, page_to_sync_params|
|
||||
@sync['pages'].each do |page_to_sync_id, page_to_sync_params|
|
||||
page = get_page(page_to_sync_id)
|
||||
next if !page
|
||||
next if page_to_sync_params['group_id'].blank?
|
||||
page_client = Facebook.new(page['access_token'])
|
||||
|
||||
posts = page_client.client.get_connection('me', 'feed', fields: 'id,from,to,message,created_time,permalink_url,comments{id,from,to,message,created_time}')
|
||||
posts.each { |post|
|
||||
posts.each do |post|
|
||||
|
||||
# ignore older messages
|
||||
if (@channel.created_at - 15.days) > Time.zone.parse(post['created_time']) || older_import >= older_import_max
|
||||
|
@ -96,8 +110,8 @@ class Channel::Driver::Facebook
|
|||
end
|
||||
|
||||
page_client.to_group(post, page_to_sync_params['group_id'], @channel, page)
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
|
|
@ -44,7 +44,7 @@ returns
|
|||
|
||||
=end
|
||||
|
||||
def fetch (options, channel, check_type = '', verify_string = '')
|
||||
def fetch(options, channel, check_type = '', verify_string = '')
|
||||
ssl = true
|
||||
port = 995
|
||||
if options.key?(:ssl) && options[:ssl] == false
|
||||
|
@ -180,6 +180,20 @@ returns
|
|||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Channel::Driver::Pop3.streamable?
|
||||
|
||||
returns
|
||||
|
||||
true|false
|
||||
|
||||
=end
|
||||
|
||||
def self.streamable?
|
||||
false
|
||||
end
|
||||
|
||||
def disconnect
|
||||
return if !@pop
|
||||
@pop.finish
|
||||
|
|
|
@ -30,6 +30,20 @@ class Channel::Driver::Telegram
|
|||
message
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Channel::Driver::Telegram.streamable?
|
||||
|
||||
returns
|
||||
|
||||
true|false
|
||||
|
||||
=end
|
||||
|
||||
def self.streamable?
|
||||
false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_external_credential(options)
|
||||
|
|
|
@ -123,6 +123,20 @@ returns
|
|||
@rest_client.disconnect if @rest_client
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Channel::Driver::Twitter.streamable?
|
||||
|
||||
returns
|
||||
|
||||
true|false
|
||||
|
||||
=end
|
||||
|
||||
def self.streamable?
|
||||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
create stream endpoint form twitter account
|
||||
|
@ -183,8 +197,8 @@ returns
|
|||
=end
|
||||
|
||||
def stream
|
||||
sleep_on_unauthorized = 61
|
||||
2.times { |loop_count|
|
||||
sleep_on_unauthorized = 65
|
||||
2.times do |loop_count|
|
||||
begin
|
||||
stream_start
|
||||
rescue Twitter::Error::Unauthorized => e
|
||||
|
@ -196,7 +210,7 @@ returns
|
|||
raise "Unable to stream, try #{loop_count}, error #{e.inspect}"
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def stream_start
|
||||
|
@ -207,9 +221,9 @@ returns
|
|||
filter = {}
|
||||
if sync['search']
|
||||
hashtags = []
|
||||
sync['search'].each { |item|
|
||||
sync['search'].each do |item|
|
||||
hashtags.push item['term']
|
||||
}
|
||||
end
|
||||
filter[:track] = hashtags.join(',')
|
||||
end
|
||||
if sync['mentions'] && sync['mentions']['group_id'] != ''
|
||||
|
@ -242,11 +256,11 @@ returns
|
|||
if sync['mentions'] && sync['mentions']['group_id'] != ''
|
||||
hit = false
|
||||
if tweet.user_mentions
|
||||
tweet.user_mentions.each { |user|
|
||||
tweet.user_mentions.each do |user|
|
||||
if user.id.to_s == @channel.options['user']['id'].to_s
|
||||
hit = true
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
if hit
|
||||
@stream_client.to_group(tweet, sync['mentions']['group_id'], @channel)
|
||||
|
@ -257,14 +271,14 @@ returns
|
|||
# check hashtags
|
||||
if sync['search'] && tweet.hashtags
|
||||
hit = false
|
||||
sync['search'].each { |item|
|
||||
tweet.hashtags.each { |hashtag|
|
||||
sync['search'].each do |item|
|
||||
tweet.hashtags.each do |hashtag|
|
||||
next if item['term'] !~ /^#/
|
||||
if item['term'].sub(/^#/, '') == hashtag.text
|
||||
hit = item
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
if hit
|
||||
@stream_client.to_group(tweet, hit['group_id'], @channel)
|
||||
next
|
||||
|
@ -275,12 +289,12 @@ returns
|
|||
if sync['search']
|
||||
hit = false
|
||||
body = tweet.text
|
||||
sync['search'].each { |item|
|
||||
sync['search'].each do |item|
|
||||
next if item['term'] =~ /^#/
|
||||
if body =~ /#{item['term']}/
|
||||
hit = item
|
||||
end
|
||||
}
|
||||
end
|
||||
if hit
|
||||
@stream_client.to_group(tweet, hit['group_id'], @channel)
|
||||
end
|
||||
|
@ -293,14 +307,14 @@ returns
|
|||
|
||||
def fetch_search
|
||||
return if @sync[:search].blank?
|
||||
@sync[:search].each { |search|
|
||||
@sync[:search].each do |search|
|
||||
next if search[:term].blank?
|
||||
next if search[:group_id].blank?
|
||||
result_type = search[:type] || 'mixed'
|
||||
Rails.logger.debug " - searching for '#{search[:term]}'"
|
||||
older_import = 0
|
||||
older_import_max = 20
|
||||
@rest_client.client.search(search[:term], result_type: result_type).collect { |tweet|
|
||||
@rest_client.client.search(search[:term], result_type: result_type).collect do |tweet|
|
||||
next if !track_retweets? && tweet.retweet?
|
||||
|
||||
# ignore older messages
|
||||
|
@ -314,8 +328,8 @@ returns
|
|||
next if Ticket::Article.find_by(message_id: tweet.id)
|
||||
break if @rest_client.tweet_limit_reached(tweet)
|
||||
@rest_client.to_group(tweet, search[:group_id], @channel)
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def fetch_mentions
|
||||
|
@ -324,7 +338,7 @@ returns
|
|||
Rails.logger.debug ' - searching for mentions'
|
||||
older_import = 0
|
||||
older_import_max = 20
|
||||
@rest_client.client.mentions_timeline.each { |tweet|
|
||||
@rest_client.client.mentions_timeline.each do |tweet|
|
||||
next if !track_retweets? && tweet.retweet?
|
||||
|
||||
# ignore older messages
|
||||
|
@ -336,7 +350,7 @@ returns
|
|||
next if Ticket::Article.find_by(message_id: tweet.id)
|
||||
break if @rest_client.tweet_limit_reached(tweet)
|
||||
@rest_client.to_group(tweet, @sync[:mentions][:group_id], @channel)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def fetch_direct_messages
|
||||
|
@ -345,7 +359,7 @@ returns
|
|||
Rails.logger.debug ' - searching for direct_messages'
|
||||
older_import = 0
|
||||
older_import_max = 20
|
||||
@rest_client.client.direct_messages(full_text: 'true').each { |tweet|
|
||||
@rest_client.client.direct_messages(full_text: 'true').each do |tweet|
|
||||
|
||||
# ignore older messages
|
||||
if (@channel.created_at - 15.days) > tweet.created_at.dup.utc || older_import >= older_import_max
|
||||
|
@ -356,7 +370,7 @@ returns
|
|||
next if Ticket::Article.find_by(message_id: tweet.id)
|
||||
break if @rest_client.direct_message_limit_reached(tweet)
|
||||
@rest_client.to_group(tweet, @sync[:direct_messages][:group_id], @channel)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def check_external_credential(options)
|
||||
|
@ -376,7 +390,7 @@ returns
|
|||
def own_tweet_already_imported?(tweet)
|
||||
event_time = Time.zone.now
|
||||
sleep 4
|
||||
12.times { |loop_count|
|
||||
12.times do |loop_count|
|
||||
if Ticket::Article.find_by(message_id: tweet.id)
|
||||
Rails.logger.debug "Own tweet already imported, skipping tweet #{tweet.id}"
|
||||
return true
|
||||
|
@ -387,7 +401,7 @@ returns
|
|||
sleep_time = 5 if sleep_time > 5
|
||||
Rails.logger.debug "Delay importing own tweets - sleep #{sleep_time} (loop #{loop_count})"
|
||||
sleep sleep_time
|
||||
}
|
||||
end
|
||||
|
||||
if Ticket::Article.find_by(message_id: tweet.id)
|
||||
Rails.logger.debug "Own tweet already imported, skipping tweet #{tweet.id}"
|
||||
|
|
|
@ -74,7 +74,7 @@ class Channel::EmailParser
|
|||
mail = Mail.new(msg)
|
||||
|
||||
# set all headers
|
||||
mail.header.fields.each { |field|
|
||||
mail.header.fields.each do |field|
|
||||
|
||||
# full line, encode, ready for storage
|
||||
begin
|
||||
|
@ -89,42 +89,42 @@ class Channel::EmailParser
|
|||
|
||||
# if we need to access the lines by objects later again
|
||||
data["raw-#{field.name.downcase}".to_sym] = field
|
||||
}
|
||||
end
|
||||
|
||||
# verify content, ignore recipients with non email address
|
||||
['to', 'cc', 'delivered-to', 'x-original-to', 'envelope-to'].each { |field|
|
||||
['to', 'cc', 'delivered-to', 'x-original-to', 'envelope-to'].each do |field|
|
||||
next if data[field.to_sym].blank?
|
||||
next if data[field.to_sym] =~ /@/
|
||||
data[field.to_sym] = ''
|
||||
}
|
||||
end
|
||||
|
||||
# get sender with @ / email address
|
||||
from = nil
|
||||
['from', 'reply-to', 'return-path'].each { |item|
|
||||
['from', 'reply-to', 'return-path'].each do |item|
|
||||
next if data[item.to_sym].blank?
|
||||
next if data[item.to_sym] !~ /@/
|
||||
from = data[item.to_sym]
|
||||
break if from
|
||||
}
|
||||
end
|
||||
|
||||
# in case of no sender with email address - get sender
|
||||
if !from
|
||||
['from', 'reply-to', 'return-path'].each { |item|
|
||||
['from', 'reply-to', 'return-path'].each do |item|
|
||||
next if data[item.to_sym].blank?
|
||||
from = data[item.to_sym]
|
||||
break if from
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# set x-any-recipient
|
||||
data['x-any-recipient'.to_sym] = ''
|
||||
['to', 'cc', 'delivered-to', 'x-original-to', 'envelope-to'].each { |item|
|
||||
['to', 'cc', 'delivered-to', 'x-original-to', 'envelope-to'].each do |item|
|
||||
next if data[item.to_sym].blank?
|
||||
if data['x-any-recipient'.to_sym] != ''
|
||||
data['x-any-recipient'.to_sym] += ', '
|
||||
end
|
||||
data['x-any-recipient'.to_sym] += mail[item.to_sym].to_s
|
||||
}
|
||||
end
|
||||
|
||||
# set extra headers
|
||||
data = data.merge(Channel::EmailParser.sender_properties(from))
|
||||
|
@ -197,7 +197,7 @@ class Channel::EmailParser
|
|||
|
||||
# get attachments
|
||||
if mail.parts
|
||||
mail.parts.each { |part|
|
||||
mail.parts.each do |part|
|
||||
|
||||
# protect process to work fine with spam emails, see test/fixtures/mail15.box
|
||||
begin
|
||||
|
@ -207,7 +207,7 @@ class Channel::EmailParser
|
|||
attachs = _get_attachment(part, data[:attachments], mail)
|
||||
data[:attachments].concat(attachs)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# not multipart email
|
||||
|
@ -298,10 +298,10 @@ class Channel::EmailParser
|
|||
# check if sub parts are available
|
||||
if !file.parts.empty?
|
||||
a = []
|
||||
file.parts.each { |p|
|
||||
file.parts.each do |p|
|
||||
attachment = _get_attachment(p, attachments, mail)
|
||||
a.concat(attachment)
|
||||
}
|
||||
end
|
||||
return a
|
||||
end
|
||||
|
||||
|
@ -313,7 +313,7 @@ class Channel::EmailParser
|
|||
|
||||
# get file preferences
|
||||
headers_store = {}
|
||||
file.header.fields.each { |field|
|
||||
file.header.fields.each do |field|
|
||||
|
||||
# full line, encode, ready for storage
|
||||
begin
|
||||
|
@ -325,7 +325,7 @@ class Channel::EmailParser
|
|||
rescue => e
|
||||
headers_store[field.name.to_s] = field.raw_value
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# get filename from content-disposition
|
||||
filename = nil
|
||||
|
@ -364,16 +364,16 @@ class Channel::EmailParser
|
|||
# generate file name
|
||||
if filename.blank?
|
||||
attachment_count = 0
|
||||
(1..1000).each { |count|
|
||||
(1..1000).each do |count|
|
||||
filename_exists = false
|
||||
filename = 'file-' + count.to_s
|
||||
attachments.each { |attachment|
|
||||
attachments.each do |attachment|
|
||||
if attachment[:filename] == filename
|
||||
filename_exists = true
|
||||
end
|
||||
}
|
||||
end
|
||||
break if filename_exists == false
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# get mime type
|
||||
|
@ -443,9 +443,9 @@ returns
|
|||
p 'ERROR: ' + e.inspect # rubocop:disable Rails/Output
|
||||
Rails.logger.error message
|
||||
Rails.logger.error e
|
||||
File.open(filename, 'wb') { |file|
|
||||
File.open(filename, 'wb') do |file|
|
||||
file.write msg
|
||||
}
|
||||
end
|
||||
return false if exception == false
|
||||
raise e.inspect + e.backtrace.inspect
|
||||
end
|
||||
|
@ -458,10 +458,10 @@ returns
|
|||
# run postmaster pre filter
|
||||
UserInfo.current_user_id = 1
|
||||
filters = {}
|
||||
Setting.where(area: 'Postmaster::PreFilter').order(:name).each { |setting|
|
||||
Setting.where(area: 'Postmaster::PreFilter').order(:name).each do |setting|
|
||||
filters[setting.name] = Kernel.const_get(Setting.get(setting.name))
|
||||
}
|
||||
filters.each { |_prio, backend|
|
||||
end
|
||||
filters.each do |_prio, backend|
|
||||
Rails.logger.debug "run postmaster pre filter #{backend}"
|
||||
begin
|
||||
backend.run(channel, mail)
|
||||
|
@ -470,7 +470,7 @@ returns
|
|||
Rails.logger.error e.inspect
|
||||
raise e
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# check ignore header
|
||||
if mail['x-zammad-ignore'.to_sym] == 'true' || mail['x-zammad-ignore'.to_sym] == true
|
||||
|
@ -608,10 +608,10 @@ returns
|
|||
|
||||
# run postmaster post filter
|
||||
filters = {}
|
||||
Setting.where(area: 'Postmaster::PostFilter').order(:name).each { |setting|
|
||||
Setting.where(area: 'Postmaster::PostFilter').order(:name).each do |setting|
|
||||
filters[setting.name] = Kernel.const_get(Setting.get(setting.name))
|
||||
}
|
||||
filters.each { |_prio, backend|
|
||||
end
|
||||
filters.each do |_prio, backend|
|
||||
Rails.logger.debug "run postmaster post filter #{backend}"
|
||||
begin
|
||||
backend.run(channel, mail, ticket, article, session_user)
|
||||
|
@ -619,7 +619,7 @@ returns
|
|||
Rails.logger.error "can't run postmaster post filter #{backend}"
|
||||
Rails.logger.error e.inspect
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# return new objects
|
||||
[ticket, article, session_user, mail]
|
||||
|
@ -653,14 +653,14 @@ returns
|
|||
return data if from.blank?
|
||||
begin
|
||||
list = Mail::AddressList.new(from)
|
||||
list.addresses.each { |address|
|
||||
list.addresses.each do |address|
|
||||
data[:from_email] = address.address
|
||||
data[:from_local] = address.local
|
||||
data[:from_domain] = address.domain
|
||||
data[:from_display_name] = address.display_name ||
|
||||
(address.comments && address.comments[0])
|
||||
break if data[:from_email].present? && data[:from_email] =~ /@/
|
||||
}
|
||||
end
|
||||
rescue => e
|
||||
if from =~ /<>/ && from =~ /<.+?>/
|
||||
data = sender_properties(from.gsub(/<>/, ''))
|
||||
|
@ -694,7 +694,7 @@ returns
|
|||
def set_attributes_by_x_headers(item_object, header_name, mail, suffix = false)
|
||||
|
||||
# loop all x-zammad-header-* headers
|
||||
item_object.attributes.each { |key, _value|
|
||||
item_object.attributes.each do |key, _value|
|
||||
|
||||
# ignore read only attributes
|
||||
next if key == 'updated_by_id'
|
||||
|
@ -711,8 +711,9 @@ returns
|
|||
|
||||
# only set value on _id if value/reference lookup exists
|
||||
if mail[ header.to_sym ]
|
||||
|
||||
Rails.logger.info "set_attributes_by_x_headers header #{header} found #{mail[header.to_sym]}"
|
||||
item_object.class.reflect_on_all_associations.map { |assoc|
|
||||
item_object.class.reflect_on_all_associations.map do |assoc|
|
||||
|
||||
next if assoc.name.to_s != key_short
|
||||
|
||||
|
@ -738,7 +739,7 @@ returns
|
|||
|
||||
item_object[key] = assoc_object.id
|
||||
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -751,7 +752,7 @@ returns
|
|||
Rails.logger.info "set_attributes_by_x_headers header #{header} found. Assign #{key}=#{mail[header.to_sym]}"
|
||||
item_object[key] = mail[header.to_sym]
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -9,7 +9,7 @@ module Channel::Filter::BounceDeliveryPermanentFailed
|
|||
return if !mail[:attachments]
|
||||
|
||||
# remember, do not send notifications to certain recipients again if failed permanent
|
||||
mail[:attachments].each { |attachment|
|
||||
mail[:attachments].each do |attachment|
|
||||
next if !attachment[:preferences]
|
||||
next if attachment[:preferences]['Mime-Type'] != 'message/rfc822'
|
||||
next if !attachment[:data]
|
||||
|
@ -28,19 +28,19 @@ module Channel::Filter::BounceDeliveryPermanentFailed
|
|||
# get recipient of origin article, if only one - mark this user to not sent notifications anymore
|
||||
recipients = []
|
||||
if article.sender.name == 'System' || article.sender.name == 'Agent'
|
||||
%w(to cc).each { |line|
|
||||
%w(to cc).each do |line|
|
||||
next if article[line].blank?
|
||||
recipients = []
|
||||
begin
|
||||
list = Mail::AddressList.new(article[line])
|
||||
list.addresses.each { |address|
|
||||
list.addresses.each do |address|
|
||||
next if address.address.blank?
|
||||
recipients.push address.address.downcase
|
||||
}
|
||||
end
|
||||
rescue
|
||||
Rails.logger.info "Unable to parse email address in '#{article[line]}'"
|
||||
end
|
||||
}
|
||||
end
|
||||
if recipients.count > 1
|
||||
recipients = []
|
||||
end
|
||||
|
@ -56,16 +56,16 @@ module Channel::Filter::BounceDeliveryPermanentFailed
|
|||
end
|
||||
|
||||
# set user preferences
|
||||
recipients.each { |recipient|
|
||||
recipients.each do |recipient|
|
||||
users = User.where(email: recipient)
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
next if !user
|
||||
user.preferences[:mail_delivery_failed] = true
|
||||
user.preferences[:mail_delivery_failed_data] = Time.zone.now
|
||||
user.save!
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
true
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ module Channel::Filter::BounceFollowUpCheck
|
|||
return if !mail[:attachments]
|
||||
return if mail[ 'x-zammad-ticket-id'.to_sym ]
|
||||
|
||||
mail[:attachments].each { |attachment|
|
||||
mail[:attachments].each do |attachment|
|
||||
next if !attachment[:preferences]
|
||||
next if attachment[:preferences]['Mime-Type'] != 'message/rfc822'
|
||||
next if !attachment[:data]
|
||||
|
@ -25,7 +25,7 @@ module Channel::Filter::BounceFollowUpCheck
|
|||
mail[ 'x-zammad-is-auto-response'.to_sym ] = true
|
||||
|
||||
return true
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,11 +7,11 @@ module Channel::Filter::Database
|
|||
|
||||
# process postmaster filter
|
||||
filters = PostmasterFilter.where(active: true, channel: 'email').order(:name, :created_at)
|
||||
filters.each { |filter|
|
||||
filters.each do |filter|
|
||||
Rails.logger.info " process filter #{filter.name} ..."
|
||||
all_matches_ok = true
|
||||
min_one_rule_exists = false
|
||||
filter[:match].each { |key, meta|
|
||||
filter[:match].each do |key, meta|
|
||||
begin
|
||||
next if meta.blank? || meta['value'].blank?
|
||||
value = mail[ key.downcase.to_sym ]
|
||||
|
@ -37,17 +37,17 @@ module Channel::Filter::Database
|
|||
Rails.logger.error "can't use match rule #{match_rule} on #{value}"
|
||||
Rails.logger.error e.inspect
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
next if !min_one_rule_exists
|
||||
next if !all_matches_ok
|
||||
|
||||
filter[:perform].each { |key, meta|
|
||||
filter[:perform].each do |key, meta|
|
||||
next if !Channel::EmailParser.check_attributes_by_x_headers(key, meta['value'])
|
||||
Rails.logger.info " perform '#{key.downcase}' = '#{meta.inspect}'"
|
||||
mail[ key.downcase.to_sym ] = meta['value']
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
@ -28,14 +28,14 @@ module Channel::Filter::FollowUpCheck
|
|||
|
||||
# get ticket# from attachment
|
||||
if setting.include?('attachment') && mail[:attachments]
|
||||
mail[:attachments].each { |attachment|
|
||||
mail[:attachments].each do |attachment|
|
||||
next if !attachment[:data]
|
||||
ticket = Ticket::Number.check(attachment[:data])
|
||||
next if !ticket
|
||||
Rails.logger.debug "Follow up for '##{ticket.number}' in attachment."
|
||||
mail['x-zammad-ticket-id'.to_sym] = ticket.id
|
||||
return true
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# get ticket# from references
|
||||
|
@ -54,14 +54,14 @@ module Channel::Filter::FollowUpCheck
|
|||
end
|
||||
if references != ''
|
||||
message_ids = references.split(/\s+/)
|
||||
message_ids.each { |message_id|
|
||||
message_ids.each do |message_id|
|
||||
message_id_md5 = Digest::MD5.hexdigest(message_id)
|
||||
article = Ticket::Article.where(message_id_md5: message_id_md5).order('created_at DESC, id DESC').limit(1).first
|
||||
next if !article
|
||||
Rails.logger.debug "Follow up for '##{article.ticket.number}' in references."
|
||||
mail['x-zammad-ticket-id'.to_sym] = article.ticket_id
|
||||
return true
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -81,7 +81,7 @@ module Channel::Filter::FollowUpCheck
|
|||
end
|
||||
if references != ''
|
||||
message_ids = references.split(/\s+/)
|
||||
message_ids.each { |message_id|
|
||||
message_ids.each do |message_id|
|
||||
message_id_md5 = Digest::MD5.hexdigest(message_id)
|
||||
article = Ticket::Article.where(message_id_md5: message_id_md5).order('created_at DESC, id DESC').limit(1).first
|
||||
next if !article
|
||||
|
@ -100,7 +100,7 @@ module Channel::Filter::FollowUpCheck
|
|||
Rails.logger.debug "Follow up for '##{article.ticket.number}' in references with same subject as inital article."
|
||||
mail['x-zammad-ticket-id'.to_sym] = article_first.ticket_id
|
||||
return true
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ module Channel::Filter::FollowUpMerged
|
|||
return if links.blank?
|
||||
|
||||
merge_ticket = nil
|
||||
links.each { |link|
|
||||
links.each do |link|
|
||||
next if link['link_type'] != 'parent'
|
||||
next if link['link_object'] != 'Ticket'
|
||||
|
||||
|
@ -37,7 +37,7 @@ module Channel::Filter::FollowUpMerged
|
|||
merge_ticket = check_ticket
|
||||
|
||||
break
|
||||
}
|
||||
end
|
||||
merge_ticket
|
||||
end
|
||||
end
|
||||
|
|
|
@ -32,7 +32,7 @@ module Channel::Filter::IdentifySender
|
|||
to = 'raw-to'.to_sym
|
||||
if mail[to] && mail[to].addrs
|
||||
items = mail[to].addrs
|
||||
items.each { |item|
|
||||
items.each do |item|
|
||||
|
||||
# skip if recipient is system email
|
||||
next if EmailAddress.find_by(email: item.address.downcase)
|
||||
|
@ -43,7 +43,7 @@ module Channel::Filter::IdentifySender
|
|||
email: item.address,
|
||||
)
|
||||
break
|
||||
}
|
||||
end
|
||||
end
|
||||
rescue => e
|
||||
Rails.logger.error 'ERROR: SenderIsSystemAddress: ' + e.inspect
|
||||
|
@ -89,12 +89,12 @@ module Channel::Filter::IdentifySender
|
|||
def self.create_recipients(mail)
|
||||
max_count = 40
|
||||
current_count = 0
|
||||
['raw-to', 'raw-cc'].each { |item|
|
||||
['raw-to', 'raw-cc'].each do |item|
|
||||
next if !mail[item.to_sym]
|
||||
begin
|
||||
next if !mail[item.to_sym].addrs
|
||||
items = mail[item.to_sym].addrs
|
||||
items.each { |address_data|
|
||||
items.each do |address_data|
|
||||
next if address_data.address.blank?
|
||||
user_create(
|
||||
firstname: address_data.display_name,
|
||||
|
@ -103,7 +103,7 @@ module Channel::Filter::IdentifySender
|
|||
)
|
||||
current_count += 1
|
||||
return false if current_count == max_count
|
||||
}
|
||||
end
|
||||
rescue => e
|
||||
# parse not parseable fields by mail gem like
|
||||
# - Max Kohl | [example.com] <kohl@example.com>
|
||||
|
@ -111,7 +111,7 @@ module Channel::Filter::IdentifySender
|
|||
Rails.logger.error 'ERROR: ' + e.inspect
|
||||
Rails.logger.error "ERROR: try it by my self (#{item}): #{mail[item.to_sym]}"
|
||||
recipients = mail[item.to_sym].to_s.split(',')
|
||||
recipients.each { |recipient|
|
||||
recipients.each do |recipient|
|
||||
address = nil
|
||||
display_name = nil
|
||||
if recipient =~ /.*<(.+?)>/
|
||||
|
@ -128,9 +128,9 @@ module Channel::Filter::IdentifySender
|
|||
)
|
||||
current_count += 1
|
||||
return false if current_count == max_count
|
||||
}
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def self.user_create(data)
|
||||
|
@ -159,12 +159,12 @@ module Channel::Filter::IdentifySender
|
|||
role_ids = Role.signup_role_ids
|
||||
|
||||
# fillup
|
||||
%w(firstname lastname).each { |item|
|
||||
%w(firstname lastname).each do |item|
|
||||
if data[item.to_sym].nil?
|
||||
data[item.to_sym] = ''
|
||||
end
|
||||
data[item.to_sym] = cleanup_name(data[item.to_sym])
|
||||
}
|
||||
end
|
||||
data[:password] = ''
|
||||
data[:active] = true
|
||||
data[:role_ids] = role_ids
|
||||
|
|
|
@ -31,7 +31,7 @@ class Channel::Filter::MonitoringBase
|
|||
|
||||
# get mail attibutes like host and state
|
||||
result = {}
|
||||
mail[:body].gsub(%r{(Service|Host|State|Address|Date/Time|Additional\sInfo|Info):(.+?)\n}i) { |_match|
|
||||
mail[:body].gsub(%r{(Service|Host|State|Address|Date/Time|Additional\sInfo|Info):(.+?)\n}i) do |_match|
|
||||
key = $1
|
||||
if key
|
||||
key = key.downcase
|
||||
|
@ -41,7 +41,7 @@ class Channel::Filter::MonitoringBase
|
|||
value.strip!
|
||||
end
|
||||
result[key] = value
|
||||
}
|
||||
end
|
||||
|
||||
# check min. params
|
||||
return if result['host'].blank?
|
||||
|
@ -68,7 +68,7 @@ class Channel::Filter::MonitoringBase
|
|||
# follow up detection by meta data
|
||||
open_states = Ticket::State.by_category(:open)
|
||||
ticket_ids = Ticket.where(state: open_states).order(created_at: :desc).limit(5000).pluck(:id)
|
||||
ticket_ids.each { |ticket_id|
|
||||
ticket_ids.each do |ticket_id|
|
||||
ticket = Ticket.find_by(id: ticket_id)
|
||||
next if !ticket
|
||||
next if !ticket.preferences
|
||||
|
@ -89,7 +89,7 @@ class Channel::Filter::MonitoringBase
|
|||
end
|
||||
end
|
||||
return true
|
||||
}
|
||||
end
|
||||
|
||||
# new ticket, set meta data
|
||||
if !mail[ 'x-zammad-ticket-id'.to_sym ]
|
||||
|
@ -98,9 +98,9 @@ class Channel::Filter::MonitoringBase
|
|||
end
|
||||
preferences = {}
|
||||
preferences[integration] = result
|
||||
preferences.each { |key, value|
|
||||
preferences.each do |key, value|
|
||||
mail[ 'x-zammad-ticket-preferences'.to_sym ][key] = value
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# ignorte states
|
||||
|
|
|
@ -17,12 +17,12 @@ module Channel::Filter::SenderIsSystemAddress
|
|||
begin
|
||||
return if !mail[form].addrs
|
||||
items = mail[form].addrs
|
||||
items.each { |item|
|
||||
items.each do |item|
|
||||
next if !EmailAddress.find_by(email: item.address.downcase)
|
||||
mail['x-zammad-ticket-create-article-sender'.to_sym] = 'Agent'
|
||||
mail['x-zammad-article-sender'.to_sym] = 'Agent'
|
||||
return true
|
||||
}
|
||||
end
|
||||
rescue => e
|
||||
Rails.logger.error 'ERROR: SenderIsSystemAddress: ' + e.inspect
|
||||
end
|
||||
|
|
|
@ -7,21 +7,21 @@ module Channel::Filter::Trusted
|
|||
|
||||
# check if trust x-headers
|
||||
if !channel[:trusted]
|
||||
mail.each { |key, _value|
|
||||
mail.each do |key, _value|
|
||||
next if key !~ /^x-zammad/i
|
||||
mail.delete(key)
|
||||
}
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
# verify values
|
||||
mail.each { |key, value|
|
||||
mail.each do |key, value|
|
||||
next if key !~ /^x-zammad/i
|
||||
|
||||
# no assoc exists, remove header
|
||||
next if Channel::EmailParser.check_attributes_by_x_headers(key, value)
|
||||
mail.delete(key.to_sym)
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -65,21 +65,21 @@ class Chat < ApplicationModel
|
|||
def self.agent_state(user_id)
|
||||
return { state: 'chat_disabled' } if !Setting.get('chat')
|
||||
assets = {}
|
||||
Chat.where(active: true).each { |chat|
|
||||
Chat.where(active: true).each do |chat|
|
||||
assets = chat.assets(assets)
|
||||
}
|
||||
end
|
||||
active_agent_ids = []
|
||||
active_agents.each { |user|
|
||||
active_agents.each do |user|
|
||||
active_agent_ids.push user.id
|
||||
assets = user.assets(assets)
|
||||
}
|
||||
end
|
||||
runningchat_session_list_local = running_chat_session_list
|
||||
runningchat_session_list_local.each { |session|
|
||||
runningchat_session_list_local.each do |session|
|
||||
next if !session['user_id']
|
||||
user = User.lookup(id: session['user_id'])
|
||||
next if !user
|
||||
assets = user.assets(assets)
|
||||
}
|
||||
end
|
||||
{
|
||||
waiting_chat_count: waiting_chat_count,
|
||||
waiting_chat_session_list: waiting_chat_session_list,
|
||||
|
@ -107,9 +107,9 @@ class Chat < ApplicationModel
|
|||
|
||||
def self.waiting_chat_session_list
|
||||
sessions = []
|
||||
Chat::Session.where(state: ['waiting']).each { |session|
|
||||
Chat::Session.where(state: ['waiting']).each do |session|
|
||||
sessions.push session.attributes
|
||||
}
|
||||
end
|
||||
sessions
|
||||
end
|
||||
|
||||
|
@ -119,9 +119,9 @@ class Chat < ApplicationModel
|
|||
|
||||
def self.running_chat_session_list
|
||||
sessions = []
|
||||
Chat::Session.where(state: ['running']).each { |session|
|
||||
Chat::Session.where(state: ['running']).each do |session|
|
||||
sessions.push session.attributes
|
||||
}
|
||||
end
|
||||
sessions
|
||||
end
|
||||
|
||||
|
@ -131,9 +131,9 @@ class Chat < ApplicationModel
|
|||
|
||||
def self.available_agents(diff = 2.minutes)
|
||||
agents = {}
|
||||
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).each { |record|
|
||||
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).each do |record|
|
||||
agents[record.updated_by_id] = record.concurrent
|
||||
}
|
||||
end
|
||||
agents
|
||||
end
|
||||
|
||||
|
@ -143,19 +143,19 @@ class Chat < ApplicationModel
|
|||
|
||||
def self.active_agents(diff = 2.minutes)
|
||||
users = []
|
||||
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).each { |record|
|
||||
Chat::Agent.where(active: true).where('updated_at > ?', Time.zone.now - diff).each do |record|
|
||||
user = User.lookup(id: record.updated_by_id)
|
||||
next if !user
|
||||
users.push user
|
||||
}
|
||||
end
|
||||
users
|
||||
end
|
||||
|
||||
def self.seads_total(diff = 2.minutes)
|
||||
total = 0
|
||||
available_agents(diff).each { |_user_id, concurrent|
|
||||
available_agents(diff).each do |_user_id, concurrent|
|
||||
total += concurrent
|
||||
}
|
||||
end
|
||||
total
|
||||
end
|
||||
|
||||
|
@ -178,14 +178,14 @@ optional you can ignore it for dedecated user
|
|||
def self.broadcast_agent_state_update(ignore_user_id = nil)
|
||||
|
||||
# send broadcast to agents
|
||||
Chat::Agent.where('active = ? OR updated_at > ?', true, Time.zone.now - 8.hours).each { |item|
|
||||
Chat::Agent.where('active = ? OR updated_at > ?', true, Time.zone.now - 8.hours).each do |item|
|
||||
next if item.updated_by_id == ignore_user_id
|
||||
data = {
|
||||
event: 'chat_status_agent',
|
||||
data: Chat.agent_state(item.updated_by_id),
|
||||
}
|
||||
Sessions.send_to(item.updated_by_id, data)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -200,7 +200,7 @@ broadcast new customer queue position to all waiting customers
|
|||
|
||||
# send position update to other waiting sessions
|
||||
position = 0
|
||||
Chat::Session.where(state: 'waiting').order('created_at ASC').each { |local_chat_session|
|
||||
Chat::Session.where(state: 'waiting').order('created_at ASC').each do |local_chat_session|
|
||||
position += 1
|
||||
data = {
|
||||
event: 'chat_session_queue',
|
||||
|
@ -211,7 +211,7 @@ broadcast new customer queue position to all waiting customers
|
|||
},
|
||||
}
|
||||
local_chat_session.send_to_recipients(data)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -227,10 +227,10 @@ optional you can put the max oldest chat entries
|
|||
=end
|
||||
|
||||
def self.cleanup(diff = 3.months)
|
||||
Chat::Session.where(state: 'closed').where('updated_at < ?', Time.zone.now - diff).each { |chat_session|
|
||||
Chat::Session.where(state: 'closed').where('updated_at < ?', Time.zone.now - diff).each do |chat_session|
|
||||
Chat::Message.where(chat_session_id: chat_session.id).delete_all
|
||||
chat_session.destroy
|
||||
}
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
@ -248,7 +248,7 @@ optional you can put the max oldest chat sessions as argument
|
|||
=end
|
||||
|
||||
def self.cleanup_close(diff = 5.minutes)
|
||||
Chat::Session.where.not(state: 'closed').where('updated_at < ?', Time.zone.now - diff).each { |chat_session|
|
||||
Chat::Session.where.not(state: 'closed').where('updated_at < ?', Time.zone.now - diff).each do |chat_session|
|
||||
next if chat_session.recipients_active?
|
||||
chat_session.state = 'closed'
|
||||
chat_session.save
|
||||
|
@ -260,7 +260,7 @@ optional you can put the max oldest chat sessions as argument
|
|||
},
|
||||
}
|
||||
chat_session.send_to_recipients(message)
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
|
|
@ -22,29 +22,29 @@ class Chat::Session < ApplicationModel
|
|||
return true if !preferences
|
||||
return true if !preferences[:participants]
|
||||
count = 0
|
||||
preferences[:participants].each { |client_id|
|
||||
preferences[:participants].each do |client_id|
|
||||
next if !Sessions.session_exists?(client_id)
|
||||
count += 1
|
||||
}
|
||||
end
|
||||
return true if count >= 2
|
||||
false
|
||||
end
|
||||
|
||||
def send_to_recipients(message, ignore_client_id = nil)
|
||||
preferences[:participants].each { |local_client_id|
|
||||
preferences[:participants].each do |local_client_id|
|
||||
next if local_client_id == ignore_client_id
|
||||
Sessions.send(local_client_id, message)
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
def position
|
||||
return if state != 'waiting'
|
||||
position = 0
|
||||
Chat::Session.where(state: 'waiting').order(created_at: :asc).each { |chat_session|
|
||||
Chat::Session.where(state: 'waiting').order(created_at: :asc).each do |chat_session|
|
||||
position += 1
|
||||
break if chat_session.id == id
|
||||
}
|
||||
end
|
||||
position
|
||||
end
|
||||
|
||||
|
@ -52,22 +52,22 @@ class Chat::Session < ApplicationModel
|
|||
chat_session = Chat::Session.find_by(session_id: session_id)
|
||||
return if !chat_session
|
||||
session_attributes = []
|
||||
Chat::Message.where(chat_session_id: chat_session.id).order(created_at: :asc).each { |message|
|
||||
Chat::Message.where(chat_session_id: chat_session.id).order(created_at: :asc).each do |message|
|
||||
session_attributes.push message.attributes
|
||||
}
|
||||
end
|
||||
session_attributes
|
||||
end
|
||||
|
||||
def self.active_chats_by_user_id(user_id)
|
||||
actice_sessions = []
|
||||
Chat::Session.where(state: 'running', user_id: user_id).order(created_at: :asc).each { |session|
|
||||
Chat::Session.where(state: 'running', user_id: user_id).order(created_at: :asc).each do |session|
|
||||
session_attributes = session.attributes
|
||||
session_attributes['messages'] = []
|
||||
Chat::Message.where(chat_session_id: session.id).order(created_at: :asc).each { |message|
|
||||
Chat::Message.where(chat_session_id: session.id).order(created_at: :asc).each do |message|
|
||||
session_attributes['messages'].push message.attributes
|
||||
}
|
||||
end
|
||||
actice_sessions.push session_attributes
|
||||
}
|
||||
end
|
||||
actice_sessions
|
||||
end
|
||||
end
|
||||
|
|
|
@ -21,10 +21,10 @@ returns
|
|||
|
||||
def generate_uniq_name(name)
|
||||
return name if !exists?(name: name)
|
||||
(1..100).each { |counter|
|
||||
(1..100).each do |counter|
|
||||
name = "#{name}_#{counter}"
|
||||
break if !exists?(name: name)
|
||||
}
|
||||
end
|
||||
name
|
||||
end
|
||||
end
|
||||
|
|
|
@ -38,11 +38,11 @@ log object update activity stream, if configured - will be executed automaticall
|
|||
ignored_attributes += %i(created_at updated_at created_by_id updated_by_id)
|
||||
|
||||
log = false
|
||||
saved_changes.each { |key, _value|
|
||||
saved_changes.each do |key, _value|
|
||||
next if ignored_attributes.include?(key.to_sym)
|
||||
|
||||
log = true
|
||||
}
|
||||
end
|
||||
return true if !log
|
||||
activity_stream_log('update', self['updated_by_id'])
|
||||
true
|
||||
|
|
|
@ -41,11 +41,11 @@ log object update history with all updated attributes, if configured - will be e
|
|||
# new record also triggers update, so ignore new records
|
||||
changes = saved_changes
|
||||
if history_changes_last_done
|
||||
history_changes_last_done.each { |key, value|
|
||||
history_changes_last_done.each do |key, value|
|
||||
if changes.key?(key) && changes[key] == value
|
||||
changes.delete(key)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
self.history_changes_last_done = changes
|
||||
#logger.info 'updated ' + self.changes.inspect
|
||||
|
@ -55,7 +55,7 @@ log object update history with all updated attributes, if configured - will be e
|
|||
ignored_attributes = self.class.instance_variable_get(:@history_attributes_ignored) || []
|
||||
ignored_attributes += %i(created_at updated_at created_by_id updated_by_id)
|
||||
|
||||
changes.each { |key, value|
|
||||
changes.each do |key, value|
|
||||
|
||||
next if ignored_attributes.include?(key.to_sym)
|
||||
|
||||
|
@ -104,7 +104,7 @@ log object update history with all updated attributes, if configured - will be e
|
|||
}
|
||||
#logger.info "HIST NEW #{self.class.to_s}.find(#{self.id}) #{data.inspect}"
|
||||
history_log('updated', updated_by_id, data)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -212,7 +212,7 @@ returns
|
|||
|
||||
# get related objects
|
||||
history = History.list(self.class.name, self['id'], nil, true)
|
||||
history[:list].each { |item|
|
||||
history[:list].each do |item|
|
||||
record = Kernel.const_get(item['object']).find(item['o_id'])
|
||||
|
||||
history[:assets] = record.assets(history[:assets])
|
||||
|
@ -221,7 +221,7 @@ returns
|
|||
record = Kernel.const_get(item['related_object']).find(item['related_o_id'])
|
||||
history[:assets] = record.assets(history[:assets])
|
||||
end
|
||||
}
|
||||
end
|
||||
{
|
||||
history: history[:list],
|
||||
assets: history[:assets],
|
||||
|
|
|
@ -84,11 +84,11 @@ returns
|
|||
|
||||
def search_index_data
|
||||
attributes = {}
|
||||
%w(name note).each { |key|
|
||||
%w(name note).each do |key|
|
||||
next if !self[key]
|
||||
next if self[key].respond_to?('blank?') && self[key].blank?
|
||||
attributes[key] = self[key]
|
||||
}
|
||||
end
|
||||
return true if attributes.blank?
|
||||
attributes
|
||||
end
|
||||
|
@ -127,7 +127,7 @@ reload search index with full data
|
|||
tolerance = 5
|
||||
tolerance_count = 0
|
||||
ids = all.order('created_at DESC').pluck(:id)
|
||||
ids.each { |item_id|
|
||||
ids.each do |item_id|
|
||||
item = find(item_id)
|
||||
next if item.ignore_search_indexing?(:destroy)
|
||||
begin
|
||||
|
@ -137,7 +137,7 @@ reload search index with full data
|
|||
tolerance_count += 1
|
||||
raise "Unable to send #{item.class}.find(#{item.id}).search_index_update_backend backend: #{e.inspect}" if tolerance_count == tolerance
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -44,7 +44,7 @@ returns
|
|||
def self.lookup(caller_id)
|
||||
|
||||
result = []
|
||||
['known', 'maybe', nil].each { |level|
|
||||
['known', 'maybe', nil].each do |level|
|
||||
|
||||
search_params = {
|
||||
caller_id: caller_id,
|
||||
|
@ -55,11 +55,11 @@ returns
|
|||
end
|
||||
|
||||
caller_ids = Cti::CallerId.select('MAX(id) as caller_id').where(search_params).group(:user_id).order('caller_id DESC').limit(20).map(&:caller_id)
|
||||
Cti::CallerId.where(id: caller_ids).order(id: :desc).each { |record|
|
||||
Cti::CallerId.where(id: caller_ids).order(id: :desc).each do |record|
|
||||
result.push record
|
||||
}
|
||||
end
|
||||
break if result.present?
|
||||
}
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
|
@ -73,11 +73,11 @@ returns
|
|||
map = config
|
||||
level = nil
|
||||
model = nil
|
||||
map.each { |item|
|
||||
map.each do |item|
|
||||
next if item[:model] != record.class
|
||||
level = item[:level]
|
||||
model = item[:model]
|
||||
}
|
||||
end
|
||||
return if !level || !model
|
||||
build_item(record, model, level)
|
||||
end
|
||||
|
@ -108,17 +108,17 @@ returns
|
|||
# get caller ids
|
||||
caller_ids = []
|
||||
attributes = record.attributes
|
||||
attributes.each { |_attribute, value|
|
||||
attributes.each do |_attribute, value|
|
||||
next if value.class != String
|
||||
next if value.empty?
|
||||
local_caller_ids = Cti::CallerId.extract_numbers(value)
|
||||
next if local_caller_ids.empty?
|
||||
caller_ids = caller_ids.concat(local_caller_ids)
|
||||
}
|
||||
end
|
||||
|
||||
# store caller ids
|
||||
Cti::CallerId.where(object: model.to_s, o_id: record.id).destroy_all
|
||||
caller_ids.each { |caller_id|
|
||||
caller_ids.each do |caller_id|
|
||||
Cti::CallerId.maybe_add(
|
||||
caller_id: caller_id,
|
||||
level: level,
|
||||
|
@ -126,7 +126,7 @@ returns
|
|||
o_id: record.id,
|
||||
user_id: user_id,
|
||||
)
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -139,13 +139,13 @@ returns
|
|||
def self.rebuild
|
||||
transaction do
|
||||
delete_all
|
||||
config.each { |item|
|
||||
config.each do |item|
|
||||
level = item[:level]
|
||||
model = item[:model]
|
||||
item[:model].find_each(batch_size: 500) do |record|
|
||||
build_item(record, model, level)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -221,7 +221,7 @@ returns
|
|||
preferences_maybe = {}
|
||||
preferences_maybe[direction] = []
|
||||
|
||||
lookup(extract_numbers(caller_id)).each { |record|
|
||||
lookup(extract_numbers(caller_id)).each do |record|
|
||||
if record.level == 'known'
|
||||
preferences_known[direction].push record.attributes
|
||||
else
|
||||
|
@ -247,7 +247,7 @@ returns
|
|||
end
|
||||
from_comment_maybe += comment
|
||||
end
|
||||
}
|
||||
end
|
||||
return [from_comment_known, preferences_known] if !from_comment_known.empty?
|
||||
return ["maybe #{from_comment_maybe}", preferences_maybe] if !from_comment_maybe.empty?
|
||||
nil
|
||||
|
|
|
@ -247,18 +247,18 @@ returns
|
|||
|
||||
# add assets
|
||||
assets = {}
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
next if !item.preferences
|
||||
%w(from to).each { |direction|
|
||||
%w(from to).each do |direction|
|
||||
next if !item.preferences[direction]
|
||||
item.preferences[direction].each { |caller_id|
|
||||
item.preferences[direction].each do |caller_id|
|
||||
next if !caller_id['user_id']
|
||||
user = User.lookup(id: caller_id['user_id'])
|
||||
next if !user
|
||||
assets = user.assets(assets)
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
{
|
||||
list: list,
|
||||
|
@ -344,7 +344,7 @@ Cti::Log.process(
|
|||
|
||||
def push_event
|
||||
users = User.with_permissions('cti.agent')
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
|
||||
# send notify about event
|
||||
Sessions.send_to(
|
||||
|
@ -354,14 +354,14 @@ Cti::Log.process(
|
|||
data: self,
|
||||
},
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def push_caller_list
|
||||
list = Cti::Log.log
|
||||
|
||||
users = User.with_permissions('cti.agent')
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
|
||||
# send notify on create/update/delete
|
||||
Sessions.send_to(
|
||||
|
@ -371,7 +371,7 @@ Cti::Log.process(
|
|||
data: list,
|
||||
},
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
|
|
@ -24,7 +24,7 @@ check and if channel not exists reset configured channels for email addresses
|
|||
=end
|
||||
|
||||
def self.channel_cleanup
|
||||
EmailAddress.all.each { |email_address|
|
||||
EmailAddress.all.each do |email_address|
|
||||
|
||||
# set to active if channel exists
|
||||
if email_address.channel_id && Channel.find_by(id: email_address.channel_id)
|
||||
|
@ -37,7 +37,7 @@ check and if channel not exists reset configured channels for email addresses
|
|||
# set in inactive if channel not longer exists
|
||||
next if !email_address.active
|
||||
email_address.save!
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -68,9 +68,9 @@ check and if channel not exists reset configured channels for email addresses
|
|||
|
||||
# delete group.email_address_id reference if email address get's deleted
|
||||
def delete_group_reference
|
||||
Group.where(email_address_id: id).each { |group|
|
||||
Group.where(email_address_id: id).each do |group|
|
||||
group.update!(email_address_id: nil)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# keep email email address is of inital group filled
|
||||
|
|
|
@ -8,7 +8,7 @@ class ExternalSync < ApplicationModel
|
|||
def changed?(object:, previous_changes: {}, current_changes:)
|
||||
changed = false
|
||||
previous_changes ||= {}
|
||||
current_changes.each { |attribute, value|
|
||||
current_changes.each do |attribute, value|
|
||||
next if !object.attributes.key?(attribute.to_s)
|
||||
next if object[attribute] == value
|
||||
next if object[attribute].present? && object[attribute] != previous_changes[attribute]
|
||||
|
@ -19,7 +19,7 @@ class ExternalSync < ApplicationModel
|
|||
rescue => e
|
||||
Rails.logger.error "ERROR: Unable to assign attribute #{attribute} to object #{object.class.name}: #{e.inspect}"
|
||||
end
|
||||
}
|
||||
end
|
||||
changed
|
||||
end
|
||||
|
||||
|
@ -32,7 +32,7 @@ class ExternalSync < ApplicationModel
|
|||
end
|
||||
|
||||
result = {}
|
||||
mapping.each { |remote_key, local_key|
|
||||
mapping.each do |remote_key, local_key|
|
||||
|
||||
local_key_sym = local_key.to_sym
|
||||
|
||||
|
@ -40,7 +40,7 @@ class ExternalSync < ApplicationModel
|
|||
value = extract(remote_key, information_source)
|
||||
next if value.blank?
|
||||
result[local_key_sym] = value
|
||||
}
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
|
|
|
@ -36,13 +36,13 @@ returns
|
|||
data = assets_of_selector('condition', data)
|
||||
data = assets_of_selector('perform', data)
|
||||
end
|
||||
%w(created_by_id updated_by_id).each { |local_user_id|
|
||||
%w(created_by_id updated_by_id).each do |local_user_id|
|
||||
next if !self[ local_user_id ]
|
||||
next if data[ User.to_app_model ][ self[ local_user_id ] ]
|
||||
user = User.lookup(id: self[ local_user_id ])
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
end
|
||||
|
|
|
@ -74,7 +74,7 @@ remove whole karma activity log of an object
|
|||
def self.latest(user, limit = 12)
|
||||
result = []
|
||||
logs = Karma::ActivityLog.where(user_id: user.id).order(id: :desc).limit(limit)
|
||||
logs.each { |log|
|
||||
logs.each do |log|
|
||||
last = result.last
|
||||
if last && last[:object_id] == log.object_id && last[:o_id] == log.o_id && last[:created_at] == log.created_at
|
||||
comment = {
|
||||
|
@ -97,7 +97,7 @@ remove whole karma activity log of an object
|
|||
created_at: log.created_at,
|
||||
}
|
||||
result.push data
|
||||
}
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
|
|
|
@ -30,14 +30,14 @@ class Karma::User < ApplicationModel
|
|||
def self.level_by_score(score)
|
||||
level = nil
|
||||
karma_levels = Setting.get('karma_levels')
|
||||
karma_levels.each { |local_level|
|
||||
karma_levels.each do |local_level|
|
||||
if !level
|
||||
level = local_level[:name]
|
||||
end
|
||||
next if local_level[:start] && score < local_level[:start]
|
||||
next if local_level[:end] && score > local_level[:end]
|
||||
level = local_level[:name]
|
||||
}
|
||||
end
|
||||
level
|
||||
end
|
||||
|
||||
|
|
|
@ -31,25 +31,25 @@ class Link < ApplicationModel
|
|||
'link_object_source_id = ? AND link_object_source_value = ?', linkobject.id, data[:link_object_value]
|
||||
)
|
||||
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
link = {}
|
||||
link['link_type'] = @map[ Link::Type.find( item.link_type_id ).name ]
|
||||
link['link_object'] = Link::Object.find( item.link_object_target_id ).name
|
||||
link['link_object_value'] = item.link_object_target_value
|
||||
items.push link
|
||||
}
|
||||
end
|
||||
|
||||
# get links for the other site
|
||||
list = Link.where(
|
||||
'link_object_target_id = ? AND link_object_target_value = ?', linkobject.id, data[:link_object_value]
|
||||
)
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
link = {}
|
||||
link['link_type'] = Link::Type.find( item.link_type_id ).name
|
||||
link['link_object'] = Link::Object.find( item.link_object_source_id ).name
|
||||
link['link_object_value'] = item.link_object_source_value
|
||||
items.push link
|
||||
}
|
||||
end
|
||||
|
||||
items
|
||||
end
|
||||
|
|
|
@ -116,14 +116,14 @@ all:
|
|||
|
||||
private_class_method def self.to_database(data)
|
||||
ActiveRecord::Base.transaction do
|
||||
data.each { |locale|
|
||||
data.each do |locale|
|
||||
exists = Locale.find_by(locale: locale['locale'])
|
||||
if exists
|
||||
exists.update!(locale.symbolize_keys!)
|
||||
else
|
||||
Locale.create!(locale.symbolize_keys!)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -29,12 +29,12 @@ list of all attributes
|
|||
result = ObjectManager::Attribute.all.order('position ASC, name ASC')
|
||||
attributes = []
|
||||
assets = {}
|
||||
result.each { |item|
|
||||
result.each do |item|
|
||||
attribute = item.attributes
|
||||
attribute[:object] = ObjectLookup.by_id(item.object_lookup_id)
|
||||
attribute.delete('object_lookup_id')
|
||||
attributes.push attribute
|
||||
}
|
||||
end
|
||||
attributes
|
||||
end
|
||||
|
||||
|
@ -279,11 +279,11 @@ possible types
|
|||
|
||||
# if data_option has changed, store it for next migration
|
||||
if !force
|
||||
[:name, :display, :data_type, :position, :active].each { |key|
|
||||
[:name, :display, :data_type, :position, :active].each do |key|
|
||||
next if record[key] == data[key]
|
||||
data[:to_config] = true
|
||||
break
|
||||
}
|
||||
end
|
||||
if record[:data_option] != data[:data_option]
|
||||
|
||||
# do we need a database migration?
|
||||
|
@ -298,9 +298,9 @@ possible types
|
|||
end
|
||||
|
||||
# update attributes
|
||||
data.each { |key, value|
|
||||
data.each do |key, value|
|
||||
record[key.to_sym] = value
|
||||
}
|
||||
end
|
||||
|
||||
# check editable & name
|
||||
if !force
|
||||
|
@ -434,7 +434,7 @@ returns:
|
|||
to_delete: false,
|
||||
).order('position ASC, name ASC')
|
||||
attributes = []
|
||||
result.each { |item|
|
||||
result.each do |item|
|
||||
data = {
|
||||
name: item.name,
|
||||
display: item.display,
|
||||
|
@ -444,32 +444,32 @@ returns:
|
|||
if item.data_option[:permission] && item.data_option[:permission].any?
|
||||
next if !user
|
||||
hint = false
|
||||
item.data_option[:permission].each { |permission|
|
||||
item.data_option[:permission].each do |permission|
|
||||
next if !user.permissions?(permission)
|
||||
hint = true
|
||||
break
|
||||
}
|
||||
end
|
||||
next if !hint
|
||||
end
|
||||
|
||||
if item.screens
|
||||
data[:screen] = {}
|
||||
item.screens.each { |screen, permission_options|
|
||||
item.screens.each do |screen, permission_options|
|
||||
data[:screen][screen] = {}
|
||||
permission_options.each { |permission, options|
|
||||
permission_options.each do |permission, options|
|
||||
if permission == '-all-'
|
||||
data[:screen][screen] = options
|
||||
elsif user && user.permissions?(permission)
|
||||
data[:screen][screen] = options
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
if item.data_option
|
||||
data = data.merge(item.data_option.symbolize_keys)
|
||||
end
|
||||
attributes.push data
|
||||
}
|
||||
end
|
||||
attributes
|
||||
end
|
||||
|
||||
|
@ -492,9 +492,9 @@ returns:
|
|||
def self.by_object_as_hash(object, user)
|
||||
list = by_object(object, user)
|
||||
hash = {}
|
||||
list.each { |item|
|
||||
list.each do |item|
|
||||
hash[ item[:name] ] = item
|
||||
}
|
||||
end
|
||||
hash
|
||||
end
|
||||
|
||||
|
@ -512,13 +512,13 @@ returns
|
|||
|
||||
def self.discard_changes
|
||||
ObjectManager::Attribute.where('to_create = ?', true).each(&:destroy)
|
||||
ObjectManager::Attribute.where('to_delete = ? OR to_config = ?', true, true).each { |attribute|
|
||||
ObjectManager::Attribute.where('to_delete = ? OR to_config = ?', true, true).each do |attribute|
|
||||
attribute.to_migrate = false
|
||||
attribute.to_delete = false
|
||||
attribute.to_config = false
|
||||
attribute.data_option_new = {}
|
||||
attribute.save
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -576,7 +576,7 @@ to send no browser reload event, pass false
|
|||
# check if field already exists
|
||||
execute_db_count = 0
|
||||
execute_config_count = 0
|
||||
migrations.each { |attribute|
|
||||
migrations.each do |attribute|
|
||||
model = Kernel.const_get(attribute.object_lookup.name)
|
||||
|
||||
# remove field
|
||||
|
@ -698,7 +698,7 @@ to send no browser reload event, pass false
|
|||
|
||||
reset_database_info(model)
|
||||
execute_db_count += 1
|
||||
}
|
||||
end
|
||||
|
||||
# sent maintenance message to clients
|
||||
if send_event
|
||||
|
@ -783,10 +783,10 @@ to send no browser reload event, pass false
|
|||
end
|
||||
|
||||
if data_type == 'integer'
|
||||
[:min, :max].each { |item|
|
||||
[:min, :max].each do |item|
|
||||
raise "Need data_option[#{item.inspect}] param" if !data_option[item]
|
||||
raise "Invalid data_option[#{item.inspect}] param #{data_option[item]}" if data_option[item].to_s !~ /^\d+?$/
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
if data_type == 'select' || data_type == 'tree_select' || data_type == 'checkbox'
|
||||
|
|
|
@ -24,20 +24,20 @@ class Observer::Organization::RefObjectTouch < ActiveRecord::Observer
|
|||
return true if User.where(organization_id: record.id).count > 100
|
||||
|
||||
# touch organizations tickets
|
||||
Ticket.select('id').where(organization_id: record.id).pluck(:id).each { |ticket_id|
|
||||
Ticket.select('id').where(organization_id: record.id).pluck(:id).each do |ticket_id|
|
||||
ticket = Ticket.find(ticket_id)
|
||||
ticket.with_lock do
|
||||
ticket.touch
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# touch current members
|
||||
User.select('id').where(organization_id: record.id).pluck(:id).each { |user_id|
|
||||
User.select('id').where(organization_id: record.id).pluck(:id).each do |user_id|
|
||||
user = User.find(user_id)
|
||||
user.with_lock do
|
||||
user.touch
|
||||
end
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -37,11 +37,11 @@ class Observer::Sla::TicketRebuildEscalation < ActiveRecord::Observer
|
|||
else
|
||||
%w(timezone business_hours default ical_url public_holidays)
|
||||
end
|
||||
fields_to_check.each { |item|
|
||||
fields_to_check.each do |item|
|
||||
next if !record.saved_change_to_attribute(item)
|
||||
next if record.saved_change_to_attribute(item)[0] == record.saved_change_to_attribute(item)[1]
|
||||
changed = true
|
||||
}
|
||||
end
|
||||
return true if !changed
|
||||
|
||||
_rebuild(record)
|
||||
|
|
|
@ -90,7 +90,7 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
|
|||
|
||||
# add history record
|
||||
recipient_list = ''
|
||||
[:to, :cc].each { |key|
|
||||
[:to, :cc].each do |key|
|
||||
|
||||
next if !record[key]
|
||||
next if record[key] == ''
|
||||
|
@ -99,7 +99,7 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
|
|||
recipient_list += ','
|
||||
end
|
||||
recipient_list += record[key]
|
||||
}
|
||||
end
|
||||
|
||||
Rails.logger.info "Send email to: '#{recipient_list}' (from #{record.from})"
|
||||
|
||||
|
@ -130,7 +130,7 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
|
|||
if local_record.preferences['delivery_retry'] > 3
|
||||
|
||||
recipient_list = ''
|
||||
[:to, :cc].each { |key|
|
||||
[:to, :cc].each do |key|
|
||||
|
||||
next if !local_record[key]
|
||||
next if local_record[key] == ''
|
||||
|
@ -139,7 +139,7 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob
|
|||
recipient_list += ','
|
||||
end
|
||||
recipient_list += local_record[key]
|
||||
}
|
||||
end
|
||||
|
||||
# reopen ticket and notify agent
|
||||
Observer::Transaction.reset
|
||||
|
|
|
@ -30,14 +30,14 @@ class Observer::Ticket::Article::CommunicateTelegram::BackgroundJob
|
|||
api = TelegramAPI.new(channel.options[:api_token])
|
||||
chat_id = ticket.preferences[:telegram][:chat_id]
|
||||
result = api.sendMessage(chat_id, article.body)
|
||||
article.attachments.each { |file|
|
||||
article.attachments.each do |file|
|
||||
parts = file.filename.split(/^(.*)(\..+?)$/)
|
||||
t = Tempfile.new([parts[1], parts[2]])
|
||||
t.binmode
|
||||
t.write(file.content)
|
||||
t.rewind
|
||||
api.sendDocument(chat_id, t.path.to_s)
|
||||
}
|
||||
end
|
||||
rescue => e
|
||||
log_error(article, e.message)
|
||||
return
|
||||
|
|
|
@ -56,13 +56,13 @@ class Observer::Ticket::Article::CommunicateTwitter::BackgroundJob
|
|||
if tweet.user_mentions
|
||||
to = ''
|
||||
mention_ids = []
|
||||
tweet.user_mentions.each { |user|
|
||||
tweet.user_mentions.each do |user|
|
||||
if to != ''
|
||||
to += ' '
|
||||
end
|
||||
to += "@#{user.screen_name}"
|
||||
mention_ids.push user.id
|
||||
}
|
||||
end
|
||||
article.to = to
|
||||
article.preferences['twitter'] = {
|
||||
mention_ids: mention_ids,
|
||||
|
|
|
@ -9,7 +9,7 @@ class Observer::Ticket::OnlineNotificationSeen::BackgroundJob
|
|||
# set all online notifications to seen
|
||||
Transaction.execute do
|
||||
ticket = Ticket.lookup(id: @ticket_id)
|
||||
OnlineNotification.list_by_object('Ticket', @ticket_id).each { |notification|
|
||||
OnlineNotification.list_by_object('Ticket', @ticket_id).each do |notification|
|
||||
next if notification.seen
|
||||
seen = ticket.online_notification_seen_state(notification.user_id)
|
||||
next if !seen
|
||||
|
@ -17,7 +17,7 @@ class Observer::Ticket::OnlineNotificationSeen::BackgroundJob
|
|||
notification.seen = true
|
||||
notification.updated_by_id = @user_id
|
||||
notification.save!
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -31,26 +31,26 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
|
||||
# get asyn backends
|
||||
sync_backends = []
|
||||
Setting.where(area: 'Transaction::Backend::Sync').order(:name).each { |setting|
|
||||
Setting.where(area: 'Transaction::Backend::Sync').order(:name).each do |setting|
|
||||
backend = Setting.get(setting.name)
|
||||
next if params[:disable] && params[:disable].include?(backend)
|
||||
sync_backends.push Kernel.const_get(backend)
|
||||
}
|
||||
end
|
||||
|
||||
# get uniq objects
|
||||
list_objects = get_uniq_changes(list)
|
||||
list_objects.each { |_object, objects|
|
||||
objects.each { |_id, item|
|
||||
list_objects.each do |_object, objects|
|
||||
objects.each do |_id, item|
|
||||
|
||||
# execute sync backends
|
||||
sync_backends.each { |backend|
|
||||
sync_backends.each do |backend|
|
||||
execute_singel_backend(backend, item, params)
|
||||
}
|
||||
end
|
||||
|
||||
# execute async backends
|
||||
Delayed::Job.enqueue(Transaction::BackgroundJob.new(item, params))
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.execute_singel_backend(backend, item, params)
|
||||
|
@ -115,7 +115,7 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
|
||||
def self.get_uniq_changes(events)
|
||||
list_objects = {}
|
||||
events.each { |event|
|
||||
events.each do |event|
|
||||
|
||||
# simulate article create as ticket update
|
||||
article = nil
|
||||
|
@ -159,13 +159,13 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
if !store[:changes]
|
||||
store[:changes] = event[:changes]
|
||||
else
|
||||
event[:changes].each { |key, value|
|
||||
event[:changes].each do |key, value|
|
||||
if !store[:changes][key]
|
||||
store[:changes][key] = value
|
||||
else
|
||||
store[:changes][key][1] = value[1]
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -173,7 +173,7 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
if article
|
||||
store[:article_id] = article.id
|
||||
end
|
||||
}
|
||||
end
|
||||
list_objects
|
||||
end
|
||||
|
||||
|
@ -201,7 +201,7 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
|
||||
# ignore certain attributes
|
||||
real_changes = {}
|
||||
record.changes_to_save.each { |key, value|
|
||||
record.changes_to_save.each do |key, value|
|
||||
next if key == 'updated_at'
|
||||
next if key == 'first_response_at'
|
||||
next if key == 'close_at'
|
||||
|
@ -212,7 +212,7 @@ class Observer::Transaction < ActiveRecord::Observer
|
|||
next if key == 'create_article_type_id'
|
||||
next if key == 'create_article_sender_id'
|
||||
real_changes[key] = value
|
||||
}
|
||||
end
|
||||
|
||||
# do not send anything if nothing has changed
|
||||
return true if real_changes.empty?
|
||||
|
|
|
@ -24,16 +24,16 @@ class Observer::User::Geo < ActiveRecord::Observer
|
|||
return if !current
|
||||
|
||||
current_location = {}
|
||||
location.each { |item|
|
||||
location.each do |item|
|
||||
current_location[item] = current[item]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
# get full address
|
||||
next_location = {}
|
||||
location.each { |item|
|
||||
location.each do |item|
|
||||
next_location[item] = record[item]
|
||||
}
|
||||
end
|
||||
|
||||
# return if address hasn't changed and geo data is already available
|
||||
return if (current_location == next_location) && record.preferences['lat'] && record.preferences['lng']
|
||||
|
@ -46,13 +46,13 @@ class Observer::User::Geo < ActiveRecord::Observer
|
|||
def geo_update(record)
|
||||
address = ''
|
||||
location = %w(address street zip city country)
|
||||
location.each { |item|
|
||||
location.each do |item|
|
||||
next if record[item].blank?
|
||||
if address.present?
|
||||
address += ', '
|
||||
end
|
||||
address += record[item]
|
||||
}
|
||||
end
|
||||
|
||||
# return if no address is given
|
||||
return if address.blank?
|
||||
|
|
|
@ -46,10 +46,10 @@ class Observer::User::RefObjectTouch < ActiveRecord::Observer
|
|||
end
|
||||
|
||||
# touch old/current customer
|
||||
member_ids.uniq.each { |user_id|
|
||||
member_ids.uniq.each do |user_id|
|
||||
next if user_id == record.id
|
||||
User.find(user_id).touch
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,12 +19,12 @@ class Observer::User::TicketOrganization < ActiveRecord::Observer
|
|||
|
||||
# update last 100 tickets of user
|
||||
tickets = Ticket.where(customer_id: record.id).limit(100)
|
||||
tickets.each { |ticket|
|
||||
tickets.each do |ticket|
|
||||
if ticket.organization_id != record.organization_id
|
||||
ticket.organization_id = record.organization_id
|
||||
ticket.save
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -218,9 +218,9 @@ returns:
|
|||
|
||||
def self.all_seen?(object, o_id)
|
||||
notifications = OnlineNotification.list_by_object(object, o_id)
|
||||
notifications.each { |onine_notification|
|
||||
notifications.each do |onine_notification|
|
||||
return false if !onine_notification['seen']
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -240,14 +240,14 @@ returns:
|
|||
def self.exists?(user, object, o_id, type, created_by_user, seen)
|
||||
# rubocop:enable Metrics/ParameterLists
|
||||
notifications = OnlineNotification.list(user, 10)
|
||||
notifications.each { |notification|
|
||||
notifications.each do |notification|
|
||||
next if notification['o_id'] != o_id
|
||||
next if notification['object'] != object
|
||||
next if notification['type'] != type
|
||||
next if notification['created_by_id'] != created_by_user.id
|
||||
next if notification['seen'] != seen
|
||||
return true
|
||||
}
|
||||
end
|
||||
false
|
||||
end
|
||||
|
||||
|
@ -269,7 +269,7 @@ with dedicated times
|
|||
|
||||
def self.cleanup(max_age = Time.zone.now - 9.months, max_own_seen = Time.zone.now - 10.minutes, max_auto_seen = Time.zone.now - 8.hours)
|
||||
OnlineNotification.where('created_at < ?', max_age).delete_all
|
||||
OnlineNotification.where('seen = ? AND updated_at < ?', true, max_own_seen).each { |notification|
|
||||
OnlineNotification.where('seen = ? AND updated_at < ?', true, max_own_seen).each do |notification|
|
||||
|
||||
# delete own "seen" notificatons after 1 hour
|
||||
next if notification.user_id == notification.updated_by_id && notification.updated_at > max_own_seen
|
||||
|
@ -278,10 +278,10 @@ with dedicated times
|
|||
next if notification.user_id != notification.updated_by_id && notification.updated_at > max_auto_seen
|
||||
|
||||
notification.delete
|
||||
}
|
||||
end
|
||||
|
||||
# notify all agents
|
||||
User.with_permissions('ticket.agent').each { |user|
|
||||
User.with_permissions('ticket.agent').each do |user|
|
||||
Sessions.send_to(
|
||||
user.id,
|
||||
{
|
||||
|
@ -290,7 +290,7 @@ with dedicated times
|
|||
}
|
||||
)
|
||||
sleep 2 # slow down client requests
|
||||
}
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
|
|
@ -45,23 +45,23 @@ returns
|
|||
if local_attributes['member_ids'].count > 100
|
||||
local_attributes['member_ids'] = local_attributes['member_ids'].sort[0, 100]
|
||||
end
|
||||
local_attributes['member_ids'].each { |local_user_id|
|
||||
local_attributes['member_ids'].each do |local_user_id|
|
||||
next if data[ app_model_user ][ local_user_id ]
|
||||
user = User.lookup(id: local_user_id)
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
data[ app_model_organization ][ id ] = local_attributes
|
||||
end
|
||||
%w(created_by_id updated_by_id).each { |local_user_id|
|
||||
%w(created_by_id updated_by_id).each do |local_user_id|
|
||||
next if !self[ local_user_id ]
|
||||
next if data[ app_model_user ][ self[ local_user_id ] ]
|
||||
user = User.lookup(id: self[ local_user_id ])
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
end
|
||||
|
|
|
@ -60,11 +60,11 @@ returns
|
|||
if SearchIndexBackend.enabled?
|
||||
items = SearchIndexBackend.search(query, limit, 'Organization')
|
||||
organizations = []
|
||||
items.each { |item|
|
||||
items.each do |item|
|
||||
organization = Organization.lookup(id: item[:id])
|
||||
next if !organization
|
||||
organizations.push organization
|
||||
}
|
||||
end
|
||||
return organizations
|
||||
end
|
||||
|
||||
|
@ -80,19 +80,19 @@ returns
|
|||
organizations_by_user = Organization.select('DISTINCT(organizations.id), organizations.name').joins('LEFT OUTER JOIN users ON users.organization_id = organizations.id').where(
|
||||
'users.firstname LIKE ? or users.lastname LIKE ? or users.email LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%"
|
||||
).order('organizations.name').limit(limit)
|
||||
organizations_by_user.each { |organization_by_user|
|
||||
organizations_by_user.each do |organization_by_user|
|
||||
organization_exists = false
|
||||
organizations.each { |organization|
|
||||
organizations.each do |organization|
|
||||
if organization.id == organization_by_user.id
|
||||
organization_exists = true
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
# get model with full data
|
||||
if !organization_exists
|
||||
organizations.push Organization.find(organization_by_user.id)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
organizations
|
||||
end
|
||||
|
|
|
@ -22,9 +22,9 @@ returns
|
|||
# add org members for search index data
|
||||
attributes['members'] = []
|
||||
users = User.where(organization_id: id)
|
||||
users.each { |user|
|
||||
users.each do |user|
|
||||
attributes['members'].push user.search_index_data
|
||||
}
|
||||
end
|
||||
|
||||
attributes
|
||||
end
|
||||
|
|
|
@ -35,24 +35,24 @@ returns
|
|||
if !data[ app_model_overview ][ id ]
|
||||
data[ app_model_overview ][ id ] = attributes_with_association_ids
|
||||
if user_ids
|
||||
user_ids.each { |local_user_id|
|
||||
user_ids.each do |local_user_id|
|
||||
next if data[ app_model_user ][ local_user_id ]
|
||||
user = User.lookup(id: local_user_id)
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
data = assets_of_selector('condition', data)
|
||||
|
||||
end
|
||||
%w(created_by_id updated_by_id).each { |local_user_id|
|
||||
%w(created_by_id updated_by_id).each do |local_user_id|
|
||||
next if !self[ local_user_id ]
|
||||
next if data[ app_model_user ][ self[ local_user_id ] ]
|
||||
user = User.lookup(id: self[ local_user_id ])
|
||||
next if !user
|
||||
data = user.assets(data)
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
end
|
||||
|
|
|
@ -32,7 +32,7 @@ returns:
|
|||
|
||||
# verify installed files
|
||||
issues = {}
|
||||
package['files'].each { |file|
|
||||
package['files'].each do |file|
|
||||
if !File.exist?(file['location'])
|
||||
logger.error "File #{file['location']} is missing"
|
||||
issues[file['location']] = 'missing'
|
||||
|
@ -43,7 +43,7 @@ returns:
|
|||
next if content_package == content_fs
|
||||
logger.error "File #{file['location']} is different"
|
||||
issues[file['location']] = 'changed'
|
||||
}
|
||||
end
|
||||
return nil if issues.empty?
|
||||
issues
|
||||
end
|
||||
|
@ -65,9 +65,9 @@ install all packages located under auto_install/*.zpm
|
|||
data.push entry
|
||||
end
|
||||
end
|
||||
data.each { |file|
|
||||
data.each do |file|
|
||||
install(file: "#{path}/#{file}")
|
||||
}
|
||||
end
|
||||
data
|
||||
end
|
||||
|
||||
|
@ -273,11 +273,11 @@ returns
|
|||
end
|
||||
|
||||
# write files
|
||||
package['files'].each { |file|
|
||||
package['files'].each do |file|
|
||||
permission = file['permission'] || '644'
|
||||
content = Base64.decode64(file['content'])
|
||||
_write_file(file['location'], permission, content)
|
||||
}
|
||||
end
|
||||
|
||||
# update package state
|
||||
package_db.state = 'installed'
|
||||
|
@ -343,11 +343,11 @@ returns
|
|||
Package::Migration.migrate(package['name'], 'reverse')
|
||||
end
|
||||
|
||||
package['files'].each { |file|
|
||||
package['files'].each do |file|
|
||||
permission = file['permission'] || '644'
|
||||
content = Base64.decode64(file['content'])
|
||||
_delete_file(file['location'], permission, content)
|
||||
}
|
||||
end
|
||||
|
||||
# delete package
|
||||
if !data[:reinstall]
|
||||
|
@ -370,11 +370,11 @@ execute all pending package migrations at once
|
|||
=end
|
||||
|
||||
def self.migration_execute
|
||||
Package.all.each { |package|
|
||||
Package.all.each do |package|
|
||||
json_file = Package._get_bin(package.name, package.version)
|
||||
package = JSON.parse(json_file)
|
||||
Package::Migration.migrate(package['name'])
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def self._get_bin(name, version)
|
||||
|
@ -435,17 +435,17 @@ execute all pending package migrations at once
|
|||
|
||||
# check if directories need to be created
|
||||
directories = location.split '/'
|
||||
(0..(directories.length - 2) ).each { |position|
|
||||
(0..(directories.length - 2) ).each do |position|
|
||||
tmp_path = ''
|
||||
(1..position).each { |count|
|
||||
(1..position).each do |count|
|
||||
tmp_path = "#{tmp_path}/#{directories[count]}"
|
||||
}
|
||||
end
|
||||
|
||||
next if tmp_path == ''
|
||||
next if File.exist?(tmp_path)
|
||||
|
||||
Dir.mkdir(tmp_path, 0o755)
|
||||
}
|
||||
end
|
||||
|
||||
# install file
|
||||
begin
|
||||
|
@ -501,11 +501,11 @@ execute all pending package migrations at once
|
|||
|
||||
# get existing migrations
|
||||
migrations_existing = []
|
||||
Dir.foreach(location) { |entry|
|
||||
Dir.foreach(location) do |entry|
|
||||
next if entry == '.'
|
||||
next if entry == '..'
|
||||
migrations_existing.push entry
|
||||
}
|
||||
end
|
||||
|
||||
# up
|
||||
migrations_existing = migrations_existing.sort
|
||||
|
@ -515,7 +515,7 @@ execute all pending package migrations at once
|
|||
migrations_existing = migrations_existing.reverse
|
||||
end
|
||||
|
||||
migrations_existing.each { |migration|
|
||||
migrations_existing.each do |migration|
|
||||
next if migration !~ /\.rb$/
|
||||
version = nil
|
||||
name = nil
|
||||
|
@ -550,7 +550,7 @@ execute all pending package migrations at once
|
|||
classname.constantize.up
|
||||
Package::Migration.create(name: package.underscore, version: version)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def self.root
|
||||
|
|
|
@ -21,13 +21,13 @@ returns
|
|||
def self.with_parents(key)
|
||||
names = []
|
||||
part = ''
|
||||
key.split('.').each { |local_part|
|
||||
key.split('.').each do |local_part|
|
||||
if part != ''
|
||||
part += '.'
|
||||
end
|
||||
part += local_part
|
||||
names.push part
|
||||
}
|
||||
end
|
||||
names
|
||||
end
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ class PostmasterFilter < ApplicationModel
|
|||
|
||||
def validate_condition
|
||||
raise Exceptions::UnprocessableEntity, 'Min. one match rule needed!' if match.blank?
|
||||
match.each { |_key, meta|
|
||||
match.each do |_key, meta|
|
||||
raise Exceptions::UnprocessableEntity, 'operator invalid, ony "contains" and "contains not" is supported' if meta['operator'].blank? || meta['operator'] !~ /^(contains|contains not)$/
|
||||
raise Exceptions::UnprocessableEntity, 'value invalid/empty' if meta['value'].blank?
|
||||
begin
|
||||
|
@ -22,7 +22,7 @@ class PostmasterFilter < ApplicationModel
|
|||
rescue => e
|
||||
raise Exceptions::UnprocessableEntity, e.message
|
||||
end
|
||||
}
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ class RecentView < ApplicationModel
|
|||
end
|
||||
|
||||
list = []
|
||||
recent_views.each { |item|
|
||||
recent_views.each do |item|
|
||||
data = item.attributes
|
||||
data['object'] = ObjectLookup.by_id(data['recent_view_object_id'])
|
||||
data.delete('recent_view_object_id')
|
||||
|
@ -67,7 +67,7 @@ class RecentView < ApplicationModel
|
|||
|
||||
# add to result list
|
||||
list.push data
|
||||
}
|
||||
end
|
||||
list
|
||||
end
|
||||
|
||||
|
|
|
@ -306,11 +306,11 @@ class Report
|
|||
]
|
||||
config[:metric][:communication][:backend] = backend
|
||||
|
||||
config[:metric].each { |metric_key, metric_value|
|
||||
metric_value[:backend].each { |metric_backend|
|
||||
config[:metric].each do |metric_key, metric_value|
|
||||
metric_value[:backend].each do |metric_backend|
|
||||
metric_backend[:name] = "#{metric_key}::#{metric_backend[:name]}"
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
config
|
||||
end
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue