aboutsummaryrefslogtreecommitdiffstats
path: root/app/controllers/imports_controller.rb
blob: f2e65e445359e5b0e983ad7bdd8540ab5236973f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
class ImportsController < BreadcrumbController
  include PolicyChecker
  skip_before_action :authenticate_user!, only: [:download]
  defaults resource_class: Import, collection_name: 'imports', instance_name: 'import'
  before_action :ransack_started_at_params, only: [:index]
  before_action :ransack_status_params, only: [:index]
  respond_to :html
  belongs_to :workbench

  def show
    show! do
      @import = @import.decorate(context: {
        workbench: @workbench
      })

      build_breadcrumb :show
    end
  end

  def index
    index! do |format|
      format.html {
        if collection.out_of_bounds?
          redirect_to params.merge(:page => 1)
        end

        @imports = decorate_imports(@imports)
      }

      build_breadcrumb :index
    end
  end

  def new
    new! do
      build_breadcrumb :new
    end
  end

  def download
    if params[:token] == resource.token_download
      send_file resource.file.path
    else
      user_not_authorized
    end
  end

  protected
  def collection
    scope = parent.imports.where(type: "WorkbenchImport")
    scope = ransack_period scope

    @q = scope.search(params[:q])

    if sort_column && sort_direction
      @imports ||= @q.result(distinct: true).order(sort_column + ' ' + sort_direction).paginate(page: params[:page], per_page: 10)
    else
      @imports ||= @q.result(distinct: true).order(:name).paginate(page: params[:page], per_page: 10)
    end
  end

  private

  def ransack_started_at_params
    start_date = []
    end_date = []

    if params[:q] && params[:q][:started_at] && !params[:q][:started_at].has_value?(nil) && !params[:q][:started_at].has_value?("")
      [1, 2, 3].each do |key|
        start_date <<  params[:q][:started_at]["begin(#{key}i)"].to_i
        end_date <<  params[:q][:started_at]["end(#{key}i)"].to_i
      end
      params[:q].delete([:started_at])
      @begin_range = DateTime.new(*start_date,0,0,0) rescue nil
      @end_range = DateTime.new(*end_date,23,59,59) rescue nil
    end
  end

  # Fake ransack filter
  def ransack_period scope
    return scope unless !!@begin_range && !!@end_range

    if @begin_range > @end_range
      flash.now[:error] = t('imports.filters.error_period_filter')
    else
      scope = scope.where_started_at_between(@begin_range, @end_range)
    end
    scope
  end

  def ransack_status_params
    if params[:q]
      return params[:q].delete(:status_eq_any) if params[:q][:status_eq_any].empty? || ( (Import.status.values & params[:q][:status_eq_any]).length >= 4 )
      params[:q][:status_eq_any].push("new", "running") if params[:q][:status_eq_any].include?("pending")
      params[:q][:status_eq_any].push("aborted", "canceled") if params[:q][:status_eq_any].include?("failed")
    end
  end

  def build_resource
    @import ||= WorkbenchImport.new(*resource_params) do |import|
      import.workbench = parent
      import.creator   = current_user.name
    end
  end

  def import_params
    params.require(:import).permit(
      :name,
      :file,
      :type,
      :referential_id
    )
  end

  def sort_column
    parent.imports.column_names.include?(params[:sort]) ? params[:sort] : 'name'
  end
  def sort_direction
    %w[asc desc].include?(params[:direction]) ?  params[:direction] : 'asc'
  end

  def decorate_imports(imports)
    ModelDecorator.decorate(
      imports,
      with: ImportDecorator,
      context: {
        workbench: @workbench
      }
    )
  end
end