Fixing APC with latest version of PHP

Adding ability for user to request repo and staff members to approve repos - issue 9
Fixing issue 11 adding caching for requesting file contents with mercurial
Fixing issue 10 user profiles only show the projects that they are an owner on
This commit is contained in:
Nathan Adams 2013-07-30 19:15:42 -05:00
parent def4ce7283
commit d4994854c9
13 changed files with 187 additions and 18 deletions

View File

@ -55,6 +55,7 @@ function IDF_Migrations_Install_setup($params=null)
'IDF_Gconf', 'IDF_Gconf',
'IDF_EmailAddress', 'IDF_EmailAddress',
'IDF_IssueRelation', 'IDF_IssueRelation',
'IDF_ProjectRequest'
); );
$db = Pluf::db(); $db = Pluf::db();
$schema = new Pluf_DB_Schema($db); $schema = new Pluf_DB_Schema($db);
@ -121,6 +122,7 @@ function IDF_Migrations_Install_teardown($params=null)
'IDF_Project', 'IDF_Project',
'IDF_EmailAddress', 'IDF_EmailAddress',
'IDF_IssueRelation', 'IDF_IssueRelation',
'IDF_ProjectRequest'
); );
$db = Pluf::db(); $db = Pluf::db();
$schema = new Pluf_DB_Schema($db); $schema = new Pluf_DB_Schema($db);

View File

@ -109,7 +109,7 @@ class IDF_Project extends Pluf_Model
'default' => null, 'default' => null,
'verbose' => __('current project activity'), 'verbose' => __('current project activity'),
), ),
'enableads' => 'enableads' =>
array( array(
'type' => 'Pluf_DB_Field_Integer', 'type' => 'Pluf_DB_Field_Integer',
'blank' => false, 'blank' => false,

View File

@ -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 * Returns a list of global tags each carrying the number of projects that have the
* particular tag set * particular tag set

View File

@ -174,6 +174,63 @@ class IDF_Views_Admin
$request); $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. * Creation of a project.
* *

View File

@ -61,9 +61,11 @@ class IDF_Views_Issue
'id' => __('Id'), 'id' => __('Id'),
array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')), array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')), 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')), 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->items_per_page = 10;
$pag->no_results_text = __('No issues were found.'); $pag->no_results_text = __('No issues were found.');
$pag->setFromRequest($request); $pag->setFromRequest($request);

View File

@ -378,7 +378,12 @@ class IDF_Views_Source
$previous = substr($request_file, 0, -strlen($l.' ')); $previous = substr($request_file, 0, -strlen($l.' '));
$scmConf = $request->conf->getVal('scm', 'git'); $scmConf = $request->conf->getVal('scm', 'git');
$props = $scm->getProperties($commit, $request_file); $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', return Pluf_Shortcuts_RenderToResponse('idf/source/'.$scmConf.'/file.html',
array( array(
'page_title' => $page_title, 'page_title' => $page_title,

View File

@ -32,6 +32,37 @@ Pluf::loadFunction('Pluf_Shortcuts_RenderToResponse');
*/ */
class IDF_Views_User 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. * Dashboard of a user.
* *
@ -83,7 +114,7 @@ class IDF_Views_User
array('summary', 'IDF_Views_IssueSummaryAndLabels', __('Summary')), array('summary', 'IDF_Views_IssueSummaryAndLabels', __('Summary')),
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')), array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')), array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
); );
$pag->configure($list_display, array(), array('status', 'modif_dtime')); $pag->configure($list_display, array(), array('status', 'modif_dtime'));
$pag->items_per_page = 10; $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!'); $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) public function view($request, $match)
{ {
$db =& Pluf::db();
$sql = new Pluf_SQL('login=%s', array($match[1])); $sql = new Pluf_SQL('login=%s', array($match[1]));
$users = Pluf::factory('Pluf_User')->getList(array('filter'=>$sql->gen())); $users = Pluf::factory('Pluf_User')->getList(array('filter'=>$sql->gen()));
if (count($users) != 1 or !$users[0]->active) { if (count($users) != 1 or !$users[0]->active) {
@ -248,20 +280,46 @@ class IDF_Views_User
$user = $users[0]; $user = $users[0];
$user_data = IDF_UserData::factory($user); $user_data = IDF_UserData::factory($user);
//$projects = $request->user->getAllPermissions();
//print_r($request->user->permissions); $false = Pluf_DB_BooleanToDb(false, $db);
//print_r($projects[0]); $sql_results = $db->select(
//$projects = array(); 'SELECT id FROM '.$db->pfx.'idf_projects '.
//foreach (IDF_Views::getProjects($request->user) as $project) { 'WHERE '.$db->qn('private').'='.$false
// $projects[] = $project; );
//}
$projects = IDF_Views::getProjects($request->user); $ids = array();
//print_r($projects); foreach ($sql_results as $id) {
return Pluf_Shortcuts_RenderToResponse('idf/user/public.html', $ids[] = $id['id'];
}
$f_sql = new Pluf_SQL('owner=%s 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, array('page_title' => (string) $user,
'member' => $user, 'member' => $user,
'user_data' => $user_data, 'user_data' => $user_data,
'projects' => $projects 'projects' => $projects,
'issues' => $pag
), ),
$request); $request);
} }

View File

@ -56,6 +56,12 @@ $ctl[] = array('regex' => '#^/dashboard/$#',
'method' => 'dashboard', 'method' => 'dashboard',
'name' => 'idf_dashboard'); 'name' => 'idf_dashboard');
$ctl[] = array('regex' => '#^/requestproject/$#',
'base' => $base,
'model' => 'IDF_Views_User',
'method' => 'requestproject',
'name' => 'idf_requestproject');
$ctl[] = array('regex' => '#^/dashboard/submitted/$#', $ctl[] = array('regex' => '#^/dashboard/submitted/$#',
'base' => $base, 'base' => $base,
'model' => 'IDF_Views_User', 'model' => 'IDF_Views_User',
@ -503,6 +509,16 @@ $ctl[] = array('regex' => '#^/admin/projects/create/$#',
'model' => 'IDF_Views_Admin', 'model' => 'IDF_Views_Admin',
'method' => 'projectCreate'); '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/$#', $ctl[] = array('regex' => '#^/admin/projects/(\d+)/delete/$#',
'base' => $base, 'base' => $base,
'model' => 'IDF_Views_Admin', 'model' => 'IDF_Views_Admin',

View File

@ -42,6 +42,7 @@
<a href="{url 'IDF_Views_Admin::forge'}"{block tabforge}{/block}>{trans 'Forge'}</a> <a href="{url 'IDF_Views_Admin::forge'}"{block tabforge}{/block}>{trans 'Forge'}</a>
<a href="{url 'IDF_Views_Admin::projects'}"{block tabprojects}{/block}>{trans 'Projects'}</a> <a href="{url 'IDF_Views_Admin::projects'}"{block tabprojects}{/block}>{trans 'Projects'}</a>
<a href="{url 'IDF_Views_Admin::users'}"{block tabusers}{/block}>{trans 'People'}</a> <a href="{url 'IDF_Views_Admin::users'}"{block tabusers}{/block}>{trans 'People'}</a>
<a href="{url 'IDF_Views_Admin::projectRequestCreate'}"{block request}{/block}>Approve Repo</a>
{if $usherConfigured} {if $usherConfigured}
<a href="{url 'IDF_Views_Admin::usher'}"{block tabusher}{/block}>{trans 'Usher'}</a> <a href="{url 'IDF_Views_Admin::usher'}"{block tabusher}{/block}>{trans 'Usher'}</a>
{/if} {/if}

View File

@ -3,7 +3,9 @@
{if !$user.isAnonymous()} {if !$user.isAnonymous()}
{aurl 'url', 'idf_dashboard'} {aurl 'url', 'idf_dashboard'}
<li>{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <li>{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans}
<a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a></li>{else}<li> <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a></li>
<li><a href="{url 'IDF_Views_User::requestproject'}">Request Project</a></li>
{else}
<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a></li> <a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a></li>
{/if}{if $customForgePageEnabled} {/if}{if $customForgePageEnabled}
<li><a href="{url 'IDF_Views::index'}">{trans 'Home'}</a></li> <li><a href="{url 'IDF_Views::index'}">{trans 'Home'}</a></li>

View File

@ -56,6 +56,8 @@ Projects:
{/if} {/if}
{/foreach} {/foreach}
</table> </table>
Issues user is working on:<br/><br/>
{$issues.render}
{/block} {/block}
{block context} {block context}
<div class="issue-submit-info"> <div class="issue-submit-info">

View File

@ -94,7 +94,7 @@ class Pluf_Cache_Apc extends Pluf_Cache
public function get($key, $default=null) public function get($key, $default=null)
{ {
$success = false; $success = false;
$value = apc_fetch($this->keyprefix.$key, &$success); $value = apc_fetch($this->keyprefix.$key, $success);
if (!$success) return $default; if (!$success) return $default;
if ($this->compress) $value = gzinflate($value); if ($this->compress) $value = gzinflate($value);
return unserialize($value); return unserialize($value);

View File

@ -27,7 +27,8 @@
*/ */
class Pluf_Search_ResultSet implements Iterator class Pluf_Search_ResultSet implements Iterator
{ {
protected $results = array(); // Needs to be public for using in Wiki when there are over 100 pages
public $results = array();
public function __construct($search_res) public function __construct($search_res)
{ {