qalam_merit 4.0.35

Sign up to get free protection for your applications and to get access to all the features.
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 +49 -0
  32. data/lib/merit/generators/templates/badge_sash.erb +21 -0
  33. data/lib/merit/generators/templates/merit.erb +18 -0
  34. data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
  35. data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
  36. data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
  37. data/lib/merit/generators/templates/sash.erb +15 -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.references :user, limit: 8, foreign_key: true, index: true, null: true
11
+ t.references :root_account, foreign_key: { to_table: 'accounts'}, limit: 8, null: false, index: true
12
+
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 'sash.erb', 'app/models/merit/sash.rb'
13
+ sleep 1.1
14
+ template 'badge.erb', 'app/models/merit/badge.rb'
15
+ sleep 1.1
16
+ template 'badge_sash.erb', 'app/models/merit/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::Sash'\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,49 @@
1
+ ### QALAM_MERIT ###
2
+ class Merit::Badge < ApplicationRecord
3
+ self.table_name = "merit_badges"
4
+
5
+ validates :name, presence: true, length: { minimum: 3 }
6
+ validates :points, numericality: true, :inclusion => 1..20
7
+ validates :description, presence: false, length: { maximum: 50 }
8
+
9
+ has_one :image, :class_name => 'Attachment', :as => :context, :inverse_of => :context, :dependent => :destroy
10
+ belongs_to :root_account, foreign_key: "root_account_id", class_name: 'Account'
11
+ belongs_to :created_by, foreign_key: "user_id", class_name: 'User'
12
+ has_many :badges_sashes, class_name: 'Merit::BadgeSash'
13
+ has_many :sashes, through: :badges_sashes, source: :sash
14
+
15
+ class << self
16
+ def find_by_id(ids)
17
+ ids = Array.wrap(ids)
18
+ find { |b| ids.include? b[:id] }
19
+ end
20
+
21
+ def by_name(name)
22
+ find { |b| b.name.to_s == name.to_s }
23
+ end
24
+
25
+ def by_level(level)
26
+ find { |b| b.level.to_s == level.to_s }
27
+ end
28
+
29
+ def find_by_name_and_level(name, level)
30
+ badge = Merit::Badge.by_name(name)
31
+ badge = badge.by_level(level) unless level.nil?
32
+ if badge.nil?
33
+ str = "No badge '#{name}' found. Define it in initializers/merit.rb"
34
+ fail ::Merit::BadgeNotFound, str
35
+ end
36
+ badge
37
+ end
38
+
39
+ # Defines Badge#meritable_models method, to get related
40
+ # entries with certain badge. For instance, Badge.find(3).users
41
+ # orm-specified
42
+ def _define_related_entries_method(meritable_class_name)
43
+ define_method(:"#{meritable_class_name.underscore.pluralize}") do
44
+ sashes = Merit::BadgeSash.where(badge_id: id).pluck(:sash_id)
45
+ meritable_class_name.constantize.where(sash_id: sashes)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ ### QALAM_MERIT ###
2
+ class Merit::BadgeSash < ApplicationRecord
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::Sash'
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::BadgeSash.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
21
+
@@ -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,15 @@
1
+ ### QALAM_MERIT ###
2
+ class Merit::Sash < ApplicationRecord
3
+ self.table_name = "sashes"
4
+ has_many :badges_sashes, class_name: 'Merit::BadgeSash'
5
+ has_many :badges, through: :badges_sashes, source: :badge
6
+
7
+ class << self
8
+ def user(sash_id = nil)
9
+ return [] unless sash_id
10
+
11
+ User.where(sash_id: sash_id)
12
+ end
13
+ end
14
+ end
15
+