]> source.dussan.org Git - redmine.git/commitdiff
Accept the following formats for the timelog "hours" field: 1h, 1 h, 1 hour, 2 hours...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 2 Apr 2008 19:52:12 +0000 (19:52 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 2 Apr 2008 19:52:12 +0000 (19:52 +0000)
Also accept 1,5 for 1.5 hour (closes #975). Note that 1.5 is still equal to 1h30 and not 1h50 (#947).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1320 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/time_entry.rb
test/unit/time_entry_test.rb [new file with mode: 0644]

index bcf6d1223c9192ee68b9dcdab8b04e052306d834..0dce253c7f4539561bc452908b6411ac80e4be6f 100644 (file)
@@ -1,5 +1,5 @@
 # redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Copyright (C) 2006-2008  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -39,6 +39,22 @@ class TimeEntry < ActiveRecord::Base
     errors.add :issue_id, :activerecord_error_invalid if (issue_id && !issue) || (issue && project!=issue.project)
   end
   
+  def hours=(h)
+    s = h.dup
+    if s.is_a?(String)
+      s.strip!
+      unless s =~ %r{^[\d\.,]+$}
+        # 2:30 => 2.5
+        s.gsub!(%r{^(\d+):(\d+)$}) { $1.to_i + $2.to_i / 60.0 }
+        # 2h30, 2h, 30m
+        s.gsub!(%r{^((\d+)\s*(h|hours?))?\s*((\d+)\s*(m|min)?)?$}) { |m| ($1 || $4) ? ($2.to_i + $5.to_i / 60.0) : m[0] }
+      end
+      # 2,5 => 2.5
+      s.gsub!(',', '.')
+    end
+    write_attribute :hours, s
+  end
+  
   # tyear, tmonth, tweek assigned where setting spent_on attributes
   # these attributes make time aggregations easier
   def spent_on=(date)
diff --git a/test/unit/time_entry_test.rb b/test/unit/time_entry_test.rb
new file mode 100644 (file)
index 0000000..f86e42e
--- /dev/null
@@ -0,0 +1,46 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class TimeEntryTest < Test::Unit::TestCase
+  fixtures :issues, :projects, :users, :time_entries
+
+  def test_hours_format
+    assertions = { "2"      => 2.0,
+                   "21.1"   => 21.1,
+                   "2,1"    => 2.1,
+                   "7:12"   => 7.2,
+                   "10h"    => 10.0,
+                   "10 h"   => 10.0,
+                   "45m"    => 0.75,
+                   "45 m"   => 0.75,
+                   "3h15"   => 3.25,
+                   "3h 15"  => 3.25,
+                   "3 h 15"   => 3.25,
+                   "3 h 15m"  => 3.25,
+                   "3 h 15 m" => 3.25,
+                   "3 hours"  => 3.0,
+                   "12min"    => 0.2,
+                  }
+    
+    assertions.each do |k, v|
+      t = TimeEntry.new(:hours => k)
+      assert_equal v, t.hours
+    end
+  end
+end