• Publicity: Public Only All

rel-types-procs.tcl

Procs about relationships

Location:
packages/acs-subsite/tcl/rel-types-procs.tcl
Created:
Tue Dec 12 15:40:39 2000
Author:
mbryzek@arsdigita.com
CVS Identification:
$Id: rel-types-procs.tcl,v 1.19.2.1 2019/04/18 09:12:32 gustafn Exp $

Procedures in this file

Detailed information

ad_page_contract_filter_proc_rel_type_dynamic_p (public)

 ad_page_contract_filter_proc_rel_type_dynamic_p name value_varname

Checks whether the value (assumed to be a string referring to a relationship type) is a dynamic object type.

Parameters:
name
value_varname
Author:
Michael Bryzek <mbryzek@arsdigita.com>
Created:
12/30/2000

Partial Call Graph (max 5 caller/called nodes):
%3 ad_complain ad_complain (public) db_string db_string (public) ad_page_contract_filter_proc_rel_type_dynamic_p ad_page_contract_filter_proc_rel_type_dynamic_p ad_page_contract_filter_proc_rel_type_dynamic_p->ad_complain ad_page_contract_filter_proc_rel_type_dynamic_p->db_string

Testcases:
No testcase defined.

rel_types::add_permissible (public)

 rel_types::add_permissible group_type rel_type

Add a permissible relationship for a given group type

Parameters:
group_type
rel_type

Partial Call Graph (max 5 caller/called nodes):
%3 db_dml db_dml (public) db_nextval db_nextval (public) rel_types::add_permissible rel_types::add_permissible rel_types::add_permissible->db_dml rel_types::add_permissible->db_nextval

Testcases:
No testcase defined.

rel_types::additional_rel_types_p (public)

 rel_types::additional_rel_types_p [ -group_id group_id ] \
    [ -group_type group_type ]

Returns 1 if there is a relationship type not being used by the specified group_id or group_type. Useful for deciding when to offer the user a link to create or add a new permissible relationship type

Switches:
-group_id
(optional)
-group_type
(optional)
Author:
Michael Bryzek <mbryzek@arsdigita.com>
Created:
12/2000

Partial Call Graph (max 5 caller/called nodes):
%3 packages/acs-subsite/www/admin/group-types/one.tcl packages/acs-subsite/ www/admin/group-types/one.tcl rel_types::additional_rel_types_p rel_types::additional_rel_types_p packages/acs-subsite/www/admin/group-types/one.tcl->rel_types::additional_rel_types_p rel_types::additional_rel_types_group_p rel_types::additional_rel_types_group_p (private) rel_types::additional_rel_types_p->rel_types::additional_rel_types_group_p rel_types::additional_rel_types_group_type_p rel_types::additional_rel_types_group_type_p (private) rel_types::additional_rel_types_p->rel_types::additional_rel_types_group_type_p

Testcases:
No testcase defined.

rel_types::create_role (public)

 rel_types::create_role -pretty_name pretty_name \
    -pretty_plural pretty_plural [ -role role ]

Create a new Relationship Role

Switches:
-pretty_name
(required)
-pretty_plural
(required)
-role
(optional)
Returns:
1 if successful
Author:
Malte Sussdorff <sussdorff@sussdorff.de>
Created:
2005-06-04

Partial Call Graph (max 5 caller/called nodes):
%3 test_acs_subsite_rel_type_roles acs_subsite_rel_type_roles (test acs-subsite) rel_types::create_role rel_types::create_role test_acs_subsite_rel_type_roles->rel_types::create_role db_exec_plsql db_exec_plsql (public) rel_types::create_role->db_exec_plsql db_list db_list (public) rel_types::create_role->db_list db_transaction db_transaction (public) rel_types::create_role->db_transaction lang::message::register lang::message::register (public) rel_types::create_role->lang::message::register util_text_to_url util_text_to_url (public) rel_types::create_role->util_text_to_url packages/acs-subsite/www/admin/rel-types/roles/new.tcl packages/acs-subsite/ www/admin/rel-types/roles/new.tcl packages/acs-subsite/www/admin/rel-types/roles/new.tcl->rel_types::create_role

