Commit 52a56d02 authored by Malte Sussdorff's avatar Malte Sussdorff

Initial Import

parents
Pipeline #541 failed with stages
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="mail-tracking" package_version="0.6" locale="de_DE" charset="ISO-8859-1">
<msg key="Attachments">Dateianhnge</msg>
<msg key="BCC">BCC</msg>
<msg key="Body">Inhalt</msg>
<msg key="CC">CC</msg>
<msg key="Emails_to">Email ansehen fr die:</msg>
<msg key="Employees">Mitarbeiter</msg>
<msg key="Forward">Weiterleiten</msg>
<msg key="Forward_message">Nachricht weiterleiten</msg>
<msg key="Go_Back">Zurck</msg>
<msg key="Mail_Tracking">Mail Tracking</msg>
<msg key="MessageID">MessageID</msg>
<msg key="messages">Nachrichten</msg>
<msg key="One_message">Eine Nachricht</msg>
<msg key="Organization">Organisation</msg>
<msg key="Package">Paket</msg>
<msg key="Recipient">Empfnger</msg>
<msg key="Request_mail_tracking_for_instance_name">Mail Tracking fr %instance_name% einrichten</msg>
<msg key="Request_Notification_for_instance_name">Benachrichtigung fr %instance_name% beantragen</msg>
<msg key="Sender">Absender</msg>
<msg key="Sent_Date">Versanddatum</msg>
<msg key="Subject">Betreff</msg>
<msg key="The_specified_message_does_not_exist">Die angegebene Nachricht existiert nicht.</msg>
<msg key="View">Ansehen</msg>
<msg key="View_full_message">Die gesamte Nachricht ansehen</msg>
<msg key="You_have_requested_to_track_emails_from_this_package">Sie haben das Mail Tracking fr diese Paket aktiviert (&lt;a href=&quot;%sub_url%&quot;&gt;deaktivieren&lt;/a&gt;).</msg>
<msg key="You_may_request_mail_tracking_for_this_package">Sie knnen &lt;a href=&quot;%sub_url%&quot;&gt; das Mail Tracking fr dieses Paket aktivieren&lt;/a&gt;: '%pretty_name%'.</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="mail-tracking" package_version="0.6.2" locale="en_US" charset="ISO-8859-1">
<msg key="Attachments">Attachments</msg>
<msg key="BCC">BCC</msg>
<msg key="Body">Body</msg>
<msg key="CC">CC</msg>
<msg key="Emails_to">Watch Emails to:</msg>
<msg key="Employees">Employees</msg>
<msg key="Files">Files</msg>
<msg key="Forward">Forward</msg>
<msg key="Forward_message">Forward message</msg>
<msg key="Go_Back">Go Back</msg>
<msg key="Mail_Tracking">Mail Tracking</msg>
<msg key="MessageID">MessageID</msg>
<msg key="messages">messages</msg>
<msg key="Object_id">Object Id</msg>
<msg key="One_message">One Message</msg>
<msg key="Organization">Organization</msg>
<msg key="Package">Package</msg>
<msg key="Recipient">Recipient</msg>
<msg key="Request_mail_tracking_for_instance_name">Request mail tracking for %instance_name%</msg>
<msg key="Request_Notification_for_instance_name">Request Notification for %instance_name%</msg>
<msg key="Sender">Sender</msg>
<msg key="Sent_Date">Sent Date</msg>
<msg key="Subject">Subject</msg>
<msg key="The_specified_message_does_not_exist">The specified message does not exist</msg>
<msg key="View">View</msg>
<msg key="View_full_message">View Full Message</msg>
<msg key="You_have_requested_to_track_emails_from_this_package">You have requested to track emails from this package (&lt;a href=&quot;%sub_url%&quot;&gt;unsubscribe&lt;/a&gt;).</msg>
<msg key="You_may_request_mail_tracking_for_this_package">You may &lt;a href=&quot;%sub_url%&quot;&gt;request mail tracking&lt;/a&gt; for this package: '%pretty_name%'.</msg>
</message_catalog>
<property name="title">@page_title;noquote@</property>
<property name="context">@context;noquote@</property>
<if @show_filter_p@ eq t>
<listfilters name="messages" style="select-menu"></listfilters>
</if>
<listtemplate name="messages"></listtemplate>
# Expects the following optional parameters (in each combination):
#
# recipient - to filter mails for a single receiver
# sender - to filter mails for a single sender
# object_id - to filter mails for a object_id
# party - filter for the recipient, which is actually a sender or recipient
# page - to filter the pagination
# page_size - to know how many rows show (optional default to 10)
# show_filter_p - to show or not the filters in the inlcude, default to "t"
# from_package_id - to watch mails of this package instance
# elements - a list of elements to show in the list template. If not provided will show all elements.
# Posible elemets are: sender recipient pkg_id subject object file_ids body sent_date
ad_page_contract {
@author Nima Mazloumi
@creation-date Mon May 30 17:55:50 CEST 2005
@cvs-id $Id$
} -query {
recipient_id:optional
sender_id:optional
recipient:optional
party:optional
{emp_mail_f:optional 1}
sender:optional
from_package_id:optional
object_id:optional
object:optional
{orderby:optional "sent_date,desc"}
} -properties {
show_filter_p
acs_mail_log:multirow
context:onevalue
}
set page_title [ad_conn instance_name]
set context [list "index"]
set required_param_list [list]
set optional_param_list [list from_package_id recipient_id object_id party]
set optional_unset_list [list pkg_id object recipient sender]
foreach required_param $required_param_list {
if {![info exists $required_param]} {
return -code error "$required_param is a required parameter."
}
}
foreach optional_param $optional_param_list {
if {![info exists $optional_param]} {
set $optional_param {}
}
}
foreach optional_unset $optional_unset_list {
if {[info exists $optional_unset]} {
if {[empty_string_p [set $optional_unset]]} {
unset $optional_unset
}
}
}
set package_id_list [list]
if { [exists_and_not_null sender_id] } {
set sender $sender_id
}
if { [exists_and_not_null recipient_id] } {
set recipient $recipient_id
set package_id_list [concat $package_id_list [db_list package_ids "select package_id from acs_mail_log where recipient_id = :sender"]]
}
if { [exists_and_not_null object_id] } {
set object $object_id
}
if { [exists_and_not_null from_package_id] } {
set pkg_id $from_package_id
}
if { ![exists_and_not_null show_filter_p] } {
set show_filter_p "t"
}
if { ![exists_and_not_null page_size] } {
set page_size 5
}
set tracking_url [apm_package_url_from_key "mail-tracking"]
# Wich elements will be shown on the list template
set rows_list [list]
if {![exists_and_not_null elements] } {
set rows_list [list sender {} recipient {} pkg_id {} subject {} object {} file_ids {} body {} sent_date {}]
} else {
foreach element $elements {
lappend rows_list $element
lappend rows_list [list]
}
}
set filters [list \
sender {
label "[_ mail-tracking.Sender]"
where_clause "sender_id = :sender"
} \
object {
label "[_ mail-tracking.Object_id]"
where_clause "object_id = :object"
}
]
if { [apm_package_installed_p contacts] && [exists_and_not_null recipient]} {
set org_p [organization::organization_p -party_id $recipient]
if { $org_p } {
lappend filters emp_mail_f {
label "[_ mail-tracking.Emails_to]"
values { {"[_ mail-tracking.Organization]" 1} { "[_ mail-tracking.Employees]" 2 }}
}
}
if { $org_p && [string equal $emp_mail_f 2] } {
set emp_list [contact::util::get_employees -organization_id $recipient]
lappend emp_list $recipient
set recipient_where_clause " and mlrm.recipient_id in ([template::util::tcl_to_sql_list $emp_list])"
} else {
set recipient_where_clause " and mlrm.recipient_id = :recipient"
}
} elseif { [exists_and_not_null recipient] } {
set recipient_where_clause " and mlrm.recipient_id = :recipient"
} elseif { [exists_and_not_null party]} {
set recipient_where_clause " and (mlrm.recipient_id = :party or sender_id = :party)"
} else {
set recipient_where_clause ""
}
# If we have a recipient filter, offer the filter for package_ids
set package_id_list [list]
if {$recipient_where_clause ne ""} {
set package_ids [db_list package_ids "select distinct package_id as package_id2 from acs_mail_log ml, acs_mail_log_recipient_map mlrm where ml.log_id = mlrm.log_id $recipient_where_clause"]
foreach package_id2 $package_ids {
lappend package_id_list [list [acs_object_name $package_id2] $package_id2]
}
}
# Always append the filter for package_ids, but note that it is only selectable if we filter by recipient
lappend filters pkg_id {
label "[_ mail-tracking.Package]"
values $package_id_list
where_clause "package_id = :pkg_id"
}
template::list::create \
-name messages \
-selected_format normal \
-multirow messages \
-key acs_mail_log.log_id \
-page_size $page_size \
-page_flush_p 1 \
-page_query_name "messages_pagination" \
-row_pretty_plural "[_ mail-tracking.messages]" \
-elements {
sender {
label "[_ mail-tracking.Sender]"
display_template {
@messages.sender_name;noquote@
}
}
recipient {
label "[_ mail-tracking.Recipient]"
display_template {
@messages.recipient;noquote@
}
}
pkg_id {
label "[_ mail-tracking.Package]"
display_template {
<a href="@messages.package_url@">@messages.package_name@</a>
}
}
subject {
label "[_ mail-tracking.Subject]"
}
object {
label "[_ mail-tracking.Object_id]"
display_template {
<a href="@messages.object_url@">@messages.object_id@</a>
}
}
file_ids {
label "[_ mail-tracking.Files]"
display_template {@messages.download_files;noquote@}
}
body {
label "[_ mail-tracking.Body]"
display_template {
<a href="${tracking_url}one-message?log_id=@messages.log_id@" title="#mail-tracking.View_full_message#">#mail-tracking.View#</a>
}
}
sent_date {
label "[_ mail-tracking.Sent_Date]"
}
} -orderby {
sender {
orderby sender_id
label "[_ mail-tracking.Sender]"
}
pkg_id {
orderby package_id
label "[_ mail-tracking.Package]"
}
subject {
orderby subject
label "[_ mail-tracking.Subject]"
}
sent_date {
orderby sent_date
label "[_ mail-tracking.Sent_Date]"
}
} -formats {
normal {
label "Table"
layout table
row $rows_list
}
} -filters $filters \
db_multirow -extend { file_ids object_url sender_name recipient package_name package_url url_message_id download_files} messages select_messages { } {
if {[exists_and_not_null sender_id]} {
if { [apm_package_installed_p contacts] } {
set sender_name "<a href=\"[contact::url -party_id $sender_id -package_id [contact::package_id -party_id $sender_id]]\">[party::name -party_id $sender_id]</a>"
} else {
set sender_name "[party::name -party_id $sender_id]"
}
} else {
set sender_name $from_addr
}
set reciever_list [list]
set reciever_list2 [db_list get_recievers {select recipient_id from acs_mail_log_recipient_map where type ='to' and log_id = :log_id and recipient_id is not null}]
foreach recipient_id $reciever_list2 {
if { [apm_package_installed_p contacts] } {
lappend reciever_list "<a href=\"[contact::url -party_id $recipient_id -package_id [contact::package_id -party_id $recipient_id]]\">[party::name -party_id $recipient_id]</a>"
} else {
lappend reciever_list "[party::name -party_id $recipient_id]</a>"
}
}
set recipient [join $reciever_list "<br>"]
if {[exists_and_not_null package_id]} {
set package_name [apm_instance_name_from_id $package_id]
set package_url [apm_package_url_from_id $package_id]
} else {
set package_name ""
set package_url ""
}
set count 0
while {[regexp {^(.*?)\t?=\?[^\?]+\?Q\?(.*?)\?=\n?(.*?)$} $subject match before quoted after] && $count < 5} {
incr count
set result ""
for { set i 0 } { $i < [string length $quoted] } { incr i } {
set current [string index $quoted $i]
if {$current == "="} {
incr i
set high [string index $quoted $i]
incr i
set low [string index $quoted $i]
set current [binary format H2 "$high$low"]
} elseif {[string eq $current "_"]} {
set current " "
}
append result $current
}
set subject "$before$result$after"
}
set files [db_list files {}]
foreach file_id $files {
set title [content::item::get_title -item_id $file_id]
append download_files "<a href=\"[export_vars -base "${tracking_url}download/$title" -url {file_id}]\">$title</a><br>"
}
set object_url "/o/$object_id"
}
ad_return_template
\ No newline at end of file
<?xml version="1.0"?>
<queryset>
<rdbms><type>postgresql</type><version>7.1</version></rdbms>
<fullquery name="select_messages">
<querytext>
select
message_id,
sender_id,
from_addr,
package_id,
sent_date,
body,
subject,
object_id,
log_id
from
acs_mail_log
where [template::list::page_where_clause -name messages]
[template::list::filter_where_clauses -and -name messages]
[template::list::orderby_clause -orderby -name messages]
</querytext>
</fullquery>
<fullquery name="messages_pagination">
<querytext>
select distinct ml.log_id, sent_date
from acs_mail_log ml left outer join acs_mail_log_recipient_map mlrm on (ml.log_id=mlrm.log_id)
where ml.log_id is not null
$recipient_where_clause
[template::list::filter_where_clauses -and -name messages]
[template::list::orderby_clause -orderby -name messages]
</querytext>
</fullquery>
<fullquery name="files">
<querytext>
select file_id from acs_mail_log_attachment_map
where log_id = :log_id
</querytext>
</fullquery>
</queryset>
<?xml version="1.0"?>
<!-- Generated by the OpenACS Package Manager -->
<package key="mail-tracking" url="http://openacs.org/repository/apm/packages/mail-tracking" type="apm_service">
<package-name>Mail Tracking</package-name>
<pretty-plural>Mail Tracking</pretty-plural>
<initial-install-p>f</initial-install-p>
<singleton-p>t</singleton-p>
<auto-mount>tracking</auto-mount>
<version name="0.6.5" url="http://openacs.org/repository/download/apm/mail-tracking-0.6.5.apm">
<owner url="mailto:mazloumi@uni-mannheim.de">Nima Mazloumi</owner>
<summary>Mail tracking package. Records all messages send out by acs-mail-lite.</summary>
<release-date>2005-10-24</release-date>
<description format="text/html">This package provides two ways to track emails sent out by acs-mail-lite:
- Simply track all when the &lt;code&gt;TrackAllMails&lt;/code&gt; parameter is set.
- Admin requests explizitly the tracking for a package instance. See in the documentation for how to do that.
</description>
<maturity>0</maturity>
<provides url="mail-tracking" version="0.6.5"/>
<requires url="acs-kernel" version="5.3.0d1"/>
<requires url="acs-mail-lite" version="1.3b11"/>
<callbacks>
</callbacks>
<parameters>
<parameter datatype="number" min_n_values="1" max_n_values="1" name="TrackAllMails" default="1" description="Wether to track simply all mails leaving acs-mail-lite or only those requested by the admin."/>
</parameters>
</version>
</package>
-- ================================================================================
-- Postgres SQL Script File
--
--
-- @Location: mail-tracking\sql\postgresql\acs_mail_log-create.sql
--
-- @author: Nima Mazloumi
-- @creation-date: Mon May 30 17:55:50 CEST 2005
-- @cvs-id $Id$
-- ================================================================================
--
--
-- ======================================================
-- Tracking Table acs_object_log --
-- ======================================================
create table acs_mail_log (
log_id integer
constraint acs_mail_log_log_id_pk
primary key,
message_id varchar(300),
-- object_id of the object that triggered the sending of the email
object_id integer
constraint acs_mail_log_owner_id_fk
references acs_objects(object_id),
sender_id integer
constraint acs_mail_log_sender_id_fk
references parties(party_id),
package_id integer,
subject varchar(1024),
body text,
-- List of CC/BCC E-Mail addresses, seperated by "," as passed in from acs-mail-lite::send prozedures
-- Only used for those emails that do not have a party_id in openacs.
cc varchar(4000),
bcc varchar(4000),
sent_date timestamp,
to_addr varchar(4000),
from_addr varchar(400));
create index acs_mail_log_object_idx on acs_mail_log(object_id);
create index acs_mail_log_sender_idx on acs_mail_log(sender_id);
create table acs_mail_log_recipient_map (
recipient_id integer constraint
acs_mail_log_recipient_id_fk
references parties(party_id),
log_id integer
constraint acs_mail_log_log_id_fk
references acs_mail_log(log_id),
type varchar(30)
);
create index acs_mail_log_recipient_map_log_idx on acs_mail_log_recipient_map(log_id);
create index acs_mail_log_recipient_map_recipient_idx on acs_mail_log_recipient_map(recipient_id);
create index acs_mail_log_um_log_rec_idx on acs_mail_log_recipient_map(log_id,recipient_id,type);
-- file_mapping_table
create table acs_mail_log_attachment_map (
log_id integer
constraint acs_mail_log_log_id2_fk
references acs_mail_log(log_id),
file_id integer
constraint acs_mail_log_file_id_fk
references cr_items(item_id)
);
create index acs_mail_log_att_map_file_idx on acs_mail_log_attachment_map(file_id);
create index acs_mail_log_att_map_log_idx on acs_mail_log_attachment_map(log_id);
-- create the content type
select acs_object_type__create_type (
'mail_log', -- content_type
'#mail-tracking.ACS_Mail_Log_Entry#', -- pretty_name
'#mail-tracking.ACS_Mail_Log_Entries#', -- pretty_plural
'acs_object', -- supertype
'acs_mail_log', -- table_name (should this be pm_task?)
'log_id', -- id_column
'mail_tracking', -- package_name
'f', -- abstract_p
NULL, -- type_extension_table
NULL -- name_method
);
create or replace function acs_mail_log__new (integer,varchar, integer, integer, varchar, varchar,integer,varchar,integer,integer,varchar,varchar,varchar)
returns integer as '
declare
p_log_id alias for $1;
p_message_id alias for $2;
p_sender_id alias for $3;
p_package_id alias for $4;
p_subject alias for $5;
p_body alias for $6;
p_creation_user alias for $7;
p_creation_ip alias for $8;
p_context_id alias for $9;
p_object_id alias for $10;
p_cc alias for $11;
p_bcc alias for $12;
p_to_addr alias for $13;
v_log_id acs_mail_log.log_id%TYPE;
begin
v_log_id := acs_object__new (
p_log_id, -- object_id
''mail_log'' -- object_type
);
insert into acs_mail_log
(log_id, message_id, sender_id, package_id, subject, body, sent_date, object_id, cc, bcc, to_addr)
values
(v_log_id, p_message_id, p_sender_id, p_package_id, p_subject, p_body, now(), p_object_id, p_cc, p_bcc, p_to_addr);
return v_log_id;
end;' language 'plpgsql';
create function acs_mail_log__delete (integer)
returns integer as'
declare
p_message_id alias for $1;
begin
delete from acs_mail_log where message_id = p_message_id;
raise NOTICE ''Deleting Acs Mail Log Entry...'';
PERFORM acs_object_delete(p_message_id);
return 0;
end;' language 'plpgsql';
-- ======================================================
-- Tracking requests table acs_mail_tracking_request --
-- ======================================================
create table acs_mail_tracking_request (
request_id integer
constraint acs_mail_request_id_pk
primary key,
user_id integer
constraint acs_mail_request_user_id_fk
references users (user_id),
-- on delete cascade,
-- The package instance this request pertains to
object_id integer
constraint acs_mail_request_object_id_fk
references acs_objects (object_id)
-- on delete cascade
);
create or replace function acs_mail_tracking_request__new (integer,integer,integer)
returns integer as '
DECLARE
p_request_id alias for $1;
p_object_id alias for $2;
p_user_id alias for $3;
v_request_id integer;
BEGIN
select t_acs_object_id_seq.NEXTVAL into v_request_id;
insert into acs_mail_tracking_request
(request_id, object_id, user_id)
values
(p_request_id, p_object_id, p_user_id);
return v_request_id;
END;
' language 'plpgsql';
create or replace function acs_mail_tracking_request__delete(integer)
returns integer as '
declare
p_request_id alias for $1;
begin
delete from acs_mail_tracking_request where request_id = p_request_id;
return 0;
end;
' language 'plpgsql';
create or replace function acs_mail_tracking_request__delete_all(integer)
returns integer as '
declare
v_request RECORD;
begin
for v_request in select request_id from acs_mail_tracking_request
loop
perform acs_mail_tracking_request__delete(v_request.request_id);
end loop;
return 0;
end;
' language 'plpgsql';
-- ======================================================
-- Tracking Trigger acs_mail_log_tr --
-- ======================================================
-- CREATE OR REPLACE FUNCTION public.acs_mail_log_tr()
-- RETURNS trigger AS
--'
--declare
-- v_recepient_id integer;
-- v_sender_id integer default 0;
-- v_track_all_p bool default 0;
-- v_object_id integer;
-- begin
--
-- if old.package_id is null then
-- raise notice \'Tracking: No way to track. Package Id was %. You need to check why.\', old.package_id;
-- return old;
-- end if;
--
-- v_recepient_id := substring (old.to_addr from \'user_id ([0-9]+)\');
-- select into v_sender_id party_id from parties where email = old.from_addr;
--
-- if v_recepient_id is null then
-- raise notice \'Tracking: Unable to extract user_id from: %. Not able to log this message.\', old.to_addr;
-- return old;
-- end if;
--
-- if v_sender_id is null then
-- raise notice \'Tracking: Unknown sender %. Not able to log this message.\', old.from_addr;
-- return old;
-- end if;
--
-- -- if TrackAllMails parameter is set to 0 we only track mails from packages that have requests
--
-- select into v_track_all_p pv.attr_value
-- from apm_parameter_values pv, apm_parameters p
-- where p.parameter_id = pv.parameter_id
-- and p.parameter_name = \'TrackAllMails\'
-- and p.package_key = \'mail-tracking\'
-- limit 1;
--
-- if v_track_all_p = \'1\' then
--
-- perform acs_mail_log__new (
-- old.message_id,
-- v_recepient_id,
-- v_sender_id,
-- old.package_id,
-- old.subject,
-- old.body
-- );
--
-- else
-- select into v_object_id object_id from acs_mail_tracking_request where object_id = old.package_id;
--
-- if v_object_id is not null then
--
-- raise notice \'Tracking: Logged mail for package_id %.\', v_object_id;
--
-- perform acs_mail_log__new (
-- old.message_id,
-- v_recepient_id,
-- v_sender_id,
-- old.package_id,
-- old.subject,
-- old.body
-- );
-- else
-- raise notice \'Tracking: No request for package id % and tracking all mails is turned off.\', old.package_id;
-- end if;
--
-- end if;
--
-- return old;
-- end;
--
-- LANGUAGE 'plpgsql';
--
--
--reate trigger acs_mail_log_tr after delete on acs_mail_lite_queue
--or each row execute procedure acs_mail_log_tr();
--
\ No newline at end of file
-- ================================================================================
-- Postgres SQL Script File
--
--
-- @Location: mail-tracking\sql\postgresql\acs_mail_log-drop.sql
--
-- @author: Nima Mazloumi
-- @creation-date: Mon May 30 17:55:50 CEST 2005
-- @cvs-id $Id$
-- ================================================================================
--
--
-- ======================================================
-- drop functions
-- ======================================================
drop function acs_mail_log_tr() cascade;
drop function acs_mail_log__new (integer, integer, integer, integer, varchar, varchar);
drop function acs_mail_log__delete (integer);
drop function acs_mail_tracking_request__new (integer,integer,integer);
drop function acs_mail_tracking_request__delete(integer);
drop function acs_mail_tracking_request__delete_all(integer);
-- ======================================================
--drop table
-- ======================================================
drop table acs_mail_log;
drop table acs_mail_tracking_request;
\ No newline at end of file
create index acs_mail_log_object_idx on acs_mail_log(object_id);
create index acs_mail_log_recipient_idx on acs_mail_log(recipient_id);
create index acs_mail_log_sender_idx on acs_mail_log(sender_id);
alter table acs_mail_log add column cc varchar(4000);
create or replace function acs_mail_log__new (integer,varchar, integer, integer, integer, varchar, varchar,integer,varchar,integer,integer,varchar)
returns integer as '
declare
p_log_id alias for $1;
p_message_id alias for $2;
p_recipient_id alias for $3;
p_sender_id alias for $4;
p_package_id alias for $5;
p_subject alias for $6;
p_body alias for $7;
p_creation_user alias for $8;
p_creation_ip alias for $9;
p_context_id alias for $10;
p_object_id alias for $11;
p_cc alias for $11;
v_log_id acs_mail_log.log_id%TYPE;
begin
v_log_id := acs_object__new (
p_log_id, -- object_id
''mail_log'' -- object_type
);
insert into acs_mail_log
(log_id, message_id, recipient_id, sender_id, package_id, subject, body, sent_date, object_id, cc)
values
(v_log_id, p_message_id, p_recipient_id, p_sender_id, p_package_id, p_subject, p_body, now(), p_object_id, p_cc);
return v_log_id;
end;' language 'plpgsql';
alter table acs_mail_log add constraint log_id_uq UNIQUE (log_id);
create table acs_mail_log_recipient_map (
recipient_id integer constraint
acs_mail_log_recipient_id_fk
references parties(party_id),
log_id integer
constraint acs_mail_log_log_id_fk
references acs_mail_log(log_id),
type varchar(30)
);
create index acs_mail_log_recipient_map_log_idx on acs_mail_log_recipient_map(log_id);
create index acs_mail_log_recipient_map_recipient_idx on acs_mail_log_recipient_map(recipient_id);
create index acs_mail_log_um_log_rec_idx on acs_mail_log_recipient_map(log_id,recipient_id,type);
insert into acs_mail_log_recipient_map (recipient_id, log_id, type) select recipient_id, log_id, 'to' from acs_mail_log;
update acs_mail_log set cc = null;
alter table acs_mail_log add column bcc varchar(4000);
alter table acs_mail_log add column to_addr varchar(4000);
alter table acs_mail_log drop column recipient_id;
create or replace function acs_mail_log__new (integer,varchar, integer, integer, varchar, varchar,integer,varchar,integer,integer,varchar,varchar,varchar)
returns integer as '
declare
p_log_id alias for $1;
p_message_id alias for $2;
p_sender_id alias for $3;
p_package_id alias for $4;
p_subject alias for $5;
p_body alias for $6;
p_creation_user alias for $7;
p_creation_ip alias for $8;
p_context_id alias for $9;
p_object_id alias for $10;
p_cc alias for $11;
p_bcc alias for $12;
p_to_addr alias for $13;
v_log_id acs_mail_log.log_id%TYPE;
begin
v_log_id := acs_object__new (
p_log_id, -- object_id
''mail_log'' -- object_type
);
insert into acs_mail_log
(log_id, message_id, sender_id, package_id, subject, body, sent_date, object_id, cc, bcc, to_addr)
values
(v_log_id, p_message_id, p_sender_id, p_package_id, p_subject, p_body, now(), p_object_id, p_cc, p_bcc, p_to_addr);
return v_log_id;
end;' language 'plpgsql';
-- file_mapping_table
create table acs_mail_log_attachment_map (
log_id integer
constraint acs_mail_log_log_id2_fk
references acs_mail_log(log_id),
file_id integer
constraint acs_mail_log_file_id_fk
references cr_items(item_id)
);
-- Get the file_ids and insert them into the tracking table
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, o.object_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m
where r.object_id_two = o.object_id
and o.object_type in ('content_item')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('content_revision')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('file_storage_object')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('image')
and r.object_id_one = m.log_id;
alter table acs_mail_log drop constraint acs_mail_log_object_id_fk;
create or replace function acs_mail_log__new (integer,varchar, integer, integer, varchar, varchar,integer,varchar,varchar,varchar)
returns integer as '
declare
p_log_id alias for $1;
p_message_id alias for $2;
p_sender_id alias for $3;
p_package_id alias for $4;
p_subject alias for $5;
p_body alias for $6;
p_object_id alias for $7;
p_cc alias for $8;
p_bcc alias for $9;
p_to_addr alias for $10;
begin
insert into acs_mail_log
(log_id, message_id, sender_id, package_id, subject, body, sent_date, object_id, cc, bcc, to_addr)
values
(p_log_id, p_message_id, p_sender_id, p_package_id, p_subject, p_body, now(), p_object_id, p_cc, p_bcc, p_to_addr);
return p_log_id;
end;' language 'plpgsql';
-- file_mapping_table
create table acs_mail_log_attachment_map (
log_id integer
constraint acs_mail_log_log_id2_fk
references acs_mail_log(log_id),
file_id integer
constraint acs_mail_log_file_id_fk
references cr_items(item_id)
);
create index acs_mail_log_att_map_file_idx on acs_mail_log_attachment_map(file_id);
create index acs_mail_log_att_map_log_idx on acs_mail_log_attachment_map(log_id);
-- Get the file_ids and insert them into the tracking table
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, o.object_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m
where r.object_id_two = o.object_id
and o.object_type in ('content_item')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('content_revision')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('file_storage_object')
and r.object_id_one = m.log_id;
insert into acs_mail_log_attachment_map (log_id, file_id) select r.object_id_one as log_id, cr.item_id as file_id
from acs_data_links r, acs_objects o, acs_mail_log m, cr_revisions cr
where r.object_id_two = o.object_id
and o.object_id = cr.revision_id
and o.object_type in ('image')
and r.object_id_one = m.log_id;
alter table acs_mail_log add column from_addr varchar(400);
\ No newline at end of file
# packages/mail-tracking/tcl/mail-tracking-callback-procs.tcl
ad_library {
Callback procs for mail tracking
@author Malte Sussdorff (sussdorff@sussdorff.de)
@creation-date 2005-06-15
@arch-tag: 9d6f99f7-cfec-40e6-8d3f-411f4d3c9b6c
@cvs-id $Id$
}
ad_proc -public -callback acs_mail_lite::complex_send -impl mail_tracking {
{-package_id:required}
{-from_party_id:required}
{-from_addr ""}
{-to_party_ids ""}
{-cc_party_ids ""}
{-bcc_party_ids ""}
{-to_addr ""}
{-cc_addr ""}
{-bcc_addr ""}
{-body ""}
{-message_id:required}
{-subject ""}
{-object_id ""}
{-file_ids ""}
} {
create a new entry in the mail tracking table
} {
# We need to put lindex here since the value from
# the swithc converts this "element element" to this
# "{element element}"
set file_ids [string trim $file_ids "{}"]
foreach optional_param {cc_party_ids bcc_party_ids to_addr cc_addr bcc_addr body subject object_id file_ids to_party_ids} {
if {![info exists $optional_param]} {
set $optional_param {}
}
}
set log_id [mail_tracking::new -package_id $package_id \
-sender_id $from_party_id \
-from_addr $from_addr \
-recipient_ids $to_party_ids \
-cc_ids $cc_party_ids \
-bcc_ids $bcc_party_ids \
-to_addr $to_addr \
-cc_addr $cc_addr \
-bcc_addr $bcc_addr \
-body $body \
-message_id $message_id \
-subject $subject \
-file_ids $file_ids \
-object_id $object_id]
}
ad_proc -public -callback acs_mail_lite::send -impl mail_tracking {
{-package_id:required}
{-from_party_id:required}
{-to_party_id:required}
{-body:required}
{-message_id:required}
{-subject:required}
} {
create a new entry in the mail tracking table
} {
set log_id [mail_tracking::new -package_id $package_id \
-sender_id $from_party_id \
-recipient_ids $to_party_id \
-body $body \
-message_id $message_id \
-subject $subject]
}
ad_proc -public -callback fs::file_delete -impl mail-tracking {
{-package_id:required}
{-file_id:required}
} {
Create a copy of the file and attach it to the mail-tracking entry, if the file is referenced
} {
if {[db_string file_attached_p "select 1 from acs_mail_log_attachment_map where file_id = :file_id" -default 0]} {
set package_id [apm_package_id_from_key mail-tracking]
set new_file_id [fs::file_copy -file_id $file_id -target_folder_id $package_id]
db_dml update_file "update acs_mail_log_attachment_map set file_id = :new_file_id where file_id = :file_id"
}
}
\ No newline at end of file
ad_library {
Mail-Tracking Display Procs.
Mail-Tracking is mostly a service package, but it does have some level of user interface.
These procs enable other packages to simply register for tracking.
@creation-date 2005-05-31
@author Nima Mazloumi <mazloumi@uni-mannheim.de>
@cvs-id $Id$
}
namespace eval mail_tracking::display {}
ad_proc -public mail_tracking::display::request_widget {
{-object_id:required}
{-url:required}
} {
Produce a widget for requesting tracking. If the mail-tracking package has not been
mounted then return the empty string.
} {
# Check that we're mounted
if { [empty_string_p [apm_package_url_from_key [mail_tracking::package_key]]] } {
return {}
}
#Check if we track already everything
set track_all_p [ad_parameter -package_id [apm_package_id_from_key [mail_tracking::package_key]] TrackAllMails "0"]
if {$track_all_p} {
return ""
}
# Check if subscribed
set request_id [mail_tracking::request::get_request_id -object_id $object_id]
set pretty_name [acs_object_name $object_id]
if {![empty_string_p $request_id]} {
set sub_url [ad_quotehtml [unsubscribe_url -request_id $request_id -url $url]]
set pretty_name [ad_quotehtml $pretty_name]
set sub_chunk "[_ mail-tracking.You_have_requested_to_track_emails_from_this_package]"
} else {
set sub_url [ad_quotehtml [subscribe_url -object_id $object_id -url $url]]
set pretty_name [ad_quotehtml $pretty_name]
set sub_chunk "[_ mail-tracking.You_may_request_mail_tracking_for_this_package]"
}
if { [empty_string_p $sub_url] } {
return ""
}
return $sub_chunk
}
ad_proc -public mail_tracking::display::subscribe_url {
{-object_id:required}
{-url:required}
} {
Returns the URL that allows one to subscribe to tracking for a package. If the
mail-tracking package has not been mounted return the empty string.
} {
set root_path [apm_package_url_from_key [mail_tracking::package_key]]
if { [empty_string_p $root_path] } {
return ""
}
set subscribe_url [export_vars -base "${root_path}request-new" { object_id { return_url $url } }]
return $subscribe_url
}
ad_proc -public mail_tracking::display::unsubscribe_url {
{-request_id:required}
{-url:required}
} {
Returns the URL that allows one to unsubscribe from a particular request.
} {
set root_path [apm_package_url_from_key [mail_tracking::package_key]]
if { [empty_string_p $root_path] } {
return ""
}
set unsubscribe_url [export_vars -base "${root_path}request-delete" { request_id { return_url $url } }]
return $unsubscribe_url
}
ad_library {
Mail-Tracking
Core procs for tracking mails. Important concepts:
<ul>
<li> tracking: each message sent out by acs-mail-lite is tracked - if it was queued.
<li> intervals: as soon as the email was sent and removed from the queue.
<li> participation: Either through registering a package instance or by setting the verbose parameter: TrackAllTraffic
</ul>
@creation-date 2005-05-31
@author Nima Mazloumi <mazloumi@uni-mannheim.de>
@cvs-id $Id$
}
namespace eval mail_tracking {}
ad_proc -public mail_tracking::package_key {} {
The package key
} {
return "mail-tracking"
}
ad_proc -public mail_tracking::new {
{-log_id ""}
{-package_id:required}
{-sender_id ""}
{-from_addr ""}
{-recipient_ids:required}
{-cc_ids ""}
{-bcc_ids ""}
{-to_addr ""}
{-cc_addr ""}
{-bcc_addr ""}
{-body ""}
{-message_id:required}
{-subject ""}
{-object_id ""}
{-context_id ""}
{-file_ids ""}
} {
Insert new log entry
@param sender_id party_id of the sender
@param from_addr e-mail address of the sender. At least party_id or from_addr should be given
@param recipient_ids List of party_ids of recipients
@param cc_ids List of party_ids for recipients in the "CC" field
@param bcc_ids List of party_ids for recipients in the "BCC" field
@param to_addr List of email addresses seperated by "," who recieved the email in the "to" field but got no party_id
@param cc_addr List of email addresses seperated by "," who recieved the email in the "cc" field but got no party_id
@param bcc_addr List of email addresses seperated by "," who recieved the email in the "bcc" field but got no party_id
@param body Text of the message
@param message_id Message_id of the email
@param subject Subject of the email
@param object_id Object for which this message was sent
@param context_id Context in which this message was send. Will replace object_id
@param file_ids Files send with this e-mail
} {
set creation_ip "127.0.0.1"
if {![string eq "" $context_id]} {
set object_id $context_id
}
set log_id [db_nextval "acs_object_id_seq"]
# First create the message entry
db_dml insert_mail_log {
insert into acs_mail_log
(log_id, message_id, sender_id, package_id, subject, body, sent_date, object_id, cc, bcc, to_addr, from_addr)
values
(:log_id, :message_id, :sender_id, :package_id, :subject, :body, now(), :object_id, :cc_addr, :bcc_addr, :to_addr, :from_addr)
}
ns_log Debug "Mail Traking OBJECT $object_id CONTEXT $context_id FILES $file_ids LOGS $log_id"
foreach file_id $file_ids {
set item_id [content::revision::item_id -revision_id $file_id]
if {$item_id eq ""} {
set item_id $file_id
}
db_dml insert_file_map "insert into acs_mail_log_attachment_map (log_id,file_id) values (:log_id,:file_id)"
}
# Now add the recipients to the log_id
foreach recipient_id $recipient_ids {
db_dml insert_recipient {insert into acs_mail_log_recipient_map (recipient_id,log_id,type) values (:recipient_id,:log_id,'to')}
}
foreach recipient_id $cc_ids {
db_dml insert_recipient {insert into acs_mail_log_recipient_map (recipient_id,log_id,type) values (:recipient_id,:log_id,'cc')}
}
foreach recipient_id $bcc_ids {
db_dml insert_recipient {insert into acs_mail_log_recipient_map (recipient_id,log_id,type) values (:recipient_id,:log_id,'bcc')}
}
return $log_id
}
<?xml version="1.0"?>
<queryset>
<rdbms><type>postgresql</type><version>7.1</version></rdbms>
<fullquery name="mail_tracking::request::new.insert_request">
<querytext>
insert into acs_mail_tracking_request
(request_id, object_id, user_id)
values
(:request_id, :object_id, :user_id);
</querytext>
</fullquery>
<fullquery name="mail_tracking::request::get_request_id.select_request_id">
<querytext>
select request_id from acs_mail_tracking_request where object_id = :object_id;
</querytext>
</fullquery>
<fullquery name="mail_tracking::request::delete.delete_request">
<querytext>
select acs_mail_tracking_request__delete(:request_id);
</querytext>
</fullquery>
<fullquery name="mail_tracking::request::delete_all.delete_all_requests">
<querytext>
select acs_mail_tracking_request__delete_all();
</querytext>
</fullquery>
</queryset>
ad_library {
Mail Tracking Requests
When a user wishes to track mails from a package,
he issues a request. This request is recorded specifically.
These procs help to manage such requests.
@creation-date 2005-05-31
@author Nima Mazloumi <mazloumi@uni-mannheim.de>
@cvs-id $Id$
}
namespace eval mail_tracking::request {
ad_proc -public new {
{-request_id ""}
{-user_id:required}
{-object_id:required}
} {
create a new request for a given user and package.
} {
set request_id [get_request_id -object_id $object_id]
if {[empty_string_p $request_id]} {
# Create the request
set request_id [db_nextval acs_object_id_seq]
db_dml insert_request {}
}
return $request_id
}
ad_proc -public get_request_id {
{-object_id:required}
} {
Checks if a particular tracking request exists, and if so return the request ID.
Note that the primary key on notification requests is the object.
} {
return [db_string select_request_id {} -default {}]
}
ad_proc -public request_exists {
{-object_id:required}
} {
returns true if one request exists for this object
} {
return [expr { [db_string request_count {}] > 0 }]
}
ad_proc -public delete {
{-request_id:required}
} {
delete a request for tracking by request ID.
} {
# do the delete
db_exec_plsql delete_request {}
}
ad_proc -public delete_all {} {
remove all requests
} {
# Do it
db_exec_plsql delete_all_requests {}
}
}
\ No newline at end of file
ad_library {
Mail Tracking Security Library
Manage permissions for mail-tracking.
@creation-date 2005-05-31
@author Nima Mazloumi <mazloumi@uni-mannheim.de>
@cvs-id $Id$
}
namespace eval mail_tracking::security {
ad_proc -public can_admin_request_p {
{-request_id:required}
} {
Checks if a user can manage a given tracking request. RIGHT NOW HACKED to 1.
} {
# hack
return 1
}
ad_proc -public require_admin_request {
{-request_id:required}
} {
Require the ability to admin a request
} {
}
ad_proc -public require_notify_object {
{-object_id:required}
} {
Require the ability to notify on an object.
} {
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
<title></title>
</head>
<body>
<h2>Mail-Tracking Documentation</h2>
By <a href="http://www.sussdorff.de/">Malte Sussdorff</a>
<hr>
<h2>Overview</h2>
The mail tracking package is a helper package for acs-mail-lite to track outgoing E-Mails. It's goal is to allow sysadmin to install the package in addition to acs-mail-lite and have all the emails tracked for each object which the e-mail was about and the recipient, be it a TO, CC or BCC one, whether given with an actual E-Mail address or provided as a party_id. Additionally it easily integrates with contacts and project manager to display the mails for a contact / regarding a project.
<h2>Design</h2>
There are three tables which make up this package:
<ul>
<li>acs_mail_log: This table tracks all the emails themselves
<li>acs_mail_log_recipient_map: This maps the recipients which have a party_id in the OpenACS systems to the tracked E-Mail.
<li>acs_mail_log_attachment_map: This table keeps track of the files from the content repository that have been attached to the E-Mail.
</ul>
They are filled with a callback acs_mail_lite::complex_send or acs_mail_lite::send that are being called after successful sending of an E-Mail. This stores the data.
</body>
</html>
\ No newline at end of file
# packages/mail-tracking/www/download/index.vuh
ad_page_contract {
Virtual URL handler for file downloads
@author Kevin Scaldeferri (kevin@arsdigita.com)
@author Don Baccus (simplified it by using cr utility)
@creation-date 18 December 2000
@cvs-id $Id$
} {
file_id:integer,optional
version_id:integer,optional
}
if {![exists_and_not_null version_id]} {
set version_id [item::get_best_revision $file_id]
}
set user_id [ad_conn user_id]
ad_require_permission $version_id "read"
cr_write_content -revision_id $version_id
<master>
<property name="title">@title;noquote@</property>
<property name="context">@context;noquote@</property>
<!--
Parameters:
party_ids = List of party_id's to send a message. Here they are project assignees
export_vars = variables that you want to be present on the include form (For example project_id)
return_url = Url to redirect after the process is finished
file_ids = revision_id of files you wan't to include in your message
-->
<include src="/packages/acs-mail-lite/lib/email" return_url=@return_url;noquote@ object_id=@object_id@ no_callback_p="f" checked_p="f" use_sender_p="f" cc="@cc@" bcc="@bcc@" mime_type="text/html" subject="@subject;noquote@" export_vars="@export_vars@" log_id="@log_id@" to_addr="@to_addr@" content="@content_body;noquote@" file_ids="@files@">
# packages/project-manager/www/send-mail.tcl
ad_page_contract {
Use acs-mail-lite/lib/email chunk to send out going mail messages.
party_ids: List of party_ids which will be appended to the assignee list
party_id: A single party_id which will be used instead of anything else. Useful for sending the mail to only one person.
} {
log_id:notnull
{return_url ""}
} -validate {
message_exists -requires {log_id} {
if { ![db_0or1row message_exists_p { }] } {
ad_complain "<b>[_ mail-tracking.The_specified_message_does_not_exist]</b>"
}
}
}
set title [_ mail-tracking.Forward_message]
set context [list [list "one-message?log_id=$log_id" [_ mail-tracking.One_message]] $title]
set return_url "one-message?log_id=$log_id"
# Get the information of the message
db_1row get_message_info { }
set sender [party::name -party_id $sender_id]
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='to' and log_id = :log_id and recipient_id is not null} {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
if {![string eq "" $to_addr]} {
lappend reciever_list $to_addr
}
set recipient [join $reciever_list ","]
set export_vars {log_id}
# Now the CC users
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='cc' and log_id = :log_id and recipient_id is not null} {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
if {![string eq "" $cc]} {
lappend reciever_list $cc
}
set cc_string [join $reciever_list ","]
# And the BCC ones
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='bcc' and log_id = :log_id and recipient_id is not null} {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
if {![string eq "" $bcc]} {
lappend reciever_list $bcc
}
set bcc_string [join $reciever_list ","]
# We get the related files
set download_files [list]
set files [db_list files {}]
foreach file_id $files {
set title [content::item::get_title -item_id $file_id]
lappend download_files $title
}
set download_files [join $download_files ", "]
if {![ad_looks_like_html_p $body]} {
set body "<pre>$body</pre>"
}
set mime_type "text/html"
set content_body "<div style=\"background-color: #eee; padding: .5em;\">
<table>
<tr><td>
#mail-tracking.Sender#:</td><td>$sender</tr><td>
#mail-tracking.Recipient#:</td><td>$recipient</tr><td>
#mail-tracking.CC#:</td><td>$cc_string</tr><td>
#mail-tracking.BCC#:</td><td>$bcc_string</tr><td>
#mail-tracking.Subject#:</td><td>$subject</tr><td>
#mail-tracking.Attachments#:</td><td>$download_files</tr><td>
#mail-tracking.MessageID#:</td><td>$message_id</tr>
</table>
</div>
<p>
$body
"
set subject "FW: $subject"
\ No newline at end of file
<? xml version="1.0"?>
<queryset>
<fullquery name="message_exists_p">
<querytext>
select
1
from
acs_mail_log
where
log_id = :log_id
</querytext>
</fullquery>
<fullquery name="get_message_info">
<querytext>
select
*
from
acs_mail_log
where
log_id = :log_id
</querytext>
</fullquery>
<fullquery name="files">
<querytext>
select file_id from acs_mail_log_attachment_map
where log_id = :log_id
</querytext>
</fullquery>
</queryset>
\ No newline at end of file
<master>
<property name="title">@page_title;noquote@</property>
<property name="context">@context;noquote@</property>
<include src="../lib/messages" page="@page@">
\ No newline at end of file
# Expects the following optional parameters (in each combination):
#
# recipient_id - to filter mails for a single receiver
# sender_id - to filter mails for a single sender
# package_id to filter mails for a package instance
ad_page_contract {
@author Nima Mazloumi
@creation-date Mon May 30 17:55:50 CEST 2005
@cvs-id $Id$
} {
{page:optional 1}
}
set page_title [ad_conn instance_name]
set context [list "index"]
ad_return_template
\ No newline at end of file
<master>
<property name="title">@page_title;noquote@</property>
<property name="context">@context;noquote@</property>
<a href="@return_url;noquote@">#mail-tracking.Go_Back#</a> | <a href="forward?log_id=@log_id@">#mail-tracking.Forward#</a>
<br><br>
<div style="background-color: #eee; padding: .5em;">
<table>
<tr><td>
#mail-tracking.Sender#:</td><td>@sender;noquote@</tr><td>
#mail-tracking.Recipient#:</td><td>@recipient;noquote@</tr><td>
#mail-tracking.CC#:</td><td>@cc_string;noquote@</tr><td>
#mail-tracking.BCC#:</td><td>@bcc_string;noquote@</tr><td>
#mail-tracking.Subject#:</td><td>@subject;noquote@</tr><td>
#mail-tracking.Attachments#:</td><td>@download_files;noquote@</tr><td>
#mail-tracking.MessageID#:</td><td>@message_id;noquote@</tr>
</table>
</div>
<p>
@body;noquote@
# /packages/mail-tracking/lib/one-message.tcl
ad_page_contract {
Displays one message that was send to a user
@author Miguel Marin (miguelmarin@viaro.net)
@author Viaro Networks www.viaro.net
@creation-date 2005-09-30
} {
log_id:notnull
{return_url ""}
} -validate {
message_exists -requires {log_id} {
if { ![db_0or1row message_exists_p { }] } {
ad_complain "<b>[_ mail-tracking.The_specified_message_does_not_exist]</b>"
}
}
}
# We need to figure out a way to detect which contacts package a party_id belongs to
set contacts_package_id [apm_package_id_from_key contacts]
set page_title "[_ mail-tracking.One_message]"
set context [list]
set sender ""
set receiver ""
if { [empty_string_p $return_url] } {
set return_url [get_referrer]
}
# Get the information of the message
db_1row get_message_info { }
if {![exists_and_not_null cc]} {
set cc ""
}
if {[exists_and_not_null sender_id]} {
if {$contacts_package_id} {
set sender "<a href=\"[contact::url -party_id $sender_id -package_id $contacts_package_id]\">[party::name -party_id $sender_id]</a>"
} else {
set sender [party::name -party_id $sender_id]
}
} else {
set sender "Unknown"
}
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='to' and log_id = :log_id and recipient_id is not null} {
if {$contacts_package_id} {
lappend reciever_list "<a href=\"[contact::url -party_id $recipient_id -package_id $contacts_package_id]\">[party::name -party_id $recipient_id]</a>"
} else {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
}
if {![string eq "" $to_addr]} {
lappend reciever_list $to_addr
}
set recipient [join $reciever_list ","]
# Now the CC users
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='cc' and log_id = :log_id and recipient_id is not null} {
if {$contacts_package_id} {
lappend reciever_list "<a href=\"[contact::url -party_id $recipient_id -package_id $contacts_package_id]\">[party::name -party_id $recipient_id]</a>"
} else {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
}
if {![string eq "" $cc]} {
lappend reciever_list $cc
}
set cc_string [join $reciever_list ","]
# And the BCC ones
set reciever_list [list]
db_foreach reciever_id {select recipient_id from acs_mail_log_recipient_map where type ='bcc' and log_id = :log_id and recipient_id is not null} {
if {$contacts_package_id} {
lappend reciever_list "<a href=\"[contact::url -party_id $recipient_id -package_id $contacts_package_id]\">[party::name -party_id $recipient_id]</a>"
} else {
lappend reciever_list "[party::name -party_id $recipient_id]"
}
}
if {![string eq "" $bcc]} {
lappend reciever_list $bcc
}
set bcc_string [join $reciever_list ","]
# We get the related files
set tracking_url [apm_package_url_from_key "mail-tracking"]
set download_files [list]
set files [db_list files {}]
foreach file_id $files {
set title [content::item::get_title -item_id $file_id]
lappend download_files "<a href=\"[export_vars -base "${tracking_url}download/$title" -url {file_id}]\">$title</a><br>"
}
set download_files [join $download_files ", "]
if {![ad_looks_like_html_p $body]} {
set body "<pre>$body</pre>"
}
\ No newline at end of file
<? xml version="1.0"?>
<queryset>
<fullquery name="message_exists_p">
<querytext>
select
1
from
acs_mail_log
where
log_id = :log_id
</querytext>
</fullquery>
<fullquery name="get_message_info">
<querytext>
select
*
from
acs_mail_log
where
log_id = :log_id
</querytext>
</fullquery>
<fullquery name="files">
<querytext>
select file_id from acs_mail_log_attachment_map
where log_id = :log_id
</querytext>
</fullquery>
</queryset>
\ No newline at end of file
ad_page_contract {
Remove a mail-tracking request
@author Nima Mazloumi (mazloumi@uni-mannheim.de)
@creation-date 2005-05-31
@cvs-id $Id$
} {
request_id:integer,notnull
return_url
}
# Security Check
mail_tracking::security::require_admin_request -request_id $request_id
# Actually Delete
mail_tracking::request::delete -request_id $request_id
# Redirect
ad_returnredirect $return_url
<master>
<property name="title">@page_title;noquote@</property>
<property name="context">@context;noquote@</property>
@page_title;noquote@<br>
<formtemplate id="subscribe"></formtemplate>
ad_page_contract {
Request tracking for a package instance
@author Nima Mazloumi (mazloumi@uni-mannheim.de)
@creation-date 2005-05-31
@cvs-id $Id$
} {
object_id:integer,notnull
return_url
}
set user_id [auth::require_login]
# Check that the object can be subcribed to
mail_tracking::security::require_notify_object -object_id $object_id
set instance_name [apm_instance_name_from_id $object_id]
set page_title "[_ mail-tracking.Request_mail_tracking_for_instance_name]"
set context [list "[_ mail-tracking.Request_mail_tracking_for_instance_name]"]
ad_form -name subscribe -export {object_id return_url} -form {} -on_submit {
# Add the subscribe
mail_tracking::request::new -object_id $object_id -user_id $user_id
ad_returnredirect $return_url
ad_script_abort
}
ad_return_template
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment