qalam_merit 4.0.35
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +358 -0
- data/RELEASING.md +16 -0
- data/Rakefile +44 -0
- data/TESTING.txt +12 -0
- data/config/locales/en.yml +5 -0
- data/lib/merit.rb +95 -0
- data/lib/merit/badge_rules_methods.rb +30 -0
- data/lib/merit/base_target_finder.rb +31 -0
- data/lib/merit/class_methods.rb +41 -0
- data/lib/merit/controller_extensions.rb +71 -0
- data/lib/merit/generators/active_record/install_generator.rb +40 -0
- data/lib/merit/generators/active_record/merit_generator.rb +25 -0
- data/lib/merit/generators/active_record/remove_generator.rb +30 -0
- data/lib/merit/generators/active_record/templates/add_merit_fields_to_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/create_badges_sashes.erb +14 -0
- data/lib/merit/generators/active_record/templates/create_merit_actions.erb +16 -0
- data/lib/merit/generators/active_record/templates/create_merit_activity_logs.erb +12 -0
- data/lib/merit/generators/active_record/templates/create_merit_badges.erb +17 -0
- data/lib/merit/generators/active_record/templates/create_sashes.erb +8 -0
- data/lib/merit/generators/active_record/templates/create_scores_and_points.erb +16 -0
- data/lib/merit/generators/active_record/templates/remove_merit_fields_from_model.erb +7 -0
- data/lib/merit/generators/active_record/templates/remove_merit_tables.erb +12 -0
- data/lib/merit/generators/install_generator.rb +30 -0
- data/lib/merit/generators/merit_generator.rb +33 -0
- data/lib/merit/generators/remove_generator.rb +23 -0
- data/lib/merit/generators/templates/badge.erb +49 -0
- data/lib/merit/generators/templates/badge_sash.erb +21 -0
- data/lib/merit/generators/templates/merit.erb +18 -0
- data/lib/merit/generators/templates/merit_badge_rules.erb +50 -0
- data/lib/merit/generators/templates/merit_point_rules.erb +31 -0
- data/lib/merit/generators/templates/merit_rank_rules.erb +32 -0
- data/lib/merit/generators/templates/sash.erb +15 -0
- data/lib/merit/judge.rb +102 -0
- data/lib/merit/models/action_concern.rb +50 -0
- data/lib/merit/models/active_record/action.rb +11 -0
- data/lib/merit/models/active_record/activity_log.rb +11 -0
- data/lib/merit/models/active_record/badges_sash.rb +13 -0
- data/lib/merit/models/active_record/sash.rb +32 -0
- data/lib/merit/models/active_record/score.rb +25 -0
- data/lib/merit/models/badges_sash_concern.rb +13 -0
- data/lib/merit/models/base/badges_sash.rb +15 -0
- data/lib/merit/models/base/sash.rb +55 -0
- data/lib/merit/models/sash_concern.rb +53 -0
- data/lib/merit/point_rules_methods.rb +33 -0
- data/lib/merit/rank_rules_methods.rb +58 -0
- data/lib/merit/reputation_change_observer.rb +19 -0
- data/lib/merit/rule.rb +35 -0
- data/lib/merit/rules_matcher.rb +24 -0
- data/lib/merit/sash_finder.rb +15 -0
- data/lib/merit/target_finder.rb +43 -0
- data/qalam_merit.gemspec +23 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/admin/users_controller.rb +9 -0
- data/test/dummy/app/controllers/api/comments_controller.rb +5 -0
- data/test/dummy/app/controllers/api/users_controller.rb +5 -0
- data/test/dummy/app/controllers/application_controller.rb +7 -0
- data/test/dummy/app/controllers/comments_controller.rb +56 -0
- data/test/dummy/app/controllers/registrations_controller.rb +21 -0
- data/test/dummy/app/controllers/users_controller.rb +38 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/address.rb +3 -0
- data/test/dummy/app/models/comment.rb +13 -0
- data/test/dummy/app/models/dummy_observer.rb +3 -0
- data/test/dummy/app/models/merit/badge_rules.rb +66 -0
- data/test/dummy/app/models/merit/point_rules.rb +44 -0
- data/test/dummy/app/models/merit/rank_rules.rb +24 -0
- data/test/dummy/app/models/user.rb +23 -0
- data/test/dummy/app/views/admin/users/index.html.erb +26 -0
- data/test/dummy/app/views/comments/_form.html.erb +29 -0
- data/test/dummy/app/views/comments/edit.html.erb +6 -0
- data/test/dummy/app/views/comments/index.html.erb +35 -0
- data/test/dummy/app/views/comments/new.html.erb +5 -0
- data/test/dummy/app/views/comments/show.html.erb +23 -0
- data/test/dummy/app/views/layouts/application.html.erb +24 -0
- data/test/dummy/app/views/users/_form.html.erb +22 -0
- data/test/dummy/app/views/users/edit.html.erb +6 -0
- data/test/dummy/app/views/users/index.html.erb +27 -0
- data/test/dummy/app/views/users/new.html.erb +5 -0
- data/test/dummy/app/views/users/show.html.erb +18 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/application_api_only.rb +28 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +22 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environment_api_only.rb +7 -0
- data/test/dummy/config/environments/development.rb +24 -0
- data/test/dummy/config/environments/production.rb +51 -0
- data/test/dummy/config/environments/test.rb +36 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/merit.rb +47 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +3 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/mongoid.yml +13 -0
- data/test/dummy/config/routes.rb +16 -0
- data/test/dummy/db/migrate/20110421191249_create_users.rb +12 -0
- data/test/dummy/db/migrate/20110421191250_create_comments.rb +16 -0
- data/test/dummy/db/migrate/20120318022220_add_fields_to_users.rb +11 -0
- data/test/dummy/db/migrate/20130321082817_add_fields_to_comments.rb +11 -0
- data/test/dummy/db/migrate/20130329224406_create_merit_actions.rb +18 -0
- data/test/dummy/db/migrate/20130329224407_create_merit_activity_logs.rb +15 -0
- data/test/dummy/db/migrate/20130329224408_create_sashes.rb +11 -0
- data/test/dummy/db/migrate/20130329224409_create_badges_sashes.rb +16 -0
- data/test/dummy/db/migrate/20130329224410_create_scores_and_points.rb +20 -0
- data/test/dummy/db/migrate/20140211144001_create_addresses.rb +11 -0
- data/test/dummy/db/migrate/20140819133931_add_target_data_to_merit_actions.rb +5 -0
- data/test/dummy/db/schema.rb +89 -0
- data/test/dummy/db/seeds.rb +19 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/rails.js +404 -0
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/public/stylesheets/scaffold.css +56 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +332 -0
- data/test/support/integration_case.rb +5 -0
- data/test/test_helper.rb +40 -0
- data/test/unit/action_test.rb +12 -0
- data/test/unit/base_target_finder_test.rb +64 -0
- data/test/unit/merit_unit_test.rb +33 -0
- data/test/unit/rule_unit_test.rb +57 -0
- data/test/unit/rules_matcher_test.rb +37 -0
- data/test/unit/sash_finder_test.rb +27 -0
- data/test/unit/sash_test.rb +104 -0
- data/test/unit/score_test.rb +13 -0
- data/test/unit/target_finder_test.rb +98 -0
- metadata +360 -0
@@ -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,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,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
|
+
|