qalam_merit 4.0.4

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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +84 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +358 -0
  7. data/RELEASING.md +16 -0
  8. data/Rakefile +44 -0
  9. data/TESTING.txt +12 -0
  10. data/config/locales/en.yml +5 -0
  11. data/lib/merit.rb +95 -0
  12. data/lib/merit/badge_rules_methods.rb +30 -0
  13. data/lib/merit/base_target_finder.rb +31 -0
  14. data/lib/merit/class_methods.rb +41 -0
  15. data/lib/merit/controller_extensions.rb +71 -0
  16. data/lib/merit/generators/active_record/install_generator.rb +40 -0
  17. data/lib/merit/generators/active_record/merit_generator.rb +25 -0
  18. data/lib/merit/generators/active_record/remove_generator.rb +30 -0
  19. data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
  20. data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
  21. data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
  22. data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
  23. data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
  24. data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
  25. data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
  26. data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
  27. data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
  28. data/lib/merit/generators/install_generator.rb +30 -0
  29. data/lib/merit/generators/merit_generator.rb +33 -0
  30. data/lib/merit/generators/remove_generator.rb +23 -0
  31. data/lib/merit/generators/templates/badge.erb +69 -0
  32. data/lib/merit/generators/templates/merit.erb +18 -0
  33. data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
  34. data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
  35. data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
  36. data/lib/merit/generators/templates/qalam_badge_sash.erb +20 -0
  37. data/lib/merit/generators/templates/qalam_sash.erb +14 -0
  38. data/lib/merit/judge.rb +102 -0
  39. data/lib/merit/models/action_concern.rb +50 -0
  40. data/lib/merit/models/active_record/action.rb +11 -0
  41. data/lib/merit/models/active_record/activity_log.rb +11 -0
  42. data/lib/merit/models/active_record/badges_sash.rb +13 -0
  43. data/lib/merit/models/active_record/sash.rb +32 -0
  44. data/lib/merit/models/active_record/score.rb +25 -0
  45. data/lib/merit/models/badges_sash_concern.rb +13 -0
  46. data/lib/merit/models/base/badges_sash.rb +15 -0
  47. data/lib/merit/models/base/sash.rb +55 -0
  48. data/lib/merit/models/sash_concern.rb +53 -0
  49. data/lib/merit/point_rules_methods.rb +33 -0
  50. data/lib/merit/rank_rules_methods.rb +58 -0
  51. data/lib/merit/reputation_change_observer.rb +19 -0
  52. data/lib/merit/rule.rb +35 -0
  53. data/lib/merit/rules_matcher.rb +24 -0
  54. data/lib/merit/sash_finder.rb +15 -0
  55. data/lib/merit/target_finder.rb +43 -0
  56. data/qalam_merit.gemspec +23 -0
  57. data/test/dummy/Rakefile +7 -0
  58. data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
  59. data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
  60. data/test/dummy/app/controllers/api/users_controller.rb +5 -0
  61. data/test/dummy/app/controllers/application_controller.rb +7 -0
  62. data/test/dummy/app/controllers/comments_controller.rb +56 -0
  63. data/test/dummy/app/controllers/registrations_controller.rb +21 -0
  64. data/test/dummy/app/controllers/users_controller.rb +38 -0
  65. data/test/dummy/app/helpers/application_helper.rb +2 -0
  66. data/test/dummy/app/models/address.rb +3 -0
  67. data/test/dummy/app/models/comment.rb +13 -0
  68. data/test/dummy/app/models/dummy_observer.rb +3 -0
  69. data/test/dummy/app/models/merit/badge_rules.rb +66 -0
  70. data/test/dummy/app/models/merit/point_rules.rb +44 -0
  71. data/test/dummy/app/models/merit/rank_rules.rb +24 -0
  72. data/test/dummy/app/models/user.rb +23 -0
  73. data/test/dummy/app/views/admin/users/index.html.erb +26 -0
  74. data/test/dummy/app/views/comments/_form.html.erb +29 -0
  75. data/test/dummy/app/views/comments/edit.html.erb +6 -0
  76. data/test/dummy/app/views/comments/index.html.erb +35 -0
  77. data/test/dummy/app/views/comments/new.html.erb +5 -0
  78. data/test/dummy/app/views/comments/show.html.erb +23 -0
  79. data/test/dummy/app/views/layouts/application.html.erb +24 -0
  80. data/test/dummy/app/views/users/_form.html.erb +22 -0
  81. data/test/dummy/app/views/users/edit.html.erb +6 -0
  82. data/test/dummy/app/views/users/index.html.erb +27 -0
  83. data/test/dummy/app/views/users/new.html.erb +5 -0
  84. data/test/dummy/app/views/users/show.html.erb +18 -0
  85. data/test/dummy/config.ru +4 -0
  86. data/test/dummy/config/application.rb +26 -0
  87. data/test/dummy/config/application_api_only.rb +28 -0
  88. data/test/dummy/config/boot.rb +10 -0
  89. data/test/dummy/config/database.yml +22 -0
  90. data/test/dummy/config/environment.rb +5 -0
  91. data/test/dummy/config/environment_api_only.rb +7 -0
  92. data/test/dummy/config/environments/development.rb +24 -0
  93. data/test/dummy/config/environments/production.rb +51 -0
  94. data/test/dummy/config/environments/test.rb +36 -0
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  96. data/test/dummy/config/initializers/inflections.rb +10 -0
  97. data/test/dummy/config/initializers/merit.rb +47 -0
  98. data/test/dummy/config/initializers/mime_types.rb +5 -0
  99. data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
  100. data/test/dummy/config/initializers/secret_token.rb +12 -0
  101. data/test/dummy/config/initializers/session_store.rb +8 -0
  102. data/test/dummy/config/locales/en.yml +5 -0
  103. data/test/dummy/config/mongoid.yml +13 -0
  104. data/test/dummy/config/routes.rb +16 -0
  105. data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
  106. data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
  107. data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
  108. data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
  109. data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
  110. data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
  111. data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
  112. data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
  113. data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
  114. data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
  115. data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
  116. data/test/dummy/db/schema.rb +89 -0
  117. data/test/dummy/db/seeds.rb +19 -0
  118. data/test/dummy/public/404.html +26 -0
  119. data/test/dummy/public/422.html +26 -0
  120. data/test/dummy/public/500.html +26 -0
  121. data/test/dummy/public/favicon.ico +0 -0
  122. data/test/dummy/public/rails.js +404 -0
  123. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  124. data/test/dummy/public/stylesheets/scaffold.css +56 -0
  125. data/test/dummy/script/rails +6 -0
  126. data/test/integration/navigation_test.rb +332 -0
  127. data/test/support/integration_case.rb +5 -0
  128. data/test/test_helper.rb +40 -0
  129. data/test/unit/action_test.rb +12 -0
  130. data/test/unit/base_target_finder_test.rb +64 -0
  131. data/test/unit/merit_unit_test.rb +33 -0
  132. data/test/unit/rule_unit_test.rb +57 -0
  133. data/test/unit/rules_matcher_test.rb +37 -0
  134. data/test/unit/sash_finder_test.rb +27 -0
  135. data/test/unit/sash_test.rb +104 -0
  136. data/test/unit/score_test.rb +13 -0
  137. data/test/unit/target_finder_test.rb +98 -0
  138. metadata +360 -0
