diff --git a/indefero/src/IDF/Form/ProjectRequest.php b/indefero/src/IDF/Form/ProjectRequest.php
new file mode 100644
index 0000000..782cd6c
--- /dev/null
+++ b/indefero/src/IDF/Form/ProjectRequest.php
@@ -0,0 +1,72 @@
+ __('git'),
+ 'svn' => __('Subversion'),
+ 'mercurial' => __('mercurial'),
+ 'mtn' => __('monotone'),
+ );
+ foreach (Pluf::f('allowed_scm', array()) as $key => $class) {
+ $choices[$options[$key]] = $key;
+ }
+
+ $this->fields['shortname'] = new Pluf_Form_Field_Varchar(
+ array('required' => true,
+ 'label' => __('Name'),
+ 'initial' => '',
+ 'help_text' => __('This will be the name of your repo and of your project - however - you can change the project name later.'),
+ ));
+
+ $this->fields['repotype'] = new Pluf_Form_Field_Varchar(
+ array('required' => true,
+ 'label' => __('Repository type'),
+ 'initial' => 'git',
+ 'widget_attrs' => array('choices' => $choices),
+ 'widget' => 'Pluf_Form_Widget_SelectInput',
+ ));
+
+ $this->fields['desc'] = new Pluf_Form_Field_Varchar(
+ array('required' => true,
+ 'label' => __('Short description'),
+ 'help_text' => __('A one line description of the project.'),
+ 'initial' => '',
+ 'widget_attrs' => array('size' => '35'),
+ ));
+
+ $this->user = $extra['user'];
+ }
+
+
+ function save($commit=true)
+ {
+ if (!$this->isValid()) {
+ throw new Exception(__('Cannot save the model from an invalid form.'));
+ }
+
+ $checksql = new Pluf_SQL(sprintf("shortname='%s'", $this->cleaned_data['shortname']));
+ $requestcheck = Pluf::factory("IDF_Project")->getCount(array('filter'=>$checksql->gen()));
+ if ($requestcheck == 1)
+ return false;
+ try
+ {
+ $request = new IDF_ProjectRequest();
+ $request->shortname = $this->cleaned_data['shortname'];
+ $request->repotype = $this->cleaned_data['repotype'];
+ $request->desc = $this->cleaned_data['desc'];
+ $request->submitter = $this->user;
+ $request->create();
+ return true;
+ } catch (Exception $e)
+ {
+ return false;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/indefero/src/IDF/Form/Register.php b/indefero/src/IDF/Form/Register.php
index 085cd7e..47bfafd 100644
--- a/indefero/src/IDF/Form/Register.php
+++ b/indefero/src/IDF/Form/Register.php
@@ -55,12 +55,6 @@ class IDF_Form_Register extends Pluf_Form
'help_text' => __('We will never send you any unsolicited emails. We hate spam too!'),
));
- $this->fields['regkey'] = new Pluf_Form_Field_Varchar(
- array('required' => true,
- 'label' => __('Registration Key'),
- 'initial' => '',
- 'help_text' => __('Please enter the key given to you by adamsna[at]datanethost.net'),
- ));
$this->fields['terms'] = new Pluf_Form_Field_Boolean(
array('required' => true,
@@ -71,8 +65,7 @@ class IDF_Form_Register extends Pluf_Form
public function clean_regkey()
{
- if ($this->cleaned_data['regkey'] != "2rv9o4nb5")
- throw new Pluf_Form_Invalid("The regkey was incorrect - please contact Nathan for the key!");
+
}
/**
diff --git a/indefero/src/IDF/Migrations/27ProjectRequest.php b/indefero/src/IDF/Migrations/27ProjectRequest.php
new file mode 100644
index 0000000..7f727eb
--- /dev/null
+++ b/indefero/src/IDF/Migrations/27ProjectRequest.php
@@ -0,0 +1,17 @@
+model = new IDF_ProjectRequest();
+ $schema->createTables();
+}
+
+function IDF_Migrations_27ProjectRequest_down($params=null)
+{
+ $db = Pluf::db();
+ $schema = new Pluf_DB_Schema($db);
+ $schema->model = new IDF_ProjectRequest();
+ $schema->dropTables();
+
+}
\ No newline at end of file
diff --git a/indefero/src/IDF/Migrations/Install.php b/indefero/src/IDF/Migrations/Install.php
index 89b5880..80496ec 100644
--- a/indefero/src/IDF/Migrations/Install.php
+++ b/indefero/src/IDF/Migrations/Install.php
@@ -55,6 +55,7 @@ function IDF_Migrations_Install_setup($params=null)
'IDF_Gconf',
'IDF_EmailAddress',
'IDF_IssueRelation',
+ 'IDF_ProjectRequest'
);
$db = Pluf::db();
$schema = new Pluf_DB_Schema($db);
@@ -121,6 +122,7 @@ function IDF_Migrations_Install_teardown($params=null)
'IDF_Project',
'IDF_EmailAddress',
'IDF_IssueRelation',
+ 'IDF_ProjectRequest'
);
$db = Pluf::db();
$schema = new Pluf_DB_Schema($db);
diff --git a/indefero/src/IDF/Project.php b/indefero/src/IDF/Project.php
index c298047..e2232c1 100644
--- a/indefero/src/IDF/Project.php
+++ b/indefero/src/IDF/Project.php
@@ -109,7 +109,7 @@ class IDF_Project extends Pluf_Model
'default' => null,
'verbose' => __('current project activity'),
),
- 'enableads' =>
+ 'enableads' =>
array(
'type' => 'Pluf_DB_Field_Integer',
'blank' => false,
diff --git a/indefero/src/IDF/ProjectRequest.php b/indefero/src/IDF/ProjectRequest.php
new file mode 100644
index 0000000..3301ea5
--- /dev/null
+++ b/indefero/src/IDF/ProjectRequest.php
@@ -0,0 +1,85 @@
+_a['table'] = 'idf_projectrequest';
+ $this->_a['model'] = __CLASS__;
+
+ $this->_a['cols'] = array(
+ // It is mandatory to have an "id" column.
+ 'id' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Sequence',
+ 'blank' => true,
+ ),
+ 'shortname' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Varchar',
+ 'blank' => false,
+ 'size' => 50,
+ 'verbose' => __('shortname'),
+ 'unique' => true,
+ ),
+ 'repotype' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Varchar',
+ 'blank' => false,
+ 'size' => 25,
+ 'verbose' => __('Repository Type'),
+ ),
+ 'desc' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Varchar',
+ 'blank' => false,
+ 'size' => 250,
+ 'verbose' => __('Description'),
+ ),
+ 'creation_dtime' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Datetime',
+ 'blank' => true,
+ 'verbose' => __('creation date'),
+ ),
+ 'submitter' =>
+ array(
+ 'type' => 'Pluf_DB_Field_Foreignkey',
+ 'model' => 'Pluf_User',
+ 'blank' => false,
+ 'verbose' => __('submitter'),
+ ));
+ }
+
+ /**
+ * String representation of the abstract.
+ */
+ function __toString()
+ {
+ return $this->shortname;
+ }
+
+ /**
+ * String ready for indexation.
+ */
+ function _toIndex()
+ {
+ return '';
+ }
+
+ function preSave($create=false)
+ {
+ if ($this->id == '') {
+ $this->creation_dtime = gmdate('Y-m-d H:i:s');
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/indefero/src/IDF/Scm/Git.php b/indefero/src/IDF/Scm/Git.php
index e357988..be98d89 100644
--- a/indefero/src/IDF/Scm/Git.php
+++ b/indefero/src/IDF/Scm/Git.php
@@ -74,9 +74,9 @@ class IDF_Scm_Git extends IDF_Scm
foreach ($out as $line) {
$line = trim($line);
+
if ($line != '') {
$action = $line[0];
-
if ($action == 'A') {
$filename = trim(substr($line, 1));
$return->additions[] = $filename;
@@ -87,8 +87,19 @@ class IDF_Scm_Git extends IDF_Scm
$filename = trim(substr($line, 1));
$return->patches[] = $filename;
} else if ($action == 'R') {
+ // This patch is needed because it seems
+ // that under a merge git may show a status
+ // of RC and not say the location of the original file
$matches = preg_split("/\t/", $line);
- $return->renames[$matches[1]] = $matches[2];
+ if (count($matches) != 3)
+ {
+ $return->additions[] = $matches[1];
+ }
+ else
+ {
+ $return->renames[$matches[1]] = $matches[2];
+ }
+
} else if ($action == 'C') {
$matches = preg_split("/\t/", $line);
$return->copies[$matches[1]] = $matches[2];
diff --git a/indefero/src/IDF/Views.php b/indefero/src/IDF/Views.php
index 1e1b22f..3940567 100644
--- a/indefero/src/IDF/Views.php
+++ b/indefero/src/IDF/Views.php
@@ -460,6 +460,29 @@ class IDF_Views
));
}
+ public static function getOwnedProjects($user)
+ {
+ $db =& Pluf::db();
+ $false = Pluf_DB_BooleanToDb(false, $db);
+ $permSql = new Pluf_SQL(
+ "model_class='IDF_Project' AND owner_class='Pluf_User' ".
+ "AND owner_id=%s AND negative=".$false, $user->id
+ );
+ $rows = Pluf::factory('Pluf_RowPermission')->getList(array('filter' => $permSql->gen()));
+ $ids = array();
+ if ($rows->count() > 0) {
+ foreach ($rows as $row) {
+ if (in_array($row->model_id, $ids))
+ continue;
+ $ids[] = $row->model_id;
+ }
+ }
+ $sql = new Pluf_SQL(sprintf("id IN (%s)", implode(", ", $ids)));
+ return Pluf::factory('IDF_Project')->getList(array(
+ 'filter'=> $sql->gen(),
+ ));
+ }
+
/**
* Returns a list of global tags each carrying the number of projects that have the
* particular tag set
diff --git a/indefero/src/IDF/Views/Admin.php b/indefero/src/IDF/Views/Admin.php
index 9b68e7b..30ed598 100644
--- a/indefero/src/IDF/Views/Admin.php
+++ b/indefero/src/IDF/Views/Admin.php
@@ -174,6 +174,63 @@ class IDF_Views_Admin
$request);
}
+ public $projectRequestCreate_precond = array('Pluf_Precondition::staffRequired');
+ public function projectRequestCreate($request, $match)
+ {
+ $title = __('Create Requested Project');
+ $createdtext = "";
+ $form = null;
+ $errors = null;
+ if (count($match) == 2)
+ {
+
+ $projreqobj = new IDF_ProjectRequest($match[1]);
+ $form = new IDF_Form_Admin_ProjectCreate(array(
+ "name" => $projreqobj->shortname,
+ "shortname" => $projreqobj->shortname,
+ "shortdesc" => $projreqobj->desc,
+ "scm" => $projreqobj->repotype,
+ "owners" => $projreqobj->get_submitter->login,
+ "template" => "--"
+ ), array("user" => $projreqobj->get_submitter));
+ if ($form->isValid())
+ {
+
+
+
+ Pluf::loadFunction('Pluf_HTTP_URL_urlForView');
+ $from_email = Pluf::f('from_email');
+ $tmpl = new Pluf_Template('idf/admin/request-email.txt');
+ $context = new Pluf_Template_Context(array("user" => $projreqobj->get_submitter, "shortname" => $projreqobj->shortname));
+ $text_email = $tmpl->render($context);
+ $email = new Pluf_Mail($from_email, $projreqobj->get_submitter->email,
+ __('Status of repository request'));
+ $email->addTextMessage($text_email);
+ $email->sendMail();
+
+ $form->save();
+ $projreqobj->delete();
+ $createdtext = "Repo was created!";
+ } else {
+ $errors = $form->errors;
+ $createdtext = "There was an error creating the repo!";
+ }
+ }
+
+ $projectreqs = Pluf::factory("IDF_ProjectRequest")->getList();
+ //$projectreqs[0]->creation_dtime = "123";
+ //print_r($projectreqs[0]->creation_dtime);
+ foreach($projectreqs as $p) {
+ $p->creation_dtime = Pluf_Date::gmDateToString($p->creation_dtime);
+ }
+ return Pluf_Shortcuts_RenderToResponse('idf/admin/approveprojects.html', array (
+ 'page_title' => $title,
+ 'requests' => $projectreqs,
+ 'createdtext' => $createdtext,
+ 'form' => $form,
+ 'errors' => $errors
+ ), $request);
+ }
/**
* Creation of a project.
*
diff --git a/indefero/src/IDF/Views/Issue.php b/indefero/src/IDF/Views/Issue.php
index f1f0100..ae56313 100644
--- a/indefero/src/IDF/Views/Issue.php
+++ b/indefero/src/IDF/Views/Issue.php
@@ -61,9 +61,11 @@ class IDF_Views_Issue
'id' => __('Id'),
array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
+ array('submitter', 'Pluf_Paginator_FkToString', __('submitter')),
+ array('owner', 'Pluf_Paginator_FkToString', __('owner')),
array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
);
- $pag->configure($list_display, array(), array('id', 'status', 'modif_dtime'));
+ $pag->configure($list_display, array(), array('id', 'status', 'owner', 'submitter', 'modif_dtime'));
$pag->items_per_page = 10;
$pag->no_results_text = __('No issues were found.');
$pag->setFromRequest($request);
diff --git a/indefero/src/IDF/Views/Source.php b/indefero/src/IDF/Views/Source.php
index 225d74a..225f662 100644
--- a/indefero/src/IDF/Views/Source.php
+++ b/indefero/src/IDF/Views/Source.php
@@ -378,7 +378,12 @@ class IDF_Views_Source
$previous = substr($request_file, 0, -strlen($l.' '));
$scmConf = $request->conf->getVal('scm', 'git');
$props = $scm->getProperties($commit, $request_file);
- $content = IDF_FileUtil::highLight($extra['mime'], $scm->getFile($request_file_info));
+ $cache = Pluf_Cache::factory();
+ $key = sha1($request_file.$commit);
+ if (null === ($content=$cache->get($key))) {
+ $content = IDF_FileUtil::highLight($extra['mime'], $scm->getFile($request_file_info));
+ $cache->set($key, $content);
+ }
return Pluf_Shortcuts_RenderToResponse('idf/source/'.$scmConf.'/file.html',
array(
'page_title' => $page_title,
diff --git a/indefero/src/IDF/Views/User.php b/indefero/src/IDF/Views/User.php
index 6e5f446..50ae5c6 100644
--- a/indefero/src/IDF/Views/User.php
+++ b/indefero/src/IDF/Views/User.php
@@ -32,6 +32,37 @@ Pluf::loadFunction('Pluf_Shortcuts_RenderToResponse');
*/
class IDF_Views_User
{
+ public $requestproject_precond = array('Pluf_Precondition::loginRequired');
+ public function requestproject($request)
+ {
+ $params = array("user" => $request->user);
+ $title = __('Request Project');
+ $success = false;
+ $error = false;
+ if ($request->method == 'POST') {
+ $form = new IDF_Form_ProjectRequest((array)$request->POST, $params);
+ if ($form->isValid()) {
+ $check = $form->save();
+ if ($check)
+ {
+ $form = new IDF_Form_ProjectRequest(null, $params);
+ $success = true;
+ } else {
+ $error = "Repository shortname has already been taken.";
+ }
+ }
+
+ } else {
+ $form = new IDF_Form_ProjectRequest(null, $params);
+ }
+ return Pluf_Shortcuts_RenderToResponse('idf/user/projectrequest.html',
+ array('page_title' => $title,
+ 'form' => $form,
+ 'success' => $success,
+ 'error' => $error),
+ $request);
+
+ }
/**
* Dashboard of a user.
*
@@ -83,7 +114,7 @@ class IDF_Views_User
array('summary', 'IDF_Views_IssueSummaryAndLabels', __('Summary')),
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
- );
+ );
$pag->configure($list_display, array(), array('status', 'modif_dtime'));
$pag->items_per_page = 10;
$pag->no_results_text = ($working) ? __('No issues are assigned to you, yeah!') : __('All the issues you submitted are fixed, yeah!');
@@ -240,6 +271,7 @@ class IDF_Views_User
*/
public function view($request, $match)
{
+ $db =& Pluf::db();
$sql = new Pluf_SQL('login=%s', array($match[1]));
$users = Pluf::factory('Pluf_User')->getList(array('filter'=>$sql->gen()));
if (count($users) != 1 or !$users[0]->active) {
@@ -248,20 +280,53 @@ class IDF_Views_User
$user = $users[0];
$user_data = IDF_UserData::factory($user);
- //$projects = $request->user->getAllPermissions();
- //print_r($request->user->permissions);
- //print_r($projects[0]);
- //$projects = array();
- //foreach (IDF_Views::getProjects($request->user) as $project) {
- // $projects[] = $project;
- //}
- $projects = IDF_Views::getProjects($request->user);
- //print_r($projects);
- return Pluf_Shortcuts_RenderToResponse('idf/user/public.html',
+
+ $otags = array();
+ // Note that this approach does not scale, we will need to add
+ // a table to cache the meaning of the tags for large forges.
+ foreach (IDF_Views::getProjects($user) as $project) {
+ $otags = array_merge($otags, $project->getTagIdsByStatus('open'));
+ }
+
+ $false = Pluf_DB_BooleanToDb(false, $db);
+ $sql_results = $db->select(
+ 'SELECT id FROM '.$db->pfx.'idf_projects '.
+ 'WHERE '.$db->qn('private').'='.$false
+ );
+
+ $ids = array();
+ foreach ($sql_results as $id) {
+ $ids[] = $id['id'];
+ }
+ $f_sql = new Pluf_SQL('owner=%s AND status IN (' .implode(', ', $otags) . ') AND project IN (' . implode(', ', $ids) . ' )', array($user->id));
+
+ $pag = new Pluf_Paginator(new IDF_Issue());
+ $pag->class = 'recent-issues';
+ $pag->item_extra_props = array('current_user' => $request->user);
+ $pag->summary = __('This table shows the open issues.');
+ $pag->forced_where = $f_sql;
+ $pag->action = 'idf_dashboard';
+ $pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted
+ $pag->sort_reverse_order = array('modif_dtime');
+ $list_display = array(
+ 'id' => __('Id'),
+ array('project', 'Pluf_Paginator_FkToString', __('Project')),
+ array('summary', 'IDF_Views_IssueSummaryAndLabels', __('Summary')),
+ array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
+ array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
+ );
+ $pag->configure($list_display, array(), array('status', 'modif_dtime'));
+ $pag->items_per_page = 10;
+ $pag->no_results_text = __('This user has no issues assigned to them!');
+ $pag->setFromRequest($request);
+
+ $projects = IDF_Views::getOwnedProjects($user);
+ return Pluf_Shortcuts_RenderToResponse('idf/user/public.html',
array('page_title' => (string) $user,
'member' => $user,
'user_data' => $user_data,
- 'projects' => $projects
+ 'projects' => $projects,
+ 'issues' => $pag
),
$request);
}
diff --git a/indefero/src/IDF/conf/urls.php b/indefero/src/IDF/conf/urls.php
index eac28ae..000723e 100644
--- a/indefero/src/IDF/conf/urls.php
+++ b/indefero/src/IDF/conf/urls.php
@@ -56,6 +56,12 @@ $ctl[] = array('regex' => '#^/dashboard/$#',
'method' => 'dashboard',
'name' => 'idf_dashboard');
+$ctl[] = array('regex' => '#^/requestproject/$#',
+ 'base' => $base,
+ 'model' => 'IDF_Views_User',
+ 'method' => 'requestproject',
+ 'name' => 'idf_requestproject');
+
$ctl[] = array('regex' => '#^/dashboard/submitted/$#',
'base' => $base,
'model' => 'IDF_Views_User',
@@ -503,6 +509,16 @@ $ctl[] = array('regex' => '#^/admin/projects/create/$#',
'model' => 'IDF_Views_Admin',
'method' => 'projectCreate');
+$ctl[] = array('regex' => '#^/admin/projects/createrequest/$#',
+ 'base' => $base,
+ 'model' => 'IDF_Views_Admin',
+ 'method' => 'projectRequestCreate');
+
+$ctl[] = array('regex' => '#^/admin/projects/createrequest/(\d+/)?$#',
+ 'base' => $base,
+ 'model' => 'IDF_Views_Admin',
+ 'method' => 'projectRequestCreate');
+
$ctl[] = array('regex' => '#^/admin/projects/(\d+)/delete/$#',
'base' => $base,
'model' => 'IDF_Views_Admin',
diff --git a/indefero/src/IDF/templates/idf/admin/approveprojects.html b/indefero/src/IDF/templates/idf/admin/approveprojects.html
new file mode 100644
index 0000000..77dcd28
--- /dev/null
+++ b/indefero/src/IDF/templates/idf/admin/approveprojects.html
@@ -0,0 +1,60 @@
+{extends "idf/gadmin/base.html"}
+{block request} class="active"{/block}
+
+{block body}
+{if $createdtext}
+{$createdtext}
+
+
+{/if}
+{if $errors}
+{foreach $errors as $error}
+{$error}
+{/foreach}
+{/if}
+
+ Short Name + | ++ Description + | ++ Repotype + | ++ Submitter + | ++ Date + | ++ Approve + | +
---|---|---|---|---|---|
+ {$req.shortname} + | ++ {$req.desc} + | ++ {$req.repotype} + | ++ {$req.get_submitter.login} + | ++ {$req.creation_dtime} + | ++ Approve + | +
+ Thank you - your request has been received and will be approved by an admin shortly. +
+