adminpanel 2.1.7 → 2.2.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -3
  3. data/Gemfile +3 -27
  4. data/adminpanel.gemspec +24 -23
  5. data/app/assets/images/adminpanel/loguito.png +0 -0
  6. data/app/assets/javascripts/adminpanel/bootstrap-wysihtml5-4pre.js +120 -120
  7. data/app/assets/javascripts/adminpanel/spinner.js.coffee +6 -6
  8. data/app/assets/stylesheets/adminpanel/bootstrap-wysihtml5.css +21 -75
  9. data/app/controllers/adminpanel/analytics_controller.rb +34 -2
  10. data/app/controllers/adminpanel/application_controller.rb +7 -6
  11. data/app/controllers/adminpanel/categories_controller.rb +0 -1
  12. data/app/controllers/adminpanel/galleries_controller.rb +0 -1
  13. data/app/controllers/adminpanel/permissions_controller.rb +14 -0
  14. data/app/controllers/adminpanel/rols_controller.rb +10 -0
  15. data/app/controllers/adminpanel/sections_controller.rb +11 -14
  16. data/app/controllers/adminpanel/sessions_controller.rb +45 -11
  17. data/app/controllers/adminpanel/users_controller.rb +2 -4
  18. data/app/controllers/concerns/adminpanel/analytics/instagram_analytics.rb +31 -0
  19. data/app/controllers/concerns/adminpanel/analytics/twitter_analytics.rb +25 -0
  20. data/app/controllers/concerns/adminpanel/facebook_actions.rb +7 -5
  21. data/app/controllers/concerns/adminpanel/rest_actions.rb +12 -0
  22. data/app/controllers/concerns/adminpanel/twitter_actions.rb +40 -0
  23. data/app/helpers/adminpanel/adminpanel_form_builder.rb +21 -14
  24. data/app/helpers/adminpanel/analytics_helper.rb +22 -2
  25. data/app/helpers/adminpanel/application_helper.rb +2 -2
  26. data/app/helpers/adminpanel/breadcrumbs_helper.rb +8 -6
  27. data/app/helpers/adminpanel/router_helper.rb +4 -0
  28. data/app/helpers/adminpanel/sessions_helper.rb +2 -2
  29. data/app/helpers/adminpanel/shared_pages_helper.rb +3 -3
  30. data/{lib/generators/adminpanel/initialize/templates → app/models}/ability.rb +18 -6
  31. data/app/models/adminpanel/analytic.rb +1 -0
  32. data/app/models/adminpanel/auth.rb +4 -1
  33. data/app/models/adminpanel/permission.rb +52 -0
  34. data/app/models/adminpanel/rol.rb +35 -0
  35. data/app/models/adminpanel/user.rb +8 -8
  36. data/app/models/concerns/adminpanel/base.rb +4 -0
  37. data/app/models/concerns/adminpanel/facebook.rb +1 -1
  38. data/app/models/concerns/adminpanel/twitter.rb +27 -0
  39. data/app/views/adminpanel/analytics/{_widget_task_statistics.html.erb → _fb_statistic_widget.html.erb} +0 -0
  40. data/app/views/adminpanel/analytics/_header.html.erb +8 -2
  41. data/app/views/adminpanel/analytics/_instagram_details_modal.html.erb +55 -0
  42. data/app/views/adminpanel/analytics/_instagram_media.html.erb +25 -0
  43. data/app/views/adminpanel/analytics/_tweet.html.erb +32 -0
  44. data/app/views/adminpanel/analytics/_twitter_reply_modal.html.erb +41 -0
  45. data/app/views/adminpanel/analytics/fb.html.erb +6 -6
  46. data/app/views/adminpanel/analytics/instagram.html.erb +65 -0
  47. data/app/views/adminpanel/analytics/twitter.html.erb +89 -0
  48. data/app/views/adminpanel/sections/edit.html.erb +2 -5
  49. data/app/views/layouts/_side_menu.html.erb +3 -3
  50. data/app/views/layouts/admin.html.erb +2 -2
  51. data/app/views/shared/_delete_icon_button.html.erb +1 -1
  52. data/app/views/shared/_edit_icon_button.html.erb +1 -1
  53. data/app/views/shared/_fb_icon_button.html.erb +1 -1
  54. data/app/views/shared/_form_fields.html.erb +1 -1
  55. data/app/views/shared/_new_resource_button.html.erb +1 -2
  56. data/app/views/shared/_twitter_icon_button.html.erb +26 -0
  57. data/app/views/shared/_twitter_publish_modal.html.erb +40 -0
  58. data/app/views/shared/index.html.erb +5 -3
  59. data/app/views/shared/show.html.erb +7 -3
  60. data/config/initializers/twitter-oauth.rb +15 -0
  61. data/config/locales/en.yml +1 -1
  62. data/config/locales/es.yml +20 -1
  63. data/config/routes.rb +25 -5
  64. data/lib/adminpanel.rb +3 -0
  65. data/lib/adminpanel/engine.rb +19 -5
  66. data/lib/adminpanel/version.rb +1 -1
  67. data/lib/generators/adminpanel/initialize/initialize_generator.rb +0 -11
  68. data/lib/generators/adminpanel/initialize/templates/adminpanel_setup.rb +12 -0
  69. data/lib/generators/adminpanel/initialize/templates/create_adminpanel_tables.rb +74 -46
  70. data/lib/generators/adminpanel/resource/resource_generator_helper.rb +1 -1
  71. data/lib/generators/adminpanel/resource/templates/adminpanel_resource_template.rb +1 -1
  72. data/lib/tasks/adminpanel/adminpanel.rake +5 -5
  73. data/test/dummy/app/models/adminpanel/item.rb +1 -1
  74. data/test/dummy/app/models/adminpanel/mug.rb +1 -0
  75. data/test/dummy/app/models/adminpanel/photo.rb +4 -0
  76. data/test/dummy/app/models/adminpanel/product.rb +7 -1
  77. data/test/dummy/app/models/adminpanel/salesman.rb +1 -0
  78. data/test/dummy/app/views/layouts/application.html.erb +0 -1
  79. data/test/dummy/db/schema.rb +9 -2
  80. data/test/dummy/test/fixtures/adminpanel/permissions.yml +42 -0
  81. data/test/dummy/test/fixtures/adminpanel/rols.yml +28 -0
  82. data/test/dummy/test/fixtures/adminpanel/salesmen.yml +1 -0
  83. data/test/dummy/test/fixtures/adminpanel/users.yml +49 -1
  84. data/test/features/shared/resource/index_test.rb +1 -0
  85. data/test/features/shared/ui/action_exclution_test.rb +1 -0
  86. data/test/helpers/breadcrumbs_helper_test.rb +34 -0
  87. data/test/helpers/router_helper_test.rb +21 -0
  88. data/test/helpers/shared_pages_helper_test.rb +35 -0
  89. data/test/models/ability_test.rb +52 -0
  90. data/test/models/adminpanel/gallery_test.rb +0 -2
  91. data/test/models/adminpanel/user_test.rb +1 -1
  92. data/test/support/shared_database.rb +11 -0
  93. data/test/support/view_case.rb +34 -0
  94. data/test/tasks/adminpanel_rake_test.rb +5 -2
  95. data/test/test_helper.rb +1 -41
  96. metadata +191 -200
  97. data/app/assets/javascripts/adminpanel/jquery.facybox.js +0 -395
  98. data/app/assets/stylesheets/adminpanel/facybox.css +0 -146
  99. data/app/models/adminpanel/group.rb +0 -6
  100. data/test/dummy/Rakefile +0 -7
  101. data/test/dummy/app/models/ability.rb +0 -31
  102. data/test/dummy/test/fixtures/adminpanel/groups.yml +0 -4
