- I OpenACS For Everyone
- I.1 High level information: What is OpenACS?
- I.1.1 Overview
- I.1.2 OpenACS Release Notes
- I.2 OpenACS: robust web development framework
- I.2.1 Introduction
- I.2.2 Basic infrastructure
- I.2.3 Advanced infrastructure
- I.2.4 Domain level tools
- I.1 High level information: What is OpenACS?
- II Administrator's Guide
- II.2 Installation Overview
- II.2.1 Basic Steps
- II.2.2 Prerequisite Software
- II.3 Complete Installation
- II.3.1 Install a Unix-like system and supporting software
- II.3.2 Install Oracle 10g XE on debian
- II.3.2.1 Install Oracle 8.1.7
- II.3.3 Install PostgreSQL
- II.3.4 Install AOLserver 4
- II.3.5 Quick Install of OpenACS
- II.3.5.1 Complex Install OpenACS 5.3
- II.3.6 OpenACS Installation Guide for Windows2000
- II.3.7 OpenACS Installation Guide for Mac OS X
- II.4 Configuring a new OpenACS Site
- II.4.1 Installing OpenACS packages
- II.4.2 Mounting OpenACS packages
- II.4.3 Configuring an OpenACS package
- II.4.4 Setting Permissions on an OpenACS package
- II.4.5 How Do I?
- II.4.6 Configure OpenACS look and feel with templates
- II.5 Upgrading
- II.5.1 Overview
- II.5.2 Upgrading 4.5 or higher to 4.6.3
- II.5.3 Upgrading OpenACS 4.6.3 to 5.0
- II.5.4 Upgrading an OpenACS 5.0.0 or greater installation
- II.5.5 Upgrading the OpenACS files
- II.5.6 Upgrading Platform components
- II.6 Production Environments
- II.6.1 Starting and Stopping an OpenACS instance.
- II.6.2 AOLserver keepalive with inittab
- II.6.3 Running multiple services on one machine
- II.6.4 High Availability/High Performance Configurations
- II.6.5 Staged Deployment for Production Networks
- II.6.6 Installing SSL Support for an OpenACS service
- II.6.7 Set up Log Analysis Reports
- II.6.8 External uptime validation
- II.6.9 Diagnosing Performance Problems
- II.7 Database Management
- II.7.1 Running a PostgreSQL database on another server
- II.7.2 Deleting a tablespace
- II.7.3 Vacuum Postgres nightly
- II.8 Backup and Recovery
- II.8.1 Backup Strategy
- II.8.2 Manual backup and recovery
- II.8.3 Automated Backup
- II.8.4 Using CVS for backup-recovery
- II.A Install Red Hat 8/9
- II.B Install additional supporting software
- II.B.1 Unpack the OpenACS tarball
- II.B.2 Initialize CVS (OPTIONAL)
- II.B.3 Add PSGML commands to emacs init file (OPTIONAL)
- II.B.4 Install Daemontools (OPTIONAL)
- II.B.5 Install qmail (OPTIONAL)
- II.B.6 Install Analog web file analyzer
- II.B.7 Install nspam
- II.B.8 Install Full Text Search
- II.B.9 Install Full Text Search using Tsearch2
- II.B.10 Install Full Text Search using OpenFTS (deprecated see tsearch2)
- II.B.11 Install nsopenssl
- II.B.12 Install tclwebtest.
- II.B.13 Install PHP for use in AOLserver
- II.B.14 Install Squirrelmail for use as a webmail system for OpenACS
- II.B.15 Install PAM Radius for use as external authentication
- II.B.16 Install LDAP for use as external authentication
- II.B.17 Install AOLserver 3.3oacs1
- II.C Credits
- II.C.1 Where did this document come from?
- II.C.2 Linux Install Guides
- II.C.3 Security Information
- II.C.4 Resources
- II.2 Installation Overview
- III For OpenACS Package Developers
- III.9 Development Tutorial
- III.9.1 Creating an Application Package
- III.9.2 Setting Up Database Objects
- III.9.3 Creating Web Pages
- III.9.4 Debugging and Automated Testing
- III.10 Advanced Topics
- III.10.1 Write the Requirements and Design Specs
- III.10.2 Add the new package to CVS
- III.10.3 OpenACS Edit This Page Templates
- III.10.4 Adding Comments
- III.10.5 Admin Pages
- III.10.6 Categories
- III.10.7 Profile your code
- III.10.8 Prepare the package for distribution.
- III.10.9 Distributing upgrades of your package
- III.10.10 Notifications
- III.10.11 Hierarchical data
- III.10.12 Using .vuh files for pretty urls
- III.10.13 Laying out a page with CSS instead of tables
- III.10.14 Sending HTML email from your application
- III.10.15 Basic Caching
- III.10.16 Scheduled Procedures
- III.10.17 Enabling WYSIWYG
- III.10.18 Adding in parameters for your package
- III.10.19 Writing upgrade scripts
- III.10.20 Connect to a second database
- III.10.21 Future Topics
- III.11 Development Reference
- III.11.1 OpenACS Packages
- III.11.2 OpenACS Data Models and the Object System
- III.11.3 The Request Processor
- III.11.4 The OpenACS Database Access API
- III.11.5 Using Templates in OpenACS
- III.11.6 Groups, Context, Permissions
- III.11.7 Writing OpenACS Application Pages
- III.11.8 Parties in OpenACS
- III.11.9 OpenACS Permissions Tediously Explained
- III.11.10 Object Identity
- III.11.11 Programming with AOLserver
- III.11.12 Using Form Builder: building html forms dynamically
- III.12 Engineering Standards
- III.12.1 OpenACS Style Guide
- III.12.2 Release Version Numbering
- III.12.3 Constraint naming standard
- III.12.4 ACS File Naming and Formatting Standards
- III.12.5 PL/SQL Standards
- III.12.6 Variables
- III.12.7 Automated Testing
- III.13 CVS Guidelines
- III.13.1 Using CVS with OpenACS
- III.13.2 OpenACS CVS Concepts
- III.13.3 Contributing code back to OpenACS
- III.13.4 Additional Resources for CVS
- III.14 Documentation Standards
- III.14.1 OpenACS Documentation Guide
- III.14.2 Using PSGML mode in Emacs
- III.14.3 Using nXML mode in Emacs
- III.14.4 Detailed Design Documentation Template
- III.14.5 System/Application Requirements Template
- III.15 TCLWebtest
- III.16 Internationalization
- III.16.1 Internationalization and Localization Overview
- III.16.2 How Internationalization/Localization works in OpenACS
- III.16.4 Design Notes
- III.16.5 Translator's Guide
- III.D Using CVS with an OpenACS Site
- III.9 Development Tutorial
- IV For OpenACS Platform Developers
- IV.17 Kernel Documentation
- IV.17.1 Overview
- IV.17.2 Object Model Requirements
- IV.17.3 Object Model Design
- IV.17.4 Permissions Requirements
- IV.17.5 Permissions Design
- IV.17.6 Groups Requirements
- IV.17.7 Groups Design
- IV.17.8 Subsites Requirements
- IV.17.9 Subsites Design Document
- IV.17.10 Package Manager Requirements
- IV.17.11 Package Manager Design
- IV.17.12 Database Access API
- IV.17.13 OpenACS Internationalization Requirements
- IV.17.14 Security Requirements
- IV.17.15 Security Design
- IV.17.16 Security Notes
- IV.17.17 Request Processor Requirements
- IV.17.18 Request Processor Design
- IV.17.19 Documenting Tcl Files: Page Contracts and Libraries
- IV.17.20 Bootstrapping OpenACS
- IV.17.21 External Authentication Requirements
- IV.18 Releasing OpenACS
- IV.18.1 OpenACS Core and .LRN
- IV.18.2 How to Update the OpenACS.org repository
- IV.18.3 How to package and release an OpenACS Package
- IV.18.4 How to Update the translations
- IV.17 Kernel Documentation
- V Tcl for Web Nerds
- V.1 Tcl for Web Nerds Introduction
- V.2 Basic String Operations
- V.3 List Operations
- V.4 Pattern matching
- V.5 Array Operations
- V.6 Numbers
- V.7 Control Structure
- V.8 Scope, Upvar and Uplevel
- V.9 File Operations
- V.10 Eval
- V.11 Exec
- V.12 Tcl for Web Use
- V.13 OpenACS conventions for TCL
- V.14 Solutions
- VI SQL for Web Nerds
- VI.1 SQL Tutorial
- VI.1.1 SQL Tutorial
- VI.1.2 Answers
- VI.2 SQL for Web Nerds Introduction
- VI.3 Data modeling
- VI.3.1 The Discussion Forum -- philg's personal odyssey
- VI.3.2 Data Types (Oracle)
- VI.3.4 Tables
- VI.3.5 Constraints
- VI.4 Simple queries
- VI.5 More complex queries
- VI.6 Transactions
- VI.7 Triggers
- VI.8 Views
- VI.9 Style
- VI.10 Escaping to the procedural world
- VI.11 Trees
- VI.1 SQL Tutorial
IV.17.7 Groups Design
-
User directory
-
Sitewide administrator directory
-
Subsite administrator directory
-
TCL script directory
-
Data model
-
PL/SQL file
-
ER diagram
-
Transaction flow diagram
Almost all database-backed websites have users, and need to model the grouping of users. The OpenACS 4 Parties and Groups system is intended to provide the flexibility needed to model complex real-world organizational structures, particularly to support powerful subsite services; that is, where one OpenACS installation can support what appears to the user as distinct web services for different user communities.
The primary limitation of the OpenACS 3.x user group system is that it restricts the application developer to representing a "flat group" that contains only users: The user_groups
table may contain the group_id
of a parent group, but parent-child relationship support is limited because it only allows one kind of relationship between groups to be represented. Moreover, the Oracle database's limited support for tree-like structures makes the queries over these relationships expensive.
In addition, the Module Scoping design in OpenACS 3.0 introduced a party abstraction - a thing that is a person or a group of people - though not in the form of an explicit table. Rather, the triple of scope
, user_id
, and group_id
columns was used to identify the party. One disadvantage of this design convention is that it increases a data model's complexity by requiring the programmer to:
-
add these three columns to each "scoped" table
-
define a multi-column check constraint to protect against data corruption (e.g., a row with a
scope
value of "group" but a nullgroup_id
) -
perform extra checks in
Tcl
andPL/SQL
functions and procedures to check both theuser_id
andgroup_id
values
...
The core of the Group Systems data model is quite simple, but it was designed in the hopes of modeling "real world" organizations which can be complex graph structures. The Groups System only considers groups that can be modeled using directed acyclic graphs, but queries over these structures are still complex enough to slow the system down. Since almost every page will have at least one membership check, a number of triggers, views, and auxiliary tables have been created in the hopes of increasing performance. To keep the triggers simple and the number of triggers small, the data model disallows updates on the membership and composition tables, only inserts and deletes are permitted.
The data model has tried to balance the need to model actual organizations without making the system too complex or too slow. The added triggers, views, and tables and will increase storage requirements and the insert and delete times in an effort to speed access time. The limited flexibility (no updates on membership) trades against the complexity of the code.
The Group System data model consists of the following tables:
parties
-
The set of all defined parties: any person, user, or group must have a corresponding row in this table.
persons
-
The set of all defined persons. To allow easy sorting of persons, the name requirement 30.10 is met by splitting the person's name into two columns:
first_names
andlast_name
. users
-
The set of all registered users; this table includes information about the user's email address and the user's visits to the site.
user_preferences
-
Preferences for the user.
groups
-
The set of all defined groups.
group_types
-
When a new type of group is created, this table holds additional knowledge level attributes for the group and its subtypes.
membership_rels
-
The set of direct membership relationships between a group and a party.
group_member_index
-
A mapping of a party P to the groups {Gi }the party is a member of; this mapping includes the type of relationship by including the appropriate
rel_id
from themembership_rels
table. composition_rels
-
The set of direct component relationships between a group and another group.
group_component_index
-
A mapping of a group Gto the set of groups {Gi } that G is a component of; this mapping includes the type of relationship by including the appropriate
rel_id
from thecomposition_rels
table.
New groups are created through the group.new
constructor. When a specialized type of group is required, the group type can be extended by an application developer. Membership constraints can be specified at creation time by passing a parent group to the constructor.
The membership_rels
and composition_rels
tables indicate a group's direct members and direct components; these tables do not provide a record of the members or components that are in the group by virtue of being a member or component of one of the group's component groups. Site pages will query group membership often, but the network of component groups can become a very complex directed acyclic graph and traversing this graph for every query will quickly degrade performance. To make membership queries responsive, the data model includes triggers (described in the next paragraph) which watch for changes in membership or composition and update tables that maintain the group party mappings, i.e., group_member_index
and group_component_index
. One can think of these tables as a manually maintained index.
The following triggers keep the group_*_index
tables up to date:
membership_rels_in_tr
-
Is executed when a new group/member relationship is created (an insert on
membership_rels
) membership_rels_del_tr
-
Is executed when a group/member relationship is deleted (a delete on
membership_rels
) composition_rels_in_tr
-
Is executed when a new group/component relationship is created (an insert on
composition_rels
) composition_rels_del_tr
-
Is executed when a group/component relationship is deleted (a delete on
composition_rels
)
The data model provides the following views onto the group_member_index
and group_component_index
tables. No code outside of Groups System should modify the group_*_index
tables.
group_member_map
-
A mapping of a party to the groups the party is a member of; this mapping includes the type of relationship by including the appropriate
rel_id
from themembership_rels
table. group_approved_member_map
-
A mapping of a party to the groups the party is an approved member of (
member_state
is 'approved'); this mapping includes the type of relationship by including the appropriaterel_id
from themembership_rels
table. group_distinct_member_map
-
A person may appear in the group member map multiple times, for example, by being a member of two different groups that are both components of a third group. This view is strictly a mapping of approved members to groups.
group_component_map
-
A mapping of a group Gto the set of groups {Gi } group G is a component of; this mapping includes the type of relationship by including the appropriate
rel_id
from thecomposition_rels
table. party_member_map
-
A mapping of a party P to the set of parties {Pi } party P is a member of.
party_approved_member_map
-
A mapping of a party P to the set of parties {Pi } party P is an approved member of.
The API consists of tables and views and PL/SQL functions.
The group_types
table is used to create new types of groups.
The group_member_map
, group_approved_member_map
, group_distinct_member_map
, group_component_map
, party_member_map
, and party_approved_member_map
views are used to query group membership and composition.
Person
person.new
creates a new person and returns the person_id
. The function must be given the full name of the person in two pieces: first_names
and last_name
. All other fields are optional and default to null except for object_type
which defaults to person and creation_date
which defaults to sysdate
. The interface for this function is:
function person.new ( person_id persons.person_id%TYPE, object_type acs_objects.object_type%TYPE, creation_date acs_objects.creation_date%TYPE, creation_user acs_objects.creation_user%TYPE, creation_ip acs_objects.creation_ip%TYPE, email parties.email%TYPE, url parties.url%TYPE, first_names persons.first_names%TYPE, last_name persons.last_name%TYPE ) return persons.person_id%TYPE;
person.delete
deletes the person whose person_id
is passed to it. The interface for this procedure is:
procedure person.delete ( person_id persons.person_id%TYPE );
person.name
returns the name of the person whose person_id
is passed to it. The interface for this function is:
function person.name ( person_id persons.person_id%TYPE ) return varchar;
User
acs_user.new
creates a new user and returns the user_id
. The function must be given the user's email address and the full name of the user in two pieces: first_names
and last_name
. All other fields are optional. The interface for this function is:
function acs_user.new ( user_id users.user_id%TYPE, object_type acs_objects.object_type%TYPE, creation_date acs_objects.creation_date%TYPE, creation_user acs_objects.creation_user%TYPE, creation_ip acs_objects.creation_ip%TYPE, email parties.email%TYPE, url parties.url%TYPE, first_names persons.first_names%TYPE, last_name persons.last_name%TYPE password users.password%TYPE, salt users.salt%TYPE, password_question users.password_question%TYPE, password_answer users.password_answer%TYPE, screen_name users.screen_name%TYPE, email_verified_p users.email_verified_p%TYPE ) return users.user_id%TYPE;
acs_user.delete
deletes the user whose user_id
is passed to it. The interface for this procedure is:
procedure acs_user.delete ( user_id users.user_id%TYPE );
acs_user.receives_alerts_p
returns 't' if the user should receive email alerts and 'f' otherwise. The interface for this function is:
function acs_user.receives_alerts_p ( user_id users.user_id%TYPE ) return varchar;
Use the procedures acs_user.approve_email
and acs_user.unapprove_email
to specify whether the user's email address is valid. The interface for these procedures are:
procedure acs_user.approve_email ( user_id users.user_id%TYPE ); procedure acs_user.unapprove_email ( user_id users.user_id%TYPE );
Group
acs_group.new
creates a new group and returns the group_id
. All fields are optional and default to null except for object_type
which defaults to 'group', creation_date
which defaults to sysdate
, and group_name
which is required. The interface for this function is:
function acs_group.new ( group_id groups.group_id%TYPE, object_type acs_objects.object_type%TYPE, creation_date acs_objects.creation_date%TYPE, creation_user acs_objects.creation_user%TYPE, creation_ip acs_objects.creation_ip%TYPE, email parties.email%TYPE, url parties.url%TYPE, group_name groups.group_name%TYPE ) return groups.group_id%TYPE;
acs_group.name
returns the name of the group whose group_id
is passed to it. The interface for this function is:
function acs_group.name ( group_id groups.group_id%TYPE ) return varchar;
acs_group.member_p
returns 't' if the specified party is a member of the specified group. Returns 'f' otherwise. The interface for this function is:
function acs_group.member_p ( group_id groups.group_id%TYPE, party_id parties.party_id%TYPE, ) return char;
Membership Relationship
membership_rel.new
creates a new membership relationship type between two parties and returns the relationship type's rel_id
. All fields are optional and default to null except for rel_type
which defaults to membership_rel. The interface for this function is:
function membership_rel.new ( rel_id membership_rels.rel_id%TYPE, rel_type acs_rels.rel_type%TYPE, object_id_one acs_rels.object_id_one%TYPE, object_id_two acs_rels.object_id_two%TYPE, member_state membership_rels.member_state%TYPE, creation_user acs_objects.creation_user%TYPE, creation_ip acs_objects.creation_ip%TYPE, ) return membership_rels.rel_id%TYPE;
membership_rel.ban
sets the member_state
of the given rel_id
to 'banned'. The interface for this procedure is:
procedure membership_rel.ban ( rel_id membership_rels.rel_id%TYPE );
membership_rel.approve
sets the member_state
of the given rel_id
to 'approved'. The interface for this procedure is:
procedure membership_rel.approve ( rel_id membership_rels.rel_id%TYPE );
membership_rel.reject
sets the member_state
of the given rel_id
to 'rejected. The interface for this procedure is:
procedure membership_rel.reject ( rel_id membership_rels.rel_id%TYPE );
membership_rel.unapprove
sets the member_state
of the given rel_id
to an empty string ''. The interface for this procedure is:
procedure membership_rel.unapprove ( rel_id membership_rels.rel_id%TYPE );
membership_rel.deleted
sets the member_state
of the given rel_id
to 'deleted'. The interface for this procedure is:
procedure membership_rel.deleted ( rel_id membership_rels.rel_id%TYPE );
membership_rel.delete
deletes the given rel_id
. The interface for this procedure is:
procedure membership_rel.delete ( rel_id membership_rels.rel_id%TYPE );
Composition Relationship
composition_rel.new
creates a new composition relationship type and returns the relationship's rel_id
. All fields are optional and default to null except for rel_type
which defaults to composition_rel. The interface for this function is:
function membership_rel.new ( rel_id composition_rels.rel_id%TYPE, rel_type acs_rels.rel_type%TYPE, object_id_one acs_rels.object_id_one%TYPE, object_id_two acs_rels.object_id_two%TYPE, creation_user acs_objects.creation_user%TYPE, creation_ip acs_objects.creation_ip%TYPE, ) return composition_rels.rel_id%TYPE;
composition_rel.delete
deletes the given rel_id
. The interface for this procedure is:
procedure membership_rel.delete ( rel_id composition_rels.rel_id%TYPE );
Describe the admin pages.
...
...
...
- System creator
- System owner
- Documentation author
-
Mark Thomas
Document Revision # | Action Taken, Notes | When? | By Whom? |
---|---|---|---|
0.1 | Creation | 08/22/2000 | Rafael H. Schloming |
0.2 | Initial Revision | 08/30/2000 | Mark Thomas |
0.3 | Additional revisions; tried to clarify membership/compostion | 09/08/2000 | Mark Thomas |