egov_utils 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +26 -0
- data/app/assets/config/egov_utils_manifest.js +2 -0
- data/app/assets/javascripts/egov_utils/application.js +23 -0
- data/app/assets/javascripts/egov_utils/eGovUtilities.coffee.erb +70 -0
- data/app/assets/javascripts/egov_utils/groups.js +2 -0
- data/app/assets/javascripts/egov_utils/roles.coffee.erb +56 -0
- data/app/assets/javascripts/egov_utils/setup_locale.coffee.erb +2 -0
- data/app/assets/javascripts/egov_utils/users.js +2 -0
- data/app/assets/stylesheets/egov_utils/application.scss +15 -0
- data/app/assets/stylesheets/egov_utils/groups.css +4 -0
- data/app/assets/stylesheets/egov_utils/roles.css +4 -0
- data/app/assets/stylesheets/egov_utils/users.css +4 -0
- data/app/attributes/egov_utils/district.rb +13 -0
- data/app/attributes/egov_utils/full_address.rb +17 -0
- data/app/attributes/egov_utils/region.rb +13 -0
- data/app/controllers/egov_utils/addresses_controller.rb +34 -0
- data/app/controllers/egov_utils/application_controller.rb +7 -0
- data/app/controllers/egov_utils/groups_controller.rb +27 -0
- data/app/controllers/egov_utils/roles_controller.rb +28 -0
- data/app/controllers/egov_utils/sessions_controller.rb +83 -0
- data/app/controllers/egov_utils/users_controller.rb +64 -0
- data/app/helpers/egov_utils/application_helper.rb +4 -0
- data/app/helpers/egov_utils/grid_helper.rb +40 -0
- data/app/helpers/egov_utils/groups_helper.rb +4 -0
- data/app/helpers/egov_utils/roles_helper.rb +4 -0
- data/app/helpers/egov_utils/users_helper.rb +4 -0
- data/app/jobs/egov_utils/application_job.rb +4 -0
- data/app/mailers/egov_utils/application_mailer.rb +6 -0
- data/app/models/ability.rb +17 -0
- data/app/models/egov_utils/address.rb +79 -0
- data/app/models/egov_utils/application_record.rb +5 -0
- data/app/models/egov_utils/audit_detail.rb_bac +28 -0
- data/app/models/egov_utils/audit_record.rb_bac +98 -0
- data/app/models/egov_utils/group.rb +26 -0
- data/app/models/egov_utils/person.rb +9 -0
- data/app/models/egov_utils/principal.rb +20 -0
- data/app/models/egov_utils/user.rb +108 -0
- data/app/schemas/egov_utils/address_schema.rb +30 -0
- data/app/validators/email_validator.rb +8 -0
- data/app/validators/ico_validator.rb +7 -0
- data/app/views/common/_grid.html.coffee +130 -0
- data/app/views/common/_modal.html.haml +11 -0
- data/app/views/egov_utils/addresses/_form.html.haml +51 -0
- data/app/views/egov_utils/people/_form.html.haml +3 -0
- data/app/views/egov_utils/roles/index.html.haml +29 -0
- data/app/views/egov_utils/sessions/new.html.haml +5 -0
- data/app/views/egov_utils/users/_form.html.haml +6 -0
- data/app/views/egov_utils/users/index.html.haml +62 -0
- data/app/views/egov_utils/users/new.html.haml +3 -0
- data/app/views/egov_utils/users/show.html.haml +1 -0
- data/app/views/errors/error_403.html.haml +1 -0
- data/app/views/layouts/egov_utils/_messages.html.haml +7 -0
- data/app/views/layouts/egov_utils/application.html.erb +14 -0
- data/config/kraj.csv +16 -0
- data/config/locales/cs.yml +80 -0
- data/config/okres.csv +79 -0
- data/config/routes.rb +21 -0
- data/db/migrate/20170313100505_create_egov_utils_addresses.rb +18 -0
- data/db/migrate/20170315134217_create_egov_utils_users.rb +16 -0
- data/db/migrate/20170513115712_create_egov_utils_audit_records.rb_bac +11 -0
- data/db/migrate/20170513120006_create_egov_utils_audit_details.rb_bac +13 -0
- data/db/migrate/20170630150633_add_provider_to_user.rb +5 -0
- data/db/migrate/20170801154511_install_audited.rb +30 -0
- data/db/migrate/20170809150646_create_egov_utils_people.rb +12 -0
- data/db/migrate/20170824111701_create_egov_utils_groups.rb +12 -0
- data/lib/bootstrap_form/datetimepicker.rb +17 -0
- data/lib/bootstrap_form/helpers/bootstrap4.rb +12 -0
- data/lib/egov_utils/auth_source.rb +326 -0
- data/lib/egov_utils/engine.rb +84 -0
- data/lib/egov_utils/has_audit_trail.rb +68 -0
- data/lib/egov_utils/user_utils/application_controller_patch.rb +92 -0
- data/lib/egov_utils/user_utils/role.rb +26 -0
- data/lib/egov_utils/version.rb +3 -0
- data/lib/egov_utils.rb +5 -0
- data/lib/grid/shield_grid.rb +9 -0
- data/lib/tasks/egov_utils_tasks.rake +4 -0
- metadata +306 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1326389e276358d5474d13f8d62bf21ff1a4bdb9
|
4
|
+
data.tar.gz: f364b9d541c136e08736fc290bb2eafd54c16b0a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a4bca9ba5dac51fc1bb59875a136ce73ddbab8f9737e8a41a4a6600e2b23a4fa6f3f42fe26258f29b4044da307206c6494837f66e00aadb6e3bcdb01ec2a71d4
|
7
|
+
data.tar.gz: 6a57d7bda4a1dba2d0307f486fa64148d384ea03594d6b8aa94ec599aa0909382a7b9a77a4c25c859e2565d07966d05ea97699be2095a3bbfda0360ee6bb39bf
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Ondřej Ezr
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# EgovUtils
|
2
|
+
Short description and motivation.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
How to use my plugin.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'egov_utils'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
```bash
|
21
|
+
$ gem install egov_utils
|
22
|
+
```
|
23
|
+
|
24
|
+
## Contributing
|
25
|
+
Contribution directions go here.
|
26
|
+
|
27
|
+
## License
|
28
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'EgovUtils'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../spec/test_app/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'bundler/gem_tasks'
|
26
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require i18n
|
14
|
+
//= require moment
|
15
|
+
//= require moment/cs
|
16
|
+
//= require popper
|
17
|
+
//= require bootstrap-sprockets
|
18
|
+
//= require bootstrap-datetimepicker
|
19
|
+
//= require shieldui-all.min
|
20
|
+
//= require egov_utils/setup_locale
|
21
|
+
//= require i18n/translations
|
22
|
+
//= require egov_utils/eGovUtilities
|
23
|
+
//= require egov_utils/roles
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
window.eGovUtilities =
|
3
|
+
setup: ()->
|
4
|
+
$.extend $.fn.datetimepicker.defaults.icons, {
|
5
|
+
time: 'fa fa-clock-o',
|
6
|
+
date: 'fa fa-calendar',
|
7
|
+
up: 'fa fa-chevron-up',
|
8
|
+
down: 'fa fa-chevron-down',
|
9
|
+
previous: 'fa fa-chevron-left',
|
10
|
+
next: 'fa fa-chevron-right',
|
11
|
+
today: 'fa fa-calendar-check-o',
|
12
|
+
clear: 'fa fa-trash-o',
|
13
|
+
close: 'fa fa-close'
|
14
|
+
}
|
15
|
+
|
16
|
+
initPage: ()->
|
17
|
+
eGovUtilities.initDatepickers()
|
18
|
+
|
19
|
+
initDatepickers: ($container)->
|
20
|
+
$container ||= $(document)
|
21
|
+
pickers = $('[data-provide="datepicker"]', $container)
|
22
|
+
pickers.datetimepicker()
|
23
|
+
|
24
|
+
initModal: (modalId, options)->
|
25
|
+
options = options || {}
|
26
|
+
modalId = modalId || 'modal'
|
27
|
+
$modal = $('#'+modalId)
|
28
|
+
if $modal.length != 1
|
29
|
+
$modal = $('<div id="'+modalId+'" class="modal fade"'+(if options['backdrop'] then ' data-backdrop="static"' else '')+'><div class="modal-dialog">
|
30
|
+
<div class="modal-content">
|
31
|
+
<div class="modal-header">
|
32
|
+
<h5 class="modal-title"></h5>
|
33
|
+
<button class="close" type="button" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
34
|
+
</div>
|
35
|
+
<div class="modal-body"></div>
|
36
|
+
<div class="modal-footer"></div>
|
37
|
+
</div></div></div>').appendTo('body')
|
38
|
+
$modal.on 'submit', 'form', (evt)->
|
39
|
+
evt.preventDefault()
|
40
|
+
$form = $(this)
|
41
|
+
data = $form.serializeArray()
|
42
|
+
$.ajax($form.attr('action')+'.json', {method: $form.attr('method'), data: data, dataType: 'json'}).done (xhr)->
|
43
|
+
$modal.trigger('egov:submitted', [xhr])
|
44
|
+
$modal.modal('hide')
|
45
|
+
.fail (xhr) ->
|
46
|
+
if xhr.status == 422
|
47
|
+
$.ajax($form.attr('action'), {method: $form.attr('method'), data: data, dataType: 'html'}).done (xhr)->
|
48
|
+
eGovUtilities.setModalContent($modal, xhr)
|
49
|
+
|
50
|
+
$modal
|
51
|
+
|
52
|
+
setModalContent: ($modal, body, title) ->
|
53
|
+
$modal.find('.modal-title').text(title)
|
54
|
+
$modal.find('.modal-body').html(body)
|
55
|
+
eGovUtilities.initDatepickers($modal)
|
56
|
+
|
57
|
+
showModal: (body, options) ->
|
58
|
+
options = options || {}
|
59
|
+
$modal = this.initModal((options['modalId']), {backdrop: options['backdrop']})
|
60
|
+
title = options['title']
|
61
|
+
delete options['modalId']
|
62
|
+
delete options['backdrop']
|
63
|
+
delete options['title']
|
64
|
+
eGovUtilities.setModalContent($modal, body, title)
|
65
|
+
$modal.modal(options)
|
66
|
+
$modal
|
67
|
+
|
68
|
+
$(eGovUtilities.setup)
|
69
|
+
$(document).on 'turbolinks:load', (evt)->
|
70
|
+
eGovUtilities.initPage()
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Place all the behaviors and hooks related to the matching controller here.
|
2
|
+
|
3
|
+
$ = jQuery
|
4
|
+
|
5
|
+
$.widget 'egov_utils.roles',
|
6
|
+
options:
|
7
|
+
editBtnClass: 'btn btn-sm btn-info'
|
8
|
+
submitBtnClass: 'btn btn-xs btn-primary'
|
9
|
+
editIconClass: 'fa fa-pencil'
|
10
|
+
allRoles: ['<%= EgovUtils::UserUtils::Role.roles.keys.join("', '") %>']
|
11
|
+
url: null
|
12
|
+
idParamName: 'id'
|
13
|
+
valueName: 'roles'
|
14
|
+
|
15
|
+
_create: ()->
|
16
|
+
this.allRoles = this.element.data('all_roles') || this.options.allRoles || []
|
17
|
+
this._initialize();
|
18
|
+
|
19
|
+
_initialize: ()->
|
20
|
+
|
21
|
+
btn = this._edit_btn()
|
22
|
+
this.element.find('.roles').append(btn)
|
23
|
+
|
24
|
+
_edit_btn: ()->
|
25
|
+
that = this
|
26
|
+
$('<a/>', {href: 'javascript:void(0);', class: this.options.editBtnClass})
|
27
|
+
.html('<i class="'+this.options.editIconClass+'"></i>')
|
28
|
+
.on 'click', (evt)->
|
29
|
+
evt.preventDefault()
|
30
|
+
that._create_form($(this).closest('.roles'))
|
31
|
+
|
32
|
+
_create_form: ($elem)->
|
33
|
+
that = this
|
34
|
+
$elem.html('')
|
35
|
+
entity_id = $elem.data('id')
|
36
|
+
roles = $elem.data('roles')
|
37
|
+
if typeof this.options.url == 'function'
|
38
|
+
url = this.options.url(entity_id)
|
39
|
+
else
|
40
|
+
url = this.options.url
|
41
|
+
|
42
|
+
$form = $('<form/>', {action: url, method: 'post'})
|
43
|
+
$form.append('<input type="hidden" name="authenticity_token" value="'+$('meta[name=csrf-token]').attr('content')+'">')
|
44
|
+
$form.append('<input type="hidden" name="utf8" value="✔">')
|
45
|
+
$form.append('<input type="hidden" name="'+this.options.idParamName+'" value="'+entity_id.toString()+'">')
|
46
|
+
$form.append('<input type="hidden" name="'+this.options.valueName+'[]" value="">')
|
47
|
+
for r in this.allRoles
|
48
|
+
$form.append('<label><input type="checkbox" value="'+r+'" '+(if r in roles then 'checked="true"' else '')+' name="'+this.options.valueName+'[]">'+r+'</label>')
|
49
|
+
$form.append('<input type="submit" name="commit" value="Submit" class="'+this.options.submitBtnClass+'">')
|
50
|
+
$elem.append($form)
|
51
|
+
$form.on 'submit', (evt)->
|
52
|
+
evt.preventDefault()
|
53
|
+
$.ajax(url, {data: $form.serializeArray(), dataType: 'json', method: 'POST'}).done (data, textStatus, jqXHR)->
|
54
|
+
$elem.html(data.toString())
|
55
|
+
$elem.data('roles', data)
|
56
|
+
$elem.append(that._edit_btn())
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EgovUtils
|
2
|
+
class FullAddress < AzaharaSchema::Attribute
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
super(EgovUtils::Address, 'full_address', 'string')
|
6
|
+
end
|
7
|
+
|
8
|
+
def arel_field
|
9
|
+
Arel::Nodes::NamedFunction.new 'CONCAT', [EgovUtils::Address.arel_table[:city], Arel::Nodes::SqlLiteral.new('\' \'') , EgovUtils::Address.arel_table[:street]]
|
10
|
+
end
|
11
|
+
|
12
|
+
def path
|
13
|
+
'full_address'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'egon_gate/egsb/messages/e37_vyhledej_adresu'
|
2
|
+
|
3
|
+
module EgovUtils
|
4
|
+
class AddressesController < ApplicationController
|
5
|
+
|
6
|
+
def validate_ruian
|
7
|
+
# TODO: shoud be in some validator - external class
|
8
|
+
addr_params = params.require(:address).permit(:city, :postcode, :street, :orientation_number, :house_number)
|
9
|
+
address = Address.new(addr_params)
|
10
|
+
if (address.city || address.postcode) && (( address.street && address.orientation_number ) || address.house_number)
|
11
|
+
message = EgonGate::Egsb::Messages::E37VyhledejAdresu.new
|
12
|
+
address.prepare_egon_message(message)
|
13
|
+
kobra_reqest = EgonGate::Kobra::Request.new
|
14
|
+
response = kobra_reqest.send_message(message)
|
15
|
+
if response.error?
|
16
|
+
respond_to do |format|
|
17
|
+
format.json { render json: { error: response.error_message }, status: 404 }
|
18
|
+
end
|
19
|
+
else
|
20
|
+
egon_address_info = message.parse_response( response.egsb_response )
|
21
|
+
address.from_egon_info(egon_address_info)
|
22
|
+
respond_to do |format|
|
23
|
+
format.json { render json: address }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
respond_to do |format|
|
28
|
+
format.json { render json: { error: t(:error_not_found) }, status: 404 }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_dependency "egov_utils/application_controller"
|
2
|
+
|
3
|
+
module EgovUtils
|
4
|
+
class GroupsController < ApplicationController
|
5
|
+
|
6
|
+
load_and_authorize_resource
|
7
|
+
|
8
|
+
def create
|
9
|
+
respond_to do |format|
|
10
|
+
if @group.save
|
11
|
+
format.html{ redirect_to main_app.root_path, notice: t('success_created') }
|
12
|
+
format.json{ render json: @group, status: :created }
|
13
|
+
else
|
14
|
+
format.html{ render 'new' }
|
15
|
+
format.json{ render json: @group.errors.full_messages, status: :unprocessable_entity }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def create_params
|
23
|
+
params.require(:group).permit(:name, :provider, :ldap_uid)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_dependency "egov_utils/application_controller"
|
2
|
+
|
3
|
+
module EgovUtils
|
4
|
+
class RolesController < ApplicationController
|
5
|
+
def index
|
6
|
+
authorize! :manage, User
|
7
|
+
authorize! :manage, Group
|
8
|
+
@users = User.all
|
9
|
+
@groups = Group.all
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
entity = params[:entity_class].safe_constantize.try(:find, params[:id])
|
14
|
+
return render_404 unless entity
|
15
|
+
authorize! :manage, entity
|
16
|
+
entity.roles = params[:roles].map(&:presence).compact if params[:roles].is_a?(Array)
|
17
|
+
if entity.save
|
18
|
+
respond_to do |format|
|
19
|
+
format.json { render json: entity.roles }
|
20
|
+
end
|
21
|
+
else
|
22
|
+
respond_to do |format|
|
23
|
+
format.json { render json: entity.errors.full_messages, status: :unprocessable_entity }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module EgovUtils
|
2
|
+
class SessionsController < ApplicationController
|
3
|
+
|
4
|
+
skip_before_action :verify_authenticity_token, only: [:create]
|
5
|
+
|
6
|
+
def new
|
7
|
+
if current_user.logged?
|
8
|
+
redirect_to main_app.root_path
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
password_authentication
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
reset_session
|
18
|
+
redirect_to login_path, notice: t(:notice_logout)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def password_authentication
|
24
|
+
user = User.authenticate(params[:session][:username], params[:session][:password], false)
|
25
|
+
|
26
|
+
if user.nil?
|
27
|
+
invalid_credentials
|
28
|
+
elsif user.new_record?
|
29
|
+
onthefly_creation_failed(user, {:login => user.login, :provider => user.provider })
|
30
|
+
else
|
31
|
+
# Valid user
|
32
|
+
if user.active?
|
33
|
+
successful_authentication(user)
|
34
|
+
else
|
35
|
+
handle_inactive_user(user)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def invalid_credentials(redirect_path=signin_path)
|
41
|
+
logger.warn "Failed login for '#{params[:session][:username]}' from #{request.remote_ip} at #{Time.now.utc}"
|
42
|
+
flash[:error] = t(:notice_account_invalid_credentials)
|
43
|
+
redirect_to redirect_path
|
44
|
+
end
|
45
|
+
|
46
|
+
def successful_authentication(user)
|
47
|
+
logger.info "Successful authentication for '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}"
|
48
|
+
# Valid user
|
49
|
+
self.logged_user = user
|
50
|
+
# generate a key and set cookie if autologin
|
51
|
+
if params[:autologin]
|
52
|
+
set_autologin_cookie(user)
|
53
|
+
end
|
54
|
+
redirect_to main_app.root_path
|
55
|
+
# redirect_back(fallback_location: root_path)
|
56
|
+
end
|
57
|
+
|
58
|
+
def handle_inactive_user(user, redirect_path=signin_path)
|
59
|
+
if user.locked?
|
60
|
+
account_locked(user, redirect_path)
|
61
|
+
else
|
62
|
+
account_pending(user, redirect_path)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def onthefly_creation_failed(user, provider_info={})
|
67
|
+
logger.warn "Failed onthefly_creation for '#{user.login}' (provider '#{user.provider}') from #{request.remote_ip} at #{Time.now.utc}"
|
68
|
+
flash[:error] = t(:notice_onthefly_failure)
|
69
|
+
redirect_to redirect_path
|
70
|
+
end
|
71
|
+
|
72
|
+
def account_pending(user, redirect_path=signin_path)
|
73
|
+
flash[:error] = t(:notice_account_pending)
|
74
|
+
redirect_to redirect_path
|
75
|
+
end
|
76
|
+
|
77
|
+
def account_locked(user, redirect_path=signin_path)
|
78
|
+
flash[:error] = t(:notice_account_locked)
|
79
|
+
redirect_to redirect_path
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_dependency "egov_utils/application_controller"
|
2
|
+
require_dependency "egov_utils/auth_source"
|
3
|
+
|
4
|
+
module EgovUtils
|
5
|
+
class UsersController < ApplicationController
|
6
|
+
|
7
|
+
load_and_authorize_resource only: :index
|
8
|
+
|
9
|
+
def index
|
10
|
+
providers
|
11
|
+
end
|
12
|
+
|
13
|
+
def new
|
14
|
+
@user = User.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@user = User.new(create_params)
|
19
|
+
respond_to do |format|
|
20
|
+
if @user.save
|
21
|
+
format.html{ redirect_to main_app.root_path, notice: t('activerecord.successful.messages.created', model: Group.model_name.human) }
|
22
|
+
format.json{ render json: @user, status: :created }
|
23
|
+
else
|
24
|
+
format.html{ render 'new' }
|
25
|
+
format.json{ render json: @user.errors.full_messages, status: :unprocessable_entity }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def show
|
31
|
+
end
|
32
|
+
|
33
|
+
def approve
|
34
|
+
@user = User.find_by(id: params[:id])
|
35
|
+
render_404 and return unless @user || @user.active?
|
36
|
+
authorize!(:manage, User)
|
37
|
+
@user.update(active: true)
|
38
|
+
redirect_back(fallback_location: @user)
|
39
|
+
end
|
40
|
+
|
41
|
+
def search
|
42
|
+
authorize!(:read, User)
|
43
|
+
authorize!(:read, Group)
|
44
|
+
user_results = []; group_results = []
|
45
|
+
providers.each do |provider|
|
46
|
+
user_results.concat( provider.search_user(params[:q]) )
|
47
|
+
group_results.concat( provider.search_group(params[:q]) )
|
48
|
+
end if params[:q].present?
|
49
|
+
respond_to do |format|
|
50
|
+
format.json{ render json: {users: user_results, groups: group_results} }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def providers
|
57
|
+
@providers = EgovUtils::AuthSource.providers.collect{|p| EgovUtils::AuthSource.new(p)}
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_params
|
61
|
+
params.require(:user).permit(:login, :mail, :password, :password_confirmation, :provider, :firstname, :lastname)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EgovUtils
|
2
|
+
module GridHelper
|
3
|
+
def type_for_grid(type)
|
4
|
+
case type
|
5
|
+
when 'integer', 'float'
|
6
|
+
'Number'
|
7
|
+
when 'string', 'list'
|
8
|
+
'String'
|
9
|
+
when 'date', 'datetime'
|
10
|
+
'Date'
|
11
|
+
when 'boolean'
|
12
|
+
'Boolean'
|
13
|
+
else
|
14
|
+
raise "Undefined grid type for type #{type}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def field_for_grid(attribute)
|
19
|
+
s = "\'"
|
20
|
+
s << attribute.name
|
21
|
+
s << '\': {path: "'
|
22
|
+
s << attribute.path
|
23
|
+
s << '", type: '
|
24
|
+
s << type_for_grid(attribute.type)
|
25
|
+
s << '}'
|
26
|
+
s
|
27
|
+
end
|
28
|
+
|
29
|
+
def column_for_grid(grid, attribute)
|
30
|
+
s = "{"
|
31
|
+
s << "field: '#{attribute.name}'"
|
32
|
+
s << ", title: '#{I18n.t('model_attributes.'+grid.model_i18n_key.to_s+'.'+attribute.name)}'"
|
33
|
+
s << ", columnTemplate: '<a href=\"#{polymorphic_path(grid.schema.model)}/{id}\">{#{attribute.name}}</div>'" if attribute.name == grid.schema.main_attribute_name
|
34
|
+
if attribute.type == 'list'
|
35
|
+
s << ", format: ( (value) -> I18n.t(value, {scope: 'activerecord.attributes.#{attribute.model.model_name.i18n_key}.#{attribute.name.to_s.pluralize}'}) ) "
|
36
|
+
end
|
37
|
+
s << "}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|