Index: openacs-4/packages/dotlrn/sql/oracle/dotlrn-applet-sc-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/oracle/Attic/dotlrn-applet-sc-create.sql,v
diff -u -r1.3 -r1.4
--- openacs-4/packages/dotlrn/sql/oracle/dotlrn-applet-sc-create.sql	5 Oct 2001 15:14:21 -0000	1.3
+++ openacs-4/packages/dotlrn/sql/oracle/dotlrn-applet-sc-create.sql	8 Oct 2001 21:38:37 -0000	1.4
@@ -22,6 +22,27 @@
 		  contract_desc => 'dotLRN Applet implement a specific interface'
 	);
 
+	-- Get a pretty name
+	foo := acs_sc_msg_type.new (
+	          msg_type_name => 'dotlrn_applet.GetPrettyName.InputType',
+		  msg_type_spec => ''
+	);
+
+	foo := acs_sc_msg_type.new (
+	          msg_type_name => 'dotlrn_applet.GetPrettyName.OutputType',
+		  msg_type_spec => 'pretty_name:string'
+	);
+
+	foo := acs_sc_operation.new (
+	          'dotlrn_applet',
+		  'GetPrettyName',
+		  'Get the pretyt name',
+		  't', -- not cacheable
+		  0,   -- n_args
+		  'dotlrn_applet.GetPrettyName.InputType',
+		  'dotlrn_applet.GetPrettyName.OutputType'
+	);
+
 	-- Add the applet to a community
 	foo := acs_sc_msg_type.new(
 		  msg_type_name => 'dotlrn_applet.AddApplet.InputType',
Index: openacs-4/packages/dotlrn/sql/oracle/dotlrn-classes-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/oracle/Attic/dotlrn-classes-create.sql,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/dotlrn/sql/oracle/dotlrn-classes-create.sql	5 Oct 2001 15:14:21 -0000	1.2
+++ openacs-4/packages/dotlrn/sql/oracle/dotlrn-classes-create.sql	8 Oct 2001 21:38:37 -0000	1.3
@@ -115,19 +115,19 @@
 create or replace package dotlrn_class_instance
 is
   function new (
-    class_instance_id		in dotlrn_class_instances.class_instance_id%TYPE,
+    class_instance_id		in dotlrn_class_instances.class_instance_id%TYPE default null,
     class_key			in dotlrn_class_instances.class_key%TYPE,
     year			in dotlrn_class_instances.year%TYPE,
     term			in dotlrn_class_instances.term%TYPE,
     community_key		in dotlrn_communities.community_key%TYPE,
-    pretty_name		in dotlrn_communities.pretty_name%TYPE,
-    description		in dotlrn_communities.description%TYPE,
+    pretty_name			in dotlrn_communities.pretty_name%TYPE,
+    description			in dotlrn_communities.description%TYPE,
     package_id			in dotlrn_communities.package_id%TYPE default null,
     creation_date		in acs_objects.creation_date%TYPE
-			   default sysdate,
+				default sysdate,
     creation_user		in acs_objects.creation_user%TYPE
-			   default null,
-    creation_ip		in acs_objects.creation_ip%TYPE default null,
+				default null,
+    creation_ip			in acs_objects.creation_ip%TYPE default null,
     context_id			in acs_objects.context_id%TYPE default null
   ) return dotlrn_class_instances.class_instance_id%TYPE;
 
@@ -147,31 +147,31 @@
     year			in dotlrn_class_instances.year%TYPE,
     term			in dotlrn_class_instances.term%TYPE,
     community_key		in dotlrn_communities.community_key%TYPE,
-    pretty_name		in dotlrn_communities.pretty_name%TYPE,
-    description		in dotlrn_communities.description%TYPE,
+    pretty_name			in dotlrn_communities.pretty_name%TYPE,
+    description			in dotlrn_communities.description%TYPE,
     package_id			in dotlrn_communities.package_id%TYPE default null,
     creation_date		in acs_objects.creation_date%TYPE
-			   default sysdate,
+				default sysdate,
     creation_user		in acs_objects.creation_user%TYPE
-			   default null,
-    creation_ip		in acs_objects.creation_ip%TYPE default null,
+				default null,
+    creation_ip			in acs_objects.creation_ip%TYPE default null,
     context_id			in acs_objects.context_id%TYPE default null
   ) return dotlrn_class_instances.class_instance_id%TYPE
   is
     v_class_instance_id dotlrn_class_instances.class_instance_id%TYPE;
   begin
