Commit a005c996574e07c974ae1fb2c833dd575182dbcb
1 parent
52591d04
Exists in
master
and in
29 other branches
ActionItem916: changed birth_date to use select forms
Had to convert the birth_date setting to a database column for active_record do its magic and couple with the date_select helper that is used on the pick_date helper
Showing
7 changed files
with
123 additions
and
7 deletions
Show diff stats
app/helpers/dates_helper.rb
... | ... | @@ -86,8 +86,8 @@ module DatesHelper |
86 | 86 | link_to show_month(next_month_date.year, next_month_date.month) + ' →', :year => next_month_date.year, :month => next_month_date.month |
87 | 87 | end |
88 | 88 | |
89 | - def pick_date(object, method) | |
90 | - date_select(object, method, :use_month_names => MONTHS.map {|item| gettext(item)}) | |
89 | + def pick_date(object, method, options = {}, html_options = {}) | |
90 | + date_select(object, method, html_options.merge(options.merge(:use_month_names => MONTHS.map {|item| gettext(item)}))) | |
91 | 91 | end |
92 | 92 | |
93 | 93 | end | ... | ... |
app/models/person.rb
... | ... | @@ -105,8 +105,8 @@ class Person < Profile |
105 | 105 | N_('Formation'); N_('Custom formation'); N_('Custom area of study'); |
106 | 106 | settings_items :formation, :custom_formation, :custom_area_of_study |
107 | 107 | |
108 | - N_('Contact information'); N_('Birth date'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code') | |
109 | - settings_items :photo, :contact_information, :birth_date, :sex, :city, :state, :country, :zip_code | |
108 | + N_('Contact information'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code') | |
109 | + settings_items :photo, :contact_information, :sex, :city, :state, :country, :zip_code | |
110 | 110 | |
111 | 111 | def self.conditions_for_profiles(conditions, person) |
112 | 112 | new_conditions = sanitize_sql(['role_assignments.accessor_id = ?', person]) | ... | ... |
app/views/profile_editor/_person_form.rhtml
... | ... | @@ -14,7 +14,7 @@ |
14 | 14 | <%= optional_field(@person, 'cell_phone', f.text_field(:cell_phone)) %> |
15 | 15 | <%= optional_field(@person, 'comercial_phone', f.text_field(:comercial_phone)) %> |
16 | 16 | <%= optional_field(@person, 'sex', f.radio_group(:profile_data, :sex, [ ['male',_('Male')], ['female',_('Female')] ])) %> |
17 | -<%= optional_field(@person, 'birth_date', f.text_field(:birth_date)) %> | |
17 | +<%= optional_field(@person, 'birth_date', labelled_form_field(_('Birth date'), '<div class="select-birth-date">' + pick_date(:profile_data, :birth_date, {:start_year => (Date.today.year - 100), :end_year => (Date.today.year - 10)}) + '</div>')) %> | |
18 | 18 | <%= optional_field(@person, 'address', labelled_form_field(_('Address (street and number)'), text_field(:profile_data, :address))) %> |
19 | 19 | <%= optional_field(@person, 'zip_code', labelled_form_field(_('ZIP code'), text_field(:profile_data, :zip_code))) %> |
20 | 20 | <%= optional_field(@person, 'city', f.text_field(:city)) %> | ... | ... |
... | ... | @@ -0,0 +1,111 @@ |
1 | +require File.dirname(__FILE__) + '/../../config/environment' | |
2 | + | |
3 | +class AddBirthDateToPerson < ActiveRecord::Migration | |
4 | + | |
5 | + class ConvertDates | |
6 | + def self.convert(date_string) | |
7 | + return if date_string.blank? | |
8 | + return date_string if date_string.kind_of?(Date) | |
9 | + return unless date_string.kind_of?(String) | |
10 | + return if date_string =~ /[a-zA-Z]/ | |
11 | + | |
12 | + if date_string =~ /^\d\d([^\d]+)\d\d$/ | |
13 | + date_string += $1 + (Date.today.year - 100).to_s | |
14 | + end | |
15 | + | |
16 | + if date_string =~ /[^\d](\d\d)$/ | |
17 | + year = $1.to_i | |
18 | + date_string = date_string[0..-3] + (year > (Date.today.year - 2000) ? year + 1900 : year + 2000).to_s | |
19 | + end | |
20 | + | |
21 | + date_string.gsub!('/', '.') | |
22 | + Date.parse(date_string) | |
23 | + end | |
24 | + end | |
25 | + | |
26 | + class Person < ActiveRecord::Base | |
27 | + set_table_name 'profiles' | |
28 | + serialize :data, Hash | |
29 | + end | |
30 | + | |
31 | + def self.up | |
32 | + add_column :profiles, :birth_date, :date | |
33 | + Person.find(:all).select{|p| p.type = 'Person'}.each do |p| | |
34 | + p.birth_date = ConvertDates.convert(p.data[:birth_date].to_s) | |
35 | + p.save | |
36 | + end | |
37 | + end | |
38 | + | |
39 | + def self.down | |
40 | + remove_column :profiles, :birth_date | |
41 | + end | |
42 | +end | |
43 | + | |
44 | +if $PROGRAM_NAME == __FILE__ | |
45 | + require File.dirname(__FILE__) + '/../../test/test_helper' | |
46 | + | |
47 | + class ConvertDatesTest < Test::Unit::TestCase | |
48 | + | |
49 | + should 'convert with slash' do | |
50 | + date = ConvertDates.convert('10/01/2009') | |
51 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | |
52 | + end | |
53 | + | |
54 | + should 'convert with hyphen' do | |
55 | + date = ConvertDates.convert('10-01-2009') | |
56 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | |
57 | + end | |
58 | + | |
59 | + should 'convert with dot' do | |
60 | + date = ConvertDates.convert('10.01.2009') | |
61 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | |
62 | + end | |
63 | + | |
64 | + should 'convert with slash and space' do | |
65 | + date = ConvertDates.convert('10/ 01/ 2009') | |
66 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | |
67 | + end | |
68 | + | |
69 | + should 'convert with empty to nil' do | |
70 | + date = ConvertDates.convert('') | |
71 | + assert_nil date | |
72 | + end | |
73 | + | |
74 | + should 'convert with nil to nil' do | |
75 | + date = ConvertDates.convert(nil) | |
76 | + assert_nil date | |
77 | + end | |
78 | + | |
79 | + should 'convert with two digits 1900' do | |
80 | + date = ConvertDates.convert('10/01/99') | |
81 | + assert_equal [10, 1, 1999], [date.day, date.month, date.year] | |
82 | + end | |
83 | + | |
84 | + should 'convert with two digits 2000' do | |
85 | + date = ConvertDates.convert('10/01/09') | |
86 | + assert_equal [10, 1, 2009], [date.day, date.month, date.year] | |
87 | + end | |
88 | + | |
89 | + should 'convert with two numbers' do | |
90 | + date = ConvertDates.convert('10/01') | |
91 | + assert_equal [10, 1, (Date.today.year - 100)], [date.day, date.month, date.year] | |
92 | + end | |
93 | + | |
94 | + should 'convert to nil if non-numeric date' do | |
95 | + date = ConvertDates.convert('10 de agosto de 2009') | |
96 | + assert_nil date | |
97 | + end | |
98 | + | |
99 | + should 'do nothing if date' do | |
100 | + date = ConvertDates.convert(Date.today) | |
101 | + assert_equal Date.today, date | |
102 | + end | |
103 | + | |
104 | + should 'return nil when not string nor date' do | |
105 | + date = ConvertDates.convert(1001) | |
106 | + assert_nil date | |
107 | + end | |
108 | + | |
109 | + end | |
110 | + | |
111 | +end | ... | ... |
db/schema.rb
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | # |
10 | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | |
12 | -ActiveRecord::Schema.define(:version => 58) do | |
12 | +ActiveRecord::Schema.define(:version => 59) do | |
13 | 13 | |
14 | 14 | create_table "article_versions", :force => true do |t| |
15 | 15 | t.integer "article_id" |
... | ... | @@ -232,6 +232,7 @@ ActiveRecord::Schema.define(:version => 58) do |
232 | 232 | t.text "custom_footer" |
233 | 233 | t.string "theme" |
234 | 234 | t.boolean "public_profile", :default => true |
235 | + t.date "birth_date" | |
235 | 236 | end |
236 | 237 | |
237 | 238 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" | ... | ... |
public/stylesheets/person_data.css
test/functional/profile_editor_controller_test.rb
... | ... | @@ -279,7 +279,7 @@ class ProfileEditorControllerTest < Test::Unit::TestCase |
279 | 279 | |
280 | 280 | should 'render person partial' do |
281 | 281 | person = create_user('test_profile', :environment => Environment.default).person |
282 | - Person.any_instance.expects(:active_fields).returns(['contact_phone', 'birth_date', 'address']).at_least_once | |
282 | + Person.any_instance.expects(:active_fields).returns(['contact_phone', 'address']).at_least_once | |
283 | 283 | get :edit, :profile => person.identifier |
284 | 284 | person.active_fields.each do |field| |
285 | 285 | assert_tag :tag => 'input', :attributes => { :name => "profile_data[#{field}]" } | ... | ... |