UniverseUniversity


Home Projects Jobs Clientele Contact

uu


[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');

Authoright © Total Knowledge: 2001-2008