• Publicity: Public Only All

news-procs.tcl

Utility functions for News Application

Location:
packages/news/tcl/news-procs.tcl
Created:
12-14-00
Author:
stefan@arsdigita.com
CVS Identification:
$Id: news-procs.tcl,v 1.41.2.3 2023/02/20 17:40:07 antoniop Exp $

Procedures in this file

Detailed information

news::sc::register_news_fts_impl (private)

 news::sc::register_news_fts_impl

Partial Call Graph (max 5 caller/called nodes):
%3 news::install::after_install news::install::after_install (private) news::sc::register_news_fts_impl news::sc::register_news_fts_impl news::install::after_install->news::sc::register_news_fts_impl acs_sc::impl::new_from_spec acs_sc::impl::new_from_spec (public) news::sc::register_news_fts_impl->acs_sc::impl::new_from_spec

Testcases:
No testcase defined.

news::sc::unregister_news_fts_impl (private)

 news::sc::unregister_news_fts_impl

Partial Call Graph (max 5 caller/called nodes):
%3 acs_sc::impl::delete acs_sc::impl::delete (public) db_transaction db_transaction (public) news::sc::unregister_news_fts_impl news::sc::unregister_news_fts_impl news::sc::unregister_news_fts_impl->acs_sc::impl::delete news::sc::unregister_news_fts_impl->db_transaction

Testcases:
No testcase defined.

news__datasource (private)

 news__datasource object_id

This proc implements the 'datasource' operation of the FtsContentProvider Service Contract and should not be invoke directly.

Parameters:
object_id
Author:
Jeff Davis <davis@xarg.net>

Partial Call Graph (max 5 caller/called nodes):
%3 ad_url ad_url (public) db_1row db_1row (public) news_util_get_url news_util_get_url (public) template::adp_include template::adp_include (public) news__datasource news__datasource news__datasource->ad_url news__datasource->db_1row news__datasource->news_util_get_url news__datasource->template::adp_include

Testcases:
No testcase defined.

news__last_updated (private)

 news__last_updated package_id

Return the timestamp of the most recent item in this news instance. This proc implements the 'lastUpdated' operation of the 'RssGenerationSubscriber' Service Contract and should not be invoked directly.

Parameters:
package_id
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2005-01-22

Partial Call Graph (max 5 caller/called nodes):
%3 AcsSc.rssgenerationsubscriber.lastupdated.news AcsSc.rssgenerationsubscriber.lastupdated.news (private) news__last_updated news__last_updated AcsSc.rssgenerationsubscriber.lastupdated.news->news__last_updated db_string db_string (public) news__last_updated->db_string

Testcases:
No testcase defined.

news__rss_datasource (private)

 news__rss_datasource summary_context_id

This procedure implements the 'datasource' operation of the 'RssGenerationSubscriber' Service Contract and should not be invoked directly.

Parameters:
summary_context_id
Author:
Dave Bauer <dave@thedesignexperience.org>

Partial Call Graph (max 5 caller/called nodes):
%3 AcsSc.rssgenerationsubscriber.datasource.news AcsSc.rssgenerationsubscriber.datasource.news (private) news__rss_datasource news__rss_datasource AcsSc.rssgenerationsubscriber.datasource.news->news__rss_datasource _ _ (public) news__rss_datasource->_ ad_html_text_convert ad_html_text_convert (public) news__rss_datasource->ad_html_text_convert ad_system_name ad_system_name (public) news__rss_datasource->ad_system_name ad_url ad_url (public) news__rss_datasource->ad_url db_foreach db_foreach (public) news__rss_datasource->db_foreach

Testcases:
No testcase defined.

news__url (private)

 news__url object_id

Returns the URL for specified news object. This proc implements the 'url' operation of the 'FtsContentProvider' Service Contract and should not be invoked directly.

Parameters:
object_id
Author:
Robert Locke

Partial Call Graph (max 5 caller/called nodes):
%3 ad_url ad_url (public) apm_package_url_from_id apm_package_url_from_id (public) db_1row db_1row (public) news__url news__url news__url->ad_url news__url->apm_package_url_from_id news__url->db_1row

