kms 0.4.0

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.
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