Index: openacs-4/packages/bug-tracker/tcl/bug-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/bug-tracker/tcl/bug-procs.tcl,v
diff -u -r1.4 -r1.5
--- openacs-4/packages/bug-tracker/tcl/bug-procs.tcl 24 Sep 2003 15:14:10 -0000 1.4
+++ openacs-4/packages/bug-tracker/tcl/bug-procs.tcl 28 Sep 2003 01:28:18 -0000 1.5
@@ -275,6 +275,23 @@
}
+ad_proc bug_tracker::bug::delete { bug_id } {
+ Delete a Bug Tracker bug.
+ This should only ever be run when un-instantiating a project!
+
+ @author Mark Aufflick
+} {
+ set case_id [db_string get_case_id {}]
+ db_exec_plsql delete_bug_case {}
+ set notifications [db_list get_notifications {}]
+ foreach notification_id $notifications {
+ db_exec_plsql delete_notification {}
+ }
+ db_dml unset_revisions {}
+ db_exec_plsql delete_cr_item {}
+}
+
+
ad_proc -public bug_tracker::bug::get_watch_link {
{-bug_id:required}
} {
@@ -653,3 +670,302 @@
return [list $url $one_line $details_list $notification_subject_tag]
}
+
+#####
+#
+# Bug list
+#
+#####
+
+ad_proc bug_tracker::bug::get_list {
+ {-ulevel 1}
+} {
+ set package_id [ad_conn package_id]
+ set workflow_id [bug_tracker::bug::get_instance_workflow_id]
+ bug_tracker::get_pretty_names -array pretty_names
+
+ set elements {
+ bug_number {
+ label "Bug \#"
+ display_template {\#@bugs.bug_number@}
+ html { align right }
+ }
+ summary {
+ label "Summary"
+ link_url_eval {[export_vars -base bug -entire_form -override { bug_number }]}
+ aggregate_label "Number of $pretty_names(bugs)"
+ }
+ comment {
+ label "Details"
+ display_col comment_short
+ hide_p 1
+ }
+ state {
+ label "State"
+ display_template {@bugs.pretty_state@ (@bugs.resolution_pretty@)}
+ aggregate count
+ }
+ creation_date_pretty {
+ label "Submitted"
+ }
+ submitter {
+ label "Submitter"
+ display_template {@bugs.submitter_first_names@ @bugs.submitter_last_name@}
+ hide_p 1
+ }
+ fix_for_version {
+ label "Fix for"
+ display_col fix_for_version_name
+ }
+ component {
+ label "Component"
+ display_col component_name
+ }
+ }
+
+ set state_values [db_list_of_lists select_states {}]
+ set state_default_value [lindex [lindex $state_values 0] 1]
+
+ set filters {
+ f_state {
+ label "State"
+ values $state_values
+ where_clause {cfsm.current_state = :f_state}
+ default_value $state_default_value
+ }
+ }
+
+ set orderbys {
+ default_value bug_number,desc
+ bug_number {
+ label "Bug \#"
+ orderby b.bug_number
+ default_direction desc
+ }
+ summary {
+ label "Summary"
+ orderby_asc {upper(b.summary) asc, b.summary asc, b.bug_number asc}
+ orderby_desc {upper(b.summary) desc, b.summary desc, b.bug_number desc}
+ }
+ submitter {
+ label "Submitter"
+ orderby_asc {upper(submitter.first_names) asc, upper(submitter.last_name) asc, b.bug_number asc}
+ orderby_asc {upper(submitter.first_names) desc, upper(submitter.last_name) desc, b.bug_number desc}
+ }
+ }
+
+ set category_defaults [list]
+
+
+ foreach { parent_id parent_heading } [bug_tracker::category_types] {
+ lappend elements category_$parent_id [list label [bug_tracker::category_heading -keyword_id $parent_id] display_col category_name_$parent_id]
+
+ set values [db_list_of_lists select_categories {}]
+
+ set name category_$parent_id
+
+ set where_clause [db_map category_where_clause]
+
+ lappend filters f_$name \
+ [list \
+ label $parent_heading \
+ values $values \
+ where_clause $where_clause]
+
+ lappend orderbys $name \
+ [list \
+ label $parent_heading \
+ orderby_desc {kw_order.heading desc, b.bug_number desc} \
+ orderby_asc {kw_order.heading asc, b.bug_number asc}]
+ }
+
+ if { [bug_tracker::versions_p] } {
+ lappend filters f_fix_for_version {
+ label "Fix for version"
+ values {[db_list_of_lists select_fix_for_versions {}]}
+ where_clause { b.fix_for_version = :f_fix_for_version }
+ null_where_clause { b.fix_for_version is null }
+ null_label "Undecided"
+ }
+ }
+
+ foreach action_id [workflow::get_actions -workflow_id $workflow_id] {
+ array unset action
+ workflow::action::get -action_id $action_id -array action
+
+ set values [db_list_of_lists select_action_assignees {}]
+
+ lappend filters f_action_$action_id \
+ [list \
+ label $action(pretty_name) \
+ values $values \
+ null_label "Unassigned" \
+ where_clause "
+ exists (select 1
+ from workflow_case_assigned_actions aa,
+ workflow_case_role_user_map crum
+ where aa.case_id = cas.case_id
+ and aa.action_id = $action_id
+ and crum.case_id = aa.case_id
+ and crum.role_id = aa.role_id
+ and crum.user_id = :f_action_$action_id
+ )
+ " \
+ null_where_clause "
+ exists (select 1
+ from workflow_case_assigned_actions aa,
+ workflow_case_role_user_map crum
+ where aa.case_id = cas.case_id
+ and aa.action_id = $action_id
+ and crum.case_id (+) = aa.case_id
+ and crum.role_id (+) = aa.role_id
+ and crum.user_id is null
+ )"]
+ }
+
+ # Stat: By Component
+
+ lappend filters f_component {
+ label "Component"
+ values {[db_list_of_lists select_components {}]}
+ where_clause {b.component_id = :f_component}
+ }
+
+ upvar \#[template::adp_level] format format
+
+ template::list::create \
+ -ulevel [expr $ulevel + 1] \
+ -name bugs \
+ -multirow bugs \
+ -class "list-tiny" \
+ -sub_class "narrow" \
+ -pass_properties { pretty_names } \
+ -elements $elements \
+ -filters $filters \
+ -orderby $orderbys \
+ -formats {
+ table {
+ label "Table"
+ layout table
+ }
+ list {
+ label "List"
+ layout list
+ template {
+
+
+ .
+
+
+
+ @pretty_names.Component@:
+ - Opened
+ By
+ Status:
+
+
+ }
+ }
+ } \
+ -selected_format $format
+}
+
+
+
+ad_proc bug_tracker::bug::get_query {} {
+
+ upvar #[template::adp_level] orderby orderby
+
+ # Needed to handle ordering by categories
+ set from_bug_clause "bt_bugs b"
+ set orderby_category_where_clause {}
+
+ # Lars: This is a little hack because we actually need to alter the query to sort by category
+ # but list builder currently doesn't support that.
+
+ if { [info exists orderby] && [regexp {^category_(.*),.*$} $orderby match orderby_parent_id] } {
+ append from_bug_clause [db_map orderby_category_from_bug_clause]
+ set orderby_category_where_clause [db_map orderby_category_where_clause]
+ }
+
+ return [db_map bugs]
+}
+
+
+ad_proc bug_tracker::bug::get_multirow {} {
+ foreach var [bug_tracker::get_export_variables] {
+ upvar \#[template::adp_level] $var $var
+ }
+
+ set workflow_id [bug_tracker::bug::get_instance_workflow_id]
+ set truncate_len [parameter::get -parameter "TruncateDescriptionLength" -default 200]
+
+ set extend_list {
+ comment_short
+ submitter_url
+ status_pretty
+ resolution_pretty
+ component_name
+ found_in_version_name
+ fix_for_version_name
+ fixed_in_version_name
+ }
+
+ foreach { parent_id parent_heading } [bug_tracker::category_types] {
+ lappend category_defaults $parent_id {}
+ lappend extend_list "category_$parent_id" "category_name_$parent_id"
+ }
+
+ array set row_category $category_defaults
+ array set row_category_names $category_defaults
+
+ db_multirow -extend $extend_list bugs select_bugs [get_query] {
+
+ # parent_id is part of the column name
+ set parent_id [bug_tracker::category_parent_element -keyword_id $keyword_id -element id]
+
+ # Set the keyword_id and heading for the category with this parent
+ set row_category($parent_id) $keyword_id
+ set row_category_name($parent_id) [bug_tracker::category_heading -keyword_id $keyword_id]
+
+ if { [db_multirow_group_last_row_p -column bug_id] } {
+ set component_name [bug_tracker::component_get_name -component_id $component_id]
+ set found_in_version_name [bug_tracker::version_get_name -version_id $found_in_version]
+ set fix_for_version_name [bug_tracker::version_get_name -version_id $fix_for_version]
+ set fixed_in_version_name [bug_tracker::version_get_name -version_id $fixed_in_version]
+ set comment_short [string_truncate -len $truncate_len -format $comment_format $comment_content]
+ set summary [ad_quotehtml $summary]
+ set submitter_url [acs_community_member_url -user_id $submitter_user_id]
+ set resolution_pretty [bug_tracker::resolution_pretty $resolution]
+
+ # Hide fields in this state
+ foreach element $hide_fields {
+ set $element {}
+ }
+
+ # Move categories from array to normal variables, then clear the array for next row
+ foreach parent_id [array names row_category] {
+ set category_$parent_id $row_category($parent_id)
+ set category_name_$parent_id $row_category_name($parent_id)
+ }
+
+ array set row_category $category_defaults
+ array set row_category_names $category_defaults
+ } else {
+ continue
+ }
+ }
+
+}
+
+ad_proc bug_tracker::bug::get_bug_numbers {} {
+ bug_tracker::bug::get_list -ulevel 2
+ bug_tracker::bug::get_multirow
+
+ set filter_bug_numbers [list]
+ template::multirow foreach bugs {
+ lappend filter_bug_numbers $bug_number
+ }
+
+ return $filter_bug_numbers
+}