-- /packages/press/sql/press-create.sql
--
-- @author sarah@arsdigita.com
-- @author stefan@arsdigita.com
-- @author ron@arsdigita.com
-- @author michael@steigman.net
--
-- @created 2000-11-15
--
-- $Id: press-create.sql,v 1.4 2018/03/23 23:53:02 hectorr Exp $
--
-- Permissions
--
-- the read privilege is by default granted to 'the_public'
-- the site-wide administrator has to change this in /permissions/
-- if he wants to restrict an instance to a specific party_id only
-- the press_admin has all privileges, read, create, delete, approve
-- it is a child of 'admin'
select acs_privilege__create_privilege('press_read',null,null);
select acs_privilege__create_privilege('press_create',null,null);
select acs_privilege__create_privilege('press_delete',null,null);
select acs_privilege__create_privilege('press_approve',null,null);
-- bind privileges to global names
select acs_privilege__add_child('read','press_read');
select acs_privilege__add_child('create','press_create');
select acs_privilege__add_child('delete','press_delete');
select acs_privilege__add_child('admin','press_approve');
-- add this to the press_admin privilege
select acs_privilege__create_privilege('press_admin','Press administrator',null);
-- press administrator binds to global 'admin', plus inherits press_* permissions
select acs_privilege__add_child('admin','press_admin');
select acs_privilege__add_child('press_admin','press_approve');
select acs_privilege__add_child('press_admin','press_create');
select acs_privilege__add_child('press_admin','press_delete');
-- assign permission to defined contexts within ACS by default
--
create function inline_0 ()
returns integer as '
declare
default_context acs_objects.object_id%TYPE;
registered_users acs_objects.object_id%TYPE;
the_public acs_objects.object_id%TYPE;
begin
default_context := acs__magic_object_id(''default_context'');
registered_users := acs__magic_object_id(''registered_users'');
the_public := acs__magic_object_id(''the_public'');
-- give the public permission to read by default
perform acs_permission__grant_permission (
default_context, -- object_id
the_public, -- grantee_id
''press_read'' -- privilege
);
-- outcomment if your site wants to
-- give registered users permission to upload items by default
-- perform acs_permission__grant_permission (
-- default_context, -- object_id
-- registered_users, -- grantee_id
-- ''press_create'' -- privilege
-- );
return 0;
end;
' language 'plpgsql';
select inline_0 ();
drop function inline_0 ();
-- this table stores the different adp-templates to show a press item
create table press_templates (
template_id integer primary key not null,
-- we use this to select the template
template_name varchar(100) not null unique,
-- the adp code fragment
template_adp text not null
);
-- We use the content repository to store most of the information for
-- press items.
--
-- See http://cvs.arsdigita.com/acs/packages/acs-content-repository)
create table cr_press (
press_id integer
constraint cr_press_id_fk references cr_revisions
constraint cr_press_pk primary key,
-- include package_id to provide support for multiple instances
package_id integer,
-- constraint cr_press_package_id_nn not null,
-- information about the publication where this press item appeared
-- *** The journal name, the journal URL ***
publication_name varchar(100)
constraint cr_press_publication_name_nn not null,
publication_link varchar(200),
-- *** the specific journal issue ***
publication_date timestamptz not null,
publication_date_desc varchar(100),
-- *** the article link, pages ***
article_link varchar(400),
article_pages varchar(40),
article_abstract_html_p varchar(1)
constraint cp_article_abstract_html_p_ck
check (article_abstract_html_p in ('t','f')),
-- *** support for dates when items are displayed or archived ***
-- unapproved release dates are null
release_date timestamptz,
-- unscheduled archiving dates are null
archive_date timestamptz,
-- support for approval, if ApprovalRequiredP == 1
approval_user integer
constraint cr_press_approval_user_fk
references users,
approval_date timestamptz,
approval_ip varchar(50),
-- *** presentation information ***
-- supply own press-specific templates (see table below) until
-- template system is better organized and documented
template_id integer default 1
constraint cr_press_templ_id references press_templates
);
-- index to avoid lock situation through parent table
-- cr_press_press_id_fk is not created because press_id
-- is already indexed through virtue of being the primary
-- key for the table
create index cr_press_appuser_fk on cr_press(approval_user);
-- Initialize with one site-wide Default template
-- Make sure that you pass the following variables to the template
-- @publication_link@ (optional)
-- @publication_name@
-- @article_link@ (optional)
-- @article_title@
-- @pretty_publication_date@
-- @html_p@
-- @article_abstract@
insert into press_templates
(template_id,
template_name,
template_adp)
values
(1,
'Default',
'@publication_name@ - @article_title@
@publication_date@ : "@article_abstract@"');
select content_type__create_type (
'press', -- content_type
'content_revision', -- supertype
'Press Item', -- pretty_name
'Press Items', -- pretty_plural
'cr_press', -- table_name
'press_id', -- id_column
'news__name' -- name_method
);
-- create attributes for widget generation later
-- publication in which the press article appeared
select content_type__create_attribute (
'press', -- content_type
'publication_name', -- attribute_name
'text', -- datatype
'Publication', -- pretty_name
'Publications', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(100)' -- column_spec
);
-- URL link to this publication
select content_type__create_attribute (
'press', -- content_type
'publication_link', -- attribute_name
'text', -- datatype
'Publication URL', -- pretty_name
'Publication URL', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(200)' -- column_spec
);
-- issue date
select content_type__create_attribute (
'press', -- content_type
'publication_date', -- attribute_name
'date', -- datatype
'Publication Date', -- pretty_name
'Publication Dates',-- pretty_plural
null, -- sort_order
null, -- default_value
'timestamptz' -- column_spec
);
-- issue date in words (optional)
select content_type__create_attribute (
'press', -- content_type
'publication_date_desc', -- attribute_name
'text', -- datatype
'Publication Date Description', -- pretty_name
'Publication Date Description', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(100)' -- column_spec
);
-- URL link to the article
select content_type__create_attribute (
'press', -- content_type
'article_link', -- attribute_name
'text', -- datatype
'Article Link', -- pretty_name
'Article Links', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(400)' -- column_spec
);
-- article page range, e.g. 'pp 83-100'
select content_type__create_attribute (
'press', -- content_type
'article_pages', -- attribute_name
'text', -- datatype
'Article Pages', -- pretty_name
'Articles Pages', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(40)' -- column_spec
);
-- a flag that tells if the article abstract is in HTML or not
select content_type__create_attribute (
'press', -- content_type
'article_abstract_html_p', -- attribute_name
'text', -- datatype
'Article Abstract HTML Flag', -- pretty_name
'Article Abstract HTML Flag', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar(1)' -- column_spec
);
-- release date of press release
select content_type__create_attribute (
'press', -- content_type
'release_date', -- attribute_name
'timestamp', -- datatype
'Release Date', -- pretty_name
'Release Dates', -- pretty_plural
null, -- sort_order
current_date::varchar, -- default_value
'timestamptz' -- column_spec
);
-- archive date of press release
select content_type__create_attribute (
'press', -- content_type
'archive_date', -- attribute_name
'timestamp', -- datatype
'Archival Date', -- pretty_name
'Archival Dates', -- pretty_plural
null, -- sort_order
null, -- default_value
'timestamptz' -- column_spec
);
-- assignment to an authorized user for approval
select content_type__create_attribute (
'press', -- content_type
'approval_user', -- attribute_name
'integer', -- datatype
'Approval User', -- pretty_name
'Approval Users', -- pretty_plural
null, -- sort_order
null, -- default_value
'integer' -- column_spec
);
-- approval date
select content_type__create_attribute (
'press', -- content_type
'approval_date', -- attribute_name
'timestamp', -- datatype
'Approval Date', -- pretty_name
'Approval Dates', -- pretty_plural
null, -- sort_order
current_date::varchar, -- default_value
'timestamptz' -- column_spec
);
-- approval IP address
select content_type__create_attribute (
'press', -- content_type
'approval_ip', -- attribute_name
'text', -- datatype
'Approval IP', -- pretty_name
'Approval IPs', -- pretty_plural
null, -- sort_order
null, -- default_value
'varchar' -- column_spec
);
-- CREATE THE PRESS FOLDER as our CONTAINER ***
-- create 1 press folder; different instances are filtered by package_id
-- associate content types with press folder
create function inline_0 ()
returns integer as '
declare
v_folder_id cr_folders.folder_id%TYPE;
begin
v_folder_id := content_folder__new (
''press'', -- name
''press'', -- label
''Press Item Root Folder, all press items go in here'', -- description
null -- parent_id
);
perform content_folder__register_content_type (
v_folder_id, -- folder_id
''press'', -- content_type
''t'' -- include_subtypes
);
perform content_folder__register_content_type (
v_folder_id, -- folder_id
''content_revision'', -- content_type
''t'' -- include_subtypes
);
return 0;
end;
' language 'plpgsql';
select inline_0 ();
drop function inline_0 ();
-- press plsql
\i press-package-create.sql
--
-- views on cr_press that combine information from cr_press, cr_items, cr_revisions
--
-- view of all press items in the system
create or replace view press_items
as
select ci.item_id as item_id,
press_id,
cp.package_id,
publication_name,
publication_link,
publication_date,
publication_date_desc,
cr.title as article_title,
cr.content as article_abstract,
cr.description as revision_note,
article_link,
article_pages,
article_abstract_html_p,
release_date,
archive_date,
live_revision,
press__status(press_id) as status
from cr_items ci, cr_revisions cr, cr_press cp
where ( ci.item_id = cr.item_id
and ci.live_revision = cr.revision_id
and cr.revision_id = cp.press_id)
or ( ci.live_revision is null
and ci.item_id = cr.item_id
and cr.revision_id = content_item__get_latest_revision(ci.item_id)
and cr.revision_id = cp.press_id);
-- view on all approved press items (active revision only)
create or replace view press_items_approved
as
select ci.item_id as item_id,
cp.package_id,
publication_name,
publication_link,
publication_date,
publication_date_desc,
cr.title as article_title,
cr.content as article_abstract,
cr.description as revision_note,
article_link,
article_pages,
article_abstract_html_p as html_p,
release_date,
archive_date,
pt.template_id,
pt.template_name,
pt.template_adp
from cr_items ci, cr_revisions cr, cr_press cp, press_templates pt
where ci.item_id = cr.item_id
and ci.live_revision = cr.revision_id
and cr.revision_id = cp.press_id
and pt.template_id = cp.template_id;
-- view of all revisions of a press item
create or replace view press_item_revisions
as
select revision_id,
cr.item_id as item_id,
cp.package_id,
cp.publication_name,
cp.publication_link,
cp.publication_date,
cp.publication_date_desc,
cr.title as article_title,
cr.content as article_abstract,
cr.description as revision_note,
cp.article_link,
article_pages,
article_abstract_html_p as html_p,
release_date,
archive_date,
cp.template_id,
template_name,
template_adp,
creation_date,
press__status(press_id) as status,
first_names || ' ' || last_name as item_creator,
creation_ip,
ci.name as item_name
from cr_revisions cr, cr_press cp, press_templates pt, cr_items ci, acs_objects ao, persons
where cr.revision_id = ao.object_id
and cr.revision_id = cp.press_id
and cp.template_id = pt.template_id
and ci.item_id = cr.item_id
and ao.creation_user = persons.person_id;