changeset 787:a36cce722860 feature_14

Merge from branch "cannam"
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 18 Nov 2011 16:53:34 +0000
parents ae82810661da (current diff) 32d853e2e7ed (diff)
children 6300012e354e dc15818e132e b5e8049ded56
files
diffstat 20 files changed, 208 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/app/controllers/application_controller.rb	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/controllers/application_controller.rb	Fri Nov 18 16:53:34 2011 +0000
@@ -177,14 +177,14 @@
   def find_project
     @project = Project.find(params[:id])
   rescue ActiveRecord::RecordNotFound
-    render_404
+    User.current.logged? ? render_404 : require_login
   end
 
   # Find project of id params[:project_id]
   def find_project_by_project_id
     @project = Project.find(params[:project_id])
   rescue ActiveRecord::RecordNotFound
-    render_404
+    User.current.logged? ? render_404 : require_login
   end
 
   # Find a project based on params[:project_id]
--- a/app/helpers/repositories_helper.rb	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/helpers/repositories_helper.rb	Fri Nov 18 16:53:34 2011 +0000
@@ -281,4 +281,24 @@
                         ) +
                      '<br />' + l(:text_scm_path_encoding_note))
   end
+
+  # Generates a link to a downloadable archive for a revision
+  # Options:
+  # * :text - Link text (default to the formatted revision)
+  def link_to_revision_archive(repository, revision, project, options={})
+    method = repository.class.name.demodulize.underscore + "_link_to_revision_archive"
+    if repository.is_a?(Repository) &&
+        respond_to?(method) && method != 'link_to_revision_archive'
+      send(method, repository, revision, project, options)
+    end
+  end
+
+  def mercurial_link_to_revision_archive(repository, revision, project, options={})
+    text = options.delete(:text) || format_revision(revision)
+    rev = revision.respond_to?(:identifier) ? revision.identifier : revision
+    if rev.blank? then rev = 'tip' end
+    content_tag('a', h(text),
+        { :href => "/hg/#{project.identifier}/archive/#{rev}.zip" }.merge(options));
+  end
+
 end
--- a/app/views/account/register.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/views/account/register.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -29,9 +29,10 @@
 <p><label for="user_mail"><%=l(:field_mail)%> <span class="required">*</span></label>
 <%= text_field 'user', 'mail'  %></p>
 
+<!-- We only support English in this site 
 <p><label for="user_language"><%=l(:field_language)%></label>
 <%= select("user", "language", lang_options_for_select) %></p>
-
+-->
 
 <h3><%=l(:label_ssamr_details)%></h3>
 	
--- a/app/views/repositories/_navigation.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/views/repositories/_navigation.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -2,7 +2,7 @@
   <%= javascript_include_tag 'repository_navigation' %>
 <% end %>
 
-<%= link_to l(:label_statistics), {:action => 'stats', :id => @project}, :class => 'icon icon-stats' %>
+<%= link_to_revision_archive(@repository, @changeset, @project, { :text => l(:label_download_revision), :class => 'icon icon-package' }) %>
 
 <% form_tag({:action => controller.action_name, :id => @project, :path => to_path_param(@path), :rev => ''}, {:method => :get, :id => 'revision_selector'}) do -%>
   <!-- Branches Dropdown -->
@@ -19,3 +19,5 @@
   | <%= l(:label_revision) %>: 
   <%= text_field_tag 'rev', @rev, :size => 8 %>
 <% end -%>
+
+
--- a/app/views/repositories/revision.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/views/repositories/revision.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -1,11 +1,15 @@
 <div class="contextual">
+
+  <%= link_to_revision_archive(@repository, @changeset, @project, { :text => l(:label_download_revision), :class => 'icon icon-package' }) %>
+  &nbsp;&nbsp;
+
   &#171;
   <% unless @changeset.previous.nil? -%>
     <%= link_to_revision(@changeset.previous, @project, :text => l(:label_previous)) %>
   <% else -%>
     <%= l(:label_previous) %>
   <% end -%>
-|
+
   <% unless @changeset.next.nil? -%>
     <%= link_to_revision(@changeset.next, @project, :text => l(:label_next)) %>
   <% else -%>
@@ -21,6 +25,7 @@
     <%= text_field_tag 'rev', @rev, :size => 8 %>
     <%= submit_tag 'OK', :name => nil %>
   <% end %>
+
 </div>
 
 <h2><%= l(:label_revision) %> <%= format_revision(@changeset) %></h2>
--- a/app/views/repositories/show.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/app/views/repositories/show.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -51,9 +51,14 @@
                        :id => @project, :page => nil, :key => User.current.rss_key})) %>
 <%     end %>
 
+<p class="statistics">
+<%= link_to l(:label_statistics), {:action => 'stats', :id => @project}, :class => 'icon icon-stats' %>
+</p>
+
 <%     other_formats_links do |f| %>
   <%= f.link_to 'Atom', :url => {:action => 'revisions', :id => @project, :key => User.current.rss_key} %>
 <%     end %>
+
 <%   end %>
 <% end %>
 
--- a/config/locales/en.yml	Fri Nov 18 16:53:19 2011 +0000
+++ b/config/locales/en.yml	Fri Nov 18 16:53:34 2011 +0000
@@ -169,7 +169,7 @@
   notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}."
   notice_failed_to_save_members: "Failed to save member(s): %{errors}."
   notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-  notice_account_pending: "Your account was created and is now pending administrator approval."
+  notice_account_pending: "Your account is now awaiting administrator approval. You will receive a notification email when your account has been activated."
   notice_default_data_loaded: Default configuration successfully loaded.
   notice_unable_delete_version: Unable to delete version.
   notice_unable_delete_time_entry: Unable to delete time log entry.
@@ -698,6 +698,7 @@
   label_latest_revision_plural: Latest revisions
   label_view_revisions: View revisions
   label_view_all_revisions: View all revisions
+  label_download_revision: Download as Zip
   label_max_size: Maximum size
   label_sort_highest: Move to top
   label_sort_higher: Move up
--- a/extra/soundsoftware/SoundSoftware.pm	Fri Nov 18 16:53:19 2011 +0000
+++ b/extra/soundsoftware/SoundSoftware.pm	Fri Nov 18 16:53:34 2011 +0000
@@ -110,6 +110,11 @@
     req_override => OR_AUTHCFG,
     args_how => TAKE1,
   },
+  {
+    name => 'SoundSoftwareSslRequired',
+    req_override => OR_AUTHCFG,
+    args_how => TAKE1,
+  },
 );
 
 sub SoundSoftwareDSN { 
@@ -143,6 +148,8 @@
     }
 }
 
