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/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..59543cd 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,46 @@ 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', + + $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 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/gadmin/base.html b/indefero/src/IDF/templates/idf/gadmin/base.html index 641b34f..fba97e2 100644 --- a/indefero/src/IDF/templates/idf/gadmin/base.html +++ b/indefero/src/IDF/templates/idf/gadmin/base.html @@ -42,6 +42,7 @@ {trans 'Forge'} {trans 'Projects'} {trans 'People'} + Approve Repo {if $usherConfigured} {trans 'Usher'} {/if} diff --git a/indefero/src/IDF/templates/idf/main-menu.html b/indefero/src/IDF/templates/idf/main-menu.html index b4ae475..fc17ea1 100644 --- a/indefero/src/IDF/templates/idf/main-menu.html +++ b/indefero/src/IDF/templates/idf/main-menu.html @@ -3,7 +3,9 @@ {if !$user.isAnonymous()} {aurl 'url', 'idf_dashboard'}
  • {blocktrans}Welcome, {$user}.{/blocktrans} -{trans 'Sign Out'}
  • {else}
  • + {trans 'Sign Out'}
  • +
  • Request Project
  • + {else} {trans 'Sign in or create your account'} {/if}{if $customForgePageEnabled}
  • {trans 'Home'}
  • diff --git a/indefero/src/IDF/templates/idf/user/public.html b/indefero/src/IDF/templates/idf/user/public.html index 4021211..f5bd5e1 100644 --- a/indefero/src/IDF/templates/idf/user/public.html +++ b/indefero/src/IDF/templates/idf/user/public.html @@ -56,6 +56,8 @@ Projects: {/if} {/foreach} +Issues user is working on:

    +{$issues.render} {/block} {block context}
    diff --git a/pluf/src/Pluf/Cache/Apc.php b/pluf/src/Pluf/Cache/Apc.php index ca559dc..20079ed 100644 --- a/pluf/src/Pluf/Cache/Apc.php +++ b/pluf/src/Pluf/Cache/Apc.php @@ -94,7 +94,7 @@ class Pluf_Cache_Apc extends Pluf_Cache public function get($key, $default=null) { $success = false; - $value = apc_fetch($this->keyprefix.$key, &$success); + $value = apc_fetch($this->keyprefix.$key, $success); if (!$success) return $default; if ($this->compress) $value = gzinflate($value); return unserialize($value); diff --git a/pluf/src/Pluf/Search/ResultSet.php b/pluf/src/Pluf/Search/ResultSet.php index 54977ad..05f2479 100644 --- a/pluf/src/Pluf/Search/ResultSet.php +++ b/pluf/src/Pluf/Search/ResultSet.php @@ -27,7 +27,8 @@ */ 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) {