Commit 4320a30e authored by Frank Bergmann's avatar Frank Bergmann

P/O Forums initial import

parents
<?xml version="1.0"?>
<!-- Generated by the OpenACS Package Manager -->
<package key="intranet-forum" url="http://openacs.org/repository/apm/packages/intranet-forum" type="apm_application">
<package-name>Project/Open Forum</package-name>
<pretty-plural>Project/Open Forums</pretty-plural>
<initial-install-p>f</initial-install-p>
<singleton-p>t</singleton-p>
<auto-mount>intranet-forum</auto-mount>
<version name="0.1.1d" url="http://openacs.org/repository/download/apm/intranet-forum-0.1d.apm">
<owner url="mailto:fraber@fraber.de">Frank Bergmann</owner>
<vendor url="http://www.project-open.com/">Project/Open</vendor>
<!-- No dependency information -->
<callbacks>
</callbacks>
<parameters>
<!-- No version parameters -->
</parameters>
</version>
</package>
This diff is collapsed.
-- /package/intranet-forum/sql/intranet-forum-drop.sql
--
-- Removes the filestorage data model from the database
--
-- @author Frank Bergmann (fraber@fraber.de)
--
-----------------------------------------------------
-- Drop menus and components defined by the module
BEGIN
im_menu.del_module(module_name => 'intranet-forum');
END;
/
show errors
BEGIN
im_component_plugin.del_module(module_name => 'intranet-forum');
END;
/
show errors
commit;
delete from im_view_columns where column_id >= 4000 and column_id < 4099;
delete from im_view_columns where column_id >= 4100 and column_id < 4199;
delete from im_view_columns where column_id >= 4200 and column_id < 4299;
delete from im_views where view_id >= 40 and view_id < 50;
-- no objects yet...
-- delete from acs_objects where object_type='im_menu';
delete from im_component_plugins where package_name = 'intranet-forum';
drop sequence im_forum_topics_seq;
drop index im_forum_topics_group_idx;
drop sequence im_forum_files_seq;
drop table im_forum_files;
drop table im_forum_topic_user_map;
drop table im_forum_folders;
drop table im_forum_topics;
This diff is collapsed.
# /www/intranet/forum/forum-action.tcl
ad_page_contract {
Purpose: Takes commands from the /intranet/projects/view
page and saves changes, deletes tasks and scans for Trados
files.
@param return_url the url to return to
@param group_id group id
} {
submit
action
topic_id:array,optional
{return_url ""}
}
set user_id [ad_maybe_redirect_for_registration]
set page_body "<PRE>\n"
if {$return_url == ""} {
set return_url "/intranet/forum/"
}
set topic_list [array names topic_id]
ns_log Notice "forum-action: topic_list=$topic_list"
if {0 == [llength $topic_list]} {
ad_returnredirect $return_url
}
# Make sure the respective im_forum_topic_user_map entries exist:
foreach topic_insert_id $topic_list {
if { [catch {
db_dml insert_forum_topic_map "insert into im_forum_topic_user_map
(topic_id, user_id) values ($topic_insert_id, $user_id)"
} err_msg] } {
# nothing - probably existed before
}
}
# Convert the list of selected topics into a
# "topic_id in (1,2,3,4...)" clause
#
set topic_in_clause "and topic_id in ("
append topic_in_clause [join $topic_list ", "]
append topic_in_clause ")\n"
ns_log Notice "forum-action: topic_in_clause=$topic_in_clause"
switch $submit {
"Apply" {
switch $action {
move_to_deleted {
set sql "
update im_forum_topic_user_map
set folder_id = 1
where
user_id=:user_id
$topic_in_clause"
db_dml mark_topics $sql
}
move_to_inbox {
set sql "
update im_forum_topic_user_map
set folder_id = 0
where user_id=:user_id
$topic_in_clause"
db_dml mark_topics $sql
}
mark_as_read {
set sql "
update im_forum_topic_user_map
set read_p = 't'
where user_id=:user_id
$topic_in_clause"
db_dml mark_topics $sql
}
mark_as_unread {
set sql "
update im_forum_topic_user_map
set read_p = 'f'
where user_id=:user_id
$topic_in_clause"
db_dml mark_topics $sql
}
default {
ad_return_complaint 1 "<li>Unknown value for action: '$action'"
}
}
ad_returnredirect $return_url
}
default {
ad_return_complaint 1 "<li>Unknown value for submit: '$submit'"
}
}
# /www/intranet/forum/new-system-error.tcl
ad_page_contract {
Creates a new system error from a "Report this error" button.
Works as an inteface between the request procesor generating
the incident and the forum module that works differntly then
the old ACS ticket tracker.
So there are several difficulties:
- This page is publicly accessible, so it may be used for
denial of service attacks by flooding the system with
incidents
- We have to route the incidents to
} {
error_url:trim
error_info:trim
error_first_names:trim
error_last_name:trim
error_user_email:trim
core_version:trim
system_url:trim
publisher_name
}
ns_log Notice "new-system-incident: error_url=$error_url"
ns_log Notice "new-system-incident: error_info=$error_info"
ns_log Notice "new-system-incident: error_first_names=$error_first_names"
ns_log Notice "new-system-incident: error_last_name=$error_last_name"
ns_log Notice "new-system-incident: error_user_email=$error_user_email"
ns_log Notice "new-system-incident: core_version=$core_version"
# Maximum number of incidents per day per IP address
# Designed to avoid denial or service attacks
set max_dayily_incidents 3
# -----------------------------------------------------------------
# Lookup user_id or create entry
# -----------------------------------------------------------------
# Keep in mind that the email and other data might be completely fake.
# Check if the user already has an account
set error_user_id [db_string user_id "select user_id from users where email=:error_user_email" -default 0]
if {0 != $error_user_id} {
# The user already exists:
# Make sure there are no more then $max_incidents today from the same IP
# ToDo: Implement !!!
} else {
# Doesn't exist yet - let's create it
set error_user_id [db_nextval user_id_sequence]
# Create a new user and mark it with converted_p=t
db_dml insert_new_user "
INSERT INTO users (
user_id, first_names, last_name, email, url,
registration_date, registration_ip, user_state,
converted_p
) VALUES (
:error_user_id, :error_first_names, :error_last_name, :error_email, :error_url,
sysdate, :error_ip, 'need_admin_approv',
't'
)"
# Add the new user as a potential customer
db_dml mark_new_user_as customer"
INSERT INTO user_group_map
VALUES (:user_id, [im_customer_group_id], 'member',sysdate,1,'0,0,0.0')"
}
# -----------------------------------------------------------------
# Determine the maintenance project for this incident
# -----------------------------------------------------------------
set default_report_group_id [ad_parameter "ErrorReportGroup" "rp" ""]
set report_group_id $default_report_group_id
# -----------------------------------------------------------------
# Create an incident (without mail alert)
# -----------------------------------------------------------------
set topic_id [db_nextval "im_forum_topics_seq"]
set parent_id ""
set owner_id $error_user_id
set scope "group"
set subject $error_url
set message $error_info
set priority 3
set asignee_id ""
set due [db_string tomorrow "select sysdate+1 from dual"]
# 1102 is "Incident"
set topic_type_id 1102
# 1202 is "Open"
set topic_status_id 1202
db_transaction {
db_dml topic_insert "
INSERT INTO im_forum_topics (
topic_id, group_id, parent_id, topic_type_id, topic_status_id,
posting_date, owner_id, scope, subject, message, priority,
asignee_id, due_date
) VALUES (
:topic_id, :report_group_id, :parent_id, :topic_type_id, :topic_status_id,
sysdate, :owner_id, :scope, :subject, :message, :priority,
:asignee_id, :due
)"
} on_error {
ad_return_error "Error adding a new topic" "
<LI>There was an error adding your ticket to our system.<br>
Please send an email to <A href=\"mailto:[ad_parameter "SystemOwner" "" ""]\">
our webmaster</a>, thanks."
}
set page_body "
<H1>Incident Received</H1>
Your incident hast been received.<br>
You will be notified as soon as possible.
"
doc_return 200 text/html [im_return_template]
# www/intranet-forum/forum/new-tind-2.tcl
ad_page_contract {
process a new topic form submission
@param receive_updates:
all, none, major (=issue resolved, task done)
@param actions:
accept, reject, clarify, close
@action_type:
new_message, edit_message, undefined, reply_message
@author fraber@project-open.com
@creation-date 9/2003
} {
action_type
{actions ""}
{comments:trim ""}
owner_id:integer
old_asignee_id:integer
group_id:integer
topic_id:integer
parent_id:integer
{topic_type_id 0}
{topic_status_id 0}
{old_topic_status_id 0}
{scope "pm"}
{subject:trim}
{message:trim}
{priority "5"}
{asignee_id ""}
{due_date:array,date ""}
{receive_updates "major"}
{read_p "f"}
{folder_id "0"}
return_url
{submit_save ""}
{submit_close ""}
{submit_accept ""}
{submit_reject ""}
{submit_clarify ""}
}
# ------------------------------------------------------------------
# Procedures
# ------------------------------------------------------------------
ad_proc -public im_forum_topic_alert_user {
$topic_id
$owner_id
$asignee_id
$topic_status_id
$old_topic_status_id
} {
Returns 1/0 to indicate whether the specific user wants to be
informed about a specific event
} {
return 1
}
# ------------------------------------------------------------------
# Security, Parameters & Default
# ------------------------------------------------------------------
set user_id [ad_maybe_redirect_for_registration]
set user_is_group_member_p [ad_user_group_member $group_id $user_id]
set user_is_group_admin_p [im_can_user_administer_group $group_id $user_id]
set user_is_employee_p [im_user_is_employee_p $user_id]
set exception_text ""
set exception_count 0
if { ![info exists subject] || $subject == "" } {
append exception_text "<li>You must enter a topic name"
incr exception_count
}
if { [info exists subject] && [string match {*\"*} $subject] } {
append exception_text "<li>Your topic name cannot include string quotes. It makes life too difficult for this collection of software."
incr exception_count
}
# check for not null start date
if { [info exists due_date(date) ] } {
set due $due_date(date)
} else {
set due ""
}
if { $exception_count> 0 } {
ad_return_complaint $exception_count $exception_text
return 0
}
# Only incidents and tasks have priority, status, asignees and
# due_dates
#
set task_or_incident_p 0
if {$topic_type_id == 1102 || $topic_type_id == 1104} {
set task_or_incident_p 1
}
if {"" != $comments} {
set user_name [db_string get_user_name [im_name_from_user_id(user_id)]]
set today_date [db_string get_today_date "select sysdate from dual"]
append message "\n\n\[Comment from $user_name on $today_date\]:\n$comments"
}
# ---------------------------------------------------------------------
# Reply to the topic
# ---------------------------------------------------------------------
if {[string equal $actions "reply"]} {
ad_returnredirect "/intranet-forum/forum/new-tind"
}
# ------------------------------------------------------------------
# Save the im_forum_topics record
# ------------------------------------------------------------------
if {[string equal $action_type "new_message"] || [string equal $action_type "reply_message"]} {
# We are creating a new item
db_transaction {
db_dml topic_insert "
insert into im_forum_topics (
topic_id, group_id, parent_id, topic_type_id, topic_status_id,
posting_date, owner_id, scope, subject, message, priority,
asignee_id, due_date
) values (
:topic_id, :group_id, :parent_id, :topic_type_id, :topic_status_id,
sysdate, :owner_id, :scope, :subject, :message, :priority,
:asignee_id, :due
)"
} on_error {
ad_return_error "Error adding a new topic" "
The database rejected the addition of discussion topic
\"$subject\". Here the error message: <pre>$errmsg\n</pre>\n"
}
} else {
# We are modifying an existing item
db_transaction {
db_dml topic_update "
update im_forum_topics set
group_id=:group_id,
parent_id=:parent_id,
topic_type_id=:topic_type_id,
topic_status_id=:topic_status_id,
posting_date=sysdate,
owner_id=:owner_id,
scope=:scope,
subject=:subject,
message=:message,
priority=:priority,
asignee_id=:asignee_id,
due_date=:due
where topic_id=:topic_id"
} on_error {
ad_return_error "Error modifying a topic" "
The database rejected the modification of a of discussion topic
\"$subject\". Here the error message: <pre>$errmsg\n</pre>\n"
}
}
# ---------------------------------------------------------------------
# Save the im_forum_topic_user_map record
# ---------------------------------------------------------------------
# im_forum_topics_user_map may or may not exist for every user.
# So we create a record just in case, even if the SQL fails.
db_transaction {
db_dml im_forum_topic_user_map_insert "
insert into im_forum_topic_user_map
(topic_id, user_id, read_p, folder_id, receive_updates) values
(:topic_id, :user_id, :read_p, :folder_id, :receive_updates)"
} on_error {
# nothing - may already exist...
}
# Now let's update the existing entry
db_transaction {
db_dml im_forum_topic_user_map_update "
update im_forum_topic_user_map set
read_p=:read_p,
folder_id=:folder_id,
receive_updates=:receive_updates
where
topic_id=:topic_id
and user_id=:user_id"
} on_error {
ad_return_error "Error modifying a im_forum_topic_user_map" "
The database rejected the modification of a of discussion topic
\"$subject\". Here the error message: <pre>$errmsg\n</pre>\n"
}
# ---------------------------------------------------------------------
# Alert about asignee_changes
# ---------------------------------------------------------------------
ns_log Notice "new-tind-2: asignee_id=$asignee_id, old_asignee_id=$old_asignee_id"
# Inform the asignee that he has got a new task/incident
#
if {$asignee_id != $old_asignee_id} {
# Always send a mail to a new asignee
#
set msg_url "[ad_parameter SystemUrl]"
append msg_url "/intranet-forum/forum/view?topic_id=$topic_id"
set topic_type [db_string topic_type "select category from categories where category_id=:topic_type_id"]
set msg_subject "New $topic_type: $subject"
im_send_alert $asignee_id "hourly" $msg_url $msg_subject $message
# Inform the owner about the change except if it iss a client
# or if it is someone who
}
# ---------------------------------------------------------------------
# Close the ticket
# ---------------------------------------------------------------------
if {[string equal $actions "close"]} {
# ToDo: Security Check
# Close the existing ticket.
set topic_status_id [im_topic_status_id_closed]
db_transaction {
db_dml topic_close "
update im_forum_topics set topic_status_id = :topic_status_id
where topic_id=:topic_id"
} on_error {
ad_return_error "Error modifying a topic" "
Error closing \"$subject\": <pre>$errmsg\n</pre>\n"
}
# Send a mail to all subscribed users
#
set stakeholder_sql "
select user_id
from im_forum_topic_user_map m
where m.topic_id=:topic_id
and receive_updates <> 'none'
"
db_foreach update_stakeholders $stakeholder_sql {
set msg_url "[ad_parameter SystemUrl]"
append msg_url "/intranet-forum/forum/view?topic_id=$topic_id"
set topic_type [db_string topic_type "select category from categories where category_id=:topic_type_id"]
set msg_subject "Closed $topic_type: $subject"
im_send_alert $asignee_id "hourly" $msg_url $msg_subject $message
}
}
# ---------------------------------------------------------------------
# Accept the ticket
# ---------------------------------------------------------------------
if {[string equal $actions "accept"]} {
# ToDo: Security Check
# Set the status to "accepted"
set topic_status_id [im_topic_status_id_accepted]
db_transaction {
db_dml topic_close "
update im_forum_topics set topic_status_id = :topic_status_id
where topic_id=:topic_id"
} on_error {
ad_return_error "Error modifying a topic" "
Error closing \"$subject\": <pre>$errmsg\n</pre>\n"
}
# Send email notifications only to "all changes".
#
set stakeholder_sql "
select user_id
from im_forum_topic_user_map m
where m.topic_id=:topic_id
and receive_updates='all'
"
db_foreach update_stakeholders $stakeholder_sql {
set msg_url "[ad_parameter SystemUrl]"
append msg_url "/intranet-forum/forum/view?topic_id=$topic_id"
set topic_type [db_string topic_type "select category from categories where category_id=:topic_type_id"]
set msg_subject "Accepted $topic_type: $subject"
im_send_alert $asignee_id "hourly" $msg_url $msg_subject $message
}
}
db_release_unused_handles
ad_returnredirect $return_url
This diff is collapsed.
# /www/intranet/forum/view-tind.tcl
ad_page_contract {
Create a new Task, Incident, News or Discussion (TIND)
@author fraber@project-open.com
@param topic_id: Message to refer to
@param display_style:
topic = full topic (subject+message), no subtopics
thread = complete tree of subjects
topic_thread = full topic plus subtopics subjects
full = topic+all subtopics
@creation-date 9/2003
} {
topic_id:integer
{display_style "all"}
{return_url ""}
}
# -------------- Security, Parameters & Default --------------------------
set user_id [ad_maybe_redirect_for_registration]
set user_is_admin_p [im_is_user_site_wide_or_intranet_admin $user_id]
set user_is_wheel_p [ad_user_group_member [im_wheel_group_id] $user_id]
if {"" == $return_url} {
set return_url [im_url_with_query]
}
set page_title "View Topic"
set context_bar [ad_context_bar [list /intranet/forum/ Forum] $page_title]
# -------------- Get the tree --------------------------
set topic_sql "
select
t.*,
ug.group_name,
tr.indent_level,
(10-tr.indent_level) as colspan_level,
ftc.category as topic_type,
fts.category as topic_status,
ou.first_names||' '||ou.last_name as owner_name,
au.first_names||' '||au.last_name as asignee_name
from
(select
topic_id,
(level-1) as indent_level
from
im_forum_topics t
start with
topic_id=:topic_id
connect by
parent_id = PRIOR topic_id
) tr,
im_forum_topics t,
users ou,
users au,
user_groups ug,
categories ftc,
categories fts
where
tr.topic_id = t.topic_id
and t.owner_id=ou.user_id
and ug.group_id=t.group_id
and t.asignee_id=au.user_id(+)
and t.topic_type_id=ftc.category_id(+)
and t.topic_status_id=fts.category_id(+)
"
# -------------- Setup the outer table with indents-----------------------
append page_body "
<br>
[im_forum_navbar "/intranet/projects/index" [list]]"
# outer table with 10 columns for indenting
append page_body "
<table cellspacing=0 border=0 cellpadding=3>
<tr>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
</tr>
"
# -------------- Render all TIND elements -----------------------
set msg_ctr 1
db_foreach get_topic $topic_sql {
# position table within the outer indent-table
append page_body "<tr>"
if {$indent_level > 0} {
append page_body "<td colspan=$indent_level>&nbsp;</td>"
}
append page_body "
<td colspan=$colspan_level>
<table border=0 cellpadding=0 bgcolor=#E0E0E0>"
if {$msg_ctr == 1} { append page_body "
<tr><td class=rowtitle colspan=2 align=center>
$topic_type</td></tr>"
}
append page_body " [im_forum_render_tind $topic_id $topic_type_id $topic_type $topic_status_id $topic_status $owner_id $asignee_id $owner_name $asignee_name $user_id $group_id $group_name $subject $message $posting_date $due_date $priority $scope]
</table>
</td>
</tr>
"
incr msg_ctr
}
append page_body "</table>\n"
doc_return 200 text/html [im_return_template]
# /www/intranet/forum/index.tcl
# ---------------------------------------------------------------
# Page Contract
# ---------------------------------------------------------------
ad_page_contract {
List all projects with dimensional sliders.
@param order_by project display order
@param include_subprojects_p whether to include sub projects
@param mine_p show my projects or all projects
@param status_id criteria for project status
@param type_id criteria for project_type_id
@param letter criteria for im_first_letter_default_to_a(ug.group_name)
@param start_idx the starting index for query
@param how_many how many rows to return
@author mbryzek@arsdigita.com
@cvs-id index.tcl,v 3.24.2.9 2000/09/22 01:38:44 kevin Exp
} {
{ forum_order_by "Project" }
{ forum_view_name "forum_list_forum" }
{ forum_mine_p "t" }
{ forum_topic_type_id:integer 0 }
{ forum_status_id 0 }
{ forum_group_id:integer 0 }
{ forum_start_idx:integer "1" }
{ forum_how_many 0 }
{ forum_folder 0 }
}
# ---------------------------------------------------------------
# Defaults & Security
# ---------------------------------------------------------------
# User id already verified by filters
set user_id [ad_get_user_id]
set current_user_id $user_id
set view_types [list "t" "Mine" "f" "All"]
set page_title "Forum"
set context_bar [ad_context_bar $page_title]
set page_focus "im_header_form.keywords"
set user_admin_p [im_is_user_site_wide_or_intranet_admin $current_user_id]
set return_url [im_url_with_query]
set current_url [ns_conn url]
# Unprivileged users (clients & freelancers) can only see their
# own projects and no subprojects.
if {![im_permission $current_user_id "view_forum_topics_of_others"]} {
set forum_mine_p "t"
}
if { [empty_string_p $forum_how_many] || $forum_how_many < 1 } {
set forum_how_many [ad_parameter NumberResultsPerPage intranet 100]
}
set end_idx [expr $forum_start_idx + $forum_how_many - 1]
if {[string equal $forum_view_name "forum_list_tasks"]} {
set forum_view_name "forum_list_forum"
# Preselect "Tasks & Incidents"
set forum_topic_type_id 1
}
# ---------------------------------------------------------------
# Define Filter Categories
# ---------------------------------------------------------------
# Forum Topic Types come from a category list, but we need
# some manual extensions...
#
set forum_topic_types [im_memoize_list select_forum_topic_types \
"select * from im_forum_topic_types order by topic_type_id"]
set forum_topic_types [linsert $forum_topic_types 0 1 "Tasks & Incidents"]
set forum_topic_types [linsert $forum_topic_types 0 0 All]
ns_log Notice "/intranet/forum/index: forum_topic_types=$forum_topic_types"
# project_types will be a list of pairs of (project_type_id, project_type)
set project_types [im_memoize_list select_project_types \
"select project_type_id, project_type
from im_project_types
order by lower(project_type)"]
set project_types [linsert $project_types 0 0 All]
# ---------------------------------------------------------------
# Format the Filter
# ---------------------------------------------------------------
# Note that we use a nested table because im_slider might
# return a table with a form in it (if there are too many
# options
set filter_html "
<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td colspan='2' class=rowtitle align=center>Filter Topics</td>
</tr>\n"
if {[im_permission $current_user_id "view_forum_topics_of_others"]} {
append filter_html "
<tr>
<td valign=top>View:</td>
<td valign=top>[im_select forum_mine_p $view_types ""]</td>
</tr>"
}
if {[im_permission $current_user_id "view_forum_topics_of_others"]} {
append filter_html "
<!--
<tr>
<td valign=top>Project Status:</td>
<td valign=top>[im_select status_id $forum_topic_types ""]</td>
</tr>
-->
"
}
append filter_html "
<tr>
<td valign=top>Topic Type:</td>
<td valign=top>
[im_select forum_topic_type_id $forum_topic_types $forum_topic_type_id]
<input type=submit value=Go name=submit>
</td>
</tr>\n"
append filter_html "</table>"
# ---------------------------------------------------------------
# Prepare parameters for the Forum Component
# ---------------------------------------------------------------
# Variables of this page to pass through im_forum_component to maintain the
# current selection and view of the current project
set export_var_list [list forum_group_id forum_start_idx forum_order_by forum_how_many forum_view_name forum_mine_p]
set restrict_to_asignee_id 0
set restrict_to_new_topics 0
set forum_content [im_forum_component $current_user_id $forum_group_id $current_url $return_url $export_var_list $forum_view_name $forum_order_by $forum_mine_p $forum_topic_type_id $forum_status_id $restrict_to_asignee_id $forum_how_many $forum_start_idx $restrict_to_new_topics $forum_folder]
#ad_proc im_forum_component {user_id group_id current_page_url return_url export_var_list {view_name "forum_list_short"} {forum_order_by "priority"} {restrict_to_mine_p f} {restrict_to_topic_type_id 0} {restrict_to_topic_status_id 0} {restrict_to_asignee_id 0} {max_entries_per_page 0} {start_idx 1} {restrict_to_new_topics 0} {restrict_to_folder 0} }
# ---------------------------------------------------------------
# Join all parts together
# ---------------------------------------------------------------
set page_body "
<form method=get action='/index'>
[export_form_vars forum_group_id forum_start_idx forum_order_by forum_how_many forum_view_name]
$filter_html
</form>
[im_forum_navbar "/intranet/projects/index" [list forum_group_id forum_start_idx forum_order_byforum_how_many forum_mine_p forum_view_name]]
$forum_content
"
db_release_unused_handles
doc_return 200 text/html [im_return_template]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment