Index: openacs-4/packages/contacts/lib/email.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/email.tcl,v diff -u -N -r1.19 -r1.20 --- openacs-4/packages/contacts/lib/email.tcl 3 Feb 2006 01:29:28 -0000 1.19 +++ openacs-4/packages/contacts/lib/email.tcl 20 Feb 2006 09:13:58 -0000 1.20 @@ -31,7 +31,7 @@ set recipients [list] foreach party_id $party_ids { if {![empty_string_p $party_id]} { - lappend recipients [list "[contact::name -party_id $party_id] ([cc_email_from_party $party_id])" $party_id] + lappend recipients [list "[contact::name -party_id $party_id] ([contact::message::email_address -party_id $party_id])" $party_id] } } @@ -173,13 +173,13 @@ } -on_submit { # We get the attribute_id of the salutation attribute - set attribute_id [db_string get_attribute_id { } -default {}] + set attribute_id [attribute::id -object_type "person" -attribute_name "salutation"] # List to store know wich emails recieved the message set recipients_addr [list] set from [ad_conn user_id] - set from_addr [cc_email_from_party $from] + set from_addr [contact::email -party_id $from] # Remove all spaces in cc regsub -all " " $cc "" cc @@ -216,7 +216,7 @@ set salutation "Dear ladies and gentlemen" set locale [lang::user::site_wide_locale -user_id $party_id] } - set to_addr [cc_email_from_party $party_id] + set to_addr [contact::message::email_address -party_id $party_id] set date [lc_time_fmt [dt_sysdate] "%q"] set to $name Index: openacs-4/packages/contacts/lib/email.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/email.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/contacts/lib/email.xql 24 Oct 2005 18:11:03 -0000 1.1 +++ openacs-4/packages/contacts/lib/email.xql 20 Feb 2006 09:13:58 -0000 1.2 @@ -12,15 +12,4 @@ - - - select - attribute_id - from - ams_attributes - where - attribute_name = 'salutation'; - - - - \ No newline at end of file + Index: openacs-4/packages/contacts/lib/oo_mailing.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/oo_mailing.tcl,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/contacts/lib/oo_mailing.tcl 31 Jan 2006 11:49:22 -0000 1.7 +++ openacs-4/packages/contacts/lib/oo_mailing.tcl 20 Feb 2006 09:13:58 -0000 1.8 @@ -190,7 +190,7 @@ set to_addr $employee(email) } else { set name [contact::name -party_id $party_id] - set to_addr [cc_email_from_party $party_id] + set to_addr [contact::message::email_address -party_id $party_id] set salutation "Dear ladies and gentlemen" set locale [lang::user::site_wide_locale -user_id $party_id] } @@ -202,7 +202,7 @@ # We are going to create a multirow which knows about the file (revision_id) and contains # the parsed e-mail. - set to_addr [party::email -party_id $party_id] + set to_addr [contact::message::email_address -party_id $party_id] template::multirow append messages $revision_id $to_addr "" [contact::message::interpolate -text $subject -values $values] [contact::message::interpolate -text $email_content -values $values] } @@ -219,7 +219,7 @@ if {$subject ne ""} { set from [ad_conn user_id] - set from_addr [cc_email_from_party $from] + set from_addr [contact::email -party_id $from] set package_id [ad_conn package_id] template::multirow foreach messages { Index: openacs-4/packages/contacts/tcl/contact-message-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/tcl/contact-message-procs.tcl,v diff -u -N -r1.21 -r1.22 --- openacs-4/packages/contacts/tcl/contact-message-procs.tcl 15 Feb 2006 10:06:36 -0000 1.21 +++ openacs-4/packages/contacts/tcl/contact-message-procs.tcl 20 Feb 2006 09:13:58 -0000 1.22 @@ -158,84 +158,112 @@ ad_proc -private contact::message::email_address_exists_p { {-party_id:required} } { - Does a email address exist for this party. Cached + Does a message email address exist for this party or his/her employer. Cached via contact::message::email_address. } { - return [util_memoize [list ::contact::message::email_address_exists_p_not_cached -party_id $party_id]] + return [string is false [empty_string_p [contact::message::email_address -party_id $party_id]]] } -ad_proc -private contact::message::email_address_exists_p_not_cached { +ad_proc -private contact::message::email_address { {-party_id:required} } { - Does a email address exist for this party + Does a message email address exist for this party } { - return [string is false [empty_string_p [contact::email -party_id $party_id]]] + return [util_memoize [list ::contact::message::email_address_not_cached -party_id $party_id]] } -ad_proc -private contact::message::mailing_address_exists_p { +ad_proc -private contact::message::email_address_not_cached { {-party_id:required} } { - Does a mailing address exist for this party. Cached + Does a message email address exist for this party } { - return [util_memoize [list ::contact::message::mailing_address_exists_p_not_cached -party_id $party_id]] + set email [contact::email -party_id $party_id] + if { $email eq "" } { + # if this person is the employee of + # an organization we can attempt to use + # that organizations email address + foreach employer_id [contact::util::get_employers] { + set email [contact::email -party_id $employer_id] + if { $email ne "" } { + break + } + } + } + return $email } -ad_proc -private contact::message::mailing_address_exists_p_not_cached { +ad_proc -private contact::message::mailing_address_exists_p { {-party_id:required} } { - Does a mailing address exist for this party + Does a mailing address exist for this party. Cached via contact::message::mailing_address. } { - set attribute_ids [contact::message::mailing_address_attribute_id_priority] - set revision_id [contact::live_revision -party_id $party_id] - if { [llength $attribute_ids] > 0 } { - if { [db_0or1row mailing_address_exists_p " select '1' from ams_attribute_values where object_id = :revision_id and attribute_id in ('[join $attribute_ids {','}]') limit 1 "] } { - return 1 - } else { - return 0 - } - } else { - return 0 - } + # since this check is almost always called by a page which + # will later ask for the mailing address we take on the + # overhead of calling for the address, which is cached. + # this simplifies the code and thus "pre" caches the address + # for the user, which overall is faster + + return [string is false [empty_string_p [contact::message::mailing_address -party_id $party_id -format "text"]]] } ad_proc -private contact::message::mailing_address { {-party_id:required} {-format "text/plain"} } { - Does a mailing address exist for this party + Returns a parties mailing address. Cached } { regsub -all "text/" $format "" format if { $format != "html" } { set format "text" } + return [util_memoize [list ::contact::message::mailing_address_not_cached -party_id $party_id -format $format -package_id [ad_conn package_id]]] +} - set attribute_ids [contact::message::mailing_address_attribute_id_priority] +ad_proc -private contact::message::mailing_address_not_cached { + {-party_id:required} + {-format:required} + {-package_id:required} +} { + Returns a parties mailing address +} { + set attribute_ids [contact::message::mailing_address_attribute_id_priority -package_id $package_id] set revision_id [contact::live_revision -party_id $party_id] set mailing_address {} - db_foreach mailing_address_values " - select attribute_id, - ams_attribute_value__value(attribute_id,value_id) as value - from ams_attribute_values - where object_id = :revision_id - and attribute_id in ('[join $attribute_ids {','}]') - " { - set attribute_value($attribute_id) $value + foreach attribute_id $attribute_ids { + set mailing_address [ams::value \ + -object_id $revision_id \ + -attribute_id $attribute_id \ + -format $format] + if { $mailing_address ne "" } { + break + } } - foreach attribute $attribute_ids { - if { [info exists attribute_value($attribute)] } { - set mailing_address [ams::widget \ - -widget postal_address \ - -request "value_${format}" \ - -value $value \ - ] - - break - } + if { $mailing_address eq "" } { + # if this person is the employee of + # an organization we can attempt to use + # that organizations email address + foreach employer_id [contact::util::get_employers] { + set mailing_address [contact::message::mailing_address -party_id $employer_id -package_id $package_id] + if { $mailing_address ne "" } { + break + } + } } return $mailing_address } + + ad_proc -private contact::message::mailing_address_attribute_id_priority { + {-package_id:required} } { + Returns the order of priority of attribute_ids for the letter mailing address. Cached +} { + return [util_memoize [list ::contact::message::mailing_address_attribute_id_priority_not_cached -package_id $package_id]] +} + +ad_proc -private contact::message::mailing_address_attribute_id_priority_not_cached { + {-package_id:required} +} { Returns the order of priority of attribute_ids for the letter mailing address } { set attribute_ids [parameter::get -parameter "MailingAddressAttributeIdOrder" -default {}] @@ -466,3 +494,32 @@ return $new_file } + + + + + + + + +ad_proc -public -callback contacts::redirect -impl contactspdfs { + {-party_id ""} + {-action ""} +} { + redirect the contact to the correct pdf stuff +} { + + ns_log notice "got here..." + set url [ad_conn url] + if { [regexp "^[ad_conn package_url]pdfs/" $url match] } { + # this is a pdf url + set filename [lindex [ad_conn urlv] end] + if { ![regexp "^contacts_.*?_[ad_conn user_id](.*).pdf$" $filename match] || ![file exists "/tmp/${filename}"] } { + ad_return_error "No Permission" "You do not have permission to view this file, or the temporary file has been deleted." + } else { + ns_returnfile 200 "application/pdf" "/tmp/${filename}" + } + } + +} + Index: openacs-4/packages/contacts/tcl/contacts-callback-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/tcl/contacts-callback-procs.tcl,v diff -u -N -r1.26 -r1.27 --- openacs-4/packages/contacts/tcl/contacts-callback-procs.tcl 16 Feb 2006 14:06:43 -0000 1.26 +++ openacs-4/packages/contacts/tcl/contacts-callback-procs.tcl 20 Feb 2006 09:13:58 -0000 1.27 @@ -17,6 +17,28 @@ After instantiate callback } - +ad_proc -public -callback contact::label { + {-request:required} + {-for ""} +} { + You can request one of: + 1. ad_form_option (list of pretty name key to be used in ad_form) + 2. template (the template and stylesheet parts of a page template) the option selected + will be passed to the callback as 'for', so the template should only be returned if + it matches the option provided by this implementation from ad_form_option +} - + +ad_proc -public -callback contact::envelope { + {-request:required} + {-for ""} +} { + You can request one of: + 1. ad_form_option (list of pretty name key to be used in ad_form) + 2. template (the template and stylesheet parts of a page template) the option selected + will be passed to the callback as 'for', so the template should only be returned if + it matches the option provided by this implementation from ad_form_option +} - + ad_proc -public -callback contact::contact_form { {-package_id:required} {-form:required} @@ -255,3 +277,132 @@ } } } + + +ad_proc -public -callback contact::label -impl avery5160 { + {-request:required} + {-for ""} +} { +} { + switch $request { + ad_form_option { + return [list "Avery 5160 (1in x 2.5in, 30 per sheet)" avery5160] + } + template { + if { $for == "avery5160" } { + return { + + + + +} + } + } + } + +} + +ad_proc -public -callback contact::envelope -impl envelope10 { + {-request:required} + {-for ""} +} { +} { + switch $request { + ad_form_option { + return [list "Envelope \#10 (9.5in x 4.125in)" envelope10] + } + template { + if { $for == "envelope10" } { + return { + + + + + +} + } + } + } + +} Index: openacs-4/packages/contacts/tcl/contacts-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/tcl/contacts-procs.tcl,v diff -u -N -r1.59 -r1.60 --- openacs-4/packages/contacts/tcl/contacts-procs.tcl 15 Feb 2006 10:06:36 -0000 1.59 +++ openacs-4/packages/contacts/tcl/contacts-procs.tcl 20 Feb 2006 09:13:58 -0000 1.60 @@ -143,7 +143,7 @@ return $contact_list } - ad_proc -public contact::util::get_employees_list_of_lists { +ad_proc -public contact::util::get_employees_list_of_lists { {-organization_id:required} } { get employees of an organization in a list of list suitable for inclusion in options @@ -170,6 +170,16 @@ } { Get employers of an employee + @return List of lists, each containing the ID and name of an employer, or an empty list if no employers exist. +} { + return [util_memoize [list contact::util::get_employers_not_cached -employee_id $employee_id]] +} + +ad_proc -private contact::util::get_employers_not_cached { + {-employee_id:required} +} { + Get employers of an employee + @author Al-Faisal El-Dajani (faisal.dajani@gmail.com) @param employee_id The ID of the employee whom you want to know his/her employer @creation-date 2005-10-17 @@ -192,6 +202,7 @@ return $contact_list } + ad_proc -public contact::salutation { {-party_id:required} {-type salutation} @@ -305,7 +316,7 @@ @param organization_id ID of the organization whose information should be returned if the employee_id is an employee at this organization. If not specified, defaults to first employer relationship found, if any. } { - ns_log notice "start processing" + # ons_log notice "start processing" set employer_exist_p 0 set employee_attributes [list "first_names" "last_name" "person_title" "directphoneno" "directfaxno" "email" "jobtitle" "person_title"] set employer_attributes [list "name" "company_phone" "company_fax" "email" "company_name_ext"] @@ -455,6 +466,8 @@ } { util_memoize_flush "::contact::email_address_exists_p_not_cached -party_id $party_id" util_memoize_flush "::contact::mailing_address_exists_p_not_cached -party_id $party_id" + util_memoize_flush "::contact::mailing_address_not_cached -party_id $party_id -format html" + util_memoize_flush "::contact::mailing_address_not_cached -party_id $party_id -format text" util_memoize_flush "::contact::name_not_cached -party_id $party_id" util_memoize_flush "::contact::email_not_cached -party_id $party_id" util_memoize_flush_regexp "::contact::employee::get_not_cached -employee_id $party_id *" @@ -509,34 +522,23 @@ } { this returns the contact's name } { - set email [db_string get_party_email { select email from parties where party_id = :party_id } -default {}] + # we should use party::email here but + # we need to wait for the new version of + # acs-subsite to be release to remove + # the dependence on contacts which + # would cause an infinit loop + set email [cc_email_from_party $party_id] if { ![exists_and_not_null email] } { - # we check if these is an ams_attribute_valued email address for this party - set attribute_id [contact::email_attribute_id] + # we check if there is an ams_attribute_valued email address for this party + set attribute_id [attribute::id -object_type "party" -attribute_name "email"] set revision_id [contact::live_revision -party_id $party_id] if { [exists_and_not_null revision_id] } { - set email [db_string get_email { select ams_attribute_value__value(:attribute_id,value_id) from ams_attribute_values where object_id = :revision_id and attribute_id = :attribute_id } -default {}] - set email [ams::widget -widget email -request value_text -value $email] + set email [ams::value -object_id $revision_id -attribute_id $attribute_id] } } return $email } -ad_proc -private contact::email_attribute_id { -} { - this returns the email attributes attribute_id. cached -} { - return [util_memoize [list ::contact::email_attribute_id]] -} - -ad_proc -private contact::email_attribute_id { -} { - this returns the email attributes attribute_id -} { - return [db_string get_email_attribute_id { select attribute_id from acs_attributes where object_type = 'party' and attribute_name = 'email'}] -} - - ad_proc -public contact::link { {-party_id:required} } { @@ -562,15 +564,6 @@ } else { return "" } -# if {[contact::user_p -party_id $party_id]} { -# return "user" -# } elseif {[person::person_p -party_id $party_id]} { -# return "person" -# } elseif {[organization::organization_p -party_id $party_id]} { -# return "organization" -# } else { -# return "" -# } } ad_proc -public contact::exists_p { @@ -585,40 +578,20 @@ } else { return 0 } -# if {[person::person_p -party_id $party_id]} { -# return 1 -# } elseif {[organization::organization_p -party_id $party_id]} { -# return 1 -# } else { -# return 0 -# } } ad_proc -public contact::user_p { {-party_id:required} } { is this party a user? Cached } { -# return [util_memoize [list ::contact::user_p_not_cached -party_id $party_id]] if { [contact::type -party_id $party_id] == "user" } { return 1 } else { return 0 } } -#ad_proc -public contact::user_p_not_cached { -# {-party_id:required} -#} { -# is this party a person? Cached -#} { -# if {[db_0or1row contact_user_exists_p {select '1' from users where user_id = :party_id}]} { -# return 1 -# } else { -# return 0 -# } -#} - ad_proc -public contact::require_visiblity { {-party_id:required} {-package_id ""} @@ -712,6 +685,7 @@ set username [contact::email -party_id $person_id] set authority_id [auth::authority::local] + # Make sure that we do not upgrade an already existing user if {![contact::user_p -party_id $person_id]} { db_transaction { Index: openacs-4/packages/contacts/www/message.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/www/message.tcl,v diff -u -N -r1.26 -r1.27 --- openacs-4/packages/contacts/www/message.tcl 16 Feb 2006 14:07:37 -0000 1.26 +++ openacs-4/packages/contacts/www/message.tcl 20 Feb 2006 09:13:58 -0000 1.27 @@ -24,7 +24,7 @@ {context_id:integer ""} } -validate { valid_message_type -requires {message_type} { - if { [lsearch [list oo_mailing email letter label] $message_type] < 0 } { + if { ![db_0or1row check_for_it { select 1 from contact_message_types where message_type = :message_type and message_type not in ('header','footer') }] } { ad_complain "[_ contacts.lt_Your_provided_an_inva]" } } @@ -80,7 +80,7 @@ set contact_link [lindex $recipient 2] set email_p [lindex $recipient 3] set letter_p [lindex $recipient 4] - if { $message_type == "letter" || $message_type == "label" } { + if { [lsearch [list "letter" "label" "envelope"] $message_type] >= 0 } { if { $letter_p } { lappend party_ids $party_id lappend recipients $contact_link @@ -205,7 +205,7 @@ set message_options [list] foreach op $message_type_options { set message_type [lindex $op 1] - if {$message_type == "letter" || $message_type == "email" || $message_type == "label" } { + if { [lsearch [list "header" "footer"] $message_type] < 0 } { lappend message_options [list "-- [_ contacts.New] [lindex $op 0] --" $message_type] } else { set ${message_type}_options [list [list [_ contacts.--none--] ""]]