-    v_class_instance_id := dotlrn_community.new (
-	community_id => class_instance_id,
-	community_type => class_key,
-	community_key => community_key,
-	pretty_name => pretty_name,
-	description => description,
-	package_id => package_id,
-	creation_date => creation_date,
-	creation_user => creation_user,
-	creation_ip => creation_ip,
-	context_id => context_id
-    );
+     v_class_instance_id := dotlrn_community.new (
+ 	community_id => class_instance_id,
+ 	community_type => class_key,
+ 	community_key => community_key,
+ 	pretty_name => pretty_name,
+ 	description => description,
+ 	package_id => package_id,
+ 	creation_date => creation_date,
+ 	creation_user => creation_user,
+ 	creation_ip => creation_ip,
+ 	context_id => context_id
+     );
 
     insert into dotlrn_class_instances
     (class_instance_id, class_key, year, term)
Index: openacs-4/packages/dotlrn/sql/oracle/dotlrn-init.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/oracle/dotlrn-init.sql,v
diff -u -r1.3 -r1.4
--- openacs-4/packages/dotlrn/sql/oracle/dotlrn-init.sql	5 Oct 2001 15:14:21 -0000	1.3
+++ openacs-4/packages/dotlrn/sql/oracle/dotlrn-init.sql	8 Oct 2001 21:38:37 -0000	1.4
@@ -71,94 +71,96 @@
 	acs_rel_type.create_role ('teaching_assistant', 'Teaching Assistant', 'Teaching Assistants');
 	acs_rel_type.create_role ('instructor', 'Instructor', 'Instructors');
 	acs_rel_type.create_role ('admin', 'Administrator', 'Administrators');
+	
+	-- a lot of the following stuff is commented out because it has to be done in TCL
 
 	-- create relationships
-	acs_rel_type.create_type (
-	  rel_type => 'admin_rel',
-	  supertype => 'membership_rel',
-	  pretty_name => 'Administration Relation',
-	  pretty_plural => 'Administration Relationships',
-	  package_name => 'dotlrn_admin_rel',
-	  table_name => 'dotlrn_admin_rel',
-	  id_column => 'XXX',
-	  object_type_one => 'dotlrn_community', role_one => NULL,
-	  min_n_rels_one => 0, max_n_rels_one => null,
-	  object_type_two => 'party', role_two => 'admin',
-	  min_n_rels_two => 0, max_n_rels_two => null
-	);
+-- 	acs_rel_type.create_type (
+-- 	  rel_type => 'admin_rel',
+-- 	  supertype => 'membership_rel',
+-- 	  pretty_name => 'Administration Relation',
+-- 	  pretty_plural => 'Administration Relationships',
+-- 	  package_name => 'dotlrn_admin_rel',
+-- 	  table_name => 'dotlrn_admin_rel',
+-- 	  id_column => 'XXX',
+-- 	  object_type_one => 'dotlrn_community', role_one => NULL,
+-- 	  min_n_rels_one => 0, max_n_rels_one => null,
+-- 	  object_type_two => 'party', role_two => 'admin',
+-- 	  min_n_rels_two => 0, max_n_rels_two => null
+-- 	);
 
-	acs_rel_type.create_type (
-	  rel_type => 'instructor_rel',
-	  supertype => 'admin_rel',
-	  pretty_name => 'Instructor Relation',
-	  pretty_plural => 'Instructor Relationships',
-	  package_name => 'dotlrn_instructor_rel',
-	  table_name => 'dotlrn_instructor_rel',
-	  id_column => 'XXX',
-	  object_type_one => 'dotlrn_class', role_one => NULL,
-	  min_n_rels_one => 0, max_n_rels_one => null,
-	  object_type_two => 'party', role_two => 'instructor',
-	  min_n_rels_two => 0, max_n_rels_two => null
-	);
+-- 	acs_rel_type.create_type (
+-- 	  rel_type => 'instructor_rel',
+-- 	  supertype => 'admin_rel',
+-- 	  pretty_name => 'Instructor Relation',
+-- 	  pretty_plural => 'Instructor Relationships',
+-- 	  package_name => 'dotlrn_instructor_rel',
+-- 	  table_name => 'dotlrn_instructor_rel',
+-- 	  id_column => 'XXX',
+-- 	  object_type_one => 'dotlrn_class', role_one => NULL,
+-- 	  min_n_rels_one => 0, max_n_rels_one => null,
+-- 	  object_type_two => 'party', role_two => 'instructor',
+-- 	  min_n_rels_two => 0, max_n_rels_two => null
+-- 	);
 
