Index: openacs-4/packages/ams/www/list-order-update.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ams/www/list-order-update.tcl,v diff -u -r1.1 -r1.1.2.1 --- openacs-4/packages/ams/www/list-order-update.tcl 30 Oct 2004 00:23:54 -0000 1.1 +++ openacs-4/packages/ams/www/list-order-update.tcl 30 Nov 2005 16:21:53 -0000 1.1.2.1 @@ -10,31 +10,66 @@ } { sort_key:array list_id:integer,notnull +} -validate { + ordering_is_valid -requires {sort_key} { + set no_value_supplied [list] + set no_integer_supplied [list] + set used_sort_orders [list] + set doubled_sort_orders [list] + foreach {attribute_id sort_order} [array get sort_key] { + set sort_order [string trim $sort_order] + if { $sort_order == "" } { + lappend no_value_supplied $attribute_id + } elseif { [string is false [string is integer $sort_order]] } { + lappend no_integer_supplied $attribute_id $sort_order + } elseif { [info exists order($sort_order)] } { + lappend doubled_sort_orders $attribute_id $order($sort_order) + } else { + set order($sort_order) $attribute_id + } + } + set error_messages [list] + if { [llength $no_value_supplied] } { + foreach attribute_id $no_value_supplied { + lappend error_messages "[_ ams.No_ordering_integer_was_supplied_for] [attribute::pretty_name -attribute_id $attribute_id]" + } + } + if { [llength $no_integer_supplied] } { + foreach { attribute_id sort_order } $no_integer_supplied { + lappend error_messages "[_ ams.The_ordering_number_is_not_an_integer_for] [attribute::pretty_name -attribute_id $attribute_id]" + } + } + if { [llength $doubled_sort_orders] } { + foreach { one_attribute_id two_attribute_id } $doubled_sort_orders { + lappend error_messages "[_ ams.The_ordering_number_is_the_same_for] [attribute::pretty_name -attribute_id $one_attribute_id] [_ ams.and] [attribute::pretty_name -attribute_id $two_attribute_id]" + } + } + if { [llength $error_messages] > 0 } { + foreach message $error_messages { + ad_complain $message + } + } + } } - -set ams_attribute_ids [db_list get_attribute_ids { select ams_attribute_id from ams_list_attribute_map where list_id = :list_id order by sort_order }] - - -# first we get the highest sort_order so variables without a sort_order can be given one -set highest_sort 0 -set used_sorts [list] -foreach ams_attribute_id $ams_attribute_ids { - if { $sort_key(${ams_attribute_id}) > $highest_sort } { - set highest_sort $sort_key(${ams_attribute_id}) - } +set attribute_order [list] +set sort_key_list [array get sort_key] +foreach {attribute_id sort_order} $sort_key_list { + set order($sort_order) $attribute_id + lappend attribute_order $sort_order } +set ordered_list [lsort -integer $attribute_order] +set highest_sort [db_string get_highest_sort { select sort_order from ams_list_attribute_map where list_id = :list_id order by sort_order desc limit 1 }] +incr highest_sort +set sort_number 1 db_transaction { - foreach ams_attribute_id $ams_attribute_ids { - set sort_order $sort_key(${ams_attribute_id}) - incr highest_sort 1 - db_dml update_sort_order { update ams_list_attribute_map set sort_order = :highest_sort where sort_order = :sort_order and list_id = :list_id } - if { ![exists_and_not_null sort_order] } { - incr highest_sort 1 - set sort_order $highest_sort - } - db_dml update_sort_order { update ams_list_attribute_map set sort_order = :sort_order where ams_attribute_id = :ams_attribute_id and list_id = :list_id } + foreach sort_order $ordered_list { + set attribute_id $order($sort_order) + db_dml update_sort_order { update ams_list_attribute_map set sort_order = :highest_sort where sort_order = :sort_number and list_id = :list_id } + db_dml update_sort_order { update ams_list_attribute_map set sort_order = :sort_number where attribute_id = :attribute_id and list_id = :list_id } + incr highest_sort + incr sort_number } }