From 18e191abc0d935e8bdf78bd6a7ed498d752247c1 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Sat, 17 Aug 2013 14:32:11 -0500 Subject: [PATCH] Updating public profile by writing new code that reduces queries and adds some more features - also fixes issue 13 --- indefero/src/IDF/Commit.php | 8 ++ indefero/src/IDF/Issue.php | 12 ++ indefero/src/IDF/Views.php | 2 +- indefero/src/IDF/Views/User.php | 121 ++++++++++++------ .../src/IDF/templates/idf/user/public.html | 53 +++++--- 5 files changed, 136 insertions(+), 60 deletions(-) diff --git a/indefero/src/IDF/Commit.php b/indefero/src/IDF/Commit.php index 0060ec7..04fe5fa 100644 --- a/indefero/src/IDF/Commit.php +++ b/indefero/src/IDF/Commit.php @@ -102,6 +102,14 @@ class IDF_Commit extends Pluf_Model 'help_text' => 'Date of creation by the scm', ), ); + + $projtbl = $this->_con->pfx . "idf_projects"; + $this->_a['views'] = array( + 'project_find_private' => array ( + 'where' => 'private = 0', + 'join' => "INNER JOIN " . $projtbl . " ON " . $this->getSqlTable() . ".project = " . $projtbl . ".id" + ) + ); } function __toString() diff --git a/indefero/src/IDF/Issue.php b/indefero/src/IDF/Issue.php index 050cdcf..7d49fd6 100644 --- a/indefero/src/IDF/Issue.php +++ b/indefero/src/IDF/Issue.php @@ -35,6 +35,7 @@ class IDF_Issue extends Pluf_Model function init() { + //$tagtbl = "indefero_idf_tags"; $this->_a['table'] = 'idf_issues'; $this->_a['model'] = __CLASS__; $this->_a['cols'] = array( @@ -119,7 +120,18 @@ class IDF_Issue extends Pluf_Model ), ); $table = $this->_con->pfx.'idf_issue_idf_tag_assoc'; + + $tagtbl = $this->_con->pfx . "idf_tags"; + $projtbl = $this->_con->pfx . "idf_projects"; $this->_a['views'] = array( + 'project_find' => array ( + 'where' => '( lcname = "new" or lcname = "accepted" or lcname = "started" )', + 'join' => "INNER JOIN " . $tagtbl . " on " . $this->getSqlTable() . ".status = " . $tagtbl . ".id" + ), + 'project_find_private' => array ( + 'where' => 'private = 0 AND ( lcname = "new" or lcname = "accepted" or lcname = "started" )', + 'join' => "INNER JOIN " . $tagtbl . " on " . $this->getSqlTable() . ".status = " . $tagtbl . ".id INNER JOIN " . $projtbl . " ON " . $this->getSqlTable() . ".project = " . $projtbl . ".id" + ), 'join_tags' => array( 'join' => 'LEFT JOIN '.$table diff --git a/indefero/src/IDF/Views.php b/indefero/src/IDF/Views.php index 4fa96ed..7f351a7 100644 --- a/indefero/src/IDF/Views.php +++ b/indefero/src/IDF/Views.php @@ -562,7 +562,7 @@ class IDF_Views $forgestats[$key] = $count; $forgestats['total'] += $count; } - $forgestats['proj_count'] = count($projects); + $forgestats['proj_count'] = count($projects); return $forgestats; } } diff --git a/indefero/src/IDF/Views/User.php b/indefero/src/IDF/Views/User.php index 50ae5c6..4ec0875 100644 --- a/indefero/src/IDF/Views/User.php +++ b/indefero/src/IDF/Views/User.php @@ -79,32 +79,37 @@ class IDF_Views_User public function dashboard($request, $match, $working=true) { - $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($request->user) as $project) { - $otags = array_merge($otags, $project->getTagIdsByStatus('open')); - } - if (count($otags) == 0) $otags[] = 0; - if ($working) { - $title = __('Your Dashboard - Working Issues'); - $f_sql = new Pluf_SQL('owner=%s AND status IN ('.implode(', ', $otags).')', array($request->user->id)); - } else { - $title = __('Your Dashboard - Submitted Issues'); - $f_sql = new Pluf_SQL('submitter=%s AND status IN ('.implode(', ', $otags).')', array($request->user->id)); - } + /* + * This is a little bit better - but still not perfect + * It has a N*3 SQL query for each issue that is assigned to the user + * As long as the user isn't assigned 100+ issues - it should hold + */ + $ownedissues = Pluf::factory("IDF_Issue")->getList(array('filter' => "owner = " . $request->user->id, 'view' => 'project_find')); + $submittedissues = Pluf::factory("IDF_Issue")->getList(array('filter' => "submitter = " . $request->user->id, 'view' => 'project_find')); + $nb_owner = count($ownedissues); + $nb_submit = count($submittedissues); - // Get stats about the issues - $sql = new Pluf_SQL('submitter=%s AND status IN ('.implode(', ', $otags).')', array($request->user->id)); - $nb_submit = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen())); - $sql = new Pluf_SQL('owner=%s AND status IN ('.implode(', ', $otags).')', array($request->user->id)); - $nb_owner = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen())); // Paginator to paginate the issues - $pag = new Pluf_Paginator(new IDF_Issue()); + $pag = null; + if ($working) + { + $pag = new Pluf_Paginator(new IDF_Issue()); + $title = __('Your Dashboard - Working Issues'); + $pag->forced_where = new Pluf_SQL("owner = " . $request->user->id); + + + } + else + { + $pag = new Pluf_Paginator(new IDF_Issue()); + $title = __('Your Dashboard - Submitted Issues'); + $pag->forced_where = new Pluf_SQL("submitter = " . $request->user->id); + + } $pag->class = 'recent-issues'; + $pag->model_view = 'project_find'; $pag->item_extra_props = array('current_user' => $request->user); $pag->summary = __('This table shows the open issues.'); - $pag->forced_where = $f_sql; $pag->action = ($working) ? 'idf_dashboard' : 'idf_dashboard_submit'; $pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted $pag->sort_reverse_order = array('modif_dtime'); @@ -281,36 +286,41 @@ class IDF_Views_User $user = $users[0]; $user_data = IDF_UserData::factory($user); - $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')); + $ownedprojects = IDF_Views::getOwnedProjects($request->user); + + $pubprojects = array(); + $privprojects = 0; + + foreach($ownedprojects as $proj) + { + if ($proj->private == 1) + { + $privprojects += 1; + continue; + } else { + $pubprojects[] = $proj; + } } - $false = Pluf_DB_BooleanToDb(false, $db); - $sql_results = $db->select( - 'SELECT id FROM '.$db->pfx.'idf_projects '. - 'WHERE '.$db->qn('private').'='.$false - ); + $projectstats = IDF_Views::getProjectsStatistics($pubprojects); + //print_r($projectstats); + //echo $privprojects; - $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)); + //$pubprojects = Pluf::factory("IDF_Project")->getList(array('filter' => "")); $pag = new Pluf_Paginator(new IDF_Issue()); + $pag->model_view = "project_find_private"; $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->forced_where = new Pluf_SQL("owner = " . $request->user->id); $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')), + //'id' => __('Id'), + //array('project', 'Pluf_Paginator_FkToString', __('Project')), + array('project', 'IDF_Views_ProjectLink', __('Project')), array('summary', 'IDF_Views_IssueSummaryAndLabels', __('Summary')), array('status', 'IDF_Views_Issue_ShowStatus', __('Status')), array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')), @@ -320,19 +330,50 @@ class IDF_Views_User $pag->no_results_text = __('This user has no issues assigned to them!'); $pag->setFromRequest($request); + $pag2 = new Pluf_Paginator(new IDF_Commit()); + $pag->model_view = "project_find_private"; + $pag2->class = 'recent-issues'; + $pag2->summary = __('This table shows the latest commits of this user.'); + $pag2->forced_where = new Pluf_SQL("author = " . $request->user->id); + $pag2->action = 'idf_dashboard'; + $pag2->sort_order = array('creation_dtime', 'ASC'); // will be reverted + $pag2->sort_reverse_order = array('creation_dtime'); + $list_display = array( + //'id' => __('Id'), + array('project', 'IDF_Views_ProjectLink', __('Project')), + 'summary' => __('Summary'), + array('creation_dtime', 'Pluf_Paginator_DateAgo', __('Commit sent')), + ); + $pag2->configure($list_display, array(), array('creation_dtime')); + $pag2->items_per_page = 10; + $pag2->no_results_text = __('This user has not made any commits yet!'); + $pag2->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, - 'issues' => $pag + 'issues' => $pag, + 'commits' => $pag2, + 'stats' => new Pluf_Template_ContextVars($projectstats), + 'privatecount' => $privprojects ), $request); } } +function IDF_Views_ProjectLink($field, $issue, $extra='') +{ + $project = $issue->get_project(); + $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Project::home', + array($project->shortname)); + + return sprintf('%s', $edit, $project->shortname); +} + /** * Display the summary of an issue, then on a new line, display the * list of labels with a link to a view "by label only". diff --git a/indefero/src/IDF/templates/idf/user/public.html b/indefero/src/IDF/templates/idf/user/public.html index 5a97dc2..32e5dee 100644 --- a/indefero/src/IDF/templates/idf/user/public.html +++ b/indefero/src/IDF/templates/idf/user/public.html @@ -44,33 +44,48 @@ {$member.date_joined|date} + +Issues user is working on:

+{$issues.render} + +Last commits of user:

+{$commits.render} +{/block} +{block context} +
+

{blocktrans}You are looking at the public profile of {$member}.{/blocktrans}

+ +
Projects: -{if $projects} -{foreach $projects as $p} -{if $p.private == 0} - - - -{/if} -{/foreach} -{else} + {if $projects} + {foreach $projects as $p} + {if $p.private == 0} + + + + {/if} + {/foreach} + {else} -{/if} + {/if}
-{$p.name} - {$p.shortdesc} -
+ {$p.name} - {$p.shortdesc} +
This user is not working on any projects
-Issues user is working on:

-{$issues.render} -{/block} -{block context} -
-

{blocktrans}You are looking at the public profile of {$member}.{/blocktrans}

-
+Project Stats +
+
{trans 'Issues:'}
{$stats.issues}
+
{trans 'Commits:'}
{$stats.commits}
+
{trans 'Documentations:'}
{$stats.docpages}
+
{trans 'Downloads:'}
{$stats.downloads}
+
{trans 'Code reviews:'}
{$stats.reviews}
+
{trans 'Private Projects:'}
{$privatecount}
+
Public Projects:
{$stats.proj_count}
+
{/block}