@@ -1,13 +1,16 @@
1
1
  module Adminpanel
2
2
  class AnalyticsController < Adminpanel::ApplicationController
3
- skip_authorization_check
4
- authorize_resource :class => false
3
+ include Adminpanel::Analytics::TwitterAnalytics
4
+ include Adminpanel::Analytics::InstagramAnalytics
5
+
5
6
  skip_before_filter :set_model
6
7
 
7
8
  API_VERSION = 'v3'
8
9
  CACHED_API_FILE = "#{Rails.root}/tmp/cache/analytics-#{API_VERSION}.cache"
9
10
 
10
11
  def index
12
+ authorize! :read, Adminpanel::Analytic
13
+
11
14
  unless Adminpanel.analytics_profile_id.nil? || Adminpanel.analytics_key_filename.nil?
12
15
  service_account_email = '266789642405-0nppij5ll43bbvhpsn986puulssdoc45@developer.gserviceaccount.com' # Email of service account
13
16
  key_file = "#{Rails.root}/#{Adminpanel.analytics_key_path}/#{Adminpanel.analytics_key_filename}" # File containing your private key
@@ -75,6 +78,7 @@ module Adminpanel
75
78
  end
76
79
 
77
80
  def fb
81
+ authorize! :read, Adminpanel::Analytic
78
82
  auth = Adminpanel::Auth.find_by_key('facebook')