Testcases:
No testcase defined.

news_do_notification (public)

 news_do_notification news_package_id news_id

Sends notifications for specified news item.

Parameters:
news_package_id
news_id

Partial Call Graph (max 5 caller/called nodes):
%3 packages/news/www/item-create-3.tcl packages/news/ www/item-create-3.tcl news_do_notification news_do_notification packages/news/www/item-create-3.tcl->news_do_notification ad_conn ad_conn (public) news_do_notification->ad_conn ad_html_text_convert ad_html_text_convert (public) news_do_notification->ad_html_text_convert apm_package_url_from_id apm_package_url_from_id (public) news_do_notification->apm_package_url_from_id application_group::closest_ancestor_element application_group::closest_ancestor_element (public) news_do_notification->application_group::closest_ancestor_element db_0or1row db_0or1row (public) news_do_notification->db_0or1row

Testcases:
No testcase defined.

news_items_archive (public)

 news_items_archive id_list when

Immediately gives all news items in list id_list a status of archived as of ANSI date in when, i.e. when must be like 2000-10-11.

Parameters:
id_list
when

Partial Call Graph (max 5 caller/called nodes):
%3 packages/news/www/admin/process-2.tcl packages/news/ www/admin/process-2.tcl news_items_archive news_items_archive packages/news/www/admin/process-2.tcl->news_items_archive db_exec_plsql db_exec_plsql (public) news_items_archive->db_exec_plsql

Testcases:
No testcase defined.

news_items_delete (public)

 news_items_delete id_list

Deletes all news items with news_id in id_list.

Parameters:
id_list

Partial Call Graph (max 5 caller/called nodes):
%3 news::install::before_uninstantiate news::install::before_uninstantiate (private) news_items_delete news_items_delete news::install::before_uninstantiate->news_items_delete packages/news/www/admin/process-2.tcl packages/news/ www/admin/process-2.tcl packages/news/www/admin/process-2.tcl->news_items_delete db_exec_plsql db_exec_plsql (public) news_items_delete->db_exec_plsql

Testcases:
No testcase defined.

news_items_make_permanent (public)

 news_items_make_permanent id_list

Immediately gives all news items in list id_list a status of permanently published.

Parameters:
id_list

Partial Call Graph (max 5 caller/called nodes):
%3 packages/news/www/admin/process-2.tcl packages/news/ www/admin/process-2.tcl news_items_make_permanent news_items_make_permanent packages/news/www/admin/process-2.tcl->news_items_make_permanent db_exec_plsql db_exec_plsql (public) news_items_make_permanent->db_exec_plsql

Testcases:
No testcase defined.

news_notification_get_url (public)

 news_notification_get_url news_package_id

Get package URL from package_id. If this was mounted multiple times, only the first occurrence will be returned. This proc could be deprecated in the future.

Parameters:
news_package_id
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 AcsSc.notificationtype.geturl.news_item_notif_type AcsSc.notificationtype.geturl.news_item_notif_type (private) news_notification_get_url news_notification_get_url AcsSc.notificationtype.geturl.news_item_notif_type->news_notification_get_url apm_package_url_from_id apm_package_url_from_id (public) news_notification_get_url->apm_package_url_from_id

Testcases:
No testcase defined.

news_pretty_status (public)

 news_pretty_status -publish_date publish_date \
    -archive_date archive_date -status status

Given the publish status of a news items return a localization human readable sentence for the status.

Switches:
-publish_date
(required)
-archive_date
(required)
-status
(required)
Publish status short name. Valid values are returned by the plsql function news_status.
Author:
Peter Marklund

Partial Call Graph (max 5 caller/called nodes):
%3 test_news_pretty_status news_pretty_status (test news) news_pretty_status news_pretty_status test_news_pretty_status->news_pretty_status _ _ (public) news_pretty_status->_ news::test::assert_status_pretty news::test::assert_status_pretty (private) news::test::assert_status_pretty->news_pretty_status packages/news/www/admin/index.tcl packages/news/ www/admin/index.tcl packages/news/www/admin/index.tcl->news_pretty_status

