Commit f4395fae01a6b86eb06123e8317e5cba95312f8c
1 parent
34043d4f
Exists in
master
and in
29 other branches
ActionItem78: generating unique codes for tasks
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@636 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
3 changed files
with
40 additions
and
3 deletions
Show diff stats
app/models/task.rb
| ... | ... | @@ -24,11 +24,23 @@ class Task < ActiveRecord::Base |
| 24 | 24 | belongs_to :requestor, :class_name => 'Person', :foreign_key => :requestor_id |
| 25 | 25 | belongs_to :target, :class_name => 'Profile', :foreign_key => :target_id |
| 26 | 26 | |
| 27 | + validates_uniqueness_of :code | |
| 28 | + validates_presence_of :code | |
| 29 | + | |
| 27 | 30 | def initialize(*args) |
| 28 | 31 | super |
| 29 | 32 | self.status ||= Task::Status::ACTIVE |
| 30 | 33 | end |
| 31 | 34 | |
| 35 | + before_validation_on_create do |task| | |
| 36 | + if task.code.nil? | |
| 37 | + task.code = Task.generate_code | |
| 38 | + while (Task.find_by_code(task.code)) | |
| 39 | + task.code = Task.generate_code | |
| 40 | + end | |
| 41 | + end | |
| 42 | + end | |
| 43 | + | |
| 32 | 44 | after_create do |task| |
| 33 | 45 | TaskMailer.deliver_task_created(task) |
| 34 | 46 | end |
| ... | ... | @@ -95,4 +107,15 @@ class Task < ActiveRecord::Base |
| 95 | 107 | def perform |
| 96 | 108 | end |
| 97 | 109 | |
| 110 | + class << self | |
| 111 | + def generate_code | |
| 112 | + chars = ('a'..'z').to_a + ('0'..'9').to_a | |
| 113 | + code = "" | |
| 114 | + chars.size.times do |n| | |
| 115 | + code << chars[rand(chars.size)] | |
| 116 | + end | |
| 117 | + code | |
| 118 | + end | |
| 119 | + end | |
| 120 | + | |
| 98 | 121 | end | ... | ... |
db/migrate/017_create_tasks.rb
test/unit/task_test.rb
| ... | ... | @@ -88,9 +88,23 @@ class TaskTest < Test::Unit::TestCase |
| 88 | 88 | task.save! |
| 89 | 89 | end |
| 90 | 90 | |
| 91 | - should 'generate a random hash when creating' do | |
| 92 | - flunk 'not implemented yet' | |
| 91 | + should 'generate a random code before validation' do | |
| 92 | + Task.expects(:generate_code) | |
| 93 | + Task.new.valid? | |
| 93 | 94 | end |
| 94 | 95 | |
| 96 | + should 'make sure that codes are unique' do | |
| 97 | + task1 = Task.create! | |
| 98 | + task2 = Task.new(:code => task1.code) | |
| 99 | + | |
| 100 | + assert !task2.valid? | |
| 101 | + assert task2.errors.invalid?(:code) | |
| 102 | + end | |
| 103 | + | |
| 104 | + should 'generate a code with chars from a-z and 0-9' do | |
| 105 | + code = Task.generate_code | |
| 106 | + assert(code =~ /^[a-z0-9]+$/) | |
| 107 | + assert_equal 36, code.size | |
| 108 | + end | |
| 95 | 109 | |
| 96 | 110 | end | ... | ... |