-	acs_rel_type.create_type (
-	  rel_type => 'ta_rel',
-	  supertype => 'admin_rel',
-	  pretty_name => 'TA Relation',
-	  pretty_plural => 'TA Relationships',
-	  package_name => 'dotlrn_ta_rel',
-	  table_name => 'dotlrn_ta_rel',
-	  id_column => 'XXX',
-	  object_type_one => 'dotlrn_class', role_one => NULL,
-	  min_n_rels_one => 0, max_n_rels_one => null,
-	  object_type_two => 'party', role_two => 'teaching_assistant',
-	  min_n_rels_two => 0, max_n_rels_two => null
-	);
+-- 	acs_rel_type.create_type (
+-- 	  rel_type => 'ta_rel',
+-- 	  supertype => 'admin_rel',
+-- 	  pretty_name => 'TA Relation',
+-- 	  pretty_plural => 'TA Relationships',
+-- 	  package_name => 'dotlrn_ta_rel',
+-- 	  table_name => 'dotlrn_ta_rel',
+-- 	  id_column => 'XXX',
+-- 	  object_type_one => 'dotlrn_class', role_one => NULL,
+-- 	  min_n_rels_one => 0, max_n_rels_one => null,
+-- 	  object_type_two => 'party', role_two => 'teaching_assistant',
+-- 	  min_n_rels_two => 0, max_n_rels_two => null
+-- 	);
 
-	acs_rel_type.create_type (
-	  rel_type => 'student_rel',
-	  supertype => 'membership_rel',
-	  pretty_name => 'Student Relation',
-	  pretty_plural => 'Student Relationships',
-	  package_name => 'dotlrn_student_rel',
-	  table_name => 'dotlrn_student_rel',
-	  id_column => 'XXX',
-	  object_type_one => 'dotlrn_class', role_one => NULL,
-	  min_n_rels_one => 0, max_n_rels_one => null,
-	  object_type_two => 'party', role_two => 'student',
-	  min_n_rels_two => 0, max_n_rels_two => null
-	);
+-- 	acs_rel_type.create_type (
+-- 	  rel_type => 'student_rel',
+-- 	  supertype => 'membership_rel',
+-- 	  pretty_name => 'Student Relation',
+-- 	  pretty_plural => 'Student Relationships',
+-- 	  package_name => 'dotlrn_student_rel',
+-- 	  table_name => 'dotlrn_student_rel',
+-- 	  id_column => 'XXX',
+-- 	  object_type_one => 'dotlrn_class', role_one => NULL,
+-- 	  min_n_rels_one => 0, max_n_rels_one => null,
+-- 	  object_type_two => 'party', role_two => 'student',
+-- 	  min_n_rels_two => 0, max_n_rels_two => null
+-- 	);
 
 	-- add permissible stuff
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_class', 'admin_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_class', 'admin_rel');
 
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_club', 'admin_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_club', 'admin_rel');
 
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_club', 'membership_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_club', 'membership_rel');
 
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_class', 'student_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_class', 'student_rel');
 
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_class', 'instructor_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_class', 'instructor_rel');
 
-	insert into group_type_rels
-	(group_rel_type_id, group_type, rel_type)
-	values
-	(acs_object_id_seq.nextval, 'dotlrn_class', 'ta_rel');
+-- 	insert into group_type_rels
+-- 	(group_rel_type_id, group_type, rel_type)
+-- 	values
+-- 	(acs_object_id_seq.nextval, 'dotlrn_class', 'ta_rel');
 
 	
 end;
