ditty 0.9.1 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.env.test +2 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +23 -4
- data/.travis.yml +2 -7
- data/Gemfile.ci +0 -15
- data/ditty.gemspec +19 -15
- data/lib/ditty.rb +2 -2
- data/lib/ditty/cli.rb +5 -0
- data/lib/ditty/components/ditty.rb +4 -7
- data/lib/ditty/controllers/application_controller.rb +6 -5
- data/lib/ditty/controllers/audit_logs_controller.rb +2 -0
- data/lib/ditty/controllers/auth_controller.rb +5 -2
- data/lib/ditty/controllers/component_controller.rb +3 -3
- data/lib/ditty/controllers/user_login_traits_controller.rb +28 -1
- data/lib/ditty/controllers/users_controller.rb +3 -2
- data/lib/ditty/db.rb +4 -3
- data/lib/ditty/emails/base.rb +32 -30
- data/lib/ditty/generators/crud_generator.rb +51 -41
- data/lib/ditty/generators/project_generator.rb +1 -0
- data/lib/ditty/helpers/pundit.rb +4 -4
- data/lib/ditty/helpers/response.rb +6 -11
- data/lib/ditty/helpers/views.rb +21 -3
- data/lib/ditty/listener.rb +1 -1
- data/lib/ditty/models/base.rb +5 -0
- data/lib/ditty/models/identity.rb +7 -7
- data/lib/ditty/models/user.rb +9 -1
- data/lib/ditty/policies/user_policy.rb +1 -1
- data/lib/ditty/services/authentication.rb +19 -9
- data/lib/ditty/services/email.rb +13 -13
- data/lib/ditty/services/logger.rb +26 -20
- data/lib/ditty/services/pagination_wrapper.rb +7 -5
- data/lib/ditty/services/settings.rb +7 -6
- data/lib/ditty/tasks/ditty.rake +2 -1
- data/lib/ditty/templates/application.rb +1 -1
- data/lib/ditty/templates/config.ru +2 -2
- data/lib/ditty/templates/controller.rb.erb +7 -1
- data/{public → lib/ditty/templates/public}/browserconfig.xml +0 -0
- data/{public → lib/ditty/templates/public}/css/styles.css +0 -0
- data/lib/ditty/templates/public/favicon.ico +0 -0
- data/{public → lib/ditty/templates/public}/images/apple-icon.png +0 -0
- data/{public → lib/ditty/templates/public}/images/favicon-16x16.png +0 -0
- data/{public → lib/ditty/templates/public}/images/favicon-32x32.png +0 -0
- data/{public → lib/ditty/templates/public}/images/launcher-icon-1x.png +0 -0
- data/{public → lib/ditty/templates/public}/images/launcher-icon-2x.png +0 -0
- data/{public → lib/ditty/templates/public}/images/launcher-icon-4x.png +0 -0
- data/{public → lib/ditty/templates/public}/images/mstile-150x150.png +0 -0
- data/{public → lib/ditty/templates/public}/images/safari-pinned-tab.svg +0 -0
- data/{public → lib/ditty/templates/public}/js/scripts.js +0 -0
- data/{public/manifest.json → lib/ditty/templates/public/manifest.json.erb} +2 -2
- data/lib/ditty/templates/settings.yml.erb +1 -0
- data/lib/ditty/templates/spec_helper.rb +1 -1
- data/lib/ditty/templates/views/display.haml.tt +1 -1
- data/lib/ditty/templates/views/edit.haml.tt +1 -1
- data/lib/ditty/templates/views/index.haml.tt +1 -1
- data/lib/ditty/templates/views/new.haml.tt +1 -1
- data/lib/ditty/version.rb +1 -1
- data/spec/ditty/api_spec.rb +1 -1
- data/spec/ditty/emails/base_spec.rb +3 -3
- data/spec/ditty/emails/forgot_password_spec.rb +3 -2
- data/spec/ditty/models/user_spec.rb +3 -3
- data/spec/ditty/services/logger_spec.rb +7 -6
- data/spec/ditty/services/settings_spec.rb +2 -2
- data/spec/factories.rb +4 -4
- data/spec/spec_helper.rb +5 -1
- data/views/403.haml +1 -1
- data/views/500.haml +11 -0
- data/views/audit_logs/index.haml +12 -11
- data/views/auth/forgot_password.haml +29 -24
- data/views/auth/ldap.haml +1 -1
- data/views/auth/login.haml +3 -2
- data/views/auth/register.haml +3 -2
- data/views/auth/reset_password.haml +36 -19
- data/views/blank.haml +1 -0
- data/views/embedded.haml +17 -11
- data/views/layout.haml +16 -8
- data/views/partials/actions.haml +15 -14
- data/views/partials/filter_control.haml +1 -1
- data/views/partials/footer.haml +10 -2
- data/views/partials/form_tag.haml +1 -1
- data/views/partials/navitems.haml +25 -27
- data/views/partials/pager.haml +44 -25
- data/views/partials/search.haml +14 -9
- data/views/partials/sidebar.haml +2 -2
- data/views/partials/sort_ui.haml +2 -0
- data/views/partials/timespan_selector.haml +64 -0
- data/views/partials/topbar.haml +0 -15
- data/views/partials/user_associations.haml +32 -0
- data/views/quick_start.haml +23 -0
- data/views/roles/display.haml +3 -3
- data/views/roles/edit.haml +1 -1
- data/views/roles/index.haml +2 -2
- data/views/roles/new.haml +1 -1
- data/views/user_login_traits/display.haml +1 -1
- data/views/user_login_traits/edit.haml +1 -1
- data/views/user_login_traits/index.haml +23 -25
- data/views/user_login_traits/new.haml +1 -1
- data/views/users/display.haml +5 -5
- data/views/users/edit.haml +1 -1
- data/views/users/index.haml +5 -5
- data/views/users/login_traits.haml +2 -2
- data/views/users/new.haml +1 -1
- data/views/users/profile.haml +4 -4
- data/views/users/user.haml +1 -1
- metadata +116 -54
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e785b1b4a84258a46e98753a5de394897bc6d002b88d2fc6629b30b33b52614e
|
|
4
|
+
data.tar.gz: '094a55847cc4ec09bf1dc9307c9efcffa5b59b498fd407de5950e656e5a5e516'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fa7d54c43ac02d1f04a690f2bca5a529b3c65eefa0f287ab44594910bca2b8022656b58e2aef805a52307364481c35be2ba1b1e4b3a97b3450cab1b9acb27d1f
|
|
7
|
+
data.tar.gz: 847143f0f0d20c67b3451a86e780ec44b914210ceec4498c9218ebc05f7f7277107b1998ca5f273aad0ad1ad45ceb051b81204fe87e6cb91e88ee2ef6af7b49c
|
data/.env.test
ADDED
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
|
-
require:
|
|
2
|
-
|
|
1
|
+
require:
|
|
2
|
+
- rubocop-rspec
|
|
3
|
+
- rubocop-performance
|
|
4
|
+
- rubocop-thread_safety
|
|
5
|
+
- rubocop-sequel
|
|
3
6
|
AllCops:
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
NewCops: enable
|
|
8
|
+
TargetRubyVersion: 2.7.1
|
|
9
|
+
Exclude:
|
|
10
|
+
- migrate/**/*
|
|
11
|
+
Layout/LineLength:
|
|
6
12
|
Max: 120
|
|
7
13
|
Layout/LeadingCommentSpace:
|
|
8
14
|
Exclude:
|
|
9
15
|
- 'config.ru'
|
|
16
|
+
Layout/EndOfLine:
|
|
17
|
+
EnforcedStyle: lf
|
|
18
|
+
Layout/MultilineMethodCallIndentation:
|
|
19
|
+
EnforcedStyle: indented
|
|
20
|
+
IndentationWidth: 2
|
|
21
|
+
Layout/IndentationConsistency:
|
|
22
|
+
EnforcedStyle: indented_internal_methods
|
|
23
|
+
Layout/EndAlignment:
|
|
24
|
+
EnforcedStyleAlignWith: variable
|
|
25
|
+
Metrics/MethodLength:
|
|
26
|
+
CountAsOne: ['array', 'heredoc', 'hash']
|
|
27
|
+
Style/Documentation:
|
|
28
|
+
Enabled: false
|
data/.travis.yml
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
sudo: false
|
|
2
2
|
language: ruby
|
|
3
3
|
rvm:
|
|
4
|
+
- 3.0
|
|
4
5
|
- 2.7
|
|
5
6
|
- 2.6
|
|
6
|
-
- 2.5
|
|
7
|
-
- 2.4
|
|
8
|
-
- 2.3
|
|
9
7
|
gemfile: Gemfile.ci
|
|
10
8
|
env:
|
|
11
|
-
global:
|
|
12
|
-
- CC_TEST_REPORTER_ID=289860573c6284a8e277de86848caba84d840be49e35f3601bcd672ab40d1e35
|
|
13
|
-
- DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL=true
|
|
14
9
|
matrix:
|
|
15
10
|
- DATABASE_URL="sqlite::memory:" RACK_ENV=test
|
|
16
11
|
before_install:
|
|
@@ -22,7 +17,7 @@ before_script:
|
|
|
22
17
|
- bundle exec rake ditty:prep
|
|
23
18
|
script:
|
|
24
19
|
- bundle exec rake
|
|
25
|
-
- bundle exec rubocop --fail-level W lib views
|
|
20
|
+
- bundle exec rubocop --fail-level W lib views spec
|
|
26
21
|
after_script:
|
|
27
22
|
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
|
28
23
|
after_success:
|
data/Gemfile.ci
CHANGED
|
@@ -2,18 +2,3 @@
|
|
|
2
2
|
source 'https://rubygems.org'
|
|
3
3
|
|
|
4
4
|
gemspec
|
|
5
|
-
|
|
6
|
-
gem 'faker'
|
|
7
|
-
gem 'simplecov', '~> 0.13.0'
|
|
8
|
-
gem 'sqlite3'
|
|
9
|
-
|
|
10
|
-
if RUBY_VERSION < '2.1'
|
|
11
|
-
gem 'sidekiq', '3.0.0'
|
|
12
|
-
gem 'activesupport', '<4.0.0'
|
|
13
|
-
gem 'omniauth', '~>1.4.2'
|
|
14
|
-
elsif RUBY_VERSION < '2.2.0'
|
|
15
|
-
gem 'sidekiq', '4.0.0'
|
|
16
|
-
gem 'activesupport', '<5.0.0'
|
|
17
|
-
else
|
|
18
|
-
gem 'activesupport'
|
|
19
|
-
end
|
data/ditty.gemspec
CHANGED
|
@@ -21,37 +21,41 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
spec.require_paths = ['lib']
|
|
22
22
|
|
|
23
23
|
spec.add_development_dependency 'bundler', '>= 1'
|
|
24
|
-
spec.add_development_dependency '
|
|
24
|
+
spec.add_development_dependency 'dotenv'
|
|
25
|
+
spec.add_development_dependency 'database_cleaner', '~> 1.0'
|
|
25
26
|
spec.add_development_dependency 'factory_bot'
|
|
26
|
-
spec.add_development_dependency '
|
|
27
|
+
spec.add_development_dependency 'faker'
|
|
27
28
|
spec.add_development_dependency 'racksh'
|
|
29
|
+
spec.add_development_dependency 'rack-test'
|
|
28
30
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
29
31
|
spec.add_development_dependency 'rubocop'
|
|
30
32
|
spec.add_development_dependency 'rubocop-performance'
|
|
31
33
|
spec.add_development_dependency 'rubocop-rspec'
|
|
32
34
|
spec.add_development_dependency 'rubocop-sequel'
|
|
33
35
|
spec.add_development_dependency 'rubocop-thread_safety'
|
|
36
|
+
spec.add_development_dependency 'simplecov', '~> 0.13.0'
|
|
37
|
+
spec.add_development_dependency 'sqlite3'
|
|
34
38
|
spec.add_development_dependency 'timecop'
|
|
35
39
|
|
|
36
|
-
spec.add_dependency 'activesupport', '>=
|
|
37
|
-
spec.add_dependency 'bcrypt', '
|
|
38
|
-
spec.add_dependency 'browser', '
|
|
40
|
+
spec.add_dependency 'activesupport', '>= 6'
|
|
41
|
+
spec.add_dependency 'bcrypt', '>= 3.1'
|
|
42
|
+
spec.add_dependency 'browser', '>= 5.3'
|
|
39
43
|
spec.add_dependency 'dotenv', '>= 2'
|
|
40
|
-
spec.add_dependency 'haml', '
|
|
41
|
-
spec.add_dependency 'logger', '
|
|
44
|
+
spec.add_dependency 'haml', '>= 5.1.2'
|
|
45
|
+
spec.add_dependency 'logger', '>= 1.0'
|
|
42
46
|
spec.add_dependency 'mail', '>= 1.7'
|
|
43
47
|
spec.add_dependency 'oga', '>= 2.14'
|
|
44
48
|
spec.add_dependency 'omniauth', '~> 1.0'
|
|
45
49
|
spec.add_dependency 'omniauth-identity', '~> 1.0'
|
|
46
50
|
spec.add_dependency 'pundit', '~> 1.0'
|
|
47
|
-
spec.add_dependency 'rack-contrib', '
|
|
48
|
-
spec.add_dependency 'rack_csrf', '
|
|
49
|
-
spec.add_dependency 'rake', '
|
|
50
|
-
spec.add_dependency 'sequel', '>=
|
|
51
|
-
spec.add_dependency 'sinatra', '>= 2.
|
|
52
|
-
spec.add_dependency 'sinatra-contrib', '
|
|
53
|
-
spec.add_dependency 'sinatra-flash', '
|
|
54
|
-
spec.add_dependency 'sinatra-param', '
|
|
51
|
+
spec.add_dependency 'rack-contrib', '>= 2.0'
|
|
52
|
+
spec.add_dependency 'rack_csrf', '>= 2.0'
|
|
53
|
+
spec.add_dependency 'rake', '>= 13.0'
|
|
54
|
+
spec.add_dependency 'sequel', '>= 5.0'
|
|
55
|
+
spec.add_dependency 'sinatra', '>= 2.1'
|
|
56
|
+
spec.add_dependency 'sinatra-contrib', '>= 2.0'
|
|
57
|
+
spec.add_dependency 'sinatra-flash', '>= 0.3'
|
|
58
|
+
spec.add_dependency 'sinatra-param', '>= 1.6'
|
|
55
59
|
spec.add_dependency 'thor', '>= 0.20'
|
|
56
60
|
spec.add_dependency 'tilt', '>= 2'
|
|
57
61
|
spec.add_dependency 'will_paginate', '>= 3.1'
|
data/lib/ditty.rb
CHANGED
|
@@ -96,9 +96,9 @@ module Ditty
|
|
|
96
96
|
|
|
97
97
|
# Return an ordered list of navigation items:
|
|
98
98
|
# `[{order:0, link:'/users/', text:'Users'}, {order:1, link:'/roles/', text:'Roles'}]
|
|
99
|
-
def self.navigation
|
|
99
|
+
def self.navigation(request)
|
|
100
100
|
nav = components.each_with_object([]) do |comp, memo|
|
|
101
|
-
memo.concat comp[1].navigation if comp[1].respond_to?(:navigation)
|
|
101
|
+
memo.concat comp[1].navigation(request) if comp[1].respond_to?(:navigation)
|
|
102
102
|
end
|
|
103
103
|
nav.sort_by { |v| v[:order] }
|
|
104
104
|
end
|
data/lib/ditty/cli.rb
CHANGED
|
@@ -11,6 +11,10 @@ require 'ditty/generators/project_generator'
|
|
|
11
11
|
require 'ditty/generators/migration_generator'
|
|
12
12
|
require 'ditty/components/ditty'
|
|
13
13
|
|
|
14
|
+
# TODO: Component generator
|
|
15
|
+
# TODO: Add requires into application.rb
|
|
16
|
+
# TODO: Add requires into schema.rb
|
|
17
|
+
|
|
14
18
|
module Ditty
|
|
15
19
|
class CLI < Thor
|
|
16
20
|
include Thor::Actions
|
|
@@ -25,6 +29,7 @@ module Ditty
|
|
|
25
29
|
|
|
26
30
|
desc 'server', 'Start the Ditty server'
|
|
27
31
|
require './application' if File.exist?('application.rb')
|
|
32
|
+
require 'ditty/db' unless defined?(DB)
|
|
28
33
|
::Ditty::Components.tasks
|
|
29
34
|
def server
|
|
30
35
|
# Ensure the token files are present
|
|
@@ -29,10 +29,6 @@ module Ditty
|
|
|
29
29
|
File.expand_path('../../../views', __dir__)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def self.public_folder
|
|
33
|
-
File.expand_path('../../../public', __dir__)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
32
|
def self.routes
|
|
37
33
|
load
|
|
38
34
|
{
|
|
@@ -45,20 +41,21 @@ module Ditty
|
|
|
45
41
|
}
|
|
46
42
|
end
|
|
47
43
|
|
|
48
|
-
def self.navigation
|
|
44
|
+
def self.navigation(_request)
|
|
49
45
|
load
|
|
50
46
|
|
|
51
47
|
[
|
|
52
48
|
{
|
|
53
49
|
group: 'User Management',
|
|
54
|
-
order:
|
|
50
|
+
order: 50,
|
|
55
51
|
icon: 'lock',
|
|
56
52
|
target: ::Ditty::User,
|
|
57
53
|
items: [
|
|
58
54
|
{ order: 10, link: '/users/', text: 'Users', target: ::Ditty::User, icon: 'user' },
|
|
59
55
|
{ order: 20, link: '/roles/', text: 'Roles', target: ::Ditty::Role, icon: 'check-square' },
|
|
60
56
|
{ order: 30, link: '/audit-logs/', text: 'Audit Logs', target: ::Ditty::AuditLog, icon: 'history' },
|
|
61
|
-
{ order: 40, link: '/login-traits/', text: 'User Login Traits', target: ::Ditty::UserLoginTrait,
|
|
57
|
+
{ order: 40, link: '/login-traits/', text: 'User Login Traits', target: ::Ditty::UserLoginTrait,
|
|
58
|
+
icon: 'list' }
|
|
62
59
|
]
|
|
63
60
|
}
|
|
64
61
|
]
|
|
@@ -20,7 +20,7 @@ module Ditty
|
|
|
20
20
|
class ApplicationController < Sinatra::Base
|
|
21
21
|
include ActiveSupport::Inflector
|
|
22
22
|
|
|
23
|
-
set :root, ENV['APP_ROOT'] || ::File.expand_path(::File.dirname(__FILE__)
|
|
23
|
+
set :root, ENV['APP_ROOT'] || ::File.expand_path("#{::File.dirname(__FILE__)}/../../../")
|
|
24
24
|
set :map_path, nil
|
|
25
25
|
set :view_location, nil
|
|
26
26
|
set :view_folder, nil
|
|
@@ -37,7 +37,7 @@ module Ditty
|
|
|
37
37
|
register Sinatra::Flash, Sinatra::RespondWith
|
|
38
38
|
|
|
39
39
|
use Rack::Csrf, raise: ENV['APP_ENV'] == 'development' unless ENV['APP_ENV'] == 'test'
|
|
40
|
-
use Rack::
|
|
40
|
+
use Rack::JSONBodyParser
|
|
41
41
|
use Rack::MethodOverride
|
|
42
42
|
use Rack::NestedParams
|
|
43
43
|
|
|
@@ -149,7 +149,8 @@ module Ditty
|
|
|
149
149
|
haml :'400', locals: { title: '4 oh oh' }, layout: layout
|
|
150
150
|
end
|
|
151
151
|
format.json do
|
|
152
|
-
json code: 400, errors: { env['sinatra.error'].param => env['sinatra.error'].message },
|
|
152
|
+
json code: 400, errors: { env['sinatra.error'].param => env['sinatra.error'].message },
|
|
153
|
+
full_errors: [env['sinatra.error'].message]
|
|
153
154
|
end
|
|
154
155
|
end
|
|
155
156
|
end
|
|
@@ -238,8 +239,8 @@ module Ditty
|
|
|
238
239
|
request.path_info = request.path_info.gsub(/.csv$/, '')
|
|
239
240
|
elsif request.env['ACCEPT']
|
|
240
241
|
content_type request.env['ACCEPT']
|
|
241
|
-
|
|
242
|
-
content_type(:json)
|
|
242
|
+
elsif request.accept.count.eql?(1) && request.accept.first.to_s.eql?('*/*')
|
|
243
|
+
content_type(:json)
|
|
243
244
|
end
|
|
244
245
|
end
|
|
245
246
|
|
|
@@ -24,7 +24,7 @@ module Ditty
|
|
|
24
24
|
|
|
25
25
|
broadcast("before_#{provider}_login".to_sym, env['omniauth.auth'])
|
|
26
26
|
user = User.first(email: env['omniauth.auth']['info']['email'])
|
|
27
|
-
user = register_user if user.nil? && authorize(
|
|
27
|
+
user = register_user if user.nil? && authorize(::Ditty::User, :register?)
|
|
28
28
|
return failed_login if user.nil?
|
|
29
29
|
|
|
30
30
|
broadcast("#{provider}_login".to_sym, user)
|
|
@@ -96,7 +96,7 @@ module Ditty
|
|
|
96
96
|
token = SecureRandom.hex(16)
|
|
97
97
|
identity.update(reset_token: token, reset_requested: Time.now)
|
|
98
98
|
# Send Email
|
|
99
|
-
reset_url = "#{request.base_url}#{settings.map_path}/reset-password?token=#{token}"
|
|
99
|
+
reset_url = "#{request.base_url}#{settings.map_path}/auth/reset-password?token=#{token}"
|
|
100
100
|
::Ditty::Services::Email.deliver(
|
|
101
101
|
:forgot_password,
|
|
102
102
|
email,
|
|
@@ -105,6 +105,9 @@ module Ditty
|
|
|
105
105
|
end
|
|
106
106
|
flash[:info] = 'An email was sent to the email provided with instructions on how to reset your password'
|
|
107
107
|
redirect "#{settings.map_path}/auth/login"
|
|
108
|
+
rescue Sinatra::Param::InvalidParameterError
|
|
109
|
+
flash[:warning] = 'Email address not provided'
|
|
110
|
+
redirect back
|
|
108
111
|
end
|
|
109
112
|
|
|
110
113
|
get '/reset-password' do
|
|
@@ -37,8 +37,8 @@ module Ditty
|
|
|
37
37
|
after do
|
|
38
38
|
return if settings.environment == 'production'
|
|
39
39
|
|
|
40
|
-
if (response.successful? || response.redirection?) && @skip_verify == false
|
|
41
|
-
verify_authorized
|
|
40
|
+
if (response.successful? || response.redirection?) && @skip_verify == false && (settings.environment != 'production')
|
|
41
|
+
verify_authorized
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -96,7 +96,7 @@ module Ditty
|
|
|
96
96
|
entity = read!(id)
|
|
97
97
|
authorize entity, :update
|
|
98
98
|
|
|
99
|
-
flash[:redirect_to] = "#{base_path}/#{entity.display_id}"
|
|
99
|
+
flash[:redirect_to] = "#{base_path}/#{entity.display_id}" unless flash.keep(:redirect_to)
|
|
100
100
|
haml :"#{view_location}/edit",
|
|
101
101
|
locals: { entity: entity, title: heading(:edit) },
|
|
102
102
|
layout: layout
|
|
@@ -8,12 +8,39 @@ module Ditty
|
|
|
8
8
|
class UserLoginTraitsController < ::Ditty::ComponentController
|
|
9
9
|
SEARCHABLE = %i[platform device browser ip_address].freeze
|
|
10
10
|
FILTERS = [
|
|
11
|
-
{ name: :user, field: 'user.email' }
|
|
11
|
+
{ name: :user, field: 'user.email' },
|
|
12
|
+
{ name: :platform },
|
|
13
|
+
{ name: :device },
|
|
14
|
+
{ name: :browser }
|
|
12
15
|
].freeze
|
|
13
16
|
|
|
14
17
|
set base_path: '/login-traits'
|
|
15
18
|
set model_class: UserLoginTrait
|
|
16
19
|
set heading: 'Login'
|
|
17
20
|
# set track_actions: true
|
|
21
|
+
|
|
22
|
+
helpers do
|
|
23
|
+
def user_options
|
|
24
|
+
policy_scope(::Ditty::User).as_hash(:email, :email)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def platform_options
|
|
28
|
+
policy_scope(::Ditty::UserLoginTrait).select(:platform).distinct.as_hash(:platform, :platform)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def device_options
|
|
32
|
+
policy_scope(::Ditty::UserLoginTrait).select(:device).distinct.as_hash(:device, :device)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def browser_options
|
|
36
|
+
policy_scope(::Ditty::UserLoginTrait).select(:browser).distinct.as_hash(:browser, :browser)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def list
|
|
41
|
+
return super if params[:sort]
|
|
42
|
+
|
|
43
|
+
super.order(:updated_at).reverse
|
|
44
|
+
end
|
|
18
45
|
end
|
|
19
46
|
end
|
|
@@ -55,7 +55,7 @@ module Ditty
|
|
|
55
55
|
user.check_roles
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
broadcast(:component_create, target: self)
|
|
58
|
+
broadcast(:component_create, target: self, entity: user)
|
|
59
59
|
create_response(user)
|
|
60
60
|
end
|
|
61
61
|
|
|
@@ -96,7 +96,8 @@ module Ditty
|
|
|
96
96
|
|
|
97
97
|
values = permitted_parameters(Identity, :create)
|
|
98
98
|
identity.set values
|
|
99
|
-
if identity.valid?
|
|
99
|
+
if identity.valid?
|
|
100
|
+
identity.save_changes
|
|
100
101
|
broadcast(:identity_update_password, target: self)
|
|
101
102
|
flash[:success] = 'Password Updated'
|
|
102
103
|
redirect back
|
data/lib/ditty/db.rb
CHANGED
|
@@ -23,10 +23,11 @@ elsif ENV['DATABASE_URL'].blank? == false
|
|
|
23
23
|
DB.extension(:schema_caching)
|
|
24
24
|
DB.load_schema_cache?('./config/schema.dump')
|
|
25
25
|
|
|
26
|
-
Sequel::Model.plugin :validation_helpers
|
|
27
|
-
Sequel::Model.plugin :update_or_create
|
|
28
|
-
Sequel::Model.plugin :timestamps, update_on_create: true
|
|
29
26
|
Sequel::Model.plugin :auto_validations
|
|
27
|
+
Sequel::Model.plugin :string_stripper
|
|
28
|
+
Sequel::Model.plugin :timestamps, update_on_create: true
|
|
29
|
+
Sequel::Model.plugin :update_or_create
|
|
30
|
+
Sequel::Model.plugin :validation_helpers
|
|
30
31
|
else
|
|
31
32
|
::Ditty::Services::Logger.error 'No database connection set up'
|
|
32
33
|
end
|
data/lib/ditty/emails/base.rb
CHANGED
|
@@ -37,50 +37,52 @@ module Ditty
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def respond_to_missing?(method, _include_private = false)
|
|
40
|
-
mail.respond_to?
|
|
40
|
+
return true if mail.respond_to?(method)
|
|
41
|
+
|
|
42
|
+
super
|
|
41
43
|
end
|
|
42
44
|
|
|
43
45
|
private
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
def content
|
|
48
|
+
result = Haml::Engine.new(content_haml).render(Object.new, locals)
|
|
49
|
+
return result unless options[:layout]
|
|
48
50
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
Haml::Engine.new(layout_haml).render(Object.new, locals.merge(content: result))
|
|
52
|
+
end
|
|
51
53
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
def content_haml
|
|
55
|
+
read_template(options[:view])
|
|
56
|
+
end
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
def layout_haml
|
|
59
|
+
read_template("layouts/#{options[:layout]}") if options[:layout]
|
|
60
|
+
end
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
def read_template(template)
|
|
63
|
+
File.read(find_template("emails/#{template}"))
|
|
64
|
+
end
|
|
63
65
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
def base_options
|
|
67
|
+
{ subject: '(No Subject)', from: 'no-reply@ditty.io', view: :base, content_type: 'text/html; charset=UTF-8' }
|
|
68
|
+
end
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
def find_template(file)
|
|
71
|
+
template = File.expand_path("./views/#{file}.haml")
|
|
72
|
+
return template if File.file? template
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
template = File.expand_path("./#{file}.haml", App.view_folder)
|
|
75
|
+
return template if File.file? template
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
file
|
|
78
|
+
end
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
class << self
|
|
81
|
+
def deliver!(to = nil, options = {})
|
|
82
|
+
locals = options[:locals] || {}
|
|
83
|
+
new(options).deliver!(to, locals)
|
|
84
|
+
end
|
|
82
85
|
end
|
|
83
|
-
end
|
|
84
86
|
end
|
|
85
87
|
end
|
|
86
88
|
end
|