backframe 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/lib/backframe/actioncontroller/acts_as_activation.rb +4 -2
- data/lib/backframe/actioncontroller/acts_as_api/adapter.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_api/errors.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_api/headers.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_api/page.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_api.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_reset.rb +3 -1
- data/lib/backframe/actioncontroller/acts_as_resource/actions.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_resource.rb +2 -0
- data/lib/backframe/actioncontroller/acts_as_session.rb +2 -0
- data/lib/backframe/activerecord/acts_as_activable.rb +50 -0
- data/lib/backframe/activerecord/acts_as_distinct.rb +47 -0
- data/lib/backframe/activerecord/acts_as_orderable.rb +2 -0
- data/lib/backframe/activerecord/acts_as_status.rb +2 -0
- data/lib/backframe/activerecord/acts_as_user.rb +4 -2
- data/lib/backframe/activerecord/filter_sort.rb +2 -0
- data/lib/backframe/activerecord/migration.rb +2 -0
- data/lib/backframe/mime.rb +2 -0
- data/lib/backframe/models/activation.rb +60 -0
- data/lib/backframe/models/activity.rb +40 -0
- data/lib/backframe/models/reset.rb +59 -0
- data/lib/backframe/railtie.rb +4 -0
- data/lib/backframe/serializers/activity_serializer.rb +44 -0
- data/lib/backframe/version.rb +3 -1
- data/lib/backframe.rb +22 -2
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3de06cb531fbad921e5fafac1a04b01512061675
|
4
|
+
data.tar.gz: 362c046128e883f70b9c523e58ec771bc22814d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f22db57f526565517c16f8508db58f2cb647a85f0ea231c4d0796a544027d8d4fcba2f1e32749e87a56a7618b1999636edd58da65adbac83bc8d0ebf5a04bca
|
7
|
+
data.tar.gz: 0e4a21a30dd1e73875a29e1c09d3d03f57e7a3bbabe3c98a6b9a0e756722d98c2ed0d8a582907282e56279b94058ea8436e1fc6857738963697cd1490971c24c
|
data/Gemfile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'active_support'
|
2
4
|
require 'active_support/inflector'
|
3
5
|
|
@@ -16,7 +18,7 @@ module Backframe
|
|
16
18
|
before_action :load_#{model.underscore}, :except => :show
|
17
19
|
|
18
20
|
def show
|
19
|
-
@activation = Activation.find_by(:token => params[:token])
|
21
|
+
@activation = Backframe::Activation.find_by(:token => params[:token])
|
20
22
|
if @activation.nil?
|
21
23
|
flash[:error] = I18n.t(:activation_invalid)
|
22
24
|
redirect_to account_signin_path
|
@@ -49,7 +51,7 @@ module Backframe
|
|
49
51
|
private
|
50
52
|
|
51
53
|
def load_#{model.underscore}
|
52
|
-
@activation = Activation.find_by(:id => session[:activation_id])
|
54
|
+
@activation = Backframe::Activation.find_by(:id => session[:activation_id])
|
53
55
|
@user = @activation.user
|
54
56
|
if @user.nil?
|
55
57
|
flash[:error] = I18n.t(:activation_invalid)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'active_support'
|
2
4
|
require 'active_support/inflector'
|
3
5
|
|
@@ -32,7 +34,7 @@ module Backframe
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def show
|
35
|
-
@reset = Reset.find_by(:token => params[:token])
|
37
|
+
@reset = Backframe::Reset.find_by(:token => params[:token])
|
36
38
|
if @reset.nil?
|
37
39
|
flash[:error] = I18n.t(:reset_invalid)
|
38
40
|
redirect_to '#{arguments[:prefix]}/signin'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
module ActsAsActivable
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.send :extend, ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
|
14
|
+
def acts_as_activable(entity, text, link)
|
15
|
+
|
16
|
+
class_eval <<-EOV
|
17
|
+
|
18
|
+
def activities
|
19
|
+
conditions = []
|
20
|
+
conditions << '("activities"."object1_type"=? AND "activities"."object1_id"=?)'
|
21
|
+
conditions << '("activities"."object2_type"=? AND "activities"."object2_id"=?)'
|
22
|
+
conditions << '"activities"."subject_type"=? && "activities"."subject_id"=?' if self.is_a?(Admin) || self.is_a?(Customer)
|
23
|
+
fragment = [conditions.join(' OR '), self.class.name, self.id, self.class.name, self.id]
|
24
|
+
fragment.concat([self.class.name, self.id]) if self.is_a?(Admin) || self.is_a?(Customer)
|
25
|
+
Activity.where(fragment)
|
26
|
+
end
|
27
|
+
|
28
|
+
def activity_entity
|
29
|
+
"#{entity}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def activity_text
|
33
|
+
self.#{text}
|
34
|
+
end
|
35
|
+
|
36
|
+
def activity_link
|
37
|
+
link = "#{link}"
|
38
|
+
"#{link}".scan(/\\\[([\\\w\\\_]*)\\\]/).each do |token|
|
39
|
+
link = link.gsub('['+token.first+']', self.send(token.first).to_s)
|
40
|
+
end
|
41
|
+
link
|
42
|
+
end
|
43
|
+
EOV
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
module ActsAsDistinct
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.send :extend, ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
|
14
|
+
def acts_as_distinct(*args)
|
15
|
+
|
16
|
+
field = args[0]
|
17
|
+
arguments = args[1]
|
18
|
+
|
19
|
+
class_eval <<-EOV
|
20
|
+
|
21
|
+
after_initialize :set_default_#{field}, :if => Proc.new { |m| m.new_record? && m.#{arguments[:parent]}.present? }
|
22
|
+
after_save :toggle_#{field}_distinction, :if => Proc.new { |m| m.#{arguments[:parent]}.present? && m.#{field} && (m.new_record? || m.#{field}_changed?) }
|
23
|
+
|
24
|
+
scope :#{field.to_s.gsub('is_', '')}, -> { where(:#{field} => true) }
|
25
|
+
|
26
|
+
def #{field.to_s.gsub('is_', '')}?
|
27
|
+
return self.#{field}
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def set_default_#{field}
|
33
|
+
self.#{field} = self.#{arguments[:parent]}.#{arguments[:association]}.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def toggle_#{field}_distinction
|
37
|
+
self.#{arguments[:parent]}.#{arguments[:association]}.where('id != ?', self.id).update_all(:#{field} => false)
|
38
|
+
end
|
39
|
+
|
40
|
+
EOV
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Backframe
|
2
4
|
module ActsAsUser
|
3
5
|
extend ActiveSupport::Concern
|
@@ -12,8 +14,8 @@ module Backframe
|
|
12
14
|
|
13
15
|
attr_accessor :password, :change_password, :set_password, :old_password, :new_password, :confirm_password, :confirm_email
|
14
16
|
|
15
|
-
has_many :activations, :dependent => :destroy
|
16
|
-
has_many :resets, :dependent => :destroy
|
17
|
+
has_many :activations, :class_name => 'Backframe::Activation', :dependent => :destroy, :as => :user
|
18
|
+
has_many :resets, :class_name => 'Backframe::Reset', :dependent => :destroy, :as => :user
|
17
19
|
|
18
20
|
after_validation :set_new_password, :if => Proc.new { |u| u.new_password.present? }
|
19
21
|
after_create :activate
|
data/lib/backframe/mime.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
class Activation < ActiveRecord::Base
|
5
|
+
|
6
|
+
liquid_methods :code, :url
|
7
|
+
|
8
|
+
belongs_to :user, :polymorphic => true
|
9
|
+
|
10
|
+
validates_presence_of :user, :token
|
11
|
+
|
12
|
+
after_initialize :init, :if => Proc.new { |o| o.new_record? }
|
13
|
+
after_create :enforce_uniqueness
|
14
|
+
after_create :send_email
|
15
|
+
|
16
|
+
def claim
|
17
|
+
self.claimed_at = Time.zone.now
|
18
|
+
self.is_active = false
|
19
|
+
self.save
|
20
|
+
self.user.update_attributes(:is_active => true, :activated_at => Time.zone.now)
|
21
|
+
end
|
22
|
+
|
23
|
+
def expired?
|
24
|
+
!self.is_active
|
25
|
+
end
|
26
|
+
|
27
|
+
def url
|
28
|
+
return "#{Rails.application.config.root_url}/admin/activation/#{self.token}" if self.user_type == 'Admin'
|
29
|
+
return "#{Rails.application.config.root_url}/account/activation/#{self.token}" if self.user_type == 'Customer'
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def init
|
35
|
+
self.token ||= SecureRandom.hex(32).to_s.upcase[0,32]
|
36
|
+
self.is_active = true
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_active
|
40
|
+
self.is_active = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def enforce_uniqueness
|
44
|
+
self.user.activations.where('id != ?', self.id).update_all(:is_active => false)
|
45
|
+
end
|
46
|
+
|
47
|
+
def send_email
|
48
|
+
return if Rails.env.test?
|
49
|
+
if self.user_type == 'Admin'
|
50
|
+
ApplicationMailer.activation(self).deliver_now!
|
51
|
+
elsif self.user_type == 'Customer'
|
52
|
+
template = EmailTemplate.find_by(:code => 'account_activation')
|
53
|
+
email = EmailDelivery.new(:customer => self.user, :subject => template.subject, :body => template.body)
|
54
|
+
email.personalize(:customer => self.user, :activation => self)
|
55
|
+
email.save
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
class Activity < ActiveRecord::Base
|
5
|
+
|
6
|
+
belongs_to :subject, :polymorphic => true
|
7
|
+
belongs_to :object1, :polymorphic => true
|
8
|
+
belongs_to :object2, :polymorphic => true
|
9
|
+
belongs_to :story
|
10
|
+
|
11
|
+
validates_presence_of :story, :subject
|
12
|
+
|
13
|
+
default_scope -> { includes(:subject,:object1,:object2,:story).order(:created_at => :desc) }
|
14
|
+
|
15
|
+
def text=(text)
|
16
|
+
self.story = Story.find_or_initialize_by(:text => text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def subject=(object)
|
20
|
+
self.subject_type = object.class.name
|
21
|
+
self.subject_text = object.activity_text
|
22
|
+
self.subject_id = object.id
|
23
|
+
end
|
24
|
+
|
25
|
+
def object1=(object)
|
26
|
+
self.object1_type = object.class.name
|
27
|
+
self.object1_text = object.activity_text
|
28
|
+
self.object1_id = object.id
|
29
|
+
object
|
30
|
+
end
|
31
|
+
|
32
|
+
def object2=(object)
|
33
|
+
self.object2_type = object.class.name
|
34
|
+
self.object2_text = object.activity_text
|
35
|
+
self.object2_id = object.id
|
36
|
+
object
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
class Reset < ActiveRecord::Base
|
5
|
+
|
6
|
+
liquid_methods :code, :url
|
7
|
+
|
8
|
+
belongs_to :user, :polymorphic => true
|
9
|
+
|
10
|
+
validates_presence_of :user, :token
|
11
|
+
|
12
|
+
after_initialize :init, :if => Proc.new { |o| o.new_record? }
|
13
|
+
after_create :enforce_uniqueness
|
14
|
+
after_create :send_email
|
15
|
+
|
16
|
+
def claim
|
17
|
+
self.claimed_at = Time.zone.now
|
18
|
+
self.is_active = false
|
19
|
+
self.save
|
20
|
+
self.user.update_attributes(:is_active => true, :activated_at => Time.zone.now)
|
21
|
+
end
|
22
|
+
|
23
|
+
def expired?
|
24
|
+
!self.is_active
|
25
|
+
end
|
26
|
+
|
27
|
+
def url
|
28
|
+
return "#{Rails.application.config.root_url}/admin/reset/#{self.token}" if self.user_type == 'Admin'
|
29
|
+
return "#{Rails.application.config.root_url}/account/reset/#{self.token}" if self.user_type == 'Customer'
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def init
|
35
|
+
self.token ||= SecureRandom.hex(32).to_s.upcase[0,32]
|
36
|
+
self.is_active = true
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_active
|
40
|
+
self.is_active = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def enforce_uniqueness
|
44
|
+
self.user.resets.where('id != ?', self.id).update_all(:is_active => false)
|
45
|
+
end
|
46
|
+
|
47
|
+
def send_email
|
48
|
+
if self.user_type == 'Admin'
|
49
|
+
ApplicationMailer.reset(self).deliver_now!
|
50
|
+
elsif self.user_type == 'Customer'
|
51
|
+
template = EmailTemplate.find_by(:code => 'password_reset')
|
52
|
+
email = EmailDelivery.new(:customer => self.user, :subject => template.subject, :body => template.body)
|
53
|
+
email.personalize(:customer => self.user, :reset => self)
|
54
|
+
email.save
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
data/lib/backframe/railtie.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Backframe
|
2
4
|
class Railtie < ::Rails::Railtie
|
3
5
|
initializer 'backframe' do |_app|
|
@@ -6,6 +8,8 @@ module Backframe
|
|
6
8
|
ActionController::Base.send(:include, Backframe::ActsAsActivation)
|
7
9
|
ActionController::Base.send(:include, Backframe::ActsAsReset)
|
8
10
|
ActionController::Base.send(:include, Backframe::ActsAsSession)
|
11
|
+
ActiveRecord::Base.send(:include, Backframe::ActsAsActivable)
|
12
|
+
ActiveRecord::Base.send(:include, Backframe::ActsAsDistinct)
|
9
13
|
ActiveRecord::Base.send(:include, Backframe::ActsAsOrderable)
|
10
14
|
ActiveRecord::Base.send(:include, Backframe::ActsAsStatus)
|
11
15
|
ActiveRecord::Base.send(:include, Backframe::ActsAsUser)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Backframe
|
4
|
+
class ActivitySerializer < ActiveModel::Serializer
|
5
|
+
|
6
|
+
cache :key => :object
|
7
|
+
attributes :id, :subject, :story, :object1, :object2, :created_at, :updated_at
|
8
|
+
|
9
|
+
def subject
|
10
|
+
if object.subject.present?
|
11
|
+
{ :link => object.subject.activity_link, :photo => (object.subject.photo.present?) ? object.subject.photo.url(:small) : nil, :text => object.subject.full_name }
|
12
|
+
elsif object.subject_text.present?
|
13
|
+
{ :text => object.subject_text }
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def story
|
20
|
+
object.story.text
|
21
|
+
end
|
22
|
+
|
23
|
+
def object1
|
24
|
+
if object.object1.present?
|
25
|
+
{ :link => object.object1.activity_link, :entity => object.object1.activity_entity, :text => object.object1.activity_text }
|
26
|
+
elsif object.object1_text.present?
|
27
|
+
{ :text => object.object1_text }
|
28
|
+
else
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def object2
|
34
|
+
if object.object2.present?
|
35
|
+
{ :link => object.object2.activity_link, :entity => object.object2.activity_entity, :text => object.object2.activity_text }
|
36
|
+
elsif object.object2_text.present?
|
37
|
+
{ :text => object.object2_text }
|
38
|
+
else
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/backframe/version.rb
CHANGED
data/lib/backframe.rb
CHANGED
@@ -1,22 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_record/version'
|
5
|
+
require 'active_support/core_ext/module'
|
6
|
+
require 'liquid'
|
7
|
+
|
1
8
|
require 'backframe/actioncontroller/acts_as_activation'
|
2
9
|
require 'backframe/actioncontroller/acts_as_api'
|
3
10
|
require 'backframe/actioncontroller/acts_as_reset'
|
4
11
|
require 'backframe/actioncontroller/acts_as_resource'
|
5
12
|
require 'backframe/actioncontroller/acts_as_session'
|
13
|
+
require 'backframe/activerecord/acts_as_activable'
|
14
|
+
require 'backframe/activerecord/acts_as_distinct'
|
6
15
|
require 'backframe/activerecord/acts_as_orderable'
|
7
16
|
require 'backframe/activerecord/acts_as_status'
|
8
17
|
require 'backframe/activerecord/acts_as_user'
|
9
18
|
require 'backframe/activerecord/filter_sort'
|
10
19
|
require 'backframe/activerecord/migration'
|
20
|
+
require 'backframe/models/activity'
|
21
|
+
require 'backframe/models/activation'
|
22
|
+
require 'backframe/models/reset'
|
23
|
+
require 'backframe/serializers/activity_serializer'
|
11
24
|
|
12
25
|
module Backframe
|
26
|
+
|
27
|
+
extend ActiveSupport::Autoload
|
28
|
+
|
29
|
+
autoload :Activity
|
30
|
+
autoload :Activation
|
31
|
+
autoload :Reset
|
32
|
+
|
13
33
|
module Exceptions
|
14
34
|
class Unauthenticated < StandardError; end
|
15
35
|
class Unauthorized < StandardError; end
|
16
36
|
end
|
17
|
-
end
|
18
37
|
|
38
|
+
end
|
19
39
|
if defined? Rails
|
20
40
|
require 'backframe/mime'
|
21
41
|
require 'backframe/railtie'
|
22
|
-
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backframe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Kops
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-05-
|
12
|
+
date: 2016-05-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: write_xlsx
|
@@ -105,13 +105,19 @@ files:
|
|
105
105
|
- lib/backframe/actioncontroller/acts_as_resource.rb
|
106
106
|
- lib/backframe/actioncontroller/acts_as_resource/actions.rb
|
107
107
|
- lib/backframe/actioncontroller/acts_as_session.rb
|
108
|
+
- lib/backframe/activerecord/acts_as_activable.rb
|
109
|
+
- lib/backframe/activerecord/acts_as_distinct.rb
|
108
110
|
- lib/backframe/activerecord/acts_as_orderable.rb
|
109
111
|
- lib/backframe/activerecord/acts_as_status.rb
|
110
112
|
- lib/backframe/activerecord/acts_as_user.rb
|
111
113
|
- lib/backframe/activerecord/filter_sort.rb
|
112
114
|
- lib/backframe/activerecord/migration.rb
|
113
115
|
- lib/backframe/mime.rb
|
116
|
+
- lib/backframe/models/activation.rb
|
117
|
+
- lib/backframe/models/activity.rb
|
118
|
+
- lib/backframe/models/reset.rb
|
114
119
|
- lib/backframe/railtie.rb
|
120
|
+
- lib/backframe/serializers/activity_serializer.rb
|
115
121
|
- lib/backframe/version.rb
|
116
122
|
- spec/backframe/acts_as_api_spec.rb
|
117
123
|
- spec/backframe/acts_as_resource_spec.rb
|