Index: openacs-4/packages/dotlrn/tcl/class-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/Attic/class-procs-oracle.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/tcl/class-procs-oracle.xql	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+
+<queryset>
+<rdbms><type>oracle</type><version>8.1.6</version></rdbms>
+
+<fullquery name="dotlrn_class::new.create_class">
+<querytext>
+declare
+begin
+	
+:1 := dotlrn_class.new (
+	class_key => :name,
+	pretty_name => :pretty_name,
+	pretty_plural => :pretty_name,
+	description => :description
+);
+
+end;
+</querytext>
+</fullquery>
+
+
+<fullquery name="dotlrn_class::new_instance.create_class_instance">
+<querytext>
+declare
+begin
+	
+:1 := dotlrn_class_instance.new (
+	class_key => :class_type,
+	year => :year,
+	term => :term,
+	community_key => :short_name,
+	pretty_name => :class_name,
+	description => :description
+);
+
+end;
+</querytext>
+</fullquery>
+
+</queryset>
Index: openacs-4/packages/dotlrn/tcl/class-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/class-procs.tcl,v
diff -u -r1.6 -r1.7
--- openacs-4/packages/dotlrn/tcl/class-procs.tcl	6 Oct 2001 18:24:42 -0000	1.6
+++ openacs-4/packages/dotlrn/tcl/class-procs.tcl	8 Oct 2001 21:38:37 -0000	1.7
@@ -78,31 +78,28 @@
     } {
 	set short_name "$class_type-$term-$year"
 
-	# Create the community
-	# set community_id [dotlrn_community::new dotlrn_class $short_name $pretty_name]
+	db_transaction {
+	    # Insert the class instance
+	    set community_id [db_exec_plsql create_class_instance {}]
+	    
+	    # Set up the node
+	    # set parent_node_id [db_string select_parent_node_id {}]
+	    set parent_node_id [ad_conn -get node_id]
+	    
+	    # Instantiate the right package at that site node, probably portals
+	    set package_id [site_node_mount_application -return "package_id" $parent_node_id $short_name [one_class_package_key] $short_name]
 
-	# Insert the class instance
-	set community_id [db_exec_plsql create_class_instance {}]
-
-	# Set up the node
-	set parent_node_id [db_string select_parent_node_id {}]
-
-	# Instantiate the right package at that site node, probably portals
-	set result [site_node_mount_application -return "package_id,node_id" $parent_node_id $short_name [one_class_package_key] $short_name]
-	set package_id [lindex $result 0]
-	set node_id [lindex $result 1]
-
-	# Set the right parameters
-	ad_parameter -package_id $package_id -set 0 dotlrn_level_p
-	ad_parameter -package_id $package_id -set 0 class_level_p
-	ad_parameter -package_id $package_id -set 1 class_instance_level_p
-
-	# Set up the node
-	dotlrn_community::set_site_node $community_id $node_id
-
-	# Assign proper permissions to the site node
-	# NOT CERTAIN what to do here yet
-
+	    # Set the right parameters
+	    ad_parameter -package_id $package_id -set 0 dotlrn_level_p
+	    ad_parameter -package_id $package_id -set 0 community_type_level_p
+	    ad_parameter -package_id $package_id -set 1 community_level_p
+	    
+	    # Set up the node
+	    dotlrn_community::set_package_id $community_id $package_id
+	    
+	    # Assign proper permissions to the site node
+	    # NOT CERTAIN what to do here yet
+	}
     }
 
     ad_proc -public available_roles {
Index: openacs-4/packages/dotlrn/tcl/community-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/community-procs-oracle.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/tcl/community-procs-oracle.xql	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+
+<queryset>
+<rdbms><type>oracle</type><version>8.1.6</version></rdbms>
+
+<fullquery name="dotlrn_community::new_type.create_community_type">
+<querytext>
+declare
+begin
+	
+:1 := dotlrn_community_type.new (
+	community_type => :community_type,
+	parent_type => :supertype,
+	pretty_name => :pretty_name,
+	pretty_plural => :pretty_name,
+	description => :description
+);
+
+end;
+</querytext>
+</fullquery>
+
+
+<fullquery name="dotlrn_community::new.create_community">
+<querytext>
+declare
+begin
+	
+:1 := dotlrn_community.new (
+	community_type => :community_type,
+	community_key => :name
+	pretty_name => :pretty_name,
+	pretty_plural => :pretty_name,
+	description => :description
+);
+
+end;
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_url.select_node_url">
+<querytext>
+select site_node.url(node_id) from site_nodes where parent_id= :current_node_id and object_id= :package_id
+</querytext>
+</fullquery>
+
+</queryset>
Index: openacs-4/packages/dotlrn/tcl/community-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/community-procs.tcl,v
diff -u -r1.5 -r1.6
--- openacs-4/packages/dotlrn/tcl/community-procs.tcl	6 Oct 2001 18:24:42 -0000	1.5
+++ openacs-4/packages/dotlrn/tcl/community-procs.tcl	8 Oct 2001 21:38:37 -0000	1.6
@@ -40,7 +40,7 @@
 	db_dml update_package_id {}
     }
 
