-- 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