Index: openacs-4/packages/forums/forums.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/forums.info,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/forums.info 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/forums.info 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -6,82 +6,35 @@ Forums f f + + + OpenACS + Online discussion forums. + 2006-06-28 + OpenACS + This online discussion board software is the successor of the original bboard package. The biggest improvement is a scalable datamodel. Forums supports threaded and flat view, moderation, a stand alone search function as well as integration with the OpenACS search package and integration with the notifications package for email alerts. It also supports reply via email. + 0 - - - oracle - postgresql - - Ben Adida - - + + - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + + + + + + + Index: openacs-4/packages/forums/sql/oracle/forums-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -14,7 +14,6 @@ @ forums-forums-package-create.sql -- The messages -@ tree-create.sql @ forums-messages-create.sql @ forums-messages-package-create.sql Index: openacs-4/packages/forums/sql/oracle/forums-forums-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-forums-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-forums-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-forums-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -12,79 +12,86 @@ -- privileges declare begin - -- moderate and post are new privileges - -- the rest are obvious inheritance - -- forum creation on a package allows a user to create forums - -- forum creation on a forum allows a user to create new threads - acs_privilege.create_privilege('forum_create',null,null); - acs_privilege.create_privilege('forum_write',null,null); - acs_privilege.create_privilege('forum_delete',null,null); - acs_privilege.create_privilege('forum_read',null,null); - acs_privilege.create_privilege('forum_post',null,null); - acs_privilege.create_privilege('forum_moderate',null,null); + -- moderate and post are new privileges + -- the rest are obvious inheritance + -- forum creation on a package allows a user to create forums + -- forum creation on a forum allows a user to create new threads + acs_privilege.create_privilege('forum_create',null,null); + acs_privilege.create_privilege('forum_write',null,null); + acs_privilege.create_privilege('forum_delete',null,null); + acs_privilege.create_privilege('forum_read',null,null); + acs_privilege.create_privilege('forum_post',null,null); + acs_privilege.create_privilege('forum_moderate',null,null); - -- add children - acs_privilege.add_child('create','forum_create'); - acs_privilege.add_child('write','forum_write'); - acs_privilege.add_child('delete','forum_delete'); - acs_privilege.add_child('admin','forum_moderate'); - acs_privilege.add_child('forum_moderate','forum_read'); - acs_privilege.add_child('forum_moderate','forum_post'); - acs_privilege.add_child('forum_write','forum_read'); - acs_privilege.add_child('forum_write','forum_post'); + -- add children + acs_privilege.add_child('create','forum_create'); + acs_privilege.add_child('write','forum_write'); + acs_privilege.add_child('delete','forum_delete'); + acs_privilege.add_child('admin','forum_moderate'); + acs_privilege.add_child('forum_moderate','forum_read'); + acs_privilege.add_child('forum_moderate','forum_post'); + acs_privilege.add_child('forum_write','forum_read'); + acs_privilege.add_child('forum_write','forum_post'); - -- the last one that will cause all the updates - acs_privilege.add_child('read','forum_read'); + -- the last one that will cause all the updates + acs_privilege.add_child('read','forum_read'); end; / show errors - --- --- The Data Model --- - create table forums_forums ( - forum_id integer not null - constraint forums_forum_id_fk - references acs_objects(object_id) - constraint forums_forum_id_pk - primary key, - name varchar(200) constraint forum_name_nn not null, - charter varchar(2000), - presentation_type varchar(100) - constraint forum_type_nn not null - constraint forum_type_ch - check (presentation_type in ('flat','threaded')), - posting_policy varchar(100) - constraint forum_policy_nn not null - constraint forum_policy_ch - check (posting_policy in ('open','moderated','closed')), - max_child_sortkey raw(100), - enabled_p char(1) default 't' not null - constraint forum_enabled_p_ch check - (enabled_p in ('t','f')), - package_id integer constraint forum_package_id_nn not null + forum_id integer + constraint forums_forum_id_fk + references acs_objects (object_id) + constraint forums_forums_pk + primary key, + name varchar(200) + constraint forums_name_nn + not null, + charter varchar(2000), + presentation_type varchar(100) + constraint forums_presentation_type_nn + not null + constraint forums_presentation_type_ck + check (presentation_type in ('flat','threaded')), + posting_policy varchar(100) + constraint forums_posting_policy_nn + not null + constraint forums_posting_policy_ck + check (posting_policy in ('open','moderated','closed')), + max_child_sortkey raw(100), + enabled_p char(1) + default 't' + constraint forums_enabled_p_nn + not null + constraint forums_enabled_p_ck + check (enabled_p in ('t','f')), + package_id integer + constraint forums_package_id_nn + not null, + thread_count integer default 0, + approved_thread_count integer default 0, + last_post date ); create view forums_forums_enabled -as select * from forums_forums where enabled_p='t'; +as + select * + from forums_forums + where enabled_p = 't'; --- --- Object Type --- - declare begin - acs_object_type.create_type ( - supertype => 'acs_object', - object_type => 'forums_forum', - pretty_name => 'Forums Forum', - pretty_plural => 'Forums Forums', - table_name => 'forums_forums', - id_column => 'forum_id', - package_name => 'forums_forum' - ); + acs_object_type.create_type( + supertype => 'acs_object', + object_type => 'forums_forum', + pretty_name => 'Forums Forum', + pretty_plural => 'Forums Forums', + table_name => 'forums_forums', + id_column => 'forum_id', + package_name => 'forums_forum', + name_method => 'forums_forum.name' + ); end; / show errors Index: openacs-4/packages/forums/sql/oracle/forums-forums-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-forums-drop.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-forums-drop.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-forums-drop.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -12,6 +12,9 @@ -- privileges declare begin + + delete from acs_permissions where privilege in ('forum_moderate','forum_post','forum_read','forum_create','forum_write','forum_delete'); + -- remove children acs_privilege.remove_child('read','forum_read'); acs_privilege.remove_child('create','forum_create'); @@ -38,17 +41,31 @@ -- The Data Model -- +drop view forums_forums_enabled; + drop table forums_forums; -- -- Object Type -- declare + v_object_id integer; begin - acs_object_type.drop_type ( - object_type => 'forums_forum' - ); + + select MAX(object_id) into v_object_id from acs_objects where object_type='forums_forum'; + While (v_object_id > 0) loop + delete from ncanotes where object_id=v_object_id; + acs_object.del( + v_object_id -- object_id + ); + select MAX(object_id) into v_object_id from acs_objects where object_type='forums_forum'; + End loop; + + acs_object_type.drop_type ( + object_type => 'forums_forum' + ); + end; / show errors Index: openacs-4/packages/forums/sql/oracle/forums-forums-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-forums-package-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-forums-package-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-forums-package-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -13,85 +13,93 @@ create or replace package forums_forum as - function new ( - forum_id in forums_forums.forum_id%TYPE default null, - object_type in acs_objects.object_type%TYPE default 'forums_forum', - name in forums_forums.name%TYPE, - charter in forums_forums.charter%TYPE default null, - presentation_type in forums_forums.presentation_type%TYPE, - posting_policy in forums_forums.posting_policy%TYPE, - package_id in forums_forums.package_id%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE default null - ) return forums_forums.forum_id%TYPE; - - function name ( - forum_id in forums_forums.forum_id%TYPE - ) return varchar; - procedure delete ( - forum_id in forums_forums.forum_id%TYPE - ); + function new ( + forum_id in forums_forums.forum_id%TYPE default null, + object_type in acs_objects.object_type%TYPE default 'forums_forum', + name in forums_forums.name%TYPE, + charter in forums_forums.charter%TYPE default null, + presentation_type in forums_forums.presentation_type%TYPE, + posting_policy in forums_forums.posting_policy%TYPE, + package_id in forums_forums.package_id%TYPE, + creation_date in acs_objects.creation_date%TYPE default sysdate, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + context_id in acs_objects.context_id%TYPE default null + ) return forums_forums.forum_id%TYPE; + + function name ( + forum_id in forums_forums.forum_id%TYPE + ) return varchar; + + procedure del ( + forum_id in forums_forums.forum_id%TYPE + ); + end forums_forum; / show errors - create or replace package body forums_forum as - function new ( - forum_id in forums_forums.forum_id%TYPE default null, - object_type in acs_objects.object_type%TYPE default 'forums_forum', - name in forums_forums.name%TYPE, - charter in forums_forums.charter%TYPE default null, - presentation_type in forums_forums.presentation_type%TYPE, - posting_policy in forums_forums.posting_policy%TYPE, - package_id in forums_forums.package_id%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE default null - ) return forums_forums.forum_id%TYPE - is - v_forum_id forums_forums.forum_id%TYPE; - begin - v_forum_id := acs_object.new ( - object_id => forum_id, - object_type => object_type, - creation_date => creation_date, - creation_user => creation_user, - creation_ip => creation_ip, - context_id => nvl(context_id, package_id) - ); - - insert into forums_forums - (forum_id, name, charter, presentation_type, posting_policy, package_id) values - (v_forum_id, name, charter, presentation_type, posting_policy, package_id); - return v_forum_id; - end new; + function new ( + forum_id in forums_forums.forum_id%TYPE default null, + object_type in acs_objects.object_type%TYPE default 'forums_forum', + name in forums_forums.name%TYPE, + charter in forums_forums.charter%TYPE default null, + presentation_type in forums_forums.presentation_type%TYPE, + posting_policy in forums_forums.posting_policy%TYPE, + package_id in forums_forums.package_id%TYPE, + creation_date in acs_objects.creation_date%TYPE default sysdate, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + context_id in acs_objects.context_id%TYPE default null + ) return forums_forums.forum_id%TYPE + is + v_forum_id forums_forums.forum_id%TYPE; + begin + v_forum_id := acs_object.new( + object_id => forum_id, + object_type => object_type, + creation_date => creation_date, + creation_user => creation_user, + creation_ip => creation_ip, + context_id => nvl(context_id, package_id), + package_id => forums_forum.new.package_id, + title => name + ); + + insert into forums_forums + (forum_id, name, charter, presentation_type, posting_policy, package_id) + values + (v_forum_id, name, charter, presentation_type, posting_policy, package_id); - function name ( - forum_id in forums_forums.forum_id%TYPE - ) return varchar - is - v_name forums_forums.name%TYPE; - begin - select name into v_name from forums_forums where forum_id= name.forum_id; + return v_forum_id; + end new; - return v_name; - end name; - - procedure delete ( - forum_id in forums_forums.forum_id%TYPE - ) - is - begin - acs_object.delete(forum_id); - end delete; + function name ( + forum_id in forums_forums.forum_id%TYPE + ) return varchar + is + v_name forums_forums.name%TYPE; + begin + select name + into v_name + from forums_forums + where forum_id = name.forum_id; + return v_name; + end name; + + procedure del ( + forum_id in forums_forums.forum_id%TYPE + ) + is + begin + acs_object.del(forum_id); + end del; + end forums_forum; / show errors Index: openacs-4/packages/forums/sql/oracle/forums-messages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-messages-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-messages-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-messages-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -1,4 +1,3 @@ - -- -- The Forums Package -- @@ -9,74 +8,88 @@ -- lifted from Gilbert. Thanks Orchard Labs! -- --- privileges --- NO PRIVILEGES FOR MESSAGES --- we don't individually permission messages - --- --- The Data Model --- - create table forums_messages ( - message_id integer not null - constraint forums_message_id_fk - references acs_objects(object_id) - constraint forums_message_id_pk - primary key, - forum_id integer - constraint forums_mess_forum_id_fk - references forums_forums(forum_id), - subject varchar(200), - content clob, - -- html_p only applies to the body. The subject is plaintext. - html_p char(1) default 'f' - constraint forums_mess_html_p_ch - check (html_p in ('t','f')) - constraint forums_mess_html_p_nn not null, - user_id integer - constraint forums_mess_user_id_fk - references users(user_id) - constraint forums_mess_user_id_nn - not null, - posting_date date - constraint forum_mess_post_date_nn not null, - state varchar(100) - constraint forum_mess_state_ch check (state in ('pending','approved','rejected')), - -- Hierarchy of messages - parent_id integer - constraint forum_mess_parent_id_fk - references forums_messages(message_id), - open_p char(1) default 't' not null - constraint forum_mess_open_p_ch check (open_p in ('t','f')), - tree_sortkey raw(240), - max_child_sortkey raw(100), - constraint forums_mess_sk_forum_un - unique (tree_sortkey,forum_id) + message_id integer + constraint forums_message_id_fk + references acs_objects (object_id) + constraint forums_messages_pk + primary key, + forum_id integer + constraint forums_mess_forum_id_fk + references forums_forums (forum_id), + subject varchar(200), + content clob, + user_id integer + constraint forums_mess_user_id_fk + references users(user_id) + constraint forums_mess_user_id_nn + not null, + posting_date date + default sysdate + constraint forum_mess_post_date_nn + not null, + state varchar(100) + constraint forum_mess_state_ck + check (state in ('pending','approved','rejected')), + format varchar2(30) + default 'text/plain', + -- Hierarchy of messages + parent_id integer + constraint forum_mess_parent_id_fk + references forums_messages (message_id), + open_p char(1) + default 't' + constraint forum_mess_open_p_nn + not null + constraint forum_mess_open_p_ck + check (open_p in ('t','f')), + tree_sortkey raw(240), + max_child_sortkey raw(100), + last_child_post date, + reply_count integer default 0 + constraint forums_mess_reply_count_ck + check (reply_count >= 0), + approved_reply_count integer default 0 + constraint forums_mess_app_rep_count_ck + check (approved_reply_count >= 0), + last_poster integer + constraint forums_mess_last_poster_fk + references users(user_id), + constraint forums_mess_sk_forum_un + unique (tree_sortkey, forum_id) ); --- views +-- We do a some big queries on forum_id (thread count on index.tcl) so create a second index +-- ordered so it's useful for them +create unique index forums_mess_forum_sk_un on forums_messages(forum_id, tree_sortkey); +-- Need these for RI checks +create index forums_messages_user_id_idx on forums_messages(user_id); +create index forums_messages_parent_id_idx on forums_messages(parent_id); +create index forum_messages_date_idx on forums_messages (forum_id, posting_date) compress 1; + create view forums_messages_approved as -select * from forums_messages where state='approved'; + select * + from forums_messages + where state = 'approved'; create view forums_messages_pending as -select * from forums_messages where state='pending'; + select * + from forums_messages + where state = 'pending'; --- --- Object Type --- - declare begin - acs_object_type.create_type ( - supertype => 'acs_object', - object_type => 'forums_message', - pretty_name => 'Forums Message', - pretty_plural => 'Forums Messages', - table_name => 'forums_messages', - id_column => 'message_id', - package_name => 'forums_message' - ); + acs_object_type.create_type ( + supertype => 'acs_object', + object_type => 'forums_message', + pretty_name => 'Forums Message', + pretty_plural => 'Forums Messages', + table_name => 'forums_messages', + id_column => 'message_id', + package_name => 'forums_message', + name_method => 'forums_message.name' + ); end; / show errors Index: openacs-4/packages/forums/sql/oracle/forums-messages-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-messages-drop.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-messages-drop.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-messages-drop.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -31,3 +31,6 @@ end; / show errors + +drop view forums_messages_pending; +drop view forums_messages_approved; \ No newline at end of file Index: openacs-4/packages/forums/sql/oracle/forums-messages-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-messages-package-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-messages-package-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-messages-package-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -13,195 +13,359 @@ create or replace package forums_message as - function new ( - message_id in forums_messages.message_id%TYPE default null, - object_type in acs_objects.object_type%TYPE default 'forums_message', - forum_id in forums_messages.forum_id%TYPE, - subject in forums_messages.subject%TYPE, - content in varchar, - html_p in forums_messages.html_p%TYPE default 'f', - user_id in forums_messages.user_id%TYPE, - posting_date in forums_messages.posting_date%TYPE default sysdate, - state in forums_messages.state%TYPE default null, - parent_id in forums_messages.parent_id%TYPE default null, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE default null - ) return forums_messages.message_id%TYPE; - function root_message_id ( - message_id in forums_messages.message_id%TYPE - ) return forums_messages.message_id%TYPE; + function new ( + message_id in forums_messages.message_id%TYPE default null, + object_type in acs_objects.object_type%TYPE default 'forums_message', + forum_id in forums_messages.forum_id%TYPE, + subject in forums_messages.subject%TYPE, + content in varchar, + format in forums_messages.format%TYPE default 'text/plain', + user_id in forums_messages.user_id%TYPE, + posting_date in forums_messages.posting_date%TYPE default sysdate, + state in forums_messages.state%TYPE default null, + parent_id in forums_messages.parent_id%TYPE default null, + creation_date in acs_objects.creation_date%TYPE default sysdate, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + context_id in acs_objects.context_id%TYPE default null + ) return forums_messages.message_id%TYPE; - procedure thread_open ( - message_id in forums_messages.message_id%TYPE - ); + function root_message_id ( + message_id in forums_messages.message_id%TYPE + ) return forums_messages.message_id%TYPE; - procedure thread_close ( - message_id in forums_messages.message_id%TYPE - ); - - procedure delete ( - message_id in forums_messages.message_id%TYPE - ); + procedure thread_open ( + message_id in forums_messages.message_id%TYPE + ); - procedure delete_thread ( - message_id in forums_messages.message_id%TYPE - ); + procedure thread_close ( + message_id in forums_messages.message_id%TYPE + ); + + procedure del ( + message_id in forums_messages.message_id%TYPE + ); + + procedure delete_thread ( + message_id in forums_messages.message_id%TYPE + ); + + procedure set_state( + message_id in forums_messages.message_id%TYPE, + state in forums_messages.state%TYPE + ); + + function name ( + message_id in forums_messages.message_id%TYPE + ) return varchar; + end forums_message; / show errors - - create or replace package body forums_message as - function new ( - message_id in forums_messages.message_id%TYPE default null, - object_type in acs_objects.object_type%TYPE default 'forums_message', - forum_id in forums_messages.forum_id%TYPE, - subject in forums_messages.subject%TYPE, - content in varchar, - html_p in forums_messages.html_p%TYPE default 'f', - user_id in forums_messages.user_id%TYPE, - posting_date in forums_messages.posting_date%TYPE default sysdate, - state in forums_messages.state%TYPE default null, - parent_id in forums_messages.parent_id%TYPE default null, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE default null - ) return forums_messages.message_id%TYPE - is - v_message_id acs_objects.object_id%TYPE; - v_forum_policy forums_forums.posting_policy%TYPE; - v_state forums_messages.state%TYPE; - begin - v_message_id := acs_object.new ( - object_id => message_id, - object_type => object_type, - creation_date => creation_date, - creation_user => creation_user, - creation_ip => creation_ip, - context_id => nvl(context_id,forum_id) - ); - - IF state is NULL - then - select posting_policy into v_forum_policy from forums_forums - where forum_id= new.forum_id; - - if v_forum_policy = 'moderated' - then v_state := 'pending'; - else v_state := 'approved'; - end if; - else - v_state := state; - end if; - insert into forums_messages - (message_id, forum_id, subject, content, html_p, user_id, posting_date, parent_id, state) - values - (v_message_id, forum_id, subject, content, html_p, user_id, posting_date, parent_id, v_state); + function new ( + message_id in forums_messages.message_id%TYPE default null, + object_type in acs_objects.object_type%TYPE default 'forums_message', + forum_id in forums_messages.forum_id%TYPE, + subject in forums_messages.subject%TYPE, + content in varchar, + format in forums_messages.format%TYPE default 'text/plain', + user_id in forums_messages.user_id%TYPE, + posting_date in forums_messages.posting_date%TYPE default sysdate, + state in forums_messages.state%TYPE default null, + parent_id in forums_messages.parent_id%TYPE default null, + creation_date in acs_objects.creation_date%TYPE default sysdate, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + context_id in acs_objects.context_id%TYPE default null + ) return forums_messages.message_id%TYPE + is + v_message_id acs_objects.object_id%TYPE; + v_package_id acs_objects.package_id%TYPE; + v_sortkey forums_messages.tree_sortkey%TYPE; + v_forum_policy forums_forums.posting_policy%TYPE; + v_state forums_messages.state%TYPE; + begin + select package_id into v_package_id from forums_forums where forum_id = new.forum_id; - return v_message_id; - end new; + v_message_id := acs_object.new( + object_id => message_id, + object_type => object_type, + creation_date => creation_date, + creation_user => creation_user, + creation_ip => creation_ip, + context_id => nvl(context_id, forum_id), + title => subject, + package_id => v_package_id + ); + + if state is null + then + select posting_policy + into v_forum_policy + from forums_forums + where forum_id= new.forum_id; + + if v_forum_policy = 'moderated' then + v_state := 'pending'; + else + v_state := 'approved'; + end if; + else + v_state := state; + end if; + + insert into forums_messages + (message_id, forum_id, subject, content, format, user_id, posting_date, last_child_post, parent_id, state, last_poster) + values + (v_message_id, forum_id, subject, content, format, user_id, posting_date, posting_date, parent_id, v_state, user_id); + + select tree_sortkey into v_sortkey + from forums_messages + where message_id = v_message_id; + + update forums_forums + set last_post = forums_message.new.posting_date + where forum_id = forums_message.new.forum_id; + + -- DRB: Can't use root_message_id() here because it triggers a "mutating table" error + + if parent_id is null then + if v_state = 'approved' then + update forums_forums + set thread_count = thread_count + 1, + approved_thread_count = approved_thread_count + 1 + where forum_id = forums_message.new.forum_id; + else + update forums_forums + set thread_count = thread_count + 1 + where forum_id=forums_message.new.forum_id; + end if; + else + if v_state = 'approved' then + update forums_messages + set approved_reply_count = approved_reply_count + 1, + reply_count = reply_count + 1, + last_poster = user_id, + last_child_post = sysdate + where forum_id = forums_message.new.forum_id + and tree_sortkey = tree.ancestor_key(v_sortkey, 1); + else + update forums_messages + set reply_count = reply_count + 1 + where forum_id = forums_message.new.forum_id + and tree_sortkey = tree.ancestor_key(v_sortkey, 1); + end if; + end if; - function root_message_id ( - message_id in forums_messages.message_id%TYPE - ) return forums_messages.message_id%TYPE - is - v_message_id forums_messages.message_id%TYPE; - v_forum_id forums_messages.forum_id%TYPE; - v_sortkey forums_messages.tree_sortkey%TYPE; - begin - select forum_id, tree_sortkey into v_forum_id, v_sortkey - from forums_messages where message_id= root_message_id.message_id; + return v_message_id; - select message_id into v_message_id from forums_messages where forum_id= v_forum_id - and tree_sortkey= tree.ancestor_key(v_sortkey, 1); + end new; - return v_message_id; - end root_message_id; + function root_message_id ( + message_id in forums_messages.message_id%TYPE + ) return forums_messages.message_id%TYPE + is + v_message_id forums_messages.message_id%TYPE; + v_forum_id forums_messages.forum_id%TYPE; + v_sortkey forums_messages.tree_sortkey%TYPE; + begin + select forum_id, tree_sortkey + into v_forum_id, v_sortkey + from forums_messages + where message_id = root_message_id.message_id; - procedure thread_open ( - message_id in forums_messages.message_id%TYPE - ) - is - v_forum_id forums_messages.forum_id%TYPE; - v_sortkey forums_messages.tree_sortkey%TYPE; - begin - select forum_id, tree_sortkey into v_forum_id, v_sortkey - from forums_messages where message_id= thread_open.message_id; + select message_id + into v_message_id + from forums_messages + where forum_id = v_forum_id + and tree_sortkey = tree.ancestor_key(v_sortkey, 1); - update forums_messages set open_p='t' - where tree_sortkey between tree.left(v_sortkey) and tree.right(v_sortkey) - and forum_id = v_forum_id; + return v_message_id; + end root_message_id; - update forums_messages set open_p='t' - where message_id= thread_open.message_id; - end thread_open; + procedure thread_open ( + message_id in forums_messages.message_id%TYPE + ) + is + v_forum_id forums_messages.forum_id%TYPE; + v_sortkey forums_messages.tree_sortkey%TYPE; + begin + select forum_id, tree_sortkey + into v_forum_id, v_sortkey + from forums_messages + where message_id = thread_open.message_id; - procedure thread_close ( - message_id in forums_messages.message_id%TYPE - ) - is - v_forum_id forums_messages.forum_id%TYPE; - v_sortkey forums_messages.tree_sortkey%TYPE; - begin - select forum_id, tree_sortkey into v_forum_id, v_sortkey - from forums_messages where message_id= thread_close.message_id; + update forums_messages + set open_p = 't' + where tree_sortkey between tree.left(v_sortkey) and tree.right(v_sortkey) + and forum_id = v_forum_id; - update forums_messages set open_p='f' - where tree_sortkey between tree.left(v_sortkey) and tree.right(v_sortkey) - and forum_id = v_forum_id; + update forums_messages + set open_p = 't' + where message_id = thread_open.message_id; + end thread_open; - update forums_messages set open_p='f' - where message_id= thread_close.message_id; - end thread_close; - - procedure delete ( - message_id in forums_messages.message_id%TYPE - ) - is - begin - acs_object.delete(message_id); - end delete; + procedure thread_close ( + message_id in forums_messages.message_id%TYPE + ) + is + v_forum_id forums_messages.forum_id%TYPE; + v_sortkey forums_messages.tree_sortkey%TYPE; + begin + select forum_id, tree_sortkey + into v_forum_id, v_sortkey + from forums_messages + where message_id = thread_close.message_id; - procedure delete_thread ( - message_id in forums_messages.message_id%TYPE - ) - is - v_forum_id forums_messages.forum_id%TYPE; - v_sortkey forums_messages.tree_sortkey%TYPE; - v_message forums_messages%ROWTYPE; - begin - select forum_id, tree_sortkey into v_forum_id, v_sortkey - from forums_messages where message_id= delete_thread.message_id; - - -- if it's already deleted - if SQL%NOTFOUND - then return; - end if; + update forums_messages + set open_p = 'f' + where tree_sortkey between tree.left(v_sortkey) and tree.right(v_sortkey) + and forum_id = v_forum_id; - -- delete all children - -- order by tree_sortkey desc to guarantee - -- that we never delete a parent before its child - -- sortkeys are beautiful - FOR v_message in - (select * from forums_messages - where forum_id = v_forum_id and - tree_sortkey between tree.left(v_sortkey) - and tree.right(v_sortkey) order by tree_sortkey desc) - LOOP - forums_message.delete(v_message.message_id); - END LOOP; + update forums_messages + set open_p = 'f' + where message_id = thread_close.message_id; + end thread_close; - -- delete the message itself - forums_message.delete(delete_thread.message_id); - end delete_thread; + procedure del ( + message_id in forums_messages.message_id%TYPE + ) + is + v_cur forums_messages%ROWTYPE; + begin + -- Maintain the forum thread counts + + select * into v_cur + from forums_messages + where message_id = forums_message.del.message_id; + + if v_cur.parent_id is null then + if v_cur.state = 'approved' then + update forums_forums + set thread_count = thread_count - 1, + approved_thread_count = approved_thread_count - 1 + where forum_id=v_cur.forum_id; + else + update forums_forums + set thread_count = thread_count - 1 + where forum_id=v_cur.forum_id; + end if; + elsif v_cur.state = 'approved' then + update forums_messages + set approved_reply_count = approved_reply_count - 1, + reply_count = reply_count - 1 + where forum_id = v_cur.forum_id + and tree_sortkey = tree.ancestor_key(v_cur.tree_sortkey, 1); + else + update forums_messages + set reply_count = reply_count - 1 + where forum_id = v_cur.forum_id + and tree_sortkey = tree.ancestor_key(v_cur.tree_sortkey, 1); + end if; + + acs_object.del(message_id); + + end del; + + procedure delete_thread ( + message_id in forums_messages.message_id%TYPE + ) + is + v_forum_id forums_messages.forum_id%TYPE; + v_sortkey forums_messages.tree_sortkey%TYPE; + v_message forums_messages%ROWTYPE; + begin + select forum_id, tree_sortkey + into v_forum_id, v_sortkey + from forums_messages + where message_id = delete_thread.message_id; + + -- if it's already deleted + if SQL%NOTFOUND then + return; + end if; + + -- delete all children + -- order by tree_sortkey desc to guarantee + -- that we never delete a parent before its child + -- sortkeys are beautiful + for v_message in (select * + from forums_messages + where forum_id = v_forum_id + and tree_sortkey between tree.left(v_sortkey) and tree.right(v_sortkey) + order by tree_sortkey desc) + loop + forums_message.del(v_message.message_id); + end loop; + + -- delete the message itself + forums_message.del(delete_thread.message_id); + end delete_thread; + + function name ( + message_id in forums_messages.message_id%TYPE + ) return varchar + is + v_name forums_messages.subject%TYPE; + begin + select subject + into v_name + from forums_messages + where message_id = forums_message.name.message_id; + + return v_name; + end name; + + procedure set_state( + message_id in forums_messages.message_id%TYPE, + state in forums_messages.state%TYPE + ) + is + v_cur forums_messages%ROWTYPE; + begin + + select * into v_cur + from forums_messages + where message_id = forums_message.set_state.message_id; + + if v_cur.parent_id is null then + if state = 'approved' and v_cur.state <> 'approved' then + update forums_forums + set approved_thread_count = approved_thread_count + 1 + where forum_id=v_cur.forum_id; + elsif state <> 'approved' and v_cur.state = 'approved' then + update forums_forums + set approved_thread_count = approved_thread_count - 1 + where forum_id=v_cur.forum_id; + end if; + else + if state = 'approved' and v_cur.state <> 'approved' then + update forums_messages + set approved_reply_count = approved_reply_count + 1, + last_poster = (case when v_cur.posting_date > last_child_post then v_cur.user_id else last_poster end), + last_child_post = (case when v_cur.posting_date > last_child_post then v_cur.posting_date else last_child_post end) + where forum_id = v_cur.forum_id + and tree_sortkey = tree.ancestor_key(v_cur.tree_sortkey, 1); + elsif state <> 'approved' and v_cur.state = 'approved' then + update forums_messages + set approved_reply_count = approved_reply_count - 1 + where forum_id = v_cur.forum_id + and tree_sortkey = tree.ancestor_key(v_cur.tree_sortkey, 1); + end if; + end if; + + update forums_messages + set state = forums_message.set_state.state + where message_id = forums_message.set_state.message_id; + + end set_state; + end forums_message; / show errors Index: openacs-4/packages/forums/sql/oracle/forums-notifications-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-notifications-init.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-notifications-init.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-notifications-init.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -12,10 +12,41 @@ -- the integration with Notifications declare + impl_id integer; v_foo integer; begin + -- the notification type impl + impl_id := acs_sc_impl.new ( + impl_contract_name => 'NotificationType', + impl_name => 'forums_forum_notif_type', + impl_pretty_name => 'forums_forum_notif_type', + impl_owner_name => 'forums' + ); + + v_foo := acs_sc_impl.new_alias ( + 'NotificationType', + 'forums_forum_notif_type', + 'GetURL', + 'forum::notification::get_url', + 'TCL' + ); + + v_foo := acs_sc_impl.new_alias ( + 'NotificationType', + 'forums_forum_notif_type', + 'ProcessReply', + 'forum::notification::process_reply', + 'TCL' + ); + + acs_sc_binding.new ( + contract_name => 'NotificationType', + impl_name => 'forums_forum_notif_type' + ); + v_foo:= notification_type.new ( short_name => 'forums_forum_notif', + sc_impl_id => impl_id, pretty_name => 'Forum Notification', description => 'Notifications for Entire Forums', creation_user => NULL, @@ -33,8 +64,38 @@ select v_foo, delivery_method_id from notification_delivery_methods where short_name in ('email'); + -- the notification type impl + impl_id := acs_sc_impl.new ( + impl_contract_name => 'NotificationType', + impl_name => 'forums_message_notif_type', + impl_pretty_name => 'forums_message_notif_type', + impl_owner_name => 'forums' + ); + + v_foo := acs_sc_impl.new_alias ( + 'NotificationType', + 'forums_message_notif_type', + 'GetURL', + 'forum::notification::get_url', + 'TCL' + ); + + v_foo := acs_sc_impl.new_alias ( + 'NotificationType', + 'forums_message_notif_type', + 'ProcessReply', + 'forum::notification::process_reply', + 'TCL' + ); + + acs_sc_binding.new ( + contract_name => 'NotificationType', + impl_name => 'forums_message_notif_type' + ); + v_foo:= notification_type.new ( short_name => 'forums_message_notif', + sc_impl_id => impl_id, pretty_name => 'Message Notification', description => 'Notifications for Message Thread', creation_user => NULL, Index: openacs-4/packages/forums/sql/oracle/forums-tree-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-tree-create.sql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/sql/oracle/forums-tree-create.sql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/sql/oracle/forums-tree-create.sql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -13,48 +13,47 @@ -- This is the sortkey code -- - create or replace trigger forums_mess_insert_tr before insert on forums_messages for each row declare - v_max_child_sortkey forums_messages.max_child_sortkey%TYPE; - v_parent_sortkey forums_messages.tree_sortkey%TYPE; + v_max_child_sortkey forums_messages.max_child_sortkey%TYPE; + v_parent_sortkey forums_messages.tree_sortkey%TYPE; begin - if :new.parent_id is NULL - then - -- get the max from the forum - select max_child_sortkey into v_max_child_sortkey - from forums_forums where forum_id= :new.forum_id + + if :new.parent_id is null + then + + select '', max_child_sortkey + into v_parent_sortkey, v_max_child_sortkey + from forums_forums + where forum_id = :new.forum_id for update of max_child_sortkey; - v_parent_sortkey:= NULL; - else - -- get the max child sortkey from parent - -- grab the lock - select tree_sortkey, max_child_sortkey + v_max_child_sortkey := tree.increment_key(v_max_child_sortkey); + + update forums_forums + set max_child_sortkey = v_max_child_sortkey + where forum_id = :new.forum_id; + + else + + select nvl(tree_sortkey, ''), max_child_sortkey into v_parent_sortkey, v_max_child_sortkey from forums_messages - where message_id= :new.parent_id + where message_id = :new.parent_id for update of max_child_sortkey; - end if; - -- increment the sortkey - v_max_child_sortkey:= lpad(tree.increment_key(v_max_child_sortkey),6,'0'); + v_max_child_sortkey := tree.increment_key(v_max_child_sortkey); - if :new.parent_id is null - then - update forums_forums set max_child_sortkey= v_max_child_sortkey - where forum_id= :new.forum_id; - else - -- update the parent - update forums_messages set max_child_sortkey= v_max_child_sortkey - where message_id= :new.parent_id; - end if; + update forums_messages + set max_child_sortkey = v_max_child_sortkey + where message_id = :new.parent_id; - -- generate the current sortkey - :new.tree_sortkey:= v_parent_sortkey || v_max_child_sortkey; - + end if; + + :new.tree_sortkey := v_parent_sortkey || v_max_child_sortkey; + end forums_mess_insert_tr; / show errors Index: openacs-4/packages/forums/tcl/forums-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/forums-procs.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/forums-procs.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/forums-procs.tcl 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -8,88 +8,167 @@ } -namespace eval forum { +namespace eval forum {} - ad_proc -public new { - {-forum_id ""} - {-name:required} - {-charter ""} - {-presentation_type "flat"} - {-posting_policy "open"} - {-package_id:required} - } { - create a new forum - } { - # Prepare the variables for instantiation - set extra_vars [ns_set create] - oacs_util::vars_to_ns_set -ns_set $extra_vars -var_list {forum_id name charter presentation_type posting_policy package_id} +ad_proc -public forum::new { + {-forum_id ""} + {-name:required} + {-charter ""} + {-presentation_type flat} + {-posting_policy open} + {-package_id:required} + -no_callback:boolean +} { + create a new forum +} { + set var_list [list \ + [list forum_id $forum_id] \ + [list name $name] \ + [list charter $charter] \ + [list presentation_type $presentation_type] \ + [list posting_policy $posting_policy] \ + [list package_id $package_id]] - # Instantiate the forum - set forum_id [package_instantiate_object -extra_vars $extra_vars forums_forum] + set forum_id [package_instantiate_object -var_list $var_list forums_forum] - return $forum_id + if {!$no_callback_p} { + callback forum::forum_new -package_id $package_id -forum_id $forum_id } - ad_proc -public edit { - {-forum_id:required} - {-name:required} - {-charter ""} - {-presentation_type "flat"} - {-posting_policy "open"} - } { - edit a forum - } { - # This is a straight DB update - db_dml update_forum {} + return $forum_id +} + +ad_proc -public forum::edit { + {-forum_id:required} + {-name:required} + {-charter ""} + {-presentation_type flat} + {-posting_policy open} + -no_callback:boolean +} { + edit a forum +} { + # This is a straight DB update + db_dml update_forum {} + db_dml update_forum_object {} + + if {!$no_callback_p} { + callback forum::forum_edit -package_id [ad_conn package_id] -forum_id $forum_id } +} - ad_proc -public get { - {-forum_id:required} - {-array:required} - } { - get the fields for a forum - } { - # Select the info into the upvar'ed Tcl Array - upvar $array row - db_1row select_forum {} -column_array row +ad_proc -public forum::attachments_enabled_p {} { + if {[string eq forums [ad_conn package_key]]} { + set package_id [site_node_apm_integration::child_package_exists_p \ + -package_key attachments + ] + } else { + return 0 } +} - ad_proc -public new_questions_allow { - {-forum_id:required} - } { - # Give the public the right to ask new questions - permission::grant -object_id $forum_id \ - -party_id [acs_magic_object registered_users] \ - -privilege forum_create +ad_proc -public forum::list_forums { + {-package_id:required} +} { + List all forums in a package +} { + return [db_list_of_ns_sets select_forums {}] +} + +ad_proc -public forum::get { + {-forum_id:required} + {-array:required} +} { + get the fields for a forum + + @return +} { + # Select the info into the upvar'ed Tcl Array + upvar $array row + if {![db_0or1row select_forum {} -column_array row]} { + error "Forum $forum_id not found" {} NOT_FOUND } +} - ad_proc -public new_questions_deny { - {-forum_id:required} - } { - # Revoke the right from the public to ask new questions +ad_proc -public forum::posting_policy_set { + {-posting_policy:required} + {-forum_id:required} +} { + # JCD: this is potentially bad since we are + # just assuming registered_users is the + # right group to be granting forum_write to. + + if {![string equal closed $posting_policy]} { + permission::grant -object_id $forum_id \ + -party_id [acs_magic_object registered_users] \ + -privilege forum_write + } else { permission::revoke -object_id $forum_id \ - -party_id [acs_magic_object registered_users] \ - -privilege forum_create + -party_id [acs_magic_object registered_users] \ + -privilege forum_write } - ad_proc -public new_questions_allowed_p { - {-forum_id:required} - } { - permission::permission_p -object_id $forum_id \ - -party_id [acs_magic_object registered_users] \ - -privilege forum_create +} + +ad_proc -public forum::new_questions_allow { + {-forum_id:required} + {-party_id ""} +} { + if { [empty_string_p $party_id] } { + set party_id [acs_magic_object registered_users] } + # Give the public the right to ask new questions + permission::grant -object_id $forum_id \ + -party_id $party_id \ + -privilege forum_create + util_memoize_flush_regexp $forum_id +} - ad_proc -public enable { - {-forum_id:required} - } { - # Enable the forum, no big deal - db_dml update_forum_enabled_p {} +ad_proc -public forum::new_questions_deny { + {-forum_id:required} + {-party_id ""} +} { + if { [empty_string_p $party_id] } { + set party_id [acs_magic_object registered_users] } + # Revoke the right from the public to ask new questions + permission::revoke -object_id $forum_id \ + -party_id $party_id \ + -privilege forum_create + util_memoize_flush_regexp $forum_id +} - ad_proc -public disable { - {-forum_id:required} - } { - db_dml update_forum_disabled_p {} +ad_proc -public forum::new_questions_allowed_p { + {-forum_id:required} + {-party_id ""} +} { + if { [empty_string_p $party_id] } { + set party_id [acs_magic_object registered_users] } + permission::permission_p -object_id $forum_id \ + -party_id $party_id \ + -privilege forum_create } + +ad_proc -public forum::enable { + {-forum_id:required} +} { + # Enable the forum, no big deal + db_dml update_forum_enabled_p {} +} + +ad_proc -public forum::disable { + {-forum_id:required} +} { + db_dml update_forum_disabled_p {} +} + +ad_proc -public forum::is_direct_children { + {-parent_id:required} + {-message_id:required} + {-table_name:required} +} { + set direct_children_list [db_list get_direct_children {} ] + set is_direct_child [lsearch direct_children_list $message_id] + return $direct_child +} Index: openacs-4/packages/forums/tcl/forums-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/forums-procs.xql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/forums-procs.xql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/forums-procs.xql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -1,38 +1,67 @@ - - -update forums_forums set -name= :name, -charter= :charter, -presentation_type= :presentation_type, -posting_policy= :posting_policy -where -forum_id= :forum_id - - + + + update forums_forums + set name= :name, + charter= :charter, + presentation_type= :presentation_type, + posting_policy= :posting_policy + where forum_id = :forum_id + + - - - - select * from forums_forums where forum_id = :forum_id - - - + + + update acs_objects + set title= :name + where object_id = :forum_id + + - - -update forums_forums set enabled_p='t' -where forum_id= :forum_id - - + + + select forum_id, + name, + posting_policy, + presentation_type + from forums_forums + where package_id = :package_id + order by name + + - - -update forums_forums set enabled_p='f' -where forum_id= :forum_id - - - + + + select forums_forums.* + from forums_forums + where forums_forums.forum_id = :forum_id + + + + + + update forums_forums + set enabled_p = 't' + where forum_id = :forum_id + + + + + + update forums_forums + set enabled_p = 'f' + where forum_id = :forum_id + + + + + + select message_id from :table_name + where parent_id = :parent_id + order by message_id + + + Index: openacs-4/packages/forums/tcl/forums-security-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/forums-security-procs.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/forums-security-procs.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/forums-security-procs.tcl 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -10,109 +10,152 @@ namespace eval forum::security { + ad_proc -private do_abort {} { + do an abort if security violation + } { + if { [ad_conn user_id] == 0 } { + ad_redirect_for_registration + } else { + ad_returnredirect "not-allowed" + } + ad_script_abort + } + ad_proc -public can_read_forum_p { {-user_id ""} {-forum_id:required} } { - # hack - return 1 + return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege read] } ad_proc -public require_read_forum { {-user_id ""} {-forum_id:required} } { - + if {![can_read_forum_p -user_id $user_id -forum_id $forum_id]} { + do_abort + } } ad_proc -public can_read_message_p { {-user_id ""} {-message_id:required} } { - # hack - return 1 + # if the user is a guest, they can't see any forum messages at all + if { ![acs_privacy::user_can_read_private_data_p -user_id $user_id -object_id [ad_conn package_id]] } { + return 0 + } else { + return [permission::permission_p -party_id $user_id -object_id $message_id -privilege read] + } } ad_proc -public require_read_message { {-user_id ""} {-message_id:required} } { - + if {![can_read_message_p -user_id $user_id -message_id $message_id]} { + do_abort + } } ad_proc -public can_post_forum_p { {-user_id ""} {-forum_id:required} } { - return [permission::permission_p -object_id $forum_id \ - -party_id $user_id \ - -privilege forum_create] + return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege create] } ad_proc -public require_post_forum { {-user_id ""} {-forum_id:required} } { - + if {![can_post_forum_p -user_id $user_id -forum_id $forum_id]} { + do_abort + } } ad_proc -public can_post_message_p { {-user_id ""} {-message_id:required} } { - # hack - return 1 + return [permission::permission_p -party_id $user_id -object_id $message_id -privilege write] } ad_proc -public require_post_message { {-user_id ""} {-message_id:required} } { - + if {![can_post_message_p -user_id $user_id -message_id $message_id]} { + do_abort + } } ad_proc -public can_moderate_forum_p { {-user_id ""} {-forum_id:required} } { - # hack - return 1 + return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege forum_moderate] } ad_proc -public require_moderate_forum { {-user_id ""} {-forum_id:required} } { - + if {![can_moderate_forum_p -user_id $user_id -forum_id $forum_id]} { + do_abort + } } ad_proc -public can_moderate_message_p { {-user_id ""} {-message_id:required} } { - # hack - return 1 + return [permission::permission_p -party_id $user_id -object_id $message_id -privilege forum_moderate] } ad_proc -public require_moderate_message { {-user_id ""} {-message_id:required} } { - + if {![can_moderate_message_p -user_id $user_id -message_id $message_id]} { + do_abort + } } ad_proc -public can_admin_forum_p { {-user_id ""} {-forum_id:required} } { - # hack - return 1 + return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege forum_moderate] } ad_proc -public require_admin_forum { {-user_id ""} {-forum_id:required} } { + if {![can_admin_forum_p -user_id $user_id -forum_id $forum_id]} { + do_abort + } + } + ad_proc -public permissions { + {-forum_id:required} + array_name + } { + upvar $array_name array + + array set array [list admin_p [forum::security::can_admin_forum_p -forum_id $forum_id]] + + if { !$array(admin_p) } { + array set array [list moderate_p [forum::security::can_moderate_forum_p -forum_id $forum_id]] + if { !$array(moderate_p) } { + array set array [list post_p [expr { [ad_conn user_id] == 0 || [forum::security::can_post_forum_p -forum_id $forum_id] }]] + } else { + array set array [list post_p 1] + } + } else { + array set array [list moderate_p 1] + array set array [list post_p 1] + } } } Index: openacs-4/packages/forums/tcl/messages-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/messages-procs-oracle.xql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/messages-procs-oracle.xql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/messages-procs-oracle.xql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -1,43 +1,66 @@ + - oracle8.1.6 + oracle8.1.6 - - -select message_id, forum_id, subject, content, person.name(user_id) as user_name, -party.email(user_id) as user_email, -forums_forum.name(forum_id) as forum_name, -forums_message.root_message_id(forums_messages.message_id) as root_message_id, -(select subject from forums_messages fm2 -where message_id= forums_message.root_message_id(forums_messages.message_id)) as root_subject, -posting_date, tree_sortkey, parent_id, state, html_p -from forums_messages -where message_id= :message_id - - + + + select forums_messages.*, + 0 as n_attachments, + person.name(forums_messages.user_id) as user_name, + party.email(forums_messages.user_id) as user_email, + forums_forum.name(forums_messages.forum_id) as forum_name, + forums_message.root_message_id(forums_messages.message_id) as root_message_id, + (select fm2.subject + from forums_messages fm2 + where fm2.message_id = forums_message.root_message_id(forums_messages.message_id)) as root_subject, + to_char(forums_messages.posting_date, 'YYYY-MM-DD HH24:MI:SS') as posting_date_ansi + from forums_messages + where forums_messages.message_id = :message_id + + - - -declare begin - forums_message.delete_thread(:message_id); -end; - - + + + select forums_messages.*, + (select count(*) from attachments where object_id= message_id) as n_attachments, + person.name(forums_messages.user_id) as user_name, + party.email(forums_messages.user_id) as user_email, + forums_forum.name(forums_messages.forum_id) as forum_name, + forums_message.root_message_id(forums_messages.message_id) as root_message_id, + (select fm2.subject + from forums_messages fm2 + where fm2.message_id = forums_message.root_message_id(forums_messages.message_id)) as root_subject, + to_char(forums_messages.posting_date, 'YYYY-MM-DD HH24:MI:SS') as posting_date_ansi + from forums_messages + where forums_messages.message_id = :message_id + + - - -declare begin -forums_message.thread_close(:message_id); -end; - - + + + select site_node.url(node_id) + from site_nodes + where object_id = (select package_id + from forums_forums + where forums_forums.forum_id = :forum_id) + + - - -declare begin -forums_message.thread_open(:message_id); -end; - - + + + declare begin + forums_message.thread_close(:message_id); + end; + + + + + declare begin + forums_message.thread_open(:message_id); + end; + + + Index: openacs-4/packages/forums/tcl/messages-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/messages-procs.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/messages-procs.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/messages-procs.tcl 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -8,147 +8,338 @@ } -namespace eval forum::message { +namespace eval forum::message {} - ad_proc -public new { - {-forum_id:required} - {-message_id ""} - {-parent_id ""} - {-subject:required} - {-content:required} - {-html_p "f"} - {-user_id ""} - } { - create a new message - } { - # If no user_id is provided, we set it - # to the currently logged-in user - if {[empty_string_p $user_id]} { - set user_id [ad_conn user_id] - } +ad_proc -public forum::message::new { + {-forum_id:required} + {-message_id ""} + {-parent_id ""} + {-subject:required} + {-content:required} + {-format "text/plain"} + {-user_id ""} + -no_callback:boolean +} { + create a new message +} { + # If no user_id is provided, we set it + # to the currently logged-in user + if {[empty_string_p $user_id]} { + set user_id [ad_conn user_id] + } - # Prepare the variables for instantiation - set extra_vars [ns_set create] - oacs_util::vars_to_ns_set -ns_set $extra_vars -var_list {forum_id message_id parent_id subject content html_p user_id} + set original_message_id $message_id - db_transaction { - # Instantiate the message - set message_id [package_instantiate_object -extra_vars $extra_vars forums_message] + db_transaction { + set var_list [list \ + [list forum_id $forum_id] \ + [list message_id $message_id] \ + [list parent_id $parent_id] \ + [list subject $subject] \ + [list content $content] \ + [list format $format] \ + [list user_id $user_id]] + + set message_id [package_instantiate_object -var_list $var_list forums_message] + + get -message_id $message_id -array message + if {[info exists message(state)] && [string equal $message(state) approved]} { do_notifications -message_id $message_id } - return $message_id + if {!$no_callback_p} { + callback forum::message_new -package_id [ad_conn package_id] -message_id $message_id + } + } on_error { + + db_abort_transaction + + # Check to see if the message with a message_id matching the + # message_id arguement was in the database before calling + # this procedure. If so, the error is due to a double click + # and we should continue without returning an error. + + if {![empty_string_p $original_message_id]} { + # The was a non-null message_id arguement + if {[db_string message_exists_p { *SQL* }]} { + return $message_id + } else { + # OK - it wasn't a simple double-click, so bomb + ad_return_error \ + "OACS Internal Error" \ + "Error in forums::message::new - $errmsg" + } + } } + + return $message_id +} - ad_proc -public do_notifications { - {-message_id:required} - } { - # Select all the important information - get -message_id $message_id -array message +ad_proc -public forum::message::do_notifications { + {-message_id:required} +} { + # Select all the important information + forum::message::get -message_id $message_id -array message - set new_content "$message(user_name) ($message(user_email)) posted on [util_AnsiDatetoPrettyDate $message(posting_date)]:" - append new_content "\n\n" - append new_content $message(content) + set forum_id $message(forum_id) + set url "[ad_url][db_string select_forums_package_url {}]" - # Do the notification for the forum - notification::new -type_id [notification::type::get_type_id -short_name forums_forum_notif] \ - -object_id $message(forum_id) -response_id $message(message_id) -notif_subject $message(subject) -notif_text $new_content - - # Eventually we need notification for the root message too - # FIXME + set attachments [attachments::get_attachments -object_id $message(message_id)] + + set message_text [ad_html_text_convert -from $message(format) -to text/plain -- $message(content)] + set message_html [ad_html_text_convert -from $message(format) -to text/html -- $message(content)] + + set html_version "" + append html_version "Forum: $message(forum_name)
\n" + append html_version "Thread: $message(root_subject)
\n" + append html_version "Author: $message(user_name)
\n" + append html_version "Posted: $message(posting_date)
" + append html_version "\n
\n" + append html_version $message_html + append html_version "

" + + if {[llength $attachments] > 0} { + append html_version "Attachments: +

" + } + + set html_version $html_version + + set text_version "" + append text_version " +Forum: $message(forum_name) +Thread: $message(root_message_id) +Author: $message(user_name) +Posted: $message(posting_date) +---------------------------------- +$message_text +--------------------------------- +To post a reply to this email or view this message go to: +${url}message-view?message_id=$message(root_message_id) + +To view Forum $message(forum_name) go to: +${url}forum-view?forum_id=$message(forum_id) +" + # Do the notification for the forum + notification::new \ + -type_id [notification::type::get_type_id \ + -short_name forums_forum_notif] \ + -object_id $message(forum_id) \ + -response_id $message(message_id) \ + -notif_subject "\[$message(forum_name)\] $message(subject)" \ + -notif_text $text_version \ + -notif_html $html_version + - ad_proc -public edit { - {-message_id:required} - {-subject:required} - {-content:required} - {-html_p:required} - } { - Editing a message. There is no versioning here! - This means this function is for admins only! - } { - # do the update - db_dml update_message {} - } + # Eventually we need notification for the root message too + notification::new \ + -type_id [notification::type::get_type_id \ + -short_name forums_message_notif] \ + -object_id $message(root_message_id) \ + -response_id $message(message_id) \ + -notif_subject "\[$message(forum_name)\] $message(subject)" \ + -notif_text $text_version \ + -notif_html $html_version +} + +ad_proc -public forum::message::edit { + {-message_id:required} + {-subject:required} + {-content:required} + {-format:required} + -no_callback:boolean +} { + Editing a message. There is no versioning here! + This means this function is for admins only! +} { + # do the update + db_dml update_message {} + db_dml update_message_title {} - ad_proc -public set_html_p { - {-message_id:required} - {-html_p:required} - } { - set whether a message is HTML or not - } { - # Straight update to the DB - db_dml update_message_html_p + if {!$no_callback_p} { + callback forum::message_edit -package_id [ad_conn package_id] -message_id $message_id } +} - ad_proc -public get { - {-message_id:required} - {-array:required} - } { - get the fields for a forum - } { - # Select the info into the upvar'ed Tcl Array - upvar $array row - db_1row select_message {} -column_array row - } +ad_proc -public forum::message::set_format { + {-message_id:required} + {-format:required} +} { + set whether a message is HTML or not +} { + # Straight update to the DB + db_dml update_message_format +} - ad_proc -private set_state { - {-message_id:required} - {-state:required} - } { - Set the new state for a message - Usually used for approval - } { - # simple DB update - db_dml update_message_state {} +ad_proc -public forum::message::get { + {-message_id:required} + {-array:required} +} { + get the fields for a forum +} { + # Select the info into the upvar'ed Tcl Array + upvar $array row + + set query select_message + + if {[ad_conn isconnected] && [forum::attachments_enabled_p]} { + set query select_message_with_attachment } - ad_proc -public reject { - {-message_id:required} - } { - Reject a message - } { - set_state -message_id $message_id -state rejected + if {![db_0or1row $query {} -column_array row]} { + if {[array exists row]} { + array unset row + } + } else { + # Convert to user's date/time format + set row(posting_date_ansi) [lc_time_system_to_conn $row(posting_date_ansi)] + set row(posting_date_pretty) [lc_time_fmt $row(posting_date_ansi) "%x %X"] } +} - ad_proc -public approve { - {-message_id:required} - } { - approve a message - } { +ad_proc -private forum::message::set_state { + {-message_id:required} + {-state:required} +} { + Set the new state for a message + Usually used for approval +} { + set var_list [list \ + [list message_id $message_id] \ + [list state $state]] + package_exec_plsql -var_list $var_list forums_message set_state +} + +ad_proc -public forum::message::reject { + {-message_id:required} +} { + Reject a message +} { + set_state -message_id $message_id -state rejected +} + +ad_proc -public forum::message::approve { + {-message_id:required} +} { + approve a message +} { + db_transaction { set_state -message_id $message_id -state approved + do_notifications -message_id $message_id } +} - ad_proc -public delete { - {-message_id:required} - } { - delete a message and obviously all of its descendents - } { - db_transaction { - # Remove the notifications - notification::request::delete_all -object_id $message_id +ad_proc -public forum::message::delete { + {-message_id:required} + -no_callback:boolean +} { + delete a message and obviously all of its descendents +} { + db_transaction { + if {!$no_callback_p} { + callback forum::message_delete -package_id [ad_conn package_id] -message_id $message_id + } - # Remove the message - db_exec_plsql delete_message {} - } + # Remove the notifications + notification::request::delete_all -object_id $message_id + + # Remove the message + set var_list [list [list message_id $message_id]] + package_exec_plsql -var_list $var_list forums_message delete_thread } +} - ad_proc -public close { - {-message_id:required} - } { - close a thread - This is not exactly a cheap operation if the thread is long - } { - db_exec_plsql thread_close {} +ad_proc -public forum::message::close { + {-message_id:required} +} { + close a thread + This is not exactly a cheap operation if the thread is long +} { + db_exec_plsql thread_close {} +} + +ad_proc -public forum::message::open { + {-message_id:required} +} { + reopen a thread + This is not exactly a cheap operation if the thread is long +} { + db_exec_plsql thread_open {} +} + +ad_proc -public forum::message::get_attachments { + {-message_id:required} +} { + get the attachments for a message +} { + # If attachments aren't enabled, then we stop + if {![forum::attachments_enabled_p]} { + return [list] } - ad_proc -public open { - {-message_id:required} - } { - reopen a thread - This is not exactly a cheap operation if the thread is long - } { - db_exec_plsql thread_open {} + return [attachments::get_attachments -object_id $message_id] +} + +ad_proc -public forum::message::subject_sort_filter { + -forum_id:required + -order_by:required +} { + Return a piece of HTML for toggling the sort order of threads (subjects) + in a forum. The user can either sort by the first postings in subjects + (the creation date of the subjects) or the last one. + + @author Peter Marklund +} { + set subject_label "[_ forums.lt_First_post_in_subject]" + set child_label "[_ forums.Last_post_in_subject]" + set new_order_by [ad_decode $order_by posting_date last_child_post posting_date] + + set export_vars [ad_export_vars -override [list [list order_by $new_order_by]] {order_by forum_id}] + set toggle_url "[ad_conn url]?${export_vars}" + if { [string equal $order_by posting_date] } { + # subject selected + set subject_link "$subject_label" + set child_link "$child_label" + } else { + # child selected + set subject_link "$subject_label" + set child_link "$child_label" } + set sort_filter "$subject_link | $child_link" + + return $sort_filter } + +ad_proc -public forum::message::initial_message { + {-forum_id {}} + {-parent {}} + {-message:required} +} { + Create an array with values initialised for a new message. +} { + upvar $message init_msg + + if { [empty_string_p $forum_id] && [empty_string_p $parent] } { + return -code error [_ forums.lt_You_either_have_to] + } + + if { ![empty_string_p $parent] } { + upvar $parent parent_msg + + set init_msg(parent_id) $parent_msg(message_id) + set init_msg(forum_id) $parent_msg(forum_id) + set init_msg(subject) \ + [forum::format::reply_subject $parent_msg(subject)] + } else { + set init_msg(forum_id) $forum_id + set init_msg(parent_id) "" + } +} Index: openacs-4/packages/forums/tcl/messages-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/messages-procs.xql,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/messages-procs.xql 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/messages-procs.xql 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -1,31 +1,38 @@ - - -update forums_messages set -html_p= :html_p -where -message_id= :message_id - - + + + update forums_messages + set format = :format + where message_id = :message_id + + - - -update forums_messages set -subject= :subject, -content= :content, -html_p= :html_p -where message_id= :message_id - - + + + update acs_objects + set title = :subject + where object_id = :message_id and object_type = 'forums_message' + + - - -update forums_messages set -state= :state -where message_id= :message_id - - + + + update forums_messages + set subject = :subject, + content = :content, + format = :format + where message_id = :message_id + + + + + select count(message_id) + from forums_messages + where message_id = :message_id + + + Index: openacs-4/packages/forums/www/forum-view.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/forum-view.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/forum-view.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/forum-view.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,21 +1,20 @@ - -Forum: @forum.name@ -@context_bar@ + + @page_title;noquote@ + @context;noquote@ + @forum_id;noquote@ - -[Administer this Forum]   + +
+ + + #forums.Search_colon#  + + +
- -[Manage/Moderate this Forum] - -

-@notification_chunk@ -

+ - +

+@notification_chunk;noquote@ +

\ No newline at end of file Index: openacs-4/packages/forums/www/forum-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/forum-view.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/forum-view.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/forum-view.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,39 +1,68 @@ - ad_page_contract { - One Forum View + one forum view - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ -} { + +} -query { forum_id:integer,notnull + {orderby "last_child_post,desc"} + page:optional } -# Security Check -forum::security::require_read_forum -forum_id $forum_id -set package_id [ad_conn package_id] +# Get forum data +if {[catch {forum::get -forum_id $forum_id -array forum} errMsg]} { + if {[string equal $::errorCode NOT_FOUND]} { + ns_returnnotfound + ad_script_abort + } + error $errMsg $::errorInfo $::errorCode +} -set user_id [ad_verify_and_get_user_id] -set admin_p [forum::security::can_admin_forum_p -forum_id $forum_id] -set moderate_p [forum::security::can_moderate_forum_p -forum_id $forum_id] +# If disabled! +if {$forum(enabled_p) != "t"} { + ad_returnredirect "./" + ad_script_abort +} -# Get forum data -forum::get -forum_id $forum_id -array forum +forum::security::require_read_forum -forum_id $forum_id +forum::security::permissions -forum_id $forum_id permissions -if {!$moderate_p} { - # Normal select - db_multirow messages messages_select {} -} else { - # Moderator select! - db_multirow messages messages_select_moderator {} +#it is confusing to provide a moderate link for non-moderated forums. +if { $forum(posting_policy) != "moderated" } { + set permissions(moderate_p) 0 } -set post_p [forum::security::can_post_forum_p -forum_id $forum_id] +# get the colors from the params +set table_border_color [parameter::get -parameter table_border_color] +set table_bgcolor [parameter::get -parameter table_bgcolor] +set table_other_bgcolor [parameter::get -parameter table_other_bgcolor] -set notification_chunk [notification::display::request_widget -type forums_forum_notif -object_id $forum_id -pretty_name $forum(name) -url [ad_conn url]?forum_id=$forum_id] +set admin_url [export_vars -base "admin/forum-edit" { forum_id {return_url [ad_return_url]}}] +set moderate_url [export_vars -base "moderate/forum" { forum_id }] +set post_url [export_vars -base "message-post" { forum_id }] -set context_bar [list $forum(name)] +# Create a search form and action when used +set searchbox_p [parameter::get -parameter ForumsSearchBoxP -default 1] +if {$searchbox_p} { + form create search -action search + forums::form::search search -ad_return_template + if {[form is_request search]} { + element set_properties search forum_id -value $forum_id + } +} +# Need to quote forum(name) since it is noquoted on display as part of an +# HTML fragment. +set notification_chunk [notification::display::request_widget \ + -type forums_forum_notif \ + -object_id $forum_id \ + -pretty_name $forum(name) \ + -url [ad_conn url]?forum_id=$forum_id \ +] + +set page_title "[_ forums.Forum_1] $forum(name)" +set context [list [ad_quotehtml $forum(name)]] Index: openacs-4/packages/forums/www/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/index.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/index.adp 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/index.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,12 +1,15 @@ - -Forums -@context_bar@ + +#forums.Forums# +@context;noquote@ - + + Index: openacs-4/packages/forums/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/index.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/index.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/index.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,29 +1,22 @@ - ad_page_contract { - List of Forums + top level list of forums - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ -} { + } set package_id [ad_conn package_id] +set user_id [ad_conn user_id] +set admin_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege admin] +set searchbox_p [parameter::get -parameter ForumsSearchBoxP -package_id $package_id -default 1] -set user_id [ad_verify_and_get_user_id] -set admin_p [ad_permission_p $package_id admin] - -db_multirow forums forums_select { - select forum_id, name, posting_policy - from forums_forums_enabled - where package_id = :package_id - and - (posting_policy= 'open' or posting_policy= 'moderated' or - acs_permission.permission_p(:user_id, forum_id, 'forum_read') ='t') - order by name +# Create a search form and action when used +if {$searchbox_p} { + form create search -action search + forums::form::search search } -set context_bar "" - -ad_return_template +set context {} Index: openacs-4/packages/forums/www/message-email.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-email.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-email.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-email.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,13 +1,19 @@ - -Email Message: @message.forum_name@ - @message.subject@ - + + #forums.Email_Message# @message.forum_name;noquote@ - @message.subject;noquote@ + @context;noquote@ + + + + + + + + -You're emailing a copy of a posting to a friend.

-Subject of Posting: @message.subject@
-Body of Posting:
-

-@message.content@ -
-

+

#forums.lt_Email_a_copy_of_the_f#

- +
+ +
+ + Index: openacs-4/packages/forums/www/message-email.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-email.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-email.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-email.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,56 +1,56 @@ - ad_page_contract { Forward a message to a friend - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-28 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { message_id:integer,notnull } +forum::security::require_read_message -message_id $message_id + +# Get the message information +forum::message::get -message_id $message_id -array message +set message(tree_level) 0 + form create message element create message message_id \ - -label "Message ID" -datatype integer -widget hidden + -label [_ forums.Message_ID] \ + -datatype integer \ + -widget hidden -element create message to_email \ - -label "Email" -datatype text -widget text -html {size 60} +forums::form::forward_message message -element create message subject \ - -label "Subject" -datatype text -widget text -html {size 80} - -element create message pre_body \ - -label "Your Note" -datatype text -widget textarea -html {cols 80 rows 10 wrap hard} - - if {[form is_valid message]} { template::form get_values message message_id to_email subject pre_body - # Get the data - forum::message::get -message_id $message_id -array message + # Create the email body + set email_body [forum::email::create_forward_email -pre_body $pre_body message] - set new_body "$pre_body" - append new_body "\n\n===================================\n\n" - append new_body "$message(user_name) wrote, on [util_AnsiDatetoPrettyDate $message(posting_date)]:\n" - append new_body "Subject: $message(subject)\n\n" - append new_body "$message(content)\n" - # Send the email acs_mail_lite::send -to_addr $to_email \ - -from_addr [cc_email_from_party [ad_conn user_id]] \ - -subject $subject \ - -body $new_body + -from_addr [cc_email_from_party [ad_conn user_id]] \ + -subject $subject \ + -body $email_body ad_returnredirect "message-view?message_id=$message_id" ad_script_abort } -# Get the message information -forum::message::get -message_id $message_id -array message +if {[template::form is_request message]} { + element set_properties message message_id -value $message_id + element set_properties message subject -value $message(subject) +} -element set_properties message subject -value "\[Fwd from $message(user_name): $message(subject)\]" -element set_properties message message_id -value $message_id +set context [list [list "./forum-view?forum_id=$message(forum_id)" "$message(forum_name)"]] +if {![empty_string_p $message(parent_id)]} { + lappend context [list "./message-view?message_id=$message(root_message_id)" "[_ forums.Entire_Thread]"] +} +lappend context [list "./message-view?message_id=$message(message_id)" "$message(subject)"] +lappend context [_ forums.Email_to_a_friend] ad_return_template Index: openacs-4/packages/forums/www/message-post.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-post.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-post.adp 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-post.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,5 +1,17 @@ - -Post to Forum: @forum.name@ - + +#forums.Post_to_Forum# @forum.name;noquote@ +@context;noquote@ +message.subject + + + + + + + + - + Index: openacs-4/packages/forums/www/message-post.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-post.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-post.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-post.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,70 +1,85 @@ - ad_page_contract { Form to create message and insert it - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-25 - @cvs-id $id: Exp $ -} { + @cvs-id $Id$ + +} -query { {forum_id ""} {parent_id ""} +} -validate { + forum_id_or_parent_id { + if {[empty_string_p $forum_id] && [empty_string_p $parent_id]} { + ad_complain [_ forums.lt_You_either_have_to] + } + } } -# Either forum_id or parent_id has to be non-null -if {[empty_string_p $forum_id] && [empty_string_p $parent_id]} { - # error! - return -code error +if { ![empty_string_p [ns_queryget formbutton:post]] } { + set action post +} elseif { ![empty_string_p [ns_queryget formbutton:preview]] } { + set action preview +} elseif { ![empty_string_p [ns_queryget formbutton:edit]] } { + set action edit +} else { + set action "" } -# We would use the nice ad_form construct if we could -form create message +set user_id [auth::refresh_login] -element create message message_id \ - -label "Message ID" -datatype integer -widget hidden +############################## +# Pull out required forum and parent data and +# perform security checks +# +if {[empty_string_p $parent_id]} { + # no parent_id, therefore new thread + # require thread creation privs + forum::security::require_post_forum -forum_id $forum_id -element create message subject \ - -label "Subject" -datatype text -widget text -html {size 60} + forum::get -forum_id $forum_id -array forum +} else { + # get the parent message information + forum::message::get -message_id $parent_id -array parent_message + set parent_message(tree_level) 0 -element create message content \ - -label "Body" -datatype text -widget textarea -html {rows 30 cols 60 wrap soft} + # see if they're allowed to add to this thread + forum::security::require_post_message -message_id $parent_id -element create message parent_id \ - -label "parent ID" -datatype integer -widget hidden -optional + forum::get -forum_id $parent_message(forum_id) -array forum +} -element create message forum_id \ - -label "forum ID" -datatype integer -widget hidden +############################## +# Calculate users rights and forums policy +# +set anonymous_allowed_p [expr ([empty_string_p $forum_id] || \ + [forum::security::can_post_forum_p \ + -forum_id $forum_id -user_id 0]) && \ + ([empty_string_p $parent_id] || \ + [forum::security::can_post_message_p \ + -message_id $parent_id -user_id 0])] -element create message html_p \ - -label "Format" -datatype text -widget select -options {{text f} {html t}} +set attachments_enabled_p [forum::attachments_enabled_p] -if {[form is_valid message]} { - template::form get_values message message_id forum_id parent_id subject content html_p +############################## +# Template variables +# - forum::message::new -forum_id $forum_id \ - -message_id $message_id \ - -parent_id $parent_id \ - -subject $subject \ - -content $content \ - -html_p $html_p +if {![string equal [template::form::get_button message] "preview"]} { + set context [list [list "./forum-view?forum_id=$forum_id" [ad_quotehtml $forum(name)]]] - ad_returnredirect "message-view?message_id=$message_id" - ad_script_abort -} + if {[empty_string_p $parent_id]} { + lappend context [_ forums.Post_a_Message] + } else { + lappend context [list "./message-view?message_id=$parent_message(message_id)" "$parent_message(subject)"] + lappend context [_ forums.Post_a_Reply] + } +} else { + set context [list [list "./forum-view?forum_id=$forum_id" [ad_quotehtml $forum(name)]]] + lappend context "[_ forums.Post_a_Message]" -set message_id [db_nextval acs_object_id_seq] - -if {[empty_string_p $forum_id]} { - # get the parent message information - forum::message::get -message_id $parent_id -array parent_message - set forum_id $parent_message(forum_id) + ad_return_template "message-post-confirm" } -forum::get -forum_id $forum_id -array forum -# Prepare the other data -element set_properties message forum_id -value $forum_id -element set_properties message parent_id -value $parent_id -element set_properties message message_id -value $message_id - -ad_return_template Index: openacs-4/packages/forums/www/message-view.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-view.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-view.adp 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-view.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,37 +1,74 @@ - -Forum @forum.name@: @message.subject@ -@context_bar@ + + #forums.Thread_title# + @context;noquote@ + @message_id@ -

-@notification_chunk@ -

+ + + + + + + + + + + + @ah_sources;noquote@ + @dynamic_script;noquote@ + + - -response to @message.root_subject@

- + +

+ + + #forums.Search_colon#  + + +
+
+ + +


+ -@message.subject@ +

@notification_chunk;noquote@

-

+ -

-@message.content@ -
+ + + #forums.Post_a_Reply# + + + #forums.Reply_to_first_post_on_page_label# + + -

-Respond! -  |   -Email - - -

-Administration: [@message.state@] [ delete | approve | reject | edit] - - -

Responses

- - + Index: openacs-4/packages/forums/www/message-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-view.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/message-view.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/message-view.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,58 +1,124 @@ - ad_page_contract { - View a message (and its children) + view a message (and its children) - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-25 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { message_id:integer,notnull + {ajax_effects 1} + {display_mode ""} } -# Security -forum::security::require_read_message -message_id $message_id +####################### +# +# First check all reasons why we might abort +# +####################### -# Check if the user has admin on the message -set moderate_p [forum::security::can_moderate_message_p -message_id $message_id] -set post_p [forum::security::can_post_message_p -message_id $message_id] - # Load up the message information forum::message::get -message_id $message_id -array message - -# Check if the message is approved -if {!$moderate_p && $message(state) != "approved"} { - ad_returnredirect "forum-view?forum_id=$message(forum_id)" +if {![array exists message]} { + ns_returnnotfound ad_script_abort } + # Load up the forum information forum::get -forum_id $message(forum_id) -array forum -# Check preferences for user +# If disabled! +if {$forum(enabled_p) != "t"} { + ad_returnredirect "./" + ad_script_abort +} -# Set some variables for easy SQL access -set forum_id $message(forum_id) -set tree_sortkey $message(tree_sortkey) +forum::security::require_read_message -message_id $message_id +forum::security::permissions -forum_id $message(forum_id) permissions -if {!$moderate_p} { - # Select publicly viewable items - db_multirow responses select_message_responses {} +# Check if the user has admin on the message +set permissions(moderate_p) [forum::security::can_moderate_message_p -message_id $message_id] +if {!${permissions(moderate_p)}} { + set permissions(post_p) [forum::security::can_post_forum_p -forum_id $message(forum_id)] } else { - # Select all items - db_multirow responses select_message_responses_moderator {} + set permissions(post_p) 1 } +# Check if the message is approved +if {!${permissions(moderate_p)} && ![string equal $message(state) approved]} { + ad_returnredirect "forum-view?forum_id=$message(forum_id)" + ad_script_abort +} + +############################################ +# +# Ok we're not aborting so lets do some work +# +############################################ + +# Create a search form and action when used +set searchbox_p [parameter::get -parameter ForumsSearchBoxP -default 1] +if {$searchbox_p} { + form create search -action search + forums::form::search search + + if {[form is_request search]} { + element set_properties search forum_id -value $message(forum_id) + } +} + + # If this is a top-level thread, we allow subscriptions here -if {[empty_string_p $message(parent_id)]} { - set notification_chunk [notification::display::request_widget -type forums_message_notif -object_id $message_id -pretty_name $message(subject) -url [ad_conn url]?message_id=$message_id] +if { [empty_string_p $message(parent_id)] } { + set notification_chunk [notification::display::request_widget \ + -type forums_message_notif \ + -object_id $message(message_id) \ + -pretty_name $message(subject) \ + -url [ad_conn url]?message_id=$message(message_id) \ + ] } else { set notification_chunk "" } -set context_bar [list [list "./forum-view?forum_id=$message(forum_id)" "$message(forum_name)"] {One Message}] +set context [list [list "./forum-view?forum_id=$message(forum_id)" "$message(forum_name)"]] +if {![empty_string_p $message(parent_id)]} { + lappend context [list "./message-view?message_id=$message(root_message_id)" "$message(subject)"] + lappend context [_ forums.One_Message] +} else { + lappend context "$message(subject)" +} -ad_return_template +if { $permissions(post_p) || [ad_conn user_id] == 0 } { + set reply_url [export_vars -base message-post { { parent_id $message(message_id) } }] +} +set all_messages_ids [db_list get_all "SELECT fma.message_id \ + FROM forums_messages_approved fma \ + WHERE fma.forum_id = $message(forum_id) \ + and fma.tree_sortkey between (select fm.tree_sortkey from forums_messages fm where fm.message_id = $message(message_id)) \ + and (select tree_right(fm.tree_sortkey) from forums_messages fm where fm.message_id = $message(message_id)) \ + ORDER BY fma.message_id"] - + +set all_messages $all_messages_ids +set thread_url [export_vars -base forum-view { { forum_id $message(forum_id) } }] + +# Call all the scriptaculous libraries +set ah_sources [ah::js_sources -default] + +set dynamic_script " + + +" + Index: openacs-4/packages/forums/www/user-history.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/user-history.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/user-history.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/user-history.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,27 +1,9 @@ - -Forums: Posting History for @user.full_name@ -@context_bar@ + +#forums.Forums_Posting_hist_lt# @user.full_name;noquote@ +@context;noquote@
-@dimensional_chunk@ -
-

-

+ Index: openacs-4/packages/forums/www/user-history.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/user-history.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/user-history.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/user-history.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,38 +1,19 @@ - ad_page_contract { Posting History for a User - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-29 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { user_id:integer,notnull {view "date"} } -set package_id [ad_conn package_id] - -# FIXME: for now this shows all postings everywhere in all forums! - -# choosing the view -set dimensional_list { - { - view "View:" date { - {date "by Date" { order by date desc } } - {forum "by Forum" { order by forums_forums.name, date desc } } - } - } -} - -set sql_order_by [ad_dimensional_sql $dimensional_list] - -# Select the postings -db_multirow messages select_messages {} - # Get user information oacs::user::get -user_id $user_id -array user -set dimensional_chunk [ad_dimensional $dimensional_list] -set context_bar {{Posting History}} +set context [list [_ forums.Posting_History]] + ad_return_template Index: openacs-4/packages/forums/www/admin/forum-disable.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-disable.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-disable.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-disable.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,15 +1,18 @@ - ad_page_contract { Disable a Forum - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-28 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { forum_id:integer,notnull } forum::disable -forum_id $forum_id -ad_returnredirect "./" +ad_returnredirect "." + + + Index: openacs-4/packages/forums/www/admin/forum-edit.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-edit.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-edit.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-edit.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,5 +1,14 @@ - -Edit Forum: @forum.name@ - + +Edit Forum: @forum.name;noquote@ +@context;noquote@ +forum.name - + +#forums.This_forum_is# #forums.enabled#. #forums.You_may# #forums.disable_it#. + + +#forums.This_forum_is# #forums.disabled#. #forums.You_may# #forums.enable_it#. + +

+ + Index: openacs-4/packages/forums/www/admin/forum-edit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-edit.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-edit.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-edit.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,55 +1,16 @@ - ad_page_contract { Edit a Forum - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-25 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { forum_id:integer,notnull + {return_url "."} } -form create forum - -element create forum forum_id \ - -label "Forum ID" -datatype integer -widget hidden - -element create forum name \ - -label "Name" -datatype text -widget text -html {size 60} - -element create forum charter \ - -label "Charter" -datatype text -widget textarea -html {cols 60 rows 10 wrap soft} - -element create forum presentation_type \ - -label "Presentation" -datatype text -widget select -options {{Flat flat} {Threaded threaded}} - -element create forum posting_policy \ - -label "Posting Policy" -datatype text -widget select -options {{open open} {moderated moderated} {closed closed}} - -element create forum new_threads_p \ - -label "Users Can Create New Threads" -datatype integer -widget radio -options {{yes 1} {no 0}} - -if {[form is_valid forum]} { - template::form get_values forum forum_id name charter presentation_type posting_policy new_threads_p - - forum::edit -forum_id $forum_id \ - -name $name \ - -charter $charter \ - -presentation_type $presentation_type \ - -posting_policy $posting_policy - - # Users can create new threads? - if {$new_threads_p} { - forum::new_questions_allow -forum_id $forum_id - } else { - forum::new_questions_deny -forum_id $forum_id - } - - ad_returnredirect "../forum-view?forum_id=$forum_id" - ad_script_abort -} - # Select the info set package_id [ad_conn package_id] forum::get -forum_id $forum_id -array forum @@ -61,11 +22,4 @@ ad_script_abort } -element set_properties forum forum_id -value $forum_id -element set_properties forum name -value $forum(name) -element set_properties forum charter -value $forum(charter) -element set_properties forum presentation_type -value $forum(presentation_type) -element set_properties forum posting_policy -value $forum(posting_policy) -element set_properties forum new_threads_p -value [forum::new_questions_allowed_p -forum_id $forum_id] - -ad_return_template +set context [list [_ forums.Edit_forum]] Index: openacs-4/packages/forums/www/admin/forum-enable.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-enable.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-enable.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-enable.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,15 +1,18 @@ - ad_page_contract { Disable a Forum - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-28 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { forum_id:integer,notnull } forum::enable -forum_id $forum_id -ad_returnredirect "./" +ad_returnredirect "." + + + Index: openacs-4/packages/forums/www/admin/forum-new.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-new.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-new.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-new.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,5 +1,6 @@ - -Create New Forum - + +#forums.Create_New_Forum# +@context;noquote@ +forum.name - + Index: openacs-4/packages/forums/www/admin/forum-new.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/forum-new.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/forum-new.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/forum-new.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,61 +1,15 @@ - ad_page_contract { Create a Forum - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-25 - @cvs-id $id: Exp $ -} { -} + @cvs-id $Id$ -# scoping -set package_id [ad_conn package_id] - -form create forum - -element create forum forum_id \ - -label "Forum ID" -datatype integer -widget hidden - -element create forum name \ - -label "Name" -datatype text -widget text -html {size 60} - -element create forum charter \ - -label "Charter" -datatype text -widget textarea -html {cols 60 rows 10 wrap soft} - -element create forum presentation_type \ - -label "Presentation" -datatype text -widget select -options {{Flat flat} {Threaded threaded}} - -element create forum posting_policy \ - -label "Posting Policy" -datatype text -widget select -options {{open open} {moderated moderated} {closed closed}} - -element create forum new_threads_p \ - -label "Users Can Create New Threads" -datatype integer -widget radio -options {{yes 1} {no 0}} - -if {[form is_valid forum]} { - template::form get_values forum forum_id name charter presentation_type posting_policy new_threads_p - - set forum_id [forum::new -forum_id $forum_id \ - -name $name \ - -charter $charter \ - -presentation_type $presentation_type \ - -posting_policy $posting_policy \ - -package_id $package_id] - - # Users can create new threads? - if {$new_threads_p} { - forum::new_questions_allow -forum_id $forum_id - } else { - forum::new_questions_deny -forum_id $forum_id - } - - ad_returnredirect "../" - ad_script_abort +} -query { + {name ""} } -# Pre-fetch the forum_id -set forum_id [db_nextval acs_object_id_seq] -element set_properties forum forum_id -value $forum_id -element set_properties forum new_threads_p -value 1 +set context [list [_ forums.Create_New_Forum]] ad_return_template Index: openacs-4/packages/forums/www/admin/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/index.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/index.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/index.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,21 +1,7 @@ - -Forums Administration - + +#forums.lt_Forums_Administration# + -

Forums

- Index: openacs-4/packages/forums/www/admin/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/admin/index.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/admin/index.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/admin/index.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,19 +1,10 @@ - ad_page_contract { Forums Administration - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ -} { + } -# scoping -set package_id [ad_conn package_id] - -# List of forums -db_multirow forums select_forums {} - -ad_return_template - Index: openacs-4/packages/forums/www/moderate/forum.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/forum.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/forum.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/forum.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,16 +1,7 @@ - -Manage Forum: @forum.name@ - + +#forums.Manage_Forum# @forum.name;noquote@ +#forums.Manage# -

Pending Threads

+

#forums.Pending_Threads#

- + Index: openacs-4/packages/forums/www/moderate/forum.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/forum.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/forum.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/forum.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,11 +1,11 @@ - ad_page_contract { Moderate a Forum - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ + } { forum_id:integer,notnull } @@ -16,7 +16,4 @@ # Get forum data forum::get -forum_id $forum_id -array forum -# Get the threads that need approval -db_multirow pending_threads select_pending_threads {} - ad_return_template Index: openacs-4/packages/forums/www/moderate/message-approve.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-approve.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-approve.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-approve.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,11 +1,11 @@ - ad_page_contract { Approve a Message - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ + } { message_id:integer,notnull {return_url "../message-view"} @@ -18,3 +18,6 @@ forum::message::approve -message_id $message_id ad_returnredirect "$return_url?message_id=$message_id" + + + Index: openacs-4/packages/forums/www/moderate/message-delete.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-delete.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-delete.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-delete.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,20 +1,18 @@ - -Confirm Delete: @message.subject@ - + + #forums.Confirm_Delete# @message.subject;noquote@ + #forums.delete# + + + + + -Are you sure you want to delete this message? -

-@message.subject@ - -

- -

-@message.content@ -
- -

- -Yes -

-No -

+ Index: openacs-4/packages/forums/www/moderate/message-delete.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-delete.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-delete.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-delete.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,14 +1,14 @@ - ad_page_contract { Delete a Message - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ + } { message_id:integer,notnull - {return_url ""} + {return_url "../message-view"} {confirm_p 0} } @@ -18,14 +18,4 @@ # Select the stuff forum::message::get -message_id $message_id -array message -# Confirm? -if {!$confirm_p} { - set url_vars [export_url_vars message_id return_url] - ad_return_template -} else { - # Delete the message and all children - forum::message::delete -message_id $message_id - - # Redirect to the forum - ad_returnredirect "../forum-view?forum_id=$message(forum_id)" -} +ad_return_template Index: openacs-4/packages/forums/www/moderate/message-edit.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-edit.adp,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-edit.adp 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-edit.adp 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,5 +1,5 @@ - -Edit Message: @message.subject@ - + +#forums.Edit_Message# @message.subject;noquote@ +#forums.Edit# - + Index: openacs-4/packages/forums/www/moderate/message-edit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-edit.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-edit.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-edit.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,51 +1,17 @@ - ad_page_contract { Form to edit a message - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-25 - @cvs-id $id: Exp $ + @cvs-id $Id$ + } { message_id:integer,notnull {return_url "../message-view"} } -# We would use the nice ad_form construct if we could -form create message - -element create message message_id \ - -label "Message ID" -datatype integer -widget hidden - -element create message subject \ - -label "Subject" -datatype text -widget text -html {size 60} - -element create message content \ - -label "Body" -datatype text -widget textarea -html {rows 30 cols 60 wrap soft} - -element create message html_p \ - -label "Format" -datatype text -widget select -options {{text f} {html t}} - -if {[form is_valid message]} { - template::form get_values message message_id subject content html_p - - forum::message::edit \ - -message_id $message_id \ - -subject $subject \ - -content $content \ - -html_p $html_p - - ad_returnredirect "$return_url?message_id=$message_id" - ad_script_abort -} - forum::message::get -message_id $message_id -array message forum::get -forum_id $message(forum_id) -array forum -# Prepare the other data -element set_properties message message_id -value $message_id -element set_properties message subject -value $message(subject) -element set_properties message content -value $message(content) -element set_properties message html_p -value $message(html_p) - ad_return_template Index: openacs-4/packages/forums/www/moderate/message-reject.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/moderate/message-reject.tcl,v diff -u -N -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/www/moderate/message-reject.tcl 29 May 2002 21:40:11 -0000 1.1.1.1 +++ openacs-4/packages/forums/www/moderate/message-reject.tcl 28 Jun 2006 20:30:29 -0000 1.1.1.2 @@ -1,11 +1,11 @@ - ad_page_contract { Reject a Message - @author Ben Adida (ben@openforce) + @author Ben Adida (ben@openforce.net) @creation-date 2002-05-24 @cvs-id $Id$ + } { message_id:integer,notnull {return_url "../message-view"} @@ -18,3 +18,6 @@ forum::message::reject -message_id $message_id ad_returnredirect "$return_url?message_id=$message_id" + + +