-    ad_proc new {
+    ad_proc -public new {
 	{-description ""}
 	community_type
 	name
@@ -64,6 +64,15 @@
 	db_dml update_package_id {}
     }
 
+    ad_proc admin_access_p {
+	community_id
+    } {
+	Checks admin access to a community
+    } {
+	# HACK FOR NOW!! (ben) FIXIT
+	return 1
+    }
+
     ad_proc -public get_url {
 	{-current_node_id ""}
 	{-package_id ""}
@@ -74,7 +83,7 @@
 	    set current_node_id [site_node_id [ad_conn url]]
 	}
 
-	return [db_string select_node_url {}]
+	return [db_string select_node_url {} -default ""]
     }
     
     ad_proc set_attribute {
@@ -111,17 +120,19 @@
     } {
 	Assigns a user to a particular role for that class. Roles in DOTLRN can be student, prof, ta, admin
     } {
-	# Set up the relationship
-	set rel_id [relation_add $rel_type $community_id $user_id]
-
-	# Set up a portal page for that user
-	set page_id [portal::create_portal $user_id]
-
-	# Insert the membership
-	db_dml insert_membership {}
-
-	# do the callbacks
-	applets_dispatch AddUser [list $community_id $user_id]
+	db_transaction {
+	    # Set up the relationship
+	    set rel_id [relation_add -member_state approved $rel_type $community_id $user_id]
+	    
+	    # Set up a portal page for that user
+	    set page_id [portal::create_portal $user_id]
+	    
+	    # Insert the membership
+	    db_dml insert_membership {}
+	    
+	    # do the callbacks
+	    applets_dispatch $community_id AddUser [list $community_id $user_id]
+	}
     }
 
     ad_proc -public remove_user {
@@ -130,17 +141,19 @@
     } {
 	Removes a user from a class
     } {
-	# Callbacks
-	applets_dispatch RemoveUser [list $community_id $user_id]
-
-	# Get the relationship ID
-	set rel_id [db_string select_rel_id {}]
-
-	# Remove the membership
-	db_dml delete_membership {}
-
-	# Remove it
-	relation_remove $rel_id
+	db_transaction {
+	    # Callbacks
+	    applets_dispatch $community_id RemoveUser [list $community_id $user_id]
+	    
+	    # Get the relationship ID
+	    set rel_id [db_string select_rel_id {}]
+	    
+	    # Remove the membership
+	    db_dml delete_membership {}
+	    
+	    # Remove it
+	    relation_remove $rel_id
+	}
     }
     
     ad_proc -public get_page_id {
@@ -161,10 +174,27 @@
 	set list_of_communities [list]
 
 	db_foreach select_communities {} {
-	    lappend list_of_communities [list $community_id $community_key $pretty_name $description [get_url -package_id $package_id]]
+	    lappend list_of_communities [list $community_id $community_type $pretty_name $description [get_url -package_id $package_id]]
 	}
+
+	return $list_of_communities
     }
 
+    ad_proc -public get_active_communities {
+	community_type
+    } {
+	Returns a list of active communities for a given type.
+	FIXME: right now all communities are active.
+    } {
+	set list_of_communities [list]
+
+	db_foreach select_active_communities {} {
+	    lappend list_of_communities [list $community_id $community_type $pretty_name $description [get_url -package_id $package_id]]
+	}
+
+	return $list_of_communities
+    }
+
     ad_proc -public get_community_type {
     } {
 	Returns the community type key depending on the node we're at
@@ -197,8 +227,13 @@
     } {
 	Adds an applet to the community
     } {
-	# Insert in the DB
-	db_dml insert_applet {}
+	db_transaction {
+	    # Insert in the DB
+	    db_dml insert_applet {}
+	    
+	    # Callback
+	    applet_call $applet_key AddApplet [list $community_id]
+	}
     }
 
     ad_proc -public remove_applet {
@@ -207,29 +242,53 @@
     } {
 	Removes an applet from a community
     } {
-	# Delete from the DB
-	db_dml delete_applet {}
+	# Get the package_id
+	set package_id [get_package_id $community_id]
+
+	db_transaction {
+	    # Callback
+	    applet_call $applet_key RemoveApplet [list $community_id $package_id]
+	    
+	    # Delete from the DB
+	    db_dml delete_applet {}
+	}
     }
 
     ad_proc -public list_applets {
-	community_id
+	{community_id ""}
     } {
 	Lists the applets associated with a community
     } {
-	# List from the DB
-	return [db_list select_community_applets {}]
+	if {[empty_string_p $community_id]} {
+	    # List all applets
+	    return [db_list select_all_applets {}]
+	} else {
+	    # List from the DB
+	    return [db_list select_community_applets {}]
+	}
     }
 
     ad_proc -public applets_dispatch {
+	community_id
 	op
 	list_args
     } {
 	Dispatch an operation to every applet
     } {
-	foreach applet [list_applets] {
+	foreach applet [list_applets $community_id] {
 	    # Callback on applet
-	    acs_sc_call dotLRN_Applet $op $list_args $applet
+	    applet_call $applet $op $list_args
 	}
     }
 
+    ad_proc -public applet_call {
+	applet_key
+	op
+	{list_args {}}
+    } {
+	Call a particular applet op
+    } {
+	acs_sc_call dotlrn_applet $op $list_args $applet_key
+    }
+
 }
