[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
Change UMO catalogue to have root category
Please review and comment, before I commit...
--
Ilya A. Volynets-Evenbakh
http://www.total-knowledge.com
Index: db/procs/umo_category_list/umo_category_attach.sql
===================================================================
--- db/procs/umo_category_list/umo_category_attach.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_attach.sql (working copy)
@@ -6,6 +6,9 @@
DECLARE
connection_id INT;
BEGIN
+ IF p_category_id = 0 THEN
+ RAISE EXCEPTION 'Placing objects into root category is not permitted';
+ END IF;
BEGIN
INSERT INTO umo_category_to_umo (uctu_umo_version,uctu_umo_category)
VALUES(p_umo_version_id,p_category_id);
Index: db/procs/umo_category_list/umo_category_hide.sql
===================================================================
--- db/procs/umo_category_list/umo_category_hide.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_hide.sql (working copy)
@@ -1,7 +1,7 @@
--- @brief Hides a category and all child categories
--- Hiding a category also exclude that category from any search requests.
--- To be able to use it again, use umo_category_unhide(
-CREATE OR REPLACE FUNCTION umo_category_hide(
+-- @brief Hides a category and all child categories (internal)
+-- This function does the actual hiding. Access checks should
+-- be done by caller
+CREATE OR REPLACE FUNCTION umo_category_hide_internal(
p_category_id int -- Category id
) RETURNS void SECURITY DEFINER AS $$
DECLARE
@@ -11,10 +11,28 @@
FOR category_id IN
SELECT ucl_id FROM umo_category_list WHERE ucl_parent_umo_category = p_category_id
LOOP
- PERFORM umo_category_hide(category_id);
+ PERFORM umo_category_hide_internal(category_id);
END LOOP;
-- Hide the category
UPDATE umo_category_list SET ucl_is_visible = FALSE WHERE ucl_id = p_category_id;
RAISE NOTICE 'Hid category %', p_category_id;
END;
$$ LANGUAGE 'plpgsql';
+
+-- @brief Hides a category and all child categories
+-- Hiding a category also exclude that category from any search requests.
+-- To be able to use it again, use umo_category_unhide(
+CREATE OR REPLACE FUNCTION umo_category_hide(
+ p_category_id int -- Category id
+) RETURNS void SECURITY DEFINER AS $$
+BEGIN
+ IF p_category_id = 0 THEN
+ RAISE EXCEPTION 'Cannot hide root category';
+ END IF;
+ IF NOT umo_category_can_modify(p_category_id) THEN
+ RAISE EXCEPTION 'You do not have permissions to hide this category';
+ END IF;
+ -- Actually hide...
+ PERFORM umo_category_hide_internal(p_category_id);
+END;
+$$ LANGUAGE 'plpgsql';
Index: db/procs/umo_category_list/umo_category_list_for_parent.sql
===================================================================
--- db/procs/umo_category_list/umo_category_list_for_parent.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_list_for_parent.sql (working copy)
@@ -3,12 +3,7 @@
p_parent_category int -- Parent category id, or NULL
) RETURNS SETOF umo_category_list SECURITY DEFINER AS $$
BEGIN
- IF p_parent_category IS NULL THEN
- RETURN QUERY
- SELECT * FROM umo_category_list WHERE ucl_parent_umo_category IS NULL;
- ELSE
- RETURN QUERY
- SELECT * FROM umo_category_list WHERE ucl_parent_umo_category = p_parent_category;
- END IF;
+ RETURN QUERY
+ SELECT * FROM umo_category_list WHERE ucl_parent_umo_category = p_parent_category;
END;
$$ LANGUAGE 'plpgsql';
Index: db/procs/umo_category_list/umo_category_unhide.sql
===================================================================
--- db/procs/umo_category_list/umo_category_unhide.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_unhide.sql (working copy)
@@ -1,18 +1,33 @@
--- @brief Unhides (shows hidden) a category and all child categories
-CREATE OR REPLACE FUNCTION umo_category_unhide(
+-- @brief Unhides (shows hidden) a category and all child categories (internal)
+CREATE OR REPLACE FUNCTION umo_category_unhide_internal(
p_category_id int -- Category id
) RETURNS void SECURITY DEFINER AS $$
DECLARE
category_id INT;
BEGIN
- -- Hide all the children
+ -- Unide all the children
FOR category_id IN
SELECT ucl_id FROM umo_category_list WHERE ucl_parent_umo_category = p_category_id
LOOP
- PERFORM umo_category_unhide(category_id);
+ PERFORM umo_category_unhide_internal(category_id);
END LOOP;
-- Hide the category
UPDATE umo_category_list SET ucl_is_visible = TRUE WHERE ucl_id = p_category_id;
RAISE NOTICE 'Unhid category %', p_category_id;
END;
$$ LANGUAGE 'plpgsql';
+
+-- @brief Unhides (shows hidden) a category and all child categories
+CREATE OR REPLACE FUNCTION umo_category_unhide(
+ p_category_id int -- Category id
+) RETURNS void SECURITY DEFINER AS $$
+BEGIN
+ ---- Note: allow to run unhide on root category, so that whole catalogue can
+ ---- be restored with one call
+ IF NOT umo_category_can_modify(p_category_id) THEN
+ RAISE EXCEPTION 'You do not have permissions to unhide this category';
+ END IF;
+ -- Do the actual unhiding
+ PERFORM umo_category_unhide(category_id);
+END;
+$$ LANGUAGE 'plpgsql';
Index: db/procs/umo_category_list/umo_category_ids_for_parent.sql
===================================================================
--- db/procs/umo_category_list/umo_category_ids_for_parent.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_ids_for_parent.sql (working copy)
@@ -10,8 +10,7 @@
BEGIN
FOR category_id IN
SELECT ucl_id FROM umo_category_list
- WHERE (p_parent_category IS NULL AND ucl_parent_umo_category IS NULL)
- OR ucl_parent_umo_category = p_parent_category
+ WHERE ucl_parent_umo_category = p_parent_category
LOOP
categories = categories || category_id;
IF p_recursively THEN
Index: db/procs/umo_category_list/umo_category_delete.sql
===================================================================
--- db/procs/umo_category_list/umo_category_delete.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_delete.sql (working copy)
@@ -8,6 +8,9 @@
category_id INT;
group_id INT;
BEGIN
+ IF p_category_id = 0 THEN
+ RAISE EXCEPTION 'Cannot delete root category'
+ END IF;
-- Process any sub-categories recursively
FOR category_id IN SELECT ucl_id FROM umo_category_list
WHERE ucl_parent_umo_category = p_category_id
Index: db/procs/umo_category_list/umo_category_create.sql
===================================================================
--- db/procs/umo_category_list/umo_category_create.sql (revision 454)
+++ db/procs/umo_category_list/umo_category_create.sql (working copy)
@@ -11,17 +11,8 @@
administrators int;
category_id int;
BEGIN
- IF p_parent_category IS NULL THEN
- -- Creating top-level category.
- -- Find global group 'Catalog Administrators':
- administrators = group_find_global('Catalog Administrators');
-
- -- Only members of group 'Catalog Administrators' can create a category:
- PERFORM group_includes_current_user(administrators);
- ELSE
- IF NOT umo_category_can_modify(p_parent_category) THEN
- RAISE EXCEPTION 'You do not have permissions to create a sub-category here';
- END IF;
+ IF NOT umo_category_can_modify(p_parent_category) THEN
+ RAISE EXCEPTION 'You do not have permissions to create a category here';
END IF;
-- Creating a category
Index: db/init_tables.sql
===================================================================
--- db/init_tables.sql (revision 465)
+++ db/init_tables.sql (working copy)
@@ -134,6 +134,12 @@
SELECT homepage_element_create(1,'Available courses','','','course','','','','','','',false,true,false);
----------------------------------------------------------------------------------------------------
+-- Root category for UMO catalogue
+----------------------------------------------------------------------------------------------------
+INSERT INTO umo_category_list(ucl_id,ucl_name,ucl_parent_umo_category,ucl_is_visible) VALUES(0,'Catalogue Root',NULL,TRUE);
+PERFORM acl_grant(group_find_global('Catalog Administrators'),object_type_id('Category'),0,access_value('Catalog Administration'),NULL, NULL);
+
+----------------------------------------------------------------------------------------------------
-- Initial UU administrator
----------------------------------------------------------------------------------------------------
SELECT person_create('System','Administrator','admin','admin');