Fixed issue 4, with fine control over the tabs access.

For each tab, at the exception of the project home and the
administration area, it possible to control the access rights if the
user is anonymous, signed in, member or owner.
This commit is contained in:
Loic d'Anterroches 2008-08-07 15:35:03 +02:00
parent 1831716b07
commit 7383e18dff
20 changed files with 475 additions and 70 deletions

57
src/IDF/Form/TabsConf.php Normal file
View File

@ -0,0 +1,57 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2008 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* Configuration of the tabs access.
*/
class IDF_Form_TabsConf extends Pluf_Form
{
public $conf = null;
public function initFields($extra=array())
{
$this->conf = $extra['conf'];
$ak = array('downloads_access_rights' => __('Downloads'),
'source_access_rights' => __('Source'),
'issues_access_rights' => __('Issues'),);
foreach ($ak as $key=>$label) {
$this->fields[$key] = new Pluf_Form_Field_Varchar(
array('required' => true,
'label' => $label,
'initial' => $this->conf->getVal($key, 'all'),
'widget_attrs' => array('choices' =>
array(
__('Open to all') => 'all',
__('Signed in users') => 'login',
__('Project members') => 'members',
__('Project owners') => 'owners',
__('Closed') => 'none',
)
),
'widget' => 'Pluf_Form_Widget_SelectInput',
));
}
}
}

View File

@ -24,6 +24,7 @@
/**
* Project middleware.
*
* It must be after the session middleware.
*/
class IDF_Middleware
{
@ -49,6 +50,15 @@ class IDF_Middleware
} catch (Pluf_HTTP_Error404 $e) {
return new Pluf_HTTP_Response_NotFound(sprintf(__('The page <em>%s</em> was not found on the server.'), htmlspecialchars($request->query)));
}
$request->conf = new IDF_Conf();
$request->conf->setProject($request->project);
$ak = array('downloads_access_rights' => 'hasDownloadsAccess',
'source_access_rights' => 'hasSourceAccess',
'issues_access_rights' => 'hasIssuesAccess');
$request->rights = array();
foreach ($ak as $key=>$val) {
$request->rights[$val] = (true === IDF_Precondition::accessTabGeneric($request, $key));
}
}
return false;
}
@ -58,12 +68,14 @@ class IDF_Middleware
function IDF_Middleware_ContextPreProcessor($request)
{
$c = array();
$c['request'] = $request;
if (isset($request->project)) {
$c['project'] = $request->project;
$c['isOwner'] = $request->user->hasPerm('IDF.project-owner',
$request->project);
$c['isMember'] = $request->user->hasPerm('IDF.project-member',
$request->project);
$c = array_merge($c, $request->rights);
}
return $c;
}

View File

@ -61,4 +61,53 @@ class IDF_Precondition
}
return new Pluf_HTTP_Response_Forbidden($request);
}
/**
* Check if the user can access a given element.
*
* The rights are:
* - 'all' (default)
* - 'none'
* - 'login'
* - 'members'
* - 'owners'
*
* The order of the rights is such that a 'owner' is also a
* 'member' and of course a logged in person.
*
* @param Pluf_HTTP_Request
* @param string Control key
* @return mixed
*/
static public function accessTabGeneric($request, $key)
{
switch ($request->conf->getVal($key, 'all')) {
case 'none':
return new Pluf_HTTP_Response_Forbidden($request);
case 'login':
return Pluf_Precondition::loginRequired($request);
case 'members':
return self::projectMemberOrOwner($request);
case 'owners':
return self::projectOwner($request);
case 'all':
default:
return true;
}
}
static public function accessSource($request)
{
return self::accessTabGeneric($request, 'source_access_rights');
}
static public function accessIssues($request)
{
return self::accessTabGeneric($request, 'issues_access_rights');
}
static public function accessDownloads($request)
{
return self::accessTabGeneric($request, 'downloads_access_rights');
}
}

View File

