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.
- 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 +69 -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/qalam_badge_sash.erb +20 -0
- data/lib/merit/generators/templates/qalam_sash.erb +14 -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.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,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 '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
|