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#">
30 <span rel="planetforge:hosted_by" resource="'. util_make_url ('/') .'"></span>
33 <table id="project-summary-and-devs" class="my-layout-table" summary="">
36 <h2><span property="doap:shortdesc">'.$project->getPublicName().'</span></h2>
37 <h3>'._('Project summary').'</h3>';
40 // ########################################## top area, not in box
42 $res_admin = db_query_params ('SELECT users.user_id,users.user_name,users.realname,user_group.admin_flags
44 WHERE user_group.user_id=users.user_id
45 AND user_group.group_id=$1
47 ORDER BY admin_flags DESC,realname',
51 if ($project->getStatus() == 'H') {
52 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";
55 $hook_params = array () ;
56 $hook_params['group_id'] = $group_id ;
57 plugin_hook ("project_before_description",$hook_params) ;
59 // insert an empty <span /> which seems to be better if not compacted
60 print '<span property="doap:name" content="'. $project->getUnixName() .'"></span>'."\n";
61 // print '<span property="coclico:hosted_by">' ...
62 //print '<div property="sioc:has_container" xmlns:sioc="http://rdfs.org/sioc/ns#" content="fusionforge:ForgeProjects" xmlns:fusionforge="http://fusionforge.org/fusionforge#">';
64 // Try to display the blocks description first if active.
65 $pluginManager = plugin_manager_get_object();
66 if (! $pluginManager->PluginIsInstalled('blocks') || !plugin_hook ("blocks", "summary_description")) {
67 $project_description = $project->getDescription();
68 if ($project_description) {
69 // need to use a litteral version for content attribute since nl2br is for HTML
71 .'<span property="doap:description" content="'. preg_quote($project_description,'"') .'">'
72 . nl2br($project_description)
75 print "<p>" . _('This project has not yet submitted a description.') . '</p>';
82 if ($GLOBALS['sys_use_project_tags']) {
83 $list_tag = list_project_tag($group_id);
85 print '<p>' . _('Tags').': '. $list_tag . '</p>';
88 $project =& group_get_object($group_id);
89 $perm =& $project->getPermission(session_get_user());
90 if ($perm->isAdmin()) {
91 print '<p><a href="/project/admin/editgroupinfo.php?group_id=' . $group_id . '" >' . _('No tag defined for this project') . '</a>.</p>';
94 print '<p>' . _('No tag defined for this project') . '</p>';
99 if(forge_get_config('use_trove')) {
101 print stripslashes(trove_getcatlisting($group_id,0,1,1));
105 $project_start_date = $project->getStartDate();
106 print(_('Registered: ') .
107 '<span property="doap:created" content="'.date('Y-m-d', $project_start_date).'">'.
108 date(_('Y-m-d H:i'), $project_start_date).
111 // Get the activity percentile
112 // CB hide stats if desired
113 if ($project->usesStats()) {
114 $actv = db_query_params ('SELECT ranking FROM project_weekly_metric WHERE group_id=$1',
116 $actv_res = db_result($actv,0,"ranking");
120 print '<br />'.sprintf (_('Activity Ranking: %d'), $actv_res) ;
121 print '<br />'.sprintf(_('View project <a href="%1$s" >Statistics</a>'),util_make_url ('/project/stats/?group_id='.$group_id));
122 if ( ($project->usesTracker() && forge_get_config('use_tracker')) || ($project->usesPm() && forge_get_config('use_pm')) ) {
123 print sprintf(_(' or <a href="%1$s">Activity</a>'),util_make_url ('/project/report/?group_id='.$group_id));
125 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());
128 if(forge_get_config('use_people')) {
129 $jobs_res = db_query_params ('SELECT name
130 FROM people_job,people_job_category
131 WHERE people_job.category_id=people_job_category.category_id
132 AND people_job.status_id=1
138 $num=db_numrows($jobs_res);
140 print '<br /><br />';
142 ngettext('HELP WANTED: This project is looking for a <a href="%1$s">"%2$s"</a>.',
143 'HELP WANTED: This project is looking for people to fill <a href="%1$s">several different positions</a>.',
145 util_make_url ('/people/?group_id='.$group_id),
146 db_result($jobs_res,0,"name"));
147 //print '<div rel="fusionforge:has_job" typeof="fusionforge:Job" xmlns:fusionforge="http://fusionforge.org/fusionforge#">';
148 //print '<span rel="dc:title" content="'. db_result($jobs_res,0,"name").'" xmlns:dc="http://purl.org/dc/elements/1.1/">';
151 //end of job description part
157 $hook_params = array () ;
158 $hook_params['group_id'] = $group_id ;
159 plugin_hook ("project_after_description",$hook_params) ;
163 // ########################### Developers on this project
167 plugin_hook ("blocks", "summary_right") ;
169 echo $HTML->boxTop(_('Project Members'), 'Project_Members');
171 $iam_member = false ;
173 if (db_numrows($res_admin) > 0) {
175 echo '<span class="develtitle">'._('Project Admins').'</span><br />';
176 $started_developers = false;
177 while ($row_admin = db_fetch_array($res_admin)) {
178 if (trim($row_admin['admin_flags']) != 'A' && !$started_developers) {
179 $started_developers=true;
180 echo '<span class="develtitle">'. _('Developers').':</span><br />';
182 if (!$started_developers) {
183 echo '<div rel="doap:maintainer">'."\n";
185 echo '<div rel="doap:developer">'."\n";
187 # a foaf:Person that holds an account on the forge
188 $developer_url = util_make_url_u ($row_admin['user_name'],$row_admin['user_id']);
189 echo '<div typeof="foaf:Person" xmlns:foaf="http://xmlns.com/foaf/0.1/" about="'.
190 $developer_url.'#me' .'" >'."\n";
191 echo '<div rel="foaf:account">'."\n";
192 echo '<div typeof="sioc:UserAccount" about="'.
194 '" xmlns:sioc="http://rdfs.org/sioc/ns#">'."\n";
195 echo util_make_link_u ($row_admin['user_name'],$row_admin['user_id'],$row_admin['realname']) ."<br />\n";
196 echo "</div>\n"; // /sioc:UserAccount
197 echo "</div>\n"; // /foaf:holdsAccount
198 echo "</div>\n"; // /foaf:Person
199 echo "</div>\n"; // /doap:maintainer|developer
200 if ($row_admin['user_id'] == user_getid())
206 $members = $project->getUsers();
207 echo '<p><span rel="sioc:has_usergroup" xmlns:sioc="http://rdfs.org/sioc/ns#">';
208 echo '<div about="members/" typeof="sioc:UserGroup">';
209 echo '<span rel="http://www.w3.org/2002/07/owl#sameAs">';
210 echo util_make_link ('/project/memberlist.php?group_id='.$group_id,sprintf(_('View the %1$d Member(s)'),count($members)));
214 // end of project usergroup description
217 echo '<p>'.util_make_link ('/project/request.php?group_id='.$group_id,_('Request to join')).'</p>';
219 echo $HTML->boxBottom();
221 echo '</td></tr></table>';
222 $hook_params = array () ;
223 $hook_params['group_id'] = $group_id ;
224 plugin_hook ("project_before_frs",$hook_params) ;
225 echo '<div id="file-releases">';
227 // ############################# File Releases
229 // CB hide FRS if desired
230 if ($project->usesFRS()) {
231 echo $HTML->boxTop(_('Latest File Releases'), 'Latest_File_Releases');
232 $unix_group_name = $project->getUnixName();
235 <table summary="Latest file releases" class="width-100p100">
236 <tr class="table-header">
237 <th class="align-left" scope="col">
258 // Members of projects can see all packages
259 // Non-members can only see public packages
261 $public_required = 1;
262 if (session_loggedin() &&
263 (user_ismember($group_id) || user_ismember(1,'A'))) {
264 $public_required = 0 ;
267 $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
268 FROM frs_package,frs_release
269 WHERE frs_package.package_id=frs_release.package_id
270 AND frs_package.group_id=$1
271 AND frs_release.status_id=1
272 AND (frs_package.is_public=1 OR 1 != $2)
273 ORDER BY frs_package.package_id,frs_release.release_date DESC',
276 $rows_files=db_numrows($res_files);
277 if (!$res_files || $rows_files < 1) {
280 echo '<tr><td colspan="6"><strong>'._('This Project Has Not Released Any Files').'</strong></td></tr>';
284 This query actually contains ALL releases of all packages
285 We will test each row and make sure the package has changed before printing the row
287 for ($f=0; $f<$rows_files; $f++) {
288 if (db_result($res_files,$f,'package_id')==db_result($res_files,($f-1),'package_id')) {
289 //same package as last iteration - don't show this release
291 $rel_date = getdate (db_result ($res_files, $f, 'release_date'));
292 $package_name = db_result($res_files, $f, 'package_name');
293 $package_release = db_result($res_files,$f,'release_name');
295 <tr class="align-center">
296 <td class="align-left">
297 <strong>' . $package_name . '</strong>
299 // Releases to display
300 //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').'">';
306 . $rel_date["month"] . ' ' . $rel_date["mday"] . ', ' . $rel_date["year"] .
308 <td class="align-center">';
312 // accessibility: image is a link, so alt must be unique in page => construct a unique alt
313 $tmp_alt = $package_name . " - " . _('Release Notes');
314 $link = '/frs/shownotes.php?group_id=' . $group_id . '&release_id=' . db_result($res_files, $f, 'release_id');
315 $link_content = $HTML->getReleaseNotesPic($tmp_alt, $tmp_alt);
316 echo util_make_link ($link, $link_content);
318 <td class="align-center">';
321 $tmp_alt = $package_name . " - " . _('Monitor this package');
322 $link = '/frs/monitor.php?filemodule_id=' . db_result($res_files,$f,'package_id') . '&group_id='.$group_id.'&start=1';
323 $link_content = $HTML->getMonitorPic($tmp_alt, $tmp_alt);
324 echo util_make_link ($link, $link_content);
326 <td class="align-center">';
329 $tmp_alt = $package_name." ".$package_release." - ". _('Download');
330 $link_content = $HTML->getDownloadPic($tmp_alt, $tmp_alt);
331 $t_link_anchor = $HTML->toSlug($package_name)."-".$HTML->toSlug($package_release)."-title-content";
332 $link = '/frs/?group_id=' . $group_id . '&release_id=' . db_result($res_files, $f, 'release_id')."#".$t_link_anchor;
333 echo util_make_link ($link, $link_content);
341 echo '<div class="underline-link">' . util_make_link ('/frs/?group_id='.$group_id, _('View All Project Files')) . '</div>';
343 echo $HTML->boxBottom();
346 echo '</div><!-- id="file-releases" -->' . "\n";
348 $hook_params = array () ;
349 $hook_params['group_id'] = $group_id ;
350 plugin_hook ("project_after_frs",$hook_params) ;
352 // ############################## PUBLIC AREAS
354 echo '<table id="project-public-areas-and-news" class="my-layout-table" summary="">
357 echo $HTML->boxTop(_('Public Areas'), 'Public_Areas');
359 // ################# Homepage Link
361 echo '<div class="public-area-box" rel="doap:homepage">';
362 echo util_make_link ('http://' . $project->getHomePage(), $HTML->getHomePic(_('Home Page')) . ' ' . _('Project Home Page'), false, true);
366 // ################## ArtifactTypes
368 if ($project->usesTracker()) {
369 echo '<div class="public-area-box">';
370 $link_content = $HTML->getFollowPic(_('Tracker')) . ' ' . _('Tracker');
371 echo util_make_link ( '/tracker/?group_id=' . $group_id, $link_content);
373 $result=db_query_params ('SELECT agl.*,aca.count,aca.open_count
374 FROM artifact_group_list agl
375 LEFT JOIN artifact_counts_agg aca USING (group_artifact_id)
376 WHERE agl.group_id=$1
378 ORDER BY group_artifact_id ASC',
381 $rows = db_numrows($result);
383 if (!$result || $rows < 1) {
384 echo '<br /><em>'._('There are no public trackers available').'</em>';
386 echo '<ul class="tracker" rel="doap:bug-database">';
387 for ($j = 0; $j < $rows; $j++) {
388 // tracker REST paths are something like : /tracker/cm/project/A_PROJECT/atid/NUMBER to plan compatibility
389 // with OSLC-CM server API
390 $group_artifact_id = db_result($result, $j, 'group_artifact_id');
391 $tracker_stdzd_uri = util_make_url('/tracker/cm/project/'. $project->getUnixName() .'/atid/'. $group_artifact_id);
392 echo '<li about="'. $tracker_stdzd_uri . '" typeof="sioc:Container" xmlns:sioc="http://rdfs.org/sioc/ns#">'."\n";
393 print '<span rel="http://www.w3.org/2002/07/owl#sameAs">'."\n";
394 echo util_make_link ('/tracker/?atid='. $group_artifact_id . '&group_id='.$group_id.'&func=browse',db_result($result, $j, 'name')) . ' ' ;
395 echo "</span>\n"; // /owl:sameAs
396 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'));
397 echo '<br />'.db_result($result, $j, 'description');
398 print '<span rel="sioc:has_space" resource="" />'."\n";
406 // ################## forums
408 if ($project->usesForum()) {
409 echo '<div class="public-area-box">';
410 // 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).'">';
411 $link_content = $HTML->getForumPic('') . ' ' . _('Public Forums');
412 echo util_make_link ( '/forum/?group_id=' . $group_id, $link_content);
414 $messages_count = project_get_public_forum_message_count($group_id);
415 $forums_count = project_get_public_forum_count($group_id);
416 printf(ngettext("<strong>%d</strong> message","<strong>%d</strong> messages",$messages_count),$messages_count);
418 printf(ngettext("<strong>%d</strong> forum","<strong>%d</strong> forums",$forums_count),$forums_count);
423 // ##################### Doc Manager
425 if ($project->usesDocman()) {
426 echo '<div class="public-area-box">';
427 $link_content = $HTML->getDocmanPic('') . ' ' . _('DocManager: Project Documentation');
428 // <a rel="sioc:container_of" xmlns:sioc="http://rdfs.org/sioc/ns#" href="'.util_make_url ('/docman/?group_id='.$group_id).'">';
429 print util_make_link( '/docman/?group_id='.$group_id, $link_content);
433 // ##################### Mailing lists
435 if ($project->usesMail()) {
436 echo '<div class="public-area-box">';
437 $link_content = $HTML->getMailPic('') . ' ' . _('Mailing Lists');
438 print util_make_link( '/mail/?group_id='.$group_id, $link_content);
439 $n = project_get_mail_list_count($group_id);
441 printf(ngettext('(<strong>%1$s</strong> public mailing list)', '(<strong>%1$s</strong> public mailing lists)', $n), $n);
445 // ##################### Task Manager
447 if ($project->usesPm()) {
448 echo '<div class="public-area-box">';
449 $link_content = $HTML->getPmPic('') . ' ' . _('Task Manager');
450 print util_make_link( '/pm/?group_id='.$group_id, $link_content);
452 $result = db_query_params ('SELECT * FROM project_group_list WHERE group_id=$1 AND is_public=1',
454 $rows = db_numrows($result);
455 if (!$result || $rows < 1) {
456 echo '<br /><em>'._('There are no public subprojects available').'</em>';
458 echo '<ul class="task-manager">';
459 for ($j = 0; $j < $rows; $j++) {
461 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'));
469 // ######################### Surveys
471 if ($project->usesSurvey()) {
472 echo '<div class="public-area-box">';
473 $link_content = $HTML->getSurveyPic('') . ' ' . _('Surveys');
474 echo util_make_link( '/survey/?group_id='.$group_id, $link_content);
475 echo ' (<strong>'. project_get_survey_count($group_id) .'</strong> ' . _('surveys').')';
479 // ######################### SCM
481 if ($project->usesSCM()) {
482 echo '<div class="public-area-box">';
484 $link_content = $HTML->getScmPic('') . ' ' . _('SCM Repository');
485 // print '<hr size="1" /><a rel="doap:repository" href="'.util_make_url ('/scm/?group_id='.$group_id).'">';
486 print util_make_link( '/scm/?group_id='.$group_id, $link_content);
488 $hook_params = array () ;
489 $hook_params['group_id'] = $group_id ;
490 plugin_hook ("scm_stats", $hook_params) ;
494 // ######################### Plugins
496 $hook_params = array ();
497 $hook_params['group_id'] = $group_id;
498 plugin_hook ("project_public_area", $hook_params);
500 // ######################## AnonFTP
502 // CB hide FTP if desired
503 if ($project->usesFTP()) {
504 if ($project->isActive()) {
505 echo '<div class="public-area-box">';
507 $link_content = $HTML->getFtpPic('') . ' ' . _('Anonymous FTP Space');
508 // print '<a rel="doap:anonymous root" href="ftp://' . $project->getUnixName() . '.' . forge_get_config('web_host') . '/pub/'. $project->getUnixName() .'/">';
509 print util_make_link('ftp://' . $project->getUnixName() . '.' . forge_get_config('web_host') . '/pub/'. $project->getUnixName(), $link_content, false, true);
515 plugin_hook("cal_link_group",$group_id);
516 echo $HTML->boxBottom();
523 if ($project->usesNews()) {
524 // ############################# Latest News
525 echo $HTML->boxTop(_('Latest News'), 'Latest_News');
526 echo news_show_latest($group_id,10,false);
527 echo $HTML->boxBottom();
530 //echo $HTML->boxBottom();
535 </div><!-- about="" -->
536 </div><!-- id="forge-project-home" -->
540 // Linked projects (hierarchy)
543 plugin_hook('project_home_link',$group_id);
545 site_project_footer(array());
549 // c-file-style: "bsd"