Make the timeline view and RSS feeds filterable by model (closes issue 543).
This commit is contained in:
parent
b518385962
commit
5af2ab4d97
@ -61,6 +61,66 @@ class IDF_Views_Project
|
|||||||
$request);
|
$request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an associative array with available model filters
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private static function getAvailableModelFilters()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'all' => __('All Updates'),
|
||||||
|
'commits' => __('Commits'),
|
||||||
|
'issues' => __('Issues and Comments'),
|
||||||
|
'downloads' => __('Downloads'),
|
||||||
|
'documents' => __('Documents'),
|
||||||
|
'reviews' => __('Reviews and Patches'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of model classes for which the current user
|
||||||
|
* has rights and which should be used according to his filter
|
||||||
|
*
|
||||||
|
* @param object $request
|
||||||
|
* @param string $model_filter
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private static function determineModelClasses($request, $model_filter = 'all')
|
||||||
|
{
|
||||||
|
$classes = array();
|
||||||
|
if (true === IDF_Precondition::accessSource($request) &&
|
||||||
|
($model_filter == 'all' || $model_filter == 'commits')) {
|
||||||
|
$classes[] = '\'IDF_Commit\'';
|
||||||
|
// FIXME: this looks like a hack...
|
||||||
|
IDF_Scm::syncTimeline($request->project);
|
||||||
|
}
|
||||||
|
if (true === IDF_Precondition::accessIssues($request) &&
|
||||||
|
($model_filter == 'all' || $model_filter == 'issues')) {
|
||||||
|
$classes[] = '\'IDF_Issue\'';
|
||||||
|
$classes[] = '\'IDF_IssueComment\'';
|
||||||
|
}
|
||||||
|
if (true === IDF_Precondition::accessDownloads($request) &&
|
||||||
|
($model_filter == 'all' || $model_filter == 'downloads')) {
|
||||||
|
$classes[] = '\'IDF_Upload\'';
|
||||||
|
}
|
||||||
|
if (true === IDF_Precondition::accessWiki($request) &&
|
||||||
|
($model_filter == 'all' || $model_filter == 'documents')) {
|
||||||
|
$classes[] = '\'IDF_WikiPage\'';
|
||||||
|
$classes[] = '\'IDF_WikiRevision\'';
|
||||||
|
}
|
||||||
|
if (true === IDF_Precondition::accessReview($request) &&
|
||||||
|
($model_filter == 'all' || $model_filter == 'reviews')) {
|
||||||
|
$classes[] = '\'IDF_Review_Comment\'';
|
||||||
|
$classes[] = '\'IDF_Review_Patch\'';
|
||||||
|
}
|
||||||
|
if (count($classes) == 0) {
|
||||||
|
$classes[] = '\'IDF_Dummy\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $classes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Timeline of the project.
|
* Timeline of the project.
|
||||||
*/
|
*/
|
||||||
@ -68,38 +128,21 @@ class IDF_Views_Project
|
|||||||
public function timeline($request, $match)
|
public function timeline($request, $match)
|
||||||
{
|
{
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
$title = sprintf(__('%s Updates'), (string) $prj);
|
|
||||||
$team = $prj->getMembershipData();
|
$model_filter = @$match[2];
|
||||||
|
$all_model_filters = self::getAvailableModelFilters();
|
||||||
|
if (!array_key_exists($model_filter, $all_model_filters)) {
|
||||||
|
$model_filter = 'all';
|
||||||
|
}
|
||||||
|
$title = (string)$prj . ' ' . $all_model_filters[$model_filter];
|
||||||
|
|
||||||
$pag = new IDF_Timeline_Paginator(new IDF_Timeline());
|
$pag = new IDF_Timeline_Paginator(new IDF_Timeline());
|
||||||
$pag->class = 'recent-issues';
|
$pag->class = 'recent-issues';
|
||||||
$pag->item_extra_props = array('request' => $request);
|
$pag->item_extra_props = array('request' => $request);
|
||||||
$pag->summary = __('This table shows the project updates.');
|
$pag->summary = __('This table shows the project updates.');
|
||||||
// Need to check the rights
|
|
||||||
$rights = array();
|
$classes = self::determineModelClasses($request, $model_filter);
|
||||||
if (true === IDF_Precondition::accessSource($request)) {
|
$sql = sprintf('model_class IN (%s)', implode(', ', $classes));
|
||||||
$rights[] = '\'IDF_Commit\'';
|
|
||||||
IDF_Scm::syncTimeline($request->project);
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessIssues($request)) {
|
|
||||||
$rights[] = '\'IDF_Issue\'';
|
|
||||||
$rights[] = '\'IDF_IssueComment\'';
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessDownloads($request)) {
|
|
||||||
$rights[] = '\'IDF_Upload\'';
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessWiki($request)) {
|
|
||||||
$rights[] = '\'IDF_WikiPage\'';
|
|
||||||
$rights[] = '\'IDF_WikiRevision\'';
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessReview($request)) {
|
|
||||||
$rights[] = '\'IDF_Review_Comment\'';
|
|
||||||
$rights[] = '\'IDF_Review_Patch\'';
|
|
||||||
}
|
|
||||||
if (count($rights) == 0) {
|
|
||||||
$rights[] = '\'IDF_Dummy\'';
|
|
||||||
}
|
|
||||||
$sql = sprintf('model_class IN (%s)', implode(', ', $rights));
|
|
||||||
$pag->forced_where = new Pluf_SQL('project=%s AND '.$sql,
|
$pag->forced_where = new Pluf_SQL('project=%s AND '.$sql,
|
||||||
array($prj->id));
|
array($prj->id));
|
||||||
$pag->sort_order = array('creation_dtime', 'ASC');
|
$pag->sort_order = array('creation_dtime', 'ASC');
|
||||||
@ -113,32 +156,23 @@ class IDF_Views_Project
|
|||||||
$pag->items_per_page = 20;
|
$pag->items_per_page = 20;
|
||||||
$pag->no_results_text = __('No changes were found.');
|
$pag->no_results_text = __('No changes were found.');
|
||||||
$pag->setFromRequest($request);
|
$pag->setFromRequest($request);
|
||||||
$downloads = array();
|
|
||||||
if ($request->rights['hasDownloadsAccess']) {
|
|
||||||
$tags = IDF_Views_Download::getDownloadTags($prj);
|
|
||||||
// the first tag is the featured, the last is the deprecated.
|
|
||||||
$downloads = $tags[0]->get_idf_upload_list();
|
|
||||||
}
|
|
||||||
$pages = array();
|
|
||||||
if ($request->rights['hasWikiAccess']) {
|
|
||||||
$tags = IDF_Views_Wiki::getWikiTags($prj);
|
|
||||||
$pages = $tags[0]->get_idf_wikipage_list();
|
|
||||||
}
|
|
||||||
if (!$request->user->isAnonymous() and $prj->isRestricted()) {
|
if (!$request->user->isAnonymous() and $prj->isRestricted()) {
|
||||||
$feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth',
|
$feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth',
|
||||||
array($prj->shortname,
|
array($prj->shortname,
|
||||||
|
$model_filter,
|
||||||
IDF_Precondition::genFeedToken($prj, $request->user)));
|
IDF_Precondition::genFeedToken($prj, $request->user)));
|
||||||
} else {
|
} else {
|
||||||
$feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed',
|
$feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed',
|
||||||
array($prj->shortname));
|
array($prj->shortname, $model_filter));
|
||||||
}
|
}
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/project/timeline.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/project/timeline.html',
|
||||||
array(
|
array(
|
||||||
'page_title' => $title,
|
'page_title' => $title,
|
||||||
'feedurl' => $feedurl,
|
'feedurl' => $feedurl,
|
||||||
'timeline' => $pag,
|
'timeline' => $pag,
|
||||||
'team' => $team,
|
'model_filter' => $model_filter,
|
||||||
'downloads' => $downloads,
|
'all_model_filters' => $all_model_filters,
|
||||||
),
|
),
|
||||||
$request);
|
$request);
|
||||||
|
|
||||||
@ -156,31 +190,17 @@ class IDF_Views_Project
|
|||||||
public function timelineFeed($request, $match)
|
public function timelineFeed($request, $match)
|
||||||
{
|
{
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
// Need to check the rights
|
$model_filter = @$match[2];
|
||||||
$rights = array();
|
|
||||||
if (true === IDF_Precondition::accessSource($request)) {
|
$model_filter = @$match[2];
|
||||||
$rights[] = '\'IDF_Commit\'';
|
$all_model_filters = self::getAvailableModelFilters();
|
||||||
IDF_Scm::syncTimeline($request->project);
|
if (!array_key_exists($model_filter, $all_model_filters)) {
|
||||||
|
$model_filter = 'all';
|
||||||
}
|
}
|
||||||
if (true === IDF_Precondition::accessIssues($request)) {
|
$title = $all_model_filters[$model_filter];
|
||||||
$rights[] = '\'IDF_Issue\'';
|
|
||||||
$rights[] = '\'IDF_IssueComment\'';
|
$classes = self::determineModelClasses($request, $model_filter);
|
||||||
}
|
$sqls = sprintf('model_class IN (%s)', implode(', ', $classes));
|
||||||
if (true === IDF_Precondition::accessDownloads($request)) {
|
|
||||||
$rights[] = '\'IDF_Upload\'';
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessWiki($request)) {
|
|
||||||
$rights[] = '\'IDF_WikiPage\'';
|
|
||||||
$rights[] = '\'IDF_WikiRevision\'';
|
|
||||||
}
|
|
||||||
if (true === IDF_Precondition::accessReview($request)) {
|
|
||||||
$rights[] = '\'IDF_Review_Comment\'';
|
|
||||||
$rights[] = '\'IDF_Review_Patch\'';
|
|
||||||
}
|
|
||||||
if (count($rights) == 0) {
|
|
||||||
$rights[] = '\'IDF_Dummy\'';
|
|
||||||
}
|
|
||||||
$sqls = sprintf('model_class IN (%s)', implode(', ', $rights));
|
|
||||||
$sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id));
|
$sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id));
|
||||||
$params = array(
|
$params = array(
|
||||||
'filter' => $sql->gen(),
|
'filter' => $sql->gen(),
|
||||||
@ -203,7 +223,6 @@ class IDF_Views_Project
|
|||||||
}
|
}
|
||||||
$out = Pluf_Template::markSafe(implode("\n", $out));
|
$out = Pluf_Template::markSafe(implode("\n", $out));
|
||||||
$tmpl = new Pluf_Template('idf/index.atom');
|
$tmpl = new Pluf_Template('idf/index.atom');
|
||||||
$title = __('Updates');
|
|
||||||
$feedurl = Pluf::f('url_base').Pluf::f('idf_base').$request->query;
|
$feedurl = Pluf::f('url_base').Pluf::f('idf_base').$request->query;
|
||||||
$viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline',
|
$viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline',
|
||||||
array($prj->shortname));
|
array($prj->shortname));
|
||||||
|
@ -74,18 +74,18 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/$#',
|
|||||||
'model' => 'IDF_Views_Project',
|
'model' => 'IDF_Views_Project',
|
||||||
'method' => 'home');
|
'method' => 'home');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/(\w+)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Project',
|
'model' => 'IDF_Views_Project',
|
||||||
'method' => 'timeline');
|
'method' => 'timeline');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/(\w+)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Project',
|
'model' => 'IDF_Views_Project',
|
||||||
'method' => 'timelineFeed',
|
'method' => 'timelineFeed',
|
||||||
'name' => 'idf_project_timeline_feed');
|
'name' => 'idf_project_timeline_feed');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/token/(.*)/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/(\w+)/token/(.*)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Project',
|
'model' => 'IDF_Views_Project',
|
||||||
'method' => 'timelineFeed',
|
'method' => 'timelineFeed',
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// <!--
|
// <!--
|
||||||
{hotkey 'Shift+h', 'IDF_Views::faq'}
|
{hotkey 'Shift+h', 'IDF_Views::faq'}
|
||||||
{if $project}
|
{if $project}
|
||||||
{hotkey 'Shift+u', 'IDF_Views_Project::timeline', array($project.shortname)}
|
{hotkey 'Shift+u', 'IDF_Views_Project::timeline', array($project.shortname, 'all')}
|
||||||
{if $hasIssuesAccess}{hotkey 'Shift+a', 'IDF_Views_Issue::create', array($project.shortname)}
|
{if $hasIssuesAccess}{hotkey 'Shift+a', 'IDF_Views_Issue::create', array($project.shortname)}
|
||||||
{hotkey 'Shift+i', 'IDF_Views_Issue::index', array($project.shortname)}{/if}
|
{hotkey 'Shift+i', 'IDF_Views_Issue::index', array($project.shortname)}{/if}
|
||||||
{if $hasDownloadsAccess}{hotkey 'Shift+d', 'IDF_Views_Download::index', array($project.shortname)}{/if}
|
{if $hasDownloadsAccess}{hotkey 'Shift+d', 'IDF_Views_Download::index', array($project.shortname)}{/if}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{block tabhome} class="active"{/block}
|
{block tabhome} class="active"{/block}
|
||||||
{block subtabs}
|
{block subtabs}
|
||||||
<div id="sub-tabs">
|
<div id="sub-tabs">
|
||||||
{trans 'Welcome'} | <strong><a href="{url 'IDF_Views_Project::timeline', array($project.shortname)}">{trans 'Latest Updates'}</a></strong>{superblock}
|
{trans 'Welcome'} | <strong><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, 'all')}">{trans 'Latest Updates'}</a></strong>{superblock}
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
{block body}
|
{block body}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
{block tabhome} class="active"{/block}
|
{block tabhome} class="active"{/block}
|
||||||
{block subtabs}
|
{block subtabs}
|
||||||
<div id="sub-tabs">
|
<div id="sub-tabs">
|
||||||
<a href="{url 'IDF_Views_Project::home', array($project.shortname)}">{trans 'Welcome'}</a> | <strong><a href="{url 'IDF_Views_Project::timeline', array($project.shortname)}" class="active">{trans 'Latest Updates'}</a></strong>{superblock}
|
<a href="{url 'IDF_Views_Project::home', array($project.shortname)}">{trans 'Welcome'}</a> | <strong><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, 'all')}" class="active">{trans 'Latest Updates'}</a></strong>{superblock}
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
@ -13,26 +13,10 @@
|
|||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
{block context}
|
{block context}
|
||||||
{if count($downloads) > 0}
|
<p><strong>{trans 'Filter by type'}</strong><br />
|
||||||
<p><strong>{trans 'Featured Downloads'}</strong><br />
|
{foreach $all_model_filters as $filter_key => $filter_name}
|
||||||
{foreach $downloads as $download}
|
<span class="label{if $filter_key == $model_filter} active{/if}"><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, $filter_key)}">{$filter_name}</a></span><br />
|
||||||
<span class="label"><a href="{url 'IDF_Views_Download::view', array($project.shortname, $download.id)}" title="{$download.summary}">{$download}</a></span><br />
|
|
||||||
{/foreach}
|
{/foreach}
|
||||||
<span class="label"> </span><span class="note"><a href="{url 'IDF_Views_Download::index', array($project.shortname)}">{trans 'show more...'}</a></span>
|
|
||||||
{/if}
|
|
||||||
{assign $ko = 'owners'}
|
|
||||||
{assign $km = 'members'}
|
|
||||||
<p><strong>{trans 'Development Team'}</strong><br />
|
|
||||||
{trans 'Admins'}<br />
|
|
||||||
{foreach $team[$ko] as $owner}{aurl 'url', 'IDF_Views_User::view', array($owner.login)}
|
|
||||||
<span class="label"><a class="label" href="{$url}">{$owner}</a></span><br />
|
|
||||||
{/foreach}
|
|
||||||
{if count($team[$km]) > 0}
|
|
||||||
{trans 'Happy Crew'}<br />
|
|
||||||
{foreach $team[$km] as $member}{aurl 'url', 'IDF_Views_User::view', array($member.login)}
|
|
||||||
<span class="label"><a class="label" href="{$url}">{$member}</a></span><br />
|
|
||||||
{/foreach}
|
|
||||||
{/if}
|
|
||||||
</p>
|
</p>
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user