@ -29,21 +29,27 @@ Pluf::loadFunction('Pluf_HTTP_URL_urlForView');
class IDF_Template_IssueComment extends Pluf_Template_Tag
{
private $project = null;
private $request = null;
private $git = null;
function start($text, $project)
function start($text, $request)
{
$this->project = $project;
$this->project = $request->project;
$this->request = $request;
$this->git = new IDF_Git($this->project->getGitRepository());
$text = wordwrap($text, 69, "\n", true);
$text = Pluf_esc($text);
$text = ereg_replace('[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]',
'<a href="\\0" rel="nofollow">\\0</a>',
$text);
$text = preg_replace_callback('#(issues?|bugs?|tickets?)\s+(\d+)((\s+and|\s+or|,)\s+(\d+)){0,}#im',
array($this, 'callbackIssues'), $text);
$text = preg_replace_callback('#(commit\s+)([0-9a-f]{5,40})#im',
array($this, 'callbackCommit'), $text);
if ($request->rights['hasIssuesAccess']) {
$text = preg_replace_callback('#(issues?|bugs?|tickets?)\s+(\d+)((\s+and|\s+or|,)\s+(\d+)){0,}#im',
array($this, 'callbackIssues'), $text);
}
if ($request->rights['hasSourceAccess']) {
$text = preg_replace_callback('#(commit\s+)([0-9a-f]{5,40})#im',
array($this, 'callbackCommit'), $text);
}
echo $text;
}

View File

@ -38,6 +38,7 @@ class IDF_Views_Download
/**
* List the files available for download.
*/
public $index_precond = array('IDF_Precondition::accessDownloads');
public function index($request, $match)
{
$prj = $request->project;
@ -75,6 +76,7 @@ class IDF_Views_Download
/**
* View details of a file.
*/
public $view_precond = array('IDF_Precondition::accessDownloads');
public function view($request, $match)
{
$prj = $request->project;
@ -123,6 +125,7 @@ class IDF_Views_Download
/**
* Download a file.
*/
public $download_precond = array('IDF_Precondition::accessDownloads');
public function download($request, $match)
{
$prj = $request->project;
@ -136,7 +139,8 @@ class IDF_Views_Download
/**
* Submit a new file for download.
*/
public $submit_precond = array('IDF_Precondition::projectMemberOrOwner');
public $submit_precond = array('IDF_Precondition::accessDownloads',
'IDF_Precondition::projectMemberOrOwner');
public function submit($request, $match)
{
$prj = $request->project;
@ -197,6 +201,7 @@ class IDF_Views_Download
/**
* View list of downloads with a given label.
*/
public $listLabel_precond = array('IDF_Precondition::accessDownloads');
public function listLabel($request, $match)
{
$prj = $request->project;

View File

@ -34,6 +34,7 @@ class IDF_Views_Issue
/**
* View list of issues for a given project.
*/
public $index_precond = array('IDF_Precondition::accessIssues');
public function index($request, $match)
{
$prj = $request->project;
@ -77,7 +78,8 @@ class IDF_Views_Issue
*
* Only open issues are shown.
*/
public $myIssues_precond = array('Pluf_Precondition::loginRequired');
public $myIssues_precond = array('IDF_Precondition::accessIssues',
'Pluf_Precondition::loginRequired');
public function myIssues($request, $match)
{
$prj = $request->project;
@ -124,7 +126,8 @@ class IDF_Views_Issue
$request);
}
public $create_precond = array('Pluf_Precondition::loginRequired');
public $create_precond = array('IDF_Precondition::accessIssues',
'Pluf_Precondition::loginRequired');
public function create($request, $match)
{
$prj = $request->project;
@ -157,6 +160,7 @@ class IDF_Views_Issue
$request);
}
public $view_precond = array('IDF_Precondition::accessIssues');
public function view($request, $match)
{
$prj = $request->project;
@ -204,6 +208,7 @@ class IDF_Views_Issue
/**
* View list of issues for a given project with a given status.
*/
public $listStatus_precond = array('IDF_Precondition::accessIssues');
public function listStatus($request, $match)
{
$prj = $request->project;
@ -246,6 +251,7 @@ class IDF_Views_Issue
/**
* View list of issues for a given project with a given label.
*/
public $listLabel_precond = array('IDF_Precondition::accessIssues');
public function listLabel($request, $match)
{
$prj = $request->project;

View File

@ -39,9 +39,12 @@ class IDF_Views_Project
$prj = $request->project;
$team = $prj->getMembershipData();
$title = (string) $prj;
$tags = IDF_Views_Download::getDownloadTags($prj);
// the first tag is the featured, the last is the deprecated.
$downloads = $tags[0]->get_idf_upload_list();
$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();
}
return Pluf_Shortcuts_RenderToResponse('project-home.html',
array(
'page_title' => $title,
@ -201,4 +204,49 @@ class IDF_Views_Project
),
$request);
}
/**
* Administrate the access rights to the tabs.
*/
public $adminTabs_precond = array('IDF_Precondition::projectOwner');
public function adminTabs($request, $match)
{
$prj = $request->project;
$title = sprintf(__('%s Tabs Access Rights'), (string) $prj);
$extra = array(
'conf' => $request->conf,
);
if ($request->method == 'POST') {
$form = new IDF_Form_TabsConf($request->POST, $extra);
if ($form->isValid()) {
foreach ($form->cleaned_data as $key=>$val) {
$request->conf->setVal($key, $val);
}
$request->user->setMessage(__('The project tabs access rights have been saved.'));
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::adminTabs',
array($prj->shortname));
return new Pluf_HTTP_Response_Redirect($url);
}
} else {
$params = array();
$keys = array('downloads_access_rights', 'source_access_rights',
'issues_access_rights');
foreach ($keys as $key) {
$_val = $request->conf->getVal($key, false);
if ($_val !== false) {
$params[$key] = $_val;
}
}
if (count($params) == 0) {
$params = null; //Nothing in the db, so new form.
}
$form = new IDF_Form_TabsConf($params, $extra);
}
return Pluf_Shortcuts_RenderToResponse('admin/tabs.html',
array(
'page_title' => $title,
'form' => $form,
),
$request);
}
}

View File

@ -31,6 +31,7 @@ Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel');
*/
class IDF_Views_Source
{
public $changeLog_precond = array('IDF_Precondition::accessSource');
public function changeLog($request, $match)
{
$title = sprintf(__('%s Git Change Log'), (string) $request->project);
@ -49,6 +50,7 @@ class IDF_Views_Source
$request);
}
public $treeBase_precond = array('IDF_Precondition::accessSource');
public function treeBase($request, $match)
{
$title = sprintf(__('%s Git Source Tree'), (string) $request->project);
@ -78,6 +80,7 @@ class IDF_Views_Source
$request);
}
public $tree_precond = array('IDF_Precondition::accessSource');
public function tree($request, $match)
{
$title = sprintf(__('%s Git Source Tree'), (string) $request->project);
@ -149,6 +152,7 @@ class IDF_Views_Source
return '<span class="breadcrumb">'.implode('<span class="sep">'.$sep.'</span>', $out).'</span>';
}
public $commit_precond = array('IDF_Precondition::accessSource');
public function commit($request, $match)
{
$git = new IDF_Git($request->project->getGitRepository());
@ -182,6 +186,7 @@ class IDF_Views_Source
* Get a zip archive of the current commit.
*
*/
public $download_precond = array('IDF_Precondition::accessSource');
public function download($request, $match)
{
$commit = trim($match[2]);

View File

@ -103,8 +103,8 @@ $cfg['db_database'] = 'website';
$cfg['installed_apps'] = array('Pluf', 'IDF');
$cfg['pluf_use_rowpermission'] = true;
$cfg['middleware_classes'] = array(
'IDF_Middleware',
'Pluf_Middleware_Session',
'IDF_Middleware',
'Pluf_Middleware_Translation',
);
$cfg['template_context_processors'] = array('IDF_Middleware_ContextPreProcessor');

View File

@ -206,4 +206,10 @@ $ctl[] = array('regex' => '#^/p/(\w+)/admin/members/$#',
'model' => 'IDF_Views_Project',
'method' => 'adminMembers');
$ctl[] = array('regex' => '#^/p/(\w+)/admin/tabs/$#',
'base' => $base,
'priority' => 4,
'model' => 'IDF_Views_Project',
'method' => 'adminTabs');
return $ctl;

View File

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: InDefero\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-08-06 22:28+0200\n"
"PO-Revision-Date: 2008-08-06 22:30+0100\n"
"POT-Creation-Date: 2008-08-07 15:31+0200\n"
"PO-Revision-Date: 2008-08-07 15:34+0100\n"
"Last-Translator: Loïc d'Anterroches <titoo@users.sourceforge.net>\n"
"Language-Team: Translation team <titoo@users.sourceforge.net>\n"
"MIME-Version: 1.0\n"
@ -101,6 +101,7 @@ msgid "modification date"
msgstr "date de modification"
#: IDF/Middleware.php:50
#: IDF/Middleware.php:51
#, php-format
msgid "The page <em>%s</em> was not found on the server."
msgstr "Cette page <em>%s</em> n'a pas été trouvée sur le serveur."
@ -186,48 +187,58 @@ msgid "Here to Help You!"
msgstr "Ici pour vous aider !"
#: IDF/Views/Project.php:62
#: IDF/Views/Project.php:65
#, php-format
msgid "%s Project Summary"
msgstr "Résumé du projet %s"
#: IDF/Views/Project.php:69
#: IDF/Views/Project.php:72
msgid "The project has been updated."
msgstr "Le projet a été mis à jour."
#: IDF/Views/Project.php:93
#: IDF/Views/Project.php:96
#, php-format
msgid "%s Issue Tracking Configuration"
msgstr "Configuration du gestionnaire de tickets de %s"
#: IDF/Views/Project.php:102
#: IDF/Views/Project.php:105
msgid "The issue tracking configuration has been saved."
msgstr "La configuration du gestionnaire de tickets a été sauvegardée."
#: IDF/Views/Project.php:137
#: IDF/Views/Project.php:140
#, php-format
msgid "%s Downloads Configuration"
msgstr "Configuration des Téléchargements de %s"
#: IDF/Views/Project.php:146
#: IDF/Views/Project.php:149
msgid "The downloads configuration has been saved."
msgstr "La configuration des téléchargements a été sauvegardée."
#: IDF/Views/Project.php:180
#: IDF/Views/Project.php:183
#, php-format
msgid "%s Project Members"
msgstr "Membres du projet %s"
#: IDF/Views/Project.php:189
#: IDF/Views/Project.php:192
msgid "The project membership has been saved."
msgstr "Les membres du projet ont été sauvegardés."
#: IDF/Views/Download.php:44
#: IDF/Views/Download.php:45
#, php-format
msgid "%s Downloads"
msgstr "Téléchargements de %s"
#: IDF/Views/Download.php:50
#: IDF/Views/Download.php:52
#: IDF/Views/Download.php:51
msgid "This table shows the files to download."
msgstr "Ce tableau présente la liste des fichiers en téléchargement."
@ -237,6 +248,8 @@ msgstr "Ce tableau présente la liste des fichiers en téléchargement."
#: IDF/Views/Download.php:56
#: IDF/Views/Download.php:212
#: IDF/Views/Download.php:218
#: IDF/Views/Download.php:55
#: IDF/Views/Download.php:223
msgid "File"
msgstr "Fichier"
@ -252,6 +265,12 @@ msgstr "Fichier"
#: IDF/Views/Download.php:57
#: IDF/Views/Download.php:213
#: IDF/Views/Download.php:219
#: IDF/Views/Download.php:56
#: IDF/Views/Download.php:224
#: IDF/Views/Issue.php:58
#: IDF/Views/Issue.php:111
#: IDF/Views/Issue.php:233
#: IDF/Views/Issue.php:287
msgid "Summary"
msgstr "Résumé"
@ -260,6 +279,8 @@ msgstr "Résumé"
#: IDF/Views/Download.php:58
#: IDF/Views/Download.php:214
#: IDF/Views/Download.php:220
#: IDF/Views/Download.php:57
#: IDF/Views/Download.php:225
msgid "Size"
msgstr "Taille"
@ -267,6 +288,8 @@ msgstr "Taille"
#: IDF/Views/Download.php:59
#: IDF/Views/Download.php:215
#: IDF/Views/Download.php:221
#: IDF/Views/Download.php:58
#: IDF/Views/Download.php:226
msgid "Uploaded"
msgstr "Mis en ligne"
@ -274,11 +297,14 @@ msgstr "Mis en ligne"
#: IDF/Views/Download.php:63
#: IDF/Views/Download.php:219
#: IDF/Views/Download.php:225
#: IDF/Views/Download.php:62
#: IDF/Views/Download.php:230
msgid "No downloads were found."
msgstr "Aucun fichier n'a été trouvé."
#: IDF/Views/Download.php:81
#: IDF/Views/Download.php:83
#: IDF/Views/Download.php:85
#, php-format
msgid "Download %s"
msgstr "Télécharger %s"
@ -286,6 +312,7 @@ msgstr "Télécharger %s"
#: IDF/Views/Download.php:94
#: IDF/Views/Download.php:96
#: IDF/Views/Download.php:100
#: IDF/Views/Download.php:102
#, php-format
msgid "The file <a href=\"%1$s\">%2$s</a> has been updated."
msgstr "Le fichier <a href=\"%1$s\">%2$s</a> a été mis à jour."
@ -295,23 +322,28 @@ msgstr "Le fichier <a href=\"%1$s\">%2$s</a> a été mis à jour."
#: IDF/gettexttemplates/downloads/index.html.php:3
#: IDF/Views/Download.php:137
#: IDF/Views/Download.php:143
#: IDF/Views/Download.php:147
msgid "New Download"
msgstr "Nouveau téléchargement"
#: IDF/Views/Download.php:144
#: IDF/Views/Download.php:146
#: IDF/Views/Download.php:152
#: IDF/Views/Download.php:156
#, php-format
msgid "The <a href=\"%s\">file</a> has been uploaded."
msgstr "Le <a href=\"%s\">fichier</a> a été mis en ligne."
#: IDF/Views/Issue.php:40
#: IDF/Views/Issue.php:41
#, php-format
msgid "%s Recent Issues"
msgstr "Tickets récents de %s"
#: IDF/Views/Issue.php:49
#: IDF/Views/Issue.php:103
#: IDF/Views/Issue.php:50
#: IDF/Views/Issue.php:105
msgid "This table shows the open recent issues."
msgstr "Ce tableau montre les tickets récents."
@ -319,6 +351,10 @@ msgstr "Ce tableau montre les tickets récents."
#: IDF/Views/Issue.php:108
#: IDF/Views/Issue.php:227
#: IDF/Views/Issue.php:280
#: IDF/Views/Issue.php:57
#: IDF/Views/Issue.php:110
#: IDF/Views/Issue.php:232
#: IDF/Views/Issue.php:286
msgid "Id"
msgstr "Id"
@ -328,6 +364,10 @@ msgstr "Id"
#: IDF/Views/Issue.php:282
#: IDF/Form/IssueCreate.php:70
#: IDF/Form/IssueUpdate.php:66
#: IDF/Views/Issue.php:59
#: IDF/Views/Issue.php:112
#: IDF/Views/Issue.php:234
#: IDF/Views/Issue.php:288
msgid "Status"
msgstr "Statut"
@ -335,6 +375,10 @@ msgstr "Statut"
#: IDF/Views/Issue.php:111
#: IDF/Views/Issue.php:230
#: IDF/Views/Issue.php:283
#: IDF/Views/Issue.php:60
#: IDF/Views/Issue.php:113
#: IDF/Views/Issue.php:235
#: IDF/Views/Issue.php:289
msgid "Last Updated"
msgstr "Dernière mise à jour"
@ -342,58 +386,73 @@ msgstr "Dernière mise à jour"
#: IDF/Views/Issue.php:115
#: IDF/Views/Issue.php:234
#: IDF/Views/Issue.php:287
#: IDF/Views/Issue.php:64
#: IDF/Views/Issue.php:117
#: IDF/Views/Issue.php:239
#: IDF/Views/Issue.php:293
msgid "No issues were found."
msgstr "Aucun ticket n'a été trouvé."
#: IDF/Views/Issue.php:87
#: IDF/Views/Issue.php:89
#, php-format
msgid "My Submitted %s Issues"
msgstr "Mes tickets soumis pour %s"
#: IDF/Views/Issue.php:90
#: IDF/Views/Issue.php:92
#, php-format
msgid "My Working %s Issues"
msgstr "Mes tickets en cours pour %s"
#: IDF/Views/Issue.php:131
#: IDF/Views/Issue.php:134
msgid "Submit a new issue"
msgstr "Soumettre un nouveau ticket"
#: IDF/Views/Issue.php:143
#: IDF/Views/Issue.php:146
#, php-format
msgid "<a href=\"%s\">Issue %d</a> has been created."
msgstr "Le <a href=\"%s\">ticket %d</a> a été créé."
#: IDF/Views/Issue.php:168
#: IDF/Views/Issue.php:172
#, php-format
msgid "Issue <a href=\"%s\">%d</a>: %s"
msgstr "Ticket <a href=\"%s\">%d</a> : %s"
#: IDF/Views/Issue.php:184
#: IDF/Views/Issue.php:188
#, php-format
msgid "<a href=\"%s\">Issue %d</a> has been updated."
msgstr "Le <a href=\"%s\">ticket %d</a> a été mise à jour."
#: IDF/Views/Issue.php:211
#: IDF/Views/Issue.php:216
#, php-format
msgid "%s Closed Issues"
msgstr "Tickets fermés de %s"
#: IDF/Views/Issue.php:220
#: IDF/Views/Issue.php:225
msgid "This table shows the closed issues."
msgstr "Ce tableau montre les tickets fermés."
#: IDF/Views/Issue.php:258
#: IDF/Views/Issue.php:264
#, php-format
msgid "%1$s Issues with Label %2$s"
msgstr "%1$s tickets avec l'étiquette %2$s"
#: IDF/Views/Issue.php:261
#: IDF/Views/Issue.php:267
#, php-format
msgid "%1$s Closed Issues with Label %2$s"
msgstr "Tickets fermés de %1$s avec l'étiquette %2$s"
#: IDF/Views/Issue.php:273
#: IDF/Views/Issue.php:279
#, php-format
msgid "This table shows the issues with label %s."
msgstr "Ce tableau montre les tickets avec l'étiquette %s."
@ -429,16 +488,19 @@ msgid "Project Home"
msgstr "Page d'Accueil"
#: IDF/gettexttemplates/base.html.php:9
#: IDF/Form/TabsConf.php:36
msgid "Issues"
msgstr "Tickets"
#: IDF/gettexttemplates/base.html.php:10
#: IDF/gettexttemplates/downloads/base.html.php:3
#: IDF/gettexttemplates/admin/base.html.php:6
#: IDF/Form/TabsConf.php:34
msgid "Downloads"
msgstr "Téléchargements"
#: IDF/gettexttemplates/base.html.php:11
#: IDF/Form/TabsConf.php:35
msgid "Source"
msgstr "Source"
@ -636,6 +698,7 @@ msgstr ""
#: IDF/gettexttemplates/admin/issue-tracking.html.php:8
#: IDF/gettexttemplates/admin/members.html.php:13
#: IDF/gettexttemplates/admin/summary.html.php:8
#: IDF/gettexttemplates/admin/tabs.html.php:5
msgid "Save Changes"
msgstr "Enregistrer les changements"
@ -1214,42 +1277,51 @@ msgid "No changes were entered."
msgstr "Aucun changement n'a été entré."
#: IDF/Form/MembersConf.php:46
#: IDF/Form/TabsConf.php:47
msgid "Project owners"
msgstr "Propriétaires du projet"
#: IDF/Form/MembersConf.php:54
#: IDF/Form/TabsConf.php:46
msgid "Project members"
msgstr "Membres du projet"
#: IDF/Views/Source.php:36
#: IDF/Views/Source.php:37
#, php-format
msgid "%s Git Change Log"
msgstr "Changements Git de %s"
#: IDF/Views/Source.php:54
#: IDF/Views/Source.php:83
#: IDF/Views/Source.php:56
#: IDF/Views/Source.php:86
#, php-format
msgid "%s Git Source Tree"
msgstr "Arbre des sources Git de %s"
#: IDF/Views/Source.php:164
#: IDF/Views/Source.php:168
#, php-format
msgid "%s Commit Details"
msgstr "Détails d'un commit de %s"
#: IDF/Views/Source.php:165
#: IDF/Views/Source.php:169
#, php-format
msgid "%s Commit Details - %s"
msgstr "Détails d'un commit de %s - %s"
#: IDF/Views/Download.php:199
#: IDF/Views/Download.php:205
#: IDF/Views/Download.php:210
#, php-format
msgid "%1$s Downloads with Label %2$s"
msgstr "Téléchargements avec l'étiquette %2$s de %1$s"
#: IDF/Views/Download.php:207
#: IDF/Views/Download.php:213
#: IDF/Views/Download.php:218
#, php-format
msgid "This table shows the downloads with label %s."
msgstr "Ce tableau montre les téléchargements avec l'étiquette %s."
@ -1258,3 +1330,40 @@ msgstr "Ce tableau montre les téléchargements avec l'étiquette %s."
msgid "<strong>Attention!</strong> This file is marked as deprecated, download it only if you are sure you need this specific version."
msgstr "<strong>Attention !</strong> Ce fichier est marqué comme obsolète, téléchargez ce fichier uniquement si vous avez besoin de cette version."
#: IDF/Views/Project.php:215
#, php-format
msgid "%s Tabs Access Rights"
msgstr "Accès aux onglets de %s"
#: IDF/Views/Project.php:225
msgid "The project tabs access rights have been saved."
msgstr "Les droits d'accès aux onglets du projet ont été sauvegardés."
#: IDF/gettexttemplates/admin/base.html.php:7
msgid "Tabs Access"
msgstr "Accès aux onglets"
#: IDF/gettexttemplates/admin/tabs.html.php:3
msgid "You can configure here the project tabs access rights."
msgstr "Vous pouvez configurer ici les droits d'accès aux onglets."
#: IDF/gettexttemplates/admin/tabs.html.php:4
msgid "The form contains some errors. Please correct them to update the access rights."
msgstr "Le formulaire contient des erreurs. Merci de les corriger pour mettre à jour les droits d'accès."
#: IDF/gettexttemplates/admin/tabs.html.php:6
msgid "Instructions:"
msgstr "Instructions :"
#: IDF/Form/TabsConf.php:44
msgid "Open to all"
msgstr "Ouvert à tous"
#: IDF/Form/TabsConf.php:45
msgid "Signed in users"
msgstr "Utilisateurs authentifiés"
#: IDF/Form/TabsConf.php:48
msgid "Closed"
msgstr "Fermé"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-08-06 22:28+0200\n"
"POT-Creation-Date: 2008-08-07 15:31+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -92,7 +92,7 @@ msgstr ""
msgid "modification date"
msgstr ""
#: IDF/Middleware.php:50
#: IDF/Middleware.php:50 IDF/Middleware.php:51
#, php-format
msgid "The page <em>%s</em> was not found on the server."
msgstr ""
@ -176,54 +176,56 @@ msgstr ""
msgid "Here to Help You!"
msgstr ""
#: IDF/Views/Project.php:62
#: IDF/Views/Project.php:62 IDF/Views/Project.php:65
#, php-format
msgid "%s Project Summary"
msgstr ""
#: IDF/Views/Project.php:69
#: IDF/Views/Project.php:69 IDF/Views/Project.php:72
msgid "The project has been updated."
msgstr ""
#: IDF/Views/Project.php:93
#: IDF/Views/Project.php:93 IDF/Views/Project.php:96
#, php-format
msgid "%s Issue Tracking Configuration"
msgstr ""
#: IDF/Views/Project.php:102
#: IDF/Views/Project.php:102 IDF/Views/Project.php:105
msgid "The issue tracking configuration has been saved."
msgstr ""
#: IDF/Views/Project.php:137
#: IDF/Views/Project.php:137 IDF/Views/Project.php:140
#, php-format
msgid "%s Downloads Configuration"
msgstr ""
#: IDF/Views/Project.php:146
#: IDF/Views/Project.php:146 IDF/Views/Project.php:149
msgid "The downloads configuration has been saved."
msgstr ""
#: IDF/Views/Project.php:180
#: IDF/Views/Project.php:180 IDF/Views/Project.php:183
#, php-format
msgid "%s Project Members"
msgstr ""
#: IDF/Views/Project.php:189
#: IDF/Views/Project.php:189 IDF/Views/Project.php:192
msgid "The project membership has been saved."
msgstr ""
#: IDF/Views/Download.php:44
#: IDF/Views/Download.php:44 IDF/Views/Download.php:45
#, php-format
msgid "%s Downloads"
msgstr ""
#: IDF/Views/Download.php:50 IDF/Views/Download.php:52
#: IDF/Views/Download.php:51
msgid "This table shows the files to download."
msgstr ""
#: IDF/Views/Download.php:54 IDF/gettexttemplates/source/tree.html.php:6
#: IDF/Form/Upload.php:49 IDF/Views/Download.php:56 IDF/Views/Download.php:212
#: IDF/Views/Download.php:218
#: IDF/Views/Download.php:218 IDF/Views/Download.php:55
#: IDF/Views/Download.php:223
msgid "File"
msgstr ""
@ -232,127 +234,138 @@ msgstr ""
#: IDF/Form/IssueCreate.php:50 IDF/Form/UpdateUpload.php:42
#: IDF/Form/IssueUpdate.php:45 IDF/Views/Download.php:57
#: IDF/Views/Download.php:213 IDF/Views/Download.php:219
#: IDF/Views/Download.php:56 IDF/Views/Download.php:224 IDF/Views/Issue.php:58
#: IDF/Views/Issue.php:111 IDF/Views/Issue.php:233 IDF/Views/Issue.php:287
msgid "Summary"
msgstr ""
#: IDF/Views/Download.php:56 IDF/gettexttemplates/source/tree.html.php:9
#: IDF/Views/Download.php:58 IDF/Views/Download.php:214
#: IDF/Views/Download.php:220
#: IDF/Views/Download.php:220 IDF/Views/Download.php:57
#: IDF/Views/Download.php:225
msgid "Size"
msgstr ""
#: IDF/Views/Download.php:57 IDF/Views/Download.php:59
#: IDF/Views/Download.php:215 IDF/Views/Download.php:221
#: IDF/Views/Download.php:58 IDF/Views/Download.php:226
msgid "Uploaded"
msgstr ""
#: IDF/Views/Download.php:61 IDF/Views/Download.php:63
#: IDF/Views/Download.php:219 IDF/Views/Download.php:225
#: IDF/Views/Download.php:62 IDF/Views/Download.php:230
msgid "No downloads were found."
msgstr ""
#: IDF/Views/Download.php:81 IDF/Views/Download.php:83
#: IDF/Views/Download.php:85
#, php-format
msgid "Download %s"
msgstr ""
#: IDF/Views/Download.php:94 IDF/Views/Download.php:96
#: IDF/Views/Download.php:100
#: IDF/Views/Download.php:100 IDF/Views/Download.php:102
#, php-format
msgid "The file <a href=\"%1$s\">%2$s</a> has been updated."
msgstr ""
#: IDF/Views/Download.php:135 IDF/gettexttemplates/downloads/base.html.php:4
#: IDF/gettexttemplates/downloads/index.html.php:3 IDF/Views/Download.php:137
#: IDF/Views/Download.php:143
#: IDF/Views/Download.php:143 IDF/Views/Download.php:147
msgid "New Download"
msgstr ""
#: IDF/Views/Download.php:144 IDF/Views/Download.php:146
#: IDF/Views/Download.php:152
#: IDF/Views/Download.php:152 IDF/Views/Download.php:156
#, php-format
msgid "The <a href=\"%s\">file</a> has been uploaded."
msgstr ""
#: IDF/Views/Issue.php:40
#: IDF/Views/Issue.php:40 IDF/Views/Issue.php:41
#, php-format
msgid "%s Recent Issues"
msgstr ""
#: IDF/Views/Issue.php:49 IDF/Views/Issue.php:103
#: IDF/Views/Issue.php:49 IDF/Views/Issue.php:103 IDF/Views/Issue.php:50
#: IDF/Views/Issue.php:105
msgid "This table shows the open recent issues."
msgstr ""
#: IDF/Views/Issue.php:56 IDF/Views/Issue.php:108 IDF/Views/Issue.php:227
#: IDF/Views/Issue.php:280
#: IDF/Views/Issue.php:280 IDF/Views/Issue.php:57 IDF/Views/Issue.php:110
#: IDF/Views/Issue.php:232 IDF/Views/Issue.php:286
msgid "Id"
msgstr ""
#: IDF/Views/Issue.php:58 IDF/Views/Issue.php:110 IDF/Views/Issue.php:229
#: IDF/Views/Issue.php:282 IDF/Form/IssueCreate.php:70
#: IDF/Form/IssueUpdate.php:66
#: IDF/Form/IssueUpdate.php:66 IDF/Views/Issue.php:59 IDF/Views/Issue.php:112
#: IDF/Views/Issue.php:234 IDF/Views/Issue.php:288
msgid "Status"
msgstr ""
#: IDF/Views/Issue.php:59 IDF/Views/Issue.php:111 IDF/Views/Issue.php:230
#: IDF/Views/Issue.php:283
#: IDF/Views/Issue.php:283 IDF/Views/Issue.php:60 IDF/Views/Issue.php:113
#: IDF/Views/Issue.php:235 IDF/Views/Issue.php:289
msgid "Last Updated"
msgstr ""
#: IDF/Views/Issue.php:63 IDF/Views/Issue.php:115 IDF/Views/Issue.php:234
#: IDF/Views/Issue.php:287
#: IDF/Views/Issue.php:287 IDF/Views/Issue.php:64 IDF/Views/Issue.php:117
#: IDF/Views/Issue.php:239 IDF/Views/Issue.php:293
msgid "No issues were found."
msgstr ""
#: IDF/Views/Issue.php:87
#: IDF/Views/Issue.php:87 IDF/Views/Issue.php:89
#, php-format
msgid "My Submitted %s Issues"
msgstr ""
#: IDF/Views/Issue.php:90
#: IDF/Views/Issue.php:90 IDF/Views/Issue.php:92
#, php-format
msgid "My Working %s Issues"
msgstr ""
#: IDF/Views/Issue.php:131
#: IDF/Views/Issue.php:131 IDF/Views/Issue.php:134
msgid "Submit a new issue"
msgstr ""
#: IDF/Views/Issue.php:143
#: IDF/Views/Issue.php:143 IDF/Views/Issue.php:146
#, php-format
msgid "<a href=\"%s\">Issue %d</a> has been created."
msgstr ""
#: IDF/Views/Issue.php:168
#: IDF/Views/Issue.php:168 IDF/Views/Issue.php:172
#, php-format
msgid "Issue <a href=\"%s\">%d</a>: %s"
msgstr ""
#: IDF/Views/Issue.php:184
#: IDF/Views/Issue.php:184 IDF/Views/Issue.php:188
#, php-format
msgid "<a href=\"%s\">Issue %d</a> has been updated."
msgstr ""
#: IDF/Views/Issue.php:211
#: IDF/Views/Issue.php:211 IDF/Views/Issue.php:216
#, php-format
msgid "%s Closed Issues"
msgstr ""
#: IDF/Views/Issue.php:220
#: IDF/Views/Issue.php:220 IDF/Views/Issue.php:225
msgid "This table shows the closed issues."
msgstr ""
#: IDF/Views/Issue.php:258
#: IDF/Views/Issue.php:258 IDF/Views/Issue.php:264
#, php-format
msgid "%1$s Issues with Label %2$s"
msgstr ""
#: IDF/Views/Issue.php:261
#: IDF/Views/Issue.php:261 IDF/Views/Issue.php:267
#, php-format
msgid "%1$s Closed Issues with Label %2$s"
msgstr ""
#: IDF/Views/Issue.php:273
#: IDF/Views/Issue.php:273 IDF/Views/Issue.php:279
#, php-format
msgid "This table shows the issues with label %s."
msgstr ""
@ -389,17 +402,17 @@ msgstr ""
msgid "Project Home"
msgstr ""
#: IDF/gettexttemplates/base.html.php:9
#: IDF/gettexttemplates/base.html.php:9 IDF/Form/TabsConf.php:36
msgid "Issues"
msgstr ""
#: IDF/gettexttemplates/base.html.php:10
#: IDF/gettexttemplates/downloads/base.html.php:3
#: IDF/gettexttemplates/admin/base.html.php:6
#: IDF/gettexttemplates/admin/base.html.php:6 IDF/Form/TabsConf.php:34
msgid "Downloads"
msgstr ""
#: IDF/gettexttemplates/base.html.php:11
#: IDF/gettexttemplates/base.html.php:11 IDF/Form/TabsConf.php:35
msgid "Source"
msgstr ""
@ -587,6 +600,7 @@ msgstr ""
#: IDF/gettexttemplates/admin/issue-tracking.html.php:8
#: IDF/gettexttemplates/admin/members.html.php:13
#: IDF/gettexttemplates/admin/summary.html.php:8
#: IDF/gettexttemplates/admin/tabs.html.php:5
msgid "Save Changes"
msgstr ""
@ -1143,40 +1157,43 @@ msgstr ""
msgid "No changes were entered."
msgstr ""
#: IDF/Form/MembersConf.php:46
#: IDF/Form/MembersConf.php:46 IDF/Form/TabsConf.php:47
msgid "Project owners"
msgstr ""
#: IDF/Form/MembersConf.php:54
#: IDF/Form/MembersConf.php:54 IDF/Form/TabsConf.php:46
msgid "Project members"
msgstr ""
#: IDF/Views/Source.php:36
#: IDF/Views/Source.php:36 IDF/Views/Source.php:37
#, php-format
msgid "%s Git Change Log"
msgstr ""
#: IDF/Views/Source.php:54 IDF/Views/Source.php:83
#: IDF/Views/Source.php:54 IDF/Views/Source.php:83 IDF/Views/Source.php:56
#: IDF/Views/Source.php:86
#, php-format
msgid "%s Git Source Tree"
msgstr ""
#: IDF/Views/Source.php:164
#: IDF/Views/Source.php:164 IDF/Views/Source.php:168
#, php-format
msgid "%s Commit Details"
msgstr ""
#: IDF/Views/Source.php:165
#: IDF/Views/Source.php:165 IDF/Views/Source.php:169
#, php-format
msgid "%s Commit Details - %s"
msgstr ""
#: IDF/Views/Download.php:199 IDF/Views/Download.php:205
#: IDF/Views/Download.php:210
#, php-format
msgid "%1$s Downloads with Label %2$s"
msgstr ""
#: IDF/Views/Download.php:207 IDF/Views/Download.php:213
#: IDF/Views/Download.php:218
#, php-format
msgid "This table shows the downloads with label %s."
msgstr ""
@ -1186,3 +1203,42 @@ msgid ""
"<strong>Attention!</strong> This file is marked as deprecated, download it "
"only if you are sure you need this specific version."
msgstr ""
#: IDF/Views/Project.php:215
#, php-format
msgid "%s Tabs Access Rights"
msgstr ""
#: IDF/Views/Project.php:225
msgid "The project tabs access rights have been saved."
msgstr ""
#: IDF/gettexttemplates/admin/base.html.php:7
msgid "Tabs Access"
msgstr ""
#: IDF/gettexttemplates/admin/tabs.html.php:3
msgid "You can configure here the project tabs access rights."
msgstr ""
#: IDF/gettexttemplates/admin/tabs.html.php:4
msgid ""
"The form contains some errors. Please correct them to update the access "
"rights."
msgstr ""
#: IDF/gettexttemplates/admin/tabs.html.php:6
msgid "Instructions:"
msgstr ""
#: IDF/Form/TabsConf.php:44
msgid "Open to all"
msgstr ""
#: IDF/Form/TabsConf.php:45
msgid "Signed in users"
msgstr ""
#: IDF/Form/TabsConf.php:48
msgid "Closed"
msgstr ""

View File

@ -5,6 +5,7 @@
<a {if $inSummary}class="active" {/if}href="{url 'IDF_Views_Project::admin', array($project.shortname)}">{trans 'Project Summary'}</a> |
<a {if $inMembers}class="active" {/if}href="{url 'IDF_Views_Project::adminMembers', array($project.shortname)}">{trans 'Project Members'}</a> |
<a {if $inIssueTracking}class="active" {/if}href="{url 'IDF_Views_Project::adminIssues', array($project.shortname)}">{trans 'Issue Tracking'}</a> |
<a {if $inDownloads}class="active" {/if}href="{url 'IDF_Views_Project::adminDownloads', array($project.shortname)}">{trans 'Downloads'}</a>
<a {if $inDownloads}class="active" {/if}href="{url 'IDF_Views_Project::adminDownloads', array($project.shortname)}">{trans 'Downloads'}</a> |
<a {if $inTabs}class="active" {/if}href="{url 'IDF_Views_Project::adminTabs', array($project.shortname)}">{trans 'Tabs Access'}</a>
</div>
{/block}

View File

@ -0,0 +1,45 @@
{extends "admin/base.html"}
{block docclass}yui-t1{assign $inTabs = true}{/block}
{block body}
{if $form.errors}
<div class="px-message-error">
<p>{trans 'The form contains some errors. Please correct them to update the access rights.'}</p>
{if $form.get_top_errors}
{$form.render_top_errors|unsafe}
{/if}
</div>
{/if}
<form method="post" action=".">
<table class="form" summary="">
<tr>
<th><strong>{$form.f.downloads_access_rights.labelTag}:</strong></th>
<td>{if $form.f.downloads_access_rights.errors}{$form.f.downloads_access_rights.fieldErrors}{/if}
{$form.f.downloads_access_rights|unsafe}
</td>
</tr>
<tr>
<th><strong>{$form.f.issues_access_rights.labelTag}:</strong></th>
<td>{if $form.f.issues_access_rights.errors}{$form.f.issues_access_rights.fieldErrors}{/if}
{$form.f.issues_access_rights|unsafe}
</td>
</tr>
<tr>
<th><strong>{$form.f.source_access_rights.labelTag}:</strong></th>
<td>{if $form.f.source_access_rights.errors}{$form.f.source_access_rights.fieldErrors}{/if}
{$form.f.source_access_rights|unsafe}
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="{trans 'Save Changes'}" name="submit" />
</td>
</tr>
</table>
</form>
{/block}
{block context}
<div class="issue-submit-info">
<p><strong>{trans 'Instructions:'}</strong></p>
<p>{blocktrans}You can configure here the project tabs access rights.{/blocktrans}</p>
</div>
{/block}

View File

@ -42,9 +42,9 @@
<div id="main-tabs">
{if $project}
<a href="{url 'IDF_Views_Project::home', array($project.shortname)}"{block tabhome}{/block}>{trans 'Project Home'}</a>
<a href="{url 'IDF_Views_Issue::index', array($project.shortname)}"{block tabissues}{/block}>{trans 'Issues'}</a>
<a href="{url 'IDF_Views_Download::index', array($project.shortname)}"{block tabdownloads}{/block}>{trans 'Downloads'}</a>
<a href="{url 'IDF_Views_Source::treeBase', array($project.shortname, 'master')}"{block tabsource}{/block}>{trans 'Source'}</a>
{if $hasIssuesAccess} <a href="{url 'IDF_Views_Issue::index', array($project.shortname)}"{block tabissues}{/block}>{trans 'Issues'}</a>{/if}
{if $hasDownloadsAccess} <a href="{url 'IDF_Views_Download::index', array($project.shortname)}"{block tabdownloads}{/block}>{trans 'Downloads'}</a>{/if}
{if $hasSourceAccess} <a href="{url 'IDF_Views_Source::treeBase', array($project.shortname, 'master')}"{block tabsource}{/block}>{trans 'Source'}</a>{/if}
{if $isOwner}
<a href="{url 'IDF_Views_Project::admin', array($project.shortname)}"{block tabadmin}{/block}>{trans 'Administer'}</a>{/if}{/if}
</div>

View File

@ -13,7 +13,7 @@
<p>{blocktrans}Comment <a href="{$url}">{$i}</a> by {$who}, {$c.creation_dtime|date}{/blocktrans}</p>
{/if}
<pre class="issue-comment-text">{if strlen($c.content) > 0}{issuetext $c.content, $project}{else}<i>{trans '(No comments were given for this change.)'}</i>{/if}</pre>
<pre class="issue-comment-text">{if strlen($c.content) > 0}{issuetext $c.content, $request}{else}<i>{trans '(No comments were given for this change.)'}</i>{/if}</pre>
{if $i> 0 and $c.changedIssue()}
<div class="issue-changes">

View File

@ -3,11 +3,11 @@
<script type="text/javascript" charset="utf-8">
// <!--
{hotkey 'Shift+h', 'IDF_Views_Project::home', array($project.shortname)}
{hotkey 'Shift+a', 'IDF_Views_Issue::create', array($project.shortname)}
{hotkey 'Shift+i', 'IDF_Views_Issue::index', array($project.shortname)}
{hotkey 'Shift+d', 'IDF_Views_Download::index', array($project.shortname)}
{hotkey 'Shift+s', 'IDF_Views_Source::treeBase', array($project.shortname, 'master')}
{if !$user.isAnonymous()}
{if $hasIssuesAccess}{hotkey 'Shift+a', 'IDF_Views_Issue::create', array($project.shortname)}
{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 $hasSourceAccess}{hotkey 'Shift+s', 'IDF_Views_Source::treeBase', array($project.shortname, 'master')}{/if}
{if $hasIssuesAccess and !$user.isAnonymous()}
{hotkey 'Shift+m', 'IDF_Views_Issue::myIssues', array($project.shortname, 'submit')}
{hotkey 'Shift+w', 'IDF_Views_Issue::myIssues', array($project.shortname, 'owner')}
{/if} //-->

View File

@ -10,7 +10,7 @@
{$project.description|markdown}
{/block}
{block context}
{if $downloads.count() > 0}
{if count($downloads) > 0}
<p><strong>{trans 'Featured Downloads'}</strong><br />
{foreach $downloads as $download}
<span class="label"><a href="{url 'IDF_Views_Download::view', array($project.shortname, $download.id)}" title="{$download.summary}">{$download}</a></span><br />

View File

@ -14,7 +14,7 @@
{aurl 'url', 'IDF_Views_Source::commit', array($project.shortname, $change.commit)}
<tr class="log">
<td><a href="{$url}">{$change.date|dateago:"wihtout"}</a></td>
<td>{issuetext $change.title, $project}{if $change.full_message}<br /><br />{issuetext $change.full_message, $project}{/if}</td>
<td>{issuetext $change.title, $request}{if $change.full_message}<br /><br />{issuetext $change.full_message, $request}{/if}</td>
</tr>
<tr class="extra">
<td colspan="2">

View File

@ -15,7 +15,7 @@
<th><strong>{trans 'Tree:'}</strong></th><td class="mono"><a href="{url 'IDF_Views_Source::treeBase', array($project.shortname, $commit)}" title="{trans 'View corresponding source tree'}">{$cobject.tree}</a><br /><br /></td>
</tr>
<tr>
<th><strong>{trans 'Message:'}</strong></th><td>{issuetext $cobject.title, $project}{if isset($cobject.full_message)}<br /><br />{issuetext $cobject.full_message, $project}{/if}</td>
<th><strong>{trans 'Message:'}</strong></th><td>{issuetext $cobject.title, $request}{if isset($cobject.full_message)}<br /><br />{issuetext $cobject.full_message, $request}{/if}</td>
</tr>
{if count($diff.files)}
<tr>