-- creates the calendar object -- -- @author Gary Jin (gjin@arsdigita.com) -- @creation-date Nov 17, 2000 -- @cvs-id $Id: calendar-create.sql,v 1.20.2.2 2020/12/11 18:42:37 gustafn Exp $ -- -- ported by Charles Mok (mok_cl@eelab.usyd.edu.au) ------------------------------------------------------------------ -- calendar system permissions ------------------------------------------------------------------ -- creating the basic set of permissions for cal_item -- -- 1 create: create a new item -- 2. read: can view the cal_item -- 3. write: edit an existing cal_item -- 4. delete: can delete the cal_item -- 5. invite: can allow other parties to view or edit the cal_item select acs_privilege__create_privilege('cal_item_create', 'Add a new item', null); select acs_privilege__create_privilege('cal_item_read', 'view an cal_item', null); select acs_privilege__create_privilege('cal_item_write', 'Edit an existing cal_item', null); select acs_privilege__create_privilege('cal_item_delete', 'Delete cal_item', null ); select acs_privilege__create_privilege('cal_item_invite', 'Allow others to view cal_item', null); select acs_privilege__add_child('create', 'cal_item_create'); select acs_privilege__add_child('read', 'cal_item_read'); select acs_privilege__add_child('write', 'cal_item_write'); select acs_privilege__add_child('delete', 'cal_item_delete'); select acs_privilege__create_privilege('calendar_on', 'Implies that a calendar is selected', null); select acs_privilege__create_privilege('calendar_show', 'Show a calendar', null); select acs_privilege__add_child('read', 'calendar_on'); select acs_privilege__add_child('read', 'calendar_show'); select acs_privilege__create_privilege('calendar_create', 'Create a new calendar', null); select acs_privilege__create_privilege('calendar_read', 'View items on an existing calendar', null); select acs_privilege__create_privilege('calendar_write', 'Edit items of an existing calendar', null); select acs_privilege__create_privilege('calendar_delete','Delete an calendar', null); select acs_privilege__add_child('create', 'calendar_create'); select acs_privilege__add_child('read', 'calendar_read'); select acs_privilege__add_child('write', 'calendar_write'); select acs_privilege__add_child('delete', 'calendar_delete'); select acs_privilege__add_child('calendar_create', 'cal_item_create'); select acs_privilege__add_child('calendar_read', 'cal_item_read'); select acs_privilege__add_child('calendar_write', 'cal_item_write'); select acs_privilege__add_child('calendar_delete', 'cal_item_delete'); select acs_privilege__create_privilege('calendar_admin', 'calendar administrator', null); select acs_privilege__add_child('admin', 'calendar_admin'); select acs_privilege__add_child('calendar_admin', 'calendar_read'); select acs_privilege__add_child('calendar_admin', 'calendar_write'); select acs_privilege__add_child('calendar_admin', 'calendar_delete'); select acs_privilege__add_child('calendar_admin', 'calendar_create'); select acs_privilege__add_child('calendar_admin', 'cal_item_invite'); ---------------------------------------------------------- -- calendar_object ----------------------------------------------------------- create or replace function inline_0( ) returns integer AS $$ declare attr_id acs_attributes.attribute_id%TYPE; begin PERFORM acs_object_type__create_type( 'calendar', -- object_type 'Calendar', -- pretty_name 'Calendar', -- pretty_plural 'acs_object', -- supertype 'calendars', -- table_name 'calendar_id', -- id_column null, -- package_name 'f', -- abstract_p null, -- type_extension_table null -- name_method ); attr_id := acs_attribute__create_attribute ( 'calendar', -- object_type 'owner_id', -- attribute_name 'integer', -- datatype 'Owner', -- pretty_name 'Owners', -- pretty_plural null, -- table_name (default) null, -- column_name (default) null, -- default_value (default) 1, -- min_n_values (default) 1, -- max_n_values (default) null, -- sort_order (default) 'type_specific', -- storage (default) 'f' -- static_p (default) ); attr_id := acs_attribute__create_attribute ( 'calendar', -- object_type 'private_p', -- attribute_name 'boolean', -- datatype 'Private Calendar', -- pretty_name 'Private Calendars', -- pretty_plural null, -- table_name (default) null, -- column_name (default) null, -- default_value (default) 1, -- min_n_values (default) 1, -- max_n_values (default) null, -- sort_order (default) 'type_specific', -- storage (default) 'f' -- static_p (default) ); attr_id := acs_attribute__create_attribute ( 'calendar', -- object_type 'calendar_name', -- attribute_name 'string', -- datatype 'Calendar Name', -- pretty_name 'Calendar Names', -- pretty_plural null, -- table_name (default) null, -- column_name (default) null, -- default_value (default) 1, -- min_n_values (default) 1, -- max_n_values (default) null, -- sort_order (default) 'type_specific', -- storage (default) 'f' -- static_p (default) ); return 0; end; $$ LANGUAGE plpgsql; SELECT inline_0(); DROP function inline_0(); -- Calendar is a collection of events. Each calendar must -- belong to somebody (a party). create table calendars ( -- primary key calendar_id integer constraint calendars_calendar_id_fk references acs_objects constraint calendars_calendar_id_pk primary key, -- the name of the calendar calendar_name varchar(200), -- the individual or party that owns the calendar owner_id integer constraint calendars_calendar_owner_id_fk references parties on delete cascade, -- keep track of package instances package_id integer constraint calendars_package_id_fk references apm_packages(package_id) on delete cascade, -- whether or not the calendar is a private personal calendar or a -- public calendar. private_p boolean default 'f' constraint calendars_private_p_ck check (private_p in ( 't', 'f' ) ) ); comment on table calendars is ' Table calendars maps the many to many relationship betweens calendar and its owners. '; comment on column calendars.calendar_id is ' Primary Key '; comment on column calendars.calendar_name is ' the name of the calendar. This would be unique to avoid confusion '; comment on column calendars.owner_id is ' the individual or party that owns the calendar '; comment on column calendars.package_id is ' keep track of package instances '; -- create a partial index on public calendars create index calendars_package_id_pidx on calendars(package_id) where private_p = false; -- Calendar Item Types create sequence cal_item_type_seq; create table cal_item_types ( item_type_id integer not null constraint cal_item_type_id_pk primary key, calendar_id integer not null constraint cal_item_type_cal_id_fk references calendars(calendar_id), type varchar(100) not null, -- this constraint is obvious given that item_type_id -- is unique, but it's necessary to allow strong -- references to the pair calendar_id, item_type_id (ben) constraint cal_item_types_un unique (calendar_id, item_type_id) ); ------------------------------------------------------------- -- Load cal_item_object ------------------------------------------------------------- \i cal-item-create.sql ------------------------------------------------------------- -- create package calendar ------------------------------------------------------------- select define_function_args ('calendar__new', 'calendar_id,calendar_name,object_type;calendar,owner_id,private_p,package_id,context_id,creation_date,creation_user,creation_ip'); -- -- procedure calendar__new/10 -- create or replace function calendar__new( new__calendar_id integer, new__calendar_name varchar(200), new__object_type varchar, -- default 'calendar' new__owner_id integer, new__private_p boolean, new__package_id integer, new__context_id integer, new__creation_date timestamptz, new__creation_user integer, new__creation_ip varchar ) returns integer AS $$ declare v_calendar_id calendars.calendar_id%TYPE; begin v_calendar_id := acs_object__new( new__calendar_id, new__object_type, new__creation_date, new__creation_user, new__creation_ip, new__context_id ); insert into calendars (calendar_id, calendar_name, owner_id, package_id, private_p) values (v_calendar_id, new__calendar_name, new__owner_id, new__package_id, new__private_p); PERFORM acs_permission__grant_permission ( v_calendar_id, new__owner_id, 'calendar_admin' ); return v_calendar_id; end; $$ LANGUAGE plpgsql; -- -- procedure calendar__delete/1 -- select define_function_args('calendar__delete','calendar_id'); create or replace function calendar__delete( integer -- calendar.calendar_id%TYPE ) returns integer AS $$ declare delete__calendar_id alias for $1; begin delete from calendars where calendar_id = delete__calendar_id; -- Delete all privileges associate with this calendar delete from acs_permissions where object_id = delete__calendar_id; delete from acs_permissions where object_id in ( select cal_item_id from cal_items where on_which_calendar = delete__calendar_id ); PERFORM acs_object__delete(delete__calendar_id); return 0; end; $$ LANGUAGE plpgsql; ----------------------------------------------------------------- -- load related sql files ----------------------------------------------------------------- --\i cal-item-create.sql -- \i cal-table-create.sql \i calendar-notifications-init.sql