As I sharpened my filet knife I realized that the roles and types I had created were general-purpose roles that I may want to use in other packages and such. So instead of carving the roles from the system, I refactored the code that creates roles, types, and associates thier use with Application Groups so that it would extend whatever roles were present with the roles that were not present. Here's the new code. BTW, this makes it a very simple matter to extend the roles further by adding a single entry in the roles_rel list structure. Maybe this is a canditate to add to the acs-subsite admin UI?
ad_proc -private rel_types_extend {
} {
Extend the standard oacs application group roles and relation types of
Members and Administrators with Guests and Managers.
Since these additional roles/types are general purpose, we'll leave
them installed when our package is removed. We'll also use the roles
if they already exist, whether we created them or something else did.
When this proc completes, the following will exist:
--Role-- --Rel--
Guest guest_rel (extension)
Member membership_rel (standard)
Manager manager_rel (extension)
Administrator admin_rel (standard)
There is the assumption that, if a required role already exists,
then it is correctly configured with the proper rel_type and that
it is also a registered type for Application Groups. Conversely,
if the role does not yet exist, then the role, its rel_type, and
association with group type Application Group is configured.
} {
# Map required roles to rels (add new roles & rels here)
#
# --Role-- --Pretty-- --Plural-- --Rel Type--
set roles_rels "[list guest Guest Guests guest_rel] \
[list member Member Members membership_rel] \
[list manager Manager Managers manager_rel] \
[list admin Administrator Administrators admin_rel]"
foreach {role pn pp rel} $roles_rels {
# Base existence check on existing role
if {[db_0or1row role_exists {
select r.pretty_name from acs_rel_roles r where r.role=:role
}]} {
} else {
# Extend roles
db_1row new_role {select acs_rel_type__create_role(:role, :pn, :pp)}
# Extend rel types
set m_rel_type [rel_types::new -supertype "membership_rel" \
-role_one "" -role_two $role \
$rel $pn $pp "group" "0" "" "person" "0" "1"]
# Associate with group type Application Group
rel_types::add_permissible application_group $rel
}
}
}