-- /packages/news/sql/news-create.sql -- -- @author stefan@arsdigita.com -- @created 2000-12-13 -- @cvs-id $Id: news-create.sql,v 1.19.4.1 2019/03/15 17:14:34 antoniop Exp $ -- -- OpenACS Port: Robert Locke (rlocke@infiniteinfo.com) -- -- *** PERMISSION MODEL *** -- begin; -- 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 -- the news_admin has all privileges: read, create, delete, approve -- news_admin is a child of 'admin'. -- 'admin' is therefore the top-administrator, news_admin is the news administrator -- in the context of an instance select acs_privilege__create_privilege('news_read', null, null); select acs_privilege__create_privilege('news_create', null, null); select acs_privilege__create_privilege('news_delete', null, null); select acs_privilege__create_privilege('news_admin', 'News Administrator', null); -- bind privileges to global names select acs_privilege__add_child('read', 'news_read'); select acs_privilege__add_child('create', 'news_create'); select acs_privilege__add_child('delete', 'news_delete'); -- add this to the news_admin privilege -- news administrator binds to global 'admin', plus inherits news_* permissions select acs_privilege__add_child('admin', 'news_admin'); select acs_privilege__add_child('news_admin', 'news_read'); select acs_privilege__add_child('news_admin', 'news_create'); select acs_privilege__add_child('news_admin', 'news_delete'); end; -- assign permission to defined contexts within ACS by default -- -- -- procedure inline_0/0 -- CREATE OR REPLACE 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 'news_read' -- privilege ); -- give registered users permission to upload items by default -- However, they must await approval by users with news_admin privilege PERFORM acs_permission.grant_permission ( default_context, -- object_id registered_users, -- grantee_id 'news_create' -- privilege ); return 0; END; $$ LANGUAGE plpgsql; select inline_0 (); drop function inline_0 (); -- *** DATAMODEL *** -- we use the content repository (see http://cvs.arsdigita.com/acs/packages/acs-content-repository) plus this create table cr_news ( news_id integer constraint cr_news_id_fk references cr_revisions constraint cr_news_pk primary key, -- article abstract lead varchar(4000), -- include package_id to provide support for multiple instances package_id integer constraint cr_news_package_id_nn not null, -- regarding news item -- *** support for dates when items are displayed or archived *** -- unarchived news items have archive_date null archive_date timestamptz, -- support for approval approval_user integer constraint cr_news_approval_user_fk references users, approval_date timestamptz, approval_ip varchar(50) ); -- index to avoid lock situation through parent table create index cr_news_appuser_id_fk on cr_news(approval_user); -- *** NEWS item defitition *** --- begin; select content_type__create_type ( 'news', -- content_type 'content_revision', -- supertype 'News Article', -- pretty_name 'News Articles', -- pretty_plural 'cr_news', -- table_name 'news_id', -- id_column 'news__name' -- name_method ); end; begin; -- create attributes for widget generation -- lead SELECT content_type__create_attribute ( 'news', -- content type 'lead', -- attr name 'text', -- datatype 'Lead', -- pretty name 'Leads', -- pretty plural null, -- sort order null, -- default value 'varchar(4000)' -- column spec ); -- website archive date of news release select content_type__create_attribute ( 'news', -- content_type 'archive_date', -- attribute_name 'timestamp', -- datatype 'Archive Date', -- pretty_name 'Archive Dates', -- pretty_plural null, -- sort_order null, -- default_value 'timestamp' -- column_spec ); -- authorized user for approval select content_type__create_attribute ( 'news', -- 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 ( 'news', -- content_type 'approval_date', -- attribute_name 'timestamp', -- datatype 'Approval Date', -- pretty_name 'Approval Dates', -- pretty_plural null, -- sort_order current_date::varchar, -- default_value 'timestamp' -- column_spec ); -- approval IP address select content_type__create_attribute ( 'news', -- content_type 'approval_ip', -- attribute_name 'text', -- datatype 'Approval IP', -- pretty_name 'Approval IPs', -- pretty_plural null, -- sort_order null, -- default_value 'varchar(50)' -- column_spec ); end; -- *** CREATE THE NEWS FOLDER as our CONTAINER *** -- create 1 news folder; different instances are filtered by package_id -- -- procedure inline_0/0 -- CREATE OR REPLACE FUNCTION inline_0( ) RETURNS integer AS $$ DECLARE v_folder_id cr_folders.folder_id%TYPE; BEGIN v_folder_id := content_folder__new( 'news', -- name 'news', -- label 'News Item Root Folder, all news items go in here', -- description null -- parent_id ); -- associate content types with news folder PERFORM content_folder__register_content_type ( v_folder_id, -- folder_id 'news', -- 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 (); -- Create views after package since they need news__status \i news-package-create.sql \i news-views-create.sql