Index: openacs-4/packages/dotlrn/tcl/community-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/community-procs.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/tcl/community-procs.xql	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+
+<queryset>
+
+<fullquery name="dotlrn_community::new_type.create_community_type">
+<querytext>
+declare
+begin
+end;
+</querytext>
+</fullquery>
+
+
+<fullquery name="dotlrn_community::set_type_package_id.update_package_id">
+<querytext>
+update dotlrn_community_types set package_id= :package_id where community_type= :community_type
+</querytext>
+</fullquery>
+
+
+<fullquery name="dotlrn_community::new">
+<querytext>
+insert into dotlrn_communities
+(community_id, community_type, community_key, pretty_name, description)
+values
+(:community_id, :community_type, :name, :pretty_name, :description)
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::set_package_id.update_package_id">
+<querytext>
+update dotlrn_communities set package_id= :package_id where community_id= :community_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::list_users.select_users">
+<querytext>
+select rel_id, users.user_id, first_names, last_name, email from users, dotlrn_community_memberships 
+where community_id= :community_id and users.user_id = dotlrn_community_memberships.user_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::member_p.select_count_membership">
+<querytext>
+select count(*) from dotlrn_community_memberships where community_id= :community_id and user_id= :user_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::add_user.insert_membership">
+<querytext>
+insert into dotlrn_community_memberships 
+(rel_id, community_id, user_id, page_id)
+values
+(:rel_id, :community_id, :user_id, :page_id)
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::remove_user.select_rel_id">
+<querytext>
+select rel_id from dotlrn_community_memberships where community_id= :community_id and user_id= :user_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::remove_user.delete_membership">
+<querytext>
+delete from dotlrn_community_memberships where rel_id=:rel_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_page_id.select_page_id">
+<querytext>
+select page_id from dotlrn_community_memberships where community_id= :community_id and user_id= :user_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_communities_by_user.select_communities">
+<querytext>
+select dotlrn_communities.community_id as community_id, community_type, pretty_name, description, package_id
+from dotlrn_communities, dotlrn_community_memberships
+where community_type= :community_type
+and user_id= :user_id
+and dotlrn_communities.community_id = dotlrn_community_memberships.community_id
+</querytext>
+</fullquery>
+\
+<fullquery name="dotlrn_community::get_active_communities.select_active_communities">
+<querytext>
+select community_id, community_type, pretty_name, description, package_id
+from dotlrn_communities
+where community_type= :community_type
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_community_type.select_community_type">
+<querytext>
+select community_type from dotlrn_community_types where package_id= :package_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_community_id.select_community">
+<querytext>
+select community_id from dotlrn_communities where package_id= :package_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::get_package_id.select_package_id">
+<querytext>
+select package_id from dotlrn_communities where community_id= :community_id
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::add_applet.insert_applet">
+<querytext>
+insert into dotlrn_community_applets
+(community_id, applet_key)
+values
+(:community_id, :applet_key)
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::remove_applet.delete_applet">
+<querytext>
+delete from dotlrn_community_applets where
+community_id= :community_id and applet_key= :applet_key
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::list_applets.select_all_applets">
+<querytext>
+select impl_name from acs_sc_impls, acs_sc_bindings, acs_sc_contracts
+where
+acs_sc_impls.impl_id = acs_sc_bindings.impl_id and
+acs_sc_contracts.contract_id= acs_sc_bindings.contract_id and 
+acs_sc_contracts.contract_name='dotlrn_applet'
+</querytext>
+</fullquery>
+
+<fullquery name="dotlrn_community::list_applets.select_community_applets">
+<querytext>
+select applet_key from dotlrn_community_applets where community_id= :community_id
+</querytext>
+</fullquery>
+
+</queryset>
Index: openacs-4/packages/dotlrn/tcl/dotlrn-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/tcl/dotlrn-procs.tcl,v
diff -u -r1.4 -r1.5
--- openacs-4/packages/dotlrn/tcl/dotlrn-procs.tcl	3 Oct 2001 21:11:00 -0000	1.4
+++ openacs-4/packages/dotlrn/tcl/dotlrn-procs.tcl	8 Oct 2001 21:38:37 -0000	1.5
@@ -18,6 +18,29 @@
 
 namespace eval dotlrn {
 
+    ad_proc install {
+    } {
+	Does some installation that cannot be done in SQL
+    } {
+	db_transaction {
+	    # Create the rel types
+	    rel_types::new -supertype membership_rel -role_two admin admin_rel "Administration Relation" "Administration Relations" dotlrn_community 0 "" party 0 ""
+	    rel_types::new -supertype membership_rel -role_two student student_rel "Student Relation" "Student Relations" dotlrn_community 0 "" party 0 ""
+	    rel_types::new -supertype admin_rel -role_two admin instructor_rel "Instructor Relation" "Instructor Relations" dotlrn_community 0 "" party 0 ""
+	    rel_types::new -supertype admin_rel -role_two admin ta_rel "TA Relation" "TA Relations" dotlrn_community 0 "" party 0 ""
+	    
+	    # Add what's permissible (we would do this in SQL if the above could be done in SQL...)
+	    rel_types::add_permissible dotlrn_class admin_rel
+	    rel_types::add_permissible dotlrn_class student_rel
+	    rel_types::add_permissible dotlrn_class ta_rel
+	    rel_types::add_permissible dotlrn_class instructor_rel
+
+	    rel_types::add_permissible dotlrn_club admin_rel
+	    # rel_types::add_permissible dotlrn_club membership_rel
+	}
+    }
+
+
     ad_proc -public class_group_type_key {
     } {
 	Returns the group type key used for class groups
@@ -32,12 +55,4 @@
 	return [ad_parameter group_type_key]
     }
 
-    ad_proc -public node_id {
-	{-package_id ""}
-    } {
-	Returns the node ID of the current dotLRN package
-    } {
-	## TOTAL HACK (BEN!!)
-	return 0
-    }
 }