@@ -0,0 +1,7 @@
1
+ ### QALAM_MERIT ###
2
+ class AddMeritFieldsTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ add_column :<%= table_name %>, :sash_id, :integer
5
+ add_column :<%= table_name %>, :level, :integer, :default => 0
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateBadgesSashes < ActiveRecord::Migration<%= migration_version %>
3
+ def self.up
4
+ create_table :badges_sashes do |t|
5
+ t.references :badge, limit: 8, foreign_key: { to_table: 'merit_badges'}, index: true, null: true
6
+ t.references :sash, limit: 8, foreign_key: true, index: true, null: true
7
+ t.datetime :created_at
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :badges_sashes
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateMeritActions < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ create_table :merit_actions do |t|
5
+ t.integer :user_id
6
+ t.string :action_method
7
+ t.integer :action_value
8
+ t.boolean :had_errors, default: false
9
+ t.string :target_model
10
+ t.integer :target_id
11
+ t.text :target_data
12
+ t.boolean :processed, default: false
13
+ t.timestamps null: false
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateMeritActivityLogs < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ create_table :merit_activity_logs do |t|
5
+ t.integer :action_id
6
+ t.string :related_change_type
7
+ t.integer :related_change_id
8
+ t.string :description
9
+ t.datetime :created_at
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateMeritBadges < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ create_table :merit_badges do |t|
5
+ t.string :name
6
+ t.integer :level, default: 1
7
+ t.integer :points, default: 0
8
+ t.text :description
9
+ t.string :difficulty
10
+ t.boolean :active, default: true
11
+ t.references :user, limit: 8, foreign_key: true, index: true, null: true
12
+ t.references :root_account, foreign_key: { to_table: 'accounts'}, limit: 8, null: false, index: true
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateSashes < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ create_table :sashes do |t|
5
+ t.timestamps null: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ ### QALAM_MERIT ###
2
+ class CreateScoresAndPoints < ActiveRecord::Migration<%= migration_version %>
3
+ def change
4
+ create_table :merit_scores do |t|
5
+ t.references :sash
6
+ t.string :category, default: 'default'
7
+ end
8
+
9
+ create_table :merit_score_points do |t|
10
+ t.references :score
11
+ t.bigint :num_points, default: 0
12
+ t.string :log
13
+ t.datetime :created_at
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ ### QALAM_MERIT ###
2
+ class RemoveMeritFieldsFrom<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
3
+ def self.up
4
+ remove_column :<%= table_name %>, :sash_id
5
+ remove_column :<%= table_name %>, :level
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ ### QALAM_MERIT ###
2
+ class RemoveMeritTables < ActiveRecord::Migration<%= migration_version %>
3
+ def self.up
4
+ drop_table :merit_actions
5
+ drop_table :merit_activity_logs
6
+ drop_table :badges_sashes
7
+ drop_table :merit_badges
8
+ drop_table :sashes
9
+ drop_table :merit_scores
10
+ drop_table :merit_score_points
11
+ end
12
+ end
@@ -0,0 +1,30 @@
1
+ require "rails/generators"
2
+
3
+ module Merit
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ desc 'Copy config and rules files'
9
+ def copy_migrations_and_model
10
+ template 'merit.erb', 'config/initializers/merit.rb'
11
+ sleep 1.1
12
+ template 'qalam_sash.erb', 'app/models/merit/qalam_sash.rb'
13
+ sleep 1.1
14
+ template 'badge.erb', 'app/models/merit/badge.rb'
15
+ sleep 1.1
16
+ template 'qalam_badge_sash.erb', 'app/models/merit/qalam_badge_sash.rb'
17
+ sleep 1.1
18
+ template 'merit_badge_rules.erb', 'app/models/merit/badge_rules.rb'
19
+ sleep 1.1
20
+ template 'merit_point_rules.erb', 'app/models/merit/point_rules.rb'
21
+ sleep 1.1
22
+ template 'merit_rank_rules.erb', 'app/models/merit/rank_rules.rb'
23
+ end
24
+
25
+ def run_active_record_generators
26
+ invoke 'merit:active_record:install'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ require "rails/generators"
2
+
3
+ module Merit
4
+ module Generators
5
+ class MeritGenerator < ::Rails::Generators::NamedBase
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def inject_merit_content
9
+ if model_exists?
10
+ inject_into_class(model_path, class_name, " ### END ###\n\n")
11
+ inject_into_class(model_path, class_name, " has_many :created_badges, class_name: 'Merit::Badge'\n")
12
+ inject_into_class(model_path, class_name, " belongs_to :sash, foreign_key: 'sash_id', class_name: 'Merit::QalamSash'\n")
13
+ inject_into_class(model_path, class_name, " has_merit\n")
14
+ inject_into_class(model_path, class_name, " ### QALAM_MERIT ###\n")
15
+ end
16
+ end
17
+
18
+ def run_active_record_generators
19
+ invoke 'merit:active_record:merit'
20
+ end
21
+
22
+ private
23
+
24
+ def model_exists?
25
+ File.exist? File.join(destination_root, model_path)
26
+ end
27
+
28
+ def model_path
29
+ @model_path ||= File.join('app', 'models', "#{file_path}.rb")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ require "rails/generators"
2
+
3
+ module Merit
4
+ module Generators
5
+ class RemoveGenerator < ::Rails::Generators::NamedBase
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def run_active_record_generators
9
+ invoke 'merit:active_record:remove'
10
+ end
11
+
12
+ private
13
+
14
+ def model_exists?
15
+ File.exist? File.join(destination_root, model_path)
16
+ end
17
+
18
+ def model_path
19
+ @model_path ||= File.join('app', 'models', "#{file_path}.rb")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,69 @@
1
+ ### QALAM_MERIT ###
2
+ class Merit::Badge < ActiveRecord::Base
3
+ self.table_name = "merit_badges"
4
+
5
+ before_validation :strip_whitespace
6
+ def strip_whitespace
7
+ self.name = self.name.strip unless self.name.nil?
8
+ self.description = self.description.strip unless self.description.nil?
9
+ end
10
+
11
+ validates :root_account_id, presence: true
12
+ validates :name, presence: true, length: { minimum: 3, maximum: 10 }
13
+ validates :points, presence: true, numericality: true, :inclusion => 1..100
14
+ validates :description, presence: false, length: { maximum: 50 }
15
+
16
+ has_one :image, :class_name => 'Attachment', :as => :context, :inverse_of => :context, :dependent => :destroy
17
+ belongs_to :root_account, foreign_key: "root_account_id", class_name: 'Account'
18
+ belongs_to :created_by, foreign_key: "user_id", class_name: 'User'
19
+ has_many :badges_sashes, class_name: 'Merit::QalamBadgeSash'
20
+ has_many :sashes, through: :badges_sashes, source: :sash
21
+
22
+ def image_url
23
+ # self.image.public_url if self.image
24
+ end
25
+
26
+ class << self
27
+ def find_by_id(ids)
28
+ ids = Array.wrap(ids)
29
+ find { |b| ids.include? b[:id] }
30
+ end
31
+
32
+ def by_name(name)
33
+ find { |b| b.name.to_s == name.to_s }
34
+ end
35
+
36
+ def by_level(level)
37
+ find { |b| b.level.to_s == level.to_s }
38
+ end
39
+
40
+ def find_by_name_and_level(name, level)
41
+ badge = Merit::Badge.by_name(name)
42
+ badge = badge.by_level(level) unless level.nil?
43
+ if badge.nil?
44
+ str = "No badge '#{name}' found. Define it in initializers/merit.rb"
45
+ fail ::Merit::BadgeNotFound, str
46
+ end
47
+ badge
48
+ end
49
+
50
+ # Defines Badge#meritable_models method, to get related
51
+ # entries with certain badge. For instance, Badge.find(3).users
52
+ # orm-specified
53
+ def _define_related_entries_method(meritable_class_name)
54
+ define_method(:"#{meritable_class_name.underscore.pluralize}") do
55
+ sashes = Merit::QalamBadgeSash.where(badge_id: id).pluck(:sash_id)
56
+ meritable_class_name.constantize.where(sash_id: sashes)
57
+ end
58
+ end
59
+
60
+ def create_with_attachment(account, badge, attachment)
61
+ account.shard.activate do
62
+ att = Attachment.create_data_attachment(badge, attachment)
63
+ badge.image = att
64
+ badge.save!
65
+ badge
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,18 @@
1
+ ### QALAM_MERIT ###
2
+ # Use this hook to configure merit parameters
3
+ Merit.setup do |config|
4
+ # Check rules on each request or in background
5
+ # config.checks_on_each_request = true
6
+
7
+ # Add application observers to get notifications when reputation changes.
8
+ # config.add_observer 'MyObserverClassName'
9
+
10
+ # Define :user_model_name. This model will be used to grant badge if no
11
+ # `:to` option is given. Default is 'User'.
12
+ # config.user_model_name = 'User'
13
+
14
+ # Define :current_user_method. Similar to previous option. It will be used
15
+ # to retrieve :user_model_name object if no `:to` option is given. Default
16
+ # is "current_#{user_model_name.downcase}".
17
+ # config.current_user_method = 'current_user'
18
+ end
@@ -0,0 +1,50 @@
1
+ ### QALAM_MERIT ###
2
+ # Be sure to restart your server when you modify this file.
3
+ #
4
+ # +grant_on+ accepts:
5
+ # * Nothing (always grants)
6
+ # * A block which evaluates to boolean (recieves the object as parameter)
7
+ # * A block with a hash composed of methods to run on the target object with
8
+ # expected values (+votes: 5+ for instance).
9
+ #
10
+ # +grant_on+ can have a +:to+ method name, which called over the target object
11
+ # should retrieve the object to badge (could be +:user+, +:self+, +:follower+,
12
+ # etc). If it's not defined merit will apply the badge to the user who
13
+ # triggered the action (:action_user by default). If it's :itself, it badges
14
+ # the created object (new user for instance).
15
+ #
16
+ # The :temporary option indicates that if the condition doesn't hold but the
17
+ # badge is granted, then it's removed. It's false by default (badges are kept
18
+ # forever).
19
+
20
+ module Merit
21
+ class BadgeRules
22
+ include Merit::BadgeRulesMethods
23
+
24
+ def initialize
25
+ # If it creates user, grant badge
26
+ # Should be "current_user" after registration for badge to be granted.
27
+ # Find badge by badge_id, badge_id takes presidence over badge
28
+ # grant_on 'users#create', badge_id: 7, badge: 'just-registered', to: :itself
29
+
30
+ # If it has 10 comments, grant commenter-10 badge
31
+ # grant_on 'comments#create', badge: 'commenter', level: 10 do |comment|
32
+ # comment.user.comments.count == 10
33
+ # end
34
+
35
+ # If it has 5 votes, grant relevant-commenter badge
36
+ # grant_on 'comments#vote', badge: 'relevant-commenter',
37
+ # to: :user do |comment|
38
+ #
39
+ # comment.votes.count == 5
40
+ # end
41
+
42
+ # Changes his name by one wider than 4 chars (arbitrary ruby code case)
43
+ # grant_on 'registrations#update', badge: 'autobiographer',
44
+ # temporary: true, model_name: 'User' do |user|
45
+ #
46
+ # user.name.length > 4
47
+ # end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ ### QALAM_MERIT ###
2
+ # Be sure to restart your server when you modify this file.
3
+ #
4
+ # Points are a simple integer value which are given to "meritable" resources
5
+ # according to rules in +app/models/merit/point_rules.rb+. They are given on
6
+ # actions-triggered, either to the action user or to the method (or array of
7
+ # methods) defined in the +:to+ option.
8
+ #
9
+ # 'score' method may accept a block which evaluates to boolean
10
+ # (recieves the object as parameter)
11
+
12
+ module Merit
13
+ class PointRules
14
+ include Merit::PointRulesMethods
15
+
16
+ def initialize
17
+ # score 10, :on => 'users#create' do |user|
18
+ # user.bio.present?
19
+ # end
20
+ #
21
+ # score 15, :on => 'reviews#create', :to => [:reviewer, :reviewed]
22
+ #
23
+ # score 20, :on => [
24
+ # 'comments#create',
25
+ # 'photos#create'
26
+ # ]
27
+ #
28
+ # score -10, :on => 'comments#destroy'
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ ### QALAM_MERIT ###
2
+ # Be sure to restart your server when you modify this file.
3
+ #
4
+ # 5 stars is a common ranking use case. They are not given at specified
5
+ # actions like badges, you should define a cron job to test if ranks are to be
6
+ # granted.
7
+ #
8
+ # +set_rank+ accepts:
9
+ # * :+level+ ranking level (greater is better)
10
+ # * :+to+ model or scope to check if new rankings apply
11
+ # * :+level_name+ attribute name (default is empty and results in 'level'
12
+ # attribute, if set it's appended like 'level_#{level_name}')
13
+
14
+ module Merit
15
+ class RankRules
16
+ include Merit::RankRulesMethods
17
+
18
+ def initialize
19
+ # set_rank :level => 1, :to => Commiter.active do |commiter|
20
+ # commiter.repositories.count > 1 && commiter.followers >= 10
21
+ # end
22
+ #
23
+ # set_rank :level => 2, :to => Commiter.active do |commiter|
24
+ # commiter.branches.count > 1 && commiter.followers >= 10
25
+ # end
26
+ #
27
+ # set_rank :level => 3, :to => Commiter.active do |commiter|
28
+ # commiter.branches.count > 2 && commiter.followers >= 20
29
+ # end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ ### QALAM_MERIT ###
2
+ class Merit::QalamBadgeSash < ActiveRecord::Base
3
+ self.table_name = "badges_sashes"
4
+ belongs_to :badge, foreign_key: "badge_id", class_name: 'Merit::Badge'
5
+ belongs_to :sash, foreign_key: "sash_id", class_name: 'Merit::QalamSash'
6
+ # has_many :users, through: :sash, source: :users
7
+
8
+ class << self
9
+ def user(badge_sash_id = nil)
10
+ return [] unless badge_sash_id
11
+
12
+ return [] unless badge_sash = Merit::QalamBBadgeSash.find(badge_sash_id)
13
+ sash = badge_sash.sash
14
+
15
+ return [] unless sash && sash.id && sash_id = sash.id
16
+
17
+ User.where(sash_id: sash_id)
18
+ end
19
+ end
20
+ end