79
83
  if params[:insight].present?
80
84
  period = params[:insight]
@@ -120,5 +124,33 @@ module Adminpanel
120
124
  end
121
125
  end
122
126
 
127
+ # uses @client to fetch replies and tweets, for some statics
128
+ def twitter
129
+ authorize! :read, Adminpanel::Analytic
130
+ if !@twitter_token.nil? && !@twitter_secret.nil?
131
+ @favorites = 0.0
132
+ @retweets = 0.0
133
+ @twitter_user = @twitter_client.user
134
+
135
+ # 20 is the number that we're using to measure statics.
136
+ @twitter_client.user_timeline(@twitter_user.username).take(20).collect do |tweet|
137
+ @favorites = @favorites + tweet.favorite_count.to_f
138
+ @retweets = @retweets + tweet.retweet_count.to_f
139
+ end
140
+
141
+ @tweets = @twitter_client.mentions_timeline.take(5)
142
+
143
+ @favorites = @favorites / 20.0
144
+ @retweets = @retweets / 20.0
145
+ end
146
+ end
147
+
148
+ def instagram
149
+ authorize! :read, Adminpanel::Analytic
150
+ if !@instagram_token.nil?
151
+ @user = @instagram_client.user
152
+ end
153
+ end
154
+
123
155
  end
124
156
  end
@@ -1,20 +1,21 @@
1
1
  module Adminpanel
2
2
  class ApplicationController < ActionController::Base
3
3
  protect_from_forgery
4
-
5
4
  inherit_resources
5
+ authorize_resource
6
+
7
+ layout 'admin'
8
+
9
+ before_filter :signed_in_user, :set_model, :strong_params_for_cancan
6
10
 
7
11
  include SessionsHelper
8
12
  include Adminpanel::RestActions
9
13
  include Adminpanel::GalleryzableActions
10
14
  include Adminpanel::FacebookActions
15
+ include Adminpanel::TwitterActions
11
16
  include Adminpanel::SitemapActions
12
-
13
- layout 'admin'
14
-
15
- before_filter :signed_in_user, :set_model, :strong_params_for_cancan
16
-
17
17
  private
18
+
18
19
  def strong_params_for_cancan
19
20
  resource = controller_name.singularize.to_sym
20
21
  method = "#{resource}_params"
@@ -1,6 +1,5 @@
1
1
  module Adminpanel
2
2
  class CategoriesController < ApplicationController
3
- authorize_resource
4
3
 
5
4
  def index
6
5
  @categories = Category.all
@@ -1,6 +1,5 @@
1
1
  module Adminpanel
2
2
  class GalleriesController < Adminpanel::ApplicationController
3
- authorize_resource
4
3
 
5
4
  def index
6
5
  @galleries = Gallery.all
@@ -0,0 +1,14 @@
1
+ module Adminpanel
2
+ class PermissionsController < Adminpanel::ApplicationController
3
+
4
+ private
5
+ def permission_params
6
+ params.require(:permission).permit(
7
+
8
+ :rol_id,
9
+ :action,
10
+ :resource
11
+ )
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Adminpanel
2
+ class RolsController < Adminpanel::ApplicationController
3
+
4
+ private
5
+ def rol_params
6
+ params.require(:rol).permit(:name)
7
+
8
+ end
9
+ end
10
+ end
@@ -1,7 +1,5 @@
1
1
  module Adminpanel
2
2
  class SectionsController < Adminpanel::ApplicationController
3
- # authorize_resource
4
- authorize_resource
5
3
  # def new
6
4
  # @section = Section.new
7
5
  # authorize! :create, @section
@@ -9,10 +7,10 @@ module Adminpanel
9
7
 
10
8
  def edit
11
9
  @section = Section.find(params[:id])
12
- respond_to do |format|
13
- format.html
14
- format.json {render :json => {:section => @section }}
15
- end
10
+ # respond_to do |format|
11
+ # format.html
12
+ # format.json {render :json => {:section => @section }}
13
+ # end
16
14
  end
17
15
 
18
16
  def update
@@ -43,15 +41,14 @@ module Adminpanel
43
41
  private
44
42
  def section_params
45
43
  params.require(:section).permit(
46
- :description,
47
- :has_image,
48
- :key,
49
- :page,
50
- :name,
51
- :has_description,
52
- :images_attributes => [:id, :file]
44
+ :has_description,
45
+ :description,
46
+ :key,
47
+ :page,
48
+ :name,
49
+ :has_image,
50
+ images_attributes: [:id, :file]
53
51
  )
54
-
55
52
  end