Index: openacs-4/packages/dotlrn/www/applet-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/applet-add.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/www/applet-add.tcl	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,24 @@
+
+ad_page_contract {
+    Add an applet to a community
+    
+    @author Ben Adida (ben@openforce.net)
+    @creation-date 2001-10-08
+} {
+    applet_key
+}
+
+# Get the community ID
+set community_id [dotlrn_community::get_community_id]
+
+# Check access
+if {![dotlrn_community::admin_access_p $community_id]} {
+    ns_returnredirect /
+    return
+}
+
+# Add the applet
+dotlrn_community::add_applet $community_id $applet_key
+
+# Get back to where you once belonged
+ns_returnredirect one-community-admin
Index: openacs-4/packages/dotlrn/www/applet-remove.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/applet-remove.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/www/applet-remove.tcl	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,24 @@
+
+ad_page_contract {
+    Remove an applet from a community
+    
+    @author Ben Adida (ben@openforce.net)
+    @creation-date 2001-10-08
+} {
+    applet_key
+}
+
+# Get the community ID
+set community_id [dotlrn_community::get_community_id]
+
+# Check access
+if {![dotlrn_community::admin_access_p $community_id]} {
+    ns_returnredirect /
+    return
+}
+
+# Add the applet
+dotlrn_community::remove_applet $community_id $applet_key
+
+# Get back to where you once belonged
+ns_returnredirect one-community-admin
Index: openacs-4/packages/dotlrn/www/install.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/Attic/install.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/www/install.tcl	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,4 @@
+
+dotlrn::install
+
+ns_returnredirect "./"
Index: openacs-4/packages/dotlrn/www/one-community-admin.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/one-community-admin.adp,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/www/one-community-admin.adp	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,22 @@
+<master src="master">
+<property name="context_bar">@context_bar@</property>
+<property name="title">dotLRN Community Admin: @pretty_name@</property>
+
+Here you can do all sorts of administrative stuff.
+
+<p>
+
+<h3>Active Applets</h3>
+<ul>
+<multiple name=active_applets>
+<li> @active_applets.applet_pretty_name@ - (cannot be removed yet)
+</multiple>
+</ul>
+
+<p>
+<h3>Applets to Add</h3>
+<ul>
+<multiple name=all_applets>
+<li> @all_applets.applet_pretty_name@ - [<a href=applet-add?applet_key=@all_applets.applet_key@>add</a>]
+</multiple>
+</ul>
Index: openacs-4/packages/dotlrn/www/one-community-admin.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/one-community-admin.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/dotlrn/www/one-community-admin.tcl	6 Oct 2001 18:24:42 -0000	1.1
+++ openacs-4/packages/dotlrn/www/one-community-admin.tcl	8 Oct 2001 21:38:37 -0000	1.2
@@ -20,12 +20,30 @@
 set community_id [dotlrn_community::get_community_id]
 
 # Load some community type info
