Added developer/user dashboard for all the projects.
This fixes issue 60.
This commit is contained in:
parent
119aa4505e
commit
05c8d321c1
@ -32,6 +32,74 @@ Pluf::loadFunction('Pluf_Shortcuts_RenderToResponse');
|
|||||||
*/
|
*/
|
||||||
class IDF_Views_User
|
class IDF_Views_User
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Dashboard of a user.
|
||||||
|
*
|
||||||
|
* Shows all the open issues assigned to the user.
|
||||||
|
*
|
||||||
|
* TODO: This views is a SQL horror. What needs to be done to cut
|
||||||
|
* by many the number of SQL queries:
|
||||||
|
* - Add a table to cache the open/closed status ids for all the
|
||||||
|
* projects.
|
||||||
|
* - Left join the issues with the project to get the shortname.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public $dashboard_precond = array('Pluf_Precondition::loginRequired');
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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->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 = ($working) ? 'idf_dashboard' : 'idf_dashboard_submit';
|
||||||
|
$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 = ($working) ? __('No issues are assigned to you, yeah!') : __('All the issues you submitted are fixed, yeah!');
|
||||||
|
$pag->setFromRequest($request);
|
||||||
|
return Pluf_Shortcuts_RenderToResponse('idf/user/dashboard.html',
|
||||||
|
array(
|
||||||
|
'page_title' => $title,
|
||||||
|
'nb_submit' => $nb_submit,
|
||||||
|
'nb_owner' => $nb_owner,
|
||||||
|
'issues' => $pag,
|
||||||
|
),
|
||||||
|
$request);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple management of the base info of the user.
|
* Simple management of the base info of the user.
|
||||||
*/
|
*/
|
||||||
@ -82,3 +150,27 @@ class IDF_Views_User
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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".
|
||||||
|
*
|
||||||
|
* The summary of the issue is linking to the issue.
|
||||||
|
*/
|
||||||
|
function IDF_Views_IssueSummaryAndLabels($field, $issue, $extra='')
|
||||||
|
{
|
||||||
|
$project = $issue->get_project();
|
||||||
|
$edit = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
||||||
|
array($project->shortname, $issue->id));
|
||||||
|
$tags = array();
|
||||||
|
foreach ($issue->get_tags_list() as $tag) {
|
||||||
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::listLabel',
|
||||||
|
array($project->shortname, $tag->id, 'open'));
|
||||||
|
$tags[] = sprintf('<a class="label" href="%s">%s</a>', $url, Pluf_esc((string) $tag));
|
||||||
|
}
|
||||||
|
$out = '';
|
||||||
|
if (count($tags)) {
|
||||||
|
$out = '<br /><span class="note">'.implode(', ', $tags).'</span>';
|
||||||
|
}
|
||||||
|
return sprintf('<a href="%s">%s</a>', $edit, Pluf_esc($issue->summary)).$out;
|
||||||
|
}
|
||||||
|
@ -43,6 +43,21 @@ $ctl[] = array('regex' => '#^/preferences/$#',
|
|||||||
'model' => 'IDF_Views_User',
|
'model' => 'IDF_Views_User',
|
||||||
'method' => 'myAccount');
|
'method' => 'myAccount');
|
||||||
|
|
||||||
|
$ctl[] = array('regex' => '#^/dashboard/$#',
|
||||||
|
'base' => $base,
|
||||||
|
'priority' => 4,
|
||||||
|
'model' => 'IDF_Views_User',
|
||||||
|
'method' => 'dashboard',
|
||||||
|
'name' => 'idf_dashboard');
|
||||||
|
|
||||||
|
$ctl[] = array('regex' => '#^/dashboard/submitted/$#',
|
||||||
|
'base' => $base,
|
||||||
|
'priority' => 4,
|
||||||
|
'model' => 'IDF_Views_User',
|
||||||
|
'method' => 'dashboard',
|
||||||
|
'params' => false,
|
||||||
|
'name' => 'idf_dashboard_submit');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/u/(.*)/$#',
|
$ctl[] = array('regex' => '#^/u/(.*)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'priority' => 4,
|
'priority' => 4,
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
<div id="hd">
|
<div id="hd">
|
||||||
{if $project}<h1 class="project-title">{$project}</h1>{/if}
|
{if $project}<h1 class="project-title">{$project}</h1>{/if}
|
||||||
<p class="top"><a href="#title" accesskey="2"></a>
|
<p class="top"><a href="#title" accesskey="2"></a>
|
||||||
{if !$user.isAnonymous()}{aurl 'url', 'IDF_Views_User::myAccount'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
||||||
{if $project} | <a href="{url 'IDF_Views::index'}">{trans 'Project List'}</a>{/if}
|
{if $project} | <a href="{url 'IDF_Views::index'}">{trans 'Project List'}</a>{/if}
|
||||||
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -34,8 +34,8 @@
|
|||||||
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">
|
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">
|
||||||
<div id="hd">
|
<div id="hd">
|
||||||
<p class="top"><a href="#title" accesskey="2"></a>
|
<p class="top"><a href="#title" accesskey="2"></a>
|
||||||
{if !$user.isAnonymous()}{aurl 'url', 'IDF_Views_User::myAccount'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
||||||
{if $isAdmin}| <a href="{url 'IDF_Views_Admin::home'}">{trans 'Administer'}</a>{/if}
|
| <a href="{url 'IDF_Views::index'}">{trans 'Project List'}</a> {if $isAdmin}| <a href="{url 'IDF_Views_Admin::home'}">{trans 'Administer'}</a>{/if}
|
||||||
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
||||||
</p>
|
</p>
|
||||||
<h1 id="title" class="title">{block title}{$page_title}{/block}</h1>
|
<h1 id="title" class="title">{block title}{$page_title}{/block}</h1>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
<div id="hd">
|
<div id="hd">
|
||||||
{if $project}<h1 class="project-title">{$project}</h1>{/if}
|
{if $project}<h1 class="project-title">{$project}</h1>{/if}
|
||||||
<p class="top"><a href="#title" accesskey="2"></a>
|
<p class="top"><a href="#title" accesskey="2"></a>
|
||||||
{if !$user.isAnonymous()}{aurl 'url', 'IDF_Views_User::myAccount'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, <strong><a class="userw" href="{$url}">{$user}</a></strong>.{/blocktrans} <a href="{url 'IDF_Views::logout'}">{trans 'Sign Out'}</a>{else}<a href="{url 'IDF_Views::login'}">{trans 'Sign in or create your account'}</a>{/if}
|
||||||
{if $project} | <a href="{url 'IDF_Views::index'}">{trans 'Project List'}</a>{/if}
|
{if $project} | <a href="{url 'IDF_Views::index'}">{trans 'Project List'}</a>{/if}
|
||||||
{if $isAdmin}| <a href="{url 'IDF_Views_Admin::home'}">{trans 'Administer'}</a>{/if}
|
{if $isAdmin}| <a href="{url 'IDF_Views_Admin::home'}">{trans 'Administer'}</a>{/if}
|
||||||
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
| <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a>
|
||||||
|
15
src/IDF/templates/idf/user/dashboard.html
Normal file
15
src/IDF/templates/idf/user/dashboard.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{extends "idf/base-simple.html"}
|
||||||
|
{block body}
|
||||||
|
{$issues.render}
|
||||||
|
{/block}
|
||||||
|
{block context}
|
||||||
|
{if $nb_owner > 0}
|
||||||
|
<p><strong>{trans 'Working issues:'}</strong> <a href="{url 'idf_dashboard'}">{$nb_owner}</a></p>
|
||||||
|
{/if}
|
||||||
|
<p><strong>{trans 'Submitted issues:'}</strong> <a href="{url 'idf_dashboard_submit'}">{$nb_submit}</a></p>
|
||||||
|
{aurl 'url', 'IDF_Views_User::myAccount'}
|
||||||
|
<p>{blocktrans}<a href="{$url}">Update your account</a>.{/blocktrans}</p>
|
||||||
|
{aurl 'url', 'IDF_Views_User::view', array($user.login)}
|
||||||
|
<p>{blocktrans}<a href="{$url}">See your public profile</a>.{/blocktrans}</p>
|
||||||
|
{/block}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user