Index: openacs-4/packages/logger/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/logger/www/index.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/logger/www/index.tcl 25 Apr 2003 09:48:37 -0000 1.2 +++ openacs-4/packages/logger/www/index.tcl 30 Apr 2003 12:21:02 -0000 1.3 @@ -5,105 +5,172 @@ @creation-date 2003-04-08 @cvs-id $Id$ } { - project_id:optional,integer - variable_id:optional,integer + {selected_project_id:integer ""} + {selected_variable_id:integer ""} + {selected_user_id:integer ""} + {start_date:array {}} + {end_date:array {}} } set package_id [ad_conn package_id] set user_id [ad_conn user_id] set admin_p [permission::permission_p -object_id $package_id -privilege admin] -# Default variable_id to the id of the variable the user last logged in -# At any one time exactly one variable is selected on this page -if { ![exists_and_not_null variable_id] } { - set variable_id [db_string last_logged_variable_id { - select variable_id - from logger_entries le - where le.time_stamp = (select max(time_stamp) - from logger_entries) - } -default ""] -} +########### +# +# Date handling +# +########### -# Need the selected variable id in the adp as variable_id will be set to some other value -# in the multiple loop -set selected_variable_id $variable_id -logger::variable::get -variable_id $variable_id -array variable_array -set selected_variable_name $variable_array(name) +# Set default values for start and end date if the form hasn't been submitted yet +if { [array size start_date] == 0 } { + # Default end date is now (today) + set default_end_date_seconds [clock seconds] -# Likewise need the selected project id in the adp -if { [exists_and_not_null project_id] } { - set selected_project_id $project_id - logger::project::get -project_id $project_id -array project_array - set selected_project_name $project_array(name) -} else { - set selected_project_id "" + set end_date(year) [clock format $default_end_date_seconds -format "%Y"] + set end_date(month) [clock format $default_end_date_seconds -format "%m"] + set end_date(day) [clock format $default_end_date_seconds -format "%d"] + + # Default start date is N days back + set number_of_days_back 31 + set seconds_per_day [expr 60*60*24] + set default_start_date_seconds [expr $default_end_date_seconds - 31 * $seconds_per_day] + + set start_date(year) [clock format $default_start_date_seconds -format "%Y"] + set start_date(month) [clock format $default_start_date_seconds -format "%m"] + set start_date(day) [clock format $default_start_date_seconds -format "%d"] } +# Get the ANSI representations of the dates +set start_date_ansi "$start_date(year)-$start_date(month)-$start_date(day)" +set end_date_ansi "$end_date(year)-$end_date(month)-$end_date(day)" + ########### # -# Log entries +# Project and variable default values and names # ########### -set where_clauses [list] -if { [exists_and_not_null project_id] } { - # Only selected project - lappend where_clauses "lp.project_id = :project_id" +# We need the name of the selected project in the adp +if { ![empty_string_p $selected_project_id] } { + logger::project::get -project_id $selected_project_id -array project_array + set selected_project_name $project_array(name) } else { - # All projects mapped to the package - lappend where_clauses \ - "exists (select 1 - from logger_project_pkg_map - where project_id = lp.project_id - and package_id = :package_id - )" + set selected_project_name "" } -if { [exists_and_not_null variable_id] } { - lappend where_clauses "lm.variable_id = :variable_id" +# Likewise, need the name of the selected user in the adp +if { ![empty_string_p $selected_user_id] } { + set selected_user_name [person::name -person_id $selected_user_id] } -db_multirow -extend action_links entries select_entries " - select lm.entry_id as id, - acs_permission.permission_p(lm.entry_id, :user_id, 'write') as write_p, - acs_permission.permission_p(lm.entry_id, :user_id, 'delete') as delete_p, - lm.time_stamp, - lv.name as variable_name, - lm.value, - lv.unit, - lm.description, - lp.name as project_name - from logger_entries lm, - logger_variables lv, - logger_projects lp - where lm.variable_id = lv.variable_id - and lm.project_id = lp.project_id - [ad_decode $where_clauses "" "" "and [join $where_clauses "\n and "]"] - order by lm.time_stamp desc -" { - set description_max_length 50 - if { [string length $description] > $description_max_length } { - set description "[string range $description 0 [expr $description_max_length - 4]]..." +# Find a suitable default variable_id +# No more than one variable will be selected on this page +# Under unusual circumstances no variable will be selected +# (variable_id will be the empty string) +if { [empty_string_p $selected_variable_id] } { + # No variable selected + + # First default to the variable the user last logged hours in + # Use any selected project and all projects otherwise + if { ![empty_string_p $selected_project_id] } { + set project_clause "le.project_id = :selected_project_id" + } else { + set project_clause "" } + set selected_variable_id [db_string last_logged_variable_id " + select variable_id + from logger_entries le, + acs_objects ao + where ao.creation_date = (select max(ao.creation_date) + from logger_entries le, + acs_objects ao + where ao.object_id = le.entry_id + [ad_decode $project_clause "" "" "and $project_clause"] + ) + and ao.object_id = le.entry_id + [ad_decode $project_clause "" "" "and $project_clause"] + " -default ""] - set action_links_list [list] - if { $write_p } { - lappend action_links_list "edit" + if { [empty_string_p $selected_variable_id] } { + # The user has not logger hours yet + + if { ![empty_string_p $selected_project_id] } { + # A project is selected - use the primary variable + set selected_variable_id [logger::project::get_primary_variable -project_id $selected_project_id] + } else { + # No project is selected and the user has never logged hours before + # Should we use time in this unusual case? For now we don't select any variable + set selected_variable_id "" + } } - if { $delete_p } { - set onclick_script "return confirm('Are you sure you want to delete log entry with $value $unit $variable_name on $time_stamp?');" - lappend action_links_list "delete" - } - set action_links "\[ [join $action_links_list " | "] \]" } +# Need the name of the selected variable in the adp +if { ![empty_string_p $selected_variable_id] } { + logger::variable::get -variable_id $selected_variable_id -array variable_array + set selected_variable_name $variable_array(name) + set selected_variable_unit $variable_array(unit) +} else { + set selected_variable_name "" + set selected_variable_unit "" +} + ########### # +# Time Filter +# +########### + +# Create the form +template::form create time_filter -method GET +# Export the other filter variables +template::element create time_filter selected_project_id \ + -widget hidden \ + -value $selected_project_id +template::element create time_filter selected_variable_id \ + -widget hidden \ + -value $selected_variable_id +template::element create time_filter selected_user_id \ + -widget hidden \ + -value $selected_user_id +template::element create time_filter start_date \ + -label "Start day:" \ + -widget date \ + -datatype date +template::element create time_filter end_date \ + -label "End day:" \ + -widget date \ + -datatype date + +# Set the values of the start and end date in the form +element set_properties time_filter start_date \ + -value [eval template::util::date::create $start_date(year) $start_date(month) $start_date(day)] +element set_properties time_filter end_date \ + -value [eval template::util::date::create $end_date(year) $end_date(month) $end_date(day)] + +########### +# +# Log entries +# +########### + +# We let start date be beginning of day but end date be end of day so that if +# both are the same day you get the entries during that day +set end_date_seconds [clock scan "$end_date(year)-$end_date(month)-$end_date(day)"] +set end_date_plus_one_seconds [expr $end_date_seconds + 60*60*24] +set end_date_plus_one_ansi [clock format $end_date_plus_one_seconds -format "%Y-%m-%d"] + +# template lib/entries-table is included - see adp + + +########### +# # Projects # ########### -set all_projects_url "index?[export_vars {{variable_id $selected_variable_id}}]" +set all_projects_url "index?[export_vars {{selected_variable_id $selected_variable_id} {selected_user_id $selected_user_id}}]" db_multirow -extend { url log_url } projects select_projects { select lp.project_id, @@ -114,7 +181,7 @@ and lppm.package_id = :package_id order by lp.name } { - set url "index?[export_vars project_id]" + set url "index?[export_vars {{selected_project_id $project_id}}]" set log_url "log?[export_vars { project_id {variable_id $selected_variable_id}}]" } @@ -125,8 +192,8 @@ ########### set where_clauses [list] -if { [exists_and_not_null project_id] } { - lappend where_clauses "lp.project_id = :project_id" +if { ![empty_string_p $selected_project_id] } { + lappend where_clauses "lp.project_id = :selected_project_id" } else { lappend where_clauses \ "exists (select 1 @@ -146,13 +213,52 @@ where lp.project_id = lpvm.project_id and lv.variable_id = lpvm.variable_id [ad_decode $where_clauses "" "" "and [join $where_clauses "\n and "]"] + group by lv.variable_id, lv.name, lv.unit " { - set url "index?[export_vars {variable_id project_id}]" - if { [exists_and_not_null selected_project_id] } { + set url "index?[export_vars {{selected_variable_id $variable_id} {selected_project_id $selected_project_id} {selected_user_id $selected_user_id}}]" + if { ![empty_string_p $selected_project_id] } { # A project is selected - enable logging set log_url "log?[export_vars { variable_id {project_id $selected_project_id}}]" } else { # No project selected - we wont enable those url:s set log_url "" } } + +########### +# +# Users +# +########### + +set all_users_url "index?[export_vars {{selected_variable_id $selected_variable_id} {selected_project_id $selected_project_id}}]" + +set where_clauses [list] +if { ![empty_string_p $selected_project_id] } { + # Select all users who have logged in selected project + lappend where_clauses "le.project_id = :selected_project_id" +} else { + # Select all users who have logged in any project mapped to + # this package + lappend where_clauses \ + "exists (select 1 + from logger_project_pkg_map + where project_id = le.project_id + and package_id = :package_id + )" +} + +db_multirow -extend { url } users select_users " + select submitter.user_id as user_id, + submitter.first_names as first_names, + submitter.last_name as last_name + from cc_users submitter, + logger_entries le, + acs_objects ao + where ao.object_id = le.entry_id + and submitter.user_id = ao.creation_user + [ad_decode $where_clauses "" "" "and [join $where_clauses "\n and "]"] + group by submitter.user_id, submitter.first_names, submitter.last_name +" { + set url "index?[export_vars {{selected_user_id $user_id} {selected_project_id $selected_project_id} {selected_variable_id $selected_variable_id}}]" +}