-db_1row select_community_type_info {}
+db_1row select_community_info {}
 
-# Check what communities of this type the user is a member of
-# cause we want to display that!
-set communities [dotlrn_community::get_communities_by_user $community_type $user_id]
+# Get active applets
+set list_of_active_applets [dotlrn_community::list_applets $community_id]
 
-# communities should be a data source
+template::multirow create active_applets applet_key applet_pretty_name
 
+foreach applet_key $list_of_active_applets {
+    template::multirow append active_applets $applet_key [dotlrn_community::applet_call $applet_key GetPrettyName]
+}
+
+
+# List all applets
+set list_of_applets [dotlrn_community::list_applets]
+
+template::multirow create all_applets applet_key applet_pretty_name
+
+foreach applet_key $list_of_applets {
+    if {[lsearch $list_of_active_applets $applet_key] == -1} {
+	template::multirow append all_applets $applet_key [dotlrn_community::applet_call $applet_key GetPrettyName]
+    }
+}
+
+
+set context_bar {Admin}
+
 ad_return_template
Index: openacs-4/packages/dotlrn/www/one-community-admin.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/one-community-admin.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/www/one-community-admin.xql	8 Oct 2001 21:39:05 -0000	1.1
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+
+<queryset>
+
+<fullquery name="select_community_info">
+<querytext>
+select pretty_name from dotlrn_communities where community_id = :community_id
+</querytext>
+</fullquery>
+
+</queryset>
Index: openacs-4/packages/dotlrn/www/one-community-type.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/one-community-type.adp,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/dotlrn/www/one-community-type.adp	7 Oct 2001 19:21:08 -0000	1.2
+++ openacs-4/packages/dotlrn/www/one-community-type.adp	8 Oct 2001 21:38:37 -0000	1.3
@@ -20,7 +20,7 @@
 <h3>Active Communities of this Type</h3>
 <ul>
 <multiple name=active_communities>
-<li><a href=@active_communities.url@>@active_communities.pretty_name@</a>
+<li><a href=@active_communities.url@>@active_communities.pretty_name@</a> - <a href=@active_communities.url@/one-community-admin>admin</a>
 </multiple>
 </ul>
 </else>
Index: openacs-4/packages/dotlrn/www/one-community.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/one-community.adp,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/dotlrn/www/one-community.adp	6 Oct 2001 18:24:42 -0000	1.1
+++ openacs-4/packages/dotlrn/www/one-community.adp	8 Oct 2001 21:38:37 -0000	1.2
@@ -1,4 +1,7 @@
 <master src="master">
 <property name="title">dotLRN Community</property>
 
+<h2>dotLRN Community: @pretty_name@</h2>
+
+
 @rendered_page@
Index: openacs-4/packages/dotlrn/www/test.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/www/test.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/dotlrn/www/test.tcl	6 Oct 2001 18:24:42 -0000	1.1
+++ openacs-4/packages/dotlrn/www/test.tcl	8 Oct 2001 21:38:37 -0000	1.2
@@ -1,7 +1,8 @@
 
 
 # A testing script
+dotlrn_community::remove_user 2377 2195
 
-# Create a class
-doc_body_append "nothing"
+ns_returnredirect ./
 
+