@@ -0,0 +1,19 | |||
|
1 | # Settings specified here will take precedence over those in config/environment.rb | |
|
2 | ||
|
3 | # In the development environment your application's code is reloaded on | |
|
4 | # every request. This slows down response time but is perfect for development | |
|
5 | # since you don't have to restart the webserver when you make code changes. | |
|
6 | config.cache_classes = false | |
|
7 | ||
|
8 | # Log error messages when you accidentally call methods on nil. | |
|
9 | config.whiny_nils = true | |
|
10 | ||
|
11 | # Enable the breakpoint server that script/breakpointer connects to | |
|
12 | config.breakpoint_server = true | |
|
13 | ||
|
14 | # Show full error reports and disable caching | |
|
15 | config.action_controller.consider_all_requests_local = true | |
|
16 | config.action_controller.perform_caching = false | |
|
17 | ||
|
18 | # Don't care if the mailer can't send | |
|
19 | config.action_mailer.raise_delivery_errors = false |
@@ -0,0 +1,19 | |||
|
1 | # Settings specified here will take precedence over those in config/environment.rb | |
|
2 | ||
|
3 | # In the development environment your application's code is reloaded on | |
|
4 | # every request. This slows down response time but is perfect for development | |
|
5 | # since you don't have to restart the webserver when you make code changes. | |
|
6 | config.cache_classes = false | |
|
7 | ||
|
8 | # Log error messages when you accidentally call methods on nil. | |
|
9 | config.whiny_nils = true | |
|
10 | ||
|
11 | # Enable the breakpoint server that script/breakpointer connects to | |
|
12 | config.breakpoint_server = true | |
|
13 | ||
|
14 | # Show full error reports and disable caching | |
|
15 | config.action_controller.consider_all_requests_local = true | |
|
16 | config.action_controller.perform_caching = false | |
|
17 | ||
|
18 | # Don't care if the mailer can't send | |
|
19 | config.action_mailer.raise_delivery_errors = false |
@@ -0,0 +1,15 | |||
|
1 | # Settings specified here will take precedence over those in config/environment.rb | |
|
2 | ||
|
3 | # The test environment is used exclusively to run your application's | |
|
4 | # test suite. You never need to work with it otherwise. Remember that | |
|
5 | # your test database is "scratch space" for the test suite and is wiped | |
|
6 | # and recreated between test runs. Don't rely on the data there! | |
|
7 | config.cache_classes = true | |
|
8 | ||
|
9 | # Log error messages when you accidentally call methods on nil. | |
|
10 | config.whiny_nils = true | |
|
11 | ||
|
12 | # Show full error reports and disable caching | |
|
13 | config.action_controller.consider_all_requests_local = true | |
|
14 | config.action_controller.perform_caching = false | |
|
15 |
@@ -0,0 +1,15 | |||
|
1 | # Settings specified here will take precedence over those in config/environment.rb | |
|
2 | ||
|
3 | # The test environment is used exclusively to run your application's | |
|
4 | # test suite. You never need to work with it otherwise. Remember that | |
|
5 | # your test database is "scratch space" for the test suite and is wiped | |
|
6 | # and recreated between test runs. Don't rely on the data there! | |
|
7 | config.cache_classes = true | |
|
8 | ||
|
9 | # Log error messages when you accidentally call methods on nil. | |
|
10 | config.whiny_nils = true | |
|
11 | ||
|
12 | # Show full error reports and disable caching | |
|
13 | config.action_controller.consider_all_requests_local = true | |
|
14 | config.action_controller.perform_caching = false | |
|
15 |
@@ -0,0 +1,15 | |||
|
1 | # Settings specified here will take precedence over those in config/environment.rb | |
|
2 | ||
|
3 | # The test environment is used exclusively to run your application's | |
|
4 | # test suite. You never need to work with it otherwise. Remember that | |
|
5 | # your test database is "scratch space" for the test suite and is wiped | |
|
6 | # and recreated between test runs. Don't rely on the data there! | |
|
7 | config.cache_classes = true | |
|
8 | ||
|
9 | # Log error messages when you accidentally call methods on nil. | |
|
10 | config.whiny_nils = true | |
|
11 | ||
|
12 | # Show full error reports and disable caching | |
|
13 | config.action_controller.consider_all_requests_local = true | |
|
14 | config.action_controller.perform_caching = false | |
|
15 |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>Chapter 1. Administration</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="index.html" title="Documentation redMine"><link rel="next" href="ch01s01.html" title="1. Utilisateurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Administration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4"></a>Chapter 1. Administration</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Création ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. Rôles et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalisés</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Documentation redMine </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 1. Utilisateurs</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>1. Utilisateurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01.html" title="Chapter 1. Administration"><link rel="next" href="ch01s02.html" title="2. Rôles et permissions"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1. Utilisateurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e7"></a>1. Utilisateurs</h2></div></div></div><p>Ces écrans vous permettent de gérer les utilisateurs de l'application.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e12"></a>1.1. Liste des utilisateurs</h3></div></div></div><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/users_list.png"></div></div><p>Les boutons Lock/Unlock vous permettent de vérouiller/dévérouiller les comptes utilisateurs.</p><p>Un utilisateur dont le compte est vérouillé ne peut plus s'identifier pour accéder à l'application.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e26"></a>1.2. Création ou modification d'un utilisateur</h3></div></div></div><p>En mode modification, laissez le champ Password vide pour laisser le mot de passe de l'utilisateur inchangé.</p><p>Un utilisateur déclaré comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Administrateur</span>: déclare l'utilisateur comme administrateur de l'application.</p></li><li><p><span class="guilabel">Notifications par mail</span>: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur</p></li><li><p><span class="guilabel">Vérouillé</span>: désactive le compte de l'utilisateur</p></li></ul></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 1. Administration </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 2. Rôles et permissions</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>2. Rôles et permissions</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s01.html" title="1. Utilisateurs"><link rel="next" href="ch01s03.html" title="3. Trackers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. Rôles et permissions</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e49"></a>2. Rôles et permissions</h2></div></div></div><p>Les rôles permettent de définir les permissions des différents membres d'un projet. Chaque membre d'un projet dispose d'un rôle unique au sein d'un projet. Un utilisateur peut avoir différents rôles au sein de différents projets.</p><p>Sur l'écran d'édition du rôle, cochez les actions que vous souhaitez autoriser pour le rôle.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1. Utilisateurs </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. Trackers</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>3. Trackers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s02.html" title="2. Rôles et permissions"><link rel="next" href="ch01s04.html" title="4. Champs personnalisés"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. Trackers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e56"></a>3. Trackers</h2></div></div></div><p>Les trackers permettent de typer les demandes et de définir des workflows spécifiques pour chacun de ces types.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. Rôles et permissions </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Champs personnalisés</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>4. Champs personnalisés</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s03.html" title="3. Trackers"><link rel="next" href="ch01s05.html" title="5. Statut des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. Champs personnalisés</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e61"></a>4. Champs personnalisés</h2></div></div></div><p>Les champs personnalisés vous permettent d'ajouter des informations supplémentaires sur les demandes. Un champ personnalisé peut être de l'un des types suivants:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Integer</span>: entier positif ou négatif</p></li><li><p><span class="guilabel">String</span>: chaîne de caractère</p></li><li><p><span class="guilabel">Date</span>: date</p></li><li><p><span class="guilabel">Boolean</span>: booléen (case à cocher)</p></li><li><p><span class="guilabel">List</span>: valeur à sélectionnée parmi une liste prédéfinie (liste déroulante)</p></li></ul></div><p>Des éléments de validation peuvent être définis:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Obligatoire</span>: champ dont la saisie est obligatoire sur les demandes</p></li><li><p><span class="guilabel">Pour tous les projects</span>: champ automatiquement associé à l'ensemble des projets</p></li><li><p><span class="guilabel">Min - max length</span>: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)</p></li><li><p><span class="guilabel">Expression régulière</span>: expression régulière permettant de valider la valeur saisie</p></li><li><p><span class="guilabel">Valeurs possibles</span>: valeurs possibles pour les champs de type "Liste". Les valeurs sont séparées par le caractère |</p></li></ul></div><p>Si l'option <span class="guilabel">Pour tous les projets</span> n'est pas activée, chaque projet pourra choisir d'utiliser ou non le champ pour ses demandes.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3. Trackers </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 5. Statut des demandes</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>5. Statut des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s04.html" title="4. Champs personnalisés"><link rel="next" href="ch01s06.html" title="6. Workflow"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5. Statut des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e125"></a>5. Statut des demandes</h2></div></div></div><p>Ces écrans vous permettent de définir les différents statuts possibles des demandes.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Demande fermée</span>: indique que le statut correspond à une demande considérée comme fermée</p></li><li><p><span class="guilabel">Statut par défaut</span>: statut appliqué par défaut aux nouvelles demandes (seul un statut peut être déclaré comme statut par défaut)</p></li><li><p><span class="guilabel">Couleur</span>: code couleur HTML (6 caractères) représentant le statut à l'affichage</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4. Champs personnalisés </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 6. Workflow</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>6. Workflow</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s05.html" title="5. Statut des demandes"><link rel="next" href="ch01s07.html" title="7. Listes de valeurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6. Workflow</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e147"></a>6. Workflow</h2></div></div></div><p>Le workflow permet de définir les changements que les différents membres d'un projet sont autorisés à effectuer sur les demandes, en fonction de leur type.</p><p>Sélectionnez le rôle et le tracker pour lesquels vous souhaitez modifier le workflow, puis cliquez sur Edit. L'écran vous permet alors de modifier, pour le rôle et le tracker choisi, les changements autorisés. Les lignes représentent les statuts initiaux des demandes. Les colonnes représentent les statuts autorisés à être appliqués.</p><p>Remarque: pour qu'un rôle puisse changer le statut des demandes, la permission doit lui être explicitement donnée indépendemment de la configuration du workflow.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/workflow.png"></div></div><p>Dans l'exemple ci-dessus, les demandes de type Bug au statut Nouveau pourront être passées au statut Assignée ou Résolue par le rôle Développeur. Celles au statut Assignée pourront être passées au statut Résolue. Le statut de toutes les autres demandes de type Bug ne pourra pas être modifié par le Développeur.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5. Statut des demandes </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 7. Listes de valeurs</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>7. Listes de valeurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s06.html" title="6. Workflow"><link rel="next" href="ch01s08.html" title="8. Notifications par mail"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7. Listes de valeurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e165"></a>7. Listes de valeurs</h2></div></div></div><p>Les listes de valeurs utilisées par l'application (exemple: les priorités des demandes) peuvent être personnalisées. Cet écran vous permet de définir les valeurs possibles pour chacune des listes suivantes:</p><div class="itemizedlist"><ul type="disc"><li><p>Priorités des demandes</p></li><li><p>Catégories de documents</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6. Workflow </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 8. Notifications par mail</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>8. Notifications par mail</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s07.html" title="7. Listes de valeurs"><link rel="next" href="ch01s09.html" title="9. Informations"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8. Notifications par mail</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s09.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e178"></a>8. Notifications par mail</h2></div></div></div><p>Cet écran vous permet de sélectionner les actions qui donneront lieu à une notification par mail aux membres du projet.</p><p>Remarque: l'envoi de mails doit être activé dans la configuration de l'application si souhaitez effectuer des notifications.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">7. Listes de valeurs </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 9. Informations</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>9. Informations</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s08.html" title="8. Notifications par mail"><link rel="next" href="ch02.html" title="Chapter 2. Projets"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">9. Informations</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e185"></a>9. Informations</h2></div></div></div><p>Affiche des informations relatives à l'application et à son environnement.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">8. Notifications par mail </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 2. Projets</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>Chapter 2. Projets</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="ch01s09.html" title="9. Informations"><link rel="next" href="ch02s01.html" title="1. Aperçu du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 2. Projets</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch02s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e190"></a>Chapter 2. Projets</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch02s01.html">1. Aperçu du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propriétés du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Catégories des demandes</a></span></dt></dl></dd></dl></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch02s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">9. Informations </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 1. Aperçu du projet</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>1. Aperçu du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02.html" title="Chapter 2. Projets"><link rel="next" href="ch02s02.html" title="2. Gestion des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1. Aperçu du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e194"></a>1. Aperçu du projet</h2></div></div></div><p>L'aperçu vous présente les informations générales relatives au projet, les principaux membres, les dernières annonces, ainsi qu'une synthèse du nombre de demandes ouvertes par tracker.</p><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. Projets </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 2. Gestion des demandes</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>2. Gestion des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s01.html" title="1. Aperçu du projet"><link rel="next" href="ch02s03.html" title="3. Rapports"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. Gestion des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e200"></a>2. Gestion des demandes</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e204"></a>2.1. Liste des demandes</h3></div></div></div><p>Par défaut, l'ensemble des demandes ouvertes du projet sont affichées. Différents filtres vous permettent de sélectionner les demandes à afficher. Si le projet comporte des sous-projets, vous avez la possibilité d'afficher également les demandes relatives aux sous-projets (non affichées par défaut).</p><p>Une fois appliqué, un filtre reste valable durant toute votre session. Vous pouvez le redéfinir, ou le supprimer en cliquant sur Annuler.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/issues_list.png"></div></div><p></p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1. Aperçu du projet </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. Rapports</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>3. Rapports</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s02.html" title="2. Gestion des demandes"><link rel="next" href="ch02s04.html" title="4. Historique"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. Rapports</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e219"></a>3. Rapports</h2></div></div></div><p>Cet écran présente la synthèse du nombre de demandes par statut et selon différents critères (tracker, priorité, catégorie). Des liens directs permettent d'accéder à la liste détaillée des demandes pour chaque critère.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. Gestion des demandes </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Historique</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>4. Historique</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s03.html" title="3. Rapports"><link rel="next" href="ch02s05.html" title="5. Annonces"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. Historique</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e224"></a>4. Historique</h2></div></div></div><p>Cette page présente l'ensemble des demandes résolues dans chacune des versions du projet. Certains types de demande peuvent être exclus de cet affichage.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3. Rapports </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 5. Annonces</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>5. Annonces</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s04.html" title="4. Historique"><link rel="next" href="ch02s06.html" title="6. Documents"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5. Annonces</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e229"></a>5. Annonces</h2></div></div></div><p>Les nouvelles vous permettent d'informer les utilisateurs sur l'activité du projet.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4. Historique </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 6. Documents</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>6. Documents</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s05.html" title="5. Annonces"><link rel="next" href="ch02s07.html" title="7. Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6. Documents</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e234"></a>6. Documents</h2></div></div></div><p>Les documents sont groupés par catégories (voir Listes de valeurs). Un document peut contenir plusieurs fichiers (exemple: révisions ou versions successives).</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5. Annonces </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 7. Fichiers</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>7. Fichiers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s06.html" title="6. Documents"><link rel="next" href="ch02s08.html" title="8. Configuration du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7. Fichiers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e239"></a>7. Fichiers</h2></div></div></div><p>Ce module vous permet de publier les différents fichiers (sources, binaires, ...) pour chaque version de l'application.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6. Documents </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 8. Configuration du projet</td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>8. Configuration du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s07.html" title="7. Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8. Configuration du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e244"></a>8. Configuration du projet</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e248"></a>8.1. Propriétés du projet</h3></div></div></div><p></p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Public</span>: si le projet est public, il sera visible (consultation des demandes, des documents, ...) pour l'ensemble des utilisateurs, y compris ceux qui ne sont pas membres du projet. Si le projet n'est pas public, seuls les membres du projet y ont accès, en fonction de leur rôle.</p></li><li><p><span class="guilabel">Champs personnalisés</span>: sélectionner les champs personnalisés que vous souhaitez utiliser au sein du projet. Seul l'administrateur peut ajouter de nouveaux champs personnalisés.</p></li></ul></div><p></p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e264"></a>8.2. Membres</h3></div></div></div><p>Cet écran vous permet de définir les membres du projet ainsi que leurs rôles respectifs. Un utilisateur ne peut avoir qu'un rôle au sein d'un projet donné. Le rôle d'un membre détermine les permissions dont il bénéficie sur le projet.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e269"></a>8.3. Versions</h3></div></div></div><p>Les versions vous permettent de suivre les changements survenus tout au long du projet. A la fermeture d'une demande, vous pouvez par exemple indiquer quelle version la prend en compte. Vous pouvez par ailleurs publier les différentes versions de l'application (voir Fichiers).</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e274"></a>8.4. Catégories des demandes</h3></div></div></div><p>Les catégories de demande vous permettent de typer les demandes. Les catégories peuvent par exemple correspondre aux différents modules du projet.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top">7. Fichiers </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html> No newline at end of file |
@@ -0,0 +1,55 | |||
|
1 | body { | |
|
2 | background: #FFFFFF; | |
|
3 | font: 0.8em Verdana,Tahoma,Arial,sans-serif; | |
|
4 | } | |
|
5 | ||
|
6 | h1, h2, h3, h4, h5 { | |
|
7 | color: #800000; | |
|
8 | font-family: sans-serif; | |
|
9 | } | |
|
10 | ||
|
11 | table { | |
|
12 | font-size: 1em; | |
|
13 | } | |
|
14 | ||
|
15 | a{ | |
|
16 | color:#467aa7; | |
|
17 | font-weight:bold; | |
|
18 | text-decoration:none; | |
|
19 | background-color:inherit; | |
|
20 | } | |
|
21 | ||
|
22 | a:hover{ | |
|
23 | color: #800000; | |
|
24 | text-decoration:underline; | |
|
25 | background-color:inherit; | |
|
26 | } | |
|
27 | ||
|
28 | a img{border:none;} | |
|
29 | ||
|
30 | .screenshot { | |
|
31 | text-align: center; | |
|
32 | } | |
|
33 | ||
|
34 | .guilabel { | |
|
35 | font-weight: bold; | |
|
36 | } | |
|
37 | ||
|
38 | span.term { | |
|
39 | font-weight: bold; | |
|
40 | } | |
|
41 | ||
|
42 | div.sidebar { | |
|
43 | background: #F0F0F0; | |
|
44 | border: 1px solid gray; | |
|
45 | padding: 5px; | |
|
46 | margin: 20px; | |
|
47 | } | |
|
48 | ||
|
49 | pre.programlisting { | |
|
50 | background: #F0F0F0; | |
|
51 | border: 1px solid gray; | |
|
52 | padding: 2px; | |
|
53 | font-size: 10pt; | |
|
54 | white-space: pre; | |
|
55 | } |
@@ -0,0 +1,3 | |||
|
1 | <html><head> | |
|
2 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
|
3 | <title>Documentation redMine</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="next" href="ch01.html" title="Chapter 1. Administration"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Documentation redMine</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr></table><hr></div><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="d0e1"></a>Documentation redMine</h1></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Administration</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Création ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. Rôles et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalisés</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch02.html">2. Projets</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s01.html">1. Aperçu du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propriétés du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Catégories des demandes</a></span></dt></dl></dd></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Chapter 1. Administration</td></tr></table></div></body></html> No newline at end of file |
|
1 | NO CONTENT: new file 100644, binary diff hidden |
|
1 | NO CONTENT: new file 100644, binary diff hidden |
@@ -0,0 +1,76 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | require "#{File.dirname(__FILE__)}/../test_helper" | |
|
19 | ||
|
20 | class AccountTest < ActionController::IntegrationTest | |
|
21 | fixtures :users | |
|
22 | ||
|
23 | # Replace this with your real tests. | |
|
24 | def test_login | |
|
25 | get "account/my_page" | |
|
26 | assert_redirected_to "account/login" | |
|
27 | log_user('plochon', 'admin') | |
|
28 | ||
|
29 | get "account/my_account" | |
|
30 | assert_response :success | |
|
31 | assert_template "account/my_account" | |
|
32 | end | |
|
33 | ||
|
34 | def test_change_password | |
|
35 | log_user('plochon', 'admin') | |
|
36 | get "account/my_account" | |
|
37 | assert_response :success | |
|
38 | assert_template "account/my_account" | |
|
39 | ||
|
40 | post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello2" | |
|
41 | assert_response :success | |
|
42 | assert_tag :tag => "div", :attributes => { :class => "errorExplanation" } | |
|
43 | ||
|
44 | post "account/change_password", :password => 'admiN', :new_password => "hello", :new_password_confirmation => "hello" | |
|
45 | assert_response :success | |
|
46 | assert_equal 'Wrong password', flash[:notice] | |
|
47 | ||
|
48 | post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello" | |
|
49 | assert_response :success | |
|
50 | log_user('plochon', 'hello') | |
|
51 | end | |
|
52 | ||
|
53 | def test_my_account | |
|
54 | log_user('plochon', 'admin') | |
|
55 | get "account/my_account" | |
|
56 | assert_response :success | |
|
57 | assert_template "account/my_account" | |
|
58 | ||
|
59 | post "account/my_account", :user => {:firstname => "Joe", :login => "root", :admin => 1} | |
|
60 | assert_response :success | |
|
61 | assert_template "account/my_account" | |
|
62 | user = User.find(2) | |
|
63 | assert_equal "Joe", user.firstname | |
|
64 | assert_equal "plochon", user.login | |
|
65 | assert_equal false, user.admin? | |
|
66 | ||
|
67 | log_user('plochon', 'admin') | |
|
68 | end | |
|
69 | ||
|
70 | def test_my_page | |
|
71 | log_user('plochon', 'admin') | |
|
72 | get "account/my_page" | |
|
73 | assert_response :success | |
|
74 | assert_template "account/my_page" | |
|
75 | end | |
|
76 | end |
@@ -0,0 +1,61 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | require "#{File.dirname(__FILE__)}/../test_helper" | |
|
19 | ||
|
20 | class AdminTest < ActionController::IntegrationTest | |
|
21 | fixtures :users | |
|
22 | ||
|
23 | def test_add_user | |
|
24 | log_user("admin", "admin") | |
|
25 | get "/users/add" | |
|
26 | assert_response :success | |
|
27 | assert_template "users/add" | |
|
28 | post "/users/add", :user => { :login => "jsmith", :firstname => "John", :lastname => "Smith", :mail => "jsmith@somenet.foo", :language => "en" }, :password => "jsmith09", :password_confirmation => "jsmith09" | |
|
29 | assert_redirected_to "users/list" | |
|
30 | ||
|
31 | user = User.find_by_login("jsmith") | |
|
32 | assert_kind_of User, user | |
|
33 | logged_user = User.try_to_login("jsmith", "jsmith09") | |
|
34 | assert_kind_of User, logged_user | |
|
35 | assert_equal "John", logged_user.firstname | |
|
36 | ||
|
37 | post "users/edit", :id => user.id, :user => { :locked => 1 } | |
|
38 | assert_redirected_to "users/list" | |
|
39 | locked_user = User.try_to_login("jsmith", "jsmith09") | |
|
40 | assert_equal nil, locked_user | |
|
41 | end | |
|
42 | ||
|
43 | def test_add_project | |
|
44 | log_user("admin", "admin") | |
|
45 | get "projects/add" | |
|
46 | assert_response :success | |
|
47 | assert_template "projects/add" | |
|
48 | post "projects/add", :project => { :name => "blog", :descr => "weblog", :is_public => 1} | |
|
49 | assert_redirected_to "admin/projects" | |
|
50 | assert_equal 'Project was successfully created.', flash[:notice] | |
|
51 | ||
|
52 | project = Project.find_by_name("blog") | |
|
53 | assert_kind_of Project, project | |
|
54 | assert_equal "weblog", project.descr | |
|
55 | assert_equal true, project.is_public? | |
|
56 | ||
|
57 | get "admin/projects" | |
|
58 | assert_response :success | |
|
59 | assert_template "admin/projects" | |
|
60 | end | |
|
61 | end |
@@ -1,83 +1,77 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class AccountController < ApplicationController |
|
19 | 19 |
|
|
20 | ||
|
20 | 21 | # prevents login action to be filtered by check_if_login_required application scope filter |
|
21 | 22 | skip_before_filter :check_if_login_required, :only => :login |
|
22 | 23 |
|
|
23 | 24 | |
|
24 | 25 |
|
|
25 | 26 |
|
|
26 | 27 |
|
|
27 | 28 | |
|
28 | 29 |
|
|
29 | 30 |
|
|
30 | 31 |
|
|
31 | 32 |
|
|
32 | @user = User.new | |
|
33 | 33 | else |
|
34 | @user = User.new(params[:user]) | |
|
35 | logged_in_user = @user.try_to_login | |
|
34 | logged_in_user = User.try_to_login(params[:login], params[:password]) | |
|
36 | 35 |
|
|
37 | 36 |
|
|
38 | 37 |
|
|
39 | 38 | else |
|
40 | 39 |
|
|
41 | 40 | end |
|
42 | 41 | end |
|
43 | 42 |
|
|
44 | 43 | |
|
45 | 44 | # Log out current user and redirect to welcome page |
|
46 | 45 | def logout |
|
47 | 46 | session[:user] = nil |
|
48 | 47 | redirect_to(:controller => '') |
|
49 | 48 | end |
|
50 | 49 | |
|
51 | 50 | def my_page |
|
52 | 51 | @user = session[:user] |
|
53 | 52 | @reported_issues = Issue.find(:all, :conditions => ["author_id=?", @user.id], :limit => 10, :include => [ :status, :project, :tracker ], :order => 'issues.updated_on DESC') |
|
54 | 53 | @assigned_issues = Issue.find(:all, :conditions => ["assigned_to_id=?", @user.id], :limit => 10, :include => [ :status, :project, :tracker ], :order => 'issues.updated_on DESC') |
|
55 | 54 | end |
|
56 | 55 | |
|
57 | 56 | # Edit current user's account |
|
58 | 57 | def my_account |
|
59 | 58 | @user = User.find(session[:user].id) |
|
60 | 59 | if request.post? and @user.update_attributes(@params[:user]) |
|
61 | 60 | flash[:notice] = 'Account was successfully updated.' |
|
62 | 61 | session[:user] = @user |
|
63 | 62 | set_localization |
|
64 | 63 | end |
|
65 | 64 | end |
|
66 | 65 | |
|
67 | 66 |
|
|
68 | 67 |
|
|
69 | 68 |
|
|
70 |
|
|
|
71 |
|
|
|
72 | if @user.change_password(@params[:old_password], @params[:new_password]) | |
|
73 | flash[:notice] = 'Password was successfully updated.' | |
|
74 | end | |
|
75 | else | |
|
76 | flash[:notice] = 'Password confirmation doesn\'t match!' | |
|
77 | end | |
|
69 | if @user.check_password?(@params[:password]) | |
|
70 | @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] | |
|
71 | flash[:notice] = 'Password was successfully updated.' if @user.save | |
|
78 | 72 | else |
|
79 | 73 |
|
|
80 | 74 | end |
|
81 | 75 |
|
|
82 | 76 |
|
|
83 | 77 | end |
@@ -1,49 +1,54 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class AdminController < ApplicationController |
|
19 | 19 |
|
|
20 | 20 |
|
|
21 | 21 | |
|
22 | 22 |
|
|
23 | 23 |
|
|
24 | 24 | |
|
25 | 25 |
|
|
26 | 26 |
|
|
27 | 27 | |
|
28 | 28 | def projects |
|
29 |
|
|
|
29 | sort_init 'name', 'asc' | |
|
30 | 30 |
|
|
31 | @project_pages, @projects = paginate :projects, :per_page => 15, :order => sort_clause | |
|
31 | @project_count = Project.count | |
|
32 | @project_pages = Paginator.new self, @project_count, | |
|
33 | 15, | |
|
34 | @params['page'] | |
|
35 | @projects = Project.find :all, :order => sort_clause, | |
|
36 | :limit => @project_pages.items_per_page, | |
|
37 | :offset => @project_pages.current.offset | |
|
32 | 38 | end |
|
33 | 39 | |
|
34 | 40 | def mail_options |
|
35 | 41 |
@actions = Permission.find(:all, :conditions => ["mail_option=?", true]) |
|
36 | 42 | if request.post? |
|
37 | 43 | @actions.each { |a| |
|
38 | a.mail_enabled = params[:action_ids].include? a.id.to_s | |
|
44 | a.mail_enabled = (params[:action_ids] || []).include? a.id.to_s | |
|
39 | 45 | a.save |
|
40 | 46 | } |
|
41 | 47 | flash[:notice] = "Mail options were successfully updated." |
|
42 | 48 | end |
|
43 | 49 | end |
|
44 | 50 | |
|
45 | 51 | def info |
|
46 | 52 | @adapter_name = ActiveRecord::Base.connection.adapter_name |
|
47 | 53 | end |
|
48 | ||
|
49 | 54 | end |
@@ -1,86 +1,96 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class ApplicationController < ActionController::Base |
|
19 | 19 | before_filter :check_if_login_required, :set_localization |
|
20 | 20 | |
|
21 | 21 | # check if login is globally required to access the application |
|
22 | 22 | def check_if_login_required |
|
23 | 23 | require_login if RDM_LOGIN_REQUIRED |
|
24 | 24 | end |
|
25 | 25 | |
|
26 | 26 | def set_localization |
|
27 | Localization.lang = session[:user].nil? ? RDM_DEFAULT_LANG : (session[:user].language || RDM_DEFAULT_LANG) | |
|
27 | Localization.lang = begin | |
|
28 | if session[:user] | |
|
29 | session[:user].language | |
|
30 | elsif request.env['HTTP_ACCEPT_LANGUAGE'] | |
|
31 | accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first | |
|
32 | if Localization.langs.collect{ |l| l[1] }.include? accept_lang | |
|
33 | accept_lang | |
|
34 | end | |
|
35 | end | |
|
36 | rescue | |
|
37 | nil | |
|
38 | end || RDM_DEFAULT_LANG | |
|
28 | 39 | end |
|
29 | 40 | |
|
30 | 41 |
|
|
31 | 42 |
|
|
32 | 43 |
|
|
33 | 44 |
|
|
34 | 45 | end |
|
35 | 46 |
|
|
36 | 47 | |
|
37 | 48 |
|
|
38 | 49 |
|
|
39 | 50 |
|
|
40 | 51 |
|
|
41 | 52 | else |
|
42 | 53 |
|
|
43 | 54 |
|
|
44 | 55 |
|
|
45 | 56 | end |
|
46 | 57 | end |
|
47 | 58 |
|
|
48 | 59 | |
|
49 | 60 |
|
|
50 | 61 |
|
|
51 | 62 | # check if action is allowed on public projects |
|
52 | if @project.public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ] | |
|
63 | if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ] | |
|
53 | 64 | return true |
|
54 | 65 | end |
|
55 |
# if user |
|
|
66 | # if user not logged in, redirect to login form | |
|
56 | 67 |
|
|
57 | 68 |
|
|
58 | 69 |
|
|
59 | 70 |
|
|
60 | 71 | end |
|
61 |
# check if |
|
|
72 | # if logged in, check if authorized | |
|
62 | 73 | if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) ) |
|
63 | 74 | return true |
|
64 | 75 |
|
|
65 | 76 | flash[:notice] = "Acces denied" |
|
66 | 77 | redirect_to(:controller => "") |
|
67 |
|
|
|
78 | false | |
|
68 | 79 |
|
|
69 | 80 | |
|
70 |
|
|
|
71 |
|
|
|
81 | # store current uri in session. | |
|
82 | # return to this location by calling redirect_back_or_default | |
|
72 | 83 |
|
|
73 | 84 |
|
|
74 | 85 |
|
|
75 | 86 | |
|
76 | 87 |
|
|
77 | 88 |
|
|
78 | 89 |
|
|
79 | 90 |
|
|
80 | 91 | else |
|
81 | 92 |
|
|
82 | 93 |
|
|
83 | 94 | end |
|
84 | 95 |
|
|
85 | ||
|
86 | 96 | end No newline at end of file |
@@ -1,43 +1,47 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class HelpController < ApplicationController |
|
19 | 19 | |
|
20 | 20 | skip_before_filter :check_if_login_required |
|
21 | 21 |
|
|
22 | 22 | |
|
23 | # displays help page for the requested controller/action | |
|
23 | 24 |
|
|
24 | if @params[:ctrl] and @help_config[@params[:ctrl]] | |
|
25 |
|
|
|
26 |
|
|
|
25 | # select help page to display | |
|
26 | if @params[:ctrl] and @help_config['pages'][@params[:ctrl]] | |
|
27 | if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]] | |
|
28 | template = @help_config['pages'][@params[:ctrl]][@params[:page]] | |
|
27 | 29 | else |
|
28 |
|
|
|
30 | template = @help_config['pages'][@params[:ctrl]]['index'] | |
|
29 | 31 | end |
|
30 | 32 | end |
|
33 | # choose language according to available help translations | |
|
34 | lang = (@help_config['langs'].include? Localization.lang) ? Localization.lang : @help_config['langs'].first | |
|
31 | 35 |
|
|
32 | 36 | if template |
|
33 | redirect_to "/manual/#{template}" | |
|
37 | redirect_to "/manual/#{lang}/#{template}" | |
|
34 | 38 | else |
|
35 | redirect_to "/manual/" | |
|
39 | redirect_to "/manual/#{lang}/" | |
|
36 | 40 | end |
|
37 | 41 |
|
|
38 | 42 | |
|
39 | 43 | private |
|
40 | 44 |
|
|
41 | 45 |
|
|
42 | 46 |
|
|
43 | 47 | end |
@@ -1,278 +1,282 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class ProjectsController < ApplicationController |
|
19 | 19 | layout 'base' |
|
20 | 20 | before_filter :find_project, :authorize, :except => [ :index, :list, :add ] |
|
21 | 21 | before_filter :require_admin, :only => [ :add, :destroy ] |
|
22 | 22 | |
|
23 | 23 | helper :sort |
|
24 | 24 | include SortHelper |
|
25 | 25 | helper :search_filter |
|
26 | 26 | include SearchFilterHelper |
|
27 | 27 | helper :custom_fields |
|
28 | 28 | include CustomFieldsHelper |
|
29 | 29 | |
|
30 | 30 | def index |
|
31 | 31 | list |
|
32 | 32 | render :action => 'list' |
|
33 | 33 | end |
|
34 | 34 | |
|
35 | 35 |
|
|
36 | 36 |
|
|
37 |
|
|
|
37 | sort_init 'name', 'asc' | |
|
38 | 38 |
|
|
39 |
|
|
|
39 | @project_count = Project.count(["is_public=?", true]) | |
|
40 | 40 |
|
|
41 | 41 | 15, |
|
42 | 42 | @params['page'] |
|
43 | 43 |
|
|
44 | :conditions => ["public=?", true], | |
|
44 | :conditions => ["is_public=?", true], | |
|
45 | 45 | :limit => @project_pages.items_per_page, |
|
46 | 46 | :offset => @project_pages.current.offset |
|
47 | 47 | end |
|
48 | 48 | |
|
49 | 49 | # Add a new project |
|
50 | 50 |
|
|
51 | 51 |
|
|
52 | @root_projects = Project::find(:all, :conditions => "parent_id is null") | |
|
52 | 53 |
|
|
53 | 54 |
|
|
54 | 55 |
|
|
55 | 56 |
|
|
56 | 57 |
|
|
57 | 58 |
|
|
58 | 59 |
|
|
59 | 60 | end |
|
60 | 61 |
|
|
61 | 62 | |
|
62 | 63 | # Show @project |
|
63 | 64 |
|
|
64 | 65 | @members = @project.members.find(:all, :include => [:user, :role]) |
|
66 | @subprojects = @project.children if @project.children_count > 0 | |
|
67 | @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC") | |
|
65 | 68 |
|
|
66 | 69 | |
|
67 | 70 | def settings |
|
71 | @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id]) | |
|
68 | 72 |
|
|
69 | 73 |
|
|
70 | 74 | @member ||= @project.members.new |
|
71 | 75 | @roles = Role.find_all |
|
72 | 76 | @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user } |
|
73 | 77 | end |
|
74 | 78 | |
|
75 | 79 |
|
|
76 | 80 |
|
|
77 | 81 |
|
|
78 | 82 |
|
|
79 | 83 |
|
|
80 | 84 |
|
|
81 | 85 |
|
|
82 | 86 | else |
|
83 | 87 | settings |
|
84 | 88 | render :action => 'settings' |
|
85 | 89 | end |
|
86 | 90 | end |
|
87 | 91 | end |
|
88 | 92 | |
|
89 | 93 | # Delete @project |
|
90 | 94 | def destroy |
|
91 | 95 | if request.post? and params[:confirm] |
|
92 | 96 | @project.destroy |
|
93 | 97 | redirect_to :controller => 'admin', :action => 'projects' |
|
94 | 98 | end |
|
95 | 99 | end |
|
96 | 100 | |
|
97 | 101 | # Add a new issue category to @project |
|
98 | 102 | def add_issue_category |
|
99 | 103 | if request.post? |
|
100 | 104 | @issue_category = @project.issue_categories.build(params[:issue_category]) |
|
101 | 105 | if @issue_category.save |
|
102 | 106 | redirect_to :action => 'settings', :id => @project |
|
103 | 107 | else |
|
104 | 108 | settings |
|
105 | 109 | render :action => 'settings' |
|
106 | 110 | end |
|
107 | 111 | end |
|
108 | 112 | end |
|
109 | 113 | |
|
110 | 114 | # Add a new version to @project |
|
111 | 115 | def add_version |
|
112 | 116 | @version = @project.versions.build(params[:version]) |
|
113 | 117 | if request.post? and @version.save |
|
114 | 118 | redirect_to :action => 'settings', :id => @project |
|
115 | 119 | end |
|
116 | 120 | end |
|
117 | 121 | |
|
118 | 122 | # Add a new member to @project |
|
119 | 123 | def add_member |
|
120 | 124 | @member = @project.members.build(params[:member]) |
|
121 | 125 | if request.post? |
|
122 | 126 | if @member.save |
|
123 | 127 | flash[:notice] = 'Member was successfully added.' |
|
124 | 128 | redirect_to :action => 'settings', :id => @project |
|
125 | 129 | else |
|
126 | 130 | settings |
|
127 | 131 | render :action => 'settings' |
|
128 | 132 | end |
|
129 | 133 | end |
|
130 | 134 | end |
|
131 | 135 | |
|
132 | 136 | # Show members list of @project |
|
133 | 137 | def list_members |
|
134 | 138 | @members = @project.members |
|
135 | 139 | end |
|
136 | 140 | |
|
137 | 141 | # Add a new document to @project |
|
138 | 142 | def add_document |
|
139 | 143 | @categories = Enumeration::get_values('DCAT') |
|
140 | 144 | @document = @project.documents.build(params[:document]) |
|
141 | 145 | if request.post? |
|
142 | 146 | # Save the attachment |
|
143 | 147 | if params[:attachment][:file].size > 0 |
|
144 | 148 | @attachment = @document.attachments.build(params[:attachment]) |
|
145 | 149 | @attachment.author_id = session[:user].id unless session[:user].nil? |
|
146 | 150 | end |
|
147 | 151 | if @document.save |
|
148 | 152 | redirect_to :action => 'list_documents', :id => @project |
|
149 | 153 | end |
|
150 | 154 | end |
|
151 | 155 | end |
|
152 | 156 | |
|
153 | 157 | # Show documents list of @project |
|
154 | 158 | def list_documents |
|
155 | 159 | @documents = @project.documents |
|
156 | 160 | end |
|
157 | 161 | |
|
158 | 162 | # Add a new issue to @project |
|
159 | 163 | def add_issue |
|
160 | 164 | @trackers = Tracker.find(:all) |
|
161 | 165 | @priorities = Enumeration::get_values('IPRI') |
|
162 | 166 | if request.get? |
|
163 | 167 | @issue = @project.issues.build |
|
164 | 168 | @custom_values = @project.custom_fields_for_issues.collect { |x| CustomValue.new(:custom_field => x) } |
|
165 | 169 | else |
|
166 | 170 | # Create the issue and set the author |
|
167 | 171 | @issue = @project.issues.build(params[:issue]) |
|
168 | 172 | @issue.author = session[:user] unless session[:user].nil? |
|
169 | 173 | # Create the document if a file was sent |
|
170 | 174 | if params[:attachment][:file].size > 0 |
|
171 | 175 | @attachment = @issue.attachments.build(params[:attachment]) |
|
172 | 176 | @attachment.author_id = session[:user].id unless session[:user].nil? |
|
173 | 177 | end |
|
174 | 178 | @custom_values = @project.custom_fields_for_issues.collect { |x| CustomValue.new(:custom_field => x, :value => params["custom_fields"][x.id.to_s]) } |
|
175 | 179 | @issue.custom_values = @custom_values |
|
176 | 180 | if @issue.save |
|
177 | 181 | flash[:notice] = "Issue was successfully added." |
|
178 | 182 | Mailer.deliver_issue_add(@issue) if Permission.find_by_controller_and_action(@params[:controller], @params[:action]).mail_enabled? |
|
179 | 183 | redirect_to :action => 'list_issues', :id => @project |
|
180 | 184 | end |
|
181 | 185 | end |
|
182 | 186 | end |
|
183 | 187 | |
|
184 | # Show issues list of @project | |
|
188 | # Show filtered/sorted issues list of @project | |
|
185 | 189 | def list_issues |
|
186 | 190 | sort_init 'issues.id', 'desc' |
|
187 | 191 | sort_update |
|
188 | 192 | |
|
189 | 193 | search_filter_init_list_issues |
|
190 | 194 | search_filter_update if params[:set_filter] or request.post? |
|
191 | 195 | |
|
192 | @issue_count = Issue.count(:include => :status, :conditions => search_filter_clause) | |
|
196 | @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause) | |
|
193 | 197 | @issue_pages = Paginator.new self, @issue_count, 15, @params['page'] |
|
194 | 198 | @issues = Issue.find :all, :order => sort_clause, |
|
195 | :include => [ :author, :status, :tracker ], | |
|
199 | :include => [ :author, :status, :tracker, :project ], | |
|
196 | 200 | :conditions => search_filter_clause, |
|
197 | 201 | :limit => @issue_pages.items_per_page, |
|
198 | 202 | :offset => @issue_pages.current.offset |
|
199 | 203 | end |
|
200 | 204 | |
|
201 | 205 | # Export filtered/sorted issues list to CSV |
|
202 | 206 | def export_issues_csv |
|
203 | 207 | sort_init 'issues.id', 'desc' |
|
204 | 208 | sort_update |
|
205 | 209 | |
|
206 | 210 | search_filter_init_list_issues |
|
207 | 211 | |
|
208 | 212 | @issues = Issue.find :all, :order => sort_clause, |
|
209 | :include => [ :author, :status, :tracker ], | |
|
213 | :include => [ :author, :status, :tracker, :project ], | |
|
210 | 214 | :conditions => search_filter_clause |
|
211 | 215 | |
|
212 | 216 | export = StringIO.new |
|
213 | 217 | CSV::Writer.generate(export, ',') do |csv| |
|
214 | 218 | csv << %w(Id Status Tracker Subject Author Created Updated) |
|
215 | 219 | @issues.each do |issue| |
|
216 | 220 | csv << [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, _('(time)', issue.created_on), _('(time)', issue.updated_on)] |
|
217 | 221 | end |
|
218 | 222 | end |
|
219 | 223 | export.rewind |
|
220 | 224 | send_data(export.read, |
|
221 | 225 | :type => 'text/csv; charset=utf-8; header=present', |
|
222 | 226 | :filename => 'export.csv') |
|
223 | 227 | end |
|
224 | 228 | |
|
225 | 229 | # Add a news to @project |
|
226 | 230 | def add_news |
|
227 | 231 | @news = @project.news.build(params[:news]) |
|
228 | 232 | if request.post? |
|
229 | 233 | @news.author = session[:user] unless session[:user].nil? |
|
230 | 234 | if @news.save |
|
231 | 235 | redirect_to :action => 'list_news', :id => @project |
|
232 | 236 | end |
|
233 | 237 | end |
|
234 | 238 | end |
|
235 | 239 | |
|
236 | 240 | # Show news list of @project |
|
237 | 241 | def list_news |
|
238 | 242 | @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "news.created_on DESC" |
|
239 | 243 | end |
|
240 | 244 | |
|
241 | 245 | def add_file |
|
242 | 246 | if request.post? |
|
243 | 247 | # Save the attachment |
|
244 | 248 | if params[:attachment][:file].size > 0 |
|
245 | 249 | @attachment = @project.versions.find(params[:version_id]).attachments.build(params[:attachment]) |
|
246 | 250 | @attachment.author_id = session[:user].id unless session[:user].nil? |
|
247 | 251 | if @attachment.save |
|
248 | 252 | redirect_to :controller => 'projects', :action => 'list_files', :id => @project |
|
249 | 253 | end |
|
250 | 254 | end |
|
251 | 255 | end |
|
252 | 256 | @versions = @project.versions |
|
253 | 257 | end |
|
254 | 258 | |
|
255 | 259 | def list_files |
|
256 | 260 | @versions = @project.versions |
|
257 | 261 | end |
|
258 | 262 | |
|
259 | 263 | # Show changelog of @project |
|
260 | 264 | def changelog |
|
261 | 265 | @fixed_issues = @project.issues.find(:all, |
|
262 | 266 | :include => [ :fixed_version, :status, :tracker ], |
|
263 | 267 | :conditions => [ "issue_statuses.is_closed=? and trackers.is_in_chlog=? and issues.fixed_version_id is not null", true, true] |
|
264 | 268 | ) |
|
265 | 269 | end |
|
266 | 270 | |
|
267 | 271 | private |
|
268 | 272 | # Find project of id params[:id] |
|
269 | 273 | # if not found, redirect to project list |
|
270 | 274 | # used as a before_filter |
|
271 | 275 | def find_project |
|
272 | 276 | @project = Project.find(params[:id]) |
|
273 | 277 | rescue |
|
274 | 278 | flash[:notice] = 'Project not found.' |
|
275 | 279 | redirect_to :action => 'list' |
|
276 | 280 | end |
|
277 | 281 | |
|
278 | 282 | end |
@@ -1,84 +1,84 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class RolesController < ApplicationController |
|
19 | 19 | layout 'base' |
|
20 | 20 | before_filter :require_admin |
|
21 | 21 | |
|
22 | 22 | def index |
|
23 | 23 | list |
|
24 | 24 | render :action => 'list' |
|
25 | 25 | end |
|
26 | 26 | |
|
27 | 27 | def list |
|
28 | 28 | @role_pages, @roles = paginate :roles, :per_page => 10 |
|
29 | 29 | end |
|
30 | 30 | |
|
31 | 31 | def new |
|
32 | 32 | @role = Role.new(params[:role]) |
|
33 | 33 | if request.post? |
|
34 | 34 | @role.permissions = Permission.find(@params[:permission_ids]) if @params[:permission_ids] |
|
35 | 35 | if @role.save |
|
36 | 36 | flash[:notice] = 'Role was successfully created.' |
|
37 | 37 | redirect_to :action => 'list' |
|
38 | 38 | end |
|
39 | 39 | end |
|
40 | 40 | @permissions = Permission.find(:all, :order => 'sort ASC') |
|
41 | 41 | end |
|
42 | 42 | |
|
43 | 43 | def edit |
|
44 | 44 | @role = Role.find(params[:id]) |
|
45 | 45 | if request.post? and @role.update_attributes(params[:role]) |
|
46 | 46 | @role.permissions = Permission.find(@params[:permission_ids] || []) |
|
47 | 47 | Permission.allowed_to_role_expired |
|
48 | 48 | flash[:notice] = 'Role was successfully updated.' |
|
49 | 49 | redirect_to :action => 'list' |
|
50 | 50 | end |
|
51 | 51 | @permissions = Permission.find(:all, :order => 'sort ASC') |
|
52 | 52 | end |
|
53 | 53 | |
|
54 | 54 | def destroy |
|
55 | 55 | @role = Role.find(params[:id]) |
|
56 | 56 | unless @role.members.empty? |
|
57 | 57 | flash[:notice] = 'Some members have this role. Can\'t delete it.' |
|
58 | 58 | else |
|
59 | 59 | @role.destroy |
|
60 | 60 | end |
|
61 | 61 | redirect_to :action => 'list' |
|
62 | 62 | end |
|
63 | 63 | |
|
64 | 64 | def workflow |
|
65 | @roles = Role.find_all | |
|
66 | @trackers = Tracker.find_all | |
|
67 | @statuses = IssueStatus.find_all | |
|
68 | 65 | |
|
69 | 66 | @role = Role.find_by_id(params[:role_id]) |
|
70 | 67 | @tracker = Tracker.find_by_id(params[:tracker_id]) |
|
71 | 68 | |
|
72 | 69 | if request.post? |
|
73 | 70 | Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id]) |
|
74 | 71 | (params[:issue_status] || []).each { |old, news| |
|
75 | 72 | news.each { |new| |
|
76 | 73 | @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new) |
|
77 | 74 | } |
|
78 | 75 | } |
|
79 | 76 | if @role.save |
|
80 | 77 | flash[:notice] = 'Workflow was successfully updated.' |
|
81 | 78 | end |
|
82 | 79 | end |
|
80 | @roles = Role.find_all | |
|
81 | @trackers = Tracker.find_all | |
|
82 | @statuses = IssueStatus.find(:all, :include => :workflows) | |
|
83 | 83 | end |
|
84 | 84 | end |
@@ -1,73 +1,77 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class UsersController < ApplicationController |
|
19 | 19 |
|
|
20 | 20 |
|
|
21 | 21 | |
|
22 | 22 |
|
|
23 | 23 |
|
|
24 | 24 | |
|
25 | 25 |
|
|
26 | 26 | list |
|
27 | 27 |
|
|
28 | 28 |
|
|
29 | 29 | |
|
30 | 30 |
|
|
31 |
|
|
|
31 | sort_init 'login', 'asc' | |
|
32 | 32 |
|
|
33 | 33 |
|
|
34 | 34 |
|
|
35 | 35 | 15, |
|
36 | 36 | @params['page'] |
|
37 | 37 |
|
|
38 | 38 | :limit => @user_pages.items_per_page, |
|
39 | 39 | :offset => @user_pages.current.offset |
|
40 | 40 |
|
|
41 | 41 | |
|
42 | 42 |
|
|
43 | 43 |
|
|
44 | 44 |
|
|
45 | 45 | else |
|
46 | 46 |
|
|
47 |
|
|
|
47 | @user.admin = params[:user][:admin] || false | |
|
48 | @user.login = params[:user][:login] | |
|
49 | @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] | |
|
48 | 50 |
|
|
49 | 51 |
|
|
50 | 52 |
|
|
51 | 53 | end |
|
52 | 54 | end |
|
53 | 55 |
|
|
54 | 56 | |
|
55 | 57 |
|
|
56 | 58 |
|
|
57 | 59 |
|
|
58 | 60 |
|
|
61 | @user.login = params[:user][:login] if params[:user][:login] | |
|
62 | @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? | |
|
59 | 63 |
|
|
60 | 64 |
|
|
61 | 65 |
|
|
62 | 66 | end |
|
63 | 67 | end |
|
64 | 68 |
|
|
65 | 69 | |
|
66 | 70 |
|
|
67 | 71 |
|
|
68 | 72 |
|
|
69 | 73 | rescue |
|
70 | 74 | flash[:notice] = "Unable to delete user" |
|
71 | 75 | redirect_to :action => 'list' |
|
72 | 76 |
|
|
73 | 77 | end |
@@ -1,53 +1,56 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class VersionsController < ApplicationController |
|
19 | 19 | layout 'base' |
|
20 | 20 | before_filter :find_project, :authorize |
|
21 | 21 | |
|
22 | 22 | def edit |
|
23 | 23 | if request.post? and @version.update_attributes(params[:version]) |
|
24 | 24 | flash[:notice] = 'Version was successfully updated.' |
|
25 | 25 | redirect_to :controller => 'projects', :action => 'settings', :id => @project |
|
26 | 26 | end |
|
27 | 27 | end |
|
28 | 28 | |
|
29 | 29 | def destroy |
|
30 | 30 | @version.destroy |
|
31 | 31 | redirect_to :controller => 'projects', :action => 'settings', :id => @project |
|
32 | 32 | rescue |
|
33 | 33 | flash[:notice] = "Unable to delete version" |
|
34 | 34 | redirect_to :controller => 'projects', :action => 'settings', :id => @project |
|
35 | 35 | end |
|
36 | 36 | |
|
37 | 37 | def download |
|
38 | 38 | @attachment = @version.attachments.find(params[:attachment_id]) |
|
39 | 39 | @attachment.increment_download |
|
40 | 40 | send_file @attachment.diskfile, :filename => @attachment.filename |
|
41 | rescue | |
|
42 | flash[:notice]="Requested file doesn't exist or has been deleted." | |
|
43 | redirect_to :controller => 'projects', :action => 'list_files', :id => @project | |
|
41 | 44 | end |
|
42 | 45 | |
|
43 | 46 | def destroy_file |
|
44 | 47 | @version.attachments.find(params[:attachment_id]).destroy |
|
45 | 48 | redirect_to :controller => 'projects', :action => 'list_files', :id => @project |
|
46 | 49 | end |
|
47 | 50 | |
|
48 | 51 | private |
|
49 | 52 | def find_project |
|
50 | 53 | @version = Version.find(params[:id]) |
|
51 | 54 | @project = @version.project |
|
52 | 55 | end |
|
53 | 56 | end |
@@ -1,65 +1,65 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | module ApplicationHelper |
|
19 | 19 | |
|
20 | 20 | def loggedin? |
|
21 | 21 | session[:user] |
|
22 | 22 | end |
|
23 | 23 | |
|
24 | 24 | def admin_loggedin? |
|
25 | 25 | session[:user] && session[:user].admin |
|
26 | 26 | end |
|
27 | 27 | |
|
28 | 28 | def authorize_for(controller, action) |
|
29 | 29 | # check if action is allowed on public projects |
|
30 | if @project.public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] | |
|
30 | if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] | |
|
31 | 31 | return true |
|
32 | 32 | end |
|
33 | 33 | # check if user is authorized |
|
34 | 34 | if session[:user] and (session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], session[:user].role_for_project(@project.id) ) ) |
|
35 | 35 | return true |
|
36 | 36 | end |
|
37 | 37 | return false |
|
38 | 38 | end |
|
39 | 39 | |
|
40 | 40 | def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) |
|
41 | 41 | link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action]) |
|
42 | 42 | end |
|
43 | 43 | |
|
44 | 44 | # Display a link to user's account page |
|
45 | 45 | def link_to_user(user) |
|
46 | 46 | link_to user.display_name, :controller => 'account', :action => 'show', :id => user |
|
47 | 47 | end |
|
48 | 48 | |
|
49 | 49 | def format_date(date) |
|
50 | 50 | _('(date)', date) if date |
|
51 | 51 | end |
|
52 | 52 | |
|
53 | 53 | def format_time(time) |
|
54 | 54 | _('(time)', time) if time |
|
55 | 55 | end |
|
56 | 56 | |
|
57 | 57 | def pagination_links_full(paginator, options={}, html_options={}) |
|
58 | 58 | html ='' |
|
59 | 59 | html << link_to(('« ' + _('Previous') ), { :page => paginator.current.previous }) + ' ' if paginator.current.previous |
|
60 | 60 | html << (pagination_links(paginator, options, html_options) || '') |
|
61 | 61 | html << ' ' + link_to((_('Next') + ' »'), { :page => paginator.current.next }) if paginator.current.next |
|
62 | 62 | html |
|
63 | 63 | end |
|
64 | 64 | |
|
65 | 65 | end |
@@ -1,85 +1,90 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | module SearchFilterHelper |
|
19 | 19 | |
|
20 | 20 | def search_filter_criteria(name, options = {}) |
|
21 |
|
|
|
22 |
|
|
|
23 | unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions] | |
|
24 |
|
|
|
25 | session[:search_filter][name][:conditions] = {} | |
|
21 | @search_filter ||= {} | |
|
22 | @search_filter[name] ||= {} | |
|
23 | @search_filter[name][:options] = [] | |
|
24 | @search_filter[name][:conditions] = {} | |
|
26 | 25 |
|
|
27 |
|
|
|
28 |
|
|
|
26 | @search_filter[name][:options] << [c[0], c[1].to_s] | |
|
27 | @search_filter[name][:conditions].store(c[1].to_s, c[2]) | |
|
29 | 28 |
|
|
30 | 29 |
|
|
31 | end | |
|
32 | 30 | |
|
33 | 31 | def search_filter_update |
|
34 |
|
|
|
32 | @search_filter.each_key {|field| session[:search_filter][field] = params[field] } | |
|
35 | 33 | end |
|
36 | 34 | |
|
37 | 35 | def search_filter_clause |
|
38 | clause = ["issues.project_id=?", @project.id] | |
|
39 |
|
|
|
40 |
v[: |
|
|
41 |
if |
|
|
42 |
clause[0] = clause[0] + " AND " + v[:conditions][ |
|
|
43 | clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil? | |
|
36 | clause = ["1=1"] | |
|
37 | @search_filter.each { |k, v| | |
|
38 | filter_value = session[:search_filter][k] || v[:options][0][1] | |
|
39 | if v[:conditions][filter_value] | |
|
40 | clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first | |
|
41 | clause += v[:conditions][filter_value][1..-1] | |
|
44 | 42 | end |
|
45 | 43 | } |
|
46 | 44 | clause |
|
47 | 45 | end |
|
48 | 46 | |
|
49 | def search_filter_tag(criteria) | |
|
47 | def search_filter_tag(criteria, options = {}) | |
|
48 | options[:name] = criteria | |
|
50 | 49 | content_tag("select", |
|
51 |
options_for_select( |
|
|
52 | :name => criteria | |
|
50 | options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]), | |
|
51 | options | |
|
53 | 52 | ) |
|
54 | 53 | end |
|
55 | 54 | |
|
56 | 55 | def search_filter_init_list_issues |
|
57 | 56 | search_filter_criteria('status_id') { |
|
58 |
[ [ |
|
|
59 |
[ |
|
|
57 | [ [_('[Open]'), "O", ["issue_statuses.is_closed=?", false]], | |
|
58 | [_('[All]'), "A", nil] | |
|
60 | 59 | ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] } |
|
61 | 60 | } |
|
62 | 61 | |
|
63 | 62 | search_filter_criteria('tracker_id') { |
|
64 |
[ [ |
|
|
63 | [ [_('[All]'), "A", nil] | |
|
65 | 64 | ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] } |
|
66 | 65 | } |
|
67 | 66 | |
|
68 | 67 | search_filter_criteria('priority_id') { |
|
69 |
[ [ |
|
|
68 | [ [_('[All]'), "A", nil] | |
|
70 | 69 | ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] } |
|
71 | 70 | } |
|
72 | 71 | |
|
73 | 72 | search_filter_criteria('category_id') { |
|
74 |
[ [ |
|
|
75 |
[ |
|
|
73 | [ [_('[All]'), "A", nil], | |
|
74 | [_('[None]'), "N", ["issues.category_id is null"]] | |
|
76 | 75 | ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] } |
|
77 | 76 | } |
|
78 | 77 | |
|
79 | 78 | search_filter_criteria('assigned_to_id') { |
|
80 |
[ [ |
|
|
81 |
[ |
|
|
82 |
] + |
|
|
79 | [ [_('[All]'), "A", nil], | |
|
80 | [_('[None]'), "N", ["issues.assigned_to_id is null"]] | |
|
81 | ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } | |
|
82 | } | |
|
83 | ||
|
84 | search_filter_criteria('subproject_id') { | |
|
85 | [ [_('[None]'), "N", ["issues.project_id=?", @project.id]], | |
|
86 | [_('[All]'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]] | |
|
87 | ] | |
|
83 | 88 |
} |
|
84 | 89 | end |
|
85 | 90 | end No newline at end of file |
@@ -1,81 +1,81 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | require "digest/md5" |
|
19 | 19 | |
|
20 | 20 | class Attachment < ActiveRecord::Base |
|
21 | 21 | belongs_to :container, :polymorphic => true |
|
22 | 22 | belongs_to :author, :class_name => "User", :foreign_key => "author_id" |
|
23 | 23 | |
|
24 | 24 | validates_presence_of :filename |
|
25 | 25 | |
|
26 | 26 | def file=(incomming_file) |
|
27 | 27 | unless incomming_file.nil? |
|
28 | 28 | @temp_file = incomming_file |
|
29 | 29 | if @temp_file.size > 0 |
|
30 | 30 | self.filename = sanitize_filename(@temp_file.original_filename) |
|
31 | 31 | self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename |
|
32 | 32 | self.content_type = @temp_file.content_type |
|
33 | self.size = @temp_file.size | |
|
33 | self.filesize = @temp_file.size | |
|
34 | 34 | end |
|
35 | 35 | end |
|
36 | 36 | end |
|
37 | 37 | |
|
38 | 38 | # Copy temp file to its final location |
|
39 | 39 | def before_save |
|
40 | 40 | if @temp_file && (@temp_file.size > 0) |
|
41 | 41 | logger.debug("saving '#{self.diskfile}'") |
|
42 | 42 | File.open(diskfile, "wb") do |f| |
|
43 | 43 | f.write(@temp_file.read) |
|
44 | 44 | end |
|
45 | 45 | self.digest = Digest::MD5.hexdigest(File.read(diskfile)) |
|
46 | 46 | end |
|
47 | 47 | end |
|
48 | 48 | |
|
49 | 49 | # Deletes file on the disk |
|
50 | 50 | def after_destroy |
|
51 | 51 | if self.filename? |
|
52 | 52 | File.delete(diskfile) if File.exist?(diskfile) |
|
53 | 53 | end |
|
54 | 54 | end |
|
55 | 55 | |
|
56 | 56 | # Returns file's location on disk |
|
57 | 57 | def diskfile |
|
58 | 58 | "#{RDM_STORAGE_PATH}/#{self.disk_filename}" |
|
59 | 59 | end |
|
60 | 60 | |
|
61 | 61 | def increment_download |
|
62 | 62 | increment!(:downloads) |
|
63 | 63 | end |
|
64 | 64 | |
|
65 | 65 | # returns last created projects |
|
66 | 66 | def self.most_downloaded |
|
67 | 67 | find(:all, :limit => 5, :order => "downloads DESC") |
|
68 | 68 | end |
|
69 | 69 | |
|
70 | 70 | private |
|
71 | 71 | def sanitize_filename(value) |
|
72 | 72 | # get only the filename, not the whole path |
|
73 | 73 | just_filename = value.gsub(/^.*(\\|\/)/, '') |
|
74 | 74 | # NOTE: File.basename doesn't work right with Windows paths on Unix |
|
75 | 75 | # INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/')) |
|
76 | 76 | |
|
77 | 77 | # Finally, replace all non alphanumeric, underscore or periods with underscore |
|
78 | 78 | @filename = just_filename.gsub(/[^\w\.\-]/,'_') |
|
79 | 79 | end |
|
80 | 80 | |
|
81 | 81 | end |
@@ -1,45 +1,46 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Enumeration < ActiveRecord::Base |
|
19 | 19 | before_destroy :check_integrity |
|
20 | 20 | |
|
21 | 21 | validates_presence_of :opt, :name |
|
22 | validates_uniqueness_of :name, :scope => [:opt] | |
|
22 | 23 | |
|
23 | 24 | OPTIONS = [ |
|
24 | 25 | ["Issue priorities", "IPRI"], |
|
25 | 26 | ["Document categories", "DCAT"] |
|
26 | 27 | ].freeze |
|
27 | 28 | |
|
28 | 29 | def self.get_values(option) |
|
29 | 30 | find(:all, :conditions => ['opt=?', option]) |
|
30 | 31 | end |
|
31 | 32 | |
|
32 | 33 | def name |
|
33 | 34 | _ self.attributes['name'] |
|
34 | 35 | end |
|
35 | 36 | |
|
36 | 37 | private |
|
37 | 38 | def check_integrity |
|
38 | 39 | case self.opt |
|
39 | 40 | when "IPRI" |
|
40 | 41 | raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id]) |
|
41 | 42 | when "DCAT" |
|
42 | 43 | raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id]) |
|
43 | 44 | end |
|
44 | 45 | end |
|
45 | 46 | end |
@@ -1,28 +1,29 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class IssueCategory < ActiveRecord::Base |
|
19 | 19 | before_destroy :check_integrity |
|
20 | 20 |
|
|
21 | 21 | |
|
22 | 22 | validates_presence_of :name |
|
23 | validates_uniqueness_of :name, :scope => [:project_id] | |
|
23 | 24 | |
|
24 | 25 | private |
|
25 | 26 | def check_integrity |
|
26 | 27 | raise "Can't delete category" if Issue.find(:first, :conditions => ["category_id=?", self.id]) |
|
27 | 28 | end |
|
28 | 29 | end |
@@ -1,47 +1,49 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class IssueStatus < ActiveRecord::Base |
|
19 | 19 | before_destroy :check_integrity |
|
20 | 20 |
|
|
21 | 21 | |
|
22 | 22 |
|
|
23 | 23 |
|
|
24 | validates_length_of :html_color, :is=>6 | |
|
25 | validates_format_of :html_color, :with => /^[a-f0-9]*$/i | |
|
24 | 26 | |
|
25 | 27 |
|
|
26 | 28 |
|
|
27 | 29 |
|
|
28 | 30 |
|
|
29 | 31 | |
|
30 | 32 |
|
|
31 | 33 |
|
|
32 | 34 |
|
|
33 | for workflow in self.workflows.find(:all, :include => :new_status) | |
|
35 | for workflow in self.workflows | |
|
34 | 36 |
|
|
35 |
|
|
|
37 | end unless role.nil? or tracker.nil? | |
|
36 | 38 |
|
|
37 | 39 |
|
|
38 | 40 | |
|
39 | 41 | def name |
|
40 | 42 | _ self.attributes['name'] |
|
41 | 43 | end |
|
42 | 44 | |
|
43 | 45 | private |
|
44 | 46 | def check_integrity |
|
45 | 47 | raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id]) or IssueHistory.find(:first, :conditions => ["status_id=?", self.id]) |
|
46 | 48 | end |
|
47 | 49 | end |
@@ -1,63 +1,63 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Permission < ActiveRecord::Base |
|
19 | 19 | has_and_belongs_to_many :roles |
|
20 | 20 | |
|
21 | 21 | validates_presence_of :controller, :action, :descr |
|
22 | 22 | |
|
23 | 23 | GROUPS = { |
|
24 | 24 | 100 => "Project", |
|
25 | 25 | 200 => "Membres", |
|
26 | 26 | 300 => "Versions", |
|
27 | 27 | 400 => "Issue categories", |
|
28 | 28 | 1000 => "Issues", |
|
29 | 29 | 1100 => "News", |
|
30 | 30 | 1200 => "Documents", |
|
31 | 31 | 1300 => "Files", |
|
32 | 32 | }.freeze |
|
33 | 33 | |
|
34 | 34 | @@cached_perms_for_public = nil |
|
35 | 35 | @@cached_perms_for_roles = nil |
|
36 | 36 | |
|
37 | 37 | def name |
|
38 | 38 | self.controller + "/" + self.action |
|
39 | 39 | end |
|
40 | 40 | |
|
41 | 41 | def group_id |
|
42 | 42 | (self.sort / 100)*100 |
|
43 | 43 | end |
|
44 | 44 | |
|
45 | 45 | def self.allowed_to_public(action) |
|
46 | @@cached_perms_for_public ||= find(:all, :conditions => ["public=?", true]).collect {|p| "#{p.controller}/#{p.action}"} | |
|
46 | @@cached_perms_for_public ||= find(:all, :conditions => ["is_public=?", true]).collect {|p| "#{p.controller}/#{p.action}"} | |
|
47 | 47 | @@cached_perms_for_public.include? action |
|
48 | 48 | end |
|
49 | 49 | |
|
50 | 50 | def self.allowed_to_role(action, role) |
|
51 | 51 | @@cached_perms_for_roles ||= |
|
52 | 52 | begin |
|
53 | 53 | perms = {} |
|
54 | 54 | find(:all, :include => :roles).each {|p| perms.store "#{p.controller}/#{p.action}", p.roles.collect {|r| r.id } } |
|
55 | 55 | perms |
|
56 | 56 | end |
|
57 | 57 | @@cached_perms_for_roles[action] and @@cached_perms_for_roles[action].include? role |
|
58 | 58 | end |
|
59 | 59 | |
|
60 | 60 | def self.allowed_to_role_expired |
|
61 | 61 | @@cached_perms_for_roles = nil |
|
62 | 62 | end |
|
63 | 63 | end |
@@ -1,44 +1,48 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Project < ActiveRecord::Base |
|
19 | has_many :versions, :dependent => true, :order => "versions.date DESC" | |
|
19 | has_many :versions, :dependent => true, :order => "versions.effective_date DESC" | |
|
20 | 20 | has_many :members, :dependent => true |
|
21 | has_many :users, :through => :members | |
|
21 | 22 | has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status |
|
22 | 23 | has_many :documents, :dependent => true |
|
23 |
has_many :news, :dependent => true, |
|
|
24 | has_many :news, :dependent => true, :include => :author | |
|
24 | 25 | has_many :issue_categories, :dependent => true |
|
25 | 26 | has_and_belongs_to_many :custom_fields |
|
27 | acts_as_tree :order => "name", :counter_cache => true | |
|
26 | 28 | |
|
27 | 29 | validates_presence_of :name, :descr |
|
30 | validates_uniqueness_of :name | |
|
28 | 31 | |
|
29 | 32 | # returns 5 last created projects |
|
30 | 33 | def self.latest |
|
31 | 34 | find(:all, :limit => 5, :order => "created_on DESC") |
|
32 | 35 | end |
|
33 | 36 | |
|
34 | # Returns current version of the project | |
|
35 | def current_version | |
|
36 | versions.find(:first, :conditions => [ "date <= ?", Date.today ], :order => "date DESC, id DESC") | |
|
37 | end | |
|
38 | ||
|
39 | 37 | # Returns an array of all custom fields enabled for project issues |
|
40 | 38 | # (explictly associated custom fields and custom fields enabled for all projects) |
|
41 | 39 | def custom_fields_for_issues |
|
42 | 40 | (CustomField.for_all + custom_fields).uniq |
|
43 | 41 | end |
|
42 | ||
|
43 | protected | |
|
44 | def validate | |
|
45 | errors.add(parent_id, " must be a root project") if parent and parent.parent | |
|
46 | errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0 | |
|
47 | end | |
|
44 | 48 | end |
@@ -1,31 +1,34 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Tracker < ActiveRecord::Base |
|
19 | 19 | before_destroy :check_integrity |
|
20 | 20 | has_many :issues |
|
21 | 21 | has_many :workflows, :dependent => true |
|
22 | 22 | |
|
23 | validates_presence_of :name | |
|
24 | validates_uniqueness_of :name | |
|
25 | ||
|
23 | 26 | def name |
|
24 | 27 | _ self.attributes['name'] |
|
25 | 28 | end |
|
26 | 29 | |
|
27 | 30 | private |
|
28 | 31 | def check_integrity |
|
29 | 32 | raise "Can't delete tracker" if Issue.find(:first, :conditions => ["tracker_id=?", self.id]) |
|
30 | 33 | end |
|
31 | 34 | end |
@@ -1,89 +1,77 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | require "digest/sha1" |
|
19 | 19 | |
|
20 | 20 | class User < ActiveRecord::Base |
|
21 | 21 |
|
|
22 | 22 | |
|
23 |
|
|
|
23 | attr_accessor :password, :password_confirmation | |
|
24 | 24 |
|
|
25 | 25 |
|
|
26 | attr_protected :admin | |
|
26 | attr_protected :login, :admin, :password, :password_confirmation, :hashed_password | |
|
27 | 27 | |
|
28 | 28 |
|
|
29 | 29 |
|
|
30 | ||
|
31 | 30 |
|
|
32 | 31 |
|
|
33 | 32 |
|
|
33 | # Password length between 4 and 12 | |
|
34 | validates_length_of :password, :in => 4..12, :allow_nil => true | |
|
35 | validates_confirmation_of :password, :allow_nil => true | |
|
34 | 36 | |
|
35 |
|
|
|
36 | self.hashed_password = User.hash_password(self.password) | |
|
37 | end | |
|
38 | ||
|
39 | def after_create | |
|
40 | @password = nil | |
|
37 | def before_save | |
|
38 | # update hashed_password if password was set | |
|
39 | self.hashed_password = User.hash_password(self.password) if self.password | |
|
41 | 40 |
|
|
42 | 41 | |
|
43 |
|
|
|
44 | def try_to_login | |
|
45 | @user = User.login(self.login, self.password) | |
|
46 | unless @user.nil? | |
|
47 |
|
|
|
48 |
|
|
|
42 | # Returns the user that matches provided login and password, or nil | |
|
43 | def self.try_to_login(login, password) | |
|
44 | user = find(:first, :conditions => ["login=? and hashed_password=? and locked=?", login, User.hash_password(password), false]) | |
|
45 | if user | |
|
46 | user.last_before_login_on = user.last_login_on | |
|
47 | user.update_attribute(:last_login_on, Time.now) | |
|
49 | 48 | end |
|
50 | @user | |
|
49 | user | |
|
51 | 50 |
|
|
52 | 51 | |
|
53 | 52 |
|
|
54 | 53 |
|
|
55 | firstname + " " + lastname #+ (self.admin ? " (Admin)" : "" ) | |
|
56 | end | |
|
57 | ||
|
58 | # Returns the user that matches the given login and password | |
|
59 | def self.login(login, password) | |
|
60 | hashed_password = hash_password(password || "") | |
|
61 | find(:first, | |
|
62 | :conditions => ["login = ? and hashed_password = ? and locked = ?", login, hashed_password, false]) | |
|
54 | firstname + " " + lastname | |
|
63 | 55 |
|
|
64 | 56 | |
|
65 | 57 |
|
|
66 | 58 |
|
|
67 | 59 |
|
|
68 | 60 | |
|
69 | def change_password(current_password, new_password) | |
|
70 | self.hashed_password = User.hash_password(new_password) | |
|
71 | save | |
|
72 | end | |
|
73 | 61 | |
|
74 | 62 | def role_for_project(project_id) |
|
75 | 63 | @role_for_projects ||= |
|
76 | 64 | begin |
|
77 | 65 | roles = {} |
|
78 | 66 | self.memberships.each { |m| roles.store m.project_id, m.role_id } |
|
79 | 67 | roles |
|
80 | 68 | end |
|
81 | 69 | @role_for_projects[project_id] |
|
82 | 70 | end |
|
83 | 71 | |
|
84 | 72 | private |
|
85 | 73 |
|
|
86 | 74 |
|
|
87 |
|
|
|
75 | Digest::SHA1.hexdigest(clear_password || "") | |
|
88 | 76 |
|
|
89 | 77 | end |
@@ -1,30 +1,31 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Version < ActiveRecord::Base |
|
19 | 19 |
before_destroy :check_integrity |
|
20 | 20 |
|
|
21 | 21 |
|
|
22 | 22 | has_many :attachments, :as => :container, :dependent => true |
|
23 | 23 | |
|
24 |
|
|
|
24 | validates_presence_of :name | |
|
25 | validates_uniqueness_of :name, :scope => [:project_id] | |
|
25 | 26 | |
|
26 | 27 | private |
|
27 | 28 | def check_integrity |
|
28 | 29 | raise "Can't delete version" if self.fixed_issues.find(:first) |
|
29 | 30 | end |
|
30 | 31 | end |
@@ -1,25 +1,24 | |||
|
1 | 1 | # redMine - project management software |
|
2 | 2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
|
6 | 6 | # as published by the Free Software Foundation; either version 2 |
|
7 | 7 | # of the License, or (at your option) any later version. |
|
8 | 8 | # |
|
9 | 9 | # This program is distributed in the hope that it will be useful, |
|
10 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 | 12 | # GNU General Public License for more details. |
|
13 | 13 | # |
|
14 | 14 | # You should have received a copy of the GNU General Public License |
|
15 | 15 | # along with this program; if not, write to the Free Software |
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Workflow < ActiveRecord::Base |
|
19 | ||
|
20 | 19 |
|
|
21 | 20 |
|
|
22 | 21 |
|
|
23 | 22 | |
|
24 | 23 |
|
|
25 | 24 | end |
@@ -1,13 +1,13 | |||
|
1 | 1 | <div class="box"> |
|
2 |
<h2><%=_ |
|
|
2 | <h2><%=_('Please login') %></h2> | |
|
3 | 3 | |
|
4 | 4 | <%= start_form_tag :action=> "login" %> |
|
5 |
<p><label for=" |
|
|
6 | <input type="text" name="user[login]" id="user_login" size="30" /></p> | |
|
5 | <p><label for="login"><%=_ 'Login' %>:</label><br/> | |
|
6 | <%= text_field_tag 'login', nil, :size => 25 %></p> | |
|
7 | 7 | |
|
8 | 8 | <p><label for="user_password"><%=_ 'Password' %>:</label><br/> |
|
9 | <input type="password" name="user[password]" id="user_password" size="30"/></p> | |
|
9 | <%= password_field_tag 'password', nil, :size => 25 %></p> | |
|
10 | 10 | |
|
11 | 11 | <p><input type="submit" name="login" value="<%=_ 'Log in' %> »" class="primary" /></p> |
|
12 | 12 | <%= end_form_tag %> |
|
13 | 13 | </div> No newline at end of file |
@@ -1,54 +1,55 | |||
|
1 | 1 | <h2><%=_('My account')%></h2> |
|
2 | 2 | |
|
3 | 3 | <p><%=_('Login')%>: <strong><%= @user.login %></strong><br /> |
|
4 | 4 | <%=_('Created on')%>: <%= format_time(@user.created_on) %>, |
|
5 | 5 | <%=_('Last update')%>: <%= format_time(@user.updated_on) %></p> |
|
6 | 6 | |
|
7 | <%= error_messages_for 'user' %> | |
|
8 | ||
|
7 | 9 | <div class="splitcontentleft"> |
|
8 | 10 | <div class="box"> |
|
9 | 11 | <h3><%=_('Information')%></h3> |
|
10 | 12 | |
|
11 | 13 | <%= start_form_tag :action => 'my_account' %> |
|
12 | <%= error_messages_for 'user' %> | |
|
13 | 14 | |
|
14 | 15 | <!--[form:user]--> |
|
15 | 16 | <p><label for="user_firstname"><%=_('Firstname')%> <span class="required">*</span></label><br/> |
|
16 | 17 | <%= text_field 'user', 'firstname' %></p> |
|
17 | 18 | |
|
18 | 19 | <p><label for="user_lastname"><%=_('Lastname')%> <span class="required">*</span></label><br/> |
|
19 | 20 | <%= text_field 'user', 'lastname' %></p> |
|
20 | 21 | |
|
21 | 22 | <p><label for="user_mail"><%=_('Mail')%> <span class="required">*</span></label><br/> |
|
22 | 23 | <%= text_field 'user', 'mail' %></p> |
|
23 | 24 | |
|
24 | 25 | <p><label for="user_language"><%=_('Language')%></label><br/> |
|
25 | 26 | <%= select("user", "language", Localization.langs) %></p> |
|
26 | 27 | <!--[eoform:user]--> |
|
27 | 28 | |
|
28 | 29 | <p><%= check_box 'user', 'mail_notification' %> <label for="user_mail_notification"><%=_('Mail notifications')%></label></p> |
|
29 | 30 | |
|
30 | 31 | <center><%= submit_tag _('Save') %></center> |
|
31 | 32 | <%= end_form_tag %> |
|
32 | 33 | </div> |
|
33 | 34 | </div> |
|
34 | 35 | |
|
35 | 36 | |
|
36 | 37 | <div class="splitcontentright"> |
|
37 | 38 | <div class="box"> |
|
38 | 39 | <h3><%=_('Password')%></h3> |
|
39 | 40 | |
|
40 | 41 | <%= start_form_tag :action => 'change_password' %> |
|
41 | 42 | |
|
42 |
<p><label for=" |
|
|
43 |
<%= password_field_tag ' |
|
|
43 | <p><label for="password"><%=_('Password')%> <span class="required">*</span></label><br/> | |
|
44 | <%= password_field_tag 'password', nil, :size => 25 %></p> | |
|
44 | 45 | |
|
45 | 46 | <p><label for="new_password"><%=_('New password')%> <span class="required">*</span></label><br/> |
|
46 | <%= password_field_tag 'new_password' %></p> | |
|
47 | <%= password_field_tag 'new_password', nil, :size => 25 %></p> | |
|
47 | 48 | |
|
48 | 49 | <p><label for="new_password_confirmation"><%=_('Confirmation')%> <span class="required">*</span></label><br/> |
|
49 | <%= password_field_tag 'new_password_confirmation' %></p> | |
|
50 | <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %></p> | |
|
50 | 51 | |
|
51 | 52 | <center><%= submit_tag _('Save') %></center> |
|
52 | 53 | <%= end_form_tag %> |
|
53 | 54 | </div> |
|
54 | 55 | </div> No newline at end of file |
@@ -1,4 +1,10 | |||
|
1 | 1 | <h2><%=_('Information')%></h2> |
|
2 | 2 | |
|
3 |
<%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %>< |
|
|
4 | <%=_('Database')%>: <%= @adapter_name %> No newline at end of file | |
|
3 | <p><%=_('Version')%>: <strong><%= RDM_APP_NAME %> <%= RDM_APP_VERSION %></strong></p> | |
|
4 | ||
|
5 | Environment: | |
|
6 | <ul> | |
|
7 | <% Rails::Info.properties.each do |name, value| %> | |
|
8 | <li><%= name %>: <%= value %></li> | |
|
9 | <% end %> | |
|
10 | </ul> No newline at end of file |
@@ -1,35 +1,32 | |||
|
1 | 1 | <h2><%=_('Projects')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 |
<%= sort_header_tag(' |
|
|
5 | <%= sort_header_tag('name', :caption => _('Project')) %> | |
|
6 | 6 | <th><%=_('Description')%></th> |
|
7 | 7 | <th><%=_('Public')%></th> |
|
8 | <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %> | |
|
8 | <th><%=_('Subprojects')%></th> | |
|
9 | <%= sort_header_tag('created_on', :caption => _('Created on')) %> | |
|
9 | 10 | <th></th> |
|
10 | 11 | </tr> |
|
11 | 12 | |
|
12 | <% odd_or_even = 1 | |
|
13 | for project in @projects | |
|
14 | odd_or_even = 1 - odd_or_even %> | |
|
15 | <tr class="ListLine<%= odd_or_even %>"> | |
|
13 | <% for project in @projects %> | |
|
14 | <tr class="<%= cycle("odd", "even") %>"> | |
|
16 | 15 | <td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %> |
|
17 | 16 | <td><%= project.descr %> |
|
18 | <td align="center"><%= image_tag 'true' if project.public? %> | |
|
17 | <td align="center"><%= image_tag 'true' if project.is_public? %> | |
|
18 | <td align="center"><%= project.projects_count %> | |
|
19 | 19 | <td align="center"><%= format_date(project.created_on) %> |
|
20 | 20 | <td align="center"> |
|
21 | 21 | <%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %> |
|
22 | 22 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
23 | 23 | <%= end_form_tag %> |
|
24 | 24 | </td> |
|
25 | 25 | </tr> |
|
26 | 26 | <% end %> |
|
27 | 27 | </table> |
|
28 | 28 | |
|
29 | <%= link_to ('« ' + _('Previous')), { :page => @project_pages.current.previous } if @project_pages.current.previous %> | |
|
30 | <%= pagination_links(@project_pages) %> | |
|
31 | <%= link_to (_('Next') + ' »'), { :page => @project_pages.current.next } if @project_pages.current.next %> | |
|
29 | <p><%= pagination_links_full @project_pages %> | |
|
30 | [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p> | |
|
32 | 31 | |
|
33 | <br /> | |
|
34 | ||
|
35 | <%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %> No newline at end of file | |
|
32 | <p><%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %></p> No newline at end of file |
@@ -1,32 +1,32 | |||
|
1 | 1 | <h2><%=_('Custom fields')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 | 5 | <th><%=_('Name')%></th> |
|
6 | 6 | <th><%=_('Type')%></th> |
|
7 | 7 | <th><%=_('Required')%></th> |
|
8 | 8 | <th><%=_('For all projects')%></th> |
|
9 | 9 | <th><%=_('Used by')%></th> |
|
10 | 10 | <th></th> |
|
11 | 11 | </tr> |
|
12 | 12 | <% for custom_field in @custom_fields %> |
|
13 | <tr style="background-color:#CEE1ED"> | |
|
13 | <tr class="<%= cycle("odd", "even") %>"> | |
|
14 | 14 | <td><%= link_to custom_field.name, :action => 'edit', :id => custom_field %></td> |
|
15 | 15 | <td align="center"><%= CustomField::TYPES[custom_field.typ][0] %></td> |
|
16 | 16 | <td align="center"><%= image_tag 'true' if custom_field.is_required? %></td> |
|
17 | 17 | <td align="center"><%= image_tag 'true' if custom_field.is_for_all? %></td> |
|
18 | 18 | <td align="center"><%= custom_field.projects.count.to_s + ' ' + _('Project') + '(s)' unless custom_field.is_for_all? %></td> |
|
19 | 19 | <td align="center"> |
|
20 | 20 | <%= start_form_tag :action => 'destroy', :id => custom_field %> |
|
21 | 21 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
22 | 22 | <%= end_form_tag %> </td> |
|
23 | 23 | </tr> |
|
24 | 24 | <% end %> |
|
25 | 25 | </table> |
|
26 | 26 | |
|
27 | 27 | <%= link_to ('« ' + _('Previous')), { :page => @custom_field_pages.current.previous } if @custom_field_pages.current.previous %> |
|
28 | 28 | <%= link_to (_('Next') + ' »'), { :page => @custom_field_pages.current.next } if @custom_field_pages.current.next %> |
|
29 | 29 | |
|
30 | 30 | <br /> |
|
31 | 31 | |
|
32 | 32 | <%= link_to ('» ' + _('New custom field')), :action => 'new' %> |
@@ -1,45 +1,47 | |||
|
1 | 1 | <h2><%= @document.title %></h2> |
|
2 | 2 | |
|
3 | 3 | <strong><%=_('Description')%>:</strong> <%= @document.descr %><br /> |
|
4 | 4 | <strong><%=_('Category')%>:</strong> <%= @document.category.name %><br /> |
|
5 | 5 | <br /> |
|
6 | 6 | |
|
7 | 7 | <% if authorize_for('documents', 'edit') %> |
|
8 | 8 | <%= start_form_tag ({ :controller => 'documents', :action => 'edit', :id => @document }, :method => 'get' ) %> |
|
9 | 9 | <%= submit_tag _('Edit') %> |
|
10 | 10 | <%= end_form_tag %> |
|
11 | 11 | <% end %> |
|
12 | 12 | |
|
13 | 13 | <% if authorize_for('documents', 'destroy') %> |
|
14 | 14 | <%= start_form_tag ({ :controller => 'documents', :action => 'destroy', :id => @document } ) %> |
|
15 | 15 | <%= submit_tag _('Delete') %> |
|
16 | 16 | <%= end_form_tag %> |
|
17 | 17 | <% end %> |
|
18 | 18 | |
|
19 | 19 | <br /><br /> |
|
20 | 20 | |
|
21 | 21 | <table border="0" cellspacing="1" cellpadding="2" width="100%"> |
|
22 | 22 | <% for attachment in @document.attachments %> |
|
23 | 23 | <tr style="background-color:#CEE1ED"> |
|
24 | 24 | <td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td> |
|
25 | 25 | <td align="center"><%= format_date(attachment.created_on) %></td> |
|
26 | 26 | <td align="center"><%= attachment.author.display_name %></td> |
|
27 | <td><%= human_size(attachment.size) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td> | |
|
27 | <td><%= human_size(attachment.filesize) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td> | |
|
28 | ||
|
28 | 29 | <% if authorize_for('documents', 'destroy_attachment') %> |
|
29 | 30 | <td align="center"> |
|
30 | 31 | <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %> |
|
31 | 32 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
32 | 33 | <%= end_form_tag %> |
|
33 | 34 | </tr> |
|
34 | 35 | <% end %> |
|
36 | ||
|
35 | 37 | <% end %> |
|
36 | 38 | </table> |
|
37 | 39 | <br /> |
|
38 | 40 | |
|
39 | 41 | <% if authorize_for('documents', 'add_attachment') %> |
|
40 | 42 | <%= start_form_tag ({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true) %> |
|
41 | 43 | <%=_('Add file')%><br /><%= file_field 'attachment', 'file' %> |
|
42 | 44 | <%= submit_tag _('Add') %> |
|
43 | 45 | <%= end_form_tag %> |
|
44 | 46 | <% end %> |
|
45 | 47 |
@@ -1,17 +1,17 | |||
|
1 | 1 | <%= error_messages_for 'issue_status' %> |
|
2 | 2 | |
|
3 | 3 | <!--[form:issue_status]--> |
|
4 | <p><label for="issue_status_name"><%=_('Name')%></label><br/> | |
|
4 | <p><label for="issue_status_name"><%=_('Name')%></label> <span class="required">*</span><br/> | |
|
5 | 5 | <%= text_field 'issue_status', 'name' %></p> |
|
6 | 6 | |
|
7 | 7 | <p><%= check_box 'issue_status', 'is_closed' %> |
|
8 | 8 | <label for="issue_status_is_closed"><%=_('Issue closed')%></label></p> |
|
9 | 9 | |
|
10 | 10 | <p><%= check_box 'issue_status', 'is_default' %> |
|
11 | 11 | <label for="issue_status_is_default"><%=_('Default status')%></label></p> |
|
12 | 12 | |
|
13 | 13 | <p><label for="issue_status_html_color"><%=_('Color')%></label> |
|
14 |
#<%= text_field 'issue_status', 'html_color', : |
|
|
14 | #<%= text_field 'issue_status', 'html_color', :maxlength => 6 %> <span class="required">*</span></p> | |
|
15 | 15 | |
|
16 | 16 | <!--[eoform:issue_status]--> |
|
17 | 17 |
@@ -1,30 +1,30 | |||
|
1 | 1 | <h2><%=_('Issue statuses')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 | 5 | <th><%=_('Status')%></th> |
|
6 | 6 | <th><%=_('Default status')%></th> |
|
7 | 7 | <th><%=_('Issue closed')%></th> |
|
8 | 8 | <th><%=_('Color')%></th> |
|
9 | 9 | <th></th> |
|
10 | 10 | </tr> |
|
11 | 11 | |
|
12 | 12 | <% for status in @issue_statuses %> |
|
13 | <tr style="background-color:#CEE1ED"> | |
|
13 | <tr class="<%= cycle("odd", "even") %>"> | |
|
14 | 14 | <td><%= link_to status.name, :action => 'edit', :id => status %></td> |
|
15 | <td align="center"><%= image_tag 'true' if status.is_default %></td> | |
|
16 | <td align="center"><%= image_tag 'true' if status.is_closed %></td> | |
|
15 | <td align="center"><%= image_tag 'true' if status.is_default? %></td> | |
|
16 | <td align="center"><%= image_tag 'true' if status.is_closed? %></td> | |
|
17 | 17 | <td bgcolor="#<%= status.html_color %>"> </td> |
|
18 | 18 | <td align="center"> |
|
19 | 19 | <%= start_form_tag :action => 'destroy', :id => status %> |
|
20 | 20 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
21 | 21 | <%= end_form_tag %> |
|
22 | 22 | </td> |
|
23 | 23 | </tr> |
|
24 | 24 | <% end %> |
|
25 | 25 | </table> |
|
26 | 26 | |
|
27 | 27 | <%= pagination_links_full @issue_status_pages %> |
|
28 | 28 | <br /> |
|
29 | 29 | |
|
30 | 30 | <%= link_to '» ' + _('New issue status'), :action => 'new' %> |
@@ -1,90 +1,90 | |||
|
1 | 1 | |
|
2 | 2 | <h2><%=_('Issue')%> #<%= @issue.id %> - <%= @issue.subject %></h2> |
|
3 | 3 | |
|
4 | 4 | <div class="box"> |
|
5 | 5 | <p><b><%=_('Tracker')%>:</b> <%= @issue.tracker.name %></p> |
|
6 | 6 | <p><b><%=_('Priority')%>:</b> <%= @issue.priority.name %></p> |
|
7 | 7 | <p><b><%=_('Category')%>:</b> <%= @issue.category.name unless @issue.category_id.nil? %></p> |
|
8 | 8 | <p><b><%=_('Status')%>:</b> <%= @issue.status.name %></p> |
|
9 | 9 | <p><b><%=_('Author')%>:</b> <%= @issue.author.display_name %></p> |
|
10 | 10 | <p><b><%=_('Assigned to')%>:</b> <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %></p> |
|
11 | 11 | |
|
12 | 12 | <p><b><%=_('Subject')%>:</b> <%= @issue.subject %></p> |
|
13 | <p><b><%=_('Description')%>:</b> <%= @issue.descr %></p> | |
|
13 | <p><b><%=_('Description')%>:</b> <%= simple_format auto_link @issue.descr %></p> | |
|
14 | 14 | <p><b><%=_('Created on')%>:</b> <%= format_date(@issue.created_on) %></p> |
|
15 | 15 | |
|
16 | 16 | <% if authorize_for('issues', 'edit') %> |
|
17 | 17 | <%= start_form_tag ({:controller => 'issues', :action => 'edit', :id => @issue}, :method => "get" ) %> |
|
18 | 18 | <%= submit_tag _('Edit') %> |
|
19 | 19 | <%= end_form_tag %> |
|
20 | 20 | |
|
21 | 21 | <% end %> |
|
22 | 22 | |
|
23 | 23 | <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %> |
|
24 | 24 | <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %> |
|
25 | 25 | <label for="history_status_id"><%=_('Change status')%>:</label> |
|
26 | 26 | <select name="history[status_id]"> |
|
27 | 27 | <%= options_from_collection_for_select @status_options, "id", "name" %> |
|
28 | 28 | </select> |
|
29 | 29 | <%= submit_tag _ "Update..." %> |
|
30 | 30 | <%= end_form_tag %> |
|
31 | 31 | |
|
32 | 32 | <% end %> |
|
33 | 33 | |
|
34 | 34 | <% if authorize_for('issues', 'destroy') %> |
|
35 | 35 | <%= start_form_tag ({:controller => 'issues', :action => 'destroy', :id => @issue} ) %> |
|
36 | 36 | <%= submit_tag _ "Delete" %> |
|
37 | 37 | <%= end_form_tag %> |
|
38 | 38 | |
|
39 | 39 | <% end %> |
|
40 | 40 | |
|
41 | 41 | </div> |
|
42 | 42 | |
|
43 | 43 | |
|
44 | 44 | <div class="splitcontentleft"> |
|
45 | 45 | <div class="box"> |
|
46 | 46 | <h3><%=_('History')%></h3> |
|
47 | 47 | <table width="100%"> |
|
48 | 48 | <% for history in @issue.histories.find(:all, :include => :author) %> |
|
49 | 49 | <tr> |
|
50 | 50 | <td><%= format_date(history.created_on) %></td> |
|
51 | 51 | <td><%= history.author.display_name %></td> |
|
52 | 52 | <td><b><%= history.status.name %></b></td> |
|
53 | 53 | </tr> |
|
54 | 54 | <% if history.notes? %> |
|
55 | 55 | <tr><td colspan=3><div class="notes"><%= history.notes %></td></tr> |
|
56 | 56 | <% end %> |
|
57 | 57 | <% end %> |
|
58 | 58 | </table> |
|
59 | 59 | </div> |
|
60 | 60 | </div> |
|
61 | 61 | |
|
62 | 62 | <div class="splitcontentright"> |
|
63 | 63 | <div class="box"> |
|
64 | 64 | <h3><%=_('Attachments')%></h3> |
|
65 | 65 | <table width="100%"> |
|
66 | 66 | <% for attachment in @issue.attachments %> |
|
67 | 67 | <tr> |
|
68 | <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.size) %>)</td> | |
|
68 | <td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td> | |
|
69 | 69 | <td><%= format_date(attachment.created_on) %></td> |
|
70 | 70 | <td><%= attachment.author.display_name %></td> |
|
71 | 71 | <% if authorize_for('issues', 'destroy_attachment') %> |
|
72 | 72 | <td> |
|
73 | 73 | <%= start_form_tag :action => 'destroy_attachment', :id => @issue, :attachment_id => attachment %> |
|
74 | 74 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
75 | 75 | <%= end_form_tag %> |
|
76 | 76 | </td> |
|
77 | 77 | <% end %> |
|
78 | 78 | </tr> |
|
79 | 79 | <% end %> |
|
80 | 80 | </table> |
|
81 | 81 | <br /> |
|
82 | 82 | <% if authorize_for('issues', 'add_attachment') %> |
|
83 | 83 | <%= start_form_tag ({ :controller => 'issues', :action => 'add_attachment', :id => @issue }, :multipart => true) %> |
|
84 | 84 | <%=_('Add file')%>: <%= file_field 'attachment', 'file' %> |
|
85 | 85 | <%= submit_tag _('Add') %> |
|
86 | 86 | <%= end_form_tag %> |
|
87 | 87 | <% end %> |
|
88 | 88 | </div> |
|
89 | 89 | </div> |
|
90 | 90 |
@@ -1,89 +1,89 | |||
|
1 | 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
|
2 | 2 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
|
3 | 3 | <head> |
|
4 | 4 | <title>redMine</title> |
|
5 | 5 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
|
6 | 6 | <meta name="description" content="redMine" /> |
|
7 | 7 | <meta name="keywords" content="issue,bug,tracker" /> |
|
8 | 8 | <%= stylesheet_link_tag "application" %> |
|
9 | 9 | <%= stylesheet_link_tag "rails" %> |
|
10 | 10 | <%= javascript_include_tag :defaults %> |
|
11 | 11 | </head> |
|
12 | 12 | |
|
13 | 13 | <body> |
|
14 | 14 | <div id="container" > |
|
15 | 15 | |
|
16 | 16 | <div id="header"> |
|
17 | 17 | <div style="float: left;"> |
|
18 | 18 | <h1><%= RDM_APP_NAME %></h1> |
|
19 | 19 | <h2>Project management</h2> |
|
20 | 20 | </div> |
|
21 | 21 | <div style="float: right; padding-right: 1em; padding-top: 0.2em;"> |
|
22 | 22 | <% unless session[:user].nil? %><small><%=_('Logged as')%> <b><%= session[:user].login %></b></small><% end %> |
|
23 | 23 | </div> |
|
24 | 24 | </div> |
|
25 | 25 | |
|
26 | 26 | <div id="navigation"> |
|
27 | 27 | <ul> |
|
28 | 28 | <li class="selected"><%= link_to _('Home'), { :controller => '' }, :class => "picHome" %></li> |
|
29 | 29 | <li><%= link_to _('My page'), { :controller => 'account', :action => 'my_page'}, :class => "picUserPage" %></li> |
|
30 | 30 | <li><%= link_to _('Projects'), { :controller => 'projects' }, :class => "picProject" %></li> |
|
31 | 31 | |
|
32 | 32 | <% unless session[:user].nil? %> |
|
33 | 33 | <li><%= link_to _('My account'), { :controller => 'account', :action => 'my_account' }, :class => "picUser" %></li> |
|
34 | 34 | <% end %> |
|
35 | 35 | |
|
36 | 36 | <% if admin_loggedin? %> |
|
37 | 37 | <li><%= link_to _('Administration'), { :controller => 'admin' }, :class => "picAdmin" %></li> |
|
38 | 38 | <% end %> |
|
39 | 39 | |
|
40 | 40 | <li class="right"><%= link_to _('Help'), { :controller => 'help', :ctrl => @params[:controller], :page => @params[:action] }, :target => "new", :class => "picHelp" %></li> |
|
41 | 41 | <% if session[:user].nil? %> |
|
42 | 42 | <li class="right"><%= link_to _('Log in'), { :controller => 'account', :action => 'login' }, :class => "picUser" %></li> |
|
43 | 43 | <% else %> |
|
44 | 44 | <li class="right"><%= link_to _('Logout'), { :controller => 'account', :action => 'logout' }, :class => "picUser" %></li> |
|
45 | 45 | <% end %> |
|
46 | 46 | </ul> |
|
47 | 47 | |
|
48 | 48 | </div> |
|
49 | 49 | |
|
50 | 50 | <div id="subcontent"> |
|
51 | 51 | |
|
52 | 52 | <% unless @project.nil? || @project.id.nil? %> |
|
53 | 53 | <h2><%= @project.name %></h2> |
|
54 | 54 | <ul class="menublock"> |
|
55 | 55 | <li><%= link_to _('Overview'), :controller => 'projects', :action => 'show', :id => @project %></li> |
|
56 | 56 | <li><%= link_to _('Issues'), :controller => 'projects', :action => 'list_issues', :id => @project %></li> |
|
57 | 57 | <li><%= link_to _('Reports'), :controller => 'reports', :action => 'issue_report', :id => @project %></li> |
|
58 | 58 | <li><%= link_to _('News'), :controller => 'projects', :action => 'list_news', :id => @project %></li> |
|
59 | 59 | <li><%= link_to _('Change log'), :controller => 'projects', :action => 'changelog', :id => @project %></li> |
|
60 | 60 | <li><%= link_to _('Documents'), :controller => 'projects', :action => 'list_documents', :id => @project %></li> |
|
61 | 61 | <li><%= link_to _('Members'), :controller => 'projects', :action => 'list_members', :id => @project %></li> |
|
62 | 62 | <li><%= link_to _('Files'), :controller => 'projects', :action => 'list_files', :id => @project %></li> |
|
63 | 63 | <li><%= link_to_if_authorized _('Settings'), :controller => 'projects', :action => 'settings', :id => @project %></li> |
|
64 | 64 | </ul> |
|
65 | 65 | <% end %> |
|
66 | 66 | |
|
67 | 67 | <% unless session[:user].nil? %> |
|
68 | 68 | <h2><%=_('My projects') %></h2> |
|
69 | 69 | <ul class="menublock"> |
|
70 | 70 | <% for membership in session[:user].memberships %> |
|
71 | 71 | <li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %></li> |
|
72 | 72 | <% end %> |
|
73 | 73 | </ul> |
|
74 | 74 | <% end %> |
|
75 | 75 | |
|
76 | 76 | </div> |
|
77 | 77 | |
|
78 | 78 | <div id="content"> |
|
79 | 79 | <% if flash[:notice] %><p style="color: green"><%= flash[:notice] %></p><% end %> |
|
80 | 80 | <%= @content_for_layout %> |
|
81 | 81 | </div> |
|
82 | 82 | |
|
83 | 83 | <div id="footer"> |
|
84 |
<p><a href="http://redmine. |
|
|
84 | <p><a href="http://redmine.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %></p> | |
|
85 | 85 | </div> |
|
86 | 86 | |
|
87 | 87 | </div> |
|
88 | 88 | </body> |
|
89 | 89 | </html> No newline at end of file |
@@ -1,10 +1,10 | |||
|
1 | 1 | <h2><%= @news.title %></h2> |
|
2 | 2 | |
|
3 | 3 | <p> |
|
4 | 4 | <b><%=_('Summary')%></b>: <%= @news.shortdescr %><br /> |
|
5 | 5 | <b><%=_('By')%></b>: <%= @news.author.display_name %><br /> |
|
6 | 6 | <b><%=_('Date')%></b>: <%= format_time(@news.created_on) %> |
|
7 | 7 | </p> |
|
8 | 8 | |
|
9 | <%= @news.descr %> | |
|
9 | <%= simple_format auto_link @news.descr %> | |
|
10 | 10 |
@@ -1,28 +1,36 | |||
|
1 | 1 | <%= error_messages_for 'project' %> |
|
2 | 2 | |
|
3 | 3 | <!--[form:project]--> |
|
4 | 4 | <p><label for="project_name"><%=_('Name')%> <span class="required">*</span></label><br/> |
|
5 | 5 | <%= text_field 'project', 'name' %></p> |
|
6 | 6 | |
|
7 | <% if session[:user].admin %> | |
|
8 | <p><label for="project_parent_id"><%=_('Subproject of')%></label><br/> | |
|
9 | <select name="project[parent_id]"> | |
|
10 | <option value=""></option> | |
|
11 | <%= options_from_collection_for_select @root_projects, "id", "name", @project.parent_id %> | |
|
12 | </select></p> | |
|
13 | <% end %> | |
|
14 | ||
|
7 | 15 | <p><label for="project_descr"><%=_('Description')%> <span class="required">*</span></label><br/> |
|
8 |
<%= text_ |
|
|
16 | <%= text_area 'project', 'descr', :cols => 60, :rows => 3 %></p> | |
|
9 | 17 | |
|
10 | 18 | <p><label for="project_homepage"><%=_('Homepage')%></label><br/> |
|
11 | 19 | <%= text_field 'project', 'homepage', :size => 40 %></p> |
|
12 | 20 | |
|
13 | <p><%= check_box 'project', 'public' %> | |
|
14 | <label for="project_public"><%=_('Public')%></label></p> | |
|
21 | <p><%= check_box 'project', 'is_public' %> | |
|
22 | <label for="project_is_public"><%=_('Public')%></label></p> | |
|
15 | 23 | |
|
16 | 24 | <fieldset><legend><%=_('Custom fields')%></legend> |
|
17 | 25 | <% for custom_field in @custom_fields %> |
|
18 | 26 | <input type="checkbox" |
|
19 | 27 | |
|
20 | 28 | name="custom_field_ids[]" |
|
21 | 29 | value="<%= custom_field.id %>" |
|
22 | 30 | <%if @project.custom_fields.include? custom_field%>checked="checked"<%end%> |
|
23 | 31 | > <%= custom_field.name %> |
|
24 | 32 | |
|
25 | 33 | <% end %></fieldset> |
|
26 | 34 | <br /> |
|
27 | 35 | |
|
28 | 36 | <!--[eoform:project]--> |
@@ -1,12 +1,12 | |||
|
1 | 1 | <h2><%=_('Change log')%></h2> |
|
2 | 2 | |
|
3 | 3 | <% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %> |
|
4 | 4 | <% fixed_issues.each do |version, issues| %> |
|
5 | <p><strong><%= version.name %></strong> - <%= format_date(version.date) %><br /> | |
|
5 | <p><strong><%= version.name %></strong> - <%= format_date(version.effective_date) %><br /> | |
|
6 | 6 | <%=h version.descr %></p> |
|
7 | 7 | <ul> |
|
8 | 8 | <% issues.each do |i| %> |
|
9 | 9 | <li><%= link_to i.long_id, :controller => 'issues', :action => 'show', :id => i %> [<%= i.tracker.name %>]: <%= i.subject %></li> |
|
10 | 10 | <% end %> |
|
11 | 11 | </ul> |
|
12 | 12 | <% end %> |
@@ -1,22 +1,20 | |||
|
1 | 1 | <h2><%=_('Public projects')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table width="100%" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 |
<%= sort_header_tag(' |
|
|
5 | <%= sort_header_tag('name', :caption => _('Project')) %> | |
|
6 | 6 | <th>Description</th> |
|
7 |
<%= sort_header_tag(' |
|
|
7 | <%= sort_header_tag('created_on', :caption => _('Created on')) %> | |
|
8 | 8 | </tr> |
|
9 | 9 | |
|
10 | <% odd_or_even = 1 | |
|
11 | for project in @projects | |
|
12 | odd_or_even = 1 - odd_or_even %> | |
|
13 | <tr class="ListLine<%= odd_or_even %>"> | |
|
10 | <% for project in @projects %> | |
|
11 | <tr class="<%= cycle("odd", "even") %>"> | |
|
14 | 12 | <td><%= link_to project.name, :action => 'show', :id => project %> |
|
15 | 13 | <td><%= project.descr %> |
|
16 | 14 | <td align="center"><%= format_date(project.created_on) %> |
|
17 | 15 | </tr> |
|
18 | 16 | <% end %> |
|
19 | 17 | </table> |
|
20 | 18 | |
|
21 | 19 | <%= pagination_links_full @project_pages %> |
|
22 | 20 | [ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ] No newline at end of file |
@@ -1,47 +1,46 | |||
|
1 | 1 | <h2><%=_('Files')%></h2> |
|
2 | 2 | |
|
3 | 3 | <% delete_allowed = authorize_for('versions', 'destroy_file') %> |
|
4 | 4 | |
|
5 | 5 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
6 | 6 | <tr class="ListHead"> |
|
7 | 7 | <th><%=_('Version')%></th> |
|
8 | 8 | <th><%=_('File')%></th> |
|
9 | 9 | <th><%=_('Date')%></th> |
|
10 | 10 | <th><%=_('Size')%></th> |
|
11 | 11 | <th>D/L</th> |
|
12 | 12 | <th>MD5</th> |
|
13 | 13 | <% if delete_allowed %><th></th><% end %> |
|
14 | 14 | </tr> |
|
15 | 15 | |
|
16 | 16 | <% for version in @versions %> |
|
17 | 17 | <tr> |
|
18 | 18 | <td colspan="7"><%= image_tag 'package' %> <b><%= version.name %></b></td> |
|
19 | 19 | </tr> |
|
20 | <% odd_or_even = 1 | |
|
21 | for file in version.attachments | |
|
22 | odd_or_even = 1 - odd_or_even %> | |
|
23 | <tr class="ListLine<%= odd_or_even %>"> | |
|
20 | <% for file in version.attachments %> | |
|
21 | <tr class="<%= cycle("odd", "even") %>"> | |
|
24 | 22 | <td></td> |
|
25 | 23 | <td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td> |
|
26 | 24 | <td align="center"><%= format_date(file.created_on) %></td> |
|
27 | <td align="center"><%= human_size(file.size) %></td> | |
|
25 | <td align="center"><%= human_size(file.filesize) %></td> | |
|
28 | 26 | <td align="center"><%= file.downloads %></td> |
|
29 | 27 | <td align="center"><small><%= file.digest %></small></td> |
|
30 | 28 | <% if delete_allowed %> |
|
31 | 29 | <td align="center"> |
|
32 | 30 | <%= start_form_tag :controller => 'versions', :action => 'destroy_file', :id => version, :attachment_id => file %> |
|
33 | 31 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
34 | 32 | <%= end_form_tag %> |
|
35 | 33 | </td> |
|
36 | 34 | <% end %> |
|
37 | 35 | </tr> |
|
38 |
<% end |
|
|
36 | <% end | |
|
37 | reset_cycle %> | |
|
39 | 38 | <% end %> |
|
40 | 39 | </table> |
|
41 | 40 | |
|
42 | 41 | <br /> |
|
43 | 42 | <p> |
|
44 | 43 | <%= link_to_if_authorized '» ' + _('New'), :controller => 'projects', :action => 'add_file', :id => @project %> |
|
45 | 44 | </p> |
|
46 | 45 | |
|
47 | 46 |
@@ -1,58 +1,60 | |||
|
1 | 1 | <h2><%=_('Issues')%></h2> |
|
2 | 2 | |
|
3 | 3 | <form method="post" class="noborder"> |
|
4 | 4 | <table cellpadding=2> |
|
5 | 5 | <tr> |
|
6 |
<td><%=_('Status')%>:<br /><%= search_filter_tag |
|
|
7 |
<td><%=_('Tracker')%>:<br /><%= search_filter_tag |
|
|
8 |
<td><%=_('Priority')%>:<br /><%= search_filter_tag |
|
|
9 |
<td><%=_('Category')%>:<br /><%= search_filter_tag |
|
|
10 |
<td><%=_('Assigned to')%>:<br /><%= search_filter_tag |
|
|
6 | <td><small><%=_('Status')%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td> | |
|
7 | <td><small><%=_('Tracker')%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td> | |
|
8 | <td><small><%=_('Priority')%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td> | |
|
9 | <td><small><%=_('Category')%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td> | |
|
10 | <td><small><%=_('Assigned to')%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td> | |
|
11 | <td><small><%=_('Subprojects')%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td> | |
|
12 | ||
|
11 | 13 | <td valign="bottom"> |
|
12 | <%= submit_tag _('Apply filter') %> | |
|
14 | <%= submit_tag _('Apply filter'), :class => 'button-small' %> | |
|
13 | 15 | <%= end_form_tag %> |
|
14 | 16 | |
|
15 | 17 | <%= start_form_tag %> |
|
16 | <%= submit_tag _('Reset') %> | |
|
18 | <%= submit_tag _('Reset'), :class => 'button-small' %> | |
|
17 | 19 | <%= end_form_tag %> |
|
18 | 20 | </td> |
|
19 | 21 | </tr> |
|
20 | 22 | </table> |
|
21 | 23 | |
|
22 | 24 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
23 | 25 | |
|
24 | 26 | <tr><td colspan="7" align="right"> |
|
25 | 27 | <small><%= link_to 'Export to CSV', :action => 'export_issues_csv', :id => @project.id %></small> |
|
26 | 28 | </td></tr> |
|
27 | 29 | |
|
28 | 30 | <tr class="ListHead"> |
|
29 | 31 | <%= sort_header_tag('issues.id', :caption => '#') %> |
|
30 | 32 | <%= sort_header_tag('issue_statuses.name', :caption => _('Status')) %> |
|
31 | 33 | <%= sort_header_tag('issues.tracker_id', :caption => _('Tracker')) %> |
|
32 | 34 | <th><%=_('Subject')%></th> |
|
33 | 35 | <%= sort_header_tag('users.lastname', :caption => _('Author')) %> |
|
34 | 36 | <%= sort_header_tag('issues.created_on', :caption => _('Created on')) %> |
|
35 | 37 | <%= sort_header_tag('issues.updated_on', :caption => _('Last update')) %> |
|
36 | 38 | </tr> |
|
37 | 39 | |
|
38 | 40 | <% for issue in @issues %> |
|
39 | 41 | <tr bgcolor="#<%= issue.status.html_color %>"> |
|
40 | 42 | <td align="center"><%= link_to issue.long_id, :controller => 'issues', :action => 'show', :id => issue %></td> |
|
41 | 43 | <td align="center"><%= issue.status.name %></td> |
|
42 | 44 | <td align="center"><%= issue.tracker.name %></td> |
|
43 | 45 | <td><%= link_to issue.subject, :controller => 'issues', :action => 'show', :id => issue %></td> |
|
44 | 46 | <td align="center"><%= issue.author.display_name %></td> |
|
45 | 47 | <td align="center"><%= format_time(issue.created_on) %></td> |
|
46 | 48 | <td align="center"><%= format_time(issue.updated_on) %></td> |
|
47 | 49 | </tr> |
|
48 | 50 | <% end %> |
|
49 | 51 | </table> |
|
50 | 52 | <p> |
|
51 | 53 | <%= pagination_links_full @issue_pages %> |
|
52 | 54 | [ <%= @issue_pages.current.first_item %> - <%= @issue_pages.current.last_item %> / <%= @issue_count %> ] |
|
53 | 55 | </p> |
|
54 | 56 | |
|
55 | 57 | |
|
56 | 58 | <p> |
|
57 | 59 | <%= link_to_if_authorized '» ' + _('Report an issue'), :controller => 'projects', :action => 'add_issue', :id => @project %> |
|
58 | 60 | </p> No newline at end of file |
@@ -1,53 +1,62 | |||
|
1 | 1 | <h2><%=_('Overview')%></h2> |
|
2 | 2 | |
|
3 | 3 | <div class="splitcontentleft"> |
|
4 | 4 | <%= @project.descr %> |
|
5 | 5 | <ul> |
|
6 | 6 | <li><%=_('Homepage')%>: <%= link_to @project.homepage, @project.homepage %></li> |
|
7 | 7 | <li><%=_('Created on')%>: <%= format_date(@project.created_on) %></li> |
|
8 | 8 | </ul> |
|
9 | 9 | |
|
10 | 10 | <div class="box"> |
|
11 | 11 | <h3><%= image_tag "tracker" %> <%=_('Trackers')%></h3> |
|
12 | 12 | <ul> |
|
13 | 13 | <% for tracker in Tracker.find_all %> |
|
14 | 14 | <li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project, |
|
15 | 15 | :set_filter => 1, |
|
16 |
" |
|
|
17 | <%= tracker.issues.count(["project_id=?", @project.id]) %> <%=_('open')%> | |
|
16 | "tracker_id" => tracker.id %>: | |
|
17 | <%= Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %> <%=_('open')%> | |
|
18 | 18 | </li> |
|
19 | 19 | <% end %> |
|
20 | 20 | </ul> |
|
21 | 21 | <%= link_to_if_authorized '» ' + _('Report an issue'), :controller => 'projects', :action => 'add_issue', :id => @project %> |
|
22 | 22 | <br /> |
|
23 | 23 | <center><small>[ <%= link_to _('View all issues'), :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1 %> ]</small></center> |
|
24 | 24 | </div> |
|
25 | 25 | </div> |
|
26 | 26 | |
|
27 | 27 | <div class="splitcontentright"> |
|
28 | 28 | <div class="box"> |
|
29 | 29 | <h3><%= image_tag "users" %> <%=_('Members')%></h3> |
|
30 | 30 | <% for member in @members %> |
|
31 | 31 | <%= link_to_user member.user %> (<%= member.role.name %>)<br /> |
|
32 | 32 | <% end %> |
|
33 | 33 | </div> |
|
34 | 34 | |
|
35 | <% if @subprojects %> | |
|
36 | <div class="box"> | |
|
37 | <h3><%= image_tag "projects" %> <%=_('Subprojects')%></h3> | |
|
38 | <% for subproject in @subprojects %> | |
|
39 | <%= link_to subproject.name, :action => 'show', :id => subproject %><br /> | |
|
40 | <% end %> | |
|
41 | </div> | |
|
42 | <% end %> | |
|
43 | ||
|
35 | 44 | <div class="box"> |
|
36 | 45 | <h3><%=_('Latest news')%></h3> |
|
37 |
<% for news in @ |
|
|
46 | <% for news in @news %> | |
|
38 | 47 | <p> |
|
39 | 48 | <b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br /> |
|
40 | 49 | <%= news.shortdescr %> |
|
41 | 50 | <small>[<%= link_to _('Read...'), :controller => 'news', :action => 'show', :id => news %>]</small> |
|
42 | 51 | </p> |
|
43 | 52 | <hr /> |
|
44 | 53 | <% end %> |
|
45 | 54 | <center><small>[ <%= link_to _('View all news'), :controller => 'projects', :action => 'list_news', :id => @project %> ]</small></center> |
|
46 | 55 | </div> |
|
47 | 56 | </div> |
|
48 | 57 | |
|
49 | 58 | |
|
50 | 59 | |
|
51 | 60 | |
|
52 | 61 | |
|
53 | 62 |
@@ -1,23 +1,23 | |||
|
1 | 1 | <h2><%=_('Roles')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 | 5 | <th><%=_('Role')%></th> |
|
6 | 6 | <th></th> |
|
7 | 7 | </tr> |
|
8 | 8 | |
|
9 | 9 | <% for role in @roles %> |
|
10 | <tr style="background-color:#CEE1ED"> | |
|
10 | <tr class="<%= cycle("odd", "even") %>"> | |
|
11 | 11 | <td><%= link_to role.name, :action => 'edit', :id => role %></td> |
|
12 | 12 | <td align="center"> |
|
13 | 13 | <%= start_form_tag :action => 'destroy', :id => role %> |
|
14 | 14 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
15 | 15 | <%= end_form_tag %> |
|
16 | 16 | </tr> |
|
17 | 17 | <% end %> |
|
18 | 18 | </table> |
|
19 | 19 | |
|
20 | 20 | <%= pagination_links_full @role_pages %> |
|
21 | 21 | <br /> |
|
22 | 22 | |
|
23 | 23 | <%= link_to '» ' + _('New role'), :action => 'new' %> |
@@ -1,24 +1,24 | |||
|
1 | 1 | <h2><%=_('Trackers')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 | 5 | <th><%=_('Tracker')%></th> |
|
6 | 6 | <th></th> |
|
7 | 7 | </tr> |
|
8 | 8 | |
|
9 | 9 | <% for tracker in @trackers %> |
|
10 | <tr style="background-color:#CEE1ED"> | |
|
10 | <tr class="<%= cycle("odd", "even") %>"> | |
|
11 | 11 | <td><%= link_to tracker.name, :action => 'edit', :id => tracker %></td> |
|
12 | 12 | <td align="center"> |
|
13 | 13 | <%= start_form_tag :action => 'destroy', :id => tracker %> |
|
14 | 14 | <%= submit_tag _('Delete'), :class => "button-small" %> |
|
15 | 15 | <%= end_form_tag %> |
|
16 | 16 | </td> |
|
17 | 17 | </tr> |
|
18 | 18 | <% end %> |
|
19 | 19 | </table> |
|
20 | 20 | |
|
21 | 21 | <%= pagination_links_full @tracker_pages %> |
|
22 | 22 | <br /> |
|
23 | 23 | |
|
24 | 24 | <%= link_to '» ' + _('New tracker'), :action => 'new' %> |
@@ -1,28 +1,31 | |||
|
1 | 1 | <%= error_messages_for 'user' %> |
|
2 | 2 | |
|
3 | 3 | <!--[form:user]--> |
|
4 | 4 | <p><label for="user_login"><%=_('Login')%></label><br/> |
|
5 | <%= text_field 'user', 'login' %></p> | |
|
5 | <%= text_field 'user', 'login', :size => 25 %></p> | |
|
6 | 6 | |
|
7 |
<p><label for=" |
|
|
8 |
<%= password_field ' |
|
|
7 | <p><label for="password"><%=_('Password')%></label><br/> | |
|
8 | <%= password_field_tag 'password', nil, :size => 25 %></p> | |
|
9 | ||
|
10 | <p><label for="password_confirmation"><%=_('Confirmation')%></label><br/> | |
|
11 | <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p> | |
|
9 | 12 | |
|
10 | 13 | <p><label for="user_firstname"><%=_('Firstname')%></label><br/> |
|
11 | 14 | <%= text_field 'user', 'firstname' %></p> |
|
12 | 15 | |
|
13 | 16 | <p><label for="user_lastname"><%=_('Lastname')%></label><br/> |
|
14 | 17 | <%= text_field 'user', 'lastname' %></p> |
|
15 | 18 | |
|
16 | 19 | <p><label for="user_mail"><%=_('Mail')%></label><br/> |
|
17 | 20 | <%= text_field 'user', 'mail' %></p> |
|
18 | 21 | |
|
19 | 22 | <p><label for="user_language"><%=_('Language')%></label><br/> |
|
20 | 23 | <%= select("user", "language", Localization.langs) %></p> |
|
21 | 24 | |
|
22 | 25 | <p><%= check_box 'user', 'admin' %> <label for="user_admin"><%=_('Administrator')%></label></p> |
|
23 | 26 | |
|
24 | 27 | <p><%= check_box 'user', 'mail_notification' %> <label for="user_mail_notification"><%=_('Mail notifications')%></label></p> |
|
25 | 28 | |
|
26 | 29 | <p><%= check_box 'user', 'locked' %> <label for="user_locked"><%=_('Locked')%></label></p> |
|
27 | 30 | <!--[eoform:user]--> |
|
28 | 31 |
@@ -1,46 +1,46 | |||
|
1 | 1 | <h2><%=_('Users')%></h2> |
|
2 | 2 | |
|
3 | 3 | <table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> |
|
4 | 4 | <tr class="ListHead"> |
|
5 |
<%= sort_header_tag(' |
|
|
6 |
<%= sort_header_tag(' |
|
|
7 |
<%= sort_header_tag(' |
|
|
5 | <%= sort_header_tag('login', :caption => _('Login')) %> | |
|
6 | <%= sort_header_tag('firstname', :caption => _('Firstname')) %> | |
|
7 | <%= sort_header_tag('lastname', :caption => _('Lastname')) %> | |
|
8 | 8 | <th><%=_('Mail')%></th> |
|
9 |
<%= sort_header_tag(' |
|
|
10 |
<%= sort_header_tag(' |
|
|
11 |
<%= sort_header_tag(' |
|
|
12 |
<%= sort_header_tag(' |
|
|
9 | <%= sort_header_tag('admin', :caption => _('Admin')) %> | |
|
10 | <%= sort_header_tag('locked', :caption => _('Locked')) %> | |
|
11 | <%= sort_header_tag('created_on', :caption => _('Created on')) %> | |
|
12 | <%= sort_header_tag('last_login_on', :caption => _('Last login')) %> | |
|
13 | 13 | <th></th> |
|
14 | 14 | </tr> |
|
15 | 15 | <% for user in @users %> |
|
16 | <tr style="background-color:#CEE1ED"> | |
|
16 | <tr class="<%= cycle("odd", "even") %>"> | |
|
17 | 17 | <td><%= link_to user.login, :action => 'edit', :id => user %></td> |
|
18 | 18 | <td><%= user.firstname %></td> |
|
19 | 19 | <td><%= user.lastname %></td> |
|
20 | 20 | <td><%= user.mail %></td> |
|
21 | 21 | <td align="center"><%= image_tag 'true' if user.admin? %></td> |
|
22 | 22 | <td align="center"><%= image_tag 'locked' if user.locked? %></td> |
|
23 | 23 | <td align="center"><%= format_time(user.created_on) %></td> |
|
24 | 24 | <td align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td> |
|
25 | 25 | <td align="center"> |
|
26 | 26 | <%= start_form_tag :action => 'edit', :id => user %> |
|
27 | 27 | <% if user.locked? %> |
|
28 |
<%= hidden_field_tag 'user[locked]', |
|
|
28 | <%= hidden_field_tag 'user[locked]', 0 %> | |
|
29 | 29 | <%= submit_tag _('Unlock'), :class => "button-small" %> |
|
30 | 30 | <% else %> |
|
31 |
<%= hidden_field_tag 'user[locked]', |
|
|
31 | <%= hidden_field_tag 'user[locked]', 1 %> | |
|
32 | 32 | <%= submit_tag _('Lock'), :class => "button-small" %> |
|
33 | 33 | <% end %> |
|
34 | 34 | <%= end_form_tag %> |
|
35 | 35 | </td> |
|
36 | 36 | </tr> |
|
37 | 37 | <% end %> |
|
38 | 38 | </table> |
|
39 | 39 | |
|
40 | 40 | <p><%= pagination_links_full @user_pages %> |
|
41 | 41 | [ <%= @user_pages.current.first_item %> - <%= @user_pages.current.last_item %> / <%= @user_count %> ] |
|
42 | 42 | </p> |
|
43 | 43 | |
|
44 | 44 | <p> |
|
45 | 45 | <%= link_to '» ' + _('New user'), :action => 'add' %> |
|
46 | 46 | </p> No newline at end of file |
@@ -1,13 +1,13 | |||
|
1 | 1 | <%= error_messages_for 'version' %> |
|
2 | 2 | |
|
3 | 3 | <!--[form:version]--> |
|
4 | <p><label for="version_name"><%=_('Version')%></label><br/> | |
|
4 | <p><label for="version_name"><%=_('Version')%></label> <span class="required">*</span><br/> | |
|
5 | 5 | <%= text_field 'version', 'name', :size => 20 %></p> |
|
6 | 6 | |
|
7 | 7 | <p><label for="version_descr"><%=_('Description')%></label><br/> |
|
8 | 8 | <%= text_field 'version', 'descr', :size => 60 %></p> |
|
9 | 9 | |
|
10 | <p><label for="version_date"><%=_('Date')%></label><br/> | |
|
11 | <%= date_select 'version', 'date' %></p> | |
|
10 | <p><label for="version_effective_date"><%=_('Date')%></label><br/> | |
|
11 | <%= date_select 'version', 'effective_date' %></p> | |
|
12 | 12 | <!--[eoform:version]--> |
|
13 | 13 |
@@ -1,30 +1,30 | |||
|
1 | 1 | <div class="splitcontentleft"> |
|
2 | 2 | <h2><%=_('Welcome')%> !</h2> |
|
3 | 3 | |
|
4 | 4 | <div class="box"> |
|
5 | <h3>Latest news</h3> | |
|
5 | <h3><%=_('Latest news')%></h3> | |
|
6 | 6 | <% for news in @news %> |
|
7 | 7 | <p> |
|
8 | 8 | <b><%= news.title %></b> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)<br /> |
|
9 | 9 | <%= news.shortdescr %><br /> |
|
10 | 10 | [<%= link_to 'Read...', :controller => 'news', :action => 'show', :id => news %>] |
|
11 | 11 | </p> |
|
12 | 12 | <hr /> |
|
13 | 13 | <% end %> |
|
14 | 14 | </div> |
|
15 | 15 | </div> |
|
16 | 16 | |
|
17 | 17 | <div class="splitcontentright"> |
|
18 | 18 | <div class="box"> |
|
19 | <h3>Latest projects</h3> | |
|
19 | <h3><%=_('Latest projects')%></h3> | |
|
20 | 20 | <ul> |
|
21 | 21 | <% for project in @projects %> |
|
22 | 22 | <li> |
|
23 | 23 | <%= link_to project.name, :controller => 'projects', :action => 'show', :id => project %> (added <%= format_time(project.created_on) %>)<br /> |
|
24 | 24 | <%= project.descr %> |
|
25 | 25 | </li> |
|
26 | 26 | <% end %> |
|
27 | 27 | </ul> |
|
28 | 28 | </div> |
|
29 | 29 | |
|
30 | 30 | </div> |
@@ -1,39 +1,69 | |||
|
1 | 1 | # MySQL (default setup). Versions 4.1 and 5.0 are recommended. |
|
2 | 2 | # |
|
3 | 3 | # Get the fast C bindings: |
|
4 | 4 | # gem install mysql |
|
5 | 5 | # (on OS X: gem install mysql -- --include=/usr/local/lib) |
|
6 | 6 | # And be sure to use new-style password hashing: |
|
7 | 7 | # http://dev.mysql.com/doc/refman/5.0/en/old-client.html |
|
8 | ||
|
9 | production: | |
|
10 | adapter: mysql | |
|
11 | database: redmine | |
|
12 | host: localhost | |
|
13 | username: root | |
|
14 | password: | |
|
15 | ||
|
8 | 16 | development: |
|
9 | 17 | adapter: mysql |
|
10 | 18 | database: redmine_development |
|
11 | 19 | host: localhost |
|
12 | 20 | username: root |
|
13 | 21 | password: |
|
14 | 22 | |
|
15 | 23 | development_pgsql: |
|
16 | 24 | adapter: postgresql |
|
17 | 25 | database: redmine |
|
18 | 26 | host: localhost |
|
19 | 27 | username: postgres |
|
20 | 28 | password: "postgres" |
|
21 | 29 | |
|
30 | development_oracle: | |
|
31 | adapter: oci | |
|
32 | host: 192.168.0.14 | |
|
33 | username: rails | |
|
34 | password: "rails" | |
|
35 | ||
|
36 | development_sqlserver: | |
|
37 | adapter: sqlserver | |
|
38 | host: localhost,1157 | |
|
39 | database: redmine | |
|
40 | ||
|
22 | 41 | test: |
|
23 | 42 | adapter: mysql |
|
24 | 43 | database: redmine_test |
|
25 | 44 | host: localhost |
|
26 | 45 | username: root |
|
27 | 46 | password: |
|
28 | 47 | |
|
48 | test_pgsql: | |
|
49 | adapter: postgresql | |
|
50 | database: redmine | |
|
51 | host: localhost | |
|
52 | username: postgres | |
|
53 | password: "postgres" | |
|
54 | ||
|
55 | test_oracle: | |
|
56 | adapter: oci | |
|
57 | host: 192.168.0.14 | |
|
58 | username: rails_test | |
|
59 | password: "rails" | |
|
60 | ||
|
61 | test_sqlserver: | |
|
62 | adapter: sqlserver | |
|
63 | host: localhost,1157 | |
|
64 | database: redmine_test | |
|
65 | ||
|
29 | 66 | demo: |
|
30 | 67 | adapter: sqlite3 |
|
31 | 68 | dbfile: db/redmine_demo.db |
|
32 | 69 | |
|
33 | production: | |
|
34 | adapter: mysql | |
|
35 | database: redmine | |
|
36 | host: localhost | |
|
37 | username: root | |
|
38 | password: | |
|
39 | No newline at end of file |
@@ -1,85 +1,85 | |||
|
1 | 1 | # Be sure to restart your web server when you modify this file. |
|
2 | 2 | |
|
3 | 3 | # Uncomment below to force Rails into production mode when |
|
4 | 4 | # you don't control web/app server and can't set it the proper way |
|
5 | 5 | # ENV['RAILS_ENV'] ||= 'production' |
|
6 | 6 | |
|
7 | 7 | # Bootstrap the Rails environment, frameworks, and default configuration |
|
8 | 8 | require File.join(File.dirname(__FILE__), 'boot') |
|
9 | 9 | |
|
10 | 10 | Rails::Initializer.run do |config| |
|
11 | 11 | # Settings in config/environments/* take precedence those specified here |
|
12 | 12 | |
|
13 | 13 | # Skip frameworks you're not going to use |
|
14 | 14 | # config.frameworks -= [ :action_web_service, :action_mailer ] |
|
15 | 15 | |
|
16 | 16 | # Add additional load paths for your own custom dirs |
|
17 | 17 | # config.load_paths += %W( #{RAILS_ROOT}/extras ) |
|
18 | 18 | |
|
19 | 19 | # Force all environments to use the same logger level |
|
20 | 20 | # (by default production uses :info, the others :debug) |
|
21 | 21 | # config.log_level = :debug |
|
22 | 22 | |
|
23 | 23 | # Use the database for sessions instead of the file system |
|
24 | 24 | # (create the session table with 'rake create_sessions_table') |
|
25 | 25 | # config.action_controller.session_store = :active_record_store |
|
26 | 26 | |
|
27 | 27 | # Enable page/fragment caching by setting a file-based store |
|
28 | 28 | # (remember to create the caching directory and make it readable to the application) |
|
29 | 29 | # config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache" |
|
30 | 30 | |
|
31 | 31 | # Activate observers that should always be running |
|
32 | 32 | # config.active_record.observers = :cacher, :garbage_collector |
|
33 | 33 | |
|
34 | 34 | # Make Active Record use UTC-base instead of local time |
|
35 | 35 | # config.active_record.default_timezone = :utc |
|
36 | 36 | |
|
37 | 37 | # Use Active Record's schema dumper instead of SQL when creating the test database |
|
38 | 38 | # (enables use of different database adapters for development and test environments) |
|
39 | 39 | # config.active_record.schema_format = :ruby |
|
40 | 40 | |
|
41 | 41 | # See Rails::Configuration for more options |
|
42 | 42 | |
|
43 | 43 | # SMTP server configuration |
|
44 | 44 | config.action_mailer.server_settings = { |
|
45 | 45 | :address => "127.0.0.1", |
|
46 | 46 | :port => 25, |
|
47 | 47 | :domain => "somenet.foo", |
|
48 | 48 | :authentication => :login, |
|
49 | 49 | :user_name => "redmine", |
|
50 | 50 | :password => "redmine", |
|
51 | 51 | } |
|
52 | 52 | |
|
53 | 53 | config.action_mailer.perform_deliveries = true |
|
54 | 54 | |
|
55 | 55 | # Tell ActionMailer not to deliver emails to the real world. |
|
56 | 56 | # The :test delivery method accumulates sent emails in the |
|
57 | 57 | # ActionMailer::Base.deliveries array. |
|
58 | 58 | #config.action_mailer.delivery_method = :test |
|
59 | 59 | config.action_mailer.delivery_method = :smtp |
|
60 | 60 | end |
|
61 | 61 | |
|
62 | 62 | # Add new inflection rules using the following format |
|
63 | 63 | # (all these examples are active by default): |
|
64 | 64 | # Inflector.inflections do |inflect| |
|
65 | 65 | # inflect.plural /^(ox)$/i, '\1en' |
|
66 | 66 | # inflect.singular /^(ox)en/i, '\1' |
|
67 | 67 | # inflect.irregular 'person', 'people' |
|
68 | 68 | # inflect.uncountable %w( fish sheep ) |
|
69 | 69 | # end |
|
70 | 70 | |
|
71 | 71 | # Include your application configuration below |
|
72 | 72 | |
|
73 | 73 | # application name |
|
74 | 74 | RDM_APP_NAME = "redMine" |
|
75 | 75 | # application version |
|
76 |
RDM_APP_VERSION = "0. |
|
|
76 | RDM_APP_VERSION = "0.2.0" | |
|
77 | 77 | # application host name |
|
78 | 78 | RDM_HOST_NAME = "somenet.foo" |
|
79 | 79 | # file storage path |
|
80 | 80 | RDM_STORAGE_PATH = "#{RAILS_ROOT}/files" |
|
81 | 81 | # if RDM_LOGIN_REQUIRED is set to true, login is required to access the application |
|
82 | 82 | RDM_LOGIN_REQUIRED = false |
|
83 | 83 | # default langage |
|
84 | 84 | RDM_DEFAULT_LANG = 'en' |
|
85 | 85 |
@@ -1,21 +1,62 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | # available languages for help pages | |
|
19 | langs: | |
|
20 | - fr | |
|
21 | ||
|
22 | # mapping between controller/action and help pages | |
|
23 | # if action is not defined here, 'index' page will be displayed | |
|
24 | pages: | |
|
1 | 25 | # administration |
|
2 | 26 | admin: |
|
3 | index: administration.html | |
|
4 | mail_options: administration.html#mail_notifications | |
|
5 | info: administration.html#app_info | |
|
27 | index: ch01.html | |
|
28 | mail_options: ch01s08.html | |
|
29 | info: ch01s09.html | |
|
6 | 30 | users: |
|
7 | index: administration.html#users | |
|
31 | index: ch01s01.html | |
|
8 | 32 | roles: |
|
9 | index: administration.html#roles | |
|
10 | workflow: administration.html#workflow | |
|
33 | index: ch01s02.html | |
|
34 | workflow: ch01s06.html | |
|
11 | 35 | trackers: |
|
12 | index: administration.html#trackers | |
|
36 | index: ch01s03.html | |
|
13 | 37 | issue_statuses: |
|
14 | index: administration.html#issue_statuses | |
|
15 | ||
|
38 | index: ch01s05.html | |
|
16 | 39 | # projects |
|
17 | 40 | projects: |
|
18 | add: projects.html#settings | |
|
19 | ||
|
20 | ||
|
21 | # issues No newline at end of file | |
|
41 | index: ch02.html | |
|
42 | add: ch02s08.html | |
|
43 | show: ch02s01.html | |
|
44 | add_document: ch02s06.html | |
|
45 | list_documents: ch02s06.html | |
|
46 | add_issue: ch02s02.html | |
|
47 | list_issues: ch02s02.html | |
|
48 | add_news: ch02s05.html | |
|
49 | list_news: ch02s05.html | |
|
50 | add_file: ch02s07.html | |
|
51 | list_files: ch02s07.html | |
|
52 | changelog: ch02s04.html | |
|
53 | issues: | |
|
54 | index: ch02s02.html | |
|
55 | documents: | |
|
56 | index: ch02s06.html | |
|
57 | news: | |
|
58 | index: ch02s05.html | |
|
59 | versions: | |
|
60 | index: ch02s08.html | |
|
61 | reports: | |
|
62 | index: ch02s03.html No newline at end of file |
@@ -1,254 +1,275 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
1 | 18 | class Setup < ActiveRecord::Migration |
|
2 | 19 | def self.up |
|
3 | 20 | create_table "attachments", :force => true do |t| |
|
4 | 21 | t.column "container_id", :integer, :default => 0, :null => false |
|
5 | 22 | t.column "container_type", :string, :limit => 30, :default => "", :null => false |
|
6 | 23 | t.column "filename", :string, :default => "", :null => false |
|
7 | 24 | t.column "disk_filename", :string, :default => "", :null => false |
|
8 | t.column "size", :integer, :default => 0, :null => false | |
|
9 |
t.column "content_type", :string, :limit => 60, :default => "" |
|
|
25 | t.column "filesize", :integer, :default => 0, :null => false | |
|
26 | t.column "content_type", :string, :limit => 60, :default => "" | |
|
10 | 27 | t.column "digest", :string, :limit => 40, :default => "", :null => false |
|
11 | 28 | t.column "downloads", :integer, :default => 0, :null => false |
|
12 | 29 | t.column "author_id", :integer, :default => 0, :null => false |
|
13 | 30 | t.column "created_on", :timestamp |
|
14 | 31 | end |
|
15 | 32 | |
|
16 | 33 | create_table "custom_fields", :force => true do |t| |
|
17 | 34 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
18 | 35 | t.column "typ", :integer, :default => 0, :null => false |
|
19 | 36 | t.column "is_required", :boolean, :default => false, :null => false |
|
20 | 37 | t.column "is_for_all", :boolean, :default => false, :null => false |
|
21 |
t.column "possible_values", :text, :default => "" |
|
|
22 |
t.column "regexp", :string, :default => "" |
|
|
38 | t.column "possible_values", :text, :default => "" | |
|
39 | t.column "regexp", :string, :default => "" | |
|
23 | 40 | t.column "min_length", :integer, :default => 0, :null => false |
|
24 | 41 | t.column "max_length", :integer, :default => 0, :null => false |
|
25 | 42 | end |
|
26 | 43 | |
|
27 | 44 | create_table "custom_fields_projects", :id => false, :force => true do |t| |
|
28 | 45 | t.column "custom_field_id", :integer, :default => 0, :null => false |
|
29 | 46 | t.column "project_id", :integer, :default => 0, :null => false |
|
30 | 47 | end |
|
31 | 48 | |
|
32 | 49 | create_table "custom_values", :force => true do |t| |
|
33 | 50 | t.column "issue_id", :integer, :default => 0, :null => false |
|
34 | 51 | t.column "custom_field_id", :integer, :default => 0, :null => false |
|
35 | 52 | t.column "value", :text, :default => "", :null => false |
|
36 | 53 | end |
|
37 | 54 | |
|
38 | 55 | add_index "custom_values", ["issue_id"], :name => "custom_values_issue_id" |
|
39 | 56 | |
|
40 | 57 | create_table "documents", :force => true do |t| |
|
41 | 58 | t.column "project_id", :integer, :default => 0, :null => false |
|
42 | 59 | t.column "category_id", :integer, :default => 0, :null => false |
|
43 | 60 | t.column "title", :string, :limit => 60, :default => "", :null => false |
|
44 | 61 | t.column "descr", :text, :default => "", :null => false |
|
45 | 62 | t.column "created_on", :timestamp |
|
46 | 63 | end |
|
47 | 64 | |
|
48 | 65 | create_table "enumerations", :force => true do |t| |
|
49 | 66 | t.column "opt", :string, :limit => 4, :default => "", :null => false |
|
50 | 67 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
51 | 68 | end |
|
52 | 69 | |
|
53 | 70 | create_table "issue_categories", :force => true do |t| |
|
54 | 71 | t.column "project_id", :integer, :default => 0, :null => false |
|
55 | 72 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
56 | 73 | end |
|
57 | 74 | |
|
58 | 75 | create_table "issue_histories", :force => true do |t| |
|
59 | 76 | t.column "issue_id", :integer, :default => 0, :null => false |
|
60 | 77 | t.column "status_id", :integer, :default => 0, :null => false |
|
61 | 78 | t.column "author_id", :integer, :default => 0, :null => false |
|
62 |
t.column "notes", :text, :default => "" |
|
|
79 | t.column "notes", :text, :default => "" | |
|
63 | 80 | t.column "created_on", :timestamp |
|
64 | 81 | end |
|
65 | 82 | |
|
66 | 83 | add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" |
|
67 | 84 | |
|
68 | 85 | create_table "issue_statuses", :force => true do |t| |
|
69 | 86 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
70 | 87 | t.column "is_closed", :boolean, :default => false, :null => false |
|
71 | 88 | t.column "is_default", :boolean, :default => false, :null => false |
|
72 | 89 | t.column "html_color", :string, :limit => 6, :default => "FFFFFF", :null => false |
|
73 | 90 | end |
|
74 | 91 | |
|
75 | 92 | create_table "issues", :force => true do |t| |
|
76 | 93 | t.column "tracker_id", :integer, :default => 0, :null => false |
|
77 | 94 | t.column "project_id", :integer, :default => 0, :null => false |
|
78 | 95 | t.column "subject", :string, :default => "", :null => false |
|
79 | 96 | t.column "descr", :text, :default => "", :null => false |
|
80 | 97 | t.column "category_id", :integer |
|
81 | 98 | t.column "status_id", :integer, :default => 0, :null => false |
|
82 | 99 | t.column "assigned_to_id", :integer |
|
83 | 100 | t.column "priority_id", :integer, :default => 0, :null => false |
|
84 | 101 | t.column "fixed_version_id", :integer |
|
85 | 102 | t.column "author_id", :integer, :default => 0, :null => false |
|
86 | 103 | t.column "created_on", :timestamp |
|
87 | 104 | t.column "updated_on", :timestamp |
|
88 | 105 | end |
|
89 | 106 | |
|
90 | 107 | add_index "issues", ["project_id"], :name => "issues_project_id" |
|
91 | 108 | |
|
92 | 109 | create_table "members", :force => true do |t| |
|
93 | 110 | t.column "user_id", :integer, :default => 0, :null => false |
|
94 | 111 | t.column "project_id", :integer, :default => 0, :null => false |
|
95 | 112 | t.column "role_id", :integer, :default => 0, :null => false |
|
96 | 113 | t.column "created_on", :timestamp |
|
97 | 114 | end |
|
98 | 115 | |
|
99 | 116 | create_table "news", :force => true do |t| |
|
100 | 117 | t.column "project_id", :integer |
|
101 | 118 | t.column "title", :string, :limit => 60, :default => "", :null => false |
|
102 |
t.column "shortdescr", :string, :default => "" |
|
|
119 | t.column "shortdescr", :string, :default => "" | |
|
103 | 120 | t.column "descr", :text, :default => "", :null => false |
|
104 | 121 | t.column "author_id", :integer, :default => 0, :null => false |
|
105 | 122 | t.column "created_on", :timestamp |
|
106 | 123 | end |
|
107 | 124 | |
|
108 | 125 | create_table "permissions", :force => true do |t| |
|
109 | 126 | t.column "controller", :string, :limit => 30, :default => "", :null => false |
|
110 | 127 | t.column "action", :string, :limit => 30, :default => "", :null => false |
|
111 | 128 | t.column "descr", :string, :limit => 60, :default => "", :null => false |
|
112 | t.column "public", :boolean, :default => false, :null => false | |
|
129 | t.column "is_public", :boolean, :default => false, :null => false | |
|
113 | 130 | t.column "sort", :integer, :default => 0, :null => false |
|
114 | 131 | t.column "mail_option", :boolean, :default => false, :null => false |
|
115 | 132 | t.column "mail_enabled", :boolean, :default => false, :null => false |
|
116 | 133 | end |
|
117 | 134 | |
|
118 | 135 | create_table "permissions_roles", :id => false, :force => true do |t| |
|
119 | 136 | t.column "permission_id", :integer, :default => 0, :null => false |
|
120 | 137 | t.column "role_id", :integer, :default => 0, :null => false |
|
121 | 138 | end |
|
122 | 139 | |
|
123 | 140 | add_index "permissions_roles", ["role_id"], :name => "permissions_roles_role_id" |
|
124 | 141 | |
|
125 | 142 | create_table "projects", :force => true do |t| |
|
126 | 143 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
127 | 144 | t.column "descr", :string, :default => "", :null => false |
|
128 |
t.column "homepage", :string, :limit => 60, :default => "" |
|
|
129 | t.column "public", :boolean, :default => true, :null => false | |
|
145 | t.column "homepage", :string, :limit => 60, :default => "" | |
|
146 | t.column "is_public", :boolean, :default => true, :null => false | |
|
147 | t.column "parent_id", :integer | |
|
148 | t.column "projects_count", :integer, :default => 0 | |
|
130 | 149 | t.column "created_on", :timestamp |
|
131 | 150 | t.column "updated_on", :timestamp |
|
132 | 151 | end |
|
133 | 152 | |
|
134 | 153 | create_table "roles", :force => true do |t| |
|
135 | 154 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
136 | 155 | end |
|
137 | 156 | |
|
138 | 157 | create_table "trackers", :force => true do |t| |
|
139 | 158 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
140 | 159 | t.column "is_in_chlog", :boolean, :default => false, :null => false |
|
141 | 160 | end |
|
142 | 161 | |
|
143 | 162 | create_table "users", :force => true do |t| |
|
144 | 163 | t.column "login", :string, :limit => 30, :default => "", :null => false |
|
145 | 164 | t.column "hashed_password", :string, :limit => 40, :default => "", :null => false |
|
146 | 165 | t.column "firstname", :string, :limit => 30, :default => "", :null => false |
|
147 | 166 | t.column "lastname", :string, :limit => 30, :default => "", :null => false |
|
148 | 167 | t.column "mail", :string, :limit => 60, :default => "", :null => false |
|
149 | 168 | t.column "mail_notification", :boolean, :default => true, :null => false |
|
150 | 169 | t.column "admin", :boolean, :default => false, :null => false |
|
151 | 170 | t.column "locked", :boolean, :default => false, :null => false |
|
152 | 171 | t.column "last_login_on", :datetime |
|
153 | 172 | t.column "language", :string, :limit => 2, :default => "", :null => false |
|
154 | 173 | t.column "created_on", :timestamp |
|
155 | 174 | t.column "updated_on", :timestamp |
|
156 | 175 | end |
|
157 | 176 | |
|
158 | 177 | create_table "versions", :force => true do |t| |
|
159 | 178 | t.column "project_id", :integer, :default => 0, :null => false |
|
160 | 179 | t.column "name", :string, :limit => 30, :default => "", :null => false |
|
161 |
t.column "descr", :string, :default => "" |
|
|
162 | t.column "date", :date, :null => false | |
|
180 | t.column "descr", :string, :default => "" | |
|
181 | t.column "effective_date", :date, :null => false | |
|
163 | 182 | t.column "created_on", :timestamp |
|
164 | 183 | t.column "updated_on", :timestamp |
|
165 | 184 | end |
|
166 | 185 | |
|
167 | 186 | create_table "workflows", :force => true do |t| |
|
168 | 187 | t.column "tracker_id", :integer, :default => 0, :null => false |
|
169 | 188 | t.column "old_status_id", :integer, :default => 0, :null => false |
|
170 | 189 | t.column "new_status_id", :integer, :default => 0, :null => false |
|
171 | 190 | t.column "role_id", :integer, :default => 0, :null => false |
|
172 | 191 | end |
|
173 | 192 | |
|
174 | 193 | # project |
|
175 | Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :public => true | |
|
176 | Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :public => true | |
|
177 | Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :public => true | |
|
194 | Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :is_public => true | |
|
195 | Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :is_public => true | |
|
196 | Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :is_public => true | |
|
178 | 197 | Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150 |
|
179 | 198 | Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151 |
|
180 | 199 | # members |
|
181 | Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :public => true | |
|
200 | Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :is_public => true | |
|
182 | 201 | Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220 |
|
183 | 202 | Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221 |
|
184 | 203 | Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222 |
|
185 | 204 | # versions |
|
186 | 205 | Permission.create :controller => "projects", :action => "add_version", :descr => "New version", :sort => 320 |
|
187 | 206 | Permission.create :controller => "versions", :action => "edit", :descr => "Edit", :sort => 321 |
|
188 | 207 | Permission.create :controller => "versions", :action => "destroy", :descr => "Delete", :sort => 322 |
|
189 | 208 | # issue categories |
|
190 | 209 | Permission.create :controller => "projects", :action => "add_issue_category", :descr => "New issue category", :sort => 420 |
|
191 | 210 | Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421 |
|
192 | 211 | Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422 |
|
193 | 212 | # issues |
|
194 | Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :public => true | |
|
195 | Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :public => true | |
|
196 | Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :public => true | |
|
213 | Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :is_public => true | |
|
214 | Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :is_public => true | |
|
215 | Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :is_public => true | |
|
197 | 216 | Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1 |
|
198 | 217 | Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055 |
|
199 | 218 | Permission.create :controller => "issues", :action => "change_status", :descr => "Change status", :sort => 1060, :mail_option => 1, :mail_enabled => 1 |
|
200 | 219 | Permission.create :controller => "issues", :action => "destroy", :descr => "Delete", :sort => 1065 |
|
201 | 220 | Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070 |
|
202 | 221 | Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075 |
|
203 | 222 | # news |
|
204 | Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :public => true | |
|
205 | Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :public => true | |
|
223 | Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :is_public => true | |
|
224 | Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :is_public => true | |
|
206 | 225 | Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120 |
|
207 | 226 | Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121 |
|
208 | 227 | Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122 |
|
209 | 228 | # documents |
|
210 | Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :public => true | |
|
211 | Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :public => true | |
|
212 | Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :public => true | |
|
229 | Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :is_public => true | |
|
230 | Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :is_public => true | |
|
231 | Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :is_public => true | |
|
213 | 232 | Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220 |
|
214 | 233 | Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221 |
|
215 | 234 | Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222 |
|
216 | 235 | Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223 |
|
217 | 236 | Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224 |
|
218 | 237 | # files |
|
219 | Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :public => true | |
|
220 | Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :public => true | |
|
238 | Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :is_public => true | |
|
239 | Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :is_public => true | |
|
221 | 240 | Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320 |
|
222 | 241 | Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322 |
|
223 | 242 | |
|
224 | 243 | # create default administrator account |
|
225 |
user = User.create |
|
|
244 | user = User.create :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en" | |
|
245 | user.login = "admin" | |
|
246 | user.password = "admin" | |
|
226 | 247 | user.admin = true |
|
227 | 248 | user.save |
|
228 | 249 | |
|
229 | 250 | |
|
230 | 251 | end |
|
231 | 252 | |
|
232 | 253 | def self.down |
|
233 | 254 | drop_table :attachments |
|
234 | 255 | drop_table :custom_fields |
|
235 | 256 | drop_table :custom_fields_projects |
|
236 | 257 | drop_table :custom_values |
|
237 | 258 | drop_table :documents |
|
238 | 259 | drop_table :enumerations |
|
239 | 260 | drop_table :issue_categories |
|
240 | 261 | drop_table :issue_histories |
|
241 | 262 | drop_table :issue_statuses |
|
242 | 263 | drop_table :issues |
|
243 | 264 | drop_table :members |
|
244 | 265 | drop_table :news |
|
245 | 266 | drop_table :permissions |
|
246 | 267 | drop_table :permissions_roles |
|
247 | 268 | drop_table :projects |
|
248 | 269 | drop_table :roles |
|
249 | 270 | drop_table :trackers |
|
250 | 271 | drop_table :users |
|
251 | 272 | drop_table :versions |
|
252 | 273 | drop_table :workflows |
|
253 | 274 | end |
|
254 | 275 | end |
@@ -1,44 +1,61 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
1 | 18 | class DefaultConfiguration < ActiveRecord::Migration |
|
2 | 19 | def self.up |
|
3 | 20 | # roles |
|
4 | 21 | r = Role.create(:name => "Manager") |
|
5 | 22 | r.permissions = Permission.find(:all) |
|
6 | 23 | r = Role.create :name => "Developer" |
|
7 | r.permissions = Permission.find([1, 2, 3, 6, 10, 11, 12, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]) | |
|
24 | r.permissions = Permission.find(:all) | |
|
8 | 25 | r = Role.create :name => "Reporter" |
|
9 | r.permissions = Permission.find([1, 2, 3, 6, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 38, 39]) | |
|
26 | r.permissions = Permission.find(:all) | |
|
10 | 27 | # trackers |
|
11 | 28 | Tracker.create(:name => "Bug", :is_in_chlog => true) |
|
12 | 29 | Tracker.create(:name => "Feature request", :is_in_chlog => true) |
|
13 | 30 | Tracker.create(:name => "Support request", :is_in_chlog => false) |
|
14 | 31 | # issue statuses |
|
15 | 32 | IssueStatus.create(:name => "New", :is_closed => false, :is_default => true, :html_color => 'F98787') |
|
16 | 33 | IssueStatus.create(:name => "Assigned", :is_closed => false, :is_default => false, :html_color => 'C0C0FF') |
|
17 | 34 | IssueStatus.create(:name => "Resolved", :is_closed => false, :is_default => false, :html_color => '88E0B3') |
|
18 | 35 | IssueStatus.create(:name => "Feedback", :is_closed => false, :is_default => false, :html_color => 'F3A4F4') |
|
19 | 36 | IssueStatus.create(:name => "Closed", :is_closed => true, :is_default => false, :html_color => 'DBDBDB') |
|
20 | 37 | IssueStatus.create(:name => "Rejected", :is_closed => true, :is_default => false, :html_color => 'F5C28B') |
|
21 | 38 | # workflow |
|
22 | 39 | Tracker.find(:all).each { |t| |
|
23 | 40 | Role.find(:all).each { |r| |
|
24 | 41 | IssueStatus.find(:all).each { |os| |
|
25 | 42 | IssueStatus.find(:all).each { |ns| |
|
26 | 43 | Workflow.create(:tracker_id => t.id, :role_id => r.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns |
|
27 | 44 | } |
|
28 | 45 | } |
|
29 | 46 | } |
|
30 | 47 | } |
|
31 | 48 | # enumeartions |
|
32 | 49 | Enumeration.create(:opt => "DCAT", :name => 'Uncategorized') |
|
33 | 50 | Enumeration.create(:opt => "DCAT", :name => 'User documentation') |
|
34 | 51 | Enumeration.create(:opt => "DCAT", :name => 'Technical documentation') |
|
35 | 52 | Enumeration.create(:opt => "IPRI", :name => 'Low') |
|
36 | 53 | Enumeration.create(:opt => "IPRI", :name => 'Normal') |
|
37 | 54 | Enumeration.create(:opt => "IPRI", :name => 'High') |
|
38 | 55 | Enumeration.create(:opt => "IPRI", :name => 'Urgent') |
|
39 | 56 | Enumeration.create(:opt => "IPRI", :name => 'Immediate') |
|
40 | 57 | end |
|
41 | 58 | |
|
42 | 59 | def self.down |
|
43 | 60 | end |
|
44 | 61 | end |
@@ -1,25 +1,34 | |||
|
1 | 1 | == redMine changelog |
|
2 | 2 | |
|
3 | 3 | redMine - project management software |
|
4 | 4 | Copyright (C) 2006 Jean-Philippe Lang |
|
5 |
http://redmine. |
|
|
5 | http://redmine.org/ | |
|
6 | 6 | |
|
7 | 7 | |
|
8 | == xx/xx/2006 | |
|
8 | == 07/09/2006 - v0.2.0 | |
|
9 | 9 | |
|
10 | * More filter options in issues list | |
|
11 | * Issues list exportable to CSV | |
|
10 | * new databases supported: Oracle, PostgreSQL, SQL Server | |
|
11 | * projects/subprojects hierarchy (1 level of subprojects only) | |
|
12 | * environment information display in admin/info | |
|
13 | * more filter options in issues list (rev6) | |
|
14 | * default language based on browser settings (Accept-Language HTTP header) | |
|
15 | * issues list exportable to CSV (rev6) | |
|
16 | * simple_format and auto_link on long text fields | |
|
17 | * more data validations | |
|
18 | * Fixed: error when all mail notifications are unchecked in admin/mail_options | |
|
19 | * Fixed: all project news are displayed on project summary | |
|
20 | * Fixed: Can't change user password in users/edit | |
|
12 | 21 | * Fixed: Error on tables creation with PostgreSQL (rev5) |
|
13 | 22 | * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5) |
|
14 | 23 | |
|
15 | 24 | |
|
16 | 25 | == 06/25/2006 - v0.1.0 |
|
17 | 26 | |
|
18 | 27 | * multiple users/multiple projects |
|
19 | 28 | * role based access control |
|
20 | 29 | * issue tracking system |
|
21 | 30 | * fully customizable workflow |
|
22 | 31 | * documents/files repository |
|
23 | 32 | * email notifications on issue creation and update |
|
24 | 33 | * multilanguage support (except for error messages):english, french, spanish |
|
25 | 34 | * online manual in french (unfinished) No newline at end of file |
@@ -1,61 +1,69 | |||
|
1 | 1 | == redMine installation |
|
2 | 2 | |
|
3 | 3 | redMine - project management software |
|
4 | 4 | Copyright (C) 2006 Jean-Philippe Lang |
|
5 |
http://redmine. |
|
|
5 | http://redmine.org/ | |
|
6 | 6 | |
|
7 | 7 | |
|
8 | 8 | == Requirements |
|
9 | 9 | |
|
10 | 10 | * Ruby on Rails 1.1 |
|
11 | * Any database supported by Rails (developped using MySQL 5) | |
|
11 | * a database (see compatibility below) | |
|
12 | 12 | * (recommended) Apache/Lighttpd with FCGI support |
|
13 | 13 | |
|
14 | Supported databases: | |
|
15 | ||
|
16 | * MySQL (tested with MySQL 5) | |
|
17 | * PostgreSQL (tested with PostgreSQL 8.1) | |
|
18 | * Oracle (tested with Oracle 10g) | |
|
19 | * SQL Server (tested with SQL Server 2005) | |
|
20 | * SQLite (tested with SQLite 3) | |
|
21 | ||
|
14 | 22 | |
|
15 | 23 | == Installation |
|
16 | 24 | |
|
17 | 25 | 1. Uncompress program archive: |
|
18 | 26 | tar zxvf <filename> |
|
19 | 27 | |
|
20 | 28 | 2. Create an empty database: "redmine" for example |
|
21 | 29 | |
|
22 | 30 | 3. Configure database parameters in config/database.yml |
|
23 | for "production" environment | |
|
31 | for "production" environment (default database is MySQL) | |
|
24 | 32 | |
|
25 | 4. Create database structure. Under application main directory: | |
|
33 | 4. Create the database structure. Under application main directory: | |
|
26 | 34 | rake migrate RAILS_ENV="production" |
|
27 | 35 | It will create tables and default configuration data |
|
28 | 36 | |
|
29 | 37 | 5. Test the installation by running WEBrick web server: |
|
30 | 38 | ruby script/server -e production |
|
31 | 39 | |
|
32 | 40 | Once WEBrick has started, point your browser to http://localhost:3000/ |
|
33 | 41 | You should now see the application welcome page |
|
34 | 42 | |
|
35 | 43 | 6. Use default administrator account to log in: |
|
36 | 44 | login: admin |
|
37 | 45 | password: admin |
|
38 | 46 | |
|
39 | 47 | 7. Setup Apache or Lighttpd with fastcgi for best performance. |
|
40 | 48 | |
|
41 | 49 | |
|
42 | 50 | == Configuration |
|
43 | 51 | |
|
44 | 52 | You can setup a few things in config/environment.rb: |
|
45 | 53 | Don't forget to restart the application after any change. |
|
46 | 54 | |
|
47 | 55 | |
|
48 | 56 | config.action_mailer.server_settings: SMTP server configuration |
|
49 | 57 | config.action_mailer.perform_deliveries: set to false to disable mail delivering |
|
50 | 58 | |
|
51 | 59 | RDM_HOST_NAME: hostname used to provide urls in notification mails |
|
52 | 60 | |
|
53 | 61 | RDM_STORAGE_PATH: path for all attachments storage (default: "#{RAILS_ROOT}/files") |
|
54 | 62 | "#{RAILS_ROOT}/" represents application main directory |
|
55 | 63 | |
|
56 | 64 | RDM_LOGIN_REQUIRED: set to true if you want to force users to login to access |
|
57 | 65 | any part of the application (default: false) |
|
58 | 66 | |
|
59 | 67 | RDM_DEFAULT_LANG: default language for anonymous users: 'en' (default), 'es', 'fr' available |
|
60 | 68 | |
|
61 | 69 |
@@ -1,49 +1,55 | |||
|
1 | 1 | == redMine |
|
2 | 2 | |
|
3 | 3 | redMine - project management software |
|
4 | 4 | Copyright (C) 2006 Jean-Philippe Lang |
|
5 |
http://redmine. |
|
|
5 | http://redmine.org/ | |
|
6 | 6 | |
|
7 | 7 | == License |
|
8 | 8 | |
|
9 | 9 | This program is free software; you can redistribute it and/or |
|
10 | 10 | modify it under the terms of the GNU General Public License |
|
11 | 11 | as published by the Free Software Foundation; either version 2 |
|
12 | 12 | of the License, or (at your option) any later version. |
|
13 | 13 | |
|
14 | 14 | This program is distributed in the hope that it will be useful, |
|
15 | 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 | 17 | GNU General Public License for more details. |
|
18 | 18 | |
|
19 | 19 | You should have received a copy of the GNU General Public License |
|
20 | 20 | along with this program; if not, write to the Free Software |
|
21 | 21 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
22 | 22 | |
|
23 | 23 | |
|
24 | 24 | == Main features |
|
25 | 25 | |
|
26 | 26 | redMine is a project management software written using Ruby on Rails. |
|
27 | 27 | |
|
28 | 28 | * multiple users/projects |
|
29 | 29 | * fully customizable role based access control |
|
30 | 30 | * issue tracking system |
|
31 | 31 | * fully customizable workflow |
|
32 | 32 | * documents/files repository |
|
33 | 33 | * email notifications |
|
34 | 34 | * multilanguage support |
|
35 | 35 | |
|
36 | 36 | |
|
37 | == User documentation | |
|
38 | ||
|
39 | User documentation for redMine is written using DocBook XML format. | |
|
40 | It's also avaible as HTML files in /public/manual (contextual help) | |
|
41 | ||
|
42 | ||
|
37 | 43 | == Versioning |
|
38 | 44 | |
|
39 | 45 | redMine versioning scheme is major.minor.revision |
|
40 | 46 | Versions before 1.0.0 must be considered as beta versions and upgrading support |
|
41 | 47 | may not be provided for these versions. |
|
42 | 48 | |
|
43 | 49 | |
|
44 | 50 | == Credits |
|
45 | 51 | |
|
46 | 52 | * Jean-Francois Boutier (spanish translation) |
|
47 | 53 | * Andreas Viklund (open source XHTML layout, http://andreasviklund.com/) |
|
48 | 54 | |
|
49 | 55 |
@@ -1,316 +1,324 | |||
|
1 | 1 | Localization.define('fr', 'Français') do |l| |
|
2 | 2 | |
|
3 | 3 | # trackers |
|
4 | 4 | l.store 'Bug', 'Anomalie' |
|
5 | 5 | l.store 'Feature request', 'Evolution' |
|
6 | 6 | l.store 'Support request', 'Assistance' |
|
7 | 7 | # issue statuses |
|
8 | 8 | l.store 'New', 'Nouveau' |
|
9 | 9 | l.store 'Assigned', 'Assignée' |
|
10 | 10 | l.store 'Resolved', 'Résolue' |
|
11 | 11 | l.store 'Closed', 'Fermée' |
|
12 | 12 | l.store 'Rejected', 'Rejetée' |
|
13 | 13 |
l.store 'Feedback', 'Commentaire' |
|
14 | # filters | |
|
15 | l.store '[All]', '[Tous]' | |
|
16 | l.store '[Open]', '[Ouvert]' | |
|
17 | l.store '[None]', '[Aucun]' | |
|
14 | 18 | |
|
15 | 19 | # issue priorities |
|
16 | 20 | l.store 'Issue priorities', 'Priorités des demandes' |
|
17 | 21 | l.store 'Low', 'Bas' |
|
18 | 22 | l.store 'Normal', 'Normal' |
|
19 | 23 | l.store 'High', 'Haut' |
|
20 | 24 | l.store 'Urgent', 'Urgent' |
|
21 | 25 | l.store 'Immediate', 'Immédiat' |
|
22 | 26 | # document categories |
|
23 | 27 | l.store 'Document categories', 'Catégories de documents' |
|
24 | 28 | l.store 'Uncategorized', 'Sans catégorie' |
|
25 | 29 | l.store 'User documentation', 'Documentation utilisateur' |
|
26 | 30 | l.store 'Technical documentation', 'Documentation technique' |
|
27 | 31 | # dates |
|
28 | 32 | l.store '(date)', lambda { |t| t.strftime('%d/%m/%Y') } |
|
29 | 33 | l.store '(time)', lambda { |t| t.strftime('%d/%m/%Y %H:%M') } |
|
30 | 34 | |
|
31 | 35 | # ./script/../config/../app/views/account/login.rhtml |
|
32 | 36 | |
|
33 | 37 | # ./script/../config/../app/views/account/my_account.rhtml |
|
34 | 38 | l.store 'My account', 'Mon compte' |
|
35 | 39 | l.store 'Login', 'Identifiant' |
|
36 | 40 | l.store 'Created on', 'Crée le' |
|
37 | 41 | l.store 'Last update', 'Mis à jour' |
|
38 | 42 | l.store 'Information', 'Informations' |
|
39 | 43 | l.store 'Firstname', 'Prénom' |
|
40 | 44 | l.store 'Lastname', 'Nom' |
|
41 | 45 | l.store 'Mail', 'Mail' |
|
42 | 46 | l.store 'Language', 'Langue' |
|
43 | 47 | l.store 'Mail notifications', 'Notifications par mail' |
|
44 | 48 | l.store 'Save', 'Valider' |
|
45 | 49 | l.store 'Password', 'Mot de passe' |
|
46 | 50 | l.store 'New password', 'Nouveau mot de passe' |
|
47 | 51 | l.store 'Confirmation', 'Confirmation' |
|
48 | 52 | |
|
49 | 53 | # ./script/../config/../app/views/account/my_page.rhtml |
|
50 | 54 | l.store 'My page', 'Ma page' |
|
51 | 55 | l.store 'Welcome', 'Bienvenue' |
|
52 | 56 | l.store 'Last login', 'Dernière connexion' |
|
53 | 57 | l.store 'Reported issues', 'Demandes soumises' |
|
54 | 58 | l.store 'Assigned to me', 'Demandes qui me sont assignées' |
|
55 | 59 | |
|
60 | # ./script/../config/../app/views/account/login.rhtml | |
|
61 | l.store 'Please login', 'Identification' | |
|
62 | ||
|
56 | 63 | # ./script/../config/../app/views/account/show.rhtml |
|
57 | 64 | l.store 'Registered on', 'Inscrit le' |
|
58 | 65 | l.store 'Projects', 'Projets' |
|
59 | 66 | l.store 'Activity', 'Activité' |
|
60 | 67 | |
|
61 | 68 | # ./script/../config/../app/views/admin/index.rhtml |
|
62 | 69 | l.store 'Administration', 'Administration' |
|
63 | 70 | l.store 'Users', 'Utilisateurs' |
|
64 | 71 | l.store 'Roles and permissions', 'Rôles et permissions' |
|
65 | 72 | l.store 'Trackers', 'Trackers' |
|
66 | 73 | l.store 'Custom fields', 'Champs personnalisés' |
|
67 | 74 | l.store 'Issue Statuses', 'Statuts des demandes' |
|
68 | 75 | l.store 'Workflow', 'Workflow' |
|
69 | 76 | l.store 'Enumerations', 'Listes de valeurs' |
|
70 | 77 | |
|
71 | 78 | # ./script/../config/../app/views/admin/info.rhtml |
|
72 | 79 | l.store 'Version', 'Version' |
|
73 | 80 | l.store 'Database', 'Base de données' |
|
74 | 81 | |
|
75 | 82 | # ./script/../config/../app/views/admin/mail_options.rhtml |
|
76 | 83 | l.store 'Select actions for which mail notification should be enabled.', 'Sélectionner les actions pour lesquelles la notification par mail doit être activée.' |
|
77 | 84 | l.store 'Check all', 'Cocher tout' |
|
78 | 85 | l.store 'Uncheck all', 'Décocher tout' |
|
79 | 86 | |
|
80 | 87 | # ./script/../config/../app/views/admin/projects.rhtml |
|
81 | 88 | l.store 'Project', 'Projet' |
|
82 | 89 | l.store 'Description', 'Description' |
|
83 | 90 | l.store 'Public', 'Public' |
|
84 | 91 | l.store 'Delete', 'Supprimer' |
|
85 | 92 | l.store 'Previous', 'Précédent' |
|
86 | 93 | l.store 'Next', 'Suivant' |
|
87 | 94 | |
|
88 | 95 | # ./script/../config/../app/views/custom_fields/edit.rhtml |
|
89 | 96 | l.store 'Custom field', 'Champ personnalisé' |
|
90 | 97 | |
|
91 | 98 | # ./script/../config/../app/views/custom_fields/list.rhtml |
|
92 | 99 | l.store 'Name', 'Nom' |
|
93 | 100 | l.store 'Type', 'Type' |
|
94 | 101 | l.store 'Required', 'Obligatoire' |
|
95 | 102 | l.store 'For all projects', 'Pour tous les projets' |
|
96 | 103 | l.store 'Used by', 'Utilisé par' |
|
97 | 104 | |
|
98 | 105 | # ./script/../config/../app/views/custom_fields/new.rhtml |
|
99 | 106 | l.store 'New custom field', 'Nouveau champ personnalisé' |
|
100 | 107 | l.store 'Create', 'Créer' |
|
101 | 108 | |
|
102 | 109 | # ./script/../config/../app/views/custom_fields/_form.rhtml |
|
103 | 110 | l.store '0 means no restriction', '0 pour aucune restriction' |
|
104 | 111 | l.store 'Regular expression pattern', 'Expression régulière' |
|
105 | 112 | l.store 'Possible values', 'Valeurs possibles' |
|
106 | 113 | |
|
107 | 114 | # ./script/../config/../app/views/documents/edit.rhtml |
|
108 | 115 | l.store 'Document', 'Document' |
|
109 | 116 | |
|
110 | 117 | # ./script/../config/../app/views/documents/show.rhtml |
|
111 | 118 | l.store 'Category', 'Catégorie' |
|
112 | 119 | l.store 'Edit', 'Modifier' |
|
113 | 120 | l.store 'download', 'téléchargement' |
|
114 | 121 | l.store 'Add file', 'Ajouter le fichier' |
|
115 | 122 | l.store 'Add', 'Ajouter' |
|
116 | 123 | |
|
117 | 124 | # ./script/../config/../app/views/documents/_form.rhtml |
|
118 | 125 | l.store 'Title', 'Titre' |
|
119 | 126 | |
|
120 | 127 | # ./script/../config/../app/views/enumerations/edit.rhtml |
|
121 | 128 | |
|
122 | 129 | # ./script/../config/../app/views/enumerations/list.rhtml |
|
123 | 130 | |
|
124 | 131 | # ./script/../config/../app/views/enumerations/new.rhtml |
|
125 | 132 | l.store 'New enumeration', 'Nouvelle valeur' |
|
126 | 133 | |
|
127 | 134 | # ./script/../config/../app/views/enumerations/_form.rhtml |
|
128 | 135 | |
|
129 | 136 | # ./script/../config/../app/views/issues/change_status.rhtml |
|
130 | 137 | l.store 'Issue', 'Demande' |
|
131 | 138 | l.store 'New status', 'Nouveau statut' |
|
132 | 139 | l.store 'Assigned to', 'Assigné à' |
|
133 | 140 | l.store 'Fixed in version', 'Version corrigée' |
|
134 | 141 | l.store 'Notes', 'Remarques' |
|
135 | 142 | |
|
136 | 143 | # ./script/../config/../app/views/issues/edit.rhtml |
|
137 | 144 | l.store 'Status', 'Statut' |
|
138 | 145 | l.store 'Tracker', 'Tracker' |
|
139 | 146 | l.store 'Priority', 'Priorité' |
|
140 | 147 | l.store 'Subject', 'Sujet' |
|
141 | 148 | |
|
142 | 149 | # ./script/../config/../app/views/issues/show.rhtml |
|
143 | 150 | l.store 'Author', 'Auteur' |
|
144 | 151 | l.store 'Change status', 'Changer le statut' |
|
145 | 152 | l.store 'History', 'Historique' |
|
146 | 153 | l.store 'Attachments', 'Fichiers' |
|
147 | 154 | l.store 'Update...', 'Changer...' |
|
148 | 155 | |
|
149 | 156 | # ./script/../config/../app/views/issues/_list_simple.rhtml |
|
150 | 157 | l.store 'No issue', 'Aucune demande' |
|
151 | 158 | |
|
152 | 159 | # ./script/../config/../app/views/issue_categories/edit.rhtml |
|
153 | 160 | |
|
154 | 161 | # ./script/../config/../app/views/issue_categories/_form.rhtml |
|
155 | 162 | |
|
156 | 163 | # ./script/../config/../app/views/issue_statuses/edit.rhtml |
|
157 | 164 | l.store 'Issue status', 'Statut de demande' |
|
158 | 165 | |
|
159 | 166 | # ./script/../config/../app/views/issue_statuses/list.rhtml |
|
160 | 167 | l.store 'Issue statuses', 'Statuts de demande' |
|
161 | 168 | l.store 'Default status', 'Statut par défaut' |
|
162 | 169 | l.store 'Issue closed', 'Demande fermée' |
|
163 | 170 | l.store 'Color', 'Couleur' |
|
164 | 171 | |
|
165 | 172 | # ./script/../config/../app/views/issue_statuses/new.rhtml |
|
166 | 173 | l.store 'New issue status', 'Nouveau statut' |
|
167 | 174 | |
|
168 | 175 | # ./script/../config/../app/views/issue_statuses/_form.rhtml |
|
169 | 176 | |
|
170 | 177 | # ./script/../config/../app/views/layouts/base.rhtml |
|
171 | 178 | l.store 'Home', 'Accueil' |
|
172 | 179 | l.store 'Help', 'Aide' |
|
173 | 180 | l.store 'Log in', 'Connexion' |
|
174 | 181 | l.store 'Logout', 'Déconnexion' |
|
175 | 182 | l.store 'Overview', 'Aperçu' |
|
176 | 183 | l.store 'Issues', 'Demandes' |
|
177 | 184 | l.store 'Reports', 'Rapports' |
|
178 | 185 | l.store 'News', 'Annonces' |
|
179 | 186 | l.store 'Change log', 'Historique' |
|
180 | 187 | l.store 'Documents', 'Documents' |
|
181 | 188 | l.store 'Members', 'Membres' |
|
182 | 189 | l.store 'Files', 'Fichiers' |
|
183 | 190 | l.store 'Settings', 'Configuration' |
|
184 | 191 | l.store 'My projects', 'Mes projets' |
|
185 | 192 | l.store 'Logged as', 'Connecté en tant que' |
|
186 | 193 | |
|
187 | 194 | # ./script/../config/../app/views/mailer/issue_add.rhtml |
|
188 | 195 | |
|
189 | 196 | # ./script/../config/../app/views/mailer/issue_change_status.rhtml |
|
190 | 197 | |
|
191 | 198 | # ./script/../config/../app/views/mailer/_issue.rhtml |
|
192 | 199 | |
|
193 | 200 | # ./script/../config/../app/views/news/edit.rhtml |
|
194 | 201 | |
|
195 | 202 | # ./script/../config/../app/views/news/show.rhtml |
|
196 | 203 | l.store 'Summary', 'Résumé' |
|
197 | 204 | l.store 'By', 'Par' |
|
198 | 205 | l.store 'Date', 'Date' |
|
199 | 206 | |
|
200 | 207 | # ./script/../config/../app/views/news/_form.rhtml |
|
201 | 208 | |
|
202 | 209 | # ./script/../config/../app/views/projects/add.rhtml |
|
203 | 210 | l.store 'New project', 'Nouveau projet' |
|
204 | 211 | |
|
205 | 212 | # ./script/../config/../app/views/projects/add_document.rhtml |
|
206 | 213 | l.store 'New document', 'Nouveau document' |
|
207 | 214 | l.store 'File', 'Fichier' |
|
208 | 215 | |
|
209 | 216 | # ./script/../config/../app/views/projects/add_issue.rhtml |
|
210 | 217 | l.store 'New issue', 'Nouvelle demande' |
|
211 | 218 | l.store 'Attachment', 'Fichier' |
|
212 | 219 | |
|
213 | 220 | # ./script/../config/../app/views/projects/add_news.rhtml |
|
214 | 221 | |
|
215 | 222 | # ./script/../config/../app/views/projects/add_version.rhtml |
|
216 | 223 | l.store 'New version', 'Nouvelle version' |
|
217 | 224 | |
|
218 | 225 | # ./script/../config/../app/views/projects/changelog.rhtml |
|
219 | 226 | |
|
220 | 227 | # ./script/../config/../app/views/projects/destroy.rhtml |
|
221 | 228 | l.store 'Are you sure you want to delete project', 'Êtes-vous sûr de vouloir supprimer le projet' |
|
222 | 229 | |
|
223 | 230 | # ./script/../config/../app/views/projects/list.rhtml |
|
224 | 231 | l.store 'Public projects', 'Projets publics' |
|
225 | 232 | |
|
226 | 233 | # ./script/../config/../app/views/projects/list_documents.rhtml |
|
227 | 234 | l.store 'Desciption', 'Description' |
|
228 | 235 | |
|
229 | 236 | # ./script/../config/../app/views/projects/list_files.rhtml |
|
230 | 237 | l.store 'Files', 'Fichiers' |
|
231 | 238 | l.store 'New file', 'Nouveau fichier' |
|
232 | 239 | |
|
233 | 240 | # ./script/../config/../app/views/projects/list_issues.rhtml |
|
241 | l.store 'Subprojects', 'Sous-projets' | |
|
234 | 242 | l.store 'Apply filter', 'Appliquer' |
|
235 | 243 | l.store 'Reset', 'Annuler' |
|
236 | 244 | l.store 'Report an issue', 'Nouvelle demande' |
|
237 | 245 | |
|
238 | 246 | # ./script/../config/../app/views/projects/list_members.rhtml |
|
239 | 247 | l.store 'Project members', 'Membres du projet' |
|
240 | 248 | |
|
241 | 249 | # ./script/../config/../app/views/projects/list_news.rhtml |
|
242 | 250 | l.store 'Read...', 'Lire...' |
|
243 | 251 | |
|
244 | 252 | # ./script/../config/../app/views/projects/settings.rhtml |
|
245 | 253 | l.store 'New member', 'Nouveau membre' |
|
246 | 254 | l.store 'Versions', 'Versions' |
|
247 | 255 | l.store 'New version...', 'Nouvelle version...' |
|
248 | 256 | l.store 'Issue categories', 'Catégories des demandes' |
|
249 | 257 | l.store 'New category', 'Nouvelle catégorie' |
|
250 | 258 | |
|
251 | 259 | # ./script/../config/../app/views/projects/show.rhtml |
|
252 | 260 | l.store 'Homepage', 'Site web' |
|
253 | 261 | l.store 'open', 'ouverte(s)' |
|
254 | 262 | l.store 'View all issues', 'Voir toutes les demandes' |
|
255 | 263 | l.store 'View all news', 'Voir toutes les annonces' |
|
256 | 264 | l.store 'Latest news', 'Dernières annonces' |
|
257 | 265 | |
|
258 | 266 | # ./script/../config/../app/views/projects/_form.rhtml |
|
259 | 267 | |
|
260 | 268 | # ./script/../config/../app/views/reports/issue_report.rhtml |
|
261 | 269 | l.store 'Issues by tracker', 'Demandes par tracker' |
|
262 | 270 | l.store 'Issues by priority', 'Demandes par priorité' |
|
263 | 271 | l.store 'Issues by category', 'Demandes par catégorie' |
|
264 | 272 | |
|
265 | 273 | # ./script/../config/../app/views/reports/_simple.rhtml |
|
266 | 274 | l.store 'Open', 'Ouverte' |
|
267 | 275 | l.store 'Total', 'Total' |
|
268 | 276 | |
|
269 | 277 | # ./script/../config/../app/views/roles/edit.rhtml |
|
270 | 278 | l.store 'Role', 'Rôle' |
|
271 | 279 | |
|
272 | 280 | # ./script/../config/../app/views/roles/list.rhtml |
|
273 | 281 | l.store 'Roles', 'Rôles' |
|
274 | 282 | |
|
275 | 283 | # ./script/../config/../app/views/roles/new.rhtml |
|
276 | 284 | l.store 'New role', 'Nouveau rôle' |
|
277 | 285 | |
|
278 | 286 | # ./script/../config/../app/views/roles/workflow.rhtml |
|
279 | 287 | l.store 'Workflow setup', 'Configuration du workflow' |
|
280 | 288 | l.store 'Select a workflow to edit', 'Sélectionner un workflow à mettre à jour' |
|
281 | 289 | l.store 'New statuses allowed', 'Nouveaux statuts autorisés' |
|
282 | 290 | |
|
283 | 291 | # ./script/../config/../app/views/roles/_form.rhtml |
|
284 | 292 | l.store 'Permissions', 'Permissions' |
|
285 | 293 | |
|
286 | 294 | # ./script/../config/../app/views/trackers/edit.rhtml |
|
287 | 295 | |
|
288 | 296 | # ./script/../config/../app/views/trackers/list.rhtml |
|
289 | 297 | l.store 'View issues in change log', 'Demandes affichées dans l\'historique' |
|
290 | 298 | |
|
291 | 299 | # ./script/../config/../app/views/trackers/new.rhtml |
|
292 | 300 | l.store 'New tracker', 'Nouveau tracker' |
|
293 | 301 | |
|
294 | 302 | # ./script/../config/../app/views/trackers/_form.rhtml |
|
295 | 303 | |
|
296 | 304 | # ./script/../config/../app/views/users/add.rhtml |
|
297 | 305 | l.store 'New user', 'Nouvel utilisateur' |
|
298 | 306 | |
|
299 | 307 | # ./script/../config/../app/views/users/edit.rhtml |
|
300 | 308 | l.store 'User', 'Utilisateur' |
|
301 | 309 | |
|
302 | 310 | # ./script/../config/../app/views/users/list.rhtml |
|
303 | 311 | l.store 'Admin', 'Admin' |
|
304 | 312 | l.store 'Locked', 'Verrouillé' |
|
305 | 313 | |
|
306 | 314 | # ./script/../config/../app/views/users/_form.rhtml |
|
307 | 315 | l.store 'Administrator', 'Administrateur' |
|
308 | 316 | |
|
309 | 317 | # ./script/../config/../app/views/versions/edit.rhtml |
|
310 | 318 | |
|
311 | 319 | # ./script/../config/../app/views/versions/_form.rhtml |
|
312 | 320 | |
|
313 | 321 | # ./script/../config/../app/views/welcome/index.rhtml |
|
314 | ||
|
322 | l.store 'Latest projects', 'Derniers projets' | |
|
315 | 323 | |
|
316 | 324 | end |
|
1 | NO CONTENT: file renamed from redmine/public/manual/images/users_list.png to redmine/public/manual/fr/resources/users_list.png |
@@ -1,322 +1,331 | |||
|
1 | 1 | /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */ |
|
2 | 2 | /* Edited by Jean-Philippe Lang *> |
|
3 | 3 | /**************** Body and tag styles ****************/ |
|
4 | 4 | |
|
5 | 5 | |
|
6 | 6 | #header * {margin:0; padding:0;} |
|
7 | 7 | p, ul, ol, li {margin:0; padding:0;} |
|
8 | 8 | |
|
9 | 9 | |
|
10 | 10 | body{ |
|
11 | 11 | font:76% Verdana,Tahoma,Arial,sans-serif; |
|
12 | 12 | line-height:1.4em; |
|
13 | 13 | text-align:center; |
|
14 | 14 | color:#303030; |
|
15 | 15 | background:#e8eaec; |
|
16 | 16 | } |
|
17 | 17 | |
|
18 | 18 | a{ |
|
19 | 19 | color:#467aa7; |
|
20 | 20 | font-weight:bold; |
|
21 | 21 | text-decoration:none; |
|
22 | 22 | background-color:inherit; |
|
23 | 23 | } |
|
24 | 24 | |
|
25 | 25 | a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;} |
|
26 | 26 | a img{border:none;} |
|
27 | 27 | |
|
28 | 28 | p{padding:0 0 1em 0;} |
|
29 | 29 | p form{margin-top:0; margin-bottom:20px;} |
|
30 | 30 | |
|
31 | 31 | img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;} |
|
32 | 32 | img.left{float:left; margin:0 12px 5px 0;} |
|
33 | 33 | img.center{display:block; margin:0 auto 5px auto;} |
|
34 | 34 | img.right{float:right; margin:0 0 5px 12px;} |
|
35 | 35 | |
|
36 | 36 | /**************** Header and navigation styles ****************/ |
|
37 | 37 | |
|
38 | 38 | #container{ |
|
39 | 39 | width:100%; |
|
40 | 40 | min-width: 800px; |
|
41 | 41 | margin:5px auto; |
|
42 | 42 | padding:1px 0; |
|
43 | 43 | text-align:left; |
|
44 | 44 | background:#ffffff; |
|
45 | 45 | color:#303030; |
|
46 | 46 | border:2px solid #a0a0a0; |
|
47 | 47 | } |
|
48 | 48 | |
|
49 | 49 | #header{ |
|
50 | 50 | height:5.5em; |
|
51 | 51 | /*width:758px;*/ |
|
52 | 52 | margin:0 1px 1px 1px; |
|
53 | 53 | background:#467aa7; |
|
54 | 54 | color:#ffffff; |
|
55 | 55 | } |
|
56 | 56 | |
|
57 | 57 | #header h1{ |
|
58 | 58 | padding:14px 0 0 20px; |
|
59 | 59 | font-size:2.4em; |
|
60 | 60 | background-color:inherit; |
|
61 | 61 | color:#fff; /*rgb(152, 26, 33);*/ |
|
62 | 62 | letter-spacing:-2px; |
|
63 | 63 | font-weight:normal; |
|
64 | 64 | } |
|
65 | 65 | |
|
66 | 66 | #header h2{ |
|
67 | 67 | margin:10px 0 0 40px; |
|
68 | 68 | font-size:1.4em; |
|
69 | 69 | background-color:inherit; |
|
70 | 70 | color:#f0f2f4; |
|
71 | 71 | letter-spacing:-1px; |
|
72 | 72 | font-weight:normal; |
|
73 | 73 | } |
|
74 | 74 | |
|
75 | 75 | #navigation{ |
|
76 | 76 | height:2.2em; |
|
77 | 77 | line-height:2.2em; |
|
78 | 78 | /*width:758px;*/ |
|
79 | 79 | margin:0 1px; |
|
80 | 80 | background:#578bb8; |
|
81 | 81 | color:#ffffff; |
|
82 | 82 | } |
|
83 | 83 | |
|
84 | 84 | #navigation li{ |
|
85 | 85 | float:left; |
|
86 | 86 | list-style-type:none; |
|
87 | 87 | border-right:1px solid #ffffff; |
|
88 | 88 | white-space:nowrap; |
|
89 | 89 | } |
|
90 | 90 | |
|
91 | 91 | #navigation li.right { |
|
92 | 92 | float:right; |
|
93 | 93 | list-style-type:none; |
|
94 | 94 | border-right:0; |
|
95 | 95 | border-left:1px solid #ffffff; |
|
96 | 96 | white-space:nowrap; |
|
97 | 97 | } |
|
98 | 98 | |
|
99 | 99 | #navigation li a{ |
|
100 | 100 | display:block; |
|
101 | 101 | padding:0px 10px 0px 22px; |
|
102 | 102 | font-size:0.8em; |
|
103 | 103 | font-weight:normal; |
|
104 | 104 | /*text-transform:uppercase;*/ |
|
105 | 105 | text-decoration:none; |
|
106 | 106 | background-color:inherit; |
|
107 | 107 | color: #ffffff; |
|
108 | 108 | } |
|
109 | 109 | |
|
110 | 110 | * html #navigation a {width:1%;} |
|
111 | 111 | |
|
112 | 112 | #navigation .selected,#navigation a:hover{ |
|
113 | 113 | color:#ffffff; |
|
114 | 114 | text-decoration:none; |
|
115 | 115 | background-color: #80b0da; |
|
116 | 116 | } |
|
117 | 117 | |
|
118 | 118 | /**************** Icons links *******************/ |
|
119 | 119 | .picHome { background: url(../images/home.png) no-repeat 4px 50%; } |
|
120 | 120 | .picUser { background: url(../images/user.png) no-repeat 4px 50%; } |
|
121 | 121 | .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; } |
|
122 | 122 | .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; } |
|
123 | 123 | .picProject { background: url(../images/projects.png) no-repeat 4px 50%; } |
|
124 | 124 | .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; } |
|
125 | 125 | .picHelp { background: url(../images/help.png) no-repeat 4px 50%; } |
|
126 | 126 | |
|
127 | 127 | /**************** Content styles ****************/ |
|
128 | 128 | |
|
129 | 129 | #content{ |
|
130 | 130 | /*float:right;*/ |
|
131 | 131 | /*width:530px;*/ |
|
132 | 132 | width: auto; |
|
133 | 133 | min-height: 500px; |
|
134 | 134 | font-size:0.9em; |
|
135 | 135 | padding:20px 10px 10px 20px; |
|
136 | 136 | /*position: absolute;*/ |
|
137 | 137 | margin: 0 0 0 140px; |
|
138 | 138 | border-left: 1px dashed #c0c0c0; |
|
139 | 139 | |
|
140 | 140 | } |
|
141 | 141 | |
|
142 | 142 | #content h2{ |
|
143 | 143 | display:block; |
|
144 | 144 | margin:0 0 16px 0; |
|
145 | 145 | font-size:1.7em; |
|
146 | 146 | font-weight:normal; |
|
147 | 147 | letter-spacing:-1px; |
|
148 | 148 | color:#505050; |
|
149 | 149 | background-color:inherit; |
|
150 | 150 | } |
|
151 | 151 | |
|
152 | 152 | #content h2 a{font-weight:normal;} |
|
153 | 153 | #content h3{margin:0 0 5px 0; font-size:1.4em; letter-spacing:-1px;} |
|
154 | 154 | #content a:hover,#subcontent a:hover{text-decoration:underline;} |
|
155 | 155 | #content ul,#content ol{margin:0 5px 16px 35px;} |
|
156 | 156 | #content dl{margin:0 5px 10px 25px;} |
|
157 | 157 | #content dt{font-weight:bold; margin-bottom:5px;} |
|
158 | 158 | #content dd{margin:0 0 10px 15px;} |
|
159 | 159 | |
|
160 | 160 | |
|
161 | 161 | /***********************************************/ |
|
162 | 162 | |
|
163 | 163 | /* |
|
164 | 164 | form{ |
|
165 | 165 | padding:15px; |
|
166 | 166 | margin:0 0 20px 0; |
|
167 | 167 | border:1px solid #c0c0c0; |
|
168 | 168 | background-color:#CEE1ED; |
|
169 | 169 | width:600px; |
|
170 | 170 | } |
|
171 | 171 | */ |
|
172 | 172 | |
|
173 | 173 | form { |
|
174 | 174 | display: inline; |
|
175 | 175 | } |
|
176 | 176 | |
|
177 | 177 | .noborder { |
|
178 | 178 | border:0px; |
|
179 | 179 | background-color:#fff; |
|
180 | 180 | width:100%; |
|
181 | 181 | } |
|
182 | 182 | |
|
183 | 183 | input { |
|
184 | 184 | vertical-align: top; |
|
185 | 185 | } |
|
186 | 186 | |
|
187 | 187 | input.button-small |
|
188 | 188 | { |
|
189 | 189 | font-size: 0.8em; |
|
190 | 190 | } |
|
191 | 191 | |
|
192 | select.select-small | |
|
193 | { | |
|
194 | font-size: 0.8em; | |
|
195 | } | |
|
196 | ||
|
192 | 197 | label { |
|
193 | 198 | font-weight: bold; |
|
194 | 199 | font-size: 1em; |
|
195 | 200 | } |
|
196 | 201 | |
|
202 | fieldset { | |
|
203 | border:1px solid #7F9DB9; | |
|
204 | } | |
|
205 | ||
|
197 | 206 | .required { |
|
198 | 207 | color: #bb0000; |
|
199 | 208 | } |
|
200 | 209 | |
|
201 | 210 | table.listTableContent { |
|
202 | 211 | /*margin: 2em 2em 2em 0; */ |
|
203 | 212 | border:1px solid #c0c0c0; |
|
204 | 213 | width:99%; |
|
205 | 214 | } |
|
206 | 215 | |
|
207 | 216 | table.listTableContent td { |
|
208 | 217 | margin: 2px; |
|
209 | 218 | |
|
210 | 219 | } |
|
211 | 220 | |
|
212 | 221 | tr.ListHead { |
|
213 | 222 | background-color:#467aa7; |
|
214 | 223 | color:#FFFFFF; |
|
215 | 224 | text-align:center; |
|
216 | 225 | } |
|
217 | 226 | |
|
218 | 227 | tr.ListHead a { |
|
219 | 228 | color:#FFFFFF; |
|
220 | 229 | text-decoration:underline; |
|
221 | 230 | } |
|
222 | 231 | |
|
223 | tr.ListLine0 { | |
|
232 | tr.odd { | |
|
224 | 233 | background-color: #C1E2F7; |
|
225 | 234 | } |
|
226 | tr.ListLine1 { | |
|
235 | tr.even { | |
|
227 | 236 | background-color:#CEE1ED; |
|
228 | 237 | } |
|
229 | 238 | |
|
230 | 239 | hr { border:0px; border-bottom:1px dashed #000000; } |
|
231 | 240 | |
|
232 | 241 | |
|
233 | 242 | /**************** Sidebar styles ****************/ |
|
234 | 243 | |
|
235 | 244 | #subcontent{ |
|
236 | 245 | float:left; |
|
237 | 246 | clear:both; |
|
238 | 247 | width:130px; |
|
239 | 248 | padding:20px 20px 10px 5px; |
|
240 | 249 | line-height:1.4em; |
|
241 | 250 | } |
|
242 | 251 | |
|
243 | 252 | #subcontent h2{ |
|
244 | 253 | display:block; |
|
245 | 254 | margin:0 0 15px 0; |
|
246 | 255 | font-size:1.6em; |
|
247 | 256 | font-weight:normal; |
|
248 | 257 | text-align:left; |
|
249 | 258 | letter-spacing:-1px; |
|
250 | 259 | color:#505050; |
|
251 | 260 | background-color:inherit; |
|
252 | 261 | } |
|
253 | 262 | |
|
254 | 263 | #subcontent p{margin:0 0 16px 0; font-size:0.9em;} |
|
255 | 264 | |
|
256 | 265 | /**************** Menublock styles ****************/ |
|
257 | 266 | |
|
258 | 267 | .menublock{margin:0 0 20px 8px; font-size:0.9em;} |
|
259 | 268 | .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;} |
|
260 | 269 | .menublock li a{font-weight:bold; text-decoration:none;} |
|
261 | 270 | .menublock li a:hover{text-decoration:none;} |
|
262 | 271 | .menublock li ul{margin:3px 0 3px 15px; font-size:1em; font-weight:normal;} |
|
263 | 272 | .menublock li ul li{margin-bottom:0;} |
|
264 | 273 | .menublock li ul a{font-weight:normal;} |
|
265 | 274 | |
|
266 | 275 | /**************** Searchbar styles ****************/ |
|
267 | 276 | |
|
268 | 277 | #searchbar{margin:0 0 20px 0;} |
|
269 | 278 | #searchbar form fieldset{margin-left:10px; border:0 solid;} |
|
270 | 279 | |
|
271 | 280 | #searchbar #s{ |
|
272 | 281 | height:1.2em; |
|
273 | 282 | width:110px; |
|
274 | 283 | margin:0 5px 0 0; |
|
275 | 284 | border:1px solid #a0a0a0; |
|
276 | 285 | } |
|
277 | 286 | |
|
278 | 287 | #searchbar #searchbutton{ |
|
279 | 288 | width:auto; |
|
280 | 289 | padding:0 1px; |
|
281 | 290 | border:1px solid #808080; |
|
282 | 291 | font-size:0.9em; |
|
283 | 292 | text-align:center; |
|
284 | 293 | } |
|
285 | 294 | |
|
286 | 295 | /**************** Footer styles ****************/ |
|
287 | 296 | |
|
288 | 297 | #footer{ |
|
289 | 298 | clear:both; |
|
290 | 299 | /*width:758px;*/ |
|
291 | 300 | padding:5px 0; |
|
292 | 301 | margin:0 1px; |
|
293 | 302 | font-size:0.9em; |
|
294 | 303 | color:#f0f0f0; |
|
295 | 304 | background:#467aa7; |
|
296 | 305 | } |
|
297 | 306 | |
|
298 | 307 | #footer p{padding:0; margin:0; text-align:center;} |
|
299 | 308 | #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;} |
|
300 | 309 | #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;} |
|
301 | 310 | |
|
302 | 311 | /**************** Misc classes and styles ****************/ |
|
303 | 312 | |
|
304 | 313 | .splitcontentleft{float:left; width:49%;} |
|
305 | 314 | .splitcontentright{float:right; width:49%;} |
|
306 | 315 | .clear{clear:both;} |
|
307 | 316 | .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;} |
|
308 | 317 | .hide{display:none;} |
|
309 | 318 | .textcenter{text-align:center;} |
|
310 | 319 | .textright{text-align:right;} |
|
311 | 320 | .important{color:#f02025; background-color:inherit; font-weight:bold;} |
|
312 | 321 | |
|
313 | 322 | .box{ |
|
314 | 323 | margin:0 0 20px 0; |
|
315 | 324 | padding:10px; |
|
316 | 325 | border:1px solid #c0c0c0; |
|
317 | 326 | background-color:#fafbfc; |
|
318 | 327 | color:#505050; |
|
319 | 328 | line-height:1.5em; |
|
320 | 329 | } |
|
321 | 330 | |
|
322 | 331 |
@@ -1,5 +1,26 | |||
|
1 | 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html |
|
2 | first: | |
|
2 | ecookbook: | |
|
3 | 3 | id: 1 |
|
4 | another: | |
|
4 | name: eCookbook | |
|
5 | descr: Recipes management application | |
|
6 | homepage: http://ecookbook.somenet.foo/ | |
|
7 | projects_count: 1 | |
|
8 | created_on: 2005-01-01 01:00:00 | |
|
9 | updated_on: 2005-01-01 01:00:00 | |
|
10 | onlinestore: | |
|
5 | 11 | id: 2 |
|
12 | name: OnlineStore | |
|
13 | descr: E-commerce web site | |
|
14 | is_public: false | |
|
15 | projects_count: 0 | |
|
16 | created_on: 2005-01-01 01:00:00 | |
|
17 | updated_on: 2005-01-01 01:00:00 | |
|
18 | tracker: | |
|
19 | id: 3 | |
|
20 | name: tracker | |
|
21 | descr: bug tracker | |
|
22 | is_public: true | |
|
23 | projects_count: 0 | |
|
24 | parent_id: 1 | |
|
25 | created_on: 2005-01-01 01:00:00 | |
|
26 | updated_on: 2005-01-01 01:00:00 No newline at end of file |
@@ -1,5 +1,10 | |||
|
1 | 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html |
|
2 | first: | |
|
2 | manager: | |
|
3 | 3 | id: 1 |
|
4 | another: | |
|
4 | name: manager | |
|
5 | developer: | |
|
5 | 6 | id: 2 |
|
7 | name: developer | |
|
8 | reporter: | |
|
9 | id: 3 | |
|
10 | name: reporter |
@@ -1,5 +1,19 | |||
|
1 | 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html |
|
2 | first: | |
|
2 | admin: | |
|
3 | 3 | id: 1 |
|
4 | another: | |
|
4 | login: admin | |
|
5 | firstname: admin | |
|
6 | lastname: admin | |
|
7 | mail: admin@somenet.foo | |
|
8 | hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997 | |
|
9 | admin: true | |
|
10 | language: en | |
|
11 | paulochon: | |
|
5 | 12 | id: 2 |
|
13 | login: plochon | |
|
14 | firstname: Paul | |
|
15 | lastname: Ochon | |
|
16 | mail: plochon@somenet.foo | |
|
17 | hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997 | |
|
18 | admin: false | |
|
19 | language: en No newline at end of file |
@@ -1,88 +1,47 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
1 | 18 | require File.dirname(__FILE__) + '/../test_helper' |
|
2 | 19 | require 'projects_controller' |
|
3 | 20 | |
|
4 | 21 | # Re-raise errors caught by the controller. |
|
5 | 22 | class ProjectsController; def rescue_action(e) raise e end; end |
|
6 | 23 | |
|
7 | 24 | class ProjectsControllerTest < Test::Unit::TestCase |
|
8 | 25 | fixtures :projects |
|
9 | 26 | |
|
10 | 27 | def setup |
|
11 | 28 | @controller = ProjectsController.new |
|
12 | 29 | @request = ActionController::TestRequest.new |
|
13 | 30 | @response = ActionController::TestResponse.new |
|
14 | 31 | end |
|
15 | 32 | |
|
16 | 33 | def test_index |
|
17 | 34 | get :index |
|
18 | 35 | assert_response :success |
|
19 | 36 | assert_template 'list' |
|
20 | 37 | end |
|
21 | 38 | |
|
22 | 39 | def test_list |
|
23 | 40 | get :list |
|
24 | 41 | |
|
25 | 42 | assert_response :success |
|
26 | 43 | assert_template 'list' |
|
27 | 44 | |
|
28 | 45 | assert_not_nil assigns(:projects) |
|
29 | 46 | end |
|
30 | ||
|
31 | def test_show | |
|
32 | get :show, :id => 1 | |
|
33 | ||
|
34 | assert_response :success | |
|
35 | assert_template 'show' | |
|
36 | ||
|
37 | assert_not_nil assigns(:project) | |
|
38 | assert assigns(:project).valid? | |
|
39 | end | |
|
40 | ||
|
41 | def test_new | |
|
42 | get :new | |
|
43 | ||
|
44 | assert_response :success | |
|
45 | assert_template 'new' | |
|
46 | ||
|
47 | assert_not_nil assigns(:project) | |
|
48 | end | |
|
49 | ||
|
50 | def test_create | |
|
51 | num_projects = Project.count | |
|
52 | ||
|
53 | post :create, :project => {} | |
|
54 | ||
|
55 | assert_response :redirect | |
|
56 | assert_redirected_to :action => 'list' | |
|
57 | ||
|
58 | assert_equal num_projects + 1, Project.count | |
|
59 | end | |
|
60 | ||
|
61 | def test_edit | |
|
62 | get :edit, :id => 1 | |
|
63 | ||
|
64 | assert_response :success | |
|
65 | assert_template 'edit' | |
|
66 | ||
|
67 | assert_not_nil assigns(:project) | |
|
68 | assert assigns(:project).valid? | |
|
69 | end | |
|
70 | ||
|
71 | def test_update | |
|
72 | post :update, :id => 1 | |
|
73 | assert_response :redirect | |
|
74 | assert_redirected_to :action => 'show', :id => 1 | |
|
75 | end | |
|
76 | ||
|
77 | def test_destroy | |
|
78 | assert_not_nil Project.find(1) | |
|
79 | ||
|
80 | post :destroy, :id => 1 | |
|
81 | assert_response :redirect | |
|
82 | assert_redirected_to :action => 'list' | |
|
83 | ||
|
84 | assert_raise(ActiveRecord::RecordNotFound) { | |
|
85 | Project.find(1) | |
|
86 | } | |
|
87 | end | |
|
88 | 47 | end |
@@ -1,28 +1,55 | |||
|
1 | ENV["RAILS_ENV"] = "test" | |
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | ENV["RAILS_ENV"] ||= "test" | |
|
2 | 19 | require File.expand_path(File.dirname(__FILE__) + "/../config/environment") |
|
3 | 20 | require 'test_help' |
|
4 | 21 | |
|
5 | 22 | class Test::Unit::TestCase |
|
6 | 23 | # Transactional fixtures accelerate your tests by wrapping each test method |
|
7 | 24 | # in a transaction that's rolled back on completion. This ensures that the |
|
8 | 25 | # test database remains unchanged so your fixtures don't have to be reloaded |
|
9 | 26 | # between every test method. Fewer database queries means faster tests. |
|
10 | 27 | # |
|
11 | 28 | # Read Mike Clark's excellent walkthrough at |
|
12 | 29 | # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting |
|
13 | 30 | # |
|
14 | 31 | # Every Active Record database supports transactions except MyISAM tables |
|
15 | 32 | # in MySQL. Turn off transactional fixtures in this case; however, if you |
|
16 | 33 | # don't care one way or the other, switching from MyISAM to InnoDB tables |
|
17 | 34 | # is recommended. |
|
18 | 35 | self.use_transactional_fixtures = true |
|
19 | 36 | |
|
20 | 37 | # Instantiated fixtures are slow, but give you @david where otherwise you |
|
21 | 38 | # would need people(:david). If you don't want to migrate your existing |
|
22 | 39 | # test cases which use the @david style and don't mind the speed hit (each |
|
23 | 40 | # instantiated fixtures translates to a database query per test method), |
|
24 | 41 | # then set this back to true. |
|
25 | 42 | self.use_instantiated_fixtures = false |
|
26 | 43 | |
|
27 | 44 | # Add more helper methods to be used by all tests here... |
|
45 | ||
|
46 | def log_user(login, password) | |
|
47 | get "/account/login" | |
|
48 | assert_equal nil, session[:user] | |
|
49 | assert_response :success | |
|
50 | assert_template "account/login" | |
|
51 | post "/account/login", :login => login, :password => password | |
|
52 | assert_redirected_to "account/my_page" | |
|
53 | assert_equal login, session[:user].login | |
|
54 | end | |
|
28 | 55 | end |
@@ -1,10 +1,77 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
1 | 18 | require File.dirname(__FILE__) + '/../test_helper' |
|
2 | 19 | |
|
3 | 20 | class ProjectTest < Test::Unit::TestCase |
|
4 | 21 | fixtures :projects |
|
5 | 22 | |
|
6 | # Replace this with your real tests. | |
|
23 | def setup | |
|
24 | @project = projects(:ecookbook) | |
|
25 | end | |
|
26 | ||
|
7 | 27 | def test_truth |
|
8 |
assert_kind_of Project, project |
|
|
28 | assert_kind_of Project, @project | |
|
29 | assert_equal "eCookbook", @project.name | |
|
30 | end | |
|
31 | ||
|
32 | def test_update | |
|
33 | assert_equal "eCookbook", @project.name | |
|
34 | @project.name = "eCook" | |
|
35 | assert @project.save, @project.errors.full_messages.join("; ") | |
|
36 | @project.reload | |
|
37 | assert_equal "eCook", @project.name | |
|
38 | end | |
|
39 | ||
|
40 | def test_validate | |
|
41 | @project.name = "" | |
|
42 | assert !@project.save | |
|
43 | assert_equal 1, @project.errors.count | |
|
44 | assert_equal "can't be blank", @project.errors.on(:name) | |
|
45 | end | |
|
46 | ||
|
47 | def test_public_projects | |
|
48 | public_projects = Project.find(:all, :conditions => ["is_public=?", true]) | |
|
49 | assert_equal 2, public_projects.length | |
|
50 | assert_equal true, public_projects[0].is_public? | |
|
51 | end | |
|
52 | ||
|
53 | def test_destroy | |
|
54 | @project.destroy | |
|
55 | assert_raise(ActiveRecord::RecordNotFound) { Project.find(@project.id) } | |
|
56 | end | |
|
57 | ||
|
58 | def test_subproject_ok | |
|
59 | sub = Project.find(2) | |
|
60 | sub.parent = Project.find(1) | |
|
61 | assert sub.save | |
|
62 | assert_equal 1, sub.parent.id | |
|
63 | assert_equal 2, Project.find(1).projects_count | |
|
64 | end | |
|
65 | ||
|
66 | def test_subproject_invalid | |
|
67 | sub = Project.find(2) | |
|
68 | sub.parent = projects(:tracker) | |
|
69 | assert !sub.save | |
|
70 | end | |
|
71 | ||
|
72 | def test_subproject_invalid_2 | |
|
73 | sub = Project.find(1) | |
|
74 | sub.parent = projects(:onlinestore) | |
|
75 | assert !sub.save | |
|
9 | 76 | end |
|
10 | 77 | end |
@@ -1,10 +1,64 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
1 | 18 | require File.dirname(__FILE__) + '/../test_helper' |
|
2 | 19 | |
|
3 | 20 | class UserTest < Test::Unit::TestCase |
|
4 | 21 | fixtures :users |
|
5 | 22 | |
|
6 | # Replace this with your real tests. | |
|
7 | 23 | def test_truth |
|
8 |
assert_kind_of User, users(: |
|
|
24 | assert_kind_of User, users(:paulochon) | |
|
25 | end | |
|
26 | ||
|
27 | def test_update | |
|
28 | user = User.find(1) | |
|
29 | assert_equal "admin", user.login | |
|
30 | user.login = "john" | |
|
31 | assert user.save, user.errors.full_messages.join("; ") | |
|
32 | user.reload | |
|
33 | assert_equal "john", user.login | |
|
34 | end | |
|
35 | ||
|
36 | def test_validate | |
|
37 | user = User.find(1) | |
|
38 | user.login = "" | |
|
39 | assert !user.save | |
|
40 | assert_equal 2, user.errors.count | |
|
41 | end | |
|
42 | ||
|
43 | def test_password | |
|
44 | user = User.try_to_login("admin", "admin") | |
|
45 | assert_kind_of User, user | |
|
46 | assert_equal "admin", user.login | |
|
47 | user.password = "hello" | |
|
48 | assert user.save | |
|
49 | ||
|
50 | user = User.try_to_login("admin", "hello") | |
|
51 | assert_kind_of User, user | |
|
52 | assert_equal "admin", user.login | |
|
53 | assert_equal User.hash_password("hello"), user.hashed_password | |
|
54 | end | |
|
55 | ||
|
56 | def test_lock | |
|
57 | user = User.find(1) | |
|
58 | user.locked = true | |
|
59 | assert user.save | |
|
60 | ||
|
61 | user = User.try_to_login("admin", "admin") | |
|
62 | assert_equal nil, user | |
|
9 | 63 | end |
|
10 | 64 | end |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed, binary diff hidden |
|
1 | NO CONTENT: file was removed, binary diff hidden |
|
1 | NO CONTENT: file was removed, binary diff hidden |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now