Testcases:
news_pretty_status

news_update_rss (private)

 news_update_rss [ -summary_context_id summary_context_id ]

Regenerate RSS feed

Switches:
-summary_context_id
(optional)
Returns:
Error:
Author:
Dave Bauer <dave@thedesignexperience.org>
Created:
2005-02-04

Partial Call Graph (max 5 caller/called nodes):
%3 packages/news/www/admin/approve-2.tcl packages/news/ www/admin/approve-2.tcl news_update_rss news_update_rss packages/news/www/admin/approve-2.tcl->news_update_rss packages/news/www/item-create-3.tcl packages/news/ www/item-create-3.tcl packages/news/www/item-create-3.tcl->news_update_rss rss_gen_report rss_gen_report (public) news_update_rss->rss_gen_report rss_support::get_subscr_id rss_support::get_subscr_id (public) news_update_rss->rss_support::get_subscr_id

Testcases:
No testcase defined.

news_util_get_url (public)

 news_util_get_url package_id

Get package URL from package_id. If this was mounted multiple times, only the first occurrence will be returned. This proc could be deprecated in the future.

Parameters:
package_id
Author:
Robert Locke
See Also:

Partial Call Graph (max 5 caller/called nodes):
%3 news__datasource news__datasource (private) news_util_get_url news_util_get_url news__datasource->news_util_get_url news__rss_datasource news__rss_datasource (private) news__rss_datasource->news_util_get_url packages/news/www/admin/index.tcl packages/news/ www/admin/index.tcl packages/news/www/admin/index.tcl->news_util_get_url packages/news/www/index.tcl packages/news/ www/index.tcl packages/news/www/index.tcl->news_util_get_url apm_package_url_from_id apm_package_url_from_id (public) news_util_get_url->apm_package_url_from_id

Testcases:
No testcase defined.
[ hide source ]

Content File Source

# /packages/news/tcl/news-procs.tcl
ad_library {
    Utility functions for News Application

    @author stefan@arsdigita.com
    @creation-date 12-14-00
    @cvs-id $Id: news-procs.tcl,v 1.41.2.3 2023/02/20 17:40:07 antoniop Exp $
}

# News specific db-API wrapper functions and interpreters

ad_proc news_items_archive { id_list when } {

    Immediately gives all news items in list id_list a status of
    archived as of ANSI date in when, i.e. when must be like
    2000-10-11.

} {
    foreach id $id_list {
        db_exec_plsql news_item_archive {}
    }
}

ad_proc news_items_make_permanent { id_list } {

    Immediately gives all news items in list id_list a status of
    permanently published.

} {
    foreach id  $id_list {
        db_exec_plsql news_item_make_permanent {}
    }
}

ad_proc news_items_delete { id_list } {

    Deletes all news items with news_id in id_list.

} {
    foreach id $id_list {
        db_exec_plsql news_item_delete {}
    }
}

d_proc news_util_get_url {
    package_id
} {
    Get package URL from package_id. If this was mounted multiple
    times, only the first occurrence will be returned.

    This proc could be deprecated in the future.

    @see apm_package_url_from_id

    @author Robert Locke
} {
    return [apm_package_url_from_id $package_id]
}