56
53
  end
57
54
  end
@@ -1,24 +1,21 @@
1
1
  module Adminpanel
2
- class SessionsController < Adminpanel::ApplicationController
3
- skip_authorization_check
2
+ class SessionsController < ActionController::Base
3
+ include SessionsHelper
4
+ protect_from_forgery
4
5
  layout 'admin-login'
5
- skip_before_filter :signed_in_user, :set_model
6
+ before_action :configure_instagram, only:[:instagram_login, :instagram_callback]
6
7
 
7
8
  def new
8
- respond_to do |format|
9
- format.html
10
- format.json { render :json => {:session => @session }}
11
- end
12
9
  end
13
10
 
14
11
  def create
15
12
  user = User.find_by_email(params[:session][:email].downcase)
16
13
  if user && user.authenticate(params[:session][:password])
17
- sign_in user
18
- flash[:success] = I18n.t("authentication.signin_success")
19
- redirect_to root_url
14
+ sign_in user
15
+ flash[:success] = I18n.t('authentication.signin_success')
16
+ redirect_to root_url
20
17
  else
21
- flash.now[:error] = I18n.t("authentication.signin_error")
18
+ flash.now[:error] = I18n.t('authentication.signin_error')
22
19
  render 'new'
23
20
  end
24
21
  end
@@ -27,5 +24,42 @@ module Adminpanel
27
24
  sign_out
28
25
  redirect_to signin_path
29
26
  end
27
+
28
+ def twitter_callback
29
+ save_twitter_tokens
30
+ flash[:success] = I18n.t('twitter.saved_token')
31
+ redirect_to twitter_analytics_path
32
+ end
33
+
34
+ def instagram_login
35
+ redirect_to Instagram.authorize_url(:redirect_uri => instagram_callback_sessions_url, :scope => 'comments')
36
+ end
37
+
38
+ def instagram_callback
39
+ response = Instagram.get_access_token(params[:code], :redirect_uri => instagram_callback_sessions_url)
40
+ username = Instagram.client(access_token: response.access_token).user.username
41
+ Auth.create(key: 'instagram', value: response.access_token, name: "@#{username}")
42
+ redirect_to instagram_analytics_path
43
+ end
44
+
45
+ private
46
+
47
+ def configure_instagram
48
+ Instagram.configure do |config|
49
+ config.client_id = Adminpanel.instagram_client_id
50
+ config.client_secret = Adminpanel.instagram_client_secret
51
+ end
52
+ end
53
+
54
+ def save_twitter_tokens
55
+ twitter_user = "@#{request.env['omniauth.auth']['info']['nickname']}"
56
+ ['token', 'secret'].each do |key|
57
+ Auth.create(
58
+ key: "twitter-#{key}",
59
+ name: twitter_user,
60
+ value: request.env['omniauth.auth']['credentials'][key]
61
+ )
62
+ end
63
+ end
30
64
  end
31
65
  end
@@ -1,8 +1,6 @@
1
1
  module Adminpanel
2
2
  class UsersController < Adminpanel::ApplicationController
3
- # authorize_resource :class => false
4
- authorize_resource
5
-
3
+
6
4
  private
7
5
  def user_params
8
6
  params.require(:user).permit(
@@ -10,7 +8,7 @@ module Adminpanel
10
8
  :name,
11
9
  :password,
12
10
  :password_confirmation,
13
- :group_id
11
+ :rol_id
14
12
  )
15
13
  end
16
14
  end
@@ -0,0 +1,31 @@
1
+ module Adminpanel
2
+ module Analytics
3
+ module InstagramAnalytics
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_filter :set_instagram_token, only:[:instagram, :instagram_comment]
8
+ end
9
+
10
+ def instagram_comment
11
+
12
+ response = @instagram_client.create_media_comment params[:id], params[:instagram_text]
13
+ debugger
14
+ redirect_to instagram_analytics_path
15
+ end
16
+
17
+ private
18
+ def set_instagram_token
19
+ @instagram_token = Auth.find_by_key 'instagram'
20
+
21
+ if !@instagram_token.nil?
22
+ @instagram_client ||= Instagram.client(
23
+
24
+ access_token: @instagram_token.value
25
+ )
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module Adminpanel
2
+ module Analytics
3
+ module TwitterAnalytics
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_filter :get_twitter_token, only:[:twitter, :reply_to_tweet, :favorite_tweet, :retweet_tweet]
8
+ end
9
+
10
+ def reply_to_tweet
11
+ @twitter_client.update params[:tweet], in_reply_to_status_id: params[:id]
12
+ redirect_to twitter_analytics_path
13
+ end
14
+
15
+ def favorite_tweet
16
+ @twitter_client.favorite(params[:id])
17
+ end
18
+
19
+ def retweet_tweet
20
+ @twitter_client.retweet(params[:id])
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -3,7 +3,7 @@ module Adminpanel
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- before_filter :set_auths_count, only:[:index, :create, :update, :destroy, :show]
6
+ before_filter :set_fb_auths_count, only:[:index, :create, :update, :destroy, :show]
7
7
  end