Testcases:
acs_subsite_rel_type_roles

rel_types::delete_role (public)

 rel_types::delete_role [ -role role ]

Drop a Relationship Role.

Switches:
-role
(optional)
The role to delete.
Returns:
Returns 1 if successful, otherwise 0.
Author:
Nick Carroll <nick.c@rroll.net>
Created:
2005-11-18

Partial Call Graph (max 5 caller/called nodes):
%3 test_acs_subsite_rel_type_roles acs_subsite_rel_type_roles (test acs-subsite) rel_types::delete_role rel_types::delete_role test_acs_subsite_rel_type_roles->rel_types::delete_role db_exec_plsql db_exec_plsql (public) rel_types::delete_role->db_exec_plsql db_transaction db_transaction (public) rel_types::delete_role->db_transaction lang::message::unregister lang::message::unregister (public) rel_types::delete_role->lang::message::unregister

Testcases:
acs_subsite_rel_type_roles

rel_types::new (public)

 rel_types::new [ -supertype supertype ] [ -role_one role_one ] \
    [ -role_two role_two ] [ -table_name table_name ] \
    [ -create_table_p create_table_p ] rel_type pretty_name \
    pretty_plural object_type_one min_n_rels_one max_n_rels_one \
    object_type_two min_n_rels_two max_n_rels_two [ composable_p ]

Creates a new relationship type named rel_type

Switches:
-supertype
(defaults to "relationship") (optional)
-role_one
(optional)
-role_two
(optional)
-table_name
(optional)
-create_table_p
(defaults to "t") (optional)
Parameters:
rel_type
pretty_name
pretty_plural
object_type_one
min_n_rels_one
max_n_rels_one
object_type_two
min_n_rels_two
max_n_rels_two
composable_p (defaults to "t")
Author:
Michael Bryzek <mbryzek@arsdigita.com>
Created:
12/30/2000

Partial Call Graph (max 5 caller/called nodes):
%3 email_image::create_type_folder_rel email_image::create_type_folder_rel (public) rel_types::new rel_types::new email_image::create_type_folder_rel->rel_types::new install::xml::action::relation-type install::xml::action::relation-type (public) install::xml::action::relation-type->rel_types::new packages/acs-subsite/www/admin/rel-types/new-2.tcl packages/acs-subsite/ www/admin/rel-types/new-2.tcl packages/acs-subsite/www/admin/rel-types/new-2.tcl->rel_types::new db_0or1row db_0or1row (public) rel_types::new->db_0or1row db_exec_plsql db_exec_plsql (public) rel_types::new->db_exec_plsql lang::message::register lang::message::register (public) rel_types::new->lang::message::register package_recreate_hierarchy package_recreate_hierarchy (public) rel_types::new->package_recreate_hierarchy plsql_utility::generate_constraint_name plsql_utility::generate_constraint_name (public) rel_types::new->plsql_utility::generate_constraint_name

Testcases:
No testcase defined.

rel_types::remove_permissible (public)

 rel_types::remove_permissible group_type rel_type

Add a permissible relationship for a given group type

Parameters:
group_type
rel_type

Partial Call Graph (max 5 caller/called nodes):
%3 db_dml db_dml (public) rel_types::remove_permissible rel_types::remove_permissible rel_types::remove_permissible->db_dml

Testcases:
No testcase defined.
[ hide source ] | [ make this the default ]

Content File Source

ad_library {

    Procs about relationships

    @author mbryzek@arsdigita.com
    @creation-date Tue Dec 12 15:40:39 2000
    @cvs-id $Id: rel-types-procs.tcl,v 1.19.2.1 2019/04/18 09:12:32 gustafn Exp $
}

