6 * SourceForge: Breaking Down the Barriers to Open Source Development
7 * Copyright 1999-2001 (c) VA Linux Systems
8 * http://sourceforge.net
12 require_once $gfwww.'news/news_utils.php';
13 require_once $gfwww.'include/trove.php';
14 require_once $gfwww.'include/project_summary.php';
15 require_once $gfcommon.'include/tag_cloud.php';
17 $title = _('Project Info');
19 site_project_header(array('title'=>$title,'group'=>$group_id,'toptab'=>'home'));
22 // ########################################### end top area
25 // Embedd some RDFa to describe the project using DOAP and SIOC
27 <div id="forge-project-home" class="underline-link">
29 <div about="" typeof="sioc:Space doap:Project" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:doap="http://usefulinc.com/ns/doap#" />
31 <table id="project-summary-and-devs" class="my-layout-table" summary="">
34 <h2><span property="doap:shortdesc">'.$project->getPublicName().'</span></h2>
35 <h3>'._('Project summary').'</h3>';
38 // ########################################## top area, not in box
40 $res_admin = db_query_params ('SELECT users.user_id,users.user_name,users.realname,user_group.admin_flags
42 WHERE user_group.user_id=users.user_id
43 AND user_group.group_id=$1
45 ORDER BY admin_flags DESC,realname',
49 if ($project->getStatus() == 'H') {
50 print "<p>".sprintf(_('NOTE: This project entry is maintained by the %1$s staff. We are not the official site for this product. Additional copyright information may be found on this project\'s homepage.'), forge_get_config ('forge_name'))."</p>\n";
53 $hook_params = array () ;
54 $hook_params['group_id'] = $group_id ;
55 plugin_hook ("project_before_description",$hook_params) ;
57 // insert an empty <span /> which seems to be better if not compacted
58 print '<span property="doap:name" content="'. $project->getUnixName() .'"></span>'."\n";
59 // print '<span property="coclico:hosted_by">' ...
60 //print '<div property="sioc:has_container" xmlns:sioc="http://rdfs.org/sioc/ns#" content="fusionforge:ForgeProjects" xmlns:fusionforge="http://fusionforge.org/fusionforge#">';
62 $project_description = $project->getDescription();
63 if ($project_description) {
64 // need to use a litteral version for content attribute since nl2br is for HTML
66 .'<span property="doap:description" content="'. preg_quote($project_description,'"') .'">'
67 . nl2br($project_description)
70 print "<p>" . _('This project has not yet submitted a description.') . '</p>';
76 if ($GLOBALS['sys_use_project_tags']) {
77 $list_tag = list_project_tag($group_id);
79 print '<p>' . _('Tags').': '. $list_tag . '</p>';
82 $project =& group_get_object($group_id);
83 $perm =& $project->getPermission(session_get_user());
84 if ($perm->isAdmin()) {
85 print '<p><a href="/project/admin/editgroupinfo.php?group_id=' . $group_id . '" >' . _('No tag defined for this project') . '</a>.</p>';
88 print '<p>' . _('No tag defined for this project') . '</p>';
93 if($GLOBALS['sys_use_trove']) {
95 print stripslashes(trove_getcatlisting($group_id,0,1,1));
99 $project_start_date = $project->getStartDate();
100 print(_('Registered: ') .
101 '<span property="doap:created" content="'.date('Y-m-d', $project_start_date).'">'.
102 date(_('Y-m-d H:i'), $project_start_date).
105 // Get the activity percentile
106 // CB hide stats if desired
107 if ($project->usesStats()) {
108 $actv = db_query_params ('SELECT ranking FROM project_weekly_metric WHERE group_id=$1',
110 $actv_res = db_result($actv,0,"ranking");
114 print '<br />'.sprintf (_('Activity Ranking: %d'), $actv_res) ;
115 print '<br />'.sprintf(_('View project <a href="%1$s" >Statistics</a>'),util_make_url ('/project/stats/?group_id='.$group_id));
116 if ( ($project->usesTracker() && $GLOBALS['sys_use_tracker']) || ($project->usesPm() && $GLOBALS['sys_use_pm']) ) {
117 print sprintf(_(' or <a href="%1$s">Activity</a>'),util_make_url ('/project/report/?group_id='.$group_id));
119 print '<br />'.sprintf(_('View list of <a href="%1$s">RSS feeds</a> available for this project.'), util_make_url ('/export/rss_project.php?group_id='.$group_id)). ' ' . html_image('ic/rss.png',16,16,array());
122 if($GLOBALS['sys_use_people']) {
123 $jobs_res = db_query_params ('SELECT name
124 FROM people_job,people_job_category
125 WHERE people_job.category_id=people_job_category.category_id
126 AND people_job.status_id=1
132 $num=db_numrows($jobs_res);
134 print '<br /><br />';
136 ngettext('HELP WANTED: This project is looking for a <a href="%1$s">"%2$s"</a>.',
137 'HELP WANTED: This project is looking for people to fill <a href="%1$s">several different positions</a>.',
139 util_make_url ('/people/?group_id='.$group_id),
140 db_result($jobs_res,0,"name"));
141 //print '<div rel="fusionforge:has_job" typeof="fusionforge:Job" xmlns:fusionforge="http://fusionforge.org/fusionforge#">';
142 //print '<span rel="dc:title" content="'. db_result($jobs_res,0,"name").'" xmlns:dc="http://purl.org/dc/elements/1.1/">';
145 //end of job description part
151 $hook_params = array () ;
152 $hook_params['group_id'] = $group_id ;
153 plugin_hook ("project_after_description",$hook_params) ;
157 // ########################### Developers on this project
160 echo $HTML->boxTop(_('Project Members'), 'Project_Members');
162 $iam_member = false ;
164 if (db_numrows($res_admin) > 0) {
166 echo '<span class="develtitle">'._('Project Admins').'</span><br />';
167 $started_developers = false;
168 while ($row_admin = db_fetch_array($res_admin)) {
169 if (trim($row_admin['admin_flags']) != 'A' && !$started_developers) {
170 $started_developers=true;
171 echo '<span class="develtitle">'. _('Developers').':</span><br />';
173 if (!$started_developers) {
174 echo '<div rel="doap:maintainer">'."\n";
176 echo '<div rel="doap:developer">'."\n";
178 # a foaf:Person that holds an account on the forge
179 $developer_url = util_make_url_u ($row_admin['user_name'],$row_admin['user_id']);
180 echo '<div typeof="foaf:Person" xmlns:foaf="http://xmlns.com/foaf/0.1/" about="'.
181 $developer_url.'#me' .'" >'."\n";
182 echo '<div rel="foaf:account">'."\n";
183 echo '<div typeof="sioc:UserAccount" about="'.
185 '" xmlns:sioc="http://rdfs.org/sioc/ns#">'."\n";
186 echo util_make_link_u ($row_admin['user_name'],$row_admin['user_id'],$row_admin['realname']) ."<br />\n";
187 echo "</div>\n"; // /sioc:UserAccount
188 echo "</div>\n"; // /foaf:holdsAccount
189 echo "</div>\n"; // /foaf:Person
190 echo "</div>\n"; // /doap:maintainer|developer
191 if ($row_admin['user_id'] == user_getid())
197 $members = $project->getUsers();
198 echo '<p><span rel="sioc:has_usergroup" xmlns:sioc="http://rdfs.org/sioc/ns#">';
199 echo '<div about="members/" typeof="sioc:UserGroup">';
200 echo '<span rel="http://www.w3.org/2002/07/owl#sameAs">';
201 echo util_make_link ('/project/memberlist.php?group_id='.$group_id,sprintf(_('View the %1$d Member(s)'),count($members)));
205 // end of project usergroup description
208 echo '<p>'.util_make_link ('/project/request.php?group_id='.$group_id,_('Request to join')).'</p>';
210 echo $HTML->boxBottom();
212 echo '</td></tr></table>';
213 $hook_params = array () ;
214 $hook_params['group_id'] = $group_id ;
215 plugin_hook ("project_before_frs",$hook_params) ;
216 echo '<div id="file-releases">';
218 // ############################# File Releases
220 // CB hide FRS if desired
221 if ($project->usesFRS()) {
222 echo $HTML->boxTop(_('Latest File Releases'), 'Latest_File_Releases');
223 $unix_group_name = $project->getUnixName();
226 <table summary="Latest file releases" class="width-100p100">
227 <tr class="table-header">
228 <th class="align-left" scope="col">
249 // Members of projects can see all packages
250 // Non-members can only see public packages
252 $public_required = 1;
253 if (session_loggedin() &&
254 (user_ismember($group_id) || user_ismember(1,'A'))) {
255 $public_required = 0 ;
258 $res_files = db_query_params ('SELECT frs_package.package_id,frs_package.name AS package_name,frs_release.name AS release_name,frs_release.release_id AS release_id,frs_release.release_date AS release_date
259 FROM frs_package,frs_release
260 WHERE frs_package.package_id=frs_release.package_id
261 AND frs_package.group_id=$1
262 AND frs_release.status_id=1
263 AND (frs_package.is_public=1 OR 1 != $2)
264 ORDER BY frs_package.package_id,frs_release.release_date DESC',
267 $rows_files=db_numrows($res_files);
268 if (!$res_files || $rows_files < 1) {
271 echo '<tr><td colspan="6"><strong>'._('This Project Has Not Released Any Files').'</strong></td></tr>';
275 This query actually contains ALL releases of all packages
276 We will test each row and make sure the package has changed before printing the row
278 for ($f=0; $f<$rows_files; $f++) {
279 if (db_result($res_files,$f,'package_id')==db_result($res_files,($f-1),'package_id')) {
280 //same package as last iteration - don't show this release
282 $rel_date = getdate (db_result ($res_files, $f, 'release_date'));
283 $package_name = db_result($res_files, $f, 'package_name');
284 $package_release = db_result($res_files,$f,'release_name');
286 <tr class="align-center">
287 <td class="align-left">
288 <strong>' . $package_name . '</strong>
290 // Releases to display
291 //print '<div about="" xmlns:sioc="http://rdfs.org/sioc/ns#" rel="container_of" resource="'.util_make_link ('/frs/?group_id=' . $group_id . '&release_id=' . db_result($res_files,$f,'release_id').'">';
297 . $rel_date["month"] . ' ' . $rel_date["mday"] . ', ' . $rel_date["year"] .
299 <td class="align-center">';
303 // accessibility: image is a link, so alt must be unique in page => construct a unique alt
304 $tmp_alt = $package_name . " - " . _('Release Notes');
305 $link = '/frs/shownotes.php?group_id=' . $group_id . '&release_id=' . db_result($res_files, $f, 'release_id');
306 $link_content = $HTML->getReleaseNotesPic($tmp_alt, $tmp_alt);
307 echo util_make_link ($link, $link_content);
309 <td class="align-center">';
312 $tmp_alt = $package_name . " - " . _('Monitor this package');
313 $link = '/frs/monitor.php?filemodule_id=' . db_result($res_files,$f,'package_id') . '&group_id='.$group_id.'&start=1';
314 $link_content = $HTML->getMonitorPic($tmp_alt, $tmp_alt);
315 echo util_make_link ($link, $link_content);
317 <td class="align-center">';
320 $tmp_alt = $package_name." ".$package_release." - ". _('Download');
321 $link_content = $HTML->getDownloadPic($tmp_alt, $tmp_alt);
322 $t_link_anchor = $HTML->toSlug($package_name)."-".$HTML->toSlug($package_release)."-title-content";
323 $link = '/frs/?group_id=' . $group_id . '&release_id=' . db_result($res_files, $f, 'release_id')."#".$t_link_anchor;
324 echo util_make_link ($link, $link_content);
332 echo '<div class="underline-link">' . util_make_link ('/frs/?group_id='.$group_id, _('View All Project Files')) . '</div>';
334 echo $HTML->boxBottom();
337 echo '</div><!-- id="file-releases" -->' . "\n";
339 $hook_params = array () ;
340 $hook_params['group_id'] = $group_id ;
341 plugin_hook ("project_after_frs",$hook_params) ;
343 // ############################## PUBLIC AREAS
345 echo '<table id="project-public-areas-and-news" class="my-layout-table" summary="">
348 echo $HTML->boxTop(_('Public Areas'), 'Public_Areas');
350 // ################# Homepage Link
352 echo '<div class="public-area-box" rel="doap:homepage">';
353 echo util_make_link ('http://' . $project->getHomePage(), $HTML->getHomePic(_('Home Page')) . ' ' . _('Project Home Page'), false, true);
357 // ################## ArtifactTypes
359 if ($project->usesTracker()) {
360 echo '<div class="public-area-box">';
361 $link_content = $HTML->getFollowPic(_('Tracker')) . ' ' . _('Tracker');
362 echo util_make_link ( '/tracker/?group_id=' . $group_id, $link_content);
364 $result=db_query_params ('SELECT agl.*,aca.count,aca.open_count
365 FROM artifact_group_list agl
366 LEFT JOIN artifact_counts_agg aca USING (group_artifact_id)
367 WHERE agl.group_id=$1
369 ORDER BY group_artifact_id ASC',
372 $rows = db_numrows($result);
374 if (!$result || $rows < 1) {
375 echo '<br /><em>'._('There are no public trackers available').'</em>';
377 echo '<ul class="tracker" rel="doap:bug-database">';
378 for ($j = 0; $j < $rows; $j++) {
379 // tracker REST paths are something like : /tracker/cm/project/A_PROJECT/atid/NUMBER to plan compatibility
380 // with OSLC-CM server API
381 $group_artifact_id = db_result($result, $j, 'group_artifact_id');
382 $tracker_stdzd_uri = util_make_url('/tracker/cm/project/'. $project->getUnixName() .'/atid/'. $group_artifact_id);
383 echo '<li about="'. $tracker_stdzd_uri . '" typeof="sioc:Container" xmlns:sioc="http://rdfs.org/sioc/ns#">'."\n";
384 print '<span rel="http://www.w3.org/2002/07/owl#sameAs">'."\n";
385 echo util_make_link ('/tracker/?atid='. $group_artifact_id . '&group_id='.$group_id.'&func=browse',db_result($result, $j, 'name')) . ' ' ;
386 echo "</span>\n"; // /owl:sameAs
387 printf(ngettext('(<strong>%1$s</strong> open / <strong>%2$s</strong> total)', '(<strong>%1$s</strong> open / <strong>%2$s</strong> total)', (int) db_result($result, $j, 'open_count')), (int) db_result($result, $j, 'open_count'), (int) db_result($result, $j, 'count'));
388 echo '<br />'.db_result($result, $j, 'description');
389 print '<span rel="sioc:has_space" resource="" />'."\n";
397 // ################## forums
399 if ($project->usesForum()) {
400 echo '<div class="public-area-box">';
401 // print '<hr size="1" /><a rel="sioc:container_of" xmlns:sioc="http://rdfs.org/sioc/ns#" href="'.util_make_url ('/forum/?group_id='.$group_id).'">';
402 $link_content = $HTML->getForumPic('') . ' ' . _('Public Forums');
403 echo util_make_link ( '/forum/?group_id=' . $group_id, $link_content);
405 $messages_count = project_get_public_forum_message_count($group_id);
406 $forums_count = project_get_public_forum_count($group_id);
407 printf(ngettext("<strong>%d</strong> message","<strong>%d</strong> messages",$messages_count),$messages_count);
409 printf(ngettext("<strong>%d</strong> forum","<strong>%d</strong> forums",$forums_count),$forums_count);
414 // ##################### Doc Manager
416 if ($project->usesDocman()) {
417 echo '<div class="public-area-box">';
418 $link_content = $HTML->getDocmanPic('') . ' ' . _('DocManager: Project Documentation');
419 // <a rel="sioc:container_of" xmlns:sioc="http://rdfs.org/sioc/ns#" href="'.util_make_url ('/docman/?group_id='.$group_id).'">';
420 print util_make_link( '/docman/?group_id='.$group_id, $link_content);
424 // ##################### Mailing lists
426 if ($project->usesMail()) {
427 echo '<div class="public-area-box">';
428 $link_content = $HTML->getMailPic('') . ' ' . _('Mailing Lists');
429 print util_make_link( '/mail/?group_id='.$group_id, $link_content);
430 $n = project_get_mail_list_count($group_id);
432 printf(ngettext('(<strong>%1$s</strong> public mailing list)', '(<strong>%1$s</strong> public mailing lists)', $n), $n);
436 // ##################### Task Manager
438 if ($project->usesPm()) {
439 echo '<div class="public-area-box">';
440 $link_content = $HTML->getPmPic('') . ' ' . _('Task Manager');
441 print util_make_link( '/pm/?group_id='.$group_id, $link_content);
443 $result = db_query_params ('SELECT * FROM project_group_list WHERE group_id=$1 AND is_public=1',
445 $rows = db_numrows($result);
446 if (!$result || $rows < 1) {
447 echo '<br /><em>'._('There are no public subprojects available').'</em>';
449 echo '<ul class="task-manager">';
450 for ($j = 0; $j < $rows; $j++) {
452 print util_make_link ('/pm/task.php?group_project_id='.db_result($result, $j, 'group_project_id').'&group_id='.$group_id.'&func=browse',db_result($result, $j, 'project_name'));
460 // ######################### Surveys
462 if ($project->usesSurvey()) {
463 echo '<div class="public-area-box">';
464 $link_content = $HTML->getSurveyPic('') . ' ' . _('Surveys');
465 echo util_make_link( '/survey/?group_id='.$group_id, $link_content);
466 echo ' (<strong>'. project_get_survey_count($group_id) .'</strong> ' . _('surveys').')';
470 // ######################### SCM
472 if ($project->usesSCM()) {
473 echo '<div class="public-area-box">';
475 $link_content = $HTML->getScmPic('') . ' ' . _('SCM Repository');
476 // print '<hr size="1" /><a rel="doap:repository" href="'.util_make_url ('/scm/?group_id='.$group_id).'">';
477 print util_make_link( '/scm/?group_id='.$group_id, $link_content);
479 $hook_params = array () ;
480 $hook_params['group_id'] = $group_id ;
481 plugin_hook ("scm_stats", $hook_params) ;
485 // ######################### Plugins
487 $hook_params = array ();
488 $hook_params['group_id'] = $group_id;
489 plugin_hook ("project_public_area", $hook_params);
491 // ######################## AnonFTP
493 // CB hide FTP if desired
494 if ($project->usesFTP()) {
495 if ($project->isActive()) {
496 echo '<div class="public-area-box">';
498 $link_content = $HTML->getFtpPic('') . ' ' . _('Anonymous FTP Space');
499 // print '<a rel="doap:anonymous root" href="ftp://' . $project->getUnixName() . '.' . $GLOBALS['sys_default_domain'] . '/pub/'. $project->getUnixName() .'/">';
500 print util_make_link('ftp://' . $project->getUnixName() . '.' . $GLOBALS['sys_default_domain'] . '/pub/'. $project->getUnixName(), $link_content, false, true);
506 plugin_hook("cal_link_group",$group_id);
507 echo $HTML->boxBottom();
514 if ($project->usesNews()) {
515 // ############################# Latest News
516 echo $HTML->boxTop(_('Latest News'), 'Latest_News');
517 echo news_show_latest($group_id,10,false);
518 echo $HTML->boxBottom();
521 //echo $HTML->boxBottom();
526 </div><!-- about="" -->
527 </div><!-- id="forge-project-home" -->
531 // Linked projects (hierarchy)
534 plugin_hook('project_home_link',$group_id);
536 site_project_footer(array());
540 // c-file-style: "bsd"