Class: CmAdmin::Models::Export

Inherits:
Object
  • Object
show all
Defined in:
lib/cm_admin/models/export.rb

Class Method Summary collapse

Class Method Details

.create_workbook(records, class_name, file_path) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/cm_admin/models/export.rb', line 40

def create_workbook(records, class_name, file_path)
  flattened_records = records.map { |record| CmAdmin::Utils.flatten_hash(record) }
  columns = flattened_records.map{|x| x.keys}.flatten.uniq.sort
  size_arr = []
  columns.size.times { size_arr << 22 }
  xl = Axlsx::Package.new
  xl.workbook.add_worksheet do |sheet|
    sheet.add_row columns&.map(&:titleize), b: true
    flattened_records.each do |record|
      sheet.add_row(columns.map { |column| record[column] })
    end
  sheet.column_widths(*size_arr)
  end
  xl.serialize(file_path)
end

.exportable_columns(klass) ⇒ Object



56
57
58
# File 'lib/cm_admin/models/export.rb', line 56

def exportable_columns(klass)
  klass.available_fields[:index].map{|x| x.exportable ? x.field_name : ""}.reject { |c| c.empty? }
end

.format_records(records, model, columns, helpers) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/cm_admin/models/export.rb', line 20

def format_records(records, model, columns, helpers)
  custom_fields = model.available_fields[:index].map{|field| field if field.field_type == :custom}.compact
  normal_fields = model.available_fields[:index].map{|field| field unless field.field_type == :custom}.compact
  deserialized_columns = CmAdmin::Utils.deserialize_csv_columns(columns, :as_json_params)
  # This includes isn't recursve, a full solution should be recursive
  records_arr = []
  records.includes(deserialized_columns[:include].keys).find_each do |record|
    record_hash = record.as_json({only: columns.map(&:to_sym)})
    columns.each do |column|
      break unless model.available_fields[:index].map(&:field_name).include?(column.to_sym)
      record_hash[column.to_sym] = record.send(column.to_sym)
    end
    custom_fields.each do |field|
      record_hash[field.field_name.to_sym] = helpers.send(field.helper_method, record, field.field_name)
    end
    records_arr << record_hash
  end
  records_arr
end

.generate_excel(klass_name, params, helpers) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/cm_admin/models/export.rb', line 5

def generate_excel(klass_name, params, helpers)
  klass = klass_name.constantize
  columns = params[:columns] || []
  # filter_params = params[:filters]
  model = CmAdmin::Model.find_by({name: klass_name})
  # records = get_records(klass, model, columns, helpers)
  records = "CmAdmin::#{klass_name}Policy::Scope".constantize.new(Current.user, klass).resolve
  filtered_data = CmAdmin::Models::Filter.filtered_data(model.filter_params(params), records, model.filters)
  formatted_data = format_records(filtered_data, model, columns, helpers)
  file_path = "#{Rails.root}/tmp/#{klass}_data_#{DateTime.now.strftime("%Y-%m-%d_%H-%M-%S")}.xlsx"
  create_workbook(formatted_data, columns, file_path)
  return file_path
end