Index: openacs-4/packages/contacts/contacts.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/contacts.info,v
diff -u -r1.66 -r1.67
--- openacs-4/packages/contacts/contacts.info	22 Feb 2006 01:40:39 -0000	1.66
+++ openacs-4/packages/contacts/contacts.info	12 Mar 2006 09:36:35 -0000	1.67
@@ -7,14 +7,14 @@
     <initial-install-p>f</initial-install-p>
     <singleton-p>f</singleton-p>
     
-    <version name="1.2b5" url="http://openacs.org/repository/download/apm/contacts-1.2b5.apm">
+    <version name="1.2b6" url="http://openacs.org/repository/download/apm/contacts-1.2b6.apm">
         <owner url="mailto:openacs@geddert.com">Matthew Geddert</owner>
         <summary>This application lets you collaboratively view, edit and categorize contacts.</summary>
-        <release-date>2006-02-20</release-date>
+        <release-date>2006-03-12</release-date>
         <description format="text/plain">Contacts is an application for managing all those people and or organization you need to keep track of. It has a complete UI for storing and categorizing contacts. Each contact can have an arbitrary number of custom attributes associated with it, including other contacts (i.e. a certain contact &quot;belongs&quot; to a certain organization). It also functions as a service contract provider for attributes related to users in your system</description>
         <maturity>0</maturity>
 
-        <provides url="contacts" version="1.2b5"/>
+        <provides url="contacts" version="1.2b6"/>
         <requires url="acs-datetime" version="4.1"/>
         <requires url="acs-events" version="0.5d3"/>
         <requires url="acs-tcl" version="5.2.0b3"/>
@@ -26,8 +26,8 @@
 
         <callbacks>
             <callback type="after-install"  proc="contacts::install::package_install"/>
-            <callback type="after-upgrade"  proc="contacts::install::package_upgrade"/>
             <callback type="after-instantiate"  proc="contacts::install::package_instantiate"/>
+            <callback type="after-upgrade"  proc="contacts::install::package_upgrade"/>
         </callbacks>
         <parameters>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="AcceptableFileUploadMIMETypes"  default="*" description="* for any. CSV of acceptable MIME Types for File Upload" section_name="File Upload"/>
@@ -53,6 +53,7 @@
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="DefaultPortalLayout"  default="50" description="The default portlet"/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="DefaultPortletLayout"  default="/packages/contacts/lib/portlet" description="The src of the default portlet layout"/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="DefaultViewAttributes"  default="{email} {home_phone} {(h)} {work_phone} {(w)} {mobile_phone} {(m)}" description="The default attributes to view on the main contact page. This should be a list of attribute_name display_code to show for the attribute, the display code will only show up if the person/contact has a value for that attribute."/>
+            <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="DeleteHistoryPermission"  default="no" description="Default 'no'. Valid options are: 'no', 'yours' or 'all'. If set to 'yours' then you can only delete history that was created by you (i.e. the acs_objects tables created_user is your user_id). If set to 'all' you can delete any history item. This does not actually delete the object, its just hidden because an entry is made in the contact_deleted_history table. NOTE: people with admin rights on the package instance are automatically given 'all' permission."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="DisableCSV"  default="0" description="Default '0'. If set to '1' people will not be able to download a csv of the contacts attributes displayed on this contact instances front page."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="DisplayEmployersP"  default="0" description="1 for yes, 0 for no. Display organization name behind username?"/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="EmailAttachmentsAllowed"  default="1" description="1 for yes, 0 for now. Are email attachments allowed when sending messages?"/>
@@ -61,7 +62,7 @@
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="ImageMagickPath"  default="/usr/local/bin" description="Absolute path from computer root to directory containing ImageMagick executables" section_name="Photos"/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="IncludeChildPackages"  default="0" description="Default '0'. Set to '1' to include child contacts instances contacts in searches for this package."/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="Index"  default="/packages/contacts/templates/index" description="The template src for the index page" section_name="Portal Templates"/>
-            <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="LetterPrintCSSFile"  default="/resources/contacts/contacts-print.css" description="What css file should be used for printing letter messages, this should be relative to server root. Defaults to /resources/contacts/contacts-print.css
+            <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="LetterPrintCSSFile"  default="/resources/contacts/contacts-print.css" description="What css file should be used for printing letter messages, this should be relative to server root. Defaults to /resources/contacts/contacts-print.css
 " section_name="Templates"/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="LogEmailsP"  default="t" description="Boolean that indicates if messages of type &quot;email&quot; are going to be logged or not on the contact_message_log"/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="MailingAddressAttributeIdOrder"  description="A list of attribute_ids for postal addresses in order of priority. In doing a letter mail merge the first attribute_id in this list that a contact has a value for will be used as the mailing address. If no attribute_ids are specified all postal_address attribute_ids will be used in alphabetical order."/>
Index: openacs-4/packages/contacts/catalog/contacts.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/catalog/contacts.en_US.ISO-8859-1.xml,v
diff -u -r1.65 -r1.66
--- openacs-4/packages/contacts/catalog/contacts.en_US.ISO-8859-1.xml	5 Mar 2006 08:34:12 -0000	1.65
+++ openacs-4/packages/contacts/catalog/contacts.en_US.ISO-8859-1.xml	12 Mar 2006 09:36:35 -0000	1.66
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<message_catalog package_key="contacts" package_version="1.2b5" locale="en_US" charset="ISO-8859-1">
+<message_catalog package_key="contacts" package_version="1.2b6" locale="en_US" charset="ISO-8859-1">
 
   <msg key="--_select_a_group_--">-- select a group --</msg>
   <msg key="--Create_New_Message--">-- Create New Message --</msg>
@@ -276,6 +276,7 @@
   <msg key="lt_Currently_the_group_">Currently, the group is able to handle the following types of relationships:</msg>
   <msg key="lt_Debugging_Code_-_Only">Debugging Code - Only SW Admins See This</msg>
   <msg key="lt_Define_a_new_relation">Define a new relationship type</msg>
+  <msg key="lt_Delete_requires_return_url">Deleting an item from history requires a return_url</msg>
   <msg key="lt_Delete_the_selected_C">Delete the selected Contacts</msg>
   <msg key="lt_Delete_the_selectted_">Delete the selectted files</msg>
   <msg key="lt_Delete_this_contact">Completely delete this contact (irreversible action)</msg>
@@ -303,6 +304,7 @@
   <msg key="lt_li_The_role_you_enter">&lt;li&gt; The role you entered \&quot;%pretty_name%\&quot; or the plural \&quot;%pretty_plural%\&quot; already exists.</msg>
   <msg key="lt_Make_sure_you_do_not_">Make sure you do not add the same attribute to multiple groups</msg>
   <msg key="lt_neither_person_nor_or">neither person nor org type is valid, what happened admin?</msg>
+  <msg key="lt_No_perm_to_delete_from_hist">You do not have permission to delete this item from this contacts history </msg>
   <msg key="lt_not_commented_on_in_l">not commented on in last -&gt;</msg>
   <msg key="lt_not_created_in_the_la">not created in the last -&gt;</msg>
   <msg key="lt_not_updated_in_the_la">not updated in the last -&gt;</msg>
Index: openacs-4/packages/contacts/lib/history.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/history.adp,v
diff -u -r1.4 -r1.5
--- openacs-4/packages/contacts/lib/history.adp	13 Oct 2005 14:35:04 -0000	1.4
+++ openacs-4/packages/contacts/lib/history.adp	12 Mar 2006 09:36:35 -0000	1.5
@@ -5,7 +5,7 @@
 <if @history:rowcount@ gt 0>
   <dl class="comments">
 <multiple name="history">
-    <dt id="@history.object_id@" class="<if @history.creation_user@ eq @user_id@>mine-</if><if @history.rownum@ odd>odd</if><else>even</else>">@history.date@ #contacts.at# @history.time@ @history.user_link@</dd>
+    <dt id="@history.object_id@" class="<if @history.creation_user@ eq @user_id@>mine-</if><if @history.rownum@ odd>odd</if><else>even</else>">@history.date@ #contacts.at# @history.time@ @history.user_link@<if @history.delete_url@> <a href="@history.delete_url@"><img src="/resources/acs-subsite/Delete16.gif" alt="#acs-subsite.Delete#" border="0" title="#acs-subsite.Delete#" /></a></if></dd>
       <dd class="<if @history.creation_user@ eq @user_id@>mine-</if><if @history.rownum@ odd>odd</if><else>even</else>">
    
 	<if @history.include@ nil>
Index: openacs-4/packages/contacts/lib/history.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/history.tcl,v
diff -u -r1.4 -r1.5
--- openacs-4/packages/contacts/lib/history.tcl	27 Jul 2005 13:36:04 -0000	1.4
+++ openacs-4/packages/contacts/lib/history.tcl	12 Mar 2006 09:36:35 -0000	1.5
@@ -131,24 +131,51 @@
 
 
 template::multirow sort hist -decreasing timestamp
-template::multirow create history date time object_id creation_user user_link include content
+template::multirow create history date time object_id creation_user user_link include content delete_url
 
+set deleted_history [db_list select_deleted_history {}]
+set return_url [string trimright "[ad_conn url]?[ad_conn query]" "?"]
+
+if { [permission::permission_p -party_id $user_id -object_id [ad_conn package_id] -privilege admin] } {
+    set delete_permission "all"
+} else {
+    set delete_permission [string tolower [parameter::get -parameter "DeleteHistoryPermission" -default "no"]]
+}
+
+
 set result_number 1
 template::multirow foreach hist {
-    set timestamp     [lindex [split $timestamp "."] 0]
-    set date          [lc_time_fmt $timestamp "%q"]
-    set time          [string trimleft [lc_time_fmt $timestamp "%X"] "0"]
-#    set object_id     
-#    set creation_user 
-    set user_link     [contact::name -party_id $creation_user]
-#    set content
-#    set include
-    template::multirow append history $date $time $object_id $creation_user $user_link $include $content
-    if { [exists_and_not_null limit] } {
-	incr result_number
-	if { $result_number > $limit } {
-	    break
+    if { [lsearch $deleted_history $object_id] < 0 } {
+	set timestamp     [lindex [split $timestamp "."] 0]
+	set date          [lc_time_fmt $timestamp "%q"]
+	set time          [string trimleft [lc_time_fmt $timestamp "%X"] "0"]
+	#    set object_id     
+	#    set creation_user 
+	set user_link     [contact::name -party_id $creation_user]
+	#    set content
+	#    set include
+	if { [lsearch [list yours all] $delete_permission] < 0 } {
+	    set delete_url ""
+	} else {
+	    set delete_url [export_vars -base "[contact::url -party_id $party_id]history" -url {{delete_object_id $object_id} return_url}]
+	    if { $delete_permission eq "yours" } {
+		# we need to verify that they have permission to delete
+                # this object form history
+		acs_object::get -object_id $object_id -array acs_object
+		if { $user_id ne $acs_object(creation_user) } {
+		    # they do not have permission to delete this object from history
+		    set delete_url ""
+		}
+	    }
 	}
+
+	template::multirow append history $date $time $object_id $creation_user $user_link $include $content $delete_url
+	if { [exists_and_not_null limit] } {
+	    incr result_number
+	    if { $result_number > $limit } {
+		break
+	    }
+	}
     }
 }
 
Index: openacs-4/packages/contacts/lib/history.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/history.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/contacts/lib/history.xql	12 Mar 2006 09:36:35 -0000	1.1
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<queryset>
+
+<fullquery name="select_deleted_history">
+      <querytext>
+	select object_id
+          from contact_deleted_history
+         where party_id = :party_id
+      </querytext>
+</fullquery>
+
+</queryset>
Index: openacs-4/packages/contacts/sql/postgresql/contacts-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/sql/postgresql/contacts-create.sql,v
diff -u -r1.11 -r1.12
--- openacs-4/packages/contacts/sql/postgresql/contacts-create.sql	5 Oct 2005 22:17:48 -0000	1.11
+++ openacs-4/packages/contacts/sql/postgresql/contacts-create.sql	12 Mar 2006 09:36:35 -0000	1.12
@@ -128,6 +128,32 @@
                          constraint organization_rels_rel_id_pk primary key
 );
 
+
+-- what objects should not be shown in a contacts history?
+-- although we store deleted by and deleted date
+-- information there is no need to make this an object
+-- because this info is related to other objects
+-- this doesn't warrent permissions or the overhead
+-- in the acs_objects table
+
+create table contact_deleted_history (
+        party_id                integer
+                                constraint contact_deleted_history_party_id_fk references parties(party_id) on delete cascade
+                                constraint contact_deleted_history_party_id_nn not null,
+        object_id               integer
+                                constraint contact_deleted_history_object_id_fk references acs_objects(object_id) on delete cascade
+                                constraint contact_deleted_history_object_id_nn not null,
+        deleted_by              integer
+                                constraint contact_deleted_history_deleted_by_fk references users(user_id) on delete cascade
+                                constraint contact_deleted_history_deleted_by_nn not null,
+        deleted_date            timestamptz default now()
+                                constraint contact_deleted_history_deleted_date not null,
+        unique(party_id,object_id)
+);
+
+-- create the content type
+
+
 \i contacts-package-create.sql
 \i contacts-search-create.sql
 \i contacts-messages-create.sql
Index: openacs-4/packages/contacts/sql/postgresql/upgrade/upgrade-1.2b5-1.2b6.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/sql/postgresql/upgrade/upgrade-1.2b5-1.2b6.sql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/contacts/sql/postgresql/upgrade/upgrade-1.2b5-1.2b6.sql	12 Mar 2006 09:36:35 -0000	1.1
@@ -0,0 +1,24 @@
+-- 
+-- packages/contacts/sql/postgresql/upgrade/upgrade-1.2b5-1.2b6.sql
+-- 
+-- @author Matthew Geddert (openacs@geddert.com)
+-- @creation-date 2006-03-12
+-- @arch-tag: 
+-- @cvs-id $Id: upgrade-1.2b5-1.2b6.sql,v 1.1 2006/03/12 09:36:35 matthewg Exp $
+--
+
+create table contact_deleted_history (
+        party_id                integer
+                                constraint contact_deleted_history_party_id_fk references parties(party_id) on delete cascade
+                                constraint contact_deleted_history_party_id_nn not null,
+        object_id               integer
+                                constraint contact_deleted_history_object_id_fk references acs_objects(object_id) on delete cascade
+                                constraint contact_deleted_history_object_id_nn not null,
+        deleted_by              integer
+                                constraint contact_deleted_history_deleted_by_fk references users(user_id) on delete cascade
+                                constraint contact_deleted_history_deleted_by_nn not null,
+        deleted_date            timestamptz default now()
+                                constraint contact_deleted_history_deleted_date not null,
+        unique(party_id,object_id)
+);
+
Index: openacs-4/packages/contacts/www/history.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/www/history.tcl,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/contacts/www/history.tcl	15 Feb 2006 10:06:36 -0000	1.2
+++ openacs-4/packages/contacts/www/history.tcl	12 Mar 2006 09:36:35 -0000	1.3
@@ -8,13 +8,47 @@
 } {
     {party_id:integer}
     {page "comments"}
+    {delete_object_id:integer ""}
+    {return_url ""}
 } -validate {
     contact_exists -requires {party_id} {
 	if { ![contact::exists_p -party_id $party_id] } {
 	    ad_complain "[_ contacts.lt_The_contact_specified]"
 	}
     }
+    delete_requires_return_url -requires {delete_object_id} {
+	if { $delete_object_id ne "" && $return_url eq "" } {
+	    ad_complain "[_ contacts.lt_Delete_requires_return_url]"
+	}
+    }
+    delete_permission -requires {delete_object_id return_url} {
+	set user_id [ad_conn user_id]
+	if { [permission::permission_p -party_id $user_id -object_id [ad_conn package_id] -privilege admin] } {
+	    set delete_permission "all"
+	} else {
+	    set delete_permission [string tolower [parameter::get -parameter "DeleteHistoryPermission" -default "no"]]
+	}
+	if { [lsearch [list yours all] $delete_permission] < 0 } {
+	    ad_complain "[_ contacts.lt_No_perm_to_delete_from_hist]"
+	} elseif { $delete_permission eq "yours" } {
+	    # we need to verify that they created this object
+	    acs_object::get -object_id $delete_object_id -array acs_object
+	    if { $user_id ne $acs_object(creation_user) } {
+		ad_complain "[_ contacts.lt_No_perm_to_delete_from_hist]"
+	    }
+	}
+    }
 }
+
 contact::require_visiblity -party_id $party_id
 
+if { $delete_object_id ne "" && $return_url ne "" } {
+    if { ![db_0or1row object_already_deleted_in_history {}] } {
+	set user_id [ad_conn user_id]
+	db_dml delete_object_from_history {}
+	ad_returnredirect $return_url
+	ad_script_abort
+    }
+}
+
 ad_return_template
Index: openacs-4/packages/contacts/www/history.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/www/history.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/contacts/www/history.xql	12 Mar 2006 09:36:35 -0000	1.1
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<queryset>
+
+<fullquery name="object_already_deleted_in_history">
+      <querytext>
+	select 1
+          from contact_deleted_history
+         where object_id = :delete_object_id
+      </querytext>
+</fullquery>
+
+<fullquery name="delete_object_from_history">
+      <querytext>
+	insert into contact_deleted_history
+               ( party_id, object_id, deleted_by, deleted_date )
+               values
+               ( :party_id, :delete_object_id, :user_id, now() )
+      </querytext>
+</fullquery>
+
+</queryset>