00001 <?php
00002 # This file is part of the Savane project
00003 # <http://gna.org/projects/savane/>
00004 #
00005 # $Id: project_home.php 5420 2006-02-17 22:15:58Z toddy $
00006 #
00007 # Copyright 1999-2000 (c) The SourceForge Crew
00008 # Copyright 2000-2003 (c) Free Software Foundation
00009 #
00010 # Copyright 2002-2005 (c) Mathieu Roy <yeupou--gnu.org>
00011 # Yves Perrin <yves.perrin--cern.ch>
00012 #
00013 # The Savane project is free software; you can redistribute it and/or
00014 # modify it under the terms of the GNU General Public License
00015 # as published by the Free Software Foundation; either version 2
00016 # of the License, or (at your option) any later version.
00017 #
00018 # The Savane project is distributed in the hope that it will be useful,
00019 # but WITHOUT ANY WARRANTY; without even the implied warranty of
00020 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00021 # GNU General Public License for more details.
00022 #
00023 # You should have received a copy of the GNU General Public License
00024 # along with the Savane project; if not, write to the Free Software
00025 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
00026
00027 require_directory("people");
00028 require_directory("news");
00029 require_directory("stats");
00030 require $GLOBALS['sys_www_topdir']."/include/vars.php";
00031
00032
00033 # if we are at wrong url, redirect
00034 if (strcasecmp($HTTP_HOST, $project->getTypeBaseHost()) != 0 && $project->getTypeBaseHost())
00035 {
00036 header ("Location: http".(session_issecure()?'s':'')."://".$project->getTypeBaseHost().$PHP_SELF);
00037 exit;
00038 }
00039
00040 $group_name = $project->getUnixName();
00041
00042 site_project_header(array());
00043
00044 # ########################### Members of this project
00045 # (little box on the right)
00046
00047 $res_admin = db_query("SELECT user.user_id AS user_id,user.user_name AS user_name, user.realname AS realname "
00048 . "FROM user,user_group "
00049 . "WHERE user_group.user_id=user.user_id AND user_group.group_id=$group_id AND "
00050 . "user_group.admin_flags = 'A'");
00051
00052
00053 print '
00054 <div class="indexright">
00055 ';
00056
00057 print $HTML->box_top(_("Membership Info"));
00058 print '<span class="smaller">';
00059 $adminsnum = db_numrows($res_admin);
00060 $j = 0;
00061 if ($adminsnum > 0)
00062 {
00063 print ngettext("Project Admin:", "Project Admins:", $adminsnum);
00064 while ($row_admin = db_fetch_array($res_admin))
00065 {
00066 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00067 print " - ".utils_link($GLOBALS['sys_home']."users/".$row_admin[user_name], $row_admin[realname]);
00068 }
00069 }
00070
00071 #count of developers on this project
00072 $membersnum = db_fetch_array(db_query("SELECT COUNT(*) AS count FROM user_group WHERE group_id=$group_id AND admin_flags<>'P'"));
00073 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00074 printf(ngettext("%s member", "%s members", $membersnum[count]),'<strong>'.$membersnum[count].'</strong>');
00075
00076 # if member = 1, it's obviously (or it should be) the project admin
00077 # if there's no admin, we need to get access to the list
00078 # But we show it anyway: this page can be used for request for membership,
00079 # provide more info that the little infobox.
00080 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00081 print '['.utils_link($GLOBALS['sys_home'].'project/memberlist.php?group='.$group_name, _("View Members")).']</span>'; # [ and ] are cosmetics, not supposed to be affected by any translation
00082
00083 print $HTML->box_bottom();
00084 print '<br />
00085 ';
00086 print $HTML->box_top(_("Group identification"));
00087 print '<span class="smaller">';
00088 print _("Id:").' <strong>#'.$group_id.'</strong>';
00089 $j = 0;
00090 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00091 print _("System Name:").' <strong>'.$group_name.'</strong>';
00092 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00093 print _("Name:").' <strong>'.$project->GetName().'</strong>';
00094 print '</span></div><div class="'.utils_get_alt_row_color($j++).'"><span class="smaller">';
00095 print _("Group Type:").' <strong>'.$project->getTypeName().'</strong>';
00096 print '</span>';
00097 print $HTML->box_bottom();
00098 print '<br />
00099 ';
00100
00101
00102 # As all projects use the cookbook, this is accurate is all cases
00103 print $HTML->box_top(_("Search in this Group"));
00104 print '<span class="smaller">';
00105 print search_box('','');
00106 print '</span>';
00107 print $HTML->box_bottom();
00108
00109 print '
00110 </div><!-- end indexright -->
00111 <div class="indexcenter">
00112 ';
00113
00114
00115 # ########################### General Informations
00116
00117 if ($project->getTypeDescription())
00118 { print utils_rich_markup($project->getTypeDescription()); }
00119
00120 if ($project->getLongDescription())
00121 {
00122 print utils_full_markup($project->getLongDescription());
00123 }
00124 else
00125 {
00126 if ($project->getDescription())
00127 {
00128 print utils_basic_markup($project->getDescription());
00129 }
00130 else
00131 {
00132 print '<p>';
00133 printf(_("This project has not yet submitted a short description. You can %ssubmit it%s now."), '<a href="'.$GLOBALS['sys_home'].'project/admin/editgroupinfo.php?group='.$group_name.'">', '</a>');
00134 print "</p>\n";
00135 }
00136 }
00137
00138 print '<p>'._("Registration Date")._(": ").' '.format_date($sys_datefmt,$project->getStartDate())."\n";
00139
00140 if ($project->CanUse("license"))
00141 {
00142 $license = $project->getLicense();
00143 print '<br />'._("License")._(": ").' ';
00144 if ($LICENSE_URL[$license] != "0") {
00145 print utils_link($LICENSE_URL[$license], $LICENSE[$license]);
00146 } else {
00147 print $LICENSE[$license];
00148 if ($license == "other") {
00149 print $project->getLicense_other();
00150 }
00151 }
00152 }
00153
00154
00155 if ($project->CanUse("devel_status"))
00156 {
00157 $devel_status = $project->getDevelStatus();
00158 print '<br />'._("Development Status")._(": ").' '.$DEVEL_STATUS[$devel_status]."\n";
00159 }
00160 print '</p>
00161 </div><!-- end indexcenter -->
00162 <p class="clearr"> </p>
00163 ';
00164
00165 # ############################## ###########################
00166 # #######################################################################
00167 # ############################## ###########################
00168 # #######################################################################
00169
00170 # ########################### News
00171
00172 if ($project->Uses("news")) {
00173
00174 print '
00175 <div class="splitright">';
00176
00177 print $HTML->box_top(_("Latest News"));
00178 print news_show_latest($group_id,4,"true");
00179 print $HTML->box_bottom();
00180
00181 print '
00182 </div><!-- end splitright -->
00183 <div class="splitleft">
00184 ';
00185
00186 }
00187
00188 # ############################## ADMIN AREA ###########################
00189 # #######################################################################
00190
00191 if ($GLOBALS[sys_group_id] == $group_id)
00192 {
00193 if (member_check(0, $group_id, 'A'))
00194 {
00195 require $GLOBALS['sys_www_topdir']."/include/features_boxes.php";
00196 print $HTML->box_top(sprintf(_("Administration: %s server"), $GLOBALS['sys_name']));
00197 print '<div class="justify">'.sprintf(_("Since you are administrator of this project, which one is the \"system project\", you are administrator of the whole %s server."), $GLOBALS['sys_name']).'</div>';
00198
00199 print $HTML->box_nextitem(utils_get_alt_row_color($i));
00200
00201 print utils_link($GLOBALS['sys_home'].'admin/',
00202 html_image("admin.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Server Admin"))).' '._("Server Main Administration Page"));
00203
00204 print $HTML->box_nextitem(utils_get_alt_row_color($i+1));
00205
00206 print utils_link($GLOBALS['sys_home'].'task/?group='.$GLOBALS['sys_unix_group_name'].'&category_id=1&status_id=1&set=custom',
00207 html_image("admin.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Server Admin"))).' '._("Pending Projects List"));
00208 $registration_count = number_format(stats_getprojects_pending());
00209 print " (";
00210 printf(ngettext("%s registration pending", "%s registrations pending", $registration_count), "<strong>$registration_count</strong>");
00211 print ")";
00212 print $HTML->box_bottom();
00213 print '<br />';
00214 }
00215 }
00216
00217 if (member_check(0, $group_id, 'A'))
00218 {
00219 print $HTML->box_top(sprintf(_("Administration: %s project"), $project->getName()));
00220 print '<div class="justify">'._("As administrator of this project, you can manage members and activate, deactivate and configure your project's tools.").'</div>';
00221
00222 print $HTML->box_nextitem(utils_get_alt_row_color($i));
00223
00224 print utils_link($GLOBALS['sys_home'].'project/admin/?group='.$group_name,
00225 html_image("main.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Admin Page"))).' '._("Project Main Administration Page"));
00226 print $HTML->box_bottom();
00227 print '<br />';
00228 }
00229
00230
00231 # ############################## PUBLIC AREAS ###########################
00232 # #######################################################################
00233
00234 # ################################## QUICK OVERVIEW
00235
00236 function specific_makesep ()
00237 {
00238 # too specific to be general function
00239 global $i, $j, $HTML;
00240 if ($i != $j)
00241 {
00242 print $HTML->box_nextitem(utils_get_alt_row_color($i));
00243 $j = $i;
00244 }
00245 }
00246
00247 print $HTML->box_top(_("Public Areas: Quick Overview"));
00248 $i = 1;
00249 $j = $i;
00250
00251 # Homepage Link
00252 if ($project->Uses("homepage"))
00253 {
00254 print utils_link($project->getUrl("homepage"),
00255 html_image("www.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Homepage"))).' '._("Project Homepage"));
00256 $i++;
00257 }
00258
00259 # Cookbook Documentation (internal)
00260 # Projects dont have the choice to use it, as there maybe site recipe that
00261 # applies to features they use.
00262 # FIXME: this should print the number of recipes available
00263 specific_makesep();
00264 print utils_link($project->getArtifactUrl("cookbook"),
00265 html_image("man.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Cookbook"))).' '._("Cookbook"));
00266 $i++;
00267
00268 # Documentation (extra link)
00269 if ($project->Uses("extralink_documentation"))
00270 {
00271 specific_makesep();
00272
00273 print utils_link($project->getUrl("extralink_documentation"),
00274 html_image("man.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Other Documentation"))).' '._("Other Documentation"));
00275 $i++;
00276 }
00277
00278 # Download area
00279 if($project->Uses("download")) {
00280 specific_makesep();
00281
00282 # the pointer is always the filelist, this page will handle redirect
00283 # appropriately in case that no download area is here
00284 print utils_link($project->getArtifactUrl("files"),
00285 html_image("download.png",array('width'=>'24', 'height'=>'24', 'alt'=>'Filelist')).' '._("Filelist (Download area)"));
00286 $i++;
00287 }
00288
00289 # Memberlist
00290 specific_makesep();
00291 print utils_link($GLOBALS['sys_home'].'project/memberlist.php?group='.$group_name,
00292 html_image("people.png",array('width'=>'24', 'height'=>'24', 'alt'=>'Memberlist')).' '._("Project Memberlist"));
00293 print " (";
00294 printf(ngettext("%s member", "%s members", $membersnum[count]), "<strong>$membersnum[count]</strong>");
00295 print ")";
00296 $i++;
00297
00298 if ($project->getGPGKeyring())
00299 {
00300 specific_makesep();
00301 print utils_link($GLOBALS['sys_home'].'project/memberlist-gpgkeys.php?group='.$group_name,
00302 html_image("keys.png",array('width'=>'24', 'height'=>'24', 'alt'=>'GPG Keyring')).' '._("Project Members GPG Keyring"));
00303 $i++;
00304
00305 }
00306
00307
00308 print $HTML->box_bottom();
00309 print '<br />';
00310
00311
00312 # ################################## COMMUNICATION
00313
00314 if ($GLOBALS[sys_unix_group_name] == $group_name ||
00315 $project->Uses("support") ||
00316 $project->Uses("forum") ||
00317 $project->usesMail() ||
00318 people_project_jobs_rows($group_id) != 0)
00319 {
00320
00321 print $HTML->box_top(_("Public Areas: Communication Tools"));
00322 $i = 1;
00323 $j = $i;
00324
00325 # Support Manager
00326
00327 if ($project->Uses("support")) {
00328 specific_makesep();
00329 $url = $project->getArtifactUrl("support");
00330
00331 print utils_link($url,
00332 html_image("help.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Tech Support Manager"))).' '._("Tech Support Manager"));
00333
00334 if (group_get_artifact_url("support", 0) == $url)
00335 {
00336
00337 $res_count = db_query("SELECT count(*) AS count FROM support WHERE group_id=$group_id AND status_id != 3");
00338 $row_count = db_fetch_array($res_count);
00339
00340
00341 print " (";
00342 printf(ngettext("%s open request", "%s open requests", $row_count[count]), "<strong>$row_count[count]</strong>");
00343 $res_count = db_query("SELECT count(*) AS count FROM support WHERE group_id=$group_id");
00344 $row_count = db_fetch_array($res_count);
00345 print ', ';
00346 printf(ngettext("%s total", "%s total", $row_count[count]), "<strong>$row_count[count]</strong>");
00347 print ")\n";
00348
00349 print '<br /> - '.utils_link($url.'&func=additem', _("Submit a Request"), 0, group_restrictions_check($group_id, "support"));
00350 print '<br /> - '.utils_link($url.'&func=browse&set=open', _("Browse Open Requests"));
00351 }
00352
00353 $i++;
00354 }
00355
00356
00357 # Fora
00358 # Could be reactivated on Savannah.
00359
00360 if ($project->Uses("forum")) {
00361 specific_makesep();
00362
00363 $url = $project->getArtifactUrl("forum");
00364
00365 print utils_link($url,
00366 html_image("help.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Public Forum"))).' '._("Public Forum"));
00367
00368 if (group_get_artifact_url("forum", 0) == $url)
00369 {
00370
00371 $res_count = db_query("SELECT count(forum.msg_id) AS count FROM forum,forum_group_list WHERE "
00372 . "forum_group_list.group_id=$group_id AND forum.group_forum_id=forum_group_list.group_forum_id "
00373 . "AND forum_group_list.is_public=1");
00374 $row_count = db_fetch_array($res_count);
00375 print " (";
00376 printf(ngettext("%s message in", "%s messages in", $row_count[count]), "<strong>$row_count[count]</strong>");
00377
00378 $res_count = db_query("SELECT count(*) AS count FROM forum_group_list WHERE group_id=$group_id "
00379 . "AND is_public=1");
00380 $row_count = db_fetch_array($res_count);
00381
00382 print " ";
00383 printf(ngettext("%s forum", "%s forums", $row_count[count]), "<strong>$row_count[count]</strong>");
00384 print ")\n";
00385 }
00386 $i++;
00387
00388 }
00389
00390 # Mailing lists
00391
00392 if ($project->usesMail())
00393 {
00394 specific_makesep();
00395 $url = $project->getArtifactUrl("mail");
00396
00397 print utils_link($url,
00398 html_image("mail.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Mailing Lists"))).' '._("Mailing Lists"));
00399 $res_count = db_query("SELECT count(*) AS count FROM mail_group_list WHERE group_id=$group_id AND is_public=1");
00400 $row_count = db_fetch_array($res_count);
00401 print " (";
00402 printf(ngettext("%s public mailing-list", "%s public mailing-lists", $row_count[count]), "<strong>$row_count[count]</strong>");
00403 print ")";
00404
00405 $i++;
00406 }
00407
00408 # Looking for people
00409
00410 if (people_project_jobs_rows($group_id) != 0) {
00411 specific_makesep();
00412 print utils_link($GLOBALS['sys_home'].'people/?group='.$group_name,
00413 html_image("people.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("People"))).' '._("This project is looking for people"));
00414
00415 $job_count = people_project_jobs_rows($group_id);
00416
00417 print " (";
00418 printf(ngettext("%s contributor wanted", "%s contributors wanted", $job_count), "<strong>$job_count</strong>");
00419 print ")";
00420 $i++;
00421 }
00422
00423 print $HTML->box_bottom();
00424 print '<br />';
00425 }
00426
00427 # ################################## DEVELOPMENT
00428
00429 if ($project->Uses("patch") ||
00430 $project->Uses("cvs") ||
00431 $project->Uses("homepage") ||
00432 $project->Uses("bugs") ||
00433 $project->Uses("task") ||
00434 $project->Uses("patch"))
00435 {
00436 print $HTML->box_top(_("Public Areas: Development Tools"));
00437 $i = 1;
00438 $j = $i;
00439
00440 # SCMs
00441 # - check if the SCM is selected by the project
00442 # - check if the SCM is the default SCM, if the project use the standard
00443 # webpage
00444 if ($project->Uses("cvs") || $project->UsesForHomepage("cvs"))
00445 {
00446
00447 $url = $project->getArtifactUrl("cvs");
00448
00449 html_image("cvs.png",array('width'=>'24', 'height'=>'24', 'alt'=>'CVS'));
00450 print ' <a href="'.$url.'">'._("Source Code Manager: CVS Repository").'</a>';
00451 if ($project->Uses("cvs") && $project->getUrl("cvs_viewcvs") != 'http:
00452 {
00453 print '<br /> - <a href="'.$project->getUrl("cvs_viewcvs").'">'._("Browse Sources Repository").'</a>';
00454 }
00455 if ($project->UsesForHomepage("cvs") && $project->getUrl("cvs_viewcvs_homepage") != 'http:
00456 {
00457 print '<br /> - <a href="'.$project->getUrl("cvs_viewcvs_homepage").'">'._("Browse Web Pages Repository").'</a>';
00458 }
00459 $i++;
00460 }
00461
00462 if ($project->Uses("arch") || $project->UsesForHomepage("arch"))
00463 {
00464 specific_makesep();
00465 $url = $project->getArtifactUrl("arch");
00466
00467 html_image("cvs.png",array('width'=>'24', 'height'=>'24', 'alt'=>'Arch'));
00468 print ' <a href="'.$url.'">'._("Source Code Manager: GNU Arch Repository").'</a>';
00469
00470 if ($project->Uses("arch") && $project->getUrl("arch_viewcvs") != 'http:
00471 {
00472 print '<br /> - <a href="'.$project->getUrl("arch_viewcvs").'">'._("Browse Sources Repository").'</a>';
00473 }
00474 if ($project->UsesForHomepage("arch") && $project->getUrl("cvs_viewcvs_homepage") != 'http:
00475 {
00476 print '<br /> - <a href="'.$project->getUrl("cvs_viewcvs_homepage").'">'._("Browse Web Pages Repository").'</a>';
00477 }
00478 $i++;
00479 }
00480
00481 if ($project->Uses("svn") || $project->UsesForHomepage("svn"))
00482 {
00483 specific_makesep();
00484 $url = $project->getArtifactUrl("svn");
00485
00486 html_image("cvs.png",array('width'=>'24', 'height'=>'24', 'alt'=>'Arch'));
00487 print ' <a href="'.$url.'">'._("Source Code Manager: Subversion Repository").'</a>';
00488
00489 if ($project->Uses("svn") && $project->getUrl("svn_viewcvs") != 'http:
00490 {
00491 print '<br /> - <a href="'.$project->getUrl("svn_viewcvs").'">'._("Browse Sources Repository").'</a>';
00492 }
00493 if ($project->UsesForHomepage("svn") && $project->getUrl("cvs_viewcvs_homepage") != 'http:
00494 {
00495 print '<br /> - <a href="'.$project->getUrl("cvs_viewcvs_homepage").'">'._("Browse Web Pages Repository").'</a>';
00496 }
00497 $i++;
00498 }
00499
00500
00501
00502 # Bug tracking
00503
00504 if ($project->Uses("bugs")) {
00505 specific_makesep();
00506 $url = $project->getArtifactUrl("bugs");
00507
00508 print utils_link($url,
00509 html_image("bug.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Bug Tracking"))).' '._("Bug Tracker"));
00510
00511 if (group_get_artifact_url("bugs", 0) == $url)
00512 {
00513
00514 $res_count = db_query("SELECT count(*) AS count FROM bugs WHERE group_id=$group_id AND status_id != 3");
00515 $row_count = db_fetch_array($res_count);
00516
00517 print " (";
00518 printf(ngettext("%s open bug", "%s open bugs", $row_count[count]), "<strong>$row_count[count]</strong>");
00519 $res_count = db_query("SELECT count(*) AS count FROM bugs WHERE group_id=$group_id");
00520 $row_count = db_fetch_array($res_count);
00521 print ', ';
00522 printf(ngettext("%s total", "%s total", $row_count[count]), "<strong>$row_count[count]</strong>");
00523 print ")\n";
00524
00525 print '<br /> - '.utils_link($url.'&func=additem', _("Submit a Bug"), 0, group_restrictions_check($group_id, "bugs"));
00526 print '<br /> - '.utils_link($url.'&func=browse&set=open', _("Browse Open Bugs"));
00527 }
00528 $i++;
00529 }
00530
00531
00532 # Task Manager
00533
00534 if ($project->Uses("task")) {
00535 specific_makesep();
00536 $url = $project->getArtifactUrl("task");
00537
00538 print utils_link($url,
00539 html_image("task.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Task Manager"))).' '._("Task Manager"));
00540
00541 if (group_get_artifact_url("task", 0) == $url)
00542 {
00543
00544 $res_count = db_query("SELECT count(*) AS count FROM task WHERE group_id=$group_id AND status_id != 3");
00545 $row_count = db_fetch_array($res_count);
00546
00547 print " (";
00548 printf(ngettext("%s open task", "%s open tasks", $row_count[count]), "<strong>$row_count[count]</strong>");
00549 $res_count = db_query("SELECT count(*) AS count FROM task WHERE group_id=$group_id");
00550 $row_count = db_fetch_array($res_count);
00551 print ', ';
00552 printf(ngettext("%s total", "%s total", $row_count[count]), "<strong>$row_count[count]</strong>");
00553 print ")\n";
00554
00555 print '<br /> - '.utils_link($url.'&func=additem', _("Submit a Task"), 0, group_restrictions_check($group_id, "task"));
00556 print '<br /> - '.utils_link($url.'&func=browse&set=open', _("Browse Open Tasks"));
00557 }
00558 $i++;
00559 }
00560
00561
00562 # Patch Manager
00563
00564 if ($project->Uses("patch")) {
00565 specific_makesep();
00566 $url = $project->getArtifactUrl("patch");
00567
00568 print utils_link($url,
00569 html_image("patch.png",array('width'=>'24', 'height'=>'24', 'alt'=>_("Patch Manager"))).' '._("Patch Manager"));
00570
00571
00572 if (group_get_artifact_url("patch", 0) == $url)
00573 {
00574 $res_count = db_query("SELECT count(*) AS count FROM patch WHERE group_id=$group_id AND status_id != 3");
00575 $row_count = db_fetch_array($res_count);
00576
00577 print " (";
00578 printf(ngettext("%s open patch", "%s open patches", $row_count[count]), "<strong>$row_count[count]</strong>");
00579 $res_count = db_query("SELECT count(*) AS count FROM patch WHERE group_id=$group_id");
00580 $row_count = db_fetch_array($res_count);
00581 print ', ';
00582 printf(ngettext("%s total", "%s total", $row_count[count]), "<strong>$row_count[count]</strong>");
00583 print ")\n";
00584
00585 print '<br /> - '.utils_link($url.'&func=additem', _("Submit a Patch"), 0, group_restrictions_check($group_id, "patch"));
00586 print '<br /> - '.utils_link($url.'&func=browse&set=open', _("Browse Open Patches"));
00587 }
00588 $i++;
00589 }
00590
00591 print $HTML->box_bottom();
00592 }
00593
00594
00595 # ########################### News
00596
00597 if ($project->Uses("news")) {
00598 print '
00599 </div><!-- end splitleft -->
00600 ';
00601 }
00602
00603
00604 site_project_footer(array());
00605
00606 ?>