savannah-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. c


From: Sylvain Beucler
Subject: [Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. ca722b14f6186b8fe48e800a22083d421dfc3e2e
Date: Thu, 22 Jul 2010 16:31:00 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Savane-cleanup framework".

The branch, master has been updated
       via  ca722b14f6186b8fe48e800a22083d421dfc3e2e (commit)
      from  a62d4f9ecb8fda0eff9b5c65f2d5fd9af52ee075 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=ca722b14f6186b8fe48e800a22083d421dfc3e2e

commit ca722b14f6186b8fe48e800a22083d421dfc3e2e
Author: Sylvain Beucler <address@hidden>
Date:   Thu Jul 22 18:30:51 2010 +0200

    Trim design to show current progress + code clean-ups

diff --git a/.gitignore b/.gitignore
index 17df024..774021e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
 *~
 *.pyc
 settings.py
+
+# Bundled dependencies, cf. INSTALL
+django-annoying
diff --git a/INSTALL b/INSTALL
index 8ffb914..a4f355f 100644
--- a/INSTALL
+++ b/INSTALL
@@ -25,6 +25,8 @@
 
 apt-get install python-django python-mysqldb mysql-server
 
+hg clone http://bitbucket.org/offline/django-annoying/
+
 
 * Install process
 
diff --git a/TODO b/TODO
index f77e8ca..87e5124 100644
--- a/TODO
+++ b/TODO
@@ -28,11 +28,12 @@ improve it.
 
         [X] real name
 
-        [/] SSH keys TODO: maybe display existing keys better; avoid
-           using GET for deletions (use POST instead)
+        [X] SSH keys
 
         [X] GPG key
 
+       [ ] Resume and skills
+
     [/] My Groups
 
     [ ] Group membership (manage members, manage permissions, request
diff --git a/annoying b/annoying
new file mode 120000
index 0000000..15c01fc
--- /dev/null
+++ b/annoying
@@ -0,0 +1 @@
+django-annoying/annoying
\ No newline at end of file
diff --git a/savane/my/urls.py b/savane/my/urls.py
index 110e222..8ff75e5 100644
--- a/savane/my/urls.py
+++ b/savane/my/urls.py
@@ -50,8 +50,9 @@ urlpatterns = decorated_patterns ('', login_required,
         'extra_context' : { 'title' : 'My account', }, },
       name='savane.my.views.index'),
   url('^conf/$', views.sv_conf),
-  url('^conf/resume_skill$', views.sv_resume_skill),
-  url('^conf/ssh_gpg$', views.sv_ssh_gpg),
+  url('^conf/resume_skill/$', views.sv_resume_skill),
+  url('^conf/ssh_gpg/$', views.sv_ssh_gpg),
+  url('^conf/ssh_gpg/delete/$', views.sv_ssh_delete),
   url(r'^groups/$', only_mine(object_list),
       { 'queryset' : svmain_models.ExtendedGroup.objects.all(),
         'extra_context' : { 'title' : "My groups", }, },
diff --git a/savane/my/views.py b/savane/my/views.py
index 071552d..bce458c 100644
--- a/savane/my/views.py
+++ b/savane/my/views.py
@@ -23,15 +23,13 @@ from django.http import HttpResponseRedirect
 from django.contrib.auth import authenticate, login, logout
 from django.contrib.auth.decorators import login_required
 from django import forms
+from django.contrib import messages
 from savane.svmain.models import ExtendedUser, SshKey
 from savane.utils import *
+from annoying.decorators import render_to
 
 @login_required()
 def sv_conf( request ):
-
-    error_msg = ''
-    success_msg = ''
-
     form_pass = PasswordForm ()
     form_mail = MailForm ()
     form_identity = IdentityForm ()
@@ -40,43 +38,41 @@ def sv_conf( request ):
     if request.method == 'POST':
         action = request.POST['action']
         if action == 'update_password':
-            form_pass = PasswordForm( request.POST )
+            form_pass = PasswordForm(request.POST)
             form = form_pass
         elif action == 'update_mail':
-            form_mail = MailForm( request.POST )
+            form_mail = MailForm(request.POST)
             form = form_mail
         elif action == 'update_identity':
-            form_identity = IdentityForm( request.POST )
+            form_identity = IdentityForm(request.POST)
             form = form_identity
 
         if form is not None and form.is_valid():
             if action == 'update_password':
-                if request.user.check_password( request.POST['old_password'] ):
-                    request.user.set_password( request.POST['new_password'] );
+                if request.user.check_password(request.POST['old_password']):
+                    request.user.set_password(request.POST['new_password']);
                     request.user.save()
-                    success_msg = "Password was successfully changed."
+                    messages.success(request, u"Password was successfully 
changed.")
                     form_pass = PasswordForm()
                 else:
-                    error_msg = "Old password didn't match."
+                    messages.error(request, u"Old password didn't match.")
             elif action == 'update_mail':
                 new_email = request.POST['email']
                 request.user.email = new_email
                 request.user.save()
                 form_mail = MailForm()
-                success_msg = 'The E-Mail address was succesfully updated. New 
E-Mail address is <'+new_email+'>'
+                messages.success(request, u"The E-Mail address was succesfully 
updated. New E-Mail address is <%s>" % new_email)
             elif action == 'update_identity':
                 request.user.first_name = request.POST['name']
                 request.user.last_name = request.POST['last_name']
                 request.user.save()
-                success_msg = 'Personal information changed.'
+                messages.success(request, u"Personal information changed.")
                 form_identity = IdentityForm()
 
     return render_to_response('my/conf.html',
                               { 'form_pass' : form_pass,
                                 'form_mail' : form_mail,
                                 'form_identity' : form_identity,
-                                'error_msg' : error_msg,
-                                'success_msg' : success_msg,
                                 },
                               context_instance=RequestContext(request))
 
@@ -84,6 +80,7 @@ def sv_conf( request ):
 def sv_resume_skill( request ):
     return render_to_response('my/resume_skill.html',
                                context_instance=RequestContext(request))
+
 @login_required()
 def sv_ssh_gpg( request ):
     eu = get_object_or_404(ExtendedUser, pk=request.user.pk)
@@ -168,6 +165,20 @@ def sv_ssh_gpg( request ):
                                 },
                               context_instance=RequestContext(request))
 
address@hidden()
address@hidden('svmain/generic_confirm.html', mimetype=None)
+def sv_ssh_delete(request):
+    eu = get_object_or_404(ExtendedUser, pk=request.user.pk)
+    if request.method == 'POST':
+        try:
+            ssh_key = eu.sshkey_set.get(pk=request.POST.get('key_pk', 0))
+            ssh_key.delete()
+        except SshKey.DoesNotExist:
+            messages.error(request, u"Cannot remove the selected key")
+        return HttpResponseRedirect("../")
+    else:
+        return {}
+
 class MailForm( forms.Form ):
     email = forms.EmailField(required=True)
     action = forms.CharField( widget=forms.HiddenInput, required=True, 
initial='update_mail' )
@@ -193,18 +204,18 @@ class GPGForm( forms.Form ):
     action = forms.CharField( widget=forms.HiddenInput, required=True, 
initial='update_gpg' )
 
 class SSHForm( forms.Form ):
-    key_file = forms.FileField( required=False )
-    key = forms.CharField( widget=forms.TextInput( attrs={'size':'60'} ), 
required=False )
+    key_file = forms.FileField(required=False, help_text="Be sure to upload 
the file ending with .pub")
+    key = forms.CharField(widget=forms.TextInput(attrs={'size':'60'}), 
required=False)
 
-    action = forms.CharField( widget=forms.HiddenInput, required=True, 
initial='add_ssh' )
+    action = forms.CharField(widget=forms.HiddenInput, required=True, 
initial='add_ssh')
 
     def clean_key( self ):
         ssh_key = self.cleaned_data['key']
 
         try:
-            ssh_key_fingerprint( ssh_key )
+            ssh_key_fingerprint(ssh_key)
         except:
-            raise forms.ValidationError( "The uploaded string is not a public 
key file" )
+            raise forms.ValidationError("The uploaded string is not a public 
key file")
 
         return ssh_key
 
@@ -219,8 +230,8 @@ class SSHForm( forms.Form ):
             ssh_key = ssh_key + chunk
 
         try:
-            ssh_key_fingerprint( ssh_key )
+            ssh_key_fingerprint(ssh_key)
         except:
-            raise forms.ValidationError( "The uploaded file is not a public 
key file" )
+            raise forms.ValidationError("The uploaded file is not a public key 
file")
 
         return ssh_key_file
diff --git a/savane/svmain/urls.py b/savane/svmain/urls.py
index 721f64f..264890e 100644
--- a/savane/svmain/urls.py
+++ b/savane/svmain/urls.py
@@ -27,8 +27,9 @@ urlpatterns = patterns ('',
       { 'template' : 'index.html',
         'extra_context' : { 'has_left_menu': False } },
       name='homepage'),
-  url(r'^contact$', 'django.views.generic.simple.direct_to_template',
-      { 'template' : 'contact.html' },
+  url(r'^contact/$', 'django.views.generic.simple.direct_to_template',
+      { 'template' : 'svmain/text.html',
+        'extra_context' : { 'title' : 'Contact', }, },
       name='contact'),
 
   # TODO: not sure about the views naming convention - all this
diff --git a/static_media/savane/css/Savannah.css 
b/static_media/savane/css/Savannah.css
index bfb022b..aa65864 100644
--- a/static_media/savane/css/Savannah.css
+++ b/static_media/savane/css/Savannah.css
@@ -1,6 +1,8 @@
 /*
  *
- * Copyright 2009 (c) Savannah Hackers
+ * Copyright (C) 2002-2006  Mathieu Roy
+ * Copyright (C) 2005  Stéphane Urbanovski
+ * Copyright (C) 2005  Sylvain Beucler
  *
  * This file is part of Savane.
  *
@@ -17,202 +19,1141 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
- * $Id$
- *
 */
 
+/* THIS CSS DEFINES BASIC ELEMENTS AND IS SUPPOSED TO BE IMPORTED */
+
+/* GUIDELINES VERSION FOLLOWED: 1.17 */
+
+
+/**********************************************************************
+ *
+ * Very basic (mostly text) items:
+ *
+ **********************************************************************/
+
 body {
-   margin: 0px;
-   padding: 0px;
-   font-family: Arial, Helvetica;
-   font-size: 12px;
+       font-family: sans-serif;
 }
 
-a {
-   color: #641212;
-   text-decoration: none;
+img {
+       border: none;
+       margin-bottom: -0.2em;
 }
 
-a:hover {
-   color: #641212;
-   text-decoration: underline;
+p {    
+       padding-left: 0.2em;
+       padding-right: 0.2em;
 }
 
-/* Main box */
+strong { font-weight: bold; }
+.bold { font-weight: bold; }
+em { font-style: italic; }
+.italic { font-style: italic; }
 
-.root {
-   width: 100%;
-   height: 100%;
-   margin: 0px;
-   margin-bottom: -1px;
+.verbatim {
+       /* useful to put code blocks, should look by default like postit */
+       border: thin solid #E5E297 !important;
+       margin-left: 0.5em;
+       background-color: #FFFCA8 !important;
+       color: black !important;
+       font-family: monospace; 
 }
 
-.main_menu {
-   overflow: auto;
-   width: 100%;
-   height: 105px;
-   background-color: #ffe4b7;
+
+.block { display: block; }
+
+
+.smaller { font-size: smaller; }
+.small { font-size: small; }
+.xsmall { font-size: xx-small; }
+.large { font-size: large; }
+
+.error { font-weight: bold; color: #c12424; }
+.warn {  color: #c12424; }
+
+.footer { font-size: x-small; clear: both; }
+
+
+/* .text should be deprecated in favor of <p class="smaller">
+.text {
+       padding-left: 5px;
+       text-indent: 1em;
+       font-size: smaller;
 }
+*/
 
-.body {
-   overflow: auto;
-   width: auto;
-   height: 90%;
-   padding: 5px;
-   margin: 0px;
-   padding: 0px;
+.icon {
+       width: 1em;
+       height: 1em;
+       margin-bottom: -0.2em;
 }
 
-.footer {
-   color: #333333;
-   background-color: #ffe4b7;
-   text-align: center;
-   font-size: x-small;
-   padding: 2px;
-   border-color: #e0c080;
-   border-style: solid;
-   border-width: 0 1px 1px 0;
-   margin: 0px;
-   margin-top: 10px;
+
+.pageicon {
+       padding-right: 0.5em;
+       margin-bottom: -0.5em;
+}
+
+
+.minusorplus {
+        vertical-align: middle;
+       font-family: monospace;
+       font-size: xx-small;
+}
+
+.minusorplus:after {
+       content: " ";
+}
+
+.feedbackimage {
+        vertical-align: middle;
+       width: 1em;
+}
+
+
+.feedback {
+       cursor: pointer;
+        vertical-align: middle;
+       font-size: smaller;
+       font-weight: normal;
+       border: thin solid #005d23;
+       background-color: #e7ffe8;
+       text-align: left;
+       color: #005d23;
+       position: fixed;
+       top: 1%;
+       right: 9%;
+       bottom: auto;
+       /* should not interfere with the menu (width: 15%):
+               so we have 9% + menu*/
+       left: 24%;
+       opacity: 0.9;  /* CSS3 standard */
+
+}
+
+.feedback:hover {
+       background-color: #f1fff2;
+}
+
+.feedbacktitle {
+        vertical-align: middle;
+       font-weight: bold;
+       background-color: #005d23;
+       text-align: center;
+       color: white;
+       float: left;
+       padding-left: 0.1em;
+       padding-right: 0.1em;
+       margin-right: 0.5em;
+       text-indent: 0;
+       width: 20%;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+
+.feedbackerror {
+       cursor: pointer;
+        vertical-align: middle;
+       font-weight: normal;
+       border: thin solid #871b00;
+       background-color: #ffeae5;
+       text-align: left;
+       color: #871b00;
+       position: fixed;
+       top: 1%;
+       right: 9%;
+       bottom: auto;
+       /* should not interfere with the menu (width: 15%):
+               so we have 9% + menu*/
+       left: 24%;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+.feedbackerror:hover {
+       background-color: #ffefeb;
+}
+
+.feedbackerrortitle {
+        vertical-align: middle;
+       font-weight: bold;
+       background-color: #871b00;
+       text-align: center;
+       color: white;
+       float: left;
+       padding-left: 0.1em;
+       padding-right: 0.1em;
+       margin-right: 0.5em;
+       text-indent: 0;
+       width: 20%;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+/* this last feedback time occurs when there was both ok and error feedbacks */
+.feedbackerrorandsuccess {
+       cursor: pointer;
+       font-size: smaller;
+       font-weight: normal;
+       border: thin solid #804206;
+       background-color: #ffd1a5;
+       text-align: left;
+       color: #804206;
+       position: fixed;
+       top: 1%;
+       right: 9%;
+       bottom: auto;
+       /* should not interfere with the menu (width: 15%):
+               so we have 9% + menu*/
+       left: 24%;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+.feedbackerrorandsuccess:hover {
+       background-color: #ffe3c7;
+}
+
+.feedbackerrorandsuccesstitle {
+       font-weight: bold;
+       background-color: #804206;
+       text-align: center;
+       color: white;
+       float: left;
+       padding-left: 0.1em;
+       padding-right: 0.1em;
+       margin-right: 0.5em;
+       text-indent: 0;
+       width: 20%;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+/* button to make the hidden feedback showed back
+     - by default it is hidden
+     - does not carries every possible colors for feedback, it would
+       overcomplicated it */
+
+.feedbackback {
+       cursor: pointer;
+       visibility: hidden;
+       position: fixed;
+       background-color: #d5d5d5;
+       border: thin solid #adadad;
+       color: #727272;
+       top: 1%;
+       right: 1em;
+       white-space: nowrap;
+       font-size: smaller;
+       padding-left: 0.2em;
+       padding-right: 0.2em;
+       opacity: 0.9;  /* CSS3 standard */
+}
+
+.feedbackback:hover {
+       background-color: #e6e6e6;
+}
+
+.nextprev {
+       text-align: center;
+}
+.nextprev a {
+       display: inline;
+}
+
+
+.debug {
+       width: 80%;
+       border: thin solid #871b00;
+       background-color: #ffbfaf;
+       text-align: center;
+       color: #871b00;
+       font-weight: normal;
+       font-size: xx-small;
+}
+
+.unavailable {
+       text-decoration: line-through !important;
+       cursor: default;
+}
+
+.unavailable:hover {
+       text-decoration: line-through !important;
+       cursor: default;
+}
+
+.help {
+       cursor: help;
+       text-decoration: underline;
+}
+
+.preinput {
+       font-style: italic;
+}
+
+hr {
+       background-color: black;
+       height: 1px;
+       border: 0;
+}
+
+
+h3 a {
+       display: block;
+}
+
+h5 a {
+       display: block;
+}
+
+.quote {
+       padding-left: 1em;
+       font-style: italic;
+}
+
+
+
+/**********************************************************************
+ *
+ * Alignement, main tables
+ *
+ **********************************************************************/
+
+.center { text-align: center; }
+.left { text-align: left; }
+.right { text-align: right; }
+.justify { text-align: justify; }
+
+
+.backtotop { text-align: right; clear: both; }
+
+.indexcenter { vertical-align: top; width: 80%; }
+.indexright { vertical-align: top; float: right; width: 19%; font-size: small; 
}
+
+.splitleft { margin-left: 1%;  margin-right: 51%; }
+.splitright {  display:block;  float: right; margin-right: 1%; width: 49%; 
overflow: hidden; vertical-align: top;}
+
+.trash { vertical-align: top; text-align: right; margin-right: 0; float: 
right; height: 1em; }
+
+
+.clear { clear: both; }
+.clearl { clear: left; }
+.clearr { clear: right; }
+
+.realbody {
+       vertical-align: top;
+}
+
+
+/* like  boxhighlight */
+.highlight {
+       background-color: #f7c58f;
+       color: black;
+}
+
+/* margin-left + width must be equal to 100% (but think about body margins
+ present in many themes) */
+.main {
+       vertical-align: top;
+       margin-left: 16%;
+       border-spacing: 0;
+       border: none;
+       display: block;
+       width: 80%;
+}
+
+
+
+/**********************************************************************
+ *
+ * Menus
+ *
+ **********************************************************************/
+
+.menu {
+       float: left;
+       font-size: small;
+       vertical-align: top;
+       border-spacing: 0;
+       border: none;
+       width: 15%;
+       margin-top: 0;
+       margin-left: 0;
+       padding-left: 0;
+}
+
+.menulogo {
+       list-style-type: none;
+       font-size: larger;
+       text-align: center;
+}
+
+
+.menutitle {
+       list-style-type: none;
+       vertical-align: top;
+       padding-top: 0;
+       margin-top: 15px;
+}
+
+.menuitem {
+       text-indent: 0;
+       list-style-type: none;
+       list-style-position: inside;
+       vertical-align: middle;
+       margin-left: 0;
+       font-size: small;
+}
+
+/* .menu a { */
+/*     display: block; */
+/* } */
+
+.menusearch {
+       text-indent: 0;
+       text-align: right;
+       list-style-type: none;
+       font-size: smaller;
+}
+
+.relatedrecipes {
+       text-indent: 0;
+       list-style-type: none;
+       list-style-position: inside;
+       vertical-align: middle;
+       margin-left: 0;
+       text-align: left;
+
+}
+
+.relatedrecipesitem {
+       margin-left: 1em;
+       font-size: xx-small;
+}
+
+.topmenu {
+       font-size: small;
+       margin-right: 6em;
+}
+
+.topmenutitle {
+       float: left;
+       padding-left: 1%;
+       padding-right: 1%;
+       width: 15%;
+}
+
+.topmenuitem {
+       border: none;
+       padding-left: 15%;
+}
+
+#topmenu { z-index: 1; } 
+#topmenu ul { margin: 0; padding: 0; }
+#topmenu li { margin: 0; padding: 0; list-style-type: none; }
+
+li.topmenuitemmainitem {
+       display: inline; 
+       float: left;
+        position: relative; 
+}
+
+li.topmenuitemmainitem a { 
+       padding-bottom: 0; 
+       padding-left: 0.5em; 
+       padding-right: 0.5em;
+}
+
+/* not supported by MSIE, that is why we need extra javascript */
+li.topmenuitemmainitem:hover > ul { 
+       visibility: visible;
+}
+
+
+ul.topmenuitemsubmenu { 
+       z-index: 100;  /* big z-index to be always on top */
+       display: block;
+       visibility: hidden;
+       text-align: left; 
+       position: absolute; 
+        top: 1.1em;
+       left: -0.3em;
+       width: 13em;
+       /* default border, so it the theme is not up to date, it still
+       looks ok ; keep that color please, some themes do not override it */
+       border: thin solid #F1F1F1; 
+}
+
+
+ul.topmenuitemsubmenu li {
+       display: block; 
+
+       /* default border, so it the theme is not up to date, it still
+       looks ok */
+       border: solid thin #F1F1F1;
+       /* no top border, that would be make too large separators 
+        while it is perfectly fine to overload the right and bottom with 
+       the ul border, it makes some kind of light 3d effect*/
+       border-top: none;
+       border-left: 0.4em solid #E2E2E2;
+}
+
+ul.topmenuitemsubmenu li a { 
+       margin: 0; 
+       display: block; 
+       line-height: normal;
+       text-decoration: none;
+}
+
+                                                                               
+li.topmenuitemsubmenuseparator {
+       line-height: 2px;
 }
 
 
-/* End Main Box */
+/* Here we do something quite strange to avoid an overlap of the menu:
+       We add two divs, one in float right, the other with clear
+       right.
+       Ideally, only a clear left would have done trick, but it does not
+       because the menu is a float left like the menu
+   
+    */
+#topmenunooverlap { 
+       visibility: hidden;  
+       background: red; 
+       margin-right: 50%; 
+       padding: 0;
+       float: right;
+       height: 0.5em;
+} 
+
+#topmenunooverlapbis { 
+       visibility: hidden;
+       padding: 0; 
+       margin: 0; 
+       clear: right;
+       height: 0.5em;
+} 
+.boxoptions {
+       /* for some reason, with firefox, this is necessary, and it does        
         not change anything for the others */
+       margin-top: 1em;
+}
 
-/* Boxes */
 
-.boxes {
-   display: block;
-   float: left;
-   width: 45%;
-   float: right;
-   height: auto;
-   overflow: auto;
-   font-size: small;
+/* only for bots */
+#website {
+       visibility: hidden;
+       display: none;  
 }
 
+
+/**********************************************************************
+ *
+ * Boxes
+ *
+ **********************************************************************/
+
 .box {
-   float: left;
-   display: block;
-   min-width: 210px;
-   /* width: 210px; */
-   margin-left: 5px;
-   margin-top: 10px;
-   padding-top: 5px;
-   background-color: white;
+       width: 96%;
+       margin-left: 2%;
+       margin-right: 2%;
+       vertical-align: top;
+       border-spacing: 1px;
+       border: 0;
+}
+
+.boxli {
+       padding: 0;
+       margin: 0;
+       border: 0;
+       border-spacing: 0;
 }
 
+
+
 .boxtitle {
-   margin-top: -5px;
-   background-color: #ffe4b7;
+       font-weight: bold;
+       text-align: center;
+       text-transform: capitalize;
+}
+
+.boxtitle a {
+       display: block;
 }
 
 .boxitem {
-   border: thin dotted #E0C080;
-   border-top: none;
-   color:#333333;
-   padding:1%;
+       padding-left: 1%;
+       text-indent: 0;
+       list-style-type: none;
+       text-align: left;
+}
+
+
+.boxitemextra {
+       text-align: right;
+       font-size: smaller;
+       vertical-align: top;    
+}
+
+
+.boxitemalt {
+       padding-left: 1%;
+       text-indent: 0;
+       list-style-type: none;
+       text-align: left;
+}
+
+.boxitemaltextra {
+       text-align: right;
+       font-size: smaller;
+       vertical-align: top;    
+}
+
+
+.boxoptions {
+       width: 95%;
+       padding: 1%;
+       text-align: left;
+       font-size: small;
+
+}
+
+/* by default, the boxoption will provide content, so the page should work
+  properly with or without javascript */
+#boxoptionslinkshow {
+       cursor: pointer;
+       display: none;
+}
+#boxoptionslinkhide {
+       cursor: pointer;
+}
+
+.boxoptionssubmit {
+       vertical-align: bottom;
+       text-align: right;
+       float: right;
+       height: 1em;
+}
+
+.boxhighlight {
+       padding-left: 1%;
+       text-indent: 0;
+       list-style-type: none;
+       text-align: left;
+       background-color: #f7c58f;
+       color: black;
+}
+
+.boxhighlightextra {
+       text-align: right;
+       font-size: smaller;
+       vertical-align: top;    
+}
+
+
+/**********************************************************************
+ *
+ * Trackers specific
+ *
+ **********************************************************************/
+
+.trackersoriginalsubmission {
+       padding-left: 0.2em;
+       padding-top: 0.5em;
+       padding-bottom: 0.5em;
+       border-left: thin #b5b5b5 solid;
+}
+
+/**********************************************************************
+ *
+ * Priorities
+ *
+ **********************************************************************/
+
+
+.priora {
+       background-color: #fff2f2;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+
+
+.priorb {
+       background-color: #ffe8e8;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+
+.priorc {
+       background-color: #ffe0e0;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+
+.priord {
+       background-color: #ffd8d8;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+
+.priore {
+       background-color: #ffcece;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none;  }
+
+.priorf {
+       background-color: #ffc6c6;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+.priorg {
+       background-color: #ffbfbf;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+.priorh {
+       background-color: #ffb7b7;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+.priori {
+       background-color: #ffadad;
+       border: thin solid #ef6e6e;
+       text-indent: 0;
+       list-style-type: none; }
+
+
+.prioraclosed {
+       background-color: #F5FFEB;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.priorbclosed {
+       background-color: #EDFFE6;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.priorcclosed {
+       background-color: #EEFFE1;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.priordclosed {
+       background-color: #E0FFD5;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+
+.prioreclosed {
+       background-color: #CCFFBB;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+
+.priorfclosed {
+       background-color: #C6FFB9;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.priorgclosed {
+       background-color: #C0FFB2;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.priorhclosed {
+       background-color: #ADFFA4;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+.prioriclosed {
+       background-color: #A0FF9D;
+       border: thin solid #51DA96;
+       text-indent: 0;
+       list-style-type: none; }
+
+
+h2.priora { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priorb { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priorc { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priord { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priore { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priorf { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priorg { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priorh { text-shadow: 0.1em 0.1em #f89b9b; }
+h2.priori { text-shadow: 0.1em 0.1em #f89b9b; }
+
+h2.prioraclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priorbclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priorcclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priordclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.prioreclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priorfclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priorgclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.priorhclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+h2.prioriclosed { text-shadow: 0.1em 0.1em #8cf2bf; }
+
+
+tr.priora a {
+       display: block;
+}
+tr.priorb a {
+       display: block;
+}
+tr.priorc a {
+       display: block;
+}
+tr.priord a {
+       display: block;
+}
+tr.priore a {
+       display: block;
+}
+tr.priorf a {
+       display: block;
+}
+tr.priorg a {
+       display: block;
+}
+tr.priorh a {
+       display: block;
+}
+tr.priori a {
+       display: block;
 }
 
-/* End Boxes */
+tr.prioraclosed a {
+       display: block;
+}
+tr.priorbclosed a {
+       display: block;
+}
+tr.priorcclosed a {
+       display: block;
+}
+tr.priordclosed a {
+       display: block;
+}
+tr.prioreclosed a {
+       display: block;
+}
+tr.priorfclosed a {
+       display: block;
+}
+tr.priorgclosed a {
+       display: block;
+}
+tr.priorhclosed a {
+       display: block;
+}
+tr.prioriclosed a {
+       display: block;
+}
 
-/* News */
+.menu .priore
+{
+ /* when the priority is included in a menu, we dont want any border effect */
+ border: none;
+}
 
-.news {
-   display: block;
-   float: left;
-   width: 55%;
-   background-color: #ffe4b7;
+/**********************************************************************
+ *
+ * Very basic (mostly text) items:
+ *
+ **********************************************************************/
+
+body { 
+  margin-top: 0;
+  margin-left: 0;
+  margin-right: 0;
+  margin-bottom: 0;
+  font-family: arial,helvetica;
+  color: black;
+/*  background-color: #ffe4b7; */
+/*  background-color: #eae3d7; */
+  background-color: #ffffff;
 }
 
-/* End News*/
+a { text-decoration: underline; color: #641212;}
+a:hover { text-decoration: none; color: #c40f0f; }
+a:active { color: #ff0000; }
 
-/* Menu */
+.unavailable {
+       color: #905050;
+       text-decoration: none;
+}
+.unavailable:hover { 
+       color: #B07070;
+}
 
-.menu_search {
-   float: right;
-   margin-top: -100px;
-   margin-right: 10px;
+.footer {
+ color: #333333;
+/*  background-color: #CCBB88; */
+ background-color: #ffe4b7;
+ text-align: center;
+/*  border: solid #998855; */
+ border: solid #e0c080;
+ border-width: 0 thin thin 0;
+ margin-left: 1%;
+ margin-right: 1%;
 }
+.warn { color: #aa2200; }
+.error { font-weight: bold; color: #aa2200; }
+
+
+/* Titles */
 
-.menu_login {
-   float: right;
-   width: auto;
-   margin-top: -30px;
-   display: block;
-   margin-right: 10px;
-   font-size: small;
+/* <h1> Page title */
+h1 {
+       text-indent: 0.3em;
+}
+/* <h3> Section title */
+h3 {
+       text-indent: 1em;
+       border-bottom: thin solid #e0c080;
+       background-color: #fff0d0; 
+}
+/* <h4> Small section title */
+/* <h5> Input form label */
+h5 {
+       font-weight: normal;
+       background-color: #fff7ea; 
+       border: #ffe4b2 solid thin;
 }
 
-.menu_login form *, .menu_login dl *{
-   display: inline;
+.highlight  {  
+       background-color: #ffe0db;
+       border-left: thin dotted #e0c080;
+       border-right: thin dotted #e0c080;
+       border-bottom: thin dotted #e0c080;
+       color: #333333;
 }
 
-.menu_login dl dd {
-   margin: 0px;
+/**********************************************************************
+ *
+ * Alignement, main tables
+ *
+ **********************************************************************/
+
+.realbody { 
+       border-spacing: 0px;
+       border: none;
 }
 
-.menu_left {
-   margin-top: 0px;
-   width: 15%;
-   height: 300px;
-   background-color: #ffe4b7;
-   float: left;
-   margin: 4px;
-   border: thin dotted #E0C080;
-   padding: 10px;
+.main {
+       background-color: #ffffff; 
+/*     border-bottom: thin solid #333333;  */
+/*     border-top: thin solid #333333;   */
+/*     border-right: thin solid #333333; */
+       padding-top: 10px;
+       padding-left: 1%;
+       padding-right: 0;
+       margin-left: 160px;
+       margin-right: 0;
+        width: auto;
 }
 
-.menu_left ul {
-   margin: 0px;
-   margin-bottom: 10px;
+
+/* Our users and I don't like fixed feedback: 
+       yeupou, 2006-09-20:
+       But we wont deliver a theme upstream that breaks savane behavior
+       It is now possible to configure savane to have a non-fixed menu.
+       However, if a site-specific CSS still want to have a non-standard
+       behavior, I think this CSS should no longer be distributed along
+       with Savane (which is not really an issue).
+       For instance, we can rename this theme OldSavannah and you'll be
+       free to have another brand new Savannah theme tuned as you want
+       on your site. 
+
+       
+.feedback {
+       position: relative;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+}
+.feedbackerror {
+       position: relative;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+}
+.feedbackerrorandsuccess {
+       position: relative;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
 }
-.menu_left li {
-   list-style-type: none;
-   margin-left: -30px;
+.feedbackback {
+       position: relative;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
 }
+*/
+
 
-/* End Menu */
 
-/* Content */
+/**********************************************************************
+ *
+ * Menus
+ *
+ **********************************************************************/
 
-.content {
-   margin-left: 10px;
-   margin-top: 10px;
-   float: left;
-   width: 80%;
+.menu { 
+ background-color: #ffe4b7;
+ width: 150px;
+ padding: 5px;
+/*  border: thin dotted #e0c080; */
 }
 
-.error {
-   width: 80%;
-   margin: 5px;
-   background-color: red;
+.menu a { text-decoration: none; color: #641212;}
+.menu a:hover { text-decoration: underline; color: #c40f0f; }
+.menu a:active { color: #ff0000; }
+
+
+.menutitle {
+       font-weight: bold;
+       text-align: left;
+       color: #333333;
+       border-bottom: thin dotted #e0c080;
 }
 
-/* End Content*/
+.menuitem {
+       list-style-type: none;
+       text-align: right;
+       color: #333333;
+       border-bottom: thin dotted #e0c080;
+       padding-right : 3%;
+}
 
-/* Sections */
+.topmenu {
+       background-color: #f9e4a2;
+/* This is breaking the layout
+#      margin-left: 20px;
+       margin-left: 0;
+       margin-right: 0; 
+ */
+       border-left: thin solid #000000;
+       border-top: thin solid #000000;
+       border-bottom: thin solid #000000;
+       border-right: none;
+       width: auto;
+}
 
-.section {
-   width: 60%;
+
+.topmenutitle {
+       font-style: italic; 
+}
+
+
+ul.topmenuitemsubmenu li {
+       background-color: #ffeecc;
+       border: 1px dotted #E0C080;
+}
+
+li.topmenuitemsubmenu:hover {
+       text-decoration: underline;
+}
+
+/* we cannot keep it in bold, it makes an extra space with some konqueror
+  version (RHEL) */
+.tabselect { text-decoration: underline; color: #000000; /* font-weight: bold; 
*/ }
+.tabselect:hover { text-decoration: underline; /* font-weight: bold; */ }
+
+/**********************************************************************
+ *
+ * Boxes
+ *
+ **********************************************************************/
+
+.box { 
+       width: 98%;
+       margin-left: 1%;
+       margin-right: 1%; 
+}
+
+.boxtitle  {   
+       background-image: url("../images/Savannah.theme/leopard.png");
+       background-color: #eddb5a;
+       border: thin outset #641212;
+       color: #000000;
+}
+
+.boxitem  {
+       background-color: #fffbed;
+       border-left: thin dotted #e0c080;
+       border-right: thin dotted #e0c080;
+       border-bottom: thin dotted #e0c080;
+       color: #333333;
+       padding: 1%;
+}
+
+.boxitem a { text-decoration: none; color: #641212;}
+.boxitem a:hover { text-decoration: underline; color: #c40f0f; }
+.boxitem a:active { color: #ff0000; }
+
+.boxitemalt  { 
+       background-color: #ffeecc;
+       border-left: thin dotted #e0c080;
+       border-right: thin dotted #e0c080;
+       border-bottom: thin dotted #e0c080;
+       color: #333333;
+       padding: 1%;
+}
+
+.boxitemalt a { text-decoration: none; color: #641212;}
+.boxitemalt a:hover { text-decoration: underline; color: #c40f0f; }
+.boxitemalt a:active { color: #ff0000; }
+
+.boxhighlight  {       
+       background-color: #ffe0db;
+       border-left: thin dotted #e0c080;
+       border-right: thin dotted #e0c080;
+       border-bottom: thin dotted #e0c080;
+       color: #333333;
 }
 
-.section li {
-   display: inline;
-   margin-left: 10px;
-   border-top: medium groove #ffe4b7;
-   border-left: medium groove #ffe4b7;
+.boxoptions  { 
+       background-color: #ffeecc;
+       border: thin dotted #e0c080;
+       color: #333333;
 }
 
-/* End Sections */
 
-/* Menu User */
-.fast_menu_user {
-   float: right;
-   width: auto;
-   margin-top: -30px;
-   display: block;
-   margin-right: 10px;
-   font-size: small;
+/**********************************************************************
+ *
+ * Forms
+ *
+ **********************************************************************/
+
+input {
+       background-color: #fff9e0;
+       color: #841212;
+}
+input:hover { color: #ff0000; }
+select {
+       background-color: #fff9e0;
+       color: #841212;
+}
+
+/* select:hover { color: #ff0000; } */
+
+textarea {
+       background-color: #fff9e0;
+       color: #000000;
+}
+textarea:hover {
+       color: #ff0000;
+}
+
+div.inputfield {
+       margin: 10px 1px 10px 1px;
+}
+
+/* text before inputs */
+.preinput {
+       color: #727272;
+       font-style: italic;
 }
-/* End Menu User */
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index a5cac2e..aa178ea 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -1,135 +1,60 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html xmlns="http://www.w3.org/1999/xhtml"; lang="en-US.UTF-8" 
xml:lang="en-US.UTF-8">
+<html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     {% load i18n %}
     <title>
       {% block title %}{% if title %}{{ title }}{% else %}{% trans 'Welcome' 
%}{% endif %}
         [Savannah]{% endblock %}
     </title>
-    <meta name="Generator" content="Savane 3.1-cleanup, see 
http://savannah.nongnu.org/projects/savane-cleanup"; />
-    <meta http-equiv="Content-Script-Type" content="text/javascript" />
     <link rel="stylesheet" type="text/css" 
href="{{STATIC_MEDIA_URL}}savane/css/Savannah.css" />
     <link rel="icon" type="image/png" 
href="{{STATIC_MEDIA_URL}}savane/images/icon.png" />
   </head>
   <body>
-    <div class="main_menu">
-      <a href="/"><img src="{{STATIC_MEDIA_URL}}savane/images/floating.png" 
alt="Back to homepage" border="0" width="118" height="100" /></a>
-      <a href="TODO">Hosted Projects</a>
-      <a href="TODO">Help</a>
+    <div class="realbody">
+      <ul class="menu">
+        <!-- sitemenu -->
+        <li><a href="/"><img 
src="{{STATIC_MEDIA_URL}}savane/images/floating.png" alt="Back to homepage" 
border="0" width="118" height="100" /></a></li>
+        {% if user.is_authenticated %}
+          <li class="menutitle">Connected as {{ user.username}}</li>
+          <li class="menuitem"><a href="{% url savane.my.views.index %}">My 
account</a></li>
+          <li class="menuitem"><a href="{% url 
django.contrib.auth.views.logout %}">Logout</a></li>
+        {% else %}
+          <li class="menuitem"><a href="{% url django.contrib.auth.views.login 
%}">Login</a></li>
+        {% endif %}
+        <!-- /sitemenu -->
 
-      <div class="menu_search">
-        <form action="/search/#options" method="get" >
-          <input type="text" size="15" name="words" value="" />
-          <em>in</em>
-          <select name="type_of_search">
-            <option value="soft" selected="selected">Projects</option>
-            <option value="people">People</option>
-            <option value="cookbook">Cookbook</option>
-            <option value="support">Support</option>
-            <option value="bugs">Bugs</option>
-            <option value="task">Tasks</option>
-            <option value="patch">Patches</option>
-          </select>
-          <input type="submit" name="Search" value="Search" /><input 
type="hidden" name="exact" value="1" />
-        </form>
-      </div>
-    </div>
-    {% if user.is_authenticated %}
-    <div class="fast_menu_user">
-      Connected as <a href="{% url savane.my.views.index %}">
-        {{ user.username}}
-        {% if user.first_name or user.last_name %}({{ user.first_name }} {{ 
user.last_name }}) {% endif %}
-<!--      <a href="">Items</a> -->
-<!--      <a href="">Groups</a> -->
-      </a>
-      | <a href="{% url django.contrib.auth.views.logout %}">Logout</a>
-    </div>
-    {% else %}
-    <div class="menu_login">
-      <form action="{% url django.contrib.auth.views.login %}" 
method="post">{% csrf_token %}
-        <dl>
-          <dt>Login Name:</dt>
-          <dd><input type="text" name="username" value="" size="12" /></dd>
-          <dt>Password:</dt>
-          <dd><input type="password" name="password" size="12" /></dd>
-          <dd><input type="submit" name="login" value="Login" /></dd>
-        </dl>
-      </form>
-    </div>
-    {% endif %}
-    <div class="root">
-      <div class="body">
-        {% ifequal has_left_menu None %}
-        <div class="menu_left">
-          <strong>Site Help</strong>
-          <ul>
-            <li><a>User Docs: Cookbook</a></li>
-            <li><a>User Docs: In Depth Guide</a></li>
-            <li><a>Get Support</a></li>
-            <li><a href="{% url contact %}">Contact Us</a></li>
-            <li><a href="http://savannah.gnu.org/maintenance/CvsAnonymous";>CVS 
Instructions</a></li>
-            <li><a href="http://savannah.gnu.org/maintenance/FaQ";>FAQ</a></li>
-          </ul>
-          <strong>GNU Project</strong>
-          <ul>
-            <li><a href="http://www.gnu.org/help/help.html"; 
target="_blank">Help GNU</a></li>
-            <li><a href="http://www.gnu.org/directory/GNU"; target="_blank">All 
GNU Packages</a></li>
-            <li><a href="http://www.gnu.org/software/devel.html"; 
target="_blank">Dev Resources</a></li>
-            <li><a href="http://www.gnu.org/licenses/license-list.html"; 
target="_blank">License List</a></li>
-            <li><a href="http://www.gnu.org/prep/ftp.htm"; target="_blank">GNU 
Mirrors</a></li>
-          </ul>
-          <strong>Free Software Foundation</strong>
-          <ul>
-            <li><a href="http://www.fsf.org/events/"; target="_blank">Coming 
Events</a></li>
-            <li><a href="http://gplv3.fsf.org/"; target="_blank">GNU GPL 
v3</a></li>
-            <li><a href="http://www.fsf.org/directory/"; target="_blank">Free 
Software Directory</a></li>
-            <li><a 
href="http://savannah.gnu.org/maintenance/SavannahCryptographicRestrictions"; 
target="_blank">Cryptographic software legal notice</a></li>
-          </ul>
-        </div>
-        {% endifequal %}
+       <li class="menutitle">Site Help</li>
+        <li class="menuitem"><a href="{% url contact %}">Contact Us</a></li>
+      </ul>
+
+      <div class="main"><a name="top"></a>
+        <!-- pagemenu -->
+        <!-- /pagemenu -->
         <div class="content">
-          {% if error_msg %}
-          <div class="error">
-            {{ error_msg }}
-          </div>
-          {% endif %}
-          {% if success_msg %}
-          <div class="success">
-            {{ success_msg }}
-          </div>
-          {% endif %}
+        {% if messages %}
+        <ul class="messagelist">{% for message in messages %}<li>{{ message 
}}</li>{% endfor %}</ul>
+        {% endif %}
+
          <h1>{{ title }}</h1>
+
           {% block content %}
           {% endblock %}
         </div>
       </div>
     </div>
 
-    <!-- footer start here -->
-    <p class="footer">
-      <span style="float:right">
-        <a 
href="http://git.sv.gnu.org/gitweb/?p=savane-cleanup.git;a=blob;f=frontend/php/index.php";>Source<br
 />Code</a>
-      </span>
-
-      Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 
&nbsp;Free Software
-      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-      02110-1301, USA
-
-      <br />
+      </div><!-- end main -->
+      <br class="clear" />
+    </div><!-- end realbody -->
 
-      Verbatim copying and distribution of this entire article is
-      permitted in any medium, provided this notice is preserved.
-
-      <br />
-
-      The <a href="http://www.gnu.org/graphics/meditate.html";>Levitating,
-        Meditating, Flute-playing Gnu</a> logo is a GNU GPL'ed image provided
-      by the Nevrax Design Team.
+    <p class="footer">
+      <!-- footer -->
+      <!-- /footer -->
     </p>
 
     <div align="right">
-      <a href="http://savannah.nongnu.org/projects/savane-cleanup";>Powered by 
Savane 3.1-cleanup</a>
+      <a href="http://savannah.nongnu.org/projects/savane-cleanup";>Powered by 
Savane</a>
     </div>
     <!-- footer ends here -->
   </body>
diff --git a/templates/contact.html b/templates/contact.html
deleted file mode 100644
index 78c2ed2..0000000
--- a/templates/contact.html
+++ /dev/null
@@ -1,49 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-<h2>E-mail contact</h2>
-
-<p>
-  Note: If you need to get in touch with the developers of a
-  particular project hosted here, please <em>check the project's page</em>
-  (e.g. <code>/projects/myprojecname</code>) to find out the appropriate
-  way to contact them.
-</p>
-
-<p>
-  For general help with using the service, you can subscribe to
-  the <strong>users mailing lists</strong>
-  at <a 
href="http://lists.gnu.org/mailman/listinfo/savannah-users";>http://lists.gnu.org/mailman/listinfo/savannah-users</a>
-  and send mail
-  to <a href="mailto:address@hidden";>address@hidden</a> <span style="font-size:
-  smaller">(mails from non-members are accepted but moderated on a
-  daily basis)</span>.
-</p>
-
-<p>
-  If you are the developer of one of the projects hosted here and you
-  want to get in touch with the maintainers of this server (Savannah)
-  you can then contact the <strong>Savannah Hackers</strong> by submitting a
-  <a href="/support/?func=addsupport&amp;group=administration">[support 
request]</a>
-  or sending mail to <a href="mailto:address@hidden";>address@hidden</a>
-  (after checking the archives
-  at <a 
href="http://lists.gnu.org/archive/html/savannah-hackers/";>http://lists.gnu.org/archive/html/savannah-hackers/</a>)
-  - when you want to contact us about security or confidential issues,
-  you may also use the address@hidden list.
-</p>
-
-<p>
-  If you have found a bug in the Savane software (the software used
-  to run this server), or you would like to request a new feature, you
-  should use the Bugs system in <a 
href="http://gna.org/projects/savane";>Project Savane</a>.
-</p>
-
-{% endblock %}
-{% comment %}
-Local Variables: **
-mode: django-html **
-tab-width: 4 **
-indent-tabs-mode: nil **
-End: **
-{% endcomment %}
diff --git a/templates/index.html b/templates/index.html
index 782334c..44b40aa 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -1,159 +1,25 @@
 {%  extends "base.html" %}
 
 {% block content %}
-<p>
-  Welcome to <strong>Savannah</strong>, the software forge for people
-  committed to <a href="http://www.gnu.org/philosophy/free-sw.html";>Free 
Software</a>:
-</p>
-<p>
-  <ul>
-    <li>We host free projects that run on free operating systems and without 
any proprietary software dependencies</li>
-    <li>Our service runs with 100% free software, including <a 
href="/projects/savane-cleanup">itself</a></li>
-    <li><a 
href="http://savannah.gnu.org/maintenance/WhyChooseSavannah";>More...</a></li>
-  </ul>
-</p>
-<p>
-  Savannah aims to be a central point for development, maintenance and 
distribution of <a href="http://www.gnu.org/gnu/thegnuproject.html";>official 
GNU software</a>.  In additions, for projects that are free software but not 
part of the GNU project we provide <a 
href="http://savannah.nongnu.org/";>savannah.nongnu.org</a>.
-</p>
-<p>
-  If you would like to use these facilities to host your
-  project, then go to the <b>Register new project</b> menu entry.
-</p>
-<p>
-  We provide two mailing lists that you may want to subscribe to:
-  <ul>
-    <li><a 
href="http://lists.gnu.org/mailman/listinfo/savannah-announce";>savannah-announce</a>:
 low-volume notifications of important issues and changes at Savannah</li>
-    <li><a 
href="http://lists.gnu.org/mailman/listinfo/savannah-users";>savannah-users</a>: 
discussion of savannah-announce and any user-oriented topic</li>
-  </ul>
-</p>
+<div class="intro">
+<!-- intro -->
+Intro
+<!-- /intro -->
 </div>
 
 <div class="news">
-  <div>
-    <a href="/news/">Latest News</a>
-  </div>
-
-  <div>
-    <a href="/forum/forum.php?forum_id=5615"><strong>Mail 
issues</strong></a><br />
-    <span>
-      <em>posted by <a href="/users/Beuc">Beuc</a>, Tue 13 Jan 2009 09:27:20 
AM UTC - 0 replies</em>
-    </span>
-    <p>Due to a recent change in the GNU mail system, some of the mails could 
not be delivered between the 7th and the 12th. This is now fixed and handled 
differently so that the savannah and gnu mails won't lost sync again. <br />
-      Commit notifications sent to lists.gnu.org in that interval were lost.
-      <br />
-      Trackers notifications could be recovered and have been reinjected in 
the mail system - you should be receiving them.<br />
-    </p>
-  </div>
-
-  <div>
-    <a href="/forum/forum.php?forum_id=5613"><strong>Please report slow 
mirrors</strong></a><br />
-    <span>
-      <em>posted by <a href="/users/Beuc">Beuc</a>, Mon 12 Jan 2009 06:41:11 
AM UTC - 0 replies</em>
-    </span>
-    <p>Let us know if one of the download mirrors is slow! <br />
-    </p>
-    <p>Our tools allow us to check if a mirror is up-to-date, but can't check 
if it has bandwidth issues.  We'll retire slow mirrors and contact their 
maintainers to see if this can be improved.<br />
-    </p>
-  </div>
+<!-- news -->
+News
+<!-- /news -->
 </div>
 
-
-<div class="boxes">
-  <div class="box">
-    <div class="boxtitle">
-      <a href="/stats/">Savannah Statistics</a>
-    </div>
-    <div>
-      <span>
-       <strong>60502</strong> registered users</span>
-    </div>
-    <div>
-      <span><strong>3013</strong> hosted projects</span>
-    </div>
-    <div>
-      <span>- <a href="/search/?type_of_search=soft&amp;words=%%%&amp;type=4" 
class="center">10 GUG</a></span>
-    </div>
-    <div>
-      <span>- <a href="/search/?type_of_search=soft&amp;words=%%%&amp;type=2" 
class="center">2578 non-GNU software &amp; documentation</a></span>
-    </div>
-    <div>
-      <span>- <a href="/search/?type_of_search=soft&amp;words=%%%&amp;type=1" 
class="center">362 Official GNU software</a></span>
-    </div>
-    <div >
-      <span>- <a href="/search/?type_of_search=soft&amp;words=%%%&amp;type=3" 
class="center">31 www.gnu.org portion</a></span>
-    </div>
-    <div>
-      <span>- <a href="/search/?type_of_search=soft&amp;words=%%%&amp;type=6" 
class="center">32 www.gnu.org translation team</a></span>
-    </div>
-    <div >
-      <span>+ 88 registrations pending</span>
-    </div>
-  </div>
-
-  <div class="box">
-    <div class="boxtitle">Help Wanted</div>
-    <ul>
-      <li><span>- <a href="/people/?category_id=1">177 
Developer</a></span></li>
-      <li><span>- <a href="/people/?category_id=2">9 Project 
Manager</a></span></li>
-      <li><span>- <a href="/people/?category_id=3">1 Unix Admin</a></span></li>
-      <li><span>- <a href="/people/?category_id=4">48 Doc 
Writer</a></span></li>
-      <li><span>- <a href="/people/?category_id=5">30 Tester</a></span></li>
-      <li><span>- <a href="/people/?category_id=6">4 Support 
Manager</a></span></li>
-      <li><span>- <a href="/people/?category_id=7">28 Graphic/Other 
Designer</a></span></li>
-      <li><span>- <a href="/people/?category_id=8">28 
Translator</a></span></li>
-    </ul>
-
-  </div>
-
-  <div class="box">
-    <div class="boxtitle">
-      Newest non-GNU software &amp; documentation Projects
-    </div>
-    <div>
-      <span>- <a 
href="http://savannah.nongnu.org/projects/clanbomber/";>ClanBomber</a>, 
2009-01-13</span>
-    </div>
-    <div>
-      <span>- <a href="http://savannah.nongnu.org/projects/urip/";>URip</a>, 
2009-01-06</span>
-    </div>
-    <div>
-      <span>- <a 
href="http://savannah.nongnu.org/projects/espresso/";>espresso-mode</a>, 
2009-01-05</span>
-    </div>
-    <div>
-      <span>- <a 
href="http://savannah.nongnu.org/projects/leo-lookup/";>leo-lookup</a>, 
2009-01-02</span>
-    </div>
-    <div>
-      <span>- <a 
href="http://savannah.nongnu.org/projects/openpgp-sharp/";>OpenPGP Sharp</a>, 
2008-12-31</span>
-    </div>
-    <div>
-      <span>- <a href="http://savannah.nongnu.org/projects/libqtlua/";>QtLua 
script engine for Qt</a>, 2008-12-29</span>
-    </div>
-    <div>
-      <span>- <a 
href="http://savannah.nongnu.org/projects/tkresolver/";>TkResolver++</a>, 
2008-12-25</span>
-    </div>
-    <div>
-      <span><a 
href="/search/?type_of_search=soft&amp;words=%%%&amp;type=2">[all non-GNU 
software &amp; documentation projects]</a></span>
-    </div>
-  </div>
-  <div class="box">
-    <div class="boxtitle">Newest Official GNU software Projects</div>
-    <div>
-      <span>- <a href="http://savannah.gnu.org/projects/speedx/";>SpeedX</a>, 
2009-01-15</span>
-    </div>
-    <div>
-      <span>- <a href="http://savannah.gnu.org/projects/rush/";>GNU Rush</a>, 
2009-01-14</span>
-    </div>
-    <div>
-      <span>- <a href="http://savannah.gnu.org/projects/indent/";>GNU 
indent</a>, 2008-12-14</span>
-    </div>
-    <div>
-      <span>- <a href="http://savannah.gnu.org/projects/gdbm/";>GNU dbm</a>, 
2008-11-24</span>
-    </div>
-    <div>
-      <span><a 
href="/search/?type_of_search=soft&amp;words=%%%&amp;type=1">[all Official GNU 
software projects]</a></span>
-    </div>
-  </div>
+<div class="stats">
+<!-- stats -->
+Stats
+<!-- /stats -->
 </div>
 {% endblock %}
+
 {% comment %}
 Local Variables: **
 mode: django-html **
diff --git a/templates/my/conf.html b/templates/my/conf.html
index e7d8e8b..9ba4f1d 100644
--- a/templates/my/conf.html
+++ b/templates/my/conf.html
@@ -1,27 +1,14 @@
 {% extends "base.html" %}
 
 {% block content %}
-<ul class="section">
-  <li><a href="{% url savane.my.views.sv_conf %}">General 
Configuration</a></li>
-  <li><a href="{% url savane.my.views.sv_resume_skill %}">Resume &amp; 
Skill</a></li>
-  <li><a href="{% url savane.my.views.sv_ssh_gpg %}">SSH/GPG Keys</a></li>
-</ul>
-
 <div class="box">
   <div class="boxtitle">Change Password</div>
   <div class="boxitem">
     <form method="post">{% csrf_token %}
-      <dl>
-        {% for field in form_pass %}
-        {% if field.is_hidden %}
-        {{field}}
-        {% else %}
-        <dt>{{ field.label_tag }} {{ field.errors }}</dt>
-        <dd>{{ field }}</dd>
-        {% endif %}
-        {% endfor %}
-        <dd><input type="submit" value="Update" name="Update" /></dd>
-      </dl>
+      <table>
+      {{ form_pass.as_table }}
+      </table>
+      <input type="submit" value="Update" />
     </form>
   </div>
 </div>
@@ -30,19 +17,11 @@
   <div class="boxtitle">Change E-Mail</div>
   <div class="boxitem">
     <form method="post">{% csrf_token %}
-      <dl>
-        <dt>Current</dt>
-        <dd>{{ user.email }}</dd>
-        {% for field in form_mail %}
-        {% if field.is_hidden %}
-        {{field}}
-        {% else %}
-        <dt>{{ field.label_tag }} {{ field.errors }}</dt>
-        <dd>{{ field }}</dd>
-        {% endif %}
-        {% endfor %}
-        <dd><input type="submit" value="Update" name="Update" /></dd>
-      </dl>
+      <p>Current: {{ user.email }}</p>
+      <table>
+      {{ form_mail.as_table }}
+      </table>
+      <input type="submit" value="Update" />
     </form>
   </div>
 </div>
@@ -51,17 +30,10 @@
   <div class="boxtitle">Change Name</div>
   <div class="boxitem">
     <form method="post">{% csrf_token %}
-      <dl>
-        {% for field in form_identity %}
-        {% if field.is_hidden %}
-        {{field}}
-        {% else %}
-        <dt>{{ field.label_tag }} {{ field.errors }}</dt>
-        <dd>{{ field }}</dd>
-        {% endif %}
-        {% endfor %}
-        <dd><input type="submit" value="Update" name="Update" /></dd>
-      </dl>
+      <table>
+      {{ form_identity.as_table }}
+      </table>
+      <input type="submit" value="Update" />
     </form>
   </div>
 </div>
diff --git a/templates/my/index.html b/templates/my/index.html
index 4b11ab8..4e92899 100644
--- a/templates/my/index.html
+++ b/templates/my/index.html
@@ -2,9 +2,24 @@
 
 {% block content %}
 <p>
-  <a href="{% url savane.my.views.sv_conf %}">Account configuration</a>
-| <a href="{% url savane.my.group_list %}">My groups</a>
-| <a href="{% url savane.svmain.user_detail request.user.username %}">My 
public page</a>
+  <div style="float: left; margin: 10px;">
+    <p>Configure</p>
+
+    <p>
+      <a href="{% url savane.my.views.sv_conf %}">Authentication &amp; 
contact</a><br />
+      <a href="{% url savane.my.views.sv_ssh_gpg %}">SSH &amp; GPG</a><br />
+      <a href="{% url savane.my.views.sv_resume_skill %}">My resume &amp; 
skills</a><br />
+      <a href="{% url savane.my.group_list %}">My groups</a><br />
+    </p>
+  </div>
+
+  <div style="float: left; margin: 10px;">
+    <p>Public information</p>
+
+    <p>
+      <a href="{% url savane.svmain.user_detail request.user.username %}">My 
public page</a><br />
+    </p>
+  </div>
 </p>
 
 {% endblock %}
diff --git a/templates/my/resume_skill.html b/templates/my/resume_skill.html
index d03f78c..811905d 100644
--- a/templates/my/resume_skill.html
+++ b/templates/my/resume_skill.html
@@ -1,12 +1,8 @@
 {% extends "base.html" %}
 
 {% block content %}
-<ul class="section">
-  <li><a href="{% url savane.my.views.sv_conf %}">General 
Configuration</a></li>
-  <li><a href="{% url savane.my.views.sv_resume_skill %}">Resume &amp; 
Skill</a></li>
-  <li><a href="{% url savane.my.views.sv_ssh_gpg %}">SSH/GPG Keys</a></li>
-</ul>
 
+<p>To Be Implemented</p>
 
 {% endblock %}
 {% comment %}
diff --git a/templates/my/ssh_gpg.html b/templates/my/ssh_gpg.html
index 4d4f717..e5b2746 100644
--- a/templates/my/ssh_gpg.html
+++ b/templates/my/ssh_gpg.html
@@ -1,27 +1,25 @@
 {% extends "base.html" %}
 
 {% block content %}
-<ul class="section">
-  <li><a href="{% url savane.my.views.sv_conf %}">General 
Configuration</a></li>
-  <li><a href="{% url savane.my.views.sv_resume_skill %}">Resume &amp; 
Skill</a></li>
-  <li><a href="{% url savane.my.views.sv_ssh_gpg %}">SSH/GPG Keys</a></li>
-</ul>
-
-<h3>Working SSH Keys</h3>
+<h2>Working SSH Keys</h2>
 {% for key_pk,key in ssh_keys.items %}
 <li>
-  {{ key }}<br />
-  <a href="?action=delete_key&key_pk={{key_pk}}">Delete</a>
+  {{ key }}
+  <form action="delete/" method="POST">{% csrf_token %}
+    <input type="hidden" name="key_pk" value="{{key_pk}}" /><input 
type="submit" value="Delete"</input>
+  </form>
 </li>
+{% empty %}
+  No SSH keys yet.
 {% endfor %}
 
-<h3>SSH Keys</h3>
+<h2>SSH Keys</h2>
 <form method="post" enctype="multipart/form-data">{% csrf_token %}
   {{ form_ssh.as_p }}
   <br /><input type="submit" value="Add" name="Add" />
 </form>
 
-<h3>GPG Key</h3>
+<h2>GPG Key</h2>
 <form method="post">{% csrf_token %}
   {{ form_gpg.as_p }}
   <br /><input type="submit" value="Update" name="Update" />
diff --git a/templates/svmain/generic_confirm.html 
b/templates/svmain/generic_confirm.html
new file mode 100644
index 0000000..d94aa11
--- /dev/null
+++ b/templates/svmain/generic_confirm.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+{% trans 'Are you sure?' %}
+
+<form action="." method="POST">{% csrf_token %}
+  <input type="submit" value="{% trans 'Yes' %}" />
+</form>
+
+{% endblock %}
diff --git a/templates/svmain/text.html b/templates/svmain/text.html
new file mode 100644
index 0000000..09eb715
--- /dev/null
+++ b/templates/svmain/text.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+{{text}}
+
+{% endblock %}
+{% comment %}
+Local Variables: **
+mode: django-html **
+tab-width: 4 **
+indent-tabs-mode: nil **
+End: **
+{% endcomment %}

-----------------------------------------------------------------------

Summary of changes:
 .gitignore                            |    3 +
 INSTALL                               |    2 +
 TODO                                  |    5 +-
 annoying                              |    1 +
 savane/my/urls.py                     |    5 +-
 savane/my/views.py                    |   55 +-
 savane/svmain/urls.py                 |    5 +-
 static_media/savane/css/Savannah.css  | 1211 +++++++++++++++++++++++++++++----
 templates/base.html                   |  139 +---
 templates/contact.html                |   49 --
 templates/index.html                  |  158 +----
 templates/my/conf.html                |   54 +--
 templates/my/index.html               |   21 +-
 templates/my/resume_skill.html        |    6 +-
 templates/my/ssh_gpg.html             |   20 +-
 templates/svmain/generic_confirm.html |   12 +
 templates/svmain/text.html            |   14 +
 17 files changed, 1235 insertions(+), 525 deletions(-)
 create mode 120000 annoying
 delete mode 100644 templates/contact.html
 create mode 100644 templates/svmain/generic_confirm.html
 create mode 100644 templates/svmain/text.html


hooks/post-receive
-- 
Savane-cleanup framework



reply via email to

[Prev in Thread] Current Thread [Next in Thread]