- Publicity:
Public Only
All
file-storage-rss-procs.tcl
Procedures in this file
Detailed information
[
hide source ]
| [
make this
the default ]
Content File Source
namespace eval fs::rss {}
ad_proc -private fs::rss::create_rss_gen_subscr_impl {} {} {
return [acs_sc::impl::new_from_spec -spec {
contract_name "RssGenerationSubscriber"
name "fs_rss"
owner "file-storage"
aliases {
datasource fs::rss::datasource
lastUpdated fs::rss::lastUpdated
}
}]
}
ad_proc -private fs::rss::drop_rss_gen_subscr_impl {} {} {
acs_sc::impl::delete -contract_name RssGenerationSubscriber -impl_name fs_rss
}
d_proc -private fs::rss::datasource {
summary_context_id
} {
This procedure implements the "datasource" operation of the
RssGenerationSubscriber service contract.
Important: in this implementation, the summary_context_id is equal
to the subscription_id, which we use to key into the fs_rss_subscrs table
to find the folder_id.
@author Andrew Grumet (aegrumet@alum.mit.edu)
} {
db_1row select_subscription {}
set system_name [ad_system_name]
set column_array(channel_title) $feed_title
set column_array(channel_description) "Recent additions to the \"$folder_title\" folder on $system_name"
set column_array(version) 2.0
set folder_info [fs::get_folder_package_and_root $folder_id]
set package_id [lindex $folder_info 0]
set root_folder_id [lindex $folder_info 1]
set base_url [site_node::get_url_from_object_id -object_id $package_id]
set ad_url [ad_url]
set folder_url "${ad_url}${base_url}?folder_id=$folder_id"
set column_array(channel_link) $folder_url
set image_url "/resources/dotlrn/logo-user.gif"
if { $image_url eq "" } {
set column_array(image) ""
} else {
set column_array(image) [list \
url "${ad_url}$image_url" \
title $folder_title \
link $folder_url \
width "133" \
height "36"]
}
set pretty_folder_url "${ad_url}${base_url}"
if { $folder_id != $root_folder_id } {
set url_stub [content::item::get_virtual_path -root_folder_id $root_folder_id -item_id $folder_id]
set stub_parts [split $url_stub /]
set enc_url_stub_list [list]
foreach part $stub_parts {
lappend enc_url_stub_list [ns_urlencode $part]
}
set enc_url_stub [join $enc_url_stub_list /]
append pretty_folder_url ${enc_url_stub}/
}
set items [list]
set counter 0
if {$descend_p == "f"} {
set parent_clause "parent_id = :folder_id"
} else {
set parent_clause [db_map descend_parent_clause]
}
if {$include_revisions_p == "f"} {
set revisions_clause "r.revision_id = o.live_revision"
} else {
set revisions_clause "r.item_id = o.object_id"
}
db_foreach select_files [subst -nocommands {
select * from (
select o.object_id as item_id,
o.title,
o.name,
o.file_upload_name,
o.type,
o.content_size,
to_char(r.publish_date,'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi,
r.description,
r.revision_id
from fs_objects o,
cr_revisions r
where $parent_clause
and type != 'folder'
and $revisions_clause
order by last_modified desc
) as v fetch first :max_items rows only
}] {
set link "${ad_url}${base_url}file?file_id=$item_id&version_id=$revision_id"
set content "content"
set description $description
if {$include_revisions_p == "t"} {
append description "<br><br><b>Note:</b> This may be a new revision of an existing file."
}
set publish_date_ansi [lc_time_tz_convert -from [lang::system::timezone] -to "Etc/GMT" -time_value $publish_date_ansi]
set publish_timestamp "[clock format [clock scan $publish_date_ansi] -format "%a, %d %b %Y %H:%M:%S"] GMT"
set iteminfo [list \
link $link \
title $title \
description $description \
timestamp $publish_timestamp ]
if { $enclosure_match_patterns ne "" } {
foreach pattern $enclosure_match_patterns {
if { [string match $pattern $title] } {
lappend iteminfo \
enclosure_url "${pretty_folder_url}$file_upload_name" \
enclosure_type $type \
enclosure_length $content_size
break
}
}
}
lappend items $iteminfo
if { $counter == 0 } {
set column_array(channel_lastBuildDate) $publish_timestamp
incr counter
}
}
set column_array(items) $items
set column_array(channel_language) ""
set column_array(channel_copyright) ""
set column_array(channel_managingEditor) ""
set column_array(channel_webMaster) ""
set column_array(channel_rating) ""
set column_array(channel_skipDays) ""
set column_array(channel_skipHours) ""
return [array get column_array]
}
d_proc -private fs::rss::lastUpdated {
summary_context_id
} {
Returns the time that the last file was modified,
in Unix time. Returns 0 otherwise.
@author Andrew Grumet (aegrumet@alum.mit.edu)
} {
db_1row select_last_updated {
select (max(last_modified)-to_date('1970-01-01','YYYY-MM-DD'))*60*60*24 as last_update
from fs_rss_subscrs s, fs_objects f
where s.subscr_id = :summary_context_id
and f.parent_id = s.folder_id
and f.type != 'folder'
}
return $last_update
}
d_proc -private fs::rss::build_feeds {
folder_id
} {
Builds all rss feeds for a folder.
@author Andrew Grumet (aegrumet@alum.mit.edu)
} {
set subscr_id_list [db_list select_subscrs {}]
foreach subscr_id $subscr_id_list {
rss_gen_report $subscr_id
}
}