beautiful_scaffold 2.0.0 → 2.0.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/CHANGELOG +13 -0
- data/Gemfile +4 -3
- data/README.rdoc +22 -4
- data/lib/beautiful_scaffold/version.rb +1 -1
- data/lib/generators/USAGE +3 -1
- data/lib/generators/beautiful_cancancan_generator.rb +51 -0
- data/lib/generators/beautiful_jointable_generator.rb +1 -1
- data/lib/generators/beautiful_locale_generator.rb +15 -13
- data/lib/generators/beautiful_scaffold_common_methods.rb +5 -1
- data/lib/generators/beautiful_scaffold_generator.rb +1 -1
- data/lib/generators/beautiful_sorcery_generator.rb +137 -0
- data/lib/generators/beautiful_storage_generator.rb +61 -0
- data/lib/generators/templates/app/controllers/user_sessions_controller.rb +20 -0
- data/lib/generators/templates/app/locales/beautiful_scaffold.en.yml +8 -0
- data/lib/generators/templates/app/locales/beautiful_scaffold.fr.yml +9 -1
- data/lib/generators/templates/app/locales/beautiful_scaffold.ja.yml +9 -2
- data/lib/generators/templates/app/mailers/user_mailer.rb +13 -0
- data/lib/generators/templates/app/models/ability.rb +39 -0
- data/lib/generators/templates/app/models/concerns/caption_concern.rb +1 -1
- data/lib/generators/templates/app/models/user.rb +11 -0
- data/lib/generators/templates/app/views/layout.html.erb +9 -2
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.html.erb +16 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.text.erb +9 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.html.erb +16 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.text.erb +8 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.html.erb +19 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.text.erb +8 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.html.erb +19 -0
- data/lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.text.erb +8 -0
- data/lib/generators/templates/app/views/login_logout/user_sessions/_form.html.erb +15 -0
- data/lib/generators/templates/app/views/login_logout/user_sessions/new.html.erb +3 -0
- data/lib/generators/templates/app/views/partials/_login_logout_register.html.erb +7 -0
- metadata +21 -8
- data/lib/generators/beautiful_devisecancan_generator.rb +0 -128
- data/lib/generators/templates/app/views/partials/_register_form.html.erb +0 -44
- data/lib/generators/templates/app/views/partials/_sign_in_form.html.erb +0 -18
- data/lib/generators/templates/app/views/partials/_sign_in_sign_out.html.erb +0 -19
- data/lib/generators/templates/lib/custom_failure.rb +0 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f2c5cc9830b52e9bdc57663e3e93779e3457502e4f3656f0c541b8213775edca
|
|
4
|
+
data.tar.gz: 03260e7d438e1aa4c9161a5fdf1b221fd21c2acc4625857ac00eadf4686ac04c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d95e8b02e11a731844977432a230d83b200da69018184d3583a3ade48f448face2799f8e76bcb01ee13b40b7166813f0921fe57442db6fa7f18ec23eb6b62f79
|
|
7
|
+
data.tar.gz: 7ab3d32603cf3c89f6c34a7d5798610b60ccbf701a3c8583eee89bdabadb0a090c96436e8e17c11f2c9d41d7ba4262820414b1096e54124df2b02cccaf9b777e
|
data/CHANGELOG
CHANGED
|
@@ -4,6 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
* bugfix
|
|
6
6
|
|
|
7
|
+
== 2.0.1
|
|
8
|
+
|
|
9
|
+
* enhancement
|
|
10
|
+
* Replace Devise by Sorcery
|
|
11
|
+
* Tests Sorcery and Cancancan generators
|
|
12
|
+
* New generator for ActiveStorage
|
|
13
|
+
|
|
14
|
+
* bugfix
|
|
15
|
+
* Locale : fix all locale in the same file.
|
|
16
|
+
* Visual fix ('-' in menu)
|
|
17
|
+
* Will_paginate right locales
|
|
18
|
+
* Avoid adding gems multiple times
|
|
19
|
+
|
|
7
20
|
== 2.0.0
|
|
8
21
|
|
|
9
22
|
* enhancement
|
data/Gemfile
CHANGED
|
@@ -2,7 +2,7 @@ source "http://rubygems.org"
|
|
|
2
2
|
|
|
3
3
|
gemspec
|
|
4
4
|
|
|
5
|
-
gem "rails", "~> 6.
|
|
5
|
+
gem "rails", "~> 6.1"
|
|
6
6
|
|
|
7
7
|
group :test do
|
|
8
8
|
gem 'sqlite3'
|
|
@@ -15,10 +15,11 @@ group :test do
|
|
|
15
15
|
'prawn-table' => nil, #'0.2.2',
|
|
16
16
|
'sanitize' => nil,
|
|
17
17
|
'bootstrap' => '~> 4.3.1',
|
|
18
|
-
'font-awesome-rails' => '4.7.0.
|
|
18
|
+
'font-awesome-rails' => '4.7.0.7',
|
|
19
19
|
'momentjs-rails' => '>= 2.9.0',
|
|
20
20
|
'bootstrap4-datetime-picker-rails' => nil,
|
|
21
|
-
'jquery-rails' => '4.3.1'
|
|
21
|
+
'jquery-rails' => '4.3.1',
|
|
22
|
+
'sorcery' => '0.15.0'
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
gems.each{ |gem_to_add, version|
|
data/README.rdoc
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Beautiful Scaffold is a gem which propose generators for a complete scaffold with paginate, sort and filter.
|
|
4
4
|
Fully customizable.
|
|
5
|
+
|
|
6
|
+
Note : Avoid to change Beautiful-Scaffold version in your project (incompatibility between generated code).
|
|
7
|
+
Note 2 : Be careful to have a clean git repository for your project because Beautiful-Scaffold change many files.
|
|
8
|
+
It will be easier to revert changes.
|
|
9
|
+
|
|
5
10
|
Info : https://github.com/rivsc/Beautiful-Scaffold
|
|
6
11
|
Demo : http://beautiful-scaffold.rivsc.ovh/
|
|
7
12
|
|
|
@@ -70,10 +75,23 @@ Run `rake db:migrate` before `rails g beautiful_locale` (to get lastest attribut
|
|
|
70
75
|
|
|
71
76
|
rails g beautiful_jointable model1 model2
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
=== Install et preconfigure Sorcery (authentification) (this generator doesn't work on engine)
|
|
79
|
+
|
|
80
|
+
# If it is not done yet
|
|
81
|
+
rails g beautiful_scaffold user email:string
|
|
82
|
+
rails g beautiful_sorcery
|
|
83
|
+
|
|
84
|
+
=== Install et preconfigure Cancancan (authorization) (this generator doesn't work on engine)
|
|
85
|
+
|
|
86
|
+
# If it is not done yet
|
|
87
|
+
rails g beautiful_scaffold user email:string
|
|
88
|
+
# If it is not done yet
|
|
89
|
+
rails g beautiful_sorcery
|
|
90
|
+
rails g beautiful_cancancan
|
|
91
|
+
|
|
92
|
+
=== Storage (ActiveStorage)
|
|
75
93
|
|
|
76
|
-
|
|
94
|
+
rails g beautiful_storage model attachment_field
|
|
77
95
|
|
|
78
96
|
=== In views
|
|
79
97
|
|
|
@@ -103,7 +121,7 @@ Example : when you click on the #bs-help tag presentation tour display on screen
|
|
|
103
121
|
|
|
104
122
|
If you want to add 'slide' :
|
|
105
123
|
|
|
106
|
-
For add instruction to element, add this to your markup :
|
|
124
|
+
For add instruction to DOM element, add this to your markup :
|
|
107
125
|
|
|
108
126
|
id="myunique-id-in-the-page" data-present-title="Title for the slide" data-present-description="Short description" data-present-order="1"
|
|
109
127
|
|
data/lib/generators/USAGE
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# encoding : utf-8
|
|
2
|
+
class BeautifulCancancanGenerator < Rails::Generators::Base
|
|
3
|
+
require_relative 'beautiful_scaffold_common_methods'
|
|
4
|
+
include BeautifulScaffoldCommonMethods
|
|
5
|
+
|
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
+
|
|
8
|
+
#argument :model, :type => :string, :desc => "Name of model (ex: user)"
|
|
9
|
+
|
|
10
|
+
def install_cancancan
|
|
11
|
+
model = "user"
|
|
12
|
+
|
|
13
|
+
gem("cancancan", "3.2.1")
|
|
14
|
+
|
|
15
|
+
Bundler.with_unbundled_env do
|
|
16
|
+
run "bundle install"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Because generators doesn't work !
|
|
20
|
+
copy_file("app/models/ability.rb")
|
|
21
|
+
|
|
22
|
+
# Why that doesn't work... boring...
|
|
23
|
+
#puts rails_command("generate cancan:ability", capture: true)
|
|
24
|
+
# Why that doesn't work too... boring...
|
|
25
|
+
#generate("cancan:ability")
|
|
26
|
+
|
|
27
|
+
# current_user method need for CanCan
|
|
28
|
+
current_user_method = ""
|
|
29
|
+
if model != "user" then
|
|
30
|
+
current_user_method = "
|
|
31
|
+
def current_user
|
|
32
|
+
current_#{model}
|
|
33
|
+
end"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Exception for AccessDenied
|
|
37
|
+
inject_into_file("app/controllers/application_controller.rb", "
|
|
38
|
+
rescue_from CanCan::AccessDenied do |exception|
|
|
39
|
+
respond_to do |format|
|
|
40
|
+
format.json { head :forbidden, content_type: 'text/html' }
|
|
41
|
+
format.html { redirect_to root_url, :alert => exception.message }
|
|
42
|
+
format.js { head :forbidden, content_type: 'text/html' }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
#{current_user_method}
|
|
46
|
+
", :after => "class ApplicationController < ActionController::Base\n")
|
|
47
|
+
|
|
48
|
+
# Access controlled by CanCanCan (in beautiful_scaffold)
|
|
49
|
+
inject_into_file("app/controllers/application_controller.rb", "#", :before => "before_action :authenticate_#{model}!, :except => [:dashboard]")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -5,7 +5,7 @@ class BeautifulJointableGenerator < Rails::Generators::Base
|
|
|
5
5
|
|
|
6
6
|
source_root File.expand_path('../templates', __FILE__)
|
|
7
7
|
|
|
8
|
-
argument :join_models, :type => :array, :default => [], :banner => "model
|
|
8
|
+
argument :join_models, :type => :array, :default => [], :banner => "Two model names singular downcase (ex: product family)"
|
|
9
9
|
|
|
10
10
|
class_option :mountable_engine, default: nil
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
5
5
|
|
|
6
6
|
source_root File.expand_path('../templates', __FILE__)
|
|
7
7
|
|
|
8
|
-
argument :name, :type => :string, :desc => "type of locale : fr
|
|
8
|
+
argument :name, :type => :string, :desc => "type of locale : fr, en, de, all"
|
|
9
9
|
|
|
10
10
|
class_option :mountable_engine, :default => nil
|
|
11
11
|
|
|
@@ -18,13 +18,15 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
18
18
|
|
|
19
19
|
def install_locale
|
|
20
20
|
list_locales.each{ |temp_locale|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
|
|
22
|
+
["beautiful_scaffold.#{temp_locale}.yml"].each do |filename|
|
|
23
|
+
gem_localepath = "app/locales/#{filename}"
|
|
24
|
+
app_localepath = "config/locales/#{filename}"
|
|
25
|
+
begin
|
|
26
|
+
copy_file gem_localepath, app_localepath
|
|
27
|
+
rescue
|
|
28
|
+
say_status("Error", "This beautiful_locale #{temp_locale} doesn't exist !", :red)
|
|
29
|
+
end
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
rails_locale_file = "#{temp_locale}.yml"
|
|
@@ -36,7 +38,7 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
willpaginate_locale_file = "will_paginate.#{temp_locale}.yml"
|
|
39
|
-
download_path = "https://raw.
|
|
41
|
+
download_path = "https://raw.githubusercontent.com/tigrish/will-paginate-i18n/master/config/locales/#{temp_locale}.yml"
|
|
40
42
|
begin
|
|
41
43
|
get download_path, "config/locales/#{willpaginate_locale_file}"
|
|
42
44
|
say_status("Warning", "You must modify Will_paginate locale at : Rails.root/config/locale/#{willpaginate_locale_file}", :red)
|
|
@@ -51,8 +53,8 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
51
53
|
def regenerate_app_locale
|
|
52
54
|
require 'net/http'
|
|
53
55
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
app_path = (Rails.root || engine_opt)
|
|
57
|
+
app_name = Rails.application.class.name.split('::').first.downcase
|
|
56
58
|
prefix = engine_opt.blank? ? '' : "#{engine_opt.camelize}::"
|
|
57
59
|
|
|
58
60
|
already_processed = {}
|
|
@@ -63,7 +65,7 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
63
65
|
|
|
64
66
|
already_processed[locale] ||= {}
|
|
65
67
|
|
|
66
|
-
filepath = File.join(
|
|
68
|
+
filepath = File.join(app_path, 'config', 'locales', "#{app_name}.#{locale}.yml")
|
|
67
69
|
begin
|
|
68
70
|
if File.exist?(filepath)
|
|
69
71
|
hi18n = YAML.load_file(filepath)
|
|
@@ -154,7 +156,7 @@ class BeautifulLocaleGenerator < Rails::Generators::Base
|
|
|
154
156
|
File.unlink(filepath) if File.exist?(filepath)
|
|
155
157
|
|
|
156
158
|
file = File.open(filepath, "w")
|
|
157
|
-
file.write(hi18n.to_yaml)
|
|
159
|
+
file.write(hi18n[locale].to_yaml)
|
|
158
160
|
file.close
|
|
159
161
|
end
|
|
160
162
|
end
|
|
@@ -208,8 +208,12 @@ module BeautifulScaffoldCommonMethods
|
|
|
208
208
|
puts "============> Engine : You must add gems to your main app \n #{gems.to_a.map{ |a| "gem '#{a[0]}'#{(a[1].nil? ? '' : ", '#{a[1]}'")} " }.join("\n")}"
|
|
209
209
|
end
|
|
210
210
|
|
|
211
|
+
gemfile_content = File.read('Gemfile')
|
|
211
212
|
gems.each{ |gem_to_add, version|
|
|
212
|
-
|
|
213
|
+
# Bug add at every times, need to check if already present
|
|
214
|
+
if !gemfile_content.include?(gem_to_add)
|
|
215
|
+
gem(gem_to_add, version)
|
|
216
|
+
end
|
|
213
217
|
}
|
|
214
218
|
end
|
|
215
219
|
|
|
@@ -13,7 +13,7 @@ class BeautifulScaffoldGenerator < Rails::Generators::Base
|
|
|
13
13
|
|
|
14
14
|
source_root File.expand_path('../templates', __FILE__)
|
|
15
15
|
|
|
16
|
-
argument :model_opt, type: :string, desc: "Name of model (
|
|
16
|
+
argument :model_opt, type: :string, desc: "Name of model singular downcase (ex: family)"
|
|
17
17
|
argument :myattributes, type: :array, default: [], banner: "field:type field:type"
|
|
18
18
|
|
|
19
19
|
class_option :namespace, default: nil
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# encoding : utf-8
|
|
2
|
+
class BeautifulSorceryGenerator < Rails::Generators::Base
|
|
3
|
+
require_relative 'beautiful_scaffold_common_methods'
|
|
4
|
+
include BeautifulScaffoldCommonMethods
|
|
5
|
+
|
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
+
|
|
8
|
+
#argument :model, :type => :string, :desc => "Name of model (ex: User)"
|
|
9
|
+
|
|
10
|
+
def install_sorcery
|
|
11
|
+
model = "User"
|
|
12
|
+
view_path = "app/views/"
|
|
13
|
+
|
|
14
|
+
if !File.read('Gemfile').include?("sorcery")
|
|
15
|
+
gem("sorcery", "0.16.0")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Bundler.with_unbundled_env do
|
|
19
|
+
run "bundle install"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
raise "Model must be specified" if model.blank?
|
|
23
|
+
|
|
24
|
+
# Install sorcery
|
|
25
|
+
generate("sorcery:install", "remember_me reset_password user_activation brute_force_protection external --model #{model}")
|
|
26
|
+
|
|
27
|
+
# If exist users migration just add columns
|
|
28
|
+
create_user_migration = Dir.glob("db/migrate/*create_users.rb").first
|
|
29
|
+
if create_user_migration
|
|
30
|
+
already_email = File.read(create_user_migration).include?(":email")
|
|
31
|
+
sorcery_core_file = Dir.glob("db/migrate/*sorcery_core.rb").first
|
|
32
|
+
File.open(sorcery_core_file, "w+") do |f|
|
|
33
|
+
f.write("class SorceryCore < ActiveRecord::Migration[6.1]
|
|
34
|
+
def change
|
|
35
|
+
#{(already_email ? '' : 'add_column :users, :email, :string')}
|
|
36
|
+
add_column :users, :crypted_password, :string
|
|
37
|
+
add_column :users, :salt, :string
|
|
38
|
+
|
|
39
|
+
#{(already_email ? '' : 'add_index :users, :email, unique: true')}
|
|
40
|
+
end
|
|
41
|
+
end")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Generate mailer
|
|
46
|
+
copy_file("app/mailers/user_mailer.rb")
|
|
47
|
+
|
|
48
|
+
# Install controllers
|
|
49
|
+
copy_file("app/controllers/user_sessions_controller.rb")
|
|
50
|
+
|
|
51
|
+
# ===== Controller
|
|
52
|
+
inject_into_file("app/controllers/users_controller.rb",
|
|
53
|
+
"\n
|
|
54
|
+
skip_before_action :require_login, only: [:new, :create, :activate]
|
|
55
|
+
\n", after: "< BeautifulController")
|
|
56
|
+
|
|
57
|
+
inject_into_file("app/controllers/users_controller.rb",
|
|
58
|
+
"def activate
|
|
59
|
+
if @user = User.load_from_activation_token(params[:id])
|
|
60
|
+
@user.activate!
|
|
61
|
+
redirect_to(login_path, :notice => 'User was successfully activated.')
|
|
62
|
+
else
|
|
63
|
+
not_authenticated
|
|
64
|
+
end
|
|
65
|
+
end\n\n ", before: "private")
|
|
66
|
+
|
|
67
|
+
# ====== Model
|
|
68
|
+
# Add password & password_confirmation in model
|
|
69
|
+
inject_into_file("app/models/user.rb",
|
|
70
|
+
"\n
|
|
71
|
+
validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
|
|
72
|
+
validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
|
|
73
|
+
validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }
|
|
74
|
+
|
|
75
|
+
before_update :setup_activation, if: -> { email_changed? }
|
|
76
|
+
after_update :send_activation_needed_email!, if: -> { previous_changes['email'].present? }\n",
|
|
77
|
+
after: "ApplicationRecord")
|
|
78
|
+
|
|
79
|
+
inject_into_file("app/models/user.rb", ":password,:password_confirmation,", :after => "def self.permitted_attributes\n return ")
|
|
80
|
+
|
|
81
|
+
# ====== Views
|
|
82
|
+
inject_into_file("app/views/users/_form.html.erb",
|
|
83
|
+
' <div class="form-group">
|
|
84
|
+
<%= f.label :password, t(\'app.models.user.bs_attributes.password\', :default => \'password\').capitalize, :class => "control-label" %><br />
|
|
85
|
+
<%= f.password_field :password, :class => "form-control" %>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="form-group">
|
|
88
|
+
<%= f.label :password_confirmation, t(\'app.models.user.bs_attributes.password_confirmation\', :default => \'password_confirmation\').capitalize, :class => "control-label" %><br />
|
|
89
|
+
<%= f.password_field :password_confirmation, :class => "form-control" %>
|
|
90
|
+
</div>', before: '<!-- Beautiful_scaffold - AddField - Do not remove -->')
|
|
91
|
+
|
|
92
|
+
# Install all views for login/logout
|
|
93
|
+
directory "app/views/login_logout", "app/views"
|
|
94
|
+
|
|
95
|
+
# Domain in action_mailer
|
|
96
|
+
for current_env in ['production', 'development', 'test']
|
|
97
|
+
inject_into_file("config/environments/#{current_env}.rb", " config.action_mailer.default_url_options = { :host => 'localhost:3000' }", :after => "Rails.application.configure do\n" )
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# In model
|
|
101
|
+
#remove_file("app/models/user.rb") # remove generated by sorcery
|
|
102
|
+
#copy_file("app/models/user.rb") # copy BS version ;)
|
|
103
|
+
|
|
104
|
+
# Limited access
|
|
105
|
+
inject_into_file("app/controllers/beautiful_controller.rb",
|
|
106
|
+
"\n before_action :require_login, except: [:dashboard]\n",
|
|
107
|
+
:after => 'layout "beautiful_layout"' + "\n")
|
|
108
|
+
|
|
109
|
+
inject_into_file("config/initializers/sorcery.rb",
|
|
110
|
+
"\nuser.user_activation_mailer = UserMailer\n",
|
|
111
|
+
:after => "# user.user_activation_mailer =\n")
|
|
112
|
+
|
|
113
|
+
# Routes (session)
|
|
114
|
+
inject_into_file("config/routes.rb",
|
|
115
|
+
'
|
|
116
|
+
resources :user_sessions, only: [:create]
|
|
117
|
+
get "login" => "user_sessions#new", :as => :login
|
|
118
|
+
post "logout" => "user_sessions#destroy", :as => :logout' + "\n\n\n",
|
|
119
|
+
:after => "Rails.application.routes.draw do\n")
|
|
120
|
+
|
|
121
|
+
# Activate
|
|
122
|
+
inject_into_file("config/routes.rb", " do
|
|
123
|
+
member do
|
|
124
|
+
get :activate
|
|
125
|
+
end
|
|
126
|
+
end", after: 'resources :users, concerns: :bs_routes')
|
|
127
|
+
|
|
128
|
+
copy_file("#{view_path}partials/_login_logout_register.html.erb", "#{view_path}layouts/_login_logout_register.html.erb")
|
|
129
|
+
|
|
130
|
+
# Sign in sign out
|
|
131
|
+
inject_into_file("#{view_path}layouts/beautiful_layout.html.erb",
|
|
132
|
+
"\n<%= render :partial => 'layouts/login_logout_register' %>\n",
|
|
133
|
+
:after => "<!-- Beautiful_scaffold - Signin - Do not remove -->")
|
|
134
|
+
|
|
135
|
+
say "Beautiful-Scaffold enable 'user_activation' sorcery module for you, so when you sign up, find in logs the activation link. You can't sign in yourself until you activate the account"
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# encoding : utf-8
|
|
2
|
+
class BeautifulStorageGenerator < Rails::Generators::Base
|
|
3
|
+
require_relative 'beautiful_scaffold_common_methods'
|
|
4
|
+
include BeautifulScaffoldCommonMethods
|
|
5
|
+
|
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
+
|
|
8
|
+
# TODO voir pour engine
|
|
9
|
+
|
|
10
|
+
argument :model, :type => :string, :desc => "Name of model (ex: user)"
|
|
11
|
+
argument :storage_name, :type => :string, :desc => "Storage's name (ex: picture_file)"
|
|
12
|
+
|
|
13
|
+
class_option :mountable_engine, default: nil
|
|
14
|
+
|
|
15
|
+
def install_storage
|
|
16
|
+
|
|
17
|
+
#if !File.read('Gemfile').include?("image_processing")
|
|
18
|
+
gem("image_processing", '~> 1.2')
|
|
19
|
+
#end
|
|
20
|
+
|
|
21
|
+
Bundler.with_unbundled_env do
|
|
22
|
+
run "bundle install"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Install activestorage
|
|
26
|
+
run "bin/rails active_storage:install"
|
|
27
|
+
#run "rake db:migrate"
|
|
28
|
+
|
|
29
|
+
raise "Model must be specified" if model.blank?
|
|
30
|
+
raise "Attachment must be specified" if storage_name.blank?
|
|
31
|
+
|
|
32
|
+
# ===== Model
|
|
33
|
+
inject_into_file("app/models/#{engine_name}#{model}.rb",
|
|
34
|
+
"\n
|
|
35
|
+
has_one_attached :#{storage_name}
|
|
36
|
+
\n", after: "< ApplicationRecord")
|
|
37
|
+
inject_into_file("app/models/#{engine_name}#{model}.rb", ":#{storage_name},", :after => "def self.permitted_attributes\n return ")
|
|
38
|
+
|
|
39
|
+
# ====== Views
|
|
40
|
+
inject_into_file("app/views/#{engine_name}#{model_pluralize}/_form.html.erb",
|
|
41
|
+
" <div class='form-group'>
|
|
42
|
+
<%= f.label :#{storage_name}, t('app.models.#{model}.bs_attributes.#{storage_name}', :default => '#{storage_name}').capitalize, :class => 'control-label' %><br />
|
|
43
|
+
<%= f.file_field :#{storage_name}, direct_upload: true, :class => 'form-control' %>
|
|
44
|
+
</div>\n", before: '<!-- Beautiful_scaffold - AddField - Do not remove -->')
|
|
45
|
+
|
|
46
|
+
inject_into_file("app/views/#{engine_name}#{model_pluralize}/_form.html.erb",
|
|
47
|
+
", multipart: true", after: "form_for(@#{model}")
|
|
48
|
+
|
|
49
|
+
inject_into_file("app/views/#{engine_name}#{model_pluralize}/show.html.erb",
|
|
50
|
+
"<p><b><%= t('app.models.#{model}.bs_attributes.#{storage_name}', :default => '#{storage_name}') %>:</b><br><%= image_tag @#{model}.#{storage_name}.variant(resize_to_limit: [100, 100]) %></p>",
|
|
51
|
+
before: "<!-- Beautiful_scaffold - AddField - Field - Do not remove -->")
|
|
52
|
+
|
|
53
|
+
# Controller
|
|
54
|
+
#inject_into_file("app/controllers/#{engine_name}#{model_pluralize}_controller.rb",
|
|
55
|
+
# "\n before_action :require_login, except: [:dashboard]\n",
|
|
56
|
+
# :after => 'layout "beautiful_layout"' + "\n")
|
|
57
|
+
|
|
58
|
+
say "You must run 'rake db:migrate' to create activestorage migrations !"
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class UserSessionsController < BeautifulController
|
|
2
|
+
|
|
3
|
+
skip_before_action :require_login, only: [:new, :create]
|
|
4
|
+
|
|
5
|
+
def create
|
|
6
|
+
@user = login(params[:email], params[:password])
|
|
7
|
+
|
|
8
|
+
if @user
|
|
9
|
+
redirect_back_or_to(:users, notice: 'Login successful')
|
|
10
|
+
else
|
|
11
|
+
flash.now[:alert] = 'Login failed'
|
|
12
|
+
render action: 'new'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def destroy
|
|
17
|
+
logout
|
|
18
|
+
redirect_to(:users, notice: 'Logged out!')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -47,3 +47,11 @@ en:
|
|
|
47
47
|
register: "Register"
|
|
48
48
|
search_and_filter: "Search and filter"
|
|
49
49
|
more_options: "More options..."
|
|
50
|
+
edit_profile: "edit profile"
|
|
51
|
+
logout: "Logout"
|
|
52
|
+
register: "Register"
|
|
53
|
+
login: "Login"
|
|
54
|
+
logged_out: "Logged out"
|
|
55
|
+
login_failed: "Login failed"
|
|
56
|
+
login_successful: "Login successful"
|
|
57
|
+
crypted_password: "Crypted password"
|
|
@@ -46,4 +46,12 @@ fr:
|
|
|
46
46
|
send_me_reset_password_instructions: "Me ré-envoyer les instructions de réinitialisation du mot de passe"
|
|
47
47
|
register: "Inscription"
|
|
48
48
|
search_and_filter: "Option de filtre"
|
|
49
|
-
more_options: "Plus d'options..."
|
|
49
|
+
more_options: "Plus d'options..."
|
|
50
|
+
edit_profile: "Editer mon profil"
|
|
51
|
+
logout: "Déconnexion"
|
|
52
|
+
register: "S'incrire"
|
|
53
|
+
login: "S'identifier"
|
|
54
|
+
logged_out: "déconnecté"
|
|
55
|
+
login_failed: "Erreur d'identification"
|
|
56
|
+
login_successful: "Identification réussie"
|
|
57
|
+
crypted_password: "Crypted password"
|
|
@@ -15,7 +15,7 @@ ja:
|
|
|
15
15
|
cancel: "キャンセル"
|
|
16
16
|
export: "エクスポート"
|
|
17
17
|
search: "検索"
|
|
18
|
-
sort: "
|
|
18
|
+
sort: "トライ"
|
|
19
19
|
download: "ダウンロード"
|
|
20
20
|
"yes": "はい"
|
|
21
21
|
"no": "いいえ"
|
|
@@ -47,4 +47,11 @@ ja:
|
|
|
47
47
|
register: "登録"
|
|
48
48
|
search_and_filter: "検索条件"
|
|
49
49
|
more_options: "追加オプション..."
|
|
50
|
-
|
|
50
|
+
edit_profile: "プロファイル編集"
|
|
51
|
+
logout: "ログアウト"
|
|
52
|
+
register: "登録"
|
|
53
|
+
login: "ログイン"
|
|
54
|
+
logged_out: "ログアウトしました"
|
|
55
|
+
login_failed: "ログインに失敗しました"
|
|
56
|
+
login_successful: "ログイン成功"
|
|
57
|
+
crypted_password: "暗号化されたパスワード"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class UserMailer < ApplicationMailer
|
|
2
|
+
def activation_needed_email(user)
|
|
3
|
+
@user = user
|
|
4
|
+
@url = activate_user_url(@user.activation_token)
|
|
5
|
+
mail(to: user.email, subject: 'Welcome to My Awesome Site')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def activation_success_email(user)
|
|
9
|
+
@user = user
|
|
10
|
+
@url = login_url
|
|
11
|
+
mail(to: user.email, subject: 'Your account is now activated')
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Ability
|
|
4
|
+
include CanCan::Ability
|
|
5
|
+
|
|
6
|
+
def initialize(user)
|
|
7
|
+
if !user.nil?
|
|
8
|
+
if user.id == 1
|
|
9
|
+
can :manage, :all
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
# Define abilities for the passed in user here. For example:
|
|
13
|
+
#
|
|
14
|
+
# user ||= User.new # guest user (not logged in)
|
|
15
|
+
# if user.admin?
|
|
16
|
+
# can :manage, :all
|
|
17
|
+
# else
|
|
18
|
+
# can :read, :all
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# The first argument to `can` is the action you are giving the user
|
|
22
|
+
# permission to do.
|
|
23
|
+
# If you pass :manage it will apply to every action. Other common actions
|
|
24
|
+
# here are :read, :create, :update and :destroy.
|
|
25
|
+
#
|
|
26
|
+
# The second argument is the resource the user can perform the action on.
|
|
27
|
+
# If you pass :all it will apply to every resource. Otherwise pass a Ruby
|
|
28
|
+
# class of the resource.
|
|
29
|
+
#
|
|
30
|
+
# The third argument is an optional hash of conditions to further filter the
|
|
31
|
+
# objects.
|
|
32
|
+
# For example, here the user can only update published articles.
|
|
33
|
+
#
|
|
34
|
+
# can :update, Article, :published => true
|
|
35
|
+
#
|
|
36
|
+
# See the wiki for details:
|
|
37
|
+
# https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -3,6 +3,6 @@ module CaptionConcern
|
|
|
3
3
|
|
|
4
4
|
# You can OVERRIDE this method used in model form and search form (in belongs_to relation)
|
|
5
5
|
def caption
|
|
6
|
-
(self["name"] || self["label"] || self["description"] || "##{id}")
|
|
6
|
+
(self["name"] || self["label"] || self["description"] || self["email"] || "##{id}")
|
|
7
7
|
end
|
|
8
8
|
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class User < ApplicationRecord
|
|
2
|
+
authenticates_with_sorcery!
|
|
3
|
+
|
|
4
|
+
validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
|
|
5
|
+
validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
|
|
6
|
+
validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }
|
|
7
|
+
|
|
8
|
+
before_update :setup_activation, if: -> { email_changed? }
|
|
9
|
+
after_update :send_activation_needed_email!, if: -> { previous_changes["email"].present? }
|
|
10
|
+
|
|
11
|
+
end
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
</div>
|
|
31
31
|
<div class="navbar-collapse collapse">
|
|
32
32
|
<nav class="nav navbar-nav">
|
|
33
|
-
<a href="/" class="nav-link">Home</a
|
|
33
|
+
<a href="/" class="nav-link">Home</a>
|
|
34
34
|
<%%= render :partial => "layouts/beautiful_menu" %>
|
|
35
|
+
<!-- Beautiful_scaffold - Signin - Do not remove -->
|
|
35
36
|
</nav>
|
|
36
37
|
<i class="fa fa-question-circle text-white float-right" id="bs-help"></i>
|
|
37
|
-
<!-- Beautiful_scaffold - Signin - Do not remove -->
|
|
38
38
|
</div>
|
|
39
39
|
</div>
|
|
40
40
|
<div class="container-fluid">
|
|
@@ -47,6 +47,13 @@
|
|
|
47
47
|
<%%= flash[:notice] %>
|
|
48
48
|
</div>
|
|
49
49
|
<%% end %>
|
|
50
|
+
<%% if !flash[:alert].blank? %>
|
|
51
|
+
<div class="alert alert-warning">
|
|
52
|
+
<a class="close" data-dismiss="alert" href="#">×</a>
|
|
53
|
+
<h4 class="alert-heading">Warning : </h4>
|
|
54
|
+
<%%= flash[:alert] %>
|
|
55
|
+
</div>
|
|
56
|
+
<%% end %>
|
|
50
57
|
<%% if !flash[:error].blank? %>
|
|
51
58
|
<div class="alert alert-danger">
|
|
52
59
|
<a class="close" data-dismiss="alert" href="#">×</a>
|
data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.html.erb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
|
5
|
+
</head>
|
|
6
|
+
<body>
|
|
7
|
+
<h1> Welcome <%= @user.email %> </h1>
|
|
8
|
+
<p>
|
|
9
|
+
You have successfully signed up to www.example.com, and your username is: <%= @user.email %>.
|
|
10
|
+
</p>
|
|
11
|
+
<p>
|
|
12
|
+
To login to the site, just follow this link: <%= @url %> .
|
|
13
|
+
</p>
|
|
14
|
+
<p>Thanks for joining and have a great day!</p>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.text.erb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Welcome to example.com, <%= @user.email %>
|
|
2
|
+
===============================================
|
|
3
|
+
|
|
4
|
+
You have successfully signed up to example.com,
|
|
5
|
+
your username is: <%= @user.email %>.
|
|
6
|
+
|
|
7
|
+
To login to the site, just follow this link: <%= @url %> .
|
|
8
|
+
|
|
9
|
+
Thanks for joining and have a great day!
|
data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.html.erb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
|
5
|
+
</head>
|
|
6
|
+
<body>
|
|
7
|
+
<h1>Bienvenue <%= @user.email %> </h1>
|
|
8
|
+
<p>
|
|
9
|
+
Vous vous êtes inscrit à www.example.com, votre identifiant est : <%= @user.email %>.
|
|
10
|
+
</p>
|
|
11
|
+
<p>
|
|
12
|
+
Pour activer votre compte, veuillez cliquer sur ce lien : <%= @url %> .
|
|
13
|
+
</p>
|
|
14
|
+
<p>Merci d'avoir créé votre compte, bonne journée !</p>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
data/lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.text.erb
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Bienvenue, <%= @user.email %>
|
|
2
|
+
===============================================
|
|
3
|
+
|
|
4
|
+
Vous vous êtes inscrit à www.example.com, votre identifiant est : <%= @user.email %>.
|
|
5
|
+
|
|
6
|
+
Pour activer votre compte, veuillez cliquer sur ce lien : <%= @url %> .
|
|
7
|
+
|
|
8
|
+
Merci d'avoir créé votre compte, bonne journée !
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
|
5
|
+
</head>
|
|
6
|
+
<body>
|
|
7
|
+
<h1>Congratulations, <%= @user.email %>!</h1>
|
|
8
|
+
<p>
|
|
9
|
+
You have successfully activated your example.com account,
|
|
10
|
+
your username is: <%= @user.email %>.
|
|
11
|
+
</p>
|
|
12
|
+
<p>
|
|
13
|
+
To login to the site, just follow this link: <%= @url %>.
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
Thanks for joining and have a great day!
|
|
17
|
+
</p>
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
|
5
|
+
</head>
|
|
6
|
+
<body>
|
|
7
|
+
<h1>Félicitations <%= @user.email %>!</h1>
|
|
8
|
+
<p>
|
|
9
|
+
Vous avez activé votre compte sur www.example.com avec succès,
|
|
10
|
+
Votre identifiant est : <%= @user.email %>.
|
|
11
|
+
</p>
|
|
12
|
+
<p>
|
|
13
|
+
Pour ce connecter sur le site, veuillez suivre ce lien : <%= @url %>.
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
Merci de vous être inscrit, bonne journée !
|
|
17
|
+
</p>
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Félicitations <%= @user.email %>!
|
|
2
|
+
|
|
3
|
+
Vous avez activé votre compte sur www.example.com avec succès,
|
|
4
|
+
Votre identifiant est : <%= @user.email %>.
|
|
5
|
+
|
|
6
|
+
Pour ce connecter sur le site, veuillez suivre ce lien : <%= @url %>.
|
|
7
|
+
|
|
8
|
+
Merci de vous être inscrit, bonne journée !
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<%= form_with url: user_sessions_path, method: :post do |f| %>
|
|
2
|
+
<div class="form-group">
|
|
3
|
+
<%= f.label :email, :class => "control-label" %><br />
|
|
4
|
+
<%= f.text_field :email, :class => "form-control" %>
|
|
5
|
+
</div>
|
|
6
|
+
<div class="form-group">
|
|
7
|
+
<%= f.label :password, :class => "control-label" %><br />
|
|
8
|
+
<%= f.password_field :password, :class => "form-control" %>
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<%= link_to t(:back, :default => 'Back'), users_path, :class => "btn btn-light" %>
|
|
12
|
+
<%= f.submit :class => "btn btn-primary", :data => { :disable_with => t(:saving, :default => "Saving...") } %>
|
|
13
|
+
</div>
|
|
14
|
+
<% end %>
|
|
15
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<% if current_user %>
|
|
2
|
+
<%= link_to "Edit Profile", edit_user_path(current_user.id), class: "nav-link" %>
|
|
3
|
+
<%= link_to "Logout", :logout, method: :post, class: "nav-link" %>
|
|
4
|
+
<% else %>
|
|
5
|
+
<%= link_to "Register", new_user_path, class: "nav-link" %>
|
|
6
|
+
<%= link_to "Login", :login, class: "nav-link" %>
|
|
7
|
+
<% end %>
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: beautiful_scaffold
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sylvain Claudel
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-02-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: Beautiful Scaffold generate a complete scaffold (sort, export, paginate
|
|
14
14
|
and filter data) http://beautiful-scaffold.rivsc.ovh
|
|
@@ -27,12 +27,14 @@ files:
|
|
|
27
27
|
- beautiful_scaffold.gemspec
|
|
28
28
|
- lib/beautiful_scaffold/version.rb
|
|
29
29
|
- lib/generators/USAGE
|
|
30
|
-
- lib/generators/
|
|
30
|
+
- lib/generators/beautiful_cancancan_generator.rb
|
|
31
31
|
- lib/generators/beautiful_jointable_generator.rb
|
|
32
32
|
- lib/generators/beautiful_locale_generator.rb
|
|
33
33
|
- lib/generators/beautiful_migration_generator.rb
|
|
34
34
|
- lib/generators/beautiful_scaffold_common_methods.rb
|
|
35
35
|
- lib/generators/beautiful_scaffold_generator.rb
|
|
36
|
+
- lib/generators/beautiful_sorcery_generator.rb
|
|
37
|
+
- lib/generators/beautiful_storage_generator.rb
|
|
36
38
|
- lib/generators/templates/app/assets/images/alpha.png
|
|
37
39
|
- lib/generators/templates/app/assets/images/hue.png
|
|
38
40
|
- lib/generators/templates/app/assets/images/saturation.png
|
|
@@ -65,6 +67,7 @@ files:
|
|
|
65
67
|
- lib/generators/templates/app/controllers/base.rb
|
|
66
68
|
- lib/generators/templates/app/controllers/master_base.rb
|
|
67
69
|
- lib/generators/templates/app/controllers/registrations_controller.rb
|
|
70
|
+
- lib/generators/templates/app/controllers/user_sessions_controller.rb
|
|
68
71
|
- lib/generators/templates/app/helpers/beautiful_helper.rb
|
|
69
72
|
- lib/generators/templates/app/helpers/model_helper.rb
|
|
70
73
|
- lib/generators/templates/app/initializers/link_renderer.rb
|
|
@@ -72,10 +75,13 @@ files:
|
|
|
72
75
|
- lib/generators/templates/app/locales/beautiful_scaffold.en.yml
|
|
73
76
|
- lib/generators/templates/app/locales/beautiful_scaffold.fr.yml
|
|
74
77
|
- lib/generators/templates/app/locales/beautiful_scaffold.ja.yml
|
|
78
|
+
- lib/generators/templates/app/mailers/user_mailer.rb
|
|
79
|
+
- lib/generators/templates/app/models/ability.rb
|
|
75
80
|
- lib/generators/templates/app/models/concerns/caption_concern.rb
|
|
76
81
|
- lib/generators/templates/app/models/concerns/default_sorting_concern.rb
|
|
77
82
|
- lib/generators/templates/app/models/concerns/fulltext_concern.rb
|
|
78
83
|
- lib/generators/templates/app/models/pdf_report.rb
|
|
84
|
+
- lib/generators/templates/app/models/user.rb
|
|
79
85
|
- lib/generators/templates/app/views/_beautiful_menu.html.erb
|
|
80
86
|
- lib/generators/templates/app/views/_form.html.erb
|
|
81
87
|
- lib/generators/templates/app/views/_form_habtm_tag.html.erb
|
|
@@ -85,6 +91,16 @@ files:
|
|
|
85
91
|
- lib/generators/templates/app/views/edit.html.erb
|
|
86
92
|
- lib/generators/templates/app/views/index.html.erb
|
|
87
93
|
- lib/generators/templates/app/views/layout.html.erb
|
|
94
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.html.erb
|
|
95
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.en.text.erb
|
|
96
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.html.erb
|
|
97
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_needed_email.fr.text.erb
|
|
98
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.html.erb
|
|
99
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.en.text.erb
|
|
100
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.html.erb
|
|
101
|
+
- lib/generators/templates/app/views/login_logout/user_mailer/activation_success_email.fr.text.erb
|
|
102
|
+
- lib/generators/templates/app/views/login_logout/user_sessions/_form.html.erb
|
|
103
|
+
- lib/generators/templates/app/views/login_logout/user_sessions/new.html.erb
|
|
88
104
|
- lib/generators/templates/app/views/new.html.erb
|
|
89
105
|
- lib/generators/templates/app/views/partials/_forget_password.html.erb
|
|
90
106
|
- lib/generators/templates/app/views/partials/_form_field.html.erb
|
|
@@ -93,13 +109,10 @@ files:
|
|
|
93
109
|
- lib/generators/templates/app/views/partials/_index_header.html.erb
|
|
94
110
|
- lib/generators/templates/app/views/partials/_index_search.html.erb
|
|
95
111
|
- lib/generators/templates/app/views/partials/_index_search_default_fields.html.erb
|
|
96
|
-
- lib/generators/templates/app/views/partials/
|
|
112
|
+
- lib/generators/templates/app/views/partials/_login_logout_register.html.erb
|
|
97
113
|
- lib/generators/templates/app/views/partials/_show_field.html.erb
|
|
98
|
-
- lib/generators/templates/app/views/partials/_sign_in_form.html.erb
|
|
99
|
-
- lib/generators/templates/app/views/partials/_sign_in_sign_out.html.erb
|
|
100
114
|
- lib/generators/templates/app/views/show.html.erb
|
|
101
115
|
- lib/generators/templates/app/views/treeview.html.erb
|
|
102
|
-
- lib/generators/templates/lib/custom_failure.rb
|
|
103
116
|
homepage: https://blog.rivsc.ovh
|
|
104
117
|
licenses:
|
|
105
118
|
- MIT
|
|
@@ -121,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
121
134
|
- !ruby/object:Gem::Version
|
|
122
135
|
version: '0'
|
|
123
136
|
requirements: []
|
|
124
|
-
rubygems_version: 3.1.
|
|
137
|
+
rubygems_version: 3.1.4
|
|
125
138
|
signing_key:
|
|
126
139
|
specification_version: 4
|
|
127
140
|
summary: Beautiful Scaffold generate fully customizable scaffold
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
# encoding : utf-8
|
|
2
|
-
class BeautifulDevisecancanGenerator < Rails::Generators::Base
|
|
3
|
-
require_relative 'beautiful_scaffold_common_methods'
|
|
4
|
-
include BeautifulScaffoldCommonMethods
|
|
5
|
-
|
|
6
|
-
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
-
|
|
8
|
-
argument :model, :type => :string, :desc => "Name of model (downcase singular)"
|
|
9
|
-
|
|
10
|
-
def install_devise
|
|
11
|
-
view_path = "app/views/"
|
|
12
|
-
|
|
13
|
-
gem("devise", "2.1.0")
|
|
14
|
-
|
|
15
|
-
inside Rails.root do
|
|
16
|
-
run "bundle install"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
generate("devise:install")
|
|
20
|
-
|
|
21
|
-
for current_env in ['production', 'development', 'test']
|
|
22
|
-
inject_into_file("config/environments/#{current_env}.rb", " config.action_mailer.default_url_options = { :host => 'localhost:3000' }", :after => "::Application.configure do\n" )
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Install devise in the model
|
|
26
|
-
generate("devise", model)
|
|
27
|
-
|
|
28
|
-
# Add :token_authenticatable and :lockable
|
|
29
|
-
# In model
|
|
30
|
-
inject_into_file( "app/models/#{model}.rb",
|
|
31
|
-
":token_authenticatable, :lockable,",
|
|
32
|
-
:after => "devise ")
|
|
33
|
-
# In migration
|
|
34
|
-
filename = Dir.glob("db/migrate/*_add_devise_to_#{model.pluralize}.rb")[0]
|
|
35
|
-
gsub_file filename, /#\s*(t\.integer\s+:failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts)/, '\1'
|
|
36
|
-
gsub_file filename, /#\s*(t\.string\s+:unlock_token # Only if unlock strategy is :email or :both)/, '\1'
|
|
37
|
-
gsub_file filename, /#\s*(t\.datetime\s+:locked_at)/, '\1'
|
|
38
|
-
gsub_file filename, /#\s*(t\.string\s+:authentication_token)/, '\1'
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# Limited access (Must be commented if use cancan)
|
|
42
|
-
inject_into_file("app/controllers/beautiful_controller.rb","before_action :authenticate_#{model}!, :except => [:dashboard]", :after => 'layout "beautiful_layout"' + "\n")
|
|
43
|
-
|
|
44
|
-
# Custom redirect
|
|
45
|
-
inject_into_file("app/controllers/application_controller.rb","
|
|
46
|
-
def after_sign_out_path_for(resource_or_scope)
|
|
47
|
-
root_path
|
|
48
|
-
end
|
|
49
|
-
def after_sign_in_path_for(resource)
|
|
50
|
-
root_path
|
|
51
|
-
end
|
|
52
|
-
def after_sign_up_path_for(resource)
|
|
53
|
-
root_path
|
|
54
|
-
end
|
|
55
|
-
", :after => "protect_from_forgery\n")
|
|
56
|
-
copy_file("lib/custom_failure.rb")
|
|
57
|
-
copy_file("app/controllers/registrations_controller.rb")
|
|
58
|
-
inject_into_file("config/initializers/devise.rb","
|
|
59
|
-
config.warden do |manager|
|
|
60
|
-
manager.failure_app = CustomFailure
|
|
61
|
-
end
|
|
62
|
-
", :after => "Devise.setup do |config|\n")
|
|
63
|
-
inject_into_file("config/application.rb",' #{config.root}/lib', :after => '#{config.root}/app/modules')
|
|
64
|
-
|
|
65
|
-
# Use my register controller
|
|
66
|
-
inject_into_file("config/routes.rb",
|
|
67
|
-
', :controllers => {:registrations => "registrations"}',
|
|
68
|
-
:after => "devise_for :#{model.pluralize}")
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# Install partials dans layout (forget password, sign_in)
|
|
72
|
-
template("#{view_path}partials/_forget_password.html.erb", "#{view_path}layouts/_forget_password.html.erb")
|
|
73
|
-
template("#{view_path}partials/_sign_in_sign_out.html.erb", "#{view_path}layouts/_sign_in_sign_out.html.erb")
|
|
74
|
-
template("#{view_path}partials/_sign_in_form.html.erb", "#{view_path}layouts/_sign_in_form.html.erb")
|
|
75
|
-
template("#{view_path}partials/_register_form.html.erb", "#{view_path}layouts/_register_form.html.erb")
|
|
76
|
-
|
|
77
|
-
# Sign in sign out
|
|
78
|
-
inject_into_file("#{view_path}layouts/beautiful_layout.html.erb",
|
|
79
|
-
"<%= render :partial => 'layouts/sign_in_sign_out' %>",
|
|
80
|
-
:after => "<!-- Beautiful_scaffold - Signin - Do not remove -->\n")
|
|
81
|
-
|
|
82
|
-
# Modal (forget password)
|
|
83
|
-
inject_into_file("#{view_path}layouts/beautiful_layout.html.erb",
|
|
84
|
-
" <%= render :partial => 'layouts/forget_password' %>",
|
|
85
|
-
:after => "<!-- Beautiful_scaffold - Modal - Do not remove -->\n")
|
|
86
|
-
inject_into_file("#{view_path}layouts/beautiful_layout.html.erb",
|
|
87
|
-
" <%= render :partial => 'layouts/register_form' %>",
|
|
88
|
-
:after => "<!-- Beautiful_scaffold - Modal - Do not remove -->\n")
|
|
89
|
-
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def install_cancan
|
|
93
|
-
gem("cancan")
|
|
94
|
-
|
|
95
|
-
inside Rails.root do
|
|
96
|
-
run "bundle install"
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
generate("cancan:ability")
|
|
100
|
-
|
|
101
|
-
inject_into_file("app/models/ability.rb", "
|
|
102
|
-
if not user.nil? then
|
|
103
|
-
if user.id == 1 then
|
|
104
|
-
can :manage, :all
|
|
105
|
-
end
|
|
106
|
-
end\n", :after => "def initialize(user)\n")
|
|
107
|
-
|
|
108
|
-
# current_user method need for CanCan
|
|
109
|
-
current_user_method = ""
|
|
110
|
-
if model != "user" then
|
|
111
|
-
current_user_method = "
|
|
112
|
-
def current_user
|
|
113
|
-
current_#{model}
|
|
114
|
-
end"
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Exception for AccessDenied
|
|
118
|
-
inject_into_file("app/controllers/application_controller.rb", "
|
|
119
|
-
rescue_from CanCan::AccessDenied do |exception|
|
|
120
|
-
redirect_to root_url, :alert => exception.message
|
|
121
|
-
end
|
|
122
|
-
#{current_user_method}
|
|
123
|
-
", :after => "class ApplicationController < ActionController::Base\n")
|
|
124
|
-
|
|
125
|
-
# Access controlled by CanCan (in beautiful_scaffold)
|
|
126
|
-
inject_into_file("app/controllers/application_controller.rb", "#", :before => "before_action :authenticate_#{model}!, :except => [:dashboard]")
|
|
127
|
-
end
|
|
128
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<div class="modal fade" id="modal-register-form">
|
|
3
|
-
<div class="modal-dialog">
|
|
4
|
-
<div class="modal-content">
|
|
5
|
-
<div class="modal-header">
|
|
6
|
-
<h5 class="modal-title"><%%= t(:register, :default => "Register") %></h5>
|
|
7
|
-
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="modal-body">
|
|
10
|
-
<%% resource ||= <%= model.camelize %>.new %>
|
|
11
|
-
<%%= form_for(resource, :as => '<%= model %>', :url => registration_path('<%= model %>'), :html => { :class => "form-horizontal" }) do |f| %>
|
|
12
|
-
<%% begin %>
|
|
13
|
-
<%%= devise_error_messages! %>
|
|
14
|
-
<%% rescue %>
|
|
15
|
-
<%% end %>
|
|
16
|
-
<div class="form-group">
|
|
17
|
-
<%%= f.label :email, t(:email, :default => "Email"), :class => "control-label" %>
|
|
18
|
-
<div>
|
|
19
|
-
<%%= f.email_field :email %>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
<div class="form-group">
|
|
23
|
-
<%%= f.label :password, t(:password, :default => "Password"), :class => "control-label" %>
|
|
24
|
-
<div>
|
|
25
|
-
<%%= f.password_field :password %>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
<div class="form-group">
|
|
29
|
-
<%%= f.label :password_confirmation, t(:password_confirmation, :default => "Password confirmation"), :class => "control-label" %>
|
|
30
|
-
<div>
|
|
31
|
-
<%%= f.password_field :password_confirmation %>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
|
|
35
|
-
<div class="form-group">
|
|
36
|
-
<div>
|
|
37
|
-
<%%= f.submit t(:sign_up, :default => "Sign up"), :class => 'btn btn-light' %>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
<%% end %>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<div style="padding:10px;">
|
|
2
|
-
<%%= form_for("<%= model %>", :url => <%= model %>_session_path, :html => { :class => "form-horizontal" }) do |f| %>
|
|
3
|
-
<div class="form-group">
|
|
4
|
-
<%%= f.text_field :email, :placeholder => t(:email, :default => "Email") %>
|
|
5
|
-
</div>
|
|
6
|
-
<div class="form-group">
|
|
7
|
-
<%%= f.password_field :password, :placeholder => t(:password, :default => "Password") %>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="form-group">
|
|
10
|
-
<label for="<%= model %>_remember_me">
|
|
11
|
-
<%%= f.check_box :remember_me %> <%%= t(:remember_me, :default => "Remember me") %>
|
|
12
|
-
</label>
|
|
13
|
-
</div>
|
|
14
|
-
<%%= f.submit t(:sign_in, :default => "Sign in"), :class => "btn btn-light" %>
|
|
15
|
-
<%% end %>
|
|
16
|
-
<a data-toggle="modal" href="#modal-forget-password"><%%= t(:forgot_your_password, :default => "Forgot your password?") %></a>
|
|
17
|
-
<a data-toggle="modal" href="#modal-register-form"><%%= t(:register, :default => "Register") %></a>
|
|
18
|
-
</div>
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
<%% if <%= model %>_signed_in? %>
|
|
2
|
-
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
|
3
|
-
<i class="icon-user"></i> <%%= current_<%= model %>.caption %>
|
|
4
|
-
<span class="caret"></span>
|
|
5
|
-
</a>
|
|
6
|
-
<ul class="dropdown-menu">
|
|
7
|
-
<li><a href="#"><%%= t(:profile, :default => "Profile") %></a></li>
|
|
8
|
-
<li class="dropdown-divider"></li>
|
|
9
|
-
<li><%%= link_to t(:sign_out, :default => "Sign Out"), destroy_<%= model %>_session_path, :method => :delete %></li>
|
|
10
|
-
</ul>
|
|
11
|
-
<%% else %>
|
|
12
|
-
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
|
13
|
-
<i class="icon-user"></i> <%%= t(:login, :default => "Login") %>
|
|
14
|
-
<span class="caret"></span>
|
|
15
|
-
</a>
|
|
16
|
-
<ul class="dropdown-menu">
|
|
17
|
-
<li><%%= render :partial => "layouts/sign_in_form" %></li>
|
|
18
|
-
</ul>
|
|
19
|
-
<%% end %>
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
class CustomFailure < Devise::FailureApp
|
|
2
|
-
def redirect_url
|
|
3
|
-
#return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope
|
|
4
|
-
root_path
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
# You need to override respond to eliminate recall
|
|
8
|
-
def respond
|
|
9
|
-
if http_auth?
|
|
10
|
-
http_auth
|
|
11
|
-
else
|
|
12
|
-
redirect
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|