ad_page_contract_filter rel_type_dynamic_p {name value} {
    Checks whether the value (assumed to be a string referring to a
                              relationship type) is a dynamic object type.

    @author Michael Bryzek (mbryzek@arsdigita.com)
    @creation-date 12/30/2000
} {
    if {[db_string rel_type_dynamic_p {
                select case when exists (select 1
                                   from acs_object_types t
                                  where t.dynamic_p = 't'
                                    and t.object_type = :value)
                    then 1 else 0 end
          from dual
    }]} {
        return 1
    }
    ad_complain "Specific rel type either does not exist or is not dynamic and thus cannot be modified"
    return 0
}

namespace eval rel_types {

    d_proc -public additional_rel_types_p {
        {-group_id "" }
        {-group_type "" }
    } {
        Returns 1 if there is a relationship type not being used by
        the specified group_id or group_type. Useful for deciding when
        to offer the user a link to create or add a new permissible
        relationship type

        @author Michael Bryzek (mbryzek@arsdigita.com)
        @creation-date 12/2000
    } {
        if {$group_id ne ""} {
            return [additional_rel_types_group_p $group_id]
        } elseif {$group_type ne ""} {
            return [additional_rel_types_group_type_p $group_type]
        } else {
            error "rel_types::rel_types_p error: One of group_id or group_type must be specified"
        }
    }

    d_proc -private additional_rel_types_group_p {
        group_id
    } {
        returns 1 if there is a rel type that is not defined as a
        segment for this group

        @author Michael Bryzek (mbryzek@arsdigita.com)
        @creation-date 12/30/2000
    } {
        return [db_string group_rel_type_exists {}]
    }

    d_proc -private additional_rel_types_group_type_p {
        group_type
    } {
        returns 1 if there is a rel type that is not defined as
        allowable for the specified group_type.

        @author Michael Bryzek (mbryzek@arsdigita.com)
        @creation-date 12/30/2000
    } {
        return [db_string group_rel_type_exists {}]
    }

    d_proc -public new {
        {-supertype "relationship" }
        {-role_one "" }
        {-role_two "" }
        {-table_name ""}
        {-create_table_p "t"}
        rel_type
        pretty_name
        pretty_plural
        object_type_one
        min_n_rels_one
        max_n_rels_one
        object_type_two
        min_n_rels_two
        max_n_rels_two
        {composable_p "t"}
    } {
        Creates a new relationship type named rel_type

        @author Michael Bryzek (mbryzek@arsdigita.com)
        @creation-date 12/30/2000
    } {

        # use 29 chars to leave 1 character in the name for later dynamic
        # views

        set rel_type [plsql_utility::generate_oracle_name \
                          -max_length 29 $rel_type]
        if {[plsql_utility::object_type_exists_p $rel_type]} {
            error "Specified relationship type, $rel_type, already exists (or another object of the same type exists)\n"
        }

        if {![db_0or1row parent_rel_type {
            select table_name as references_table,
            id_column as references_column
            from acs_object_types
            where object_type=:supertype}]} {
            error "The specified supertype \"$supertype\" does not exist"
        }

        # use 29 chars to leave 1 character in the name for later dynamic
        # views

        if {$table_name eq ""} {
            set table_name [plsql_utility::generate_oracle_name \
                                -max_length 29 "${rel_type}_ext"]
        }
        set package_name $rel_type

        # We use rel_id for the primary key... since this is a relationship

        set pk_constraint_name [plsql_utility::generate_constraint_name $table_name rel_id "pk"]
        set fk_constraint_name [plsql_utility::generate_constraint_name $table_name rel_id "fk"]

        set plsql [list]

        # Create the actual acs object type

        lappend plsql_drop [list db_exec_plsql drop_type {}]
        lappend plsql [list db_exec_plsql create_type {}]

        # Mark the type as dynamic

        lappend plsql [list db_dml update_type FOO]

        # Force internationalization of Roles

        # Internationalising of Attributes. This is done by storing the
        # attribute with its acs-lang key

        set message_key "rel_type_${rel_type}"

        # Register the language keys

        lang::message::register en_US acs-translations $message_key $pretty_name
        lang::message::register en_US acs-translations "${message_key}_plural" $pretty_plural

        # Replace the pretty_name and pretty_plural with the message key, so
        # it is inserted correctly in the database

        set pretty_name "#acs-translations.${message_key}#"
        set pretty_plural "#acs-translations.${message_key}_plural#"

        foreach cmd $plsql {
            {*}$cmd
        }

        # The following create table statement commits the transaction. If it
        # fails, we roll back what we've done.

        if {$create_table_p == "t"} {
            if {[catch {db_exec_plsql create_table [subst {
                create table $table_name (
                     rel_id integer
                            constraint $fk_constraint_name
                            references $references_table ($references_column) on delete cascade
                            constraint $pk_constraint_name primary key
                   )}]} errmsg]} {

                # Roll back our work so far

                for {set i [expr {[llength $plsql_drop] - 1}]} {$i >= 0} {incr i -1} {
                    set drop_cmd [lindex $plsql_drop $i]
                    if {[catch $dropcmd err_msg_2]} {
                        append errmsg "\nAdditional error while trying to roll back: $err_msg_2"
                        return -code error $errmsg
                    }
                }
                return -code error $errmsg
            }
        }

        # Finally, create the PL/SQL package.

        package_recreate_hierarchy $rel_type

        return $rel_type
    }