d_proc -private news__datasource {
    object_id
} {
    This proc implements the 'datasource' operation of the
    FtsContentProvider Service Contract and should not be invoke
    directly.

    @author Jeff Davis (davis@xarg.net)
} {
    db_1row get {
        select
        item_id,
        package_id,
        live_revision,
        publish_title,
        publish_lead,
        publish_format,
        publish_date,
        publish_body,
        creation_user,
        item_creator
        from news_items_live_or_submitted
        where item_id = :object_id
        or item_id = (select item_id from cr_revisions where revision_id = :object_id)}

    set url_stub [news_util_get_url $package_id]
    set url "[ad_url]${url_stub}item/$item_id"

    if {$publish_lead eq ""} {
        set publish_lead $publish_body
    }

    set content [template::adp_include /packages/news/www/news \
                     [list \
                          item_id $object_id \
                          publish_title $publish_title \
                          publish_lead $publish_lead \
                          publish_body $publish_body \
                          publish_format $publish_format \
                          publish_image {} \
                          creator_link $item_creator ]]

    return [list \
                object_id $object_id \
                title $publish_title \
                content $content \
                mime text/html \
                keywords {} \
                storage_type text \
                syndication [list link $url \
                                 description $publish_lead \
                                 author $item_creator \
                                 category News \
                                 guid "[ad_url]/o/$item_id" \
                                 pubDate $publish_date \
                                ] \
               ]
}


d_proc -private news__url {
    object_id
} {
    Returns the URL for specified news object.

    This proc implements the 'url' operation of the
    'FtsContentProvider' Service Contract and should not be invoked
    directly.

    @author Robert Locke
} {
    db_1row get {}
    set package_url [apm_package_url_from_id $package_id]
    return "[ad_url]${package_url}item/$item_id"
}

d_proc news_pretty_status {
    {-publish_date:required}
    {-archive_date:required}
    {-status:required}
} {
    Given the publish status of a news items  return a localization human readable
    sentence for the status.

    @param status Publish status short name. Valid values are returned
    by the plsql function news_status.

    @author Peter Marklund
} {
    array set news_status_keys {
        unapproved news.Unapproved
        going_live_no_archive news.going_live_no_archive
        going_live_with_archive news.going_live_with_archive
        published_no_archive news.published_no_archive
        published_with_archive news.published_scheduled_for_archive
        archived news.Archived
    }

    set now_seconds [clock scan now]
    set n_days_until_archive {}

    if { $archive_date ne "" } {
        set archive_date_seconds [clock scan $archive_date]

        if { $archive_date_seconds > $now_seconds } {
            # Scheduled for archive
            set n_days_until_archive [expr {($archive_date_seconds - $now_seconds) / 86400}]
        }
    }

    if { $publish_date ne "" } {
        # The item has been published or is scheduled to be published

        set publish_date_seconds [clock scan $publish_date]
        if { $publish_date_seconds > $now_seconds } {
            # Will be published in the future

            set n_days_until_publish [expr {($publish_date_seconds - $now_seconds) / 86400}]
        }
    }

    # Message lookup may use vars n_days_until_archive and n_days_until_publish
    return [_ $news_status_keys($status)]
}


# register news search implementation
namespace eval news::sc {}

ad_proc -private news::sc::unregister_news_fts_impl {} {
    db_transaction {
        acs_sc::impl::delete -contract_name FtsContentProvider -impl_name news
    }
}

ad_proc -private news::sc::register_news_fts_impl {} {
    set spec {
        name "news"
        aliases {
            datasource news__datasource
            url news__url
        }
        contract_name FtsContentProvider
        owner news
    }

    acs_sc::impl::new_from_spec -spec $spec
}


d_proc -private news__last_updated {
    package_id
} {

    Return the timestamp of the most recent item in this news instance.

    This proc implements the 'lastUpdated' operation of the
    'RssGenerationSubscriber' Service Contract and should not be invoked
    directly.

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2005-01-22

    @param package_id

} {
    return [db_string get_last_updated {}]
}