8
8
 
9
9
  def fb_choose_page
@@ -28,17 +28,19 @@ module Adminpanel
28
28
  page_selected = Koala::Facebook::API.new(
29
29
  params[model_name][:fb_page_access_key]
30
30
  )
31
- update_facebook_auth(page_selected.get_object('me')['name'])
31
+ update_fb_auth(page_selected.get_object('me')['name'])
32
32
  flash[:success] = I18n.t('fb.saved_token')
33
33
  redirect_to resource
34
34
  end
35
35
 
36
36
  def fb_publish
37
+ authorize! :publish, resource
38
+
37
39
  page_graph = Koala::Facebook::API.new(Auth.find_by_key('facebook').value)
38
40
  page_graph.put_wall_post(
39
41
  params[model_name][:fb_message],
40
42
  {
41
- link: resource.fb_link,
43
+ link: resource.share_link,
42
44
  name: resource.name
43
45
  }
44
46
  )
@@ -47,11 +49,11 @@ module Adminpanel
47
49
  end
48
50
 
49
51
  private
50
- def set_auths_count
52
+ def set_fb_auths_count
51
53
  @fb_auths_count = Auth.where(key: 'facebook').count
52
54
  end
53
55
 
54
- def update_facebook_auth(account_selected_name)
56
+ def update_fb_auth(account_selected_name)
55
57
  auths = Auth.where(key: 'facebook', name: account_selected_name)
56
58
  if auths.count == 0
57
59
  Auth.create(
@@ -43,6 +43,7 @@ module Adminpanel
43
43
  set_collections
44
44
  render 'shared/new', :locals => {:resource => resource }
45
45
  end
46
+ respond_to_json(success, failure)
46
47
  end
47
48
  end
48
49
 
@@ -66,6 +67,7 @@ module Adminpanel
66
67
  set_collections
67
68
  render 'shared/edit'
68
69
  end
70
+ respond_to_json(success, failure)
69
71
  end
70
72
  end
71
73
 
@@ -109,5 +111,15 @@ module Adminpanel
109
111
  params.merge({:belongs_request => params[:belongs_request]}) if params[:belongs_request].present?
110
112
  params.merge({:currentcontroller => params[:currentcontroller]}) if params[:currentcontroller].present?
111
113
  end
114
+
115
+ def respond_to_json(success, failure)
116
+ success.json do
117
+ render json: resource
118
+ end
119
+ failure.json do
120
+ render json: resource
121
+ end
122
+ end
123
+
112
124
  end
113
125
  end
@@ -0,0 +1,40 @@
1
+ module Adminpanel
2
+ module TwitterActions
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_filter :get_twitter_token, only:[:index, :create, :update, :destroy, :show, :twitter_publish]
7
+ end
8
+
9
+ def twitter_publish
10
+ resource.twitter_message = params[model_name][:twitter_message]
11
+ if !@twitter_token.nil? && !@twitter_secret.nil? && resource.has_valid_tweet?
12
+ client = get_twitter_token
13
+ client.update(resource.twitter_message)
14
+ flash[:success] = I18n.t('twitter.posted', user: @twitter_token.name)
15
+ else
16
+ flash[:error] = I18n.t('twitter.not-posted')
17
+ end
18
+ redirect_to resource
19
+ end
20
+
21
+ private
22
+ def get_twitter_token
23
+ @twitter_token = Auth.find_by_key 'twitter-token'
24
+ @twitter_secret = Auth.find_by_key 'twitter-secret'
25
+
26
+ if !@twitter_token.nil? && !@twitter_secret.nil?
27
+ @twitter_client ||= ::Twitter::REST::Client.new do |config|
28
+ config.consumer_key = Adminpanel.twitter_api_key
29
+ config.consumer_secret = Adminpanel.twitter_api_secret
30
+ config.access_token = @twitter_token.value
31
+ config.access_token_secret = @twitter_secret.value
32
+ end
33
+ end
34
+ end
35
+
36
+ def model_name
37
+ @model.name.demodulize.downcase # ex: posts
38
+ end
39
+ end
40
+ end