* Copyright 1999-2001, VA Linux Systems, Inc.
* Copyright 2009-2010, Roland Mas
* Copyright 2010-2011, Franck Villaume - Capgemini
- * Copyright 2010-2011, Alain Peyrat - Alcatel-Lucent
+ * Copyright 2010-2012, Alain Peyrat - Alcatel-Lucent
+ * Copyright 2012, Franck Villaume - TrivialDev
* http://fusionforge.org
*
* This file is part of FusionForge. FusionForge is free software;
* IMPORTANT! That db result must contain all fields
* from groups table or you will have problems
*
- * @param int Required
- * @param int Result set handle ("SELECT * FROM groups WHERE group_id=xx")
- * @return object a group object or false on failure
+ * @param int $group_id Required
+ * @param int|bool $res Result set handle ("SELECT * FROM groups WHERE group_id=xx")
+ * @return Group|bool A group object or false on failure
*/
function &group_get_object($group_id, $res = false) {
//create a common set of group objects
return group_get_object(db_result($res, 0, 'group_id'), $res);
}
+/**
+ * get_public_active_projects_asc() - Get a list of rows for public active projects (initially in trove/full_list)
+ *
+ * @param int Opional Maximum number of rows to limit query length
+ */
+function get_public_active_projects_asc($max_query_limit = -1) {
+
+ $res_grp = db_query_params ('
+ SELECT group_id, group_name, unix_group_name, short_description, register_time
+ FROM groups
+ WHERE status = $1 AND type_id=1 AND group_id>4 AND register_time > 0
+ ORDER BY group_name ASC
+ ',
+ array ('A'),
+ $max_query_limit);
+ $projects = array();
+ while ($row_grp = db_fetch_array($res_grp)) {
+ if (!forge_check_perm ('project_read', $row_grp['group_id'])) {
+ continue ;
+ }
+ $projects[] = $row_grp;
+ }
+ return $projects;
+}
+
+
class Group extends Error {
/**
* Associative array of data from db.
/**
* Group - Group object constructor - use group_get_object() to instantiate.
*
- * @param int Required - group_id of the group you want to instantiate.
- * @param int Database result from select query OR associative array of all columns.
- * @return boolean success or not
+ * @param int|bool $id Required - Id of the group you want to instantiate.
+ * @param int|bool $res Database result from select query OR associative array of all columns.
+ * @return boolean Success or not
*/
- function Group($id = false, $res = false) {
+ function __construct($id = false, $res = false) {
$this->Error();
if (!$id) {
//setting up an empty object
/**
* fetchData - May need to refresh database fields if an update occurred.
*
- * @param int The group_id.
- * @return boolean success or not
+ * @param int $group_id The group_id.
+ * @return boolean success or not
*/
function fetchData($group_id) {
$res = db_query_params ('SELECT * FROM groups WHERE group_id=$1',
if ($this->getID()!=0) {
$this->setError(_('Group::create: Group object already exists'));
return false;
- } else if (!$this->validateGroupName($group_name)) {
+ } elseif (!$this->validateGroupName($group_name)) {
return false;
- } else if (!account_groupnamevalid($unix_name)) {
+ } elseif (!account_groupnamevalid($unix_name)) {
$this->setError(_('Invalid Unix name'));
return false;
- } else if (!$SYS->sysUseUnixName($unix_name)) {
+ } elseif (!$SYS->sysUseUnixName($unix_name)) {
$this->setError(_('Unix name already taken'));
return false;
- } else if (db_numrows(db_query_params('SELECT group_id FROM groups WHERE unix_group_name=$1',
+ } elseif (db_numrows(db_query_params('SELECT group_id FROM groups WHERE unix_group_name=$1',
array($unix_name))) > 0) {
$this->setError(_('Unix name already taken'));
return false;
- } else if (strlen($purpose)<10) {
+ } elseif (strlen($purpose)<10) {
$this->setError(_('Please describe your Registration Purpose in a more comprehensive manner'));
return false;
- } else if (strlen($purpose)>1500) {
+ } elseif (strlen($purpose)>1500) {
$this->setError(_('The Registration Purpose text is too long. Please make it smaller than 1500 bytes.'));
return false;
- } else if (strlen($description)<10) {
+ } elseif (strlen($description)<10) {
$this->setError(_('Describe in a more comprehensive manner your project.'));
return false;
- } else if (strlen($description)>255) {
- $this->setError(_('Your project description is too long. Please make it smaller than 256 bytes.'));
- return false;
} else {
+
+ // Check if sys_use_project_vhost for homepage
+ if (forge_get_config('use_project_vhost')) {
+ $homepage = $unix_name.".".forge_get_config('web_host');
+ } else {
+ $homepage = forge_get_config('web_host')."/www/".$unix_name."/";
+ }
+
db_begin();
$res = db_query_params('
scm_box,
register_purpose,
register_time,
- enable_anonscm,
rand_hash,
built_from_template
)
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)',
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)',
array (htmlspecialchars ($group_name),
$unix_name,
htmlspecialchars($description),
- $unix_name.".".forge_get_config('web_host'),
- $unix_name.".".forge_get_config('web_host'),
+ $homepage,
+ $homepage,
'P',
$unix_box,
$scm_box,
htmlspecialchars($purpose),
time(),
- 0,
md5(util_randbytes()),
$built_from_template));
if (!$res || db_affected_rows($res) < 1) {
function update(&$user, $group_name, $homepage, $short_description, $use_mail, $use_survey, $use_forum,
$use_pm, $use_pm_depend_box, $use_scm, $use_news, $use_docman,
$new_doc_address, $send_all_docs, $logo_image_id,
- $use_ftp, $use_tracker, $use_frs, $use_stats, $tags, $is_public) {
+ $use_ftp, $use_tracker, $use_frs, $use_stats, $tags, $use_activity, $is_public) {
$perm =& $this->getPermission();
}
// in the database, these all default to '1',
- // so we have to explicity set 0
+ // so we have to explicitly set 0
if (!$use_mail) {
$use_mail = 0;
}
if (!$use_stats) {
$use_stats = 0;
}
+ if (!$use_activity) {
+ $use_activity = 0;
+ }
if (!$send_all_docs) {
$send_all_docs = 0;
}
$homepage = util_make_url('/projects/' . $this->getUnixName() . '/');
}
- if (strlen(htmlspecialchars($short_description))>255) {
- $this->setError(_('Error updating project information: Maximum length for Project Description is 255 chars.'));
+ if (strlen(htmlspecialchars($short_description))<10) {
+ $this->setError(_('Describe in a more comprehensive manner your project.'));
return false;
}
use_ftp=$13,
use_tracker=$14,
use_frs=$15,
- use_stats=$16
- WHERE group_id=$17',
+ use_stats=$16,
+ use_activity=$17
+ WHERE group_id=$18',
array(htmlspecialchars($group_name),
$homepage,
htmlspecialchars($short_description),
$use_tracker,
$use_frs,
$use_stats,
+ $use_activity,
$this->getID()));
- if (!$res) {
+ if (!$res || db_affected_rows($res) < 1) {
$this->setError(sprintf(_('Error updating project information: %s'), db_error()));
db_rollback();
return false;
// Check that status transition is valid
if ($this->getStatus() != $status
- && !$allowed_status_changes[$this->getStatus().$status]) {
- $this->setError(_('Invalid Status Change'));
+ && !array_key_exists($this->getStatus(). $status, $allowed_status_changes)) {
+ $this->setError(_('Invalid Status Change From: ').$this->getStatus(). _(' To: '.$status));
return false;
}
/* Otherwise, the group is not active, and make sure that
System group is not active either */
- } else if ($SYS->sysCheckGroup($this->getID())) {
+ } elseif ($SYS->sysCheckGroup($this->getID())) {
if (!$SYS->sysRemoveGroup($this->getID())) {
$this->setError($SYS->getErrorMessage());
db_rollback();
}
}
+ /**
+ * usesActivity - whether or not this group has opted to display Project Activities.
+ *
+ * @return boolean uses_activities.
+ */
+ function usesActivity() {
+ if (forge_get_config('use_activity')) {
+ return $this->data_array['use_activity'];
+ } else {
+ return false;
+ }
+ }
+
/**
* usesForum - whether or not this group has opted to use discussion forums.
*
/**
* usesPlugin - returns true if the group uses a particular plugin
*
- * @param string name of the plugin
+ * @param string $pluginname name of the plugin
* @return boolean whether plugin is being used or not
*/
function usesPlugin($pluginname) {
$plugin_id));
return $res;
}
+ $this->normalizeAllRoles () ;
}
/**
* @return string homepage URL.
*/
function getHomePage() {
+ if (!preg_match("/^[a-zA-Z][a-zA-Z0-9+.-]*:/",
+ $this->data_array['homepage'])) {
+ $this->data_array['homepage'] = util_url_prefix() .
+ $this->data_array['homepage'];
+ }
return $this->data_array['homepage'];
}
$sql = 'INSERT INTO project_tags (group_id,name) VALUES ($1, $2)';
$res = db_query_params($sql, array($this->getID(), $tag));
if (!$res) {
- $this->setError(_('Setting tags: ').db_error());
+ $this->setError(_('Setting tags:') . ' ' .
+ db_error());
db_rollback();
return false;
}
$this->setError(_('Cannot Delete System Group'));
return false;
}
- $perm =& $this->getPermission();
+ $perm = $this->getPermission();
if (!$perm || !is_object($perm)) {
$this->setPermissionDeniedError();
return false;
return false;
}
- //db_begin();
+ db_begin();
//
// Remove all the members
//
- $members =& $this->getMembers();
+ $members = $this->getMembers();
foreach ($members as $i) {
if(!$this->removeUser($i->getID())) {
$this->setError(_('Could not properly remove member:').' '.$i->getID());
return false;
}
}
- // Failsafe until user_group table is gone
- $res = db_query_params('DELETE FROM user_group WHERE group_id=$1',
- array($this->getID()));
// unlink roles from this project
- $ra = RoleAnonymous::getInstance();
- $rl = RoleLoggedIn::getInstance();
- $ra->unlinkProject($this);
- $rl->unlinkProject($this);
- // @todo : unlink all the other roles created in the project...
+ foreach ($this->getRoles() as $r) {
+ if ($r->getHomeProject() == NULL
+ || $r->getHomeProject()->getID() != $this->getID()) {
+ $r->unlinkProject($this);
+ }
+ }
//
// Delete Trackers
//
$atf = new ArtifactTypeFactory($this);
- $at_arr =& $atf->getArtifactTypes();
+ $at_arr = $atf->getArtifactTypes();
foreach ($at_arr as $i) {
if (!is_object($i)) {
continue;
// Delete Forums
//
$ff = new ForumFactory($this);
- $f_arr =& $ff->getForums();
+ $f_arr = $ff->getForums();
foreach ($f_arr as $i) {
if (!is_object($i)) {
continue;
// Delete Subprojects
//
$pgf = new ProjectGroupFactory($this);
- $pg_arr =& $pgf->getProjectGroups();
+ $pg_arr = $pgf->getProjectGroups();
foreach ($pg_arr as $i) {
if (!is_object($i)) {
continue;
//
$res = db_query_params('SELECT * FROM frs_package WHERE group_id=$1',
array($this->getID()));
+ if (!$res) {
+ $this->setError(_('Error FRS Packages: ').db_error());
+ db_rollback();
+ return false;
+ }
+
while ($arr = db_fetch_array($res)) {
$frsp=new FRSPackage($this, $arr['package_id'], $arr);
if (!$frsp->delete(1, 1)) {
// Delete SurveyQuestions
//
$sqf = new SurveyQuestionFactory($this);
- $sq_arr =& $sqf->getSurveyQuestions();
- foreach ($sq_arr as $i) {
- if (!is_object($i)) {
- continue;
- }
- if (!$i->delete()) {
- $this->setError(_('Could not properly delete the survey questions'));
- db_rollback();
- return false;
+ $sq_arr = $sqf->getSurveyQuestions();
+ if (is_array($sq_arr)) {
+ foreach ($sq_arr as $i) {
+ if (!is_object($i)) {
+ continue;
+ }
+ if (!$i->delete()) {
+ $this->setError(_('Could not properly delete the survey questions'));
+ db_rollback();
+ return false;
+ }
}
}
//
return false;
}
+ // Delete entry in groups.
$res = db_query_params('DELETE FROM groups WHERE group_id=$1',
array($this->getID()));
if (!$res) {
/*
Basic functions to add/remove users to/from a group
and update their permissions
- */
+ */
/**
* addUser - controls adding a user to a group.
* @return boolean success.
*/
function updateUser($user_id,$role_id) {
- global $SYS;
if (!forge_check_perm ('project_admin', $this->getID())) {
$this->setPermissionDeniedError();
$template = $this->getTemplateProject();
$id_mappings = array();
- $seen_local_roles = false;
+ $seen_admin_role = false;
if ($template) {
// Copy roles from template project
foreach($template->getRoles() as $oldrole) {
// Need to use a different role name so that the permissions aren't set from the hardcoded defaults
$role->create('TEMPORARY ROLE NAME', $data, true);
$role->setName($oldrole->getName());
- $seen_local_roles = true;
+ if ($oldrole->getSetting ('project_admin', $template->getID())) {
+ $seen_admin_role = true;
+ }
} else {
$role = $oldrole;
$role->linkProject($this);
}
}
- if (!$seen_local_roles) {
+ if (!$seen_admin_role) {
$role = new Role($this);
$adminperms = array ('project_admin' => array ($this->getID() => 1)) ;
$role_id = $role->create ('Admin', $adminperms, true) ;
$roles = $this->getRoles() ;
foreach ($roles as $r) {
+ if ($r->getHomeProject() == NULL) {
+ continue;
+ }
if ($r->getSetting ('project_admin', $this->getID())) {
$r->addUser(user_get_object ($idadmin_group));
}
}
-
+
// Temporarily switch to the submitter's identity
$saved_session = session_get_user();
session_set_internal($idadmin_group);
$oldatf = new ArtifactTypeFactory($template);
foreach ($oldatf->getArtifactTypes() as $o) {
$t = new ArtifactType ($this) ;
- $t->create ($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->isPublic(),$o->allowsAnon(),$o->emailAll(),$o->getEmailAddress(),$o->getDuePeriod()/86400,0,$o->getSubmitInstructions(),$o->getBrowseInstructions()) ;
+ $t->create ($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->emailAll(),$o->getEmailAddress(),$o->getDuePeriod()/86400,0,$o->getSubmitInstructions(),$o->getBrowseInstructions()) ;
$id_mappings['tracker'][$o->getID()] = $t->getID();
$t->cloneFieldsFrom ($o->getID());
}
$oldpgf = new ProjectGroupFactory($template);
foreach ($oldpgf->getProjectGroups() as $o) {
$pg = new ProjectGroup($this);
- $pg->create($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->isPublic(),$o->getSendAllPostsTo());
+ $pg->create($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->getSendAllPostsTo());
$id_mappings['pm'][$o->getID()] = $pg->getID();
}
}
$oldff = new ForumFactory($template) ;
foreach ($oldff->getForums() as $o) {
$f = new Forum($this);
- $f->create($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->isPublic(),$o->getSendAllPostsTo(),1,$o->allowAnonymous(),$o->getModerationLevel());
+ $f->create($this->replaceTemplateStrings($o->getName()),$this->replaceTemplateStrings($o->getDescription()),$o->getSendAllPostsTo(),1);
$id_mappings['forum'][$o->getID()] = $f->getID();
}
}
}
}
- $this->setUseSCM ($template->usesSCM()) ;
+ if (0) {
+ /* use SCM plugin from template group */
+ $this->setUseSCM($template->usesSCM());
- foreach ($template->getPlugins() as $plugin_id => $plugin_name) {
- $this->setPluginUse ($plugin_name) ;
+ foreach ($template->getPlugins() as
+ $plugin_id => $plugin_name) {
+ $this->setPluginUse($plugin_name);
+ }
+ } else {
+ /* use SCM choice from registration page */
+
+ foreach ($template->getPlugins() as
+ $plugin_id => $plugin_name) {
+ if (substr($plugin_name, 3) == 'scm' &&
+ $plugin_name != 'scmhook') {
+ /* skip copying scm plugins */
+ continue;
+ }
+ /* enable other plugins though */
+ $this->setPluginUse($plugin_name);
+ }
}
foreach ($template->getRoles() as $oldrole) {
plugin_hook_by_reference ('clone_project_from_template', $params) ;
} else {
// Disable everything
- $res = db_query_params ('UPDATE groups SET use_mail=0, use_survey=0, use_forum=0, use_pm=0, use_pm_depend_box=0, use_scm=0, use_news=0, use_docman=0, use_ftp=0, use_tracker=0, use_frs=0, use_stats=0 WHERE group_id=$1',
-
- array ($this->getID())) ;
+ db_query_params ('UPDATE groups SET use_mail=0, use_survey=0, use_forum=0, use_pm=0, use_pm_depend_box=0, use_scm=0, use_news=0, use_docman=0, use_ftp=0, use_tracker=0, use_frs=0, use_stats=0 WHERE group_id=$1',
+ array ($this->getID())) ;
}
$this->normalizeAllRoles();
$this->activateUsers();
+ // Delete fake join request
+ foreach (get_group_join_requests ($this) as $gjr) {
+ $gjr->delete(true) ;
+ }
+
// Switch back to user preference
session_set_internal($saved_session->getID());
setup_gettext_from_context();
$admin_email = $admin->getEmail () ;
setup_gettext_for_user ($admin) ;
- foreach ($submitters as $u) {
- $submitter_names[] = $u->getRealName() ;
- }
-
$message = sprintf(_('New %1$s Project Submitted
Project Full Name: %2$s
if (strlen($group_name)<3) {
$this->setError(_('Group name is too short'));
return false;
- } else if (strlen(htmlspecialchars($group_name))>50) {
+ } elseif (strlen(htmlspecialchars($group_name))>50) {
$this->setError(_('Group name is too long'));
return false;
- } else if ($group=group_get_object_by_publicname($group_name)) {
+ } elseif (group_get_object_by_publicname($group_name)) {
$this->setError(_('Group name already taken'));
return false;
}
}
}
- function setStorageAPI($type) {
- return true;
- }
-
- function getStorageAPI() {
- return 'DB';
- }
}
/**
// mode: php
// c-file-style: "bsd"
// End:
-
-?>