marty 0.5.15 → 0.5.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +27 -0
- data/.rspec +3 -0
- data/.travis.yml +23 -0
- data/Gemfile +23 -0
- data/INDEPENDENCE_ISSUES.md +23 -0
- data/app/assets/images/marty/.gitkeep +0 -0
- data/app/components/marty/report_form.rb +9 -4
- data/gemini_deprecations.md +6 -0
- data/lib/marty/data_change.rb +99 -0
- data/lib/marty/data_conversion.rb +11 -3
- data/lib/marty/data_exporter.rb +9 -0
- data/lib/marty/version.rb +1 -1
- data/marty.gemspec +35 -0
- data/script/rails +8 -0
- data/spec/controllers/application_controller_spec.rb +52 -0
- data/spec/controllers/job_controller_spec.rb +226 -0
- data/spec/controllers/rpc_controller_spec.rb +379 -0
- data/spec/controllers/rpc_import_spec.rb +45 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/components_controller.rb +7 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/gemini/amortization_type.rb +5 -0
- data/spec/dummy/app/models/gemini/bud_category.rb +7 -0
- data/spec/dummy/app/models/gemini/entity.rb +2 -0
- data/spec/dummy/app/models/gemini/extras/data_import.rb +5 -0
- data/spec/dummy/app/models/gemini/extras/settlement_import.rb +28 -0
- data/spec/dummy/app/models/gemini/fannie_bup.rb +29 -0
- data/spec/dummy/app/models/gemini/grouping.rb +8 -0
- data/spec/dummy/app/models/gemini/grouping_head_version.rb +14 -0
- data/spec/dummy/app/models/gemini/head.rb +7 -0
- data/spec/dummy/app/models/gemini/head_version.rb +14 -0
- data/spec/dummy/app/models/gemini/helper.rb +44 -0
- data/spec/dummy/app/models/gemini/loan_program.rb +11 -0
- data/spec/dummy/app/models/gemini/mortgage_type.rb +5 -0
- data/spec/dummy/app/models/gemini/simple.rb +6 -0
- data/spec/dummy/app/models/gemini/streamline_type.rb +16 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +82 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml.example +10 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +35 -0
- data/spec/dummy/config/environments/production.rb +69 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/delayed_job.rb +5 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/db/migrate/20140801000000_create_groupings.rb +11 -0
- data/spec/dummy/db/migrate/20150406171536_create_categories.rb +27 -0
- data/spec/dummy/db/migrate/20150408200916_create_loan_programs.rb +26 -0
- data/spec/dummy/db/migrate/20150408201429_create_types.rb +21 -0
- data/spec/dummy/db/migrate/20150420000001_create_heads.rb +14 -0
- data/spec/dummy/db/migrate/20150420000002_create_head_versions.rb +15 -0
- data/spec/dummy/db/migrate/20150420000003_create_grouping_head_versions.rb +12 -0
- data/spec/dummy/db/migrate/20151023000001_create_simple.rb +12 -0
- data/spec/dummy/db/seeds.rb +8 -0
- data/spec/dummy/delorean/blame_report.dl +171 -0
- data/spec/dummy/delorean/data_report.dl +105 -0
- data/spec/dummy/delorean/fields.dl +52 -0
- data/spec/dummy/delorean/styles.dl +134 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/class_list.rb +3 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/icons/READ.txt +3 -0
- data/spec/dummy/public/icons/application_cascade.png +0 -0
- data/spec/dummy/public/icons/application_delete.png +0 -0
- data/spec/dummy/public/icons/application_put.png +0 -0
- data/spec/dummy/public/icons/application_view_detail.png +0 -0
- data/spec/dummy/public/icons/arrow_in.png +0 -0
- data/spec/dummy/public/icons/arrow_refresh.png +0 -0
- data/spec/dummy/public/icons/database_save.png +0 -0
- data/spec/dummy/public/icons/door_in.png +0 -0
- data/spec/dummy/public/icons/door_out.png +0 -0
- data/spec/dummy/public/icons/group.png +0 -0
- data/spec/dummy/public/icons/page_lightning.png +0 -0
- data/spec/dummy/public/icons/printer.png +0 -0
- data/spec/dummy/public/icons/report_disk.png +0 -0
- data/spec/dummy/public/icons/report_go.png +0 -0
- data/spec/dummy/public/icons/report_magnify.png +0 -0
- data/spec/dummy/public/icons/script.png +0 -0
- data/spec/dummy/public/icons/script_add.png +0 -0
- data/spec/dummy/public/icons/script_go.png +0 -0
- data/spec/dummy/public/icons/script_key.png +0 -0
- data/spec/dummy/public/icons/table_go.png +0 -0
- data/spec/dummy/public/icons/time.png +0 -0
- data/spec/dummy/public/icons/time_add.png +0 -0
- data/spec/dummy/public/icons/time_go.png +0 -0
- data/spec/dummy/public/icons/timeline_marker.png +0 -0
- data/spec/dummy/public/icons/user_add.png +0 -0
- data/spec/dummy/public/icons/user_delete.png +0 -0
- data/spec/dummy/public/icons/user_edit.png +0 -0
- data/spec/dummy/public/icons/wrench.png +0 -0
- data/spec/dummy/script/delayed_job +6 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/features/javascripts/job_dashboard_live_search.js.coffee +8 -0
- data/spec/features/javascripts/login.js.coffee +8 -0
- data/spec/features/jobs_dashboard_netzke_spec.rb +24 -0
- data/spec/features/jobs_dashboard_spec.rb +49 -0
- data/spec/fixtures/scripts/load_tests/script1.dl +2 -0
- data/spec/fixtures/scripts/load_tests/script2.dl +2 -0
- data/spec/job_helper.rb +102 -0
- data/spec/lib/data_exporter_spec.rb +71 -0
- data/spec/lib/data_importer_spec.rb +461 -0
- data/spec/lib/xl_spec.rb +198 -0
- data/spec/lib/xl_styles_spec.rb +115 -0
- data/spec/models/api_auth_spec.rb +187 -0
- data/spec/models/posting_spec.rb +107 -0
- data/spec/models/promise_spec.rb +65 -0
- data/spec/models/script_spec.rb +187 -0
- data/spec/models/user_spec.rb +68 -0
- data/spec/requests/routes_spec.rb +12 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/clean_db_helpers.rb +18 -0
- data/spec/support/delayed_job_helpers.rb +12 -0
- data/spec/support/user_helpers.rb +12 -0
- metadata +139 -89
- data/app/components/marty/auth_app.rb~ +0 -51
- data/app/components/marty/auth_app/javascripts/auth_app.js~ +0 -91
- data/app/components/marty/cm_form_panel.rb~ +0 -5
- data/app/components/marty/cm_grid_panel.rb~ +0 -35
- data/app/components/marty/data_import_view.rb~ +0 -142
- data/app/components/marty/extras/layout.rb~ +0 -46
- data/app/components/marty/live_search_grid_panel.rb~ +0 -49
- data/app/components/marty/main_auth_app.rb~ +0 -238
- data/app/components/marty/mcfly_grid_panel.rb~ +0 -80
- data/app/components/marty/new_posting_form.rb~ +0 -46
- data/app/components/marty/new_posting_window.rb~ +0 -21
- data/app/components/marty/pivot_grid.rb +0 -52
- data/app/components/marty/pivot_grid/endpoints.rb +0 -45
- data/app/components/marty/pivot_grid/javascripts/extensions.js +0 -150
- data/app/components/marty/pivot_grid/javascripts/pivot_grid.js +0 -86
- data/app/components/marty/pivot_grid/services.rb +0 -44
- data/app/components/marty/posting_grid.rb~ +0 -140
- data/app/components/marty/promise_view.rb~ +0 -157
- data/app/components/marty/promise_view/stylesheets/promise_view.css~ +0 -15
- data/app/components/marty/report_form.rb~ +0 -217
- data/app/components/marty/report_select.rb~ +0 -133
- data/app/components/marty/reporting.rb~ +0 -39
- data/app/components/marty/script_detail.rb~ +0 -430
- data/app/components/marty/script_form.rb~ +0 -233
- data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js~ +0 -909
- data/app/components/marty/script_grid.rb~ +0 -99
- data/app/components/marty/script_tester.rb~ +0 -213
- data/app/components/marty/scripting.rb~ +0 -124
- data/app/components/marty/select_report.rb~ +0 -143
- data/app/components/marty/simple_app.rb~ +0 -101
- data/app/components/marty/tag_grid.rb~ +0 -89
- data/app/components/marty/tree_panel.rb~ +0 -256
- data/app/components/marty/tree_panel/javascripts/tree_panel.js~ +0 -317
- data/app/components/marty/user_pivot.rb +0 -128
- data/app/components/marty/user_view.rb~ +0 -188
- data/app/controllers/marty/application_controller.rb~ +0 -133
- data/app/controllers/marty/components_controller.rb~ +0 -37
- data/app/controllers/marty/job_controller.rb~ +0 -28
- data/app/controllers/marty/rpc_controller.rb~ +0 -61
- data/app/helpers/marty/script_set.rb~ +0 -59
- data/app/models/marty/api_auth.rb~ +0 -48
- data/app/models/marty/data_change.rb~ +0 -141
- data/app/models/marty/enum.rb~ +0 -16
- data/app/models/marty/import_type.rb~ +0 -48
- data/app/models/marty/poop.rb~ +0 -169
- data/app/models/marty/posting.rb~ +0 -86
- data/app/models/marty/posting_type.rb~ +0 -21
- data/app/models/marty/promise.rb~ +0 -196
- data/app/models/marty/role.rb~ +0 -10
- data/app/models/marty/script.rb~ +0 -62
- data/app/models/marty/tag.rb~ +0 -91
- data/app/models/marty/user.rb~ +0 -148
- data/app/models/marty/user_role.rb~ +0 -13
- data/app/views/layouts/marty/application.html.erb~ +0 -11
- data/config/routes.rb~ +0 -10
- data/db/migrate/019_create_marty_postings.rb~ +0 -19
- data/db/migrate/095_create_marty_tags.rb~ +0 -19
- data/lib/marty.rb~ +0 -13
- data/lib/marty/content_handler.rb~ +0 -93
- data/lib/marty/data_exporter.rb~ +0 -137
- data/lib/marty/data_importer.rb~ +0 -114
- data/lib/marty/data_row_processor.rb~ +0 -206
- data/lib/marty/drop_folder_hook.rb~ +0 -17
- data/lib/marty/folder_hook.rb~ +0 -9
- data/lib/marty/lazy_column_loader.rb~ +0 -47
- data/lib/marty/mcfly_query.rb~ +0 -188
- data/lib/marty/migrations.rb~ +0 -65
- data/lib/marty/monkey.rb~ +0 -160
- data/lib/marty/permissions.rb~ +0 -69
- data/lib/marty/promise.rb~ +0 -41
- data/lib/marty/promise_job.rb~ +0 -121
- data/lib/marty/promise_proxy.rb~ +0 -69
- data/lib/marty/util.rb~ +0 -80
- data/lib/marty/version.rb~ +0 -3
- data/lib/marty/xl.rb~ +0 -526
- data/lib/pyxll/README.txt~ +0 -16
- data/lib/pyxll/gemini.py~ +0 -110
- data/lib/pyxll/pyxll.cfg~ +0 -12
@@ -1,128 +0,0 @@
|
|
1
|
-
class Marty::UserPivot < Marty::PivotGrid
|
2
|
-
def configure(c)
|
3
|
-
super
|
4
|
-
|
5
|
-
c.title ||= I18n.t('users', default: "Users")
|
6
|
-
c.model = "Marty::User"
|
7
|
-
|
8
|
-
c.columns = [
|
9
|
-
:id,
|
10
|
-
:login,
|
11
|
-
:firstname,
|
12
|
-
:lastname,
|
13
|
-
:active,
|
14
|
-
:roles,
|
15
|
-
]
|
16
|
-
end
|
17
|
-
|
18
|
-
js_configure do |c|
|
19
|
-
|
20
|
-
c.aggregate = [
|
21
|
-
{
|
22
|
-
data_index: 'id',
|
23
|
-
header: 'Sum of id',
|
24
|
-
aggregator: 'sum',
|
25
|
-
},
|
26
|
-
{
|
27
|
-
data_index: 'id',
|
28
|
-
header: '# records',
|
29
|
-
aggregator: 'count',
|
30
|
-
align: 'right',
|
31
|
-
rederer: <<-JS
|
32
|
-
Ext.util.Format.numberRenderer("0")
|
33
|
-
JS
|
34
|
-
},
|
35
|
-
]
|
36
|
-
|
37
|
-
c.left_axis = [
|
38
|
-
{
|
39
|
-
data_index: 'firstname',
|
40
|
-
header: 'First Name',
|
41
|
-
sortable: false
|
42
|
-
},
|
43
|
-
{
|
44
|
-
data_index: 'login',
|
45
|
-
header: 'Login',
|
46
|
-
sortable: false
|
47
|
-
}
|
48
|
-
]
|
49
|
-
|
50
|
-
c.top_axis = [
|
51
|
-
{
|
52
|
-
width: 120,
|
53
|
-
data_index: 'lastname'
|
54
|
-
}
|
55
|
-
]
|
56
|
-
|
57
|
-
c.init_component = <<-JS
|
58
|
-
function() {
|
59
|
-
var me = this;
|
60
|
-
me.callParent();
|
61
|
-
|
62
|
-
YYY = me;
|
63
|
-
|
64
|
-
var view = this.getView();
|
65
|
-
|
66
|
-
view.getSelectionModel().on('selectionchange', function(selModel) {
|
67
|
-
var has_sel = selModel.hasSelection();
|
68
|
-
var rec_id =
|
69
|
-
has_sel ? view.getSelectionModel().selected.first().getId() : null;
|
70
|
-
XXX = view.getSelectionModel().selected.first();
|
71
|
-
console.log("Selection:", rec_id);
|
72
|
-
});
|
73
|
-
}
|
74
|
-
JS
|
75
|
-
end
|
76
|
-
|
77
|
-
def get_records(params)
|
78
|
-
require 'ostruct'
|
79
|
-
|
80
|
-
(1..10000).map {|i|
|
81
|
-
p = OpenStruct.new
|
82
|
-
p.id = i
|
83
|
-
p.login = (i % 5).to_s
|
84
|
-
p.firstname = (i % 21).to_s
|
85
|
-
p.lastname = (i % 10).to_s
|
86
|
-
p.active = (i%3 == 0)
|
87
|
-
p.roles = []
|
88
|
-
p
|
89
|
-
}
|
90
|
-
end
|
91
|
-
|
92
|
-
column :login do |c|
|
93
|
-
c.width = 100
|
94
|
-
c.text = I18n.t("user_grid.login")
|
95
|
-
end
|
96
|
-
|
97
|
-
column :firstname do |c|
|
98
|
-
c.width = 100
|
99
|
-
c.text = I18n.t("user_grid.firstname")
|
100
|
-
end
|
101
|
-
|
102
|
-
column :lastname do |c|
|
103
|
-
c.width = 100
|
104
|
-
c.text = I18n.t("user_grid.lastname")
|
105
|
-
end
|
106
|
-
|
107
|
-
column :active do |c|
|
108
|
-
c.width = 60
|
109
|
-
c.text = I18n.t("user_grid.active")
|
110
|
-
end
|
111
|
-
|
112
|
-
column :roles do |c|
|
113
|
-
c.width = 100
|
114
|
-
c.flex = 1
|
115
|
-
c.text = I18n.t("user_grid.roles")
|
116
|
-
c.getter = lambda do |r|
|
117
|
-
r.roles.map { |ur| I18n.t("roles.#{ur.name}") }.sort
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
column :created_dt do |c|
|
122
|
-
c.text = I18n.t("user_grid.created_dt")
|
123
|
-
c.format = "Y-m-d H:i"
|
124
|
-
c.read_only = true
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
UserPivot = Marty::UserPivot
|
@@ -1,188 +0,0 @@
|
|
1
|
-
class Marty::UserView < Marty::CmGridPanel
|
2
|
-
has_marty_permissions create: [:admin, :user_manager],
|
3
|
-
read: :any,
|
4
|
-
update: [:admin, :user_manager],
|
5
|
-
delete: [:admin, :user_manager]
|
6
|
-
|
7
|
-
def configure(c)
|
8
|
-
super
|
9
|
-
|
10
|
-
c.title ||= I18n.t('users', default: "Users")
|
11
|
-
c.model = "Marty::User"
|
12
|
-
c.enable_extended_search = false
|
13
|
-
c.enable_edit_inline = false
|
14
|
-
|
15
|
-
c.columns ||= [:login,
|
16
|
-
:firstname,
|
17
|
-
:lastname,
|
18
|
-
:active,
|
19
|
-
:uuid,
|
20
|
-
:roles
|
21
|
-
]
|
22
|
-
|
23
|
-
c.data_store.sorters = {
|
24
|
-
property: :login,
|
25
|
-
direction: 'ASC',
|
26
|
-
} if c.columns.include?(:login)
|
27
|
-
end
|
28
|
-
|
29
|
-
js_configure do |c|
|
30
|
-
c.init_component = <<-JS
|
31
|
-
function() {
|
32
|
-
this.callParent();
|
33
|
-
// Set single selection mode. FIXME: can this be done on config?
|
34
|
-
this.getSelectionModel().setSelectionMode('SINGLE');
|
35
|
-
}
|
36
|
-
JS
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.set_roles(roles, user)
|
40
|
-
roles ||= []
|
41
|
-
|
42
|
-
# Destroy old roles (must call destroy for auditing to work properly)
|
43
|
-
user.user_roles.each do |ur|
|
44
|
-
ur.destroy unless roles.include?(I18n.t("roles.#{ur.role.name}"))
|
45
|
-
end
|
46
|
-
|
47
|
-
# set new roles
|
48
|
-
user.roles = Marty::Role.all.select { |r|
|
49
|
-
roles.include? I18n.t("roles.#{r.name}") }
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.create_edit_user(data)
|
53
|
-
# Creates the initial place-holder user object and check it
|
54
|
-
# out.
|
55
|
-
user = data["id"].nil? ? Marty::User.new : Marty::User.find(data["id"])
|
56
|
-
user.login = data["login"]
|
57
|
-
user.firstname = data["firstname"]
|
58
|
-
user.lastname = data["lastname"]
|
59
|
-
user.active = data["active"]
|
60
|
-
user.uuid = data["uuid"]
|
61
|
-
|
62
|
-
if user.valid?
|
63
|
-
set_roles(data["roles"], user)
|
64
|
-
user.save
|
65
|
-
end
|
66
|
-
|
67
|
-
user
|
68
|
-
end
|
69
|
-
|
70
|
-
# override the add_in_form and edit_in_form endpoint. User creation/update
|
71
|
-
# needs to use the create_edit_user method.
|
72
|
-
|
73
|
-
endpoint :add_window__add_form__netzke_submit do |params, this|
|
74
|
-
data = ActiveSupport::JSON.decode(params[:data])
|
75
|
-
data["id"] = nil
|
76
|
-
|
77
|
-
unless self.class.can_perform_action?(:create)
|
78
|
-
this.netzke_feedback "Permission Denied"
|
79
|
-
return
|
80
|
-
end
|
81
|
-
|
82
|
-
user = self.class.create_edit_user(data)
|
83
|
-
if user.valid?
|
84
|
-
this.success = true
|
85
|
-
this.on_submit_success
|
86
|
-
else
|
87
|
-
data_adapter.errors_array(user).each do |error|
|
88
|
-
flash :error => error
|
89
|
-
end
|
90
|
-
this.netzke_feedback(@flash)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
endpoint :edit_window__edit_form__netzke_submit do |params, this|
|
95
|
-
data = ActiveSupport::JSON.decode(params[:data])
|
96
|
-
unless self.class.can_perform_action?(:update)
|
97
|
-
this.netzke_feedback "Permission Denied"
|
98
|
-
return
|
99
|
-
end
|
100
|
-
|
101
|
-
user = self.class.create_edit_user(data)
|
102
|
-
if user.valid?
|
103
|
-
this.success = true
|
104
|
-
this.on_submit_success
|
105
|
-
else
|
106
|
-
data_adapter.errors_array(user).each do |error|
|
107
|
-
flash :error => error
|
108
|
-
end
|
109
|
-
this.netzke_feedback(@flash)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
action :add_in_form do |a|
|
114
|
-
a.text = I18n.t("user_grid.new")
|
115
|
-
a.tooltip = I18n.t("user_grid.new")
|
116
|
-
a.icon = :user_add
|
117
|
-
a.disabled = !self.class.can_perform_action?(:create)
|
118
|
-
end
|
119
|
-
|
120
|
-
action :edit_in_form do |a|
|
121
|
-
a.disabled = !self.class.can_perform_action?(:update)
|
122
|
-
a.icon = :user_edit
|
123
|
-
end
|
124
|
-
|
125
|
-
action :del do |a|
|
126
|
-
a.icon = :user_delete
|
127
|
-
end
|
128
|
-
|
129
|
-
def default_bbar
|
130
|
-
[:add_in_form, :edit_in_form, :del]
|
131
|
-
end
|
132
|
-
|
133
|
-
def default_context_menu
|
134
|
-
[]
|
135
|
-
end
|
136
|
-
|
137
|
-
column :login do |c|
|
138
|
-
c.width = 100
|
139
|
-
c.text = I18n.t("user_grid.login")
|
140
|
-
end
|
141
|
-
|
142
|
-
column :firstname do |c|
|
143
|
-
c.width = 100
|
144
|
-
c.text = I18n.t("user_grid.firstname")
|
145
|
-
end
|
146
|
-
|
147
|
-
column :lastname do |c|
|
148
|
-
c.width = 100
|
149
|
-
c.text = I18n.t("user_grid.lastname")
|
150
|
-
end
|
151
|
-
|
152
|
-
column :active do |c|
|
153
|
-
c.width = 60
|
154
|
-
c.text = I18n.t("user_grid.active")
|
155
|
-
end
|
156
|
-
|
157
|
-
column :uuid do |c|
|
158
|
-
c.width = 60
|
159
|
-
c.text = I18n.t("user_grid.uuid")
|
160
|
-
end
|
161
|
-
|
162
|
-
column :roles do |c|
|
163
|
-
c.width = 100
|
164
|
-
c.flex = 1
|
165
|
-
c.editor = {
|
166
|
-
trigger_action: :all,
|
167
|
-
name: "roles",
|
168
|
-
attr_type: :string,
|
169
|
-
xtype: :combo,
|
170
|
-
store: Marty::Role.all.map { |r| I18n.t("roles.#{r.name}") }.sort,
|
171
|
-
empty_text: "Roles",
|
172
|
-
multi_select: true,
|
173
|
-
}
|
174
|
-
|
175
|
-
c.getter = lambda do |r|
|
176
|
-
r.roles.map { |ur| I18n.t("roles.#{ur.name}") }.sort
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
column :created_dt do |c|
|
181
|
-
c.text = I18n.t("user_grid.created_dt")
|
182
|
-
c.format = "Y-m-d H:i"
|
183
|
-
c.read_only = true
|
184
|
-
end
|
185
|
-
|
186
|
-
end
|
187
|
-
|
188
|
-
UserView = Marty::UserView
|
@@ -1,133 +0,0 @@
|
|
1
|
-
class Marty::ApplicationController < ActionController::Base
|
2
|
-
# HACKKKKKKKKKKKKKKKKKKKKKKKKKKKK!!!
|
3
|
-
# protect_from_forgery
|
4
|
-
|
5
|
-
# Marty's ApplicationController is based on Redmine's
|
6
|
-
# implementation.
|
7
|
-
|
8
|
-
def handle_unverified_request
|
9
|
-
super
|
10
|
-
cookies.delete(:autologin)
|
11
|
-
end
|
12
|
-
|
13
|
-
before_filter :session_expiration,
|
14
|
-
:user_setup
|
15
|
-
|
16
|
-
def get_conf
|
17
|
-
Rails.configuration.marty
|
18
|
-
end
|
19
|
-
|
20
|
-
def session_expiration
|
21
|
-
if session[:user_id]
|
22
|
-
if session_expired? && !try_to_autologin
|
23
|
-
reset_session
|
24
|
-
else
|
25
|
-
session[:atime] = Time.now.utc.to_i
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def session_expired?
|
31
|
-
session_lifetime, session_timeout =
|
32
|
-
get_conf.session_lifetime, get_conf.session_timeout
|
33
|
-
|
34
|
-
if session_lifetime
|
35
|
-
return true unless session[:ctime] &&
|
36
|
-
(Time.now.utc.to_i -
|
37
|
-
session[:ctime].to_i <= session_lifetime.to_i * 60)
|
38
|
-
end
|
39
|
-
|
40
|
-
if session_timeout
|
41
|
-
return true unless session[:atime] &&
|
42
|
-
(Time.now.utc.to_i - session[:atime].to_i <= session_timeout.to_i * 60)
|
43
|
-
end
|
44
|
-
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def start_user_session(user)
|
49
|
-
session[:user_id] = user.id
|
50
|
-
session[:ctime] = Time.now.utc.to_i
|
51
|
-
session[:atime] = Time.now.utc.to_i
|
52
|
-
end
|
53
|
-
|
54
|
-
def user_setup
|
55
|
-
# Find the current user
|
56
|
-
user = Marty::User.current = find_current_user
|
57
|
-
|
58
|
-
logger.info(" Current user: #{user.login} (id=#{user.id})") if
|
59
|
-
logger && user
|
60
|
-
end
|
61
|
-
|
62
|
-
# Returns the current user or nil if no user is logged in
|
63
|
-
def find_current_user
|
64
|
-
user_id = session[:user_id]
|
65
|
-
if user_id
|
66
|
-
user = Marty::User.active.find(user_id) rescue nil
|
67
|
-
else
|
68
|
-
user = try_to_autologin
|
69
|
-
end
|
70
|
-
|
71
|
-
user
|
72
|
-
end
|
73
|
-
|
74
|
-
def try_to_autologin
|
75
|
-
if cookies[:autologin] && get_conf.autologin
|
76
|
-
# auto-login feature starts a new session
|
77
|
-
user = Marty::User.try_to_autologin(cookies[:autologin])
|
78
|
-
if user
|
79
|
-
reset_session
|
80
|
-
start_user_session(user)
|
81
|
-
end
|
82
|
-
user
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Sets the logged in user
|
87
|
-
def set_user(user)
|
88
|
-
reset_session
|
89
|
-
if user && user.is_a?(Marty::User)
|
90
|
-
Marty::User.current = user
|
91
|
-
start_user_session(user)
|
92
|
-
else
|
93
|
-
Marty::User.current = nil
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# Logs out current user
|
98
|
-
def logout_user
|
99
|
-
if Marty::User.current
|
100
|
-
cookies.delete :autologin
|
101
|
-
Marty::Token.delete_all(["user_id = ?", Marty::User.current.id]) unless
|
102
|
-
Marty::Util.db_in_recovery?
|
103
|
-
self.set_user(nil)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def user_for_paper_trail
|
108
|
-
if Marty::User.current
|
109
|
-
Marty::User.current.login
|
110
|
-
else
|
111
|
-
'unknown'
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def password_authentication
|
116
|
-
user = Marty::User.try_to_login(params[:username], params[:password])
|
117
|
-
|
118
|
-
user.nil? ? failed_authentication(params[:username] || 'nil username') :
|
119
|
-
successful_authentication(user)
|
120
|
-
end
|
121
|
-
|
122
|
-
def failed_authentication(login)
|
123
|
-
logger.info("Failed authentication for '#{login}' " +
|
124
|
-
"from #{request.remote_ip} at #{Time.now.utc}")
|
125
|
-
end
|
126
|
-
|
127
|
-
def successful_authentication(user)
|
128
|
-
logger.info("Successful authentication for '#{user.login}' " +
|
129
|
-
"from #{request.remote_ip} at #{Time.now.utc}")
|
130
|
-
self.set_user(user)
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|