+sub SoundSoftwareSslRequired { set_val('SoundSoftwareSslRequired', @_); }
+
 sub trim {
     my $string = shift;
     $string =~ s/\s{2,}/ /g;
@@ -184,33 +191,80 @@
 
     my $project_id = get_project_identifier($dbh, $r);
 
-    if (!defined $read_only_methods{$method}) {
-        print STDERR "SoundSoftware.pm:$$: Method is not read-only\n";
-        if (project_repo_is_readonly($dbh, $project_id, $r)) {
-            print STDERR "SoundSoftware.pm:$$: Project repo is read-only, refusing access\n";
-	    return FORBIDDEN;
-        } else {
-	    print STDERR "SoundSoftware.pm:$$: Project repo is read-write, authentication handler required\n";
-            return OK;
-        }
-    }
+    # We want to delegate most of the work to the authentication
+    # handler (to ensure that user is asked to login even for 
+    # nonexistent projects -- so they can't tell whether a private
+    # project exists or not without authenticating). So 
+    # 
+    # * if the project is public
+    #   - if the method is read-only
+    #     + set handler to OK, no auth needed
+    #   - if the method is not read-only
+    #     + if the repo is read-only, return forbidden
+    #     + else require auth
+    # * if the project is not public or does not exist
+    #     + require auth
+    #
+    # If we are requiring auth and are not currently https, and
+    # https is required, then we must return a redirect to https
+    # instead of an OK.
 
     my $status = get_project_status($dbh, $project_id, $r);
+    my $readonly = project_repo_is_readonly($dbh, $project_id, $r);
 
     $dbh->disconnect();
     undef $dbh;
 
-    if ($status == 0) { # nonexistent
-	print STDERR "SoundSoftware.pm:$$: Project does not exist, refusing access\n";
-	return FORBIDDEN;
-    } elsif ($status == 1) { # public
-	print STDERR "SoundSoftware.pm:$$: Project is public, no restriction here\n";
-	$r->set_handlers(PerlAuthenHandler => [\&OK])
-    } else { # private
-	print STDERR "SoundSoftware.pm:$$: Project is private, authentication handler required\n";
+    my $auth_ssl_reqd = will_require_ssl_auth($r);
+
+    if ($status == 1) { # public
+
+	print STDERR "SoundSoftware.pm:$$: Project is public\n";
+
+	if (!defined $read_only_methods{$method}) {
+
+	    print STDERR "SoundSoftware.pm:$$: Method is not read-only\n";
+
+	    if ($readonly) {
+		print STDERR "SoundSoftware.pm:$$: Project repo is read-only, refusing access\n";
+		return FORBIDDEN;
+	    } else {
+		print STDERR "SoundSoftware.pm:$$: Project repo is read-write, auth required\n";
+		# fall through, this is the normal case
+	    }
+
+        } elsif ($auth_ssl_reqd and $r->unparsed_uri =~ m/cmd=branchmap/) {
+
+            # A hac^H^H^Hspecial case. We want to ensure we switch to
+            # https (if it will be necessarily for authentication) 
+            # before the first POST request, and this is what I think
+            # will give us suitable warning for Mercurial.
+
+            print STDERR "SoundSoftware.pm:$$: Switching to HTTPS in preparation\n";
+            # fall through, this is the normal case
+
+	} else {
+	    # Public project, read-only method -- this is the only
+	    # case we can decide for certain to accept in this function
+	    print STDERR "SoundSoftware.pm:$$: Method is read-only, no restriction here\n";
+	    $r->set_handlers(PerlAuthenHandler => [\&OK]);
+	    return OK;
+	}
+
+    } else { # status != 1, i.e. nonexistent or private -- equivalent here
+
+	print STDERR "SoundSoftware.pm:$$: Project is private or nonexistent, auth required\n";
+	# fall through
     }
 
-    return OK
+    if ($auth_ssl_reqd) {
+        my $redir_to = "https://" . $r->hostname() . $r->unparsed_uri();
+        print STDERR "SoundSoftware.pm:$$: Need to switch to HTTPS, redirecting to $redir_to\n";
+        $r->headers_out->add('Location' => $redir_to);
+        return REDIRECT;
+    } else {
+        return OK;
+    }
 }
 
 sub authen_handler {
@@ -237,6 +291,16 @@
     
     print STDERR "SoundSoftware.pm:$$: User is " . $r->user . ", got password\n";
 
+    my $status = get_project_status($dbh, $project_id, $r);
+    if ($status == 0) {
+	# nonexistent, behave like private project you aren't a member of
+	print STDERR "SoundSoftware.pm:$$: Project doesn't exist, not permitted\n";
+	$dbh->disconnect();
+	undef $dbh;
+	$r->note_auth_failure();
+	return AUTH_REQUIRED;
+    }
+
     my $permitted = is_permitted($dbh, $project_id, $r->user, $redmine_pass, $r);
     
     $dbh->disconnect();
@@ -279,6 +343,30 @@
     $ret;
 }
 
+sub will_require_ssl_auth {
+    my $r = shift;
+
+    my $cfg = Apache2::Module::get_config
+        (__PACKAGE__, $r->server, $r->per_dir_config);
+
+    if ($cfg->{SoundSoftwareSslRequired} eq "on") {
+        if ($r->dir_config('HTTPS') eq "on") {
+            # already have ssl
+            return 0;
+        } else {
+            # require ssl for auth, don't have it yet
+            return 1;
+        }
+    } elsif ($cfg->{SoundSoftwareSslRequired} eq "off") {
+        # don't require ssl for auth
+        return 0;
+    } else {
+        print STDERR "WARNING: SoundSoftware.pm:$$: SoundSoftwareSslRequired should be either 'on' or 'off'\n";
+        # this is safer
+        return 1;
+    }
+}
+
 sub project_repo_is_readonly {
     my $dbh = shift;
     my $project_id = shift;
@@ -368,6 +456,7 @@
 		}
 		$sthldap->finish();
 		undef $sthldap;
+                last if ($ret);
 	    }
 	} else {
 	    print STDERR "SoundSoftware.pm:$$: User $redmine_user lacks required role for this project\n";
@@ -383,14 +472,13 @@
 sub get_project_identifier {
     my $dbh = shift;
     my $r = shift;
-
     my $location = $r->location;
-    my ($repo) = $r->uri =~ m{$location/*([^/]+)};
+    my ($repo) = $r->uri =~ m{$location/*([^/]*)};
 
     return $repo if (!$repo);
 
     $repo =~ s/[^a-zA-Z0-9\._-]//g;
-
+    
     # The original Redmine.pm returns the string just calculated as
     # the project identifier.  That won't do for us -- we may have
     # (and in fact already do have, in our test instance) projects
@@ -410,7 +498,6 @@
 
     my $prefix = $cfg->{SoundSoftwareRepoPrefix};
     if (!defined $prefix) { $prefix = '%/'; }
-
     my $identifier = '';
 
     $sth->execute($prefix . $repo);
@@ -449,6 +536,18 @@
     # to project identifier if any are found
     if ($name =~ m/[^\w\d\s\._-]/) {
 	$name = $project_id;
+    } elsif ($name =~ m/^\s*$/) {
+	# empty or whitespace
+	$name = $project_id;
+    }
+    
+    if ($name =~ m/^\s*$/) {
+        # nothing even in $project_id -- probably a nonexistent project.
+        # use repo name instead (don't want to admit to user that project
+        # doesn't exist)
+        my $location = $r->location;
+        my ($repo) = $r->uri =~ m{$location/*([^/]*)};
+        $name = $repo;
     }
 
     my $realm = '"Mercurial repository for ' . "'$name'" . '"';
--- a/public/themes/soundsoftware/stylesheets/application.css	Fri Nov 18 16:53:19 2011 +0000
+++ b/public/themes/soundsoftware/stylesheets/application.css	Fri Nov 18 16:53:34 2011 +0000
@@ -134,6 +134,8 @@
 #footer { background-color: #fdfbf5; border: 0; border-top: 2px solid #a9b680; color: #3e442c; text-align: right; }
 #footer a { color: #be5700; font-weight: bold; }
 
+p.statistics { text-align: right; font-size:0.9em; color: #666; }
+
 #main { margin-top: 135px; font:95%; background: #fdfaf0; }
 #main a { font-weight: medium; color: #be5700;}
 #main a:hover { color: #be5700; text-decoration: underline; }
--- a/vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb	Fri Nov 18 16:53:34 2011 +0000
@@ -12,8 +12,12 @@
   def projects_check_box_tags(name, projects)
     s = ''
     projects.sort.each do |project|
-      s << "<label>#{ check_box_tag name, project.id, false } #{link_to_project project}</label>\n"
+      if User.current.allowed_to?(:edit_publication, project) 
+        s << "<label>#{ check_box_tag name, project.id, false } #{link_to_project project}</label>\n"
+        s << '<br />'
+      end
     end
+
     s 
   end
   
@@ -43,12 +47,12 @@
     f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)", :class => 'icon icon-del')
   end
     
-  def link_to_add_fields(name, f, association)
+  def link_to_add_author_fields(name, f, association, action)
     new_object = f.object.class.reflect_on_association(association).klass.new
     fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
       render(association.to_s.singularize + "_fields", :f => builder)
     end    
-    link_to_function(name, h("add_fields(this, '#{association}', '#{escape_javascript(fields)}')"), { :class => 'icon icon-add', :id => "add_another_author" })
+    link_to_function(name, h("add_author_fields(this, '#{association}', '#{escape_javascript(fields)}', '#{action}')"), { :class => 'icon icon-add', :id => "add_another_author" })
   end  
 
   def sanitized_object_name(object_name)
--- a/vendor/plugins/redmine_bibliography/app/views/projects/_bibliography_box.html.erb	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/projects/_bibliography_box.html.erb	Fri Nov 18 16:53:34 2011 +0000
@@ -7,18 +7,16 @@
    <dl>
      <% @project.publications.each do |publication| %>
      <dt>
-       <%= link_to publication.title, :controller => 'publications', :action => 'show', :id => publication, :project_id => @project %>
-     </dt>
-     <dd>
      <span class="authors">
-       <%= publication.authorships.map { |a| h a.name_on_paper }.join(', ') %>
+       <%= publication.authorships.map { |a| h a.name_on_paper }.join(', ') %><% if !publication.authorships.empty? %>.<% end %>
      </span>
+     <span class="title"><%= link_to publication.title, :controller => 'publications', :action => 'show', :id => publication, :project_id => @project %></span>
      <% if publication.bibtex_entry.year.to_s != "" %>
      <span class="year">
-       <%= publication.bibtex_entry.year %>
+       &nbsp;(<%= publication.bibtex_entry.year %>)
      </span>
      <% end %>
-     </dd>
+     </dt><dd></dd>
    <% end -%>
    </dl>
   </div>
--- a/vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -19,11 +19,11 @@
 
       <p style="margin-bottom: -2.5em; padding-bottom; 0"><label><%= l(:identify_author_question) %></label></p>
       <p class="author_identify">
-        <label class='inline'><%= radio_button_tag(:identify_author, "yes", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_yes ), :onclick => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_yes) %> </label><br />
+        <label class='inline'><%= radio_button_tag(:identify_author, "yes", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_yes ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_yes) %> </label><br />
        
-        <label class='inline'><%= radio_button_tag(:identify_author, "correct", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_corrections ), :onclick => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_correct) %> </label><br />
+        <label class='inline'><%= radio_button_tag(:identify_author, "correct", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_corrections ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_correct) %> </label><br />
         
-        <label class='inline'><%= radio_button_tag(:identify_author, "no", true, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_no ), :onclick => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_no) %> </label><br />
+        <label class='inline'><%= radio_button_tag(:identify_author, "no", true, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_no ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_no) %> </label><br />
       </p>
     </div>	
   
@@ -45,12 +45,11 @@
 
   <p>
 
-  <% if params[:action] == 'new' %>
-   <%= button_to_function l(:label_save_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
-  <% else %>
-<%= button_to_function l(:label_edit_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
-
- <% end %>
+  <%- if params[:action] == 'new' -%>
+    <%= button_to_function l(:label_save_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
+  <%- else -%>
+    <%= button_to_function l(:label_edit_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
+  <%- end -%>
 
 
   <%= link_to_remove_fields l("remove_author"), f %>
--- a/vendor/plugins/redmine_bibliography/app/views/publications/_form.html.erb	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_form.html.erb	Fri Nov 18 16:53:34 2011 +0000
@@ -24,7 +24,7 @@
     <% f.fields_for :authorships do |builder| -%>
       <%= render "authorship_fields", :f => builder %>
     <%- end -%>
-    <%= link_to_add_fields l(:label_add_an_author), f, :authorships %>
+    <%= link_to_add_author_fields l(:label_add_an_author), f, :authorships, params[:action] %>
   </div>
 </div>
 
--- a/vendor/plugins/redmine_bibliography/app/views/users/show.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/users/show.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -51,18 +51,17 @@
 
     <% @publications.each do |publication|%>    
       <dt>
-        <%= link_to publication.title, :controller => 'publications', :action => 'show', :id => publication %>
-      </dt>
-
-      <dd>
         <span class="authors">
-          <%= publication.authorships.map { |a| h a.name_on_paper }.join(', ') %>
+          <%= publication.authorships.map { |a| h a.name_on_paper }.join(', ') %><% if !publication.authorships.empty? %>.<% end %>
         </span>
+        <span class="title"><%= link_to publication.title, :controller => 'publications', :action => 'show', :id => publication %></span>
         <% if publication.bibtex_entry.year.to_s != "" %>
           <span class="year">
-            <%= publication.bibtex_entry.year %>
+            &nbsp;(<%= publication.bibtex_entry.year %>)
           </span>
         <% end %>
+      </dt>
+      <dd>
       </dd>
   	<% end %>
   </div>
--- a/vendor/plugins/redmine_bibliography/assets/javascripts/authors.js	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/assets/javascripts/authors.js	Fri Nov 18 16:53:34 2011 +0000
@@ -3,12 +3,15 @@
     $(link).up(".fields").hide();
 }
 
-function add_fields(link, association, content) {
-    var new_id = new Date().getTime();
-    var regexp = new RegExp("new_" + association, "g")
-    $(link).insert({
-	before: content.replace(regexp, new_id)
-    });
+function add_author_fields(link, association, content, action) {
+	var new_id = new Date().getTime();
+  var regexp = new RegExp("new_" + association, "g");
+  $(link).insert({
+		before: content.replace(regexp, new_id)
+  });
+	if(action != "new"){
+		toggle_save_author(new_id, $(link));
+	};
 }
 
 function identify_author_status(status, object_id) {
--- a/vendor/plugins/redmine_bibliography/assets/stylesheets/bibliography.css	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_bibliography/assets/stylesheets/bibliography.css	Fri Nov 18 16:53:34 2011 +0000
@@ -39,6 +39,7 @@
 div#bibliography dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
 div#bibliography .box dd { margin-bottom: 0.6em; padding-left: 0; }
 div#bibliography dd .authors { font-style: italic; }
+div#bibliography dt .title { font-style: italic; }
 div#bibliography dd span.authors { color: #808080; }
 div#bibliography dd span.year { padding-left: 0.6em; }
 
--- a/vendor/plugins/redmine_tags/app/views/projects/_filter_search_tags.html.erb	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_tags/app/views/projects/_filter_search_tags.html.erb	Fri Nov 18 16:53:34 2011 +0000
@@ -2,7 +2,7 @@
   <% fields_for @project, :builder => TabularFormBuilder do |f| -%>
     <div>
       <p id="project_tags">
-        <%= f.text_field :tag_list, :label => :tags, :size => 60, :class => 'hol' %>
+        <%= f.text_field :tag_list, :label => :label_tags_search, :size => 60, :class => 'hol' %>
       </p>
       <div id="project_tag_candidates" class="autocomplete"></div>
       <%= javascript_include_tag 'tags_input', :plugin => 'redmine_tags' %>
--- a/vendor/plugins/redmine_tags/app/views/projects/index.rhtml	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_tags/app/views/projects/index.rhtml	Fri Nov 18 16:53:34 2011 +0000
@@ -17,6 +17,11 @@
 <% end %>
 
 <div style="clear:both;"></div>
+<h2>
+  <%= l("label_project_all") %>
+</h2>
+
+<div style="clear:both;"></div>
 <% form_remote_tag(:controller => :projects, :action => :index, :method => :get, :html => {:id => :project_filtering_form}) do %>
 
 <% if @filter_status=="true" %>
@@ -44,11 +49,6 @@
   </fieldset>
 <% end %>
 
-<div style="clear:both;"></div>
-<h2>
-  <%= l("label_project_all") %>
-</h2>
-
 <div id="projects">
   <%= render :partial => 'filtered_projects' %>
 </div>
--- a/vendor/plugins/redmine_tags/assets/stylesheets/redmine_tags.css	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_tags/assets/stylesheets/redmine_tags.css	Fri Nov 18 16:53:34 2011 +0000
@@ -33,3 +33,5 @@
 div.tags .tag-nube-8 { font-size: 1.5em; }
 
 .tag-count { font-size: .75em; margin-left: .5em; }
+
+#project_tags label { padding-right: .5em; }
--- a/vendor/plugins/redmine_tags/config/locales/en.yml	Fri Nov 18 16:53:19 2011 +0000
+++ b/vendor/plugins/redmine_tags/config/locales/en.yml	Fri Nov 18 16:53:34 2011 +0000
@@ -23,6 +23,7 @@
   tags: Tags
   field_tags: Tags
   field_tag_list: Tags
+  label_tags_search: "Tags: "
   setting_issue_tags: Issues Tags
   issues_sidebar: Display tags on sidebar as
   issues_show_count: Display amount of issues