d_proc -private news__rss_datasource {
    summary_context_id
} {
    This procedure implements the 'datasource' operation of the
    'RssGenerationSubscriber' Service Contract and should not be
    invoked directly.

    @author Dave Bauer (dave@thedesignexperience.org)
} {
    # TODO make limit a parameter
    set limit 15

    set items [list]
    set counter 0
    set package_url [news_util_get_url $summary_context_id]
    db_foreach get_news_items {
        select cn.*,
        ci.item_id,
        cr.content,
        cr.title,
        cr.mime_type,
        cr.description,
        to_char(o.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified
        from cr_news cn,
        cr_revisions cr,
        cr_items ci,
        acs_objects o
        where cn.package_id=:summary_context_id
        and cr.revision_id=cn.news_id
        and cn.news_id=o.object_id
        and cr.item_id=ci.item_id
        and cr.revision_id=ci.live_revision
        order by o.last_modified desc
        fetch first :limit rows only
    } {
        set entry_url [export_vars -base "[ad_url]${package_url}item" {item_id}]

        # content doesn't need to be convert to plain text. moreover it will look much
        # better in HTML
        set content_as_html [ad_html_text_convert -from $mime_type -to text/html -- $content]
        set description $content_as_html

        # Always convert timestamp to GMT
        set entry_date_ansi [lc_time_tz_convert -from [lang::system::timezone] -to "Etc/GMT" -time_value $last_modified]
        set entry_timestamp "[clock format [clock scan $entry_date_ansi] -format "%a, %d %b %Y %H:%M:%S"] GMT"

        lappend items [list \
                           link $entry_url \
                           title $title \
                           description $description \
                           value $content_as_html \
                           timestamp $entry_timestamp]

        if { $counter == 0 } {
            set column_array(channel_lastBuildDate) $entry_timestamp
            incr counter
        }
    }

    set news_title [_ news.system_name_News [list system_name [ad_system_name]]]

    set column_array(channel_title) $news_title
    set column_array(channel_description) $news_title
    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) ""
    set column_array(version) 2.0
    set column_array(image) ""
    set column_array(channel_link) "[ad_url]$package_url"
    return [array get column_array]
}

d_proc -private news_update_rss {
    -summary_context_id
} {
    Regenerate RSS feed

    @author Dave Bauer (dave@thedesignexperience.org)
    @creation-date 2005-02-04

    @param summary_context_id

    @return

    @error
} {
    set subscr_id [rss_support::get_subscr_id \
                       -summary_context_id $summary_context_id \
                       -impl_name "news" \
                       -owner "news"]
    rss_gen_report $subscr_id
}

# add news notification
d_proc -public news_notification_get_url {
    news_package_id
} {
    Get package URL from package_id. If this was mounted multiple
    times, only the first occurrence will be returned.

    This proc could be deprecated in the future.

    @see apm_package_url_from_id
} {
    return [apm_package_url_from_id $news_package_id]
}

d_proc -public news_do_notification {
    news_package_id
    news_id
} {
    Sends notifications for specified news item.
} {
    set system_url [parameter::get_from_package_key -package_key acs-kernel -parameter SystemURL]
    set package_url [apm_package_url_from_id $news_package_id]

    set node_id [ad_conn node_id]
    set instance_name [application_group::closest_ancestor_element \
                           -include_self \
                           -node_id $node_id \
                           -element "instance_name"]

    # get the title and teaser for latest news item for the given package id
    if { [db_0or1row get_news {
        select item_id,
               publish_date,
               publish_title as title,
               publish_lead as lead,
               publish_body,
               publish_format
         from news_items_live_or_submitted
        where news_id = :news_id
    }] } {
        set item_url ${system_url}${package_url}item?item_id=$item_id
        set new_content "$title\n\n$lead\n\n[ad_html_text_convert -from $publish_format -to text/plain -- $publish_body]"
        set html_content [ad_html_text_convert -from $publish_format -to text/html -- $publish_body]
        append new_content "\n\n[string repeat - 70]"
        append new_content "\n\n${item_url} \n\n"
        append html_content "<br><br><hr>" [ad_html_text_convert "\n ${item_url}""<br><br>"
    }

    # Notifies the users that requested notification for the specific news item
    notification::new \
        -type_id [notification::type::get_type_id -short_name one_news_item_notif] \
        -object_id $news_package_id \
        -notif_subject "\[$instance_name\] #news.Latest_News#" \
        -notif_text $new_content \
        -notif_html $html_content \
        -notif_date $publish_date
}

# Local variables:
#    mode: tcl
#    tcl-indent-level: 4
#    indent-tabs-mode: nil
# End: