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 "belongs" 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 "email" 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"><li> The role you entered \"%pretty_name%\" or the plural \"%pretty_plural%\" 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 -></msg> <msg key="lt_not_created_in_the_la">not created in the last -></msg> <msg key="lt_not_updated_in_the_la">not updated in the last -></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>