    d_proc -public add_permissible {
        group_type
        rel_type
    } {
        Add a permissible relationship for a given group type
    } {
        if {[catch {
            set group_rel_type_id [db_nextval acs_object_id_seq]
            db_dml insert_rel_type {}
        } errmsg]} {
        }
    }

    d_proc -public remove_permissible {
        group_type
        rel_type
    } {
        Add a permissible relationship for a given group type
    } {
        if {[catch {
            db_dml delete_rel_type {}
        } errmsg]} {
        }
    }

    d_proc -public create_role {
        {-pretty_name:required}
        {-pretty_plural:required}
        {-role}
    } {

        Create a new Relationship Role

        @author Malte Sussdorff (sussdorff@sussdorff.de)
        @creation-date 2005-06-04

        @param pretty_name

        @param pretty_plural

        @param role

        @return 1 if successful
    } {
        if {![info exists role] || $role eq ""} {
            set role [util_text_to_url \
                          -text $pretty_name \
                          -replacement "_" \
                          -existing_urls [db_list get_roles {}]]
        }

        set return_code 1

        db_transaction {

            # Force internationalization of Roles

            # Internationalising of Attributes. This is done by storing the
            # attribute with its acs-lang key

            set message_key "role_${role}"

            # Register the language keys

            lang::message::register en_US acs-translations $message_key $pretty_name
            lang::message::register en_US acs-translations "${message_key}_plural" $pretty_plural

            # Replace the pretty_name and pretty_plural with the message key, so
            # it is inserted correctly in the database

            set pretty_name "#acs-translations.${message_key}#"
            set pretty_plural "#acs-translations.${message_key}_plural#"
            db_exec_plsql create_role {}
        } on_error {
            set return_code 0
        }
        return $return_code
    }


    d_proc -public delete_role {
        {-role}
    } {

        Drop a Relationship Role.

        @author Nick Carroll (nick.c@rroll.net)
        @creation-date 2005-11-18

        @param role The role to delete.

        @return Returns 1 if successful, otherwise 0.
    } {
        set return_code 1

        db_transaction {
            # Create the message key (refer to rel_types::create_role).
            # Required to unregister translations.
            set message_key "role_${role}"

            # Unegister the language keys
            lang::message::unregister acs-translations $message_key
            lang::message::unregister acs-translations "${message_key}_plural"

            db_exec_plsql drop_role {}
        } on_error {
            set return_code 0
        }
        return $return_code
    }
}

# Local variables:
#    mode: tcl
#    tcl-indent-level: 4
#    indent-tabs-mode: nil
# End: