kms 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +30 -0
  4. data/app/assets/fonts/casper-webfont.eot +0 -0
  5. data/app/assets/fonts/casper-webfont.svg +278 -0
  6. data/app/assets/fonts/casper-webfont.ttf +0 -0
  7. data/app/assets/fonts/casper-webfont.woff +0 -0
  8. data/app/assets/fonts/casper-webfont.woff2 +0 -0
  9. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  10. data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  11. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  12. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  13. data/app/assets/javascripts/kms/application.js +49 -0
  14. data/app/assets/javascripts/kms/application/controllers/assets_controller.coffee +70 -0
  15. data/app/assets/javascripts/kms/application/controllers/help_controller.coffee +12 -0
  16. data/app/assets/javascripts/kms/application/controllers/pages_controller.coffee +95 -0
  17. data/app/assets/javascripts/kms/application/controllers/settings_controller.coffee +21 -0
  18. data/app/assets/javascripts/kms/application/controllers/sidebar_controller.coffee +26 -0
  19. data/app/assets/javascripts/kms/application/controllers/snippets_controller.coffee +44 -0
  20. data/app/assets/javascripts/kms/application/controllers/templates_controller.coffee +46 -0
  21. data/app/assets/javascripts/kms/application/controllers/users_controller.coffee +31 -0
  22. data/app/assets/javascripts/kms/application/module.coffee +24 -0
  23. data/app/assets/javascripts/kms/application/routes.coffee.erb +171 -0
  24. data/app/assets/javascripts/kms/application/services/errors_service.coffee +8 -0
  25. data/app/assets/javascripts/templates/assets/edit.html.slim +10 -0
  26. data/app/assets/javascripts/templates/assets/index.html.slim +31 -0
  27. data/app/assets/javascripts/templates/assets/new.html.slim +16 -0
  28. data/app/assets/javascripts/templates/help.html.slim +172 -0
  29. data/app/assets/javascripts/templates/help/filters.html.slim +51 -0
  30. data/app/assets/javascripts/templates/help/variables.html.slim +96 -0
  31. data/app/assets/javascripts/templates/pages/edit.html.slim +7 -0
  32. data/app/assets/javascripts/templates/pages/form.html.slim +32 -0
  33. data/app/assets/javascripts/templates/pages/index.html.slim +33 -0
  34. data/app/assets/javascripts/templates/pages/new.html.slim +5 -0
  35. data/app/assets/javascripts/templates/settings.html.slim +20 -0
  36. data/app/assets/javascripts/templates/snippets/edit.html.slim +5 -0
  37. data/app/assets/javascripts/templates/snippets/form.html.slim +10 -0
  38. data/app/assets/javascripts/templates/snippets/index.html.slim +22 -0
  39. data/app/assets/javascripts/templates/snippets/new.html.slim +5 -0
  40. data/app/assets/javascripts/templates/templates/edit.html.slim +7 -0
  41. data/app/assets/javascripts/templates/templates/form.html.slim +7 -0
  42. data/app/assets/javascripts/templates/templates/index.html.slim +22 -0
  43. data/app/assets/javascripts/templates/templates/new.html.slim +5 -0
  44. data/app/assets/javascripts/templates/users/form.html.slim +14 -0
  45. data/app/assets/javascripts/templates/users/index.html.slim +21 -0
  46. data/app/assets/javascripts/templates/users/new.html.slim +5 -0
  47. data/app/assets/stylesheets/kms/application.css +57 -0
  48. data/app/assets/stylesheets/kms/custom.css.scss +67 -0
  49. data/app/assets/stylesheets/kms/responsive_dashboard.css.less +9 -0
  50. data/app/controllers/kms/application_controller.rb +24 -0
  51. data/app/controllers/kms/assets_controller.rb +58 -0
  52. data/app/controllers/kms/kms_controller.rb +8 -0
  53. data/app/controllers/kms/pages_controller.rb +67 -0
  54. data/app/controllers/kms/public/pages_controller.rb +27 -0
  55. data/app/controllers/kms/public/search_controller.rb +18 -0
  56. data/app/controllers/kms/resources_controller.rb +9 -0
  57. data/app/controllers/kms/settings_controller.rb +24 -0
  58. data/app/controllers/kms/snippets_controller.rb +37 -0
  59. data/app/controllers/kms/templates_controller.rb +43 -0
  60. data/app/controllers/kms/users_controller.rb +36 -0
  61. data/app/controllers/users/confirmations_controller.rb +28 -0
  62. data/app/controllers/users/omniauth_callbacks_controller.rb +28 -0
  63. data/app/controllers/users/passwords_controller.rb +32 -0
  64. data/app/controllers/users/registrations_controller.rb +70 -0
  65. data/app/controllers/users/sessions_controller.rb +25 -0
  66. data/app/controllers/users/unlocks_controller.rb +28 -0
  67. data/app/helpers/kms/application_helper.rb +4 -0
  68. data/app/models/ability.rb +38 -0
  69. data/app/models/concerns/kms/compile_templates.rb +39 -0
  70. data/app/models/concerns/kms/permalinkable.rb +13 -0
  71. data/app/models/concerns/kms/update_stylesheets_text.rb +20 -0
  72. data/app/models/kms/asset.rb +83 -0
  73. data/app/models/kms/page.rb +61 -0
  74. data/app/models/kms/settings.rb +7 -0
  75. data/app/models/kms/snippet.rb +11 -0
  76. data/app/models/kms/template.rb +11 -0
  77. data/app/models/kms/user.rb +18 -0
  78. data/app/serializers/kms/settings_serializer.rb +5 -0
  79. data/app/serializers/kms/snippet_serializer.rb +5 -0
  80. data/app/services/kms/ability_service.rb +11 -0
  81. data/app/services/kms/externals_registry.rb +11 -0
  82. data/app/services/kms/form_customization_service.rb +14 -0
  83. data/app/services/kms/help_service.rb +13 -0
  84. data/app/services/kms/resource_service.rb +22 -0
  85. data/app/services/kms/search_service.rb +11 -0
  86. data/app/services/kms/settings_service.rb +13 -0
  87. data/app/uploaders/kms/asset_uploader.rb +61 -0
  88. data/app/views/devise/registrations/new.html.erb +21 -0
  89. data/app/views/devise/sessions/new.html.erb +17 -0
  90. data/app/views/devise/shared/_links.html.erb +25 -0
  91. data/app/views/layouts/kms/devise.html.erb +35 -0
  92. data/app/views/layouts/kms/kms.html.erb +139 -0
  93. data/config/initializers/bower_rails.rb +16 -0
  94. data/config/initializers/devise.rb +15 -0
  95. data/config/initializers/externals.rb +42 -0
  96. data/config/initializers/help.rb +1 -0
  97. data/config/initializers/liquor.rb +49 -0
  98. data/config/initializers/resources.rb +5 -0
  99. data/config/locales/devise.en.yml +59 -0
  100. data/config/locales/devise.ru.yml +63 -0
  101. data/config/locales/en.yml +172 -0
  102. data/config/locales/ru.yml +172 -0
  103. data/config/routes.rb +31 -0
  104. data/db/migrate/20141027065341_create_pages.rb +12 -0
  105. data/db/migrate/20141027083603_create_templates.rb +10 -0
  106. data/db/migrate/20141027083633_add_template_id_to_pages.rb +6 -0
  107. data/db/migrate/20141029145253_create_assets.rb +10 -0
  108. data/db/migrate/20141031125758_add_ancestry_to_pages.rb +6 -0
  109. data/db/migrate/20141031140308_devise_create_users.rb +42 -0
  110. data/db/migrate/20141119084306_add_fullpath_to_pages.rb +5 -0
  111. data/db/migrate/20141121112652_add_role_to_users.rb +5 -0
  112. data/db/migrate/20141127073902_add_templatable_fields_to_pages.rb +6 -0
  113. data/db/migrate/20141209132901_add_hidden_to_page.rb +5 -0
  114. data/db/migrate/20150209120632_add_position_to_kms_pages.rb +5 -0
  115. data/db/migrate/20160129100437_create_kms_snippets.rb +11 -0
  116. data/db/migrate/20160712094512_create_kms_settings.rb +9 -0
  117. data/lib/generators/kms/install/install_generator.rb +34 -0
  118. data/lib/generators/kms/install/templates/devise.rb +257 -0
  119. data/lib/generators/kms/install/templates/dragonfly.rb +35 -0
  120. data/lib/kms.rb +6 -0
  121. data/lib/kms/dependencies.rb +15 -0
  122. data/lib/kms/drops/page_drop.rb +24 -0
  123. data/lib/kms/drops/search_item_drop.rb +5 -0
  124. data/lib/kms/engine.rb +65 -0
  125. data/lib/kms/externals/bigdecimal.rb +5 -0
  126. data/lib/kms/externals/request.rb +4 -0
  127. data/lib/kms/functions/assets.rb +40 -0
  128. data/lib/kms/functions/currency.rb +21 -0
  129. data/lib/kms/search_item.rb +28 -0
  130. data/lib/kms/version.rb +3 -0
  131. data/lib/tasks/kms_tasks.rake +4 -0
  132. data/lib/tasks/precompile_hook.rake +42 -0
  133. data/spec/controllers/kms/snippets_controller_spec.rb +74 -0
  134. data/spec/factories/kms_settings.rb +6 -0
  135. data/spec/factories/snippets.rb +10 -0
  136. data/spec/factories/users.rb +7 -0
  137. data/spec/internal/Rakefile +2 -0
  138. data/spec/internal/config/database.yml +7 -0
  139. data/spec/internal/config/initializers/devise.rb +257 -0
  140. data/spec/internal/config/routes.rb +7 -0
  141. data/spec/internal/db/schema.rb +69 -0
  142. data/spec/internal/log/test.log +14998 -0
  143. data/spec/internal/public/favicon.ico +0 -0
  144. data/spec/internal/tmp/cache/assets/test/sprockets/v3.0/1XyAFYlYI0pK7WAgjR4PgXV6BgU6huJSviWmHetdCRs.cache +1 -0
  145. data/spec/models/kms/setting_spec.rb +7 -0
  146. data/spec/models/kms/snippet_spec.rb +14 -0
  147. data/spec/services/kms/help_service_spec.rb +8 -0
  148. data/spec/spec_helper.rb +27 -0
  149. data/spec/support/controller_macros.rb +11 -0
  150. data/spec/support/request_helpers.rb +7 -0
  151. metadata +521 -0
@@ -0,0 +1,27 @@
1
+ module Kms
2
+ class Public::PagesController < ActionController::Base
3
+
4
+ before_filter :eval_externals
5
+
6
+ def show
7
+ page_result = Kms.template_manager.render(@page.register_id, @externals)
8
+ # apply typograph to page content
9
+ #page_result = EvilFront::Russian.typograph_html(page_result)
10
+ result = Kms.template_manager.render(@template.register_id, @externals.
11
+ merge(_inner_template: page_result))
12
+
13
+ render text: result, layout: false
14
+ end
15
+
16
+ protected
17
+
18
+ def eval_externals
19
+ @externals = Hash[ExternalsRegistry.externals.map{ |k, v| [k, v.call(request, self)] }]
20
+ @page = @externals[:page].source
21
+ @template = @page.template
22
+ rescue ActiveRecord::RecordNotFound
23
+ render file: "#{Rails.root}/public/404.html", layout: false, status: :not_found
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module Kms
2
+ class Public::SearchController < ActionController::Base
3
+ def search
4
+ results = Page.advanced_search(params[:query]).to_drop#.split(' ').join('|').to_drop
5
+ if params[:result_page] and @page = Page.find_by_fullpath(params[:result_page])
6
+ @externals = Hash[ExternalsRegistry.externals.map{ |k, v| [k, v.call(request, self)] }]
7
+ @template = @page.template
8
+
9
+ page_result = Rails.configuration.x.template_manager.render(@page.register_id, @externals.merge!(search: results))
10
+ result = Rails.configuration.x.template_manager.render(@template.register_id, @externals.merge(_inner_template: page_result))
11
+
12
+ render text: result, layout: false
13
+ else
14
+ redirect_to root_path
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Kms
2
+ class ResourcesController < ApplicationController
3
+ authorize_resource :class => false
4
+
5
+ def index
6
+ render json: ResourceService.external_resources_hash.to_json
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module Kms
2
+ class SettingsController < ApplicationController
3
+ authorize_resource :class => false
4
+
5
+ def show
6
+ render json: Settings.instance
7
+ end
8
+
9
+ def update
10
+ @settings = Settings.instance
11
+ if @settings.update_attributes(settings_params)
12
+ render json: @settings
13
+ else
14
+ render json: @settings.to_json(methods: :errors), status: :unprocessable_entity
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def settings_params
21
+ params.require(:setting).permit!
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ module Kms
2
+ class SnippetsController < ApplicationController
3
+ respond_to :json
4
+
5
+ def index
6
+ render json: Snippet.all, root: false
7
+ end
8
+
9
+ def create
10
+ @snippet = Snippet.create(snippet_params)
11
+ render json: @snippet, root: false
12
+ end
13
+
14
+ def update
15
+ @snippet = Snippet.find(params[:id])
16
+ @snippet.update(snippet_params)
17
+ render json: @snippet, root: false
18
+ end
19
+
20
+ def show
21
+ @snippet = Snippet.find(params[:id])
22
+ render json: @snippet, root: false
23
+ end
24
+
25
+ def destroy
26
+ @snippet = Snippet.find(params[:id])
27
+ @snippet.destroy
28
+ render json: @snippet
29
+ end
30
+
31
+ protected
32
+
33
+ def snippet_params
34
+ params.require(:snippet).permit!
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ module Kms
2
+ class TemplatesController < ApplicationController
3
+ load_and_authorize_resource
4
+ def index
5
+ render json: Template.all.to_json
6
+ end
7
+
8
+ def create
9
+ @template = Template.new(template_params)
10
+ if @template.save
11
+ render json: @template.to_json
12
+ else
13
+ render json: @template.to_json(methods: :errors), status: :unprocessable_entity
14
+ end
15
+ end
16
+
17
+ def update
18
+ @template = Template.find(params[:id])
19
+ if @template.update_attributes(template_params)
20
+ render json: @template.to_json
21
+ else
22
+ render json: @template.to_json(methods: :errors), status: :unprocessable_entity
23
+ end
24
+ end
25
+
26
+ def show
27
+ @template = Template.find(params[:id])
28
+ render json: @template.to_json
29
+ end
30
+
31
+ def destroy
32
+ @template = Template.find(params[:id])
33
+ @template.destroy
34
+ render json: @template.to_json
35
+ end
36
+
37
+ protected
38
+
39
+ def template_params
40
+ params.require(:template).permit(:name,:content)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ module Kms
2
+ class UsersController < ApplicationController
3
+ before_action :authenticate_kms_user!
4
+ load_and_authorize_resource
5
+ skip_authorize_resource only: :kms_user
6
+
7
+ def index
8
+ render json: User.all.to_json(except: [:created_at, :updated_at], methods: :localized_role)
9
+ end
10
+
11
+ def create
12
+ user_params.merge!(password: params[:password], password_confirmation: params[:password_confirmation]) if params[:password]
13
+ @user = User.new(user_params)
14
+ @user.save
15
+ render json: @user.to_json
16
+ end
17
+
18
+ def destroy
19
+ @user = User.find(params[:id])
20
+ @user.destroy
21
+ render json: @user.to_json
22
+ end
23
+
24
+ def kms_user
25
+ render json: current_kms_user.to_json
26
+ end
27
+
28
+ protected
29
+
30
+ def user_params
31
+ params.require(:user).permit!
32
+ end
33
+
34
+
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ class Users::ConfirmationsController < Devise::ConfirmationsController
2
+ # GET /resource/confirmation/new
3
+ # def new
4
+ # super
5
+ # end
6
+
7
+ # POST /resource/confirmation
8
+ # def create
9
+ # super
10
+ # end
11
+
12
+ # GET /resource/confirmation?confirmation_token=abcdef
13
+ # def show
14
+ # super
15
+ # end
16
+
17
+ # protected
18
+
19
+ # The path used after resending confirmation instructions.
20
+ # def after_resending_confirmation_instructions_path_for(resource_name)
21
+ # super(resource_name)
22
+ # end
23
+
24
+ # The path used after confirmation.
25
+ # def after_confirmation_path_for(resource_name, resource)
26
+ # super(resource_name, resource)
27
+ # end
28
+ end
@@ -0,0 +1,28 @@
1
+ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
2
+ # You should configure your model like this:
3
+ # devise :omniauthable, omniauth_providers: [:twitter]
4
+
5
+ # You should also create an action method in this controller like this:
6
+ # def twitter
7
+ # end
8
+
9
+ # More info at:
10
+ # https://github.com/plataformatec/devise#omniauth
11
+
12
+ # GET|POST /resource/auth/twitter
13
+ # def passthru
14
+ # super
15
+ # end
16
+
17
+ # GET|POST /users/auth/twitter/callback
18
+ # def failure
19
+ # super
20
+ # end
21
+
22
+ # protected
23
+
24
+ # The path used when omniauth fails
25
+ # def after_omniauth_failure_path_for(scope)
26
+ # super(scope)
27
+ # end
28
+ end
@@ -0,0 +1,32 @@
1
+ class Users::PasswordsController < Devise::PasswordsController
2
+ # GET /resource/password/new
3
+ # def new
4
+ # super
5
+ # end
6
+
7
+ # POST /resource/password
8
+ # def create
9
+ # super
10
+ # end
11
+
12
+ # GET /resource/password/edit?reset_password_token=abcdef
13
+ # def edit
14
+ # super
15
+ # end
16
+
17
+ # PUT /resource/password
18
+ # def update
19
+ # super
20
+ # end
21
+
22
+ # protected
23
+
24
+ # def after_resetting_password_path_for(resource)
25
+ # super(resource)
26
+ # end
27
+
28
+ # The path used after sending reset password instructions
29
+ # def after_sending_reset_password_instructions_path_for(resource_name)
30
+ # super(resource_name)
31
+ # end
32
+ end
@@ -0,0 +1,70 @@
1
+ class Users::RegistrationsController < Devise::RegistrationsController
2
+ #before_filter :configure_sign_up_params, only: [:create]
3
+ # before_filter :configure_account_update_params, only: [:update]
4
+
5
+ # GET /resource/sign_up
6
+ # def new
7
+ # super
8
+ # end
9
+
10
+ # POST /resource
11
+ # def create
12
+ # super
13
+ # end
14
+
15
+ # GET /resource/edit
16
+ # def edit
17
+ # super
18
+ # end
19
+
20
+ # PUT /resource
21
+ # def update
22
+ # super
23
+ # end
24
+
25
+ # DELETE /resource
26
+ # def destroy
27
+ # super
28
+ # end
29
+
30
+ # GET /resource/cancel
31
+ # Forces the session data which is usually expired after sign
32
+ # in to be expired now. This is useful if the user wants to
33
+ # cancel oauth signing in/up in the middle of the process,
34
+ # removing all OAuth session data.
35
+ # def cancel
36
+ # super
37
+ # end
38
+
39
+ protected
40
+
41
+ def build_resource(hash=nil)
42
+ self.resource = resource_class.new_with_session(hash || {}, session)
43
+ # make first user as admin
44
+ unless Kms::User.exists?
45
+ self.resource.role = "admin"
46
+ end
47
+ end
48
+
49
+
50
+ # You can put the params you want to permit in the empty array.
51
+ #def configure_sign_up_params
52
+ # make first user as admin
53
+ #devise_parameter_sanitizer.for(:sign_up) << :attribute
54
+ #end
55
+
56
+ # You can put the params you want to permit in the empty array.
57
+ # def configure_account_update_params
58
+ # devise_parameter_sanitizer.for(:account_update) << :attribute
59
+ # end
60
+
61
+ # The path used after sign up.
62
+ # def after_sign_up_path_for(resource)
63
+ # super(resource)
64
+ # end
65
+
66
+ # The path used after sign up for inactive accounts.
67
+ # def after_inactive_sign_up_path_for(resource)
68
+ # super(resource)
69
+ # end
70
+ end
@@ -0,0 +1,25 @@
1
+ class Users::SessionsController < Devise::SessionsController
2
+ # before_filter :configure_sign_in_params, only: [:create]
3
+
4
+ # GET /resource/sign_in
5
+ # def new
6
+ # super
7
+ # end
8
+
9
+ # POST /resource/sign_in
10
+ # def create
11
+ # super
12
+ # end
13
+
14
+ # DELETE /resource/sign_out
15
+ # def destroy
16
+ # super
17
+ # end
18
+
19
+ # protected
20
+
21
+ # You can put the params you want to permit in the empty array.
22
+ # def configure_sign_in_params
23
+ # devise_parameter_sanitizer.for(:sign_in) << :attribute
24
+ # end
25
+ end
@@ -0,0 +1,28 @@
1
+ class Users::UnlocksController < Devise::UnlocksController
2
+ # GET /resource/unlock/new
3
+ # def new
4
+ # super
5
+ # end
6
+
7
+ # POST /resource/unlock
8
+ # def create
9
+ # super
10
+ # end
11
+
12
+ # GET /resource/unlock?unlock_token=abcdef
13
+ # def show
14
+ # super
15
+ # end
16
+
17
+ # protected
18
+
19
+ # The path used after sending unlock password instructions
20
+ # def after_sending_unlock_instructions_path_for(resource)
21
+ # super(resource)
22
+ # end
23
+
24
+ # The path used after unlocking the resource
25
+ # def after_unlock_path_for(resource)
26
+ # super(resource)
27
+ # end
28
+ end
@@ -0,0 +1,4 @@
1
+ module Kms
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,38 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+ # Define abilities for the passed in user here. For example:
6
+ #
7
+ user ||= Kms::User.new # guest user (not logged in)
8
+ if user.admin?
9
+ can :manage, :all
10
+ else
11
+ can :index, Kms::Template
12
+ can :manage, Kms::Page
13
+ can :manage, Kms::Asset
14
+ Kms::AbilityService.abilities.each do |ability_block|
15
+ instance_eval(&ability_block)
16
+ end
17
+ end
18
+
19
+ #
20
+ # The first argument to `can` is the action you are giving the user
21
+ # permission to do.
22
+ # If you pass :manage it will apply to every action. Other common actions
23
+ # here are :read, :create, :update and :destroy.
24
+ #
25
+ # The second argument is the resource the user can perform the action on.
26
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
27
+ # class of the resource.
28
+ #
29
+ # The third argument is an optional hash of conditions to further filter the
30
+ # objects.
31
+ # For example, here the user can only update published articles.
32
+ #
33
+ # can :update, Article, :published => true
34
+ #
35
+ # See the wiki for details:
36
+ # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
37
+ end
38
+ end