• # Patch

    Posté par (site web personnel) . En réponse à l’entrée du suivi Garder une trace des bornes du karma. Évalué à 2 (+0/-0).

    Un truc comme ça, ça devrait être correct, non?

    Ça rajoute deux entrées: min_karma et max_karma
    À chaque modif du karma, on regarde si on dépasse l'une des deux bornes, et on met à jour (ou non) en conséquence.
    Dans les infos utilisateur, on affiche le karma actuel, et aussi les deux bornes jamais atteintes depuis la mise en place du système.

    Cela dit,
    1. il faut rajouter deux entrées dans la table, et je ne sais pas si c'est transparent (et automatiquement mis à 20), n'il s'il faut mettre à jour tous les karmas,
    2. les bornes sont potentiellement fausses pour les comptes anciens, puisqu'on n'a jamais sauvegardé cette information.
    3. J'ai pas testé, mais j'ai cherché "karma" dans les sources.
    4. S'il est possible dans account.rb de choisir le type integer(3*4), alors on peut tout mettre dans le même entier, et accéder à chaque champ via des masques et des décalages de bits/octets (ce qui n'est pas forcément mieux d'un point de vue génie logiciel)

    diff --git a/app/models/account.rb b/app/models/account.rb
    index c02b11a..1d7b9b4 100644
    --- a/app/models/account.rb
    +++ b/app/models/account.rb
    @@ -9,6 +9,8 @@
     # login :string(40) not null
     # role :string(10) default("visitor"), not null
     # karma :integer(4) default(20), not null
    +# min_karma :integer(4) default(20), not null
    +# max_karma :integer(4) default(20), not null
     # nb_votes :integer(4) default(0), not null
     # stylesheet :string(255)
     # email :string(255) default(""), not null
    @@ -190,8 +192,17 @@ class Account < ActiveRecord::Base
     ### Karma ###
    + def update_karma_bounds
    + if self.karma > self.max_karma then
    + self.max_karma = self.karma
    + else if self.karma < self.min_karma then
    + self.min_karma = self.karma
    + end
    + end
    +
     def daily_karma
     self.karma += $redis.get("users/#{self.user_id}/diff_karma").to_i
    + update_karma_bounds
     $redis.del("users/#{self.user_id}/diff_karma")
     self.nb_votes = [3 + karma / 10, 100].min
     save
    @@ -199,6 +210,7 @@ class Account < ActiveRecord::Base
     def give_karma(points)
     self.karma += points
    + update_karma_bounds
     save
     end
    diff --git a/app/views/users/_recent.html.haml b/app/views/users/_recent.html.haml
    index 67d3435..5c79743 100644
    --- a/app/views/users/_recent.html.haml
    +++ b/app/views/users/_recent.html.haml
    @@ -8,7 +8,7 @@
     %ul
     %li Courriel&nbsp;: #{a.email}
     %li Rôle&nbsp;: #{a.role}
    - %li Karma&nbsp;: #{a.karma}
    + %li Karma&nbsp;: #{a.karma} (minimum&nbsp;: #{a.min_karma}, maximum&nbsp;: #{a.max_karma})
     %li Dernière connexion&nbsp;: #{a.current_sign_in_at ? l(@user.account.current_sign_in_at) : "-"}
     - if current_account.can_plonk?
     %h2 Interdire de tribune
    diff --git a/db/migrate/20090505233940_create_accounts.rb b/db/migrate/20090505233940_create_accounts.rb
    index 4984a8f..68383f2 100644
    --- a/db/migrate/20090505233940_create_accounts.rb
    +++ b/db/migrate/20090505233940_create_accounts.rb
    @@ -6,6 +6,8 @@ class CreateAccounts < ActiveRecord::Migration
     t.string :login, :limit => 40, :null => false
     t.string :role, :limit => 10, :null => false, :default => 'moule'
     t.integer :karma, :null => false, :default => 20
    + t.integer :min_karma, :null => false, :default => 20
    + t.integer :max_karma, :null => false, :default => 20
     t.integer :nb_votes, :null => false, :default => 0
     t.string :stylesheet
     t.string :old_password, :limit => 20
    diff --git a/db/schema.rb b/db/schema.rb
    index 525a360..f379062 100644
    --- a/db/schema.rb
    +++ b/db/schema.rb
    @@ -32,6 +32,8 @@ ActiveRecord::Schema.define(:version => 20120428174758) do
     t.string "login", :limit => 40, :null => false
     t.string "role", :limit => 10, :default => "visitor", :null => false
     t.integer "karma", :default => 20, :null => false
    + t.integer "min_karma", :default => 20, :null => false
    + t.integer "max_karma", :default => 20, :null => false
     t.integer "nb_votes", :default => 0, :null => false
     t.string "stylesheet"
     t.string "email", :default => "", :null => false
    diff --git a/spec/factories/accounts.rb b/spec/factories/accounts.rb
    index ada429e..60465e8 100644
    --- a/spec/factories/accounts.rb
    +++ b/spec/factories/accounts.rb
    @@ -8,6 +8,8 @@
     # login :string(40) not null
     # role :string(10) default("visitor"), not null
     # karma :integer(4) default(20), not null
    +# min_karma :integer(4) default(20), not null
    +# max_karma :integer(4) default(20), not null
     # nb_votes :integer(4) default(0), not null
     # stylesheet :string(255)
     # email :string(255) default(""), not null
    diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
    index bf9275f..84cc9a9 100644
    --- a/spec/models/account_spec.rb
    +++ b/spec/models/account_spec.rb
    @@ -8,6 +8,8 @@
     # login :string(40) not null
     # role :string(10) default("visitor"), not null
     # karma :integer(4) default(20), not null
    +# min_karma :integer(4) default(20), not null
    +# max_karma :integer(4) default(20), not null
     # nb_votes :integer(4) default(0), not null
     # stylesheet :string(255)
     # email :string(255) default(""), not null