myexperiment-hackers
[Top][All Lists]
Advanced

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

[myexperiment-hackers] [3065] trunk: svn merge -r3043:3064 ^/branches/ve


From: noreply
Subject: [myexperiment-hackers] [3065] trunk: svn merge -r3043:3064 ^/branches/versions
Date: Tue, 31 Jul 2012 15:20:18 +0000 (UTC)

Revision
3065
Author
dgc
Date
2012-07-31 15:20:18 +0000 (Tue, 31 Jul 2012)

Log Message

svn merge -r3043:3064 ^/branches/versions

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/app/controllers/blobs_controller.rb (3064 => 3065)


--- trunk/app/controllers/blobs_controller.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/controllers/blobs_controller.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -7,21 +7,21 @@
 
   include ApplicationHelper
 
-  before_filter :login_required, :except => [:index, :show, :download, :named_download, :statistics, :search]
+  before_filter :login_required, :except => [:index, :show, :download, :named_download, :named_download_with_version, :statistics, :search]
   
   before_filter :find_blob_auth, :except => [:search, :index, :new, :create]
   
   before_filter :initiliase_empty_objects_for_new_pages, : [:new, :create]
   before_filter :set_sharing_mode_variables, : [:show, :new, :create, :edit, :update]
   
-  before_filter :check_is_owner, : [:edit, :update]
+  before_filter :check_is_owner, : [:edit, :update, :suggestions, :process_suggestions]
   
   # declare sweepers and which actions should invoke them
   cache_sweeper :blob_sweeper, : [ :create, :update, :destroy ]
   cache_sweeper :permission_sweeper, : [ :create, :update, :destroy ]
   cache_sweeper :bookmark_sweeper, : [ :destroy, :favourite, :favourite_delete ]
   cache_sweeper :tag_sweeper, : [ :create, :update, :tag, :destroy ]
-  cache_sweeper :download_viewing_sweeper, : [ :show, :download, :named_download ]
+  cache_sweeper :download_viewing_sweeper, : [ :show, :download, :named_download, :named_download_with_version ]
   cache_sweeper :comment_sweeper, : [ :comment, :comment_delete ]
   cache_sweeper :rating_sweeper, : [ :rate ]
   
@@ -36,7 +36,7 @@
       @download = Download.create(:contribution => @blob.contribution, :user => (logged_in? ? current_user : nil), :user_agent => request.env['HTTP_USER_AGENT'], :accessed_from_site => accessed_from_website?())
     end
     
-    send_data(@blob.content_blob.data, :filename => @blob.local_name, :type => @blob.content_type.mime_type)
+    send_data(@version.content_blob.data, :filename => @version.local_name, :type => @version.content_type.mime_type)
     
     #send_file("#{RAILS_ROOT}/#{controller_name}/address@hidden/address@hidden/address@hidden", :filename => @blob.local_name, :type => @blob.content_type.mime_type)
   end
@@ -52,6 +52,17 @@
     end
   end
 
+  # GET /files/:id/versions/:version/download/:name
+  def named_download_with_version
+
+    # check that we got the right filename for this workflow
+    if params[:name] == @version.local_name
+      download
+    else
+      render :nothing => true, :status => "404 Not Found"
+    end
+  end
+
   # GET /files
   def index
     respond_to do |format|
@@ -133,12 +144,8 @@
       @blob = Blob.new(params[:blob])
       @blob.content_blob = ContentBlob.new(:data ="" data)
 
-      @blob.content_type = ContentType.find_by_mime_type(content_type)
+      @blob.content_type = ContentType.find_or_create_by_mime_type(:user => current_user, :mime_type => content_type, :category=> 'Blob')
 
-      if @blob.content_type.nil?
-        @blob.content_type = ContentType.create(:user_id => current_user.id, :mime_type => content_type, :title => content_type, :category => 'Blob')
-      end
-
       respond_to do |format|
         if @blob.save
           if params[:blob][:tag_list]
@@ -156,8 +163,18 @@
           update_attributions(@blob, params)
         
           if policy_err_msg.blank?
-            flash[:notice] = 'File was successfully created.'
-            format.html { redirect_to blob_url(@blob) }
+
+            @version = @blob.find_version(1)
+
+            format.html {
+              if @version.suggestions?
+                redirect_to(blob_version_suggestions_path(@blob, @version.version))
+              else
+                flash[:notice] = 'File was successfully created.'
+                  redirect_to blob_url(@blob)
+              end
+            }
+
           else
             flash[:notice] = "File was successfully created. However some problems occurred, please see these below.</br></br><span style='color: red;'>" + policy_err_msg + "</span>"
             format.html { redirect_to :controller => 'blobs', :id => @blob, :action ="" "edit" }
@@ -186,8 +203,14 @@
     
     params[:blob][:license_id] = nil if params[:blob][:license_id] && params[:blob][:license_id] == "0"
 
-    # 'Data' (ie: the actual file) cannot be updated!
-    params[:blob].delete('data') if params[:blob][:data]
+    # Create a new content blob entry if new data is provided.
+    if params[:blob][:data] && params[:blob][:data].size > 0
+      @blob.build_content_blob(:data ="" params[:blob][:data].read)
+      @blob.local_name = params[:blob][:data].original_filename
+      @blob.content_type = ContentType.find_or_create_by_mime_type(:user => current_user, :title => params[:blob][:data].content_type, :mime_type => params[:blob][:data].content_type, :category => 'Blob')
+    end
+
+    params[:blob].delete(:data)
     
     respond_to do |format|
       if @blob.update_attributes(params[:blob])
@@ -199,8 +222,21 @@
         update_layout(@blob, params[:layout])
         
         if policy_err_msg.blank?
-          flash[:notice] = 'File was successfully updated.'
-          format.html { redirect_to blob_url(@blob) }
+          format.html {
+
+            if @blob.new_version_number
+              @version = @blob.find_version(@blob.new_version_number)
+            else
+              @version.reload
+            end
+
+            if @version.suggestions?
+              redirect_to(blob_version_suggestions_path(@blob, @version.version))
+            else
+              flash[:notice] = 'File was successfully updated.'
+              redirect_to blob_url(@blob)
+            end
+          }
         else
           flash[:error] = policy_err_msg
           format.html { redirect_to :controller => 'blobs', :id => @blob, :action ="" "edit" }
@@ -289,6 +325,31 @@
     end
   end
   
+  # GET /files/1/versions/1/suggestions
+  def suggestions
+    @suggestions = @version.suggestions
+  end
+
+  # POST /files/1/versions/1/process_suggestions
+  def process_suggestions
+
+    @version.revision_comments = params[:revision_comments] if params[:revision_comments]
+    @version.body = params[:description] if params[:description]
+
+    success = @version.save
+
+    respond_to do |format|
+      format.html {
+        if success
+          flash[:notice] = 'File was successfully updated.'
+          redirect_to blob_version_path(@blob, @version.version)
+        else
+          render :action ="" "suggestions"  
+        end
+      }
+    end
+  end
+
   protected
   
   def find_blob_auth
@@ -298,14 +359,21 @@
       if Authorization.is_authorized?(action_name, nil, blob, current_user)
         @blob = blob
         
+        if params[:version]
+          @version = @blob.find_version(params[:version])
+        else
+          @version = @blob.versions.last
+        end
+
         @blob_entry_url = url_for : false,
                             :host => base_host,
                             :id => @blob.id
 
-        @named_download_url = url_for :controller => 'files',
-                                      :action ="" 'named_download',
+        @named_download_url = url_for :controller => 'blobs',
+                                      :action ="" 'named_download_with_version',
                                       :id => @blob.id, 
-                                      :name => @blob.local_name
+                                      :version => @version.version, 
+                                      :name => @version.local_name
 
       else
         if logged_in? 

Modified: trunk/app/controllers/workflows_controller.rb (3064 => 3065)


--- trunk/app/controllers/workflows_controller.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/controllers/workflows_controller.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -445,9 +445,12 @@
     if @workflow.valid?
       # Save content blob first now and set it on the workflow.
       # TODO: wrap this in a transaction!
-      @workflow.content_blob_id = ContentBlob.create(:data ="" file.read).id
-      if @workflow.save_as_new_version(params[:new_workflow][:rev_comments])
+      @workflow.content_blob = ContentBlob.create(:data ="" file.read)
+      @workflow.preview = nil
+      @workflow[:revision_comments] = params[:new_workflow][:rev_comments]
 
+      if @workflow.save
+
         # Extract workflow metadata using a Workflow object that includes the
         # newly created version.
 
@@ -509,7 +512,7 @@
     respond_to do |format|
       # Here we assume that no actual workflow metadata is being updated that affects workflow versions,
       # so we need to prevent the timestamping update of workflow version objects.
-      Workflow.versioned_class.record_timestamps = false
+      Workflow.record_timestamps = false
       
       if @workflow.update_attributes(params[:workflow])
 
@@ -536,49 +539,40 @@
         format.html { render :action ="" "edit" }
       end
       
-      Workflow.versioned_class.record_timestamps = true
+      Workflow.record_timestamps = true
     end
   end
   
   # PUT /workflows/1;update_version
   def update_version
-    workflow_title = @workflow.title
-    
+
+    success = false
+
     if params[:version]
-      # Update differently based on whether a new preview image has been specified or not:
-      # (But only set image if platform is not windows).
-      if params[:workflow][:preview].blank? || params[:workflow][:preview].size == 0
-        success = @workflow.update_version(params[:version], 
-                                           :title => params[:workflow][:title], 
-                                           :body => params[:workflow][:body],
-                                           :last_edited_by => current_user.id) 
-      else
-        logger.debug("Preview image provided. Attempting to set the version's preview image.")
-        
-        # Disable updating image on windows due to issues to do with file locking, that prevent file_column from working sometimes.
-        #
-        # The dependency on file_column has been removed, but this code remains
-        # disabled on Windows until it is confirmed as working.
-        if RUBY_PLATFORM =~ /mswin32/
-          success = false
-        else
-          success = @workflow.update_version(params[:version], 
-                                             :title => params[:workflow][:title], 
-                                             :body => params[:workflow][:body], 
-                                             :image => params[:workflow][:preview].read,
-                                             :last_edited_by => current_user.id)
-        end
-      end
-    else
-      success = false
+
+      original_title = @workflow.title
+      version        = @workflow.find_version(params[:version])
+      do_preview     = !params[:workflow][:preview].blank? && params[:workflow][:preview].size > 0
+      
+      attributes_to_update = {
+        :title          => params[:workflow][:title], 
+        :body           => params[:workflow][:body],
+        :last_edited_by => current_user.id
+      }
+
+      # only set the preview to update if one was provided
+
+      attributes_to_update[:image] = params[:workflow][:preview] if do_preview
+
+      success = version.update_attributes(attributes_to_update)
     end
-    
+
     respond_to do |format|
       if success
-        flash[:notice] = "Workflow version #{params[:version]}: \"#{workflow_title}\" has been updated."
+        flash[:notice] = "Workflow version #{version.version}: \"#{original_title}\" has been updated."
         format.html { redirect_to(workflow_url(@workflow) + "?version=#{params[:version]}") }
       else
-        flash[:error] = "Failed to update Workflow version."
+        flash[:error] = "Failed to update Workflow."
         if params[:version]
           format.html { render :action ="" :edit_version }
         else

Modified: trunk/app/models/blob.rb (3064 => 3065)


--- trunk/app/models/blob.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/blob.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -25,6 +25,13 @@
   acts_as_attributor
   acts_as_attributable
   
+  has_versions :blob_versions,
+
+    :attributes => [ :title, :body, :body_html, :content_type, :content_blob,
+                     :local_name ],
+
+    :mutable => [ :title, :body, :body_html ]
+
   acts_as_solr(:fields => [:title, :local_name, :body, :kind, :uploader, :tag_list],
                :boost => "rank",
                :include => [ :comments ]) if Conf.solr_enable

Copied: trunk/app/models/blob_version.rb (from rev 3064, branches/versions/app/models/blob_version.rb) (0 => 3065)


--- trunk/app/models/blob_version.rb	                        (rev 0)
+++ trunk/app/models/blob_version.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,30 @@
+# myExperiment: app/models/blob_versions.rb
+#
+# Copyright (c) 2012 University of Manchester and the University of Southampton.
+# See license.txt for details.
+
+class BlobVersion < ActiveRecord::Base
+
+  is_version_of :blob
+
+  format_attribute :body
+
+  belongs_to :content_blob, :dependent => :destroy
+  belongs_to :content_type
+
+  validates_presence_of :content_blob
+  validates_presence_of :content_type
+  validates_presence_of :title
+
+  def suggestions
+    {
+      :revision_comments => version > 1 && (revision_comments.nil? || revision_comments.empty?),
+      :description => body.nil? || body.empty?
+    }
+  end
+
+  def suggestions?
+    suggestions.select do |k, v| v end.length > 0
+  end
+end
+

Modified: trunk/app/models/preview.rb (3064 => 3065)


--- trunk/app/models/preview.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/preview.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -7,13 +7,17 @@
 
   PREFIX = "tmp/previews"
 
+  after_save :clear_cache
+
   belongs_to :image_blob, :class_name  => "ContentBlob",
                           :foreign_key => :image_blob_id,
-                          :dependent   => :destroy
+                          :dependent   => :destroy,
+                          :autosave    => true
 
   belongs_to :svg_blob,   :class_name  => "ContentBlob",
                           :foreign_key => :svg_blob_id,
-                          :dependent   => :destroy
+                          :dependent   => :destroy,
+                          :autosave    => true
 
   def file_name(type)
     "#{PREFIX}/#{id}/#{type}"

Modified: trunk/app/models/topic_run.rb (3064 => 3065)


--- trunk/app/models/topic_run.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/topic_run.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -6,7 +6,6 @@
 require 'acts_as_creditable'
 require 'acts_as_attributor'
 require 'acts_as_attributable'
-require 'explicit_versioning'
 require 'acts_as_reviewable'
 require 'acts_as_runnable'
 

Modified: trunk/app/models/topic_tag_map.rb (3064 => 3065)


--- trunk/app/models/topic_tag_map.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/topic_tag_map.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -3,7 +3,6 @@
 require 'acts_as_creditable'
 require 'acts_as_attributor'
 require 'acts_as_attributable'
-require 'explicit_versioning'
 require 'acts_as_reviewable'
 require 'acts_as_runnable'
 
@@ -26,4 +25,4 @@
 	  :all,
 	  :order => 'topic_tag_map.probability DESC')
   end
-end
\ No newline at end of file
+end

Modified: trunk/app/models/topic_workflow_map.rb (3064 => 3065)


--- trunk/app/models/topic_workflow_map.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/topic_workflow_map.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -3,7 +3,6 @@
 require 'acts_as_creditable'
 require 'acts_as_attributor'
 require 'acts_as_attributable'
-require 'explicit_versioning'
 require 'acts_as_reviewable'
 require 'acts_as_runnable'
 
@@ -18,4 +17,4 @@
   
   belongs_to :workflow
   validates_presence_of :workflow
-end
\ No newline at end of file
+end

Modified: trunk/app/models/workflow.rb (3064 => 3065)


--- trunk/app/models/workflow.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/workflow.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -8,7 +8,6 @@
 require 'acts_as_creditable'
 require 'acts_as_attributor'
 require 'acts_as_attributable'
-require 'explicit_versioning'
 require 'acts_as_reviewable'
 require 'acts_as_runnable'
 require 'lib/previews'
@@ -49,47 +48,15 @@
 
   has_previews
 
-  explicit_versioning(:version_column => "current_version",
-                      :extra_attributes => ["image", "svg"],
-                      :white_list_columns => ["body"]) do
-    
-    format_attribute :body
+  has_versions :workflow_versions,
+  
+    :attributes => [ :contributor, :title, :unique_name, :body, :body_html,
+                     :content_blob_id, :file_ext, :last_edited_by,
+                     :content_type_id, :preview_id, :image, :svg ],
 
-    belongs_to :content_blob, :dependent => :destroy
-    belongs_to :content_type
+    :mutable => [ :contributor, :title, :unique_name, :body, :body_html,
+                  :file_ext, :last_edited_by, :content_type_id, :image, :svg ]
 
-    validates_presence_of :content_blob
-    validates_presence_of :content_type
-    
-    # Update the parent contribution model buy only if this isn't the current version (because the workflow model will take care of that).
-    # This is required to keep the contribution's updated_at field accurate.
-    after_save { |wv| wv.workflow.contribution.save if wv.workflow.contribution && wv.version != wv.workflow.current_version }
-
-    has_previews
-
-    def components
-      if workflow.processor_class
-        workflow.processor_class.new(content_blob.data).get_components
-      else
-        XML::Node.new('components')
-      end
-    end
-
-    def processor_class
-      if self.content_type
-          @processor_class ||= WorkflowTypesHandler.processor_class_for_type_display_name(self.content_type.title)
-      end
-    end
-
-    def display_data_format
-      klass = self.processor_class
-      @display_data_format = (klass.nil? ? self.file_ext : klass.display_data_format)
-    end
-
-  end
-  
-  non_versioned_columns.push("license_id", "tag_list", "preview_id")
-  
   acts_as_solr(:fields => [ :title, :body, :tag_list, :contributor_name, :kind, :get_all_search_terms ],
                :boost => "rank",
                :include => [ :comments ]) if Conf.solr_enable

Modified: trunk/app/models/workflow_sweeper.rb (3064 => 3065)


--- trunk/app/models/workflow_sweeper.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/models/workflow_sweeper.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -15,7 +15,7 @@
   end
 
   def after_update(workflow)
-    expire_sidebar_assets(workflow.contribution.contributor_id) if workflow.contribution.contributor_type == 'User'
+    expire_sidebar_assets(workflow.contributor_id) if workflow.contributor_type == 'User'
     expire_multiple_sidebar_favourites(workflow.id, 'Workflow')
     expire_listing(workflow.id, 'Workflow')
     expire_home_cache

Copied: trunk/app/models/workflow_version.rb (from rev 3064, branches/versions/app/models/workflow_version.rb) (0 => 3065)


--- trunk/app/models/workflow_version.rb	                        (rev 0)
+++ trunk/app/models/workflow_version.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,44 @@
+# myExperiment: app/models/workflow_version.rb
+#
+# Copyright (c) 2012 University of Manchester and the University of Southampton.
+# See license.txt for details.
+
+class WorkflowVersion < ActiveRecord::Base
+
+  is_version_of :workflow
+
+  format_attribute :body
+
+  belongs_to :content_blob, :dependent => :destroy
+  belongs_to :content_type
+
+  validates_presence_of :content_blob
+  validates_presence_of :content_type
+  
+  # Update the parent contribution model buy only if this isn't the current version (because the workflow model will take care of that).
+  # This is required to keep the contribution's updated_at field accurate.
+  after_save { |wv| wv.workflow.contribution.save if wv.workflow.contribution && wv.version != wv.workflow.current_version }
+
+  has_previews
+
+  def components
+    if workflow.processor_class
+      workflow.processor_class.new(content_blob.data).get_components
+    else
+      XML::Node.new('components')
+    end
+  end
+
+  def processor_class
+    if self.content_type
+        @processor_class ||= WorkflowTypesHandler.processor_class_for_type_display_name(self.content_type.title)
+    end
+  end
+
+  def display_data_format
+    klass = self.processor_class
+    @display_data_format = (klass.nil? ? self.file_ext : klass.display_data_format)
+  end
+
+end
+

Modified: trunk/app/views/blobs/_breadcrumbs.rhtml (3064 => 3065)


--- trunk/app/views/blobs/_breadcrumbs.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/blobs/_breadcrumbs.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,6 +1,6 @@
 <li><%= link_to 'Files', blobs_path -%></li>
 
-<% if ["show", "new", "edit", "all", "search"].include? controller.action_name.to_s -%>
+<% if ["show", "new", "edit", "all", "search", "suggestions"].include? controller.action_name.to_s -%>
   <li>&gt;</li>
   
   <% case controller.action_name.to_s; when "show" -%>
@@ -15,6 +15,10 @@
     <li>All Files</li>
 	<% when "search" %>  
     <li>Search Results</li>
+	<% when "suggestions" %>  
+		<li><%= link_to "#{contributable_name(@blob.id, 'Blob')}", blob_path(@blob) -%></li>
+		<li>&gt;</li>
+    <li>Suggestions</li>
   <% else %>
     <!-- no breadcrumb -->
   <% end %>

Modified: trunk/app/views/blobs/edit.rhtml (3064 => 3065)


--- trunk/app/views/blobs/edit.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/blobs/edit.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -7,8 +7,18 @@
 
 <%= error_messages_for :blob %>
 
-<% form_for(:blob, :url ="" blob_path(@blob), :html => { :method => :put }) do |f| %>
+<% form_for(:blob, :url ="" blob_path(@blob), :html => { :method => :put, :multipart => true }) do |f| %>
 
+  <div style="text-align: center;">
+    <div>
+      <strong>File to upload: </strong>
+      <%= file_field :blob, :data %>
+    </div>
+    <div><small><em>Leave this field blank unless you want to replace the file content</em></small></div>
+  </div>
+  
+  <br/>
+  
   <p style="text-align: center;">
   	<strong>Title: </strong>
 	<br/>

Modified: trunk/app/views/blobs/show.rhtml (3064 => 3065)


--- trunk/app/views/blobs/show.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/blobs/show.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -31,12 +31,13 @@
 	|
 	<%= link_to "Favourited By (address@hidden)", "#favourited_by" %>
 	| 
+  <br/>
+  |
+  <%= link_to("Version History", "#version_history") -%>
+  |
 	<% if logged_in? and @blob.owner?(current_user) %>
-	  <br/>
+	  <a href=""
 	  |
-		<!-- NB! Index of the 'sharing' tab might change! -->
-	  <a href="" 
-	  |
 	<% end %>
 	<%= link_to "Comments (address@hidden)", "#comments" %> 
 	|
@@ -44,20 +45,23 @@
 
 <div class="contribution_left_box">
 	<div class="contribution_version_box">
-		<div class="contribution_version_inner_box">
+
+    <%= render(:partial => "contributions/version_selector", :locals => { :resource => @blob, :version => @version, :path => :blob_version_path }) %>
+
+    <div class="contribution_version_inner_box">
 			<p>
 			    <b>Title:</b>
-			    <span class="title"><%=h @blob.title %></span>
+			    <span class="title"><%=h @version.title %></span>
 			</p>
 			
 			<p>
 			    <b>File name:</b>
-			    <%=h @blob.local_name %>
+			    <%=h @version.local_name %>
 			</p>
 			
 			<p>
 			    <b>File type:</b>
-			    <%=h @blob.content_type.title %>
+			    <%=h @version.content_type.title %>
 			</p>
 			
 			<br/>
@@ -67,9 +71,9 @@
 				Description
 			</h3>
 			
-			<% unless @blob.body.blank? %>
+			<% unless @version.body.blank? %>
 				<div class="contribution_description">
-					<%= @blob.body_html %>
+					<%= @version.body_html %>
 				</div>
 			<% else %>
 				<p class="none_text">
@@ -136,14 +140,22 @@
 <br/>
 
 <div id="tabsContainer" class="tabsContainer"></div>
-	
+
+<div class="tabContainer">
+  <div class="tabTitle">Version History</div>
+  <div class="tabContent">
+    <a name="version_history"></a>
+    <%= render :partial => "contributions/versions", :locals => { :resource => @blob, :path => :blob_version_path } %>
+  </div>
+</div>
+
 <% if logged_in? and @blob.owner? current_user %>
   
-	<a name="sharing"></a>
 	<div class="tabContainer">
     <div class="tabTitle">Sharing</div>
     <div class="tabContent">
 
+      <a name="sharing"></a>
       <%= render :partial => "contributions/sharing_summary",  :locals => { :contributable => @blob } %>
       <%= render :partial => "contributions/updating_summary", :locals => { :contributable => @blob } %>
 	  

Modified: trunk/app/views/contributions/_citations_tab.rhtml (3064 => 3065)


--- trunk/app/views/contributions/_citations_tab.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/contributions/_citations_tab.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -2,6 +2,7 @@
   <div class="tabTitle">Citations (<%= item.citations.length -%>)</div>
   <div class="tabContent">
 
+    <a name="citations"></a>
     <% unless (citations = item.citations).empty? %>
       <% citations.each_index do |i| %>
         <p>

Modified: trunk/app/views/contributions/_statistics_box.rhtml (3064 => 3065)


--- trunk/app/views/contributions/_statistics_box.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/contributions/_statistics_box.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -42,9 +42,7 @@
 				
 				<% if allow_citations? type %>
 					<p>
-			      <!-- for this to work properly, view for every resource that supports citations will need to have -->
-						<!-- tab system with 'tabsContainer' element + anchor called 'citations' -->
-						<a href=""  pluralize contributable.citations.count, "citation" %></a>
+						<a href="" pluralize contributable.citations.count, "citation" %></a>
 			    </p>
 				<% end %>
 				

Copied: trunk/app/views/contributions/_version_selector.rhtml (from rev 3064, branches/versions/app/views/contributions/_version_selector.rhtml) (0 => 3065)


--- trunk/app/views/contributions/_version_selector.rhtml	                        (rev 0)
+++ trunk/app/views/contributions/_version_selector.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,71 @@
+<script type="text/_javascript_">
+  function showVersion(form) {
+    var url = ""
+		location.href = ""
+		form.submit
+  }
+</script>
+
+<div class="contribution_version_selector_box">
+
+  <table>
+    <tbody>
+      <tr>
+        <td class="heading" style="vertical-align: top;">
+          <%= info_icon_with_tooltip("This box shows version #{version.version.to_s} for this entry") -%>
+          <span><%= "Version #{version.version.to_s} #{resource.describe_version(version.version)}" -%></span>
+          <span class="count_text">(of <%= resource.versions.length -%>)</span>
+          <a name="versions"></a>
+        </td>
+        <td>
+          <% if resource.versions.length > 1 %>
+             <form  return false;" style="text-align: right;">
+              <b>View version: </b>
+              <select id="resource_versions" 
+                <% resource.versions.reverse.each do |v| %>
+                  <option value="<%= send(path, resource, v.version.to_s) %>" <%= "selected" if v.version == version.version -%>>
+                      <%= "#{v.version.to_s} #{resource.describe_version(v.version)}" %>
+                  </option>
+                <% end %>
+              </select>
+            </form>
+          <% end %>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+      
+  <div id="version_info_box" style="color: #666666;  font-size: 85%; margin: 0.6em 0.5em 0.2em 0.5em; border-top: 1px solid #DDDDDD; padding-top: 0.4em;">
+    <p style="text-align: center;">
+      <b>Version created on:</b>
+      <span><%= datetime version.created_at, false %></span>
+      <% if version.respond_to?(:contributor_id) && version.respond_to?(:contributor_type) %>
+        <b>by:</b>
+        <span><%= contributor(version.contributor_id, version.contributor_type) %></span>
+      <% end %>
+      <% if !version.revision_comments.blank? %>
+        <span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
+        <span><%= link_to_function "Revision comment " + expand_image, visual_effect(:toggle_blind, "version_info_box_comments", :duration => 0.3) %></span>
+      <% end %>
+    </p>
+    
+    <% unless version.created_at == version.updated_at %>
+      <p style="text-align: center;">
+        <b>Last edited on:</b>
+        <span><%= datetime version.updated_at, false %></span>
+        <% if version.respond_to?(:last_edited_by) %>
+          <b>by:</b>
+          <span><%= contributor(version.last_edited_by, "User") %></span>
+        <% end %>
+      </p>
+    <% end %>
+  </div>
+  
+  <% if !version.revision_comments.blank? -%>
+    <div id="version_info_box_comments" style="display: none; border: 1px dotted #CCCCCC; padding: 0.3em 0.5em;">
+      <%= white_list version.revision_comments %>
+    </div>
+  <% end %>
+
+</div>
+

Copied: trunk/app/views/contributions/_versions.rhtml (from rev 3064, branches/versions/app/views/contributions/_versions.rhtml) (0 => 3065)


--- trunk/app/views/contributions/_versions.rhtml	                        (rev 0)
+++ trunk/app/views/contributions/_versions.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,41 @@
+<p>In chronological order:</p>
+
+<ol class="version_history">
+  <% resource.versions.each do |version| %>
+    <li>
+      <div class="title">
+        <%= link_to(version.title, send(path, resource, version.version)) %>
+      </div>
+      <div class="metadata">
+
+        <p>
+          Created
+          <% if version.respond_to?(:contributor_id) %>
+            by <%= contributor version.contributor_id, version.contributor_type %>
+          <% end %>
+          on <%= datetime version.created_at %>
+        </p>
+
+        <% unless version.created_at == version.updated_at %>
+          <p>
+            Last edited
+            <% if version.respond_to?(:last_edited_by) %>
+              by <%= contributor version.last_edited_by, "User" %>
+            <% end %>
+            on <%= datetime version.updated_at %>
+          </p>
+        <% end %>
+
+        <% if !version.revision_comments.blank? %>
+          <p>
+            <div>Revision comment:</div>
+            <div class="comment">
+              <%= white_list version.revision_comments %>
+            </div>
+          </p>
+        <% end %>
+      </div>
+    </li>
+  <% end %>
+</ol>
+

Modified: trunk/app/views/networks/show.rhtml (3064 => 3065)


--- trunk/app/views/networks/show.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/networks/show.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -42,21 +42,20 @@
 	|
 	<%= link_to "Members (address@hidden)", "#group_members" %>
 	|
-	<!-- NB! IDs of tabs for selectTab() might easily change! -->
-	<a href="" 
+	<a href=""
 	|
-	<a href=""  Items (<%= @shared_items.length -%>)</a>
+	<a href="" Items (<%= @shared_items.length -%>)</a>
 	|
-	<a href=""  (<%= @network.creditations.length -%>)</a>
+	<a href="" (<%= @network.creditations.length -%>)</a>
 	|
 	<% if mine? @network %>
-	  <a href=""  Memberships</a>
+	  <a href="" Memberships</a>
 		|
 		<% cnt = @network.memberships_requested.length %>
-		<a href=""  unless cnt == 0 %><b><% end %>Requests Pending (<%= cnt -%>)<% unless cnt == 0 %></b><% end %></a>
+		<a href="" unless cnt == 0 %><b><% end %>Requests Pending (<%= cnt -%>)<% unless cnt == 0 %></b><% end %></a>
 		|
 		<% cnt = @network.memberships_invited.length %>
-		<a href=""  unless cnt == 0 %><b><% end %>Invites Pending (<%= cnt -%>)<% unless cnt == 0 %></b><% end %></a>
+		<a href="" unless cnt == 0 %><b><% end %>Invites Pending (<%= cnt -%>)<% unless cnt == 0 %></b><% end %></a>
 		|
 		<br/>
 		|
@@ -134,7 +133,7 @@
 		<p>
 			<b>
 				This group has been credited
-				<a href=""  pluralize(@network.creditations.length, "time") -%></a>
+				<a href="" pluralize(@network.creditations.length, "time") -%></a>
 				<a name="group_creditations"></a>
 	  	</b>
 		</p>
@@ -155,18 +154,18 @@
 
 <div id="tabsContainer" class="tabsContainer"></div>
 
-<a name="news"></a>
 <div class="tabContainer">
   <div class="tabTitle">News</div>
   <div class="tabContent">  
+    <a name="news"></a>
     <%= render :partial => "layouts/news", :locals => { :collection => news(@network, true) } %>
   </div>
 </div>
 
-<a name="shared_items"></a>
 <div class="tabContainer">
   <div class="tabTitle">Shared Items (<%= @shared_items.length -%>)</div>
   <div class="tabContent" id="shared_items">
+    <a name="shared_items"></a>
 		<% unless @shared_items.empty? %>
   		<%= view_privileges_notice %>
 
@@ -189,11 +188,11 @@
 	</div>
 </div>
 
-<a name="creditations"></a>
 <div class="tabContainer">
   <div class="tabTitle">Creditations (<%= @network.creditations.length -%>)</div>
   <div class="tabContent">  
     
+    <a name="creditations"></a>
     <% unless (creditations = @network.creditations).empty? %>
 			<%= view_privileges_notice %>
       <% creditations.each do |c| %>
@@ -211,10 +210,10 @@
 <% if logged_in? && @network.administrator?(current_user.id) %>
   
   <% memberships = @network.memberships_accepted %>
-  <a name="manage_memberships"></a>
 	<div class="tabContainer">
     <div class="tabTitle">Manage Memberships</div>
     <div class="tabContent">
+      <a name="manage_memberships"></a>
     	<% unless memberships.empty? %>
       	<%= render :partial => "memberships/table", :locals => { :collection => memberships, :network => false } %>
 			<% else %>
@@ -224,10 +223,10 @@
   </div>
   
 	<% requests = @network.memberships_requested %>
-  <a name="requests_pending"></a>
   <div class="tabContainer">
     <div class="tabTitle">Requests Pending (<%= @network.memberships_requested.length -%>)</div>
     <div class="tabContent">
+      <a name="requests_pending"></a>
     	<% unless requests.empty? %>
 				<p></p>
       	<%= render :partial => "memberships/table", :locals => { :collection => requests, :network => false } %>
@@ -238,10 +237,10 @@
   </div>
 	
 	<% invited = @network.memberships_invited %>
-  <a name="invites_pending"></a>
 	<div class="tabContainer">
     <div class="tabTitle">Invites Pending (<%= @network.memberships_invited.length -%>)</div>
     <div class="tabContent">
+      <a name="invites_pending"></a>
     	<% unless invited.empty? %>
 				<p></p>
       	<%= render :partial => "memberships/table", :locals => { :collection => invited, :network => false } %>

Modified: trunk/app/views/packs/show.rhtml (3064 => 3065)


--- trunk/app/views/packs/show.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/packs/show.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -22,8 +22,7 @@
 		|
 	<% end %>
 	<% if logged_in? and @pack.owner? current_user %>
-	  <!-- NB! Index of the 'sharing' tab might change! -->
-	  <a href="" 
+	  <a href=""
 		|
 	<% end %>
 	<%= link_to "Tags <span id='mini_nav_tag_link'>(address@hidden)</span>", "#tags" %>
@@ -169,11 +168,11 @@
 	
 <% if logged_in? and @pack.owner? current_user %>
   
-	<a name="sharing"></a>
 	<div class="tabContainer">
     <div class="tabTitle">Sharing</div>
     <div class="tabContent">
 
+      <a name="sharing"></a>
       <%= render :partial => "contributions/sharing_summary",  :locals => { :contributable => @pack } %>
       <%= render :partial => "contributions/updating_summary", :locals => { :contributable => @pack } %>
 	  

Deleted: trunk/app/views/workflows/_version_meta.rhtml (3064 => 3065)


--- trunk/app/views/workflows/_version_meta.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/workflows/_version_meta.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,34 +0,0 @@
-<p>
-	<b>Created on:</b>
-	<%= datetime version.created_at %>
-</p>
-
-<p>
-	<b>Created by:</b>
-	<%= contributor version.contributor_id, version.contributor_type %>
-</p>
-
-<% unless version.created_at == version.updated_at %>
-
-	<p>
-		<b>Last edited on:</b>
-		<%= datetime version.updated_at %>
-	</p>
-	
-	<p>
-		<b>Last edited by:</b>
-		<%= contributor version.last_edited_by, "User" %>
-	</p>
-
-<% end %>
-
-<p>
-	<b>Revision comments:</b>
-</p>
-<% unless version.revision_comments.blank? -%>
-	<div>
-		<%= white_list version.revision_comments %>
-	</div>
-<% else %>
-	<p><i>None</i></p>
-<% end %>

Deleted: trunk/app/views/workflows/_versions.rhtml (3064 => 3065)


--- trunk/app/views/workflows/_versions.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/workflows/_versions.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,39 +0,0 @@
-<p>
-  <b>Earliest Version:</b><br/>
-  <%= versioned_workflow_link(workflow, workflow.versions.first.version ) %>
-	<div class="contribution_version_meta_info_box" style="margin-bottom: 0.6em;">
-		<%= render :partial => "version_meta", :locals => { :version => workflow.versions.first } %>
-	</div>
-</p>
-
-<% if @latest_version_number > 2 %>
-<p>
-  <b>Previous Versions:</b><br/>
-  <% (address@hidden).each do |v| %>
-		<% if (link = versioned_workflow_link(workflow, v)) %>
-    	<%= link %><br/>
-			<div class="contribution_version_meta_info_box" style="margin-bottom: 0.6em;">
-				<%= render :partial => "version_meta", :locals => { :version => workflow.find_version(v) } %>
-			</div>
-		<% else %>
-			<p>[<%= v.to_s %>] - <i>does not exist</i></p>
-		<% end %>
-  <% end %>
-</p>
-<% end %>
-
-<% if @latest_version_number > 1 %>
-  <p>
-    <b>Latest Version:</b><br/>
-    <%= versioned_workflow_link(workflow, @latest_version_number) %>
-		<div class="contribution_version_meta_info_box" style="margin-bottom: 0.6em;">
-			<%= render :partial => "version_meta", :locals => { :version => workflow.versions.last } %>
-		</div>
-  </p>
-<% end %>
-
-<% if workflow.versions.length == 1 %>
-  <p>
-    This Workflow only has one version.
-  </p>
-<% end %>

Modified: trunk/app/views/workflows/show.rhtml (3064 => 3065)


--- trunk/app/views/workflows/show.rhtml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/app/views/workflows/show.rhtml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,13 +1,5 @@
 <% t "#{h @workflow.title} (#{h @workflow.contributor_name}) [#{h(@workflow.type_display_name)} Workflow]" -%>
 
-<script type="text/_javascript_">
-  function showWorkflowVersion(form) {
-    var url = ""
-		location.href = ""
-		form.submit
-  }
-</script>
-
 <ul class="sectionIcons">
 	<% if @authorised_to_edit -%>
 		<li><%= icon('new', new_version_workflow_path(@workflow), nil, nil, 'Upload New Version')%></li>
@@ -28,8 +20,6 @@
 
 <%= render :partial => "contributions/datetime_info", :locals => { :contributable => @workflow } -%>
 
-<!-- the code for 'selectTab()' should be refactored at some point to get -->
-<!-- tab name as a string, not it's ID; for now IDs are used -->
 <div class="contribution_mini_nav">
 	|
 	<%= link_to "License", "#license" %>
@@ -50,12 +40,12 @@
 	|
 	<br/>
 	|
-	<a href=""  (<%= @workflow.citations.length -%>)</a>
+	<a href="" (<%= @workflow.citations.length -%>)</a>
 	|
-	<a href=""  History</a>
-	|
+  <a href="" History</a>
+  |
 	<% if logged_in? and @workflow.owner?(current_user) %>
-	  <a href="" 
+	  <a href=""
 	  |
 	<% end %>
 	<%= link_to "Reviews (address@hidden)", "#reviews" %>
@@ -68,63 +58,9 @@
 <div class="contribution_left_box">
 	
 	<div class="contribution_version_box">
-		<div class="contribution_version_selector_box">
-			<table>
-				<tbody>
-					<tr>
-						<td class="heading" style="vertical-align: top;">
-							<%= info_icon_with_tooltip("This box shows version address@hidden of the Workflow file for this Workflow entry") -%>
-							<span><%= "Version address@hidden address@hidden(@viewing_version_number)}" -%></span>
-							<span class="count_text">(of <%= @workflow.versions.length -%>)</span>
-						  <a name="versions"></a>
-						</td>
-						<td>
-							<% if @latest_version_number > 1 %>
-	             	<form  return false;" style="text-align: right;">
-						    	<b>View version: </b>
-						    	<select id="workflow_versions" 
-							  		<% @workflow.versions.reverse.each do |w| %>
-							    		<option value="<%= versioned_workflow_url(@workflow, w.version.to_s) %>" <%= "selected" if w.version == @viewing_version_number -%>>
-							      			<%= "#{w.version.to_s} address@hidden(w.version)}" %>
-							    		</option>
-							  		<% end %>
-									</select>
-								</form>
-							<% end %>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			
-			<div id="version_info_box" style="color: #666666;	font-size: 85%; margin: 0.6em 0.5em 0.2em 0.5em; border-top: 1px solid #DDDDDD; padding-top: 0.4em;">
-				<p style="text-align: center;">
-					<b>Version created on:</b>
-					<span><%= datetime @viewing_version.created_at, false %></span>
-					<b>by:</b>
-					<span><%= contributor @viewing_version.contributor_id, @viewing_version.contributor_type %></span>
-					<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
-					<span><%= link_to_function "Revision comments " + expand_image, visual_effect(:toggle_blind, "version_info_box_comments", :duration => 0.3) %></span>
-				</p>
-				
-				<% unless @viewing_version.created_at == @viewing_version.updated_at %>
-					<p style="text-align: center;">
-						<b>Last edited on:</b>
-						<span><%= datetime @viewing_version.updated_at, false %></span>
-						<b>by:</b>
-						<span><%= contributor @viewing_version.last_edited_by, "User" %></span>
-					</p>
-				<% end %>
-			</div>
-			
-			<div id="version_info_box_comments" style="display: none; border: 1px dotted #CCCCCC; padding: 0.3em 0.5em;">
-				<% unless @viewing_version.revision_comments.blank? -%>
-					<%= white_list @viewing_version.revision_comments %>
-				<% else %>
-					<p><i>None</i></p>
-				<% end %>
-			</div>
-		</div>
-		
+
+    <%= render(:partial => "contributions/version_selector", :locals => { :resource => @workflow, :version => @viewing_version, :path => :workflow_version_path }) %>
+
 		<% if @authorised_to_edit %>
 			<div style="margin-top: 1em;">
 				<ul class="sectionIcons" style="margin-top: 0.7em; margin-bottom: 0.6em;">
@@ -337,24 +273,23 @@
 
 <div id="tabsContainer" class="tabsContainer"></div>
 
-<a name="citations"></a>
 <%= render :partial => "contributions/citations_tab", :locals => { :item => @workflow } %>
 
-<a name="version_history"></a>
 <div class="tabContainer">
   <div class="tabTitle">Version History</div>
   <div class="tabContent">
-      <%= render :partial => "workflows/versions", :locals => { :workflow => @workflow } %>
+    <a name="version_history"></a>
+    <%= render :partial => "contributions/versions", :locals => { :resource => @workflow, :path => :workflow_version_path } %>
   </div>
 </div>
 
 <% if logged_in? and @workflow.owner?(current_user) %>
   
-	<a name="sharing"></a>
 	<div class="tabContainer">
     <div class="tabTitle">Sharing</div>
     <div class="tabContent">
 
+      <a name="sharing"></a>
       <%= render :partial => "contributions/sharing_summary",  :locals => { :contributable => @workflow } %>
       <%= render :partial => "contributions/updating_summary", :locals => { :contributable => @workflow } %>
 	  

Modified: trunk/config/environment.rb (3064 => 3065)


--- trunk/config/environment.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/config/environment.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -54,7 +54,8 @@
     :recaptcha,
     :simile_timeline,
     :structured_data,
-    :validates_email_veracity_of
+    :validates_email_veracity_of,
+    :versioning
   ]
 
   # Skip frameworks you're not going to use. To use Rails without a database,

Modified: trunk/config/routes.rb (3064 => 3065)


--- trunk/config/routes.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/config/routes.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -132,6 +132,13 @@
   map.workflow_version           '/workflows/:id/versions/:version',         :conditions => { :method => :get }, :controller => 'workflows', :action ="" 'show'
   map.formatted_workflow_version '/workflows/:id/versions/:version.:format', :conditions => { :method => :get }, :controller => 'workflows', :action ="" 'show'
 
+  # blob redirect for linked data model
+  map.blob_version           '/files/:id/versions/:version',         :conditions => { :method => :get }, :controller => 'blobs', :action ="" 'show'
+  map.formatted_blob_version '/files/:id/versions/:version.:format', :conditions => { :method => :get }, :controller => 'blobs', :action ="" 'show'
+
+  map.blob_version_suggestions '/files/:id/versions/:version/suggestions', :conditions => { :method => :get }, :controller => 'blobs', :action ="" 'suggestions'
+  map.blob_version_process_suggestions '/files/:id/versions/:version/process_suggestions', :conditions => { :method => :post }, :controller => 'blobs', :action ="" 'process_suggestions'
+
   # versioned preview images
   ['workflow'].each do |x|
 
@@ -163,6 +170,8 @@
                  :favourite => :post,
                  :favourite_delete => :delete,
                  :rate => :post, 
+                 :suggestions => :get,
+                 :process_suggestions => :post,
                  :tag => :post } do |blob|
     # Due to restrictions in the version of Rails used (v1.2.3), 
     # we cannot have reviews as nested resources in more than one top level resource.
@@ -273,6 +282,7 @@
   map.connect ':controller/:id/download/:name', :action ="" 'named_download', :requirements => { :name => /.*/ }
   
   map.connect 'files/:id/download/:name', :controller => 'blobs', :action ="" 'named_download', :requirements => { :name => /.*/ }
+  map.connect 'files/:id/versions/:version/download/:name', :controller => 'blobs', :action ="" 'named_download_with_version', :requirements => { :name => /.*/ }
 
   # map.connect 'topics', :controller => 'topics', :action ="" 'index'
   map.connect 'topics/tag_feedback', :controller => 'topics', :action ="" 'tag_feedback'

Deleted: trunk/config/schema.d/files.xml (3064 => 3065)


--- trunk/config/schema.d/files.xml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/config/schema.d/files.xml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<schema>
-
-  <table name="blobs">
-
-    <column type="integer"  name="contributor_id"/>
-    <column type="string"   name="contributor_type"/>
-    <column type="string"   name="local_name"/>
-    <column type="datetime" name="created_at"/>
-    <column type="datetime" name="updated_at"/>
-    <column type="string"   name="title"/>
-    <column type="text"     name="body"/>
-    <column type="text"     name="body_html"/>
-    <column type="integer"  name="content_blob_id"/>
-    <column type="integer"  name="content_type_id"/>
-    <column type="integer"  name="license_id"/>
-
-  </table>
-
-</schema>
-

Modified: trunk/config/schema.d/workflows.xml (3064 => 3065)


--- trunk/config/schema.d/workflows.xml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/config/schema.d/workflows.xml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,28 +1,6 @@
 <?xml version="1.0"?>
 <schema>
 
-  <table name="workflows">
-
-    <column type="integer"    name="contributor_id"/>
-    <column type="string"     name="contributor_type"/>
-    <column type="string"     name="title"/>
-    <column type="string"     name="unique_name"/>
-    <column type="text"       name="body"/>
-    <column type="text"       name="body_html"/>
-    <column type="datetime"   name="created_at"/>
-    <column type="datetime"   name="updated_at"/>
-    <column type="string"     name="image"/>
-    <column type="string"     name="svg"/>
-    <column type="integer"    name="current_version"/>
-    <column type="integer"    name="content_blob_id"/>
-    <column type="string"     name="file_ext"/>
-    <column type="string"     name="last_edited_by"/>
-    <column type="integer"    name="content_type_id"/>
-    <column type="integer"    name="license_id"/>
-    <column type="integer"    name="preview_id"/>
-
-  </table>
-
   <table name="workflow_processors">
 
     <column type="integer"    name="workflow_id"/>

Modified: trunk/config/tables.xml


(Binary files differ)

Modified: trunk/db/migrate/012_create_blobs.rb (3064 => 3065)


--- trunk/db/migrate/012_create_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/012_create_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -5,18 +5,18 @@
 
 class CreateBlobs < ActiveRecord::Migration
   def self.up
-#   create_table :blobs do |t|
-#     t.column :contributor_id, :integer
-#     t.column :contributor_type, :string
-#     t.column :local_name, :string
-#     t.column :content_type, :string
-#     t.column :data, :binary
-#     t.column :created_at, :datetime
-#     t.column :updated_at, :datetime
-#   end
+    create_table :blobs do |t|
+      t.column :contributor_id, :integer
+      t.column :contributor_type, :string
+      t.column :local_name, :string
+      t.column :content_type, :string
+      t.column :data, :binary
+      t.column :created_at, :datetime
+      t.column :updated_at, :datetime
+    end
   end
 
   def self.down
-#   drop_table :blobs
+    drop_table :blobs
   end
 end

Modified: trunk/db/migrate/013_create_workflows.rb (3064 => 3065)


--- trunk/db/migrate/013_create_workflows.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/013_create_workflows.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -5,27 +5,30 @@
 
 class CreateWorkflows < ActiveRecord::Migration
   def self.up
-#   create_table :workflows do |t|
-#     t.column :contributor_id, :integer
-#     t.column :contributor_type, :string
-#     
-#     t.column :scufl, :binary
-#     t.column :image, :string
-#     t.column :svg, :string
-#     
-#     t.column :title, :string
-#     t.column :unique_name, :string
-#     
-#     t.column :body, :text
-#     t.column :body_html, :text
-#     
-#     t.column :created_at, :datetime
-#     t.column :updated_at, :datetime
-#     
-#     t.column :license, :string, 
-#              :limit => 10, :null => false, 
-#              :default => "by-sa"
-#   end
+    create_table :workflows do |t|
+      t.column :contributor_id, :integer
+      t.column :contributor_type, :string
+      
+      t.column :scufl, :binary
+      t.column :image, :string
+      t.column :svg, :string
+      
+      t.column :title, :string
+      t.column :unique_name, :string
+      
+      t.column :body, :text
+      t.column :body_html, :text
+      
+      t.column :version, :integer
+      t.column :preview_id, :integer
+
+      t.column :created_at, :datetime
+      t.column :updated_at, :datetime
+      
+      t.column :license, :string, 
+               :limit => 10, :null => false, 
+               :default => "by-sa"
+    end
     
     create_table :workflow_versions do |t|
       t.column "workflow_id",       :integer
@@ -34,17 +37,11 @@
       t.column "contributor_type",  :string
       t.column "title",             :string
       t.column "unique_name",       :string
+      t.column "scufl",             :text
       t.column "body",              :text
       t.column "body_html",         :text
       t.column "created_at",        :datetime
       t.column "updated_at",        :datetime
-      t.column "image",             :string
-      t.column "svg",               :string
-      t.column "revision_comments", :text
-      t.column "content_blob_id",   :integer
-      t.column "file_ext",          :string
-      t.column "last_edited_by",    :string
-      t.column "content_type_id",   :integer
       t.column "license",           :string
       t.column "preview_id",        :integer
     end
@@ -53,7 +50,7 @@
   end
 
   def self.down
-#   drop_table :workflows
+    drop_table :workflows
     drop_table :workflow_versions
   end
 end

Modified: trunk/db/migrate/029_modify_blobs.rb (3064 => 3065)


--- trunk/db/migrate/029_modify_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/029_modify_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,12 +1,12 @@
 
 class ModifyBlobs < ActiveRecord::Migration
   def self.up
-#   add_column :blobs, :title, :string
-#   add_column :blobs, :description, :text
+    add_column :blobs, :title, :string
+    add_column :blobs, :description, :text
   end
 
   def self.down
-#   remove_column :blobs, :title
-#   remove_column :blobs, :description
+    remove_column :blobs, :title
+    remove_column :blobs, :description
   end
 end

Modified: trunk/db/migrate/030_add_license_to_blobs.rb (3064 => 3065)


--- trunk/db/migrate/030_add_license_to_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/030_add_license_to_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,10 +1,10 @@
 
 class AddLicenseToBlobs < ActiveRecord::Migration
   def self.up
-#   add_column :blobs, :license, :string, :limit => 10, :null => false, :default => "by-nd"
+    add_column :blobs, :license, :string, :limit => 10, :null => false, :default => "by-nd"
   end
 
   def self.down
-#   remove_column :blobs, :license
+    remove_column :blobs, :license
   end
 end

Modified: trunk/db/migrate/031_rename_desc_to_body.rb (3064 => 3065)


--- trunk/db/migrate/031_rename_desc_to_body.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/031_rename_desc_to_body.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,12 +1,12 @@
 
 class RenameDescToBody < ActiveRecord::Migration
   def self.up
-#   rename_column :blobs, :description, :body
-#   add_column :blobs, :body_html, :text
+    rename_column :blobs, :description, :body
+    add_column :blobs, :body_html, :text
   end
 
   def self.down
-#   rename_column :blobs, :body, :description
-#   remove_column :blobs, :body_html
+    rename_column :blobs, :body, :description
+    remove_column :blobs, :body_html
   end
 end

Modified: trunk/db/migrate/033_increase_blob_size.rb (3064 => 3065)


--- trunk/db/migrate/033_increase_blob_size.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/033_increase_blob_size.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,16 +1,16 @@
 
 class IncreaseBlobSize < ActiveRecord::Migration
   def self.up
-#   rename_column :blobs, :data, :temp
-#   add_column :blobs, :data, :binary, :limit => 1073741824
-#   execute 'UPDATE blobs SET data = ""
-#   remove_column :blobs, :temp
+    rename_column :blobs, :data, :temp
+    add_column :blobs, :data, :binary, :limit => 1073741824
+    execute 'UPDATE blobs SET data = ""
+    remove_column :blobs, :temp
   end
 
   def self.down
-#   rename_column :blobs, :data, :temp
-#   add_column :blobs, :data, :binary
-#   execute 'UPDATE blobs SET data = ""
-#   remove_column :blobs, :temp
+    rename_column :blobs, :data, :temp
+    add_column :blobs, :data, :binary
+    execute 'UPDATE blobs SET data = ""
+    remove_column :blobs, :temp
   end
 end

Modified: trunk/db/migrate/034_update_for_new_versioning.rb (3064 => 3065)


--- trunk/db/migrate/034_update_for_new_versioning.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/034_update_for_new_versioning.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,17 +1,17 @@
 class UpdateForNewVersioning < ActiveRecord::Migration
   def self.up
-#   rename_column :workflows, :version, :current_version
+    rename_column :workflows, :version, :current_version
     
-#   add_column :workflow_versions, :image, :string
-#   add_column :workflow_versions, :svg, :string
-#   add_column :workflow_versions, :revision_comments, :text
+    add_column :workflow_versions, :image, :string
+    add_column :workflow_versions, :svg, :string
+    add_column :workflow_versions, :revision_comments, :text
   end
 
   def self.down
-#   rename_column :workflows, :current_version, :version
+    rename_column :workflows, :current_version, :version
     
-#   remove_column :workflow_versions, :image
-#   remove_column :workflow_versions, :svg
-#   remove_column :workflow_versions, :revision_comments
+    remove_column :workflow_versions, :image
+    remove_column :workflow_versions, :svg
+    remove_column :workflow_versions, :revision_comments
   end
 end

Modified: trunk/db/migrate/035_increase_workflow_size.rb (3064 => 3065)


--- trunk/db/migrate/035_increase_workflow_size.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/035_increase_workflow_size.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,22 +1,22 @@
 
 class IncreaseWorkflowSize < ActiveRecord::Migration
   def self.up
-#   rename_column :workflows, :scufl, :temp
-#   add_column :workflows, :scufl, :binary, :limit => 1073741824
-#   execute 'UPDATE workflows SET scufl = temp'
-#   remove_column :workflows, :temp
+    rename_column :workflows, :scufl, :temp
+    add_column :workflows, :scufl, :binary, :limit => 1073741824
+    execute 'UPDATE workflows SET scufl = temp'
+    remove_column :workflows, :temp
 
-#   execute 'ALTER TABLE workflow_versions CHANGE COLUMN scufl scufl LONGBLOB'
+    execute 'ALTER TABLE workflow_versions CHANGE COLUMN scufl scufl LONGBLOB'
 
   end
 
   def self.down
-#   rename_column :workflows, :scufl, :temp
-#   add_column :workflows, :scufl, :binary
-#   execute 'UPDATE workflows SET scufl = temp'
-#   remove_column :workflows, :temp
+    rename_column :workflows, :scufl, :temp
+    add_column :workflows, :scufl, :binary
+    execute 'UPDATE workflows SET scufl = temp'
+    remove_column :workflows, :temp
 
-#   execute 'ALTER TABLE workflow_versions CHANGE COLUMN scufl scufl BLOB'
+    execute 'ALTER TABLE workflow_versions CHANGE COLUMN scufl scufl BLOB'
 
   end
 end

Modified: trunk/db/migrate/046_add_type_to_workflows.rb (3064 => 3065)


--- trunk/db/migrate/046_add_type_to_workflows.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/046_add_type_to_workflows.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -2,16 +2,16 @@
 
 class AddTypeToWorkflows < ActiveRecord::Migration
   def self.up
-#   add_column :workflows, :content_type, :string
-#   add_column :workflow_versions, :content_type, :string
+    add_column :workflows, :content_type, :string
+    add_column :workflow_versions, :content_type, :string
 
-#   # Currently, all workflows are scufl workflows
-#   execute 'UPDATE workflows SET content_type = "application/vnd.taverna.scufl+xml"'
-#   execute 'UPDATE workflow_versions SET content_type = "application/vnd.taverna.scufl+xml"'
+    # Currently, all workflows are scufl workflows
+    execute 'UPDATE workflows SET content_type = "application/vnd.taverna.scufl+xml"'
+    execute 'UPDATE workflow_versions SET content_type = "application/vnd.taverna.scufl+xml"'
   end
 
   def self.down
-#   remove_column :workflows, :content_type
-#   remove_column :workflow_versions, :content_type
+    remove_column :workflows, :content_type
+    remove_column :workflow_versions, :content_type
   end
 end

Modified: trunk/db/migrate/053_modify_blobs_for_content_blobs.rb (3064 => 3065)


--- trunk/db/migrate/053_modify_blobs_for_content_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/053_modify_blobs_for_content_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,9 +1,9 @@
 class ModifyBlobsForContentBlobs < ActiveRecord::Migration
   def self.up
-#   add_column :blobs, :content_blob_id, :integer
+    add_column :blobs, :content_blob_id, :integer
   end
 
   def self.down
-#   remove_column :blobs, :content_blob_id
+    remove_column :blobs, :content_blob_id
   end
 end

Modified: trunk/db/migrate/054_move_blob_data_to_content_blobs.rb (3064 => 3065)


--- trunk/db/migrate/054_move_blob_data_to_content_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/054_move_blob_data_to_content_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,17 +1,17 @@
 class MoveBlobDataToContentBlobs < ActiveRecord::Migration
   def self.up
 
-#   Blob.find(:all).each do |b|
-#     b.content_blob = ContentBlob.new(:data ="" b.data)
-#     b.save
-#   end
+    Blob.find(:all).each do |b|
+      b.content_blob = ContentBlob.new(:data ="" b.data)
+      b.save
+    end
 
-#   remove_column :blobs, :data
+    remove_column :blobs, :data
   end
 
   def self.down
-#   add_column :blobs, :data, :binary, :limit => 1073741824
+    add_column :blobs, :data, :binary, :limit => 1073741824
 
-#   execute 'UPDATE blobs,content_blobs SET blobs.data = "" WHERE blobs.content_blob_id = content_blobs.id'
+    execute 'UPDATE blobs,content_blobs SET blobs.data = "" WHERE blobs.content_blob_id = content_blobs.id'
   end
 end

Modified: trunk/db/migrate/055_modify_workflows_and_workflow_versions_for_content_blobs.rb (3064 => 3065)


--- trunk/db/migrate/055_modify_workflows_and_workflow_versions_for_content_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/055_modify_workflows_and_workflow_versions_for_content_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,11 +1,11 @@
 class ModifyWorkflowsAndWorkflowVersionsForContentBlobs < ActiveRecord::Migration
   def self.up
-#   add_column :workflows, :content_blob_id, :integer
-#   add_column :workflow_versions, :content_blob_id, :integer
+    add_column :workflows, :content_blob_id, :integer
+    add_column :workflow_versions, :content_blob_id, :integer
   end
 
   def self.down
-#   remove_column :workflows, :content_blob_id
-#   remove_column :workflow_versions, :content_blob_id
+    remove_column :workflows, :content_blob_id
+    remove_column :workflow_versions, :content_blob_id
   end
 end

Modified: trunk/db/migrate/056_move_scufl_data_to_content_blobs.rb (3064 => 3065)


--- trunk/db/migrate/056_move_scufl_data_to_content_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/056_move_scufl_data_to_content_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,41 +1,41 @@
 class MoveScuflDataToContentBlobs < ActiveRecord::Migration
   def self.up
-#   ActiveRecord::Base.record_timestamps = false
+    ActiveRecord::Base.record_timestamps = false
 
-#   Workflow.find(:all).each do |w|
+    Workflow.find(:all).each do |w|
 
-#     w.versions.each do |wv|
-#       wv.content_blob = ContentBlob.new(:data ="" wv.scufl)
-#       wv.save
-#     end
+      w.versions.each do |wv|
+        wv.content_blob = ContentBlob.new(:data ="" wv.scufl)
+        wv.save
+      end
 
-#     current = w.find_version(w.current_version)
-#     w.content_blob = current.content_blob
+      current = w.find_version(w.current_version)
+      w.content_blob = current.content_blob
 
-#     w.save
-#   end
+      w.save
+    end
 
-#   remove_column :workflows, :scufl
-#   remove_column :workflow_versions, :scufl
+    remove_column :workflows, :scufl
+    remove_column :workflow_versions, :scufl
 
-#   ActiveRecord::Base.record_timestamps = true
+    ActiveRecord::Base.record_timestamps = true
   end
 
   def self.down
-#   ActiveRecord::Base.record_timestamps = false
+    ActiveRecord::Base.record_timestamps = false
 
-#   add_column :workflows, :scufl, :binary, :limit => 1073741824
-#   add_column :workflow_versions, :scufl, :binary, :limit => 1073741824
+    add_column :workflows, :scufl, :binary, :limit => 1073741824
+    add_column :workflow_versions, :scufl, :binary, :limit => 1073741824
 
-#   execute 'UPDATE workflows,content_blobs SET workflows.scufl = content_blobs.data WHERE workflows.content_blob_id = content_blobs.id'
-#   execute 'UPDATE workflow_versions,content_blobs SET workflow_versions.scufl = content_blobs.data WHERE workflow_versions.content_blob_id = content_blobs.id'
+    execute 'UPDATE workflows,content_blobs SET workflows.scufl = content_blobs.data WHERE workflows.content_blob_id = content_blobs.id'
+    execute 'UPDATE workflow_versions,content_blobs SET workflow_versions.scufl = content_blobs.data WHERE workflow_versions.content_blob_id = content_blobs.id'
 
-#   Workflow.find(:all).each do |w|
-#     w.versions.each do |wv|
-#       wv.content_blob.destroy
-#     end
-#   end
+    Workflow.find(:all).each do |w|
+      w.versions.each do |wv|
+        wv.content_blob.destroy
+      end
+    end
 
-#   ActiveRecord::Base.record_timestamps = true
+    ActiveRecord::Base.record_timestamps = true
   end
 end

Modified: trunk/db/migrate/066_add_file_ext_to_workflow.rb (3064 => 3065)


--- trunk/db/migrate/066_add_file_ext_to_workflow.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/066_add_file_ext_to_workflow.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,15 +1,15 @@
 class AddFileExtToWorkflow < ActiveRecord::Migration
   def self.up
-#   add_column :workflows, :file_ext, :string
-#   add_column :workflow_versions, :file_ext, :string
+    add_column :workflows, :file_ext, :string
+    add_column :workflow_versions, :file_ext, :string
 
     # Currently, we assume that all workflows are scufl workflows!
-#   execute 'UPDATE workflows SET file_ext = "xml"'
-#   execute 'UPDATE workflow_versions SET file_ext = "xml"'
+    execute 'UPDATE workflows SET file_ext = "xml"'
+    execute 'UPDATE workflow_versions SET file_ext = "xml"'
   end
 
   def self.down
-#   remove_column :workflows, :file_ext
-#   remove_column :workflow_versions, :file_ext
+    remove_column :workflows, :file_ext
+    remove_column :workflow_versions, :file_ext
   end
 end

Modified: trunk/db/migrate/067_add_last_edited_by_to_workflows.rb (3064 => 3065)


--- trunk/db/migrate/067_add_last_edited_by_to_workflows.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/067_add_last_edited_by_to_workflows.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,14 +1,14 @@
 class AddLastEditedByToWorkflows < ActiveRecord::Migration
   def self.up
-#   add_column :workflows, :last_edited_by, :string
-#   add_column :workflow_versions, :last_edited_by, :string
+    add_column :workflows, :last_edited_by, :string
+    add_column :workflow_versions, :last_edited_by, :string
     
-#   execute 'UPDATE workflows SET last_edited_by=contributor_id'
-#   execute 'UPDATE workflow_versions SET last_edited_by=contributor_id'
+    execute 'UPDATE workflows SET last_edited_by=contributor_id'
+    execute 'UPDATE workflow_versions SET last_edited_by=contributor_id'
   end
 
   def self.down
-#   remove_column :workflows, :last_edited_by
-#   remove_column :workflow_versions, :last_edited_by
+    remove_column :workflows, :last_edited_by
+    remove_column :workflow_versions, :last_edited_by
   end
 end

Modified: trunk/db/migrate/076_create_content_types.rb (3064 => 3065)


--- trunk/db/migrate/076_create_content_types.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/076_create_content_types.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -15,9 +15,9 @@
 #     t.column :updated_at, :datetime
 #   end
 
-#   add_column :workflows,         :content_type_id, :integer
-#   add_column :workflow_versions, :content_type_id, :integer
-#   add_column :blobs,             :content_type_id, :integer
+    add_column :workflows,         :content_type_id, :integer
+    add_column :workflow_versions, :content_type_id, :integer
+    add_column :blobs,             :content_type_id, :integer
 
     # Create ContentType records for workflows with processors
 
@@ -94,20 +94,20 @@
 #     execute("UPDATE blobs SET content_type_id = #{blob_type_to_content_type_id[b.attributes["content_type"].strip]} WHERE id = #{b.id}")
 #   end
 
-#   remove_column :workflows,         :content_type
-#   remove_column :workflow_versions, :content_type
-#   remove_column :blobs,             :content_type
+    remove_column :workflows,         :content_type
+    remove_column :workflow_versions, :content_type
+  remove_column :blobs,             :content_type
   end
 
   def self.down
    
-#   add_column :workflows,         :content_type, :string
-#   add_column :workflow_versions, :content_type, :string
-#   add_column :blobs,             :content_type, :string
+    add_column :workflows,         :content_type, :string
+    add_column :workflow_versions, :content_type, :string
+  add_column :blobs,             :content_type, :string
 
-#   remove_column :workflows,         :content_type_id
-#   remove_column :workflow_versions, :content_type_id
-#   remove_column :blobs,             :content_type_id
+    remove_column :workflows,         :content_type_id
+    remove_column :workflow_versions, :content_type_id
+  remove_column :blobs,             :content_type_id
 
 #   drop_table :content_types
   end

Modified: trunk/db/migrate/080_add_license_id_to_workflows_and_blobs.rb (3064 => 3065)


--- trunk/db/migrate/080_add_license_id_to_workflows_and_blobs.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/080_add_license_id_to_workflows_and_blobs.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,37 +1,37 @@
 class AddLicenseIdToWorkflowsAndBlobs < ActiveRecord::Migration
   def self.up
     #Need to rename columns so that license method and license field do not get confused
-#   rename_column :workflows, :license, :license_name
-#   rename_column :blobs, :license, :license_name
-#   
-#   add_column :workflows, :license_id, :integer, :default => nil
-#   add_column :blobs, :license_id, :integer, :default => nil
+    rename_column :workflows, :license, :license_name
+    rename_column :blobs, :license, :license_name
+
+    add_column :workflows, :license_id, :integer, :default => nil
+    add_column :blobs, :license_id, :integer, :default => nil
     
-#   Workflow.find(:all).each do |w|
-#     execute("UPDATE workflows SET license_id = #{License.find(:first,:conditions=>[ 'unique_name = ?', w.license_name ]).id } WHERE id = #{w.id}")
-#   end
-#   Blob.find(:all).each do |b|
-#     execute("UPDATE blobs SET license_id = #{License.find(:first,:conditions=>[ 'unique_name = ?', b.license_name ]).id } WHERE id = #{b.id}")
-#   end 
-#   remove_column :workflows, :license_name
-#   remove_column :blobs, :license_name
+    Workflow.find(:all).each do |w|
+      execute("UPDATE workflows SET license_id = #{License.find(:first,:conditions=>[ 'unique_name = ?', w.license_name ]).id } WHERE id = #{w.id}")
+    end
+    Blob.find(:all).each do |b|
+      execute("UPDATE blobs SET license_id = #{License.find(:first,:conditions=>[ 'unique_name = ?', b.license_name ]).id } WHERE id = #{b.id}")
+    end 
+    remove_column :workflows, :license_name
+    remove_column :blobs, :license_name
   end
   
   def self.down
-#   add_column :workflows, :license, :string, 
-#              :limit => 10, :null => false, 
-#              :default => "by-sa"
-#              
-#   add_column :blobs, :license, :string, 
-#              :limit => 10, :null => false, 
-#              :default => "by-sa"
-#   Workflow.find(:all).each do |w|
-#     execute("UPDATE workflows SET license = '#{License.find(w.license_id).unique_name }' WHERE id = #{w.id}")
-#   end
-#   Blob.find(:all).each do |b|
-#     execute("UPDATE blobs SET license = '#{License.find(b.license_id).unique_name }' WHERE id = #{b.id}")
-#   end
-#   remove_column :workflows, :license_id
-#   remove_column :blobs, :license_id
+    add_column :workflows, :license, :string, 
+               :limit => 10, :null => false, 
+               :default => "by-sa"
+
+    add_column :blobs, :license, :string, 
+               :limit => 10, :null => false, 
+               :default => "by-sa"
+    Workflow.find(:all).each do |w|
+      execute("UPDATE workflows SET license = '#{License.find(w.license_id).unique_name }' WHERE id = #{w.id}")
+    end
+    Blob.find(:all).each do |b|
+      execute("UPDATE blobs SET license = '#{License.find(b.license_id).unique_name }' WHERE id = #{b.id}")
+    end
+    remove_column :workflows, :license_id
+    remove_column :blobs, :license_id
   end
 end

Modified: trunk/db/migrate/090_adjust_pictures.rb (3064 => 3065)


--- trunk/db/migrate/090_adjust_pictures.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/migrate/090_adjust_pictures.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -20,7 +20,7 @@
       workflow_svg[workflow.id]   = workflow.svg_fc
     end
 
-    Workflow::Version.find(:all, :select => 'id, image AS image_fc, svg AS svg_fc').each do |workflow_version|
+    WorkflowVersion.find(:all, :select => 'id, image AS image_fc, svg AS svg_fc').each do |workflow_version|
       workflow_version_image[workflow_version.id] = workflow_version.image_fc
       workflow_version_svg[workflow_version.id]   = workflow_version.svg_fc
     end
@@ -44,7 +44,7 @@
       end
     end
       
-    Workflow::Version.find(:all).each do |workflow_version|
+    WorkflowVersion.find(:all).each do |workflow_version|
 
       if workflow_version_image[workflow_version.id] || workflow_version_svg[workflow_version.id]
 

Copied: trunk/db/migrate/096_create_blob_versions.rb (from rev 3064, branches/versions/db/migrate/096_create_blob_versions.rb) (0 => 3065)


--- trunk/db/migrate/096_create_blob_versions.rb	                        (rev 0)
+++ trunk/db/migrate/096_create_blob_versions.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,36 @@
+# myExperiment: db/migrate/096_create_blob_versions.rb
+#
+# Copyright (c) 2012 University of Manchester and the University of Southampton.
+# See license.txt for details.
+
+class CreateBlobVersions < ActiveRecord::Migration
+
+  def self.up
+    create_table :blob_versions do |t|
+      t.integer  "blob_id"
+      t.integer  "version"
+      t.text     "revision_comments"
+      t.string   "title"
+      t.text     "body"
+      t.text     "body_html"
+      t.integer  "content_type_id"
+      t.integer  "content_blob_id"
+      t.string   "local_name"
+      t.datetime "created_at"
+      t.datetime "updated_at"
+    end
+
+    add_column :blobs, :current_version, :integer
+
+    execute "UPDATE blobs SET current_version = 1"
+
+    execute "INSERT INTO blob_versions (blob_id, version, title, body, body_html, content_type_id, content_blob_id, local_name, created_at, updated_at) SELECT id, 1, title, body, body_html, content_type_id, content_blob_id, local_name, created_at, updated_at FROM blobs"
+  end
+
+  def self.down
+    remove_column :blobs, :current_version
+
+    drop_table :blob_versions
+  end
+end
+

Modified: trunk/db/schema.rb (3064 => 3065)


--- trunk/db/schema.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/db/schema.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 94) do
+ActiveRecord::Schema.define(:version => 96) do
 
   create_table "activity_limits", :force => true do |t|
     t.string   "contributor_type", :null => false
@@ -45,6 +45,20 @@
     t.text   "schema"
   end
 
+  create_table "blob_versions", :force => true do |t|
+    t.integer  "blob_id"
+    t.integer  "version"
+    t.text     "revision_comments"
+    t.string   "title"
+    t.text     "body"
+    t.text     "body_html"
+    t.integer  "content_type_id"
+    t.integer  "content_blob_id"
+    t.string   "local_name"
+    t.datetime "created_at"
+    t.datetime "updated_at"
+  end
+
   create_table "blobs", :force => true do |t|
     t.integer  "contributor_id"
     t.string   "contributor_type"
@@ -57,6 +71,7 @@
     t.integer  "content_blob_id"
     t.integer  "content_type_id"
     t.integer  "license_id"
+    t.integer  "current_version"
   end
 
   create_table "blog_posts", :force => true do |t|
@@ -740,6 +755,7 @@
     t.string   "reset_password_code"
     t.datetime "reset_password_code_until"
     t.string   "account_status"
+    t.integer  "spam_score"
   end
 
   create_table "viewings", :force => true do |t|
@@ -792,6 +808,8 @@
     t.integer  "preview_id"
   end
 
+  add_index "workflow_versions", ["workflow_id"], :name => "index_workflow_versions_on_workflow_id"
+
   create_table "workflows", :force => true do |t|
     t.integer  "contributor_id"
     t.string   "contributor_type"

Modified: trunk/lib/authorization.rb (3064 => 3065)


--- trunk/lib/authorization.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/lib/authorization.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -602,11 +602,11 @@
 
   def Authorization.categorize_action(action_name)
     case action_name
-      when 'show', 'index', 'view', 'search', 'favourite', 'favourite_delete', 'comment', 'comment_delete', 'comments', 'comments_timeline', 'rate', 'tag',  'items', 'statistics', 'curation', 'tag_suggestions', 'extra_metadata', 'read', 'verify'
+      when 'show', 'index', 'view', 'search', 'favourite', 'favourite_delete', 'comment', 'comment_delete', 'comments', 'comments_timeline', 'rate', 'tag',  'items', 'statistics', 'curation', 'suggestions', 'tag_suggestions', 'extra_metadata', 'read', 'verify'
         action = ''
-      when 'edit', 'new', 'create', 'update', 'new_version', 'create_version', 'destroy_version', 'edit_version', 'update_version', 'new_item', 'create_item', 'edit_item', 'update_item', 'quick_add', 'resolve_link', 'process_tag_suggestions', 'process_extra_metadata', 'edit_relationships'
+      when 'edit', 'new', 'create', 'update', 'new_version', 'create_version', 'destroy_version', 'edit_version', 'update_version', 'new_item', 'create_item', 'edit_item', 'update_item', 'quick_add', 'resolve_link', 'process_suggestions', 'process_tag_suggestions', 'process_extra_metadata', 'edit_relationships'
         action = ''
-      when 'download', 'named_download', 'launch', 'submit_job', 'save_inputs', 'refresh_status', 'rerun', 'refresh_outputs', 'render_output', 'outputs_xml', 'outputs_package', 'galaxy_tool', 'galaxy_tool_download'
+      when 'download', 'named_download', 'named_download_with_version', 'launch', 'submit_job', 'save_inputs', 'refresh_status', 'rerun', 'refresh_outputs', 'render_output', 'outputs_xml', 'outputs_package', 'galaxy_tool', 'galaxy_tool_download'
         action = ''
       when 'destroy', 'delete', 'destroy_item'
         action = ''

Deleted: trunk/lib/explicit_versioning.rb (3064 => 3065)


--- trunk/lib/explicit_versioning.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/lib/explicit_versioning.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1,380 +0,0 @@
-module Jits
-  module Acts
-    # Based heavily on the acts_as_versioned plugin
-    module ExplicitVersioning
-      CALLBACKS = [:sync_latest_version]
-      def self.included(mod) # :nodoc:
-        mod.extend(ClassMethods)
-      end
-      
-      module ClassMethods
-        def explicit_versioning(options = {}, &extension)
-          # don't allow multiple calls
-          return if self.included_modules.include?(Jits::Acts::ExplicitVersioning::ActMethods)
-          
-          send :include, Jits::Acts::ExplicitVersioning::ActMethods
-          
-          cattr_accessor :versioned_class_name, :versioned_foreign_key, :versioned_table_name, :versioned_inheritance_column, 
-            :version_column, :version_sequence_name, :non_versioned_columns, :file_columns, :extra_attributes, :white_list_columns, :revision_comments_column, 
-            :version_association_options, :timestamp_columns, :sync_ignore_columns
-            
-          self.versioned_class_name         = options[:class_name]  || "Version"
-          self.versioned_foreign_key        = options[:foreign_key] || self.to_s.foreign_key
-          self.versioned_table_name         = options[:table_name]  || "#{table_name_prefix}#{base_class.name.demodulize.underscore}_versions#{table_name_suffix}"
-          self.versioned_inheritance_column = options[:inheritance_column] || "versioned_#{inheritance_column}"
-          self.version_column               = options[:version_column]     || 'version'
-          self.non_versioned_columns        = [self.primary_key, inheritance_column, 'version', 'lock_version', versioned_inheritance_column, version_column]
-          self.file_columns                 = options[:file_columns] || []
-          self.extra_attributes             = options[:extra_attributes] || []
-          self.white_list_columns           = options[:white_list_columns] || []
-          self.revision_comments_column     = options[:revision_comments_column]  || "revision_comments"
-          self.version_association_options  = {
-                                                :class_name  => "#{self.to_s}::#{versioned_class_name}",
-                                                :foreign_key => "#{versioned_foreign_key}",
-                                                :order       => 'version',
-                                                :dependent   => :destroy
-                                              }.merge(options[:association_options] || {})
-          self.timestamp_columns            = options[:timestamp_columns]  || [ "created_at", "updated_at" ]
-          self.sync_ignore_columns          = options[:sync_ignore_columns]  || []
-                                                      
-          class_eval do
-            has_many :versions, version_association_options
-            
-            before_create :set_new_version
-            after_create :save_version_on_create
-            after_update :sync_latest_version
-          end
-
-          # create the dynamic versioned model
-          const_set(versioned_class_name, Class.new(ActiveRecord::Base)).class_eval do
-            def self.reloadable? ; false ; end
-          end
-          
-          versioned_resource = self.to_s.demodulize.underscore.to_sym
-
-          versioned_class.set_table_name versioned_table_name
-          versioned_class.belongs_to versioned_resource, 
-            :class_name  => "::#{self.to_s}", 
-            :foreign_key => versioned_foreign_key
-
-          versioned_class.class_eval("alias_method :versioned_resource, :#{versioned_resource}")
-
-          if block_given?
-            versioned_class.class_eval(&extension)
-          end
-
-        end
-      end
-      
-      module ActMethods
-        def self.included(base) # :nodoc:
-          base.extend ClassMethods
-        end
-        
-        # Finds a specific version of this model.
-        def find_version(version)
-          return version if version.is_a?(self.class.versioned_class)
-          return nil if version.is_a?(ActiveRecord::Base)
-          find_versions(:conditions => ['version = ?', version], :limit => 1).first
-        end
-        
-        # Finds versions of this model.  Takes an options hash like <tt>find</tt>
-        def find_versions(options = {})
-          versions.find(:all, options)
-        end
-        
-        # Saves the object as a new version and also saves the original object as the new version.
-        # Make sure to create (and thus save) any inner associations beforehand as these won't be saved here.
-        def save_as_new_version(revision_comment=nil)
-          return false unless self.valid?
-          without_update_callbacks do 
-            set_new_version
-            save_version_on_create(revision_comment)
-            self.save
-          end
-        end
-        
-        def update_version(version_number_to_update, attributes)
-          return false if version_number_to_update.nil? or version_number_to_update.to_i < 1
-          return false if attributes.nil? or attributes.empty?
-          return false unless (ver = find_version(version_number_to_update))
-          
-          rtn = ver.update_attributes(attributes)
-          
-          if rtn
-            # if the latest version has been updated then update the main table as well
-            if version_number_to_update.to_i == eval("#{self.class.version_column}")
-              return update_main_to_version(version_number_to_update, true)
-            else
-              return true
-            end
-          else
-            return false
-          end
-        end
-        
-        def destroy_version(version_number)
-          if (ver = find_version(version_number))
-            without_update_callbacks do 
-              # For fault tolerance (ie: to prevent data loss through premature deletion), first...
-              # Check to see if the current (aka latest) version has to be deleted,
-              # and if so update the main table with the data from the version that will become the latest
-              if version_number.to_i == eval("#{self.class.version_column}")
-                if versions.count > 1
-                  to_be_latest_version = versions[versions.count-2].version
-                else
-                  return false
-                end
-                success = update_main_to_version(to_be_latest_version)
-              end
-              
-              # Then... delete the version
-              if success
-                retrn ver.destroy
-              else
-                return false
-              end
-            end
-          end
-        end
-
-        def describe_version(version_number)
-          return "" if versions.count < 2
-          return "(earliest)" if version_number == versions.first.version
-          return "(latest)" if version_number == versions.last.version
-          return ""
-        end
-        
-        def without_update_callbacks(&block)
-          self.class.without_update_callbacks(&block)
-        end
-        
-        def empty_callback() end #:nodoc:
-        
-        protected
-        
-          def set_new_version
-            self.send("#{self.class.version_column}=", self.next_version)
-          end
-          
-          # Saves a version of the model in the versioned table. This is called in the after_create callback by default
-          def save_version_on_create(revision_comment=nil)
-            rev = self.class.versioned_class.new
-            rev.version = send(self.class.version_column)
-            rev.send("#{self.class.revision_comments_column}=", revision_comment)
-            rev.send("#{self.class.versioned_foreign_key}=", self.id)
-            self.clone_versioned_model(self, rev)
-            saved = rev.save
-            
-            if saved
-              # Now update timestamp columns on main model. 
-              # Note: main model doesnt get saved yet.
-              update_timestamps(rev, self)
-            end
-            
-            return saved
-          end
-          
-          def update_timestamps(from, to)
-            begin  
-              self.timestamp_columns.each do |key|
-                if to.has_attribute?(key)
-                  logger.debug("explicit_versioning - update_timestamps method - setting timestamp_column '#{key}'")
-                  if eval("from.#{key}.nil?")
-                    to.send("#{key}=", nil)
-                  else
-                    to.send("#{key}=", eval("from.#{key}"))
-                  end
-                end
-              end
-            rescue => err
-              logger.error("ERROR: An error occurred in the explicit_versioning plugin during the update_timestamps method (setting timestamp columns).")
-              logger.error("ERROR DETAILS: #{err}")
-            end
-          end
-          
-          # This method updates the latest version entry in the versioned table with the data 
-          # from the main table (since those two entries should always have the same data).
-          def sync_latest_version
-            ver = versions.last
-            clone_versioned_model(self, ver)
-            ver.save
-          end
-          
-          # This method updates the entry in the main table with the data from the version specified,
-          # and also updates the corresponding version column in the main table to reflect this.
-          # Note: this method on its own should not be used to revert to previous versions as it doesn't actualy delete any versions.
-          def update_main_to_version(version_number, process_file_columns=true)
-            if (ver = find_version(version_number))
-              clone_versioned_model(ver, self, process_file_columns)
-              self.send("#{self.class.version_column}=", version_number)
-              
-              # Now update timestamp columns on main model. 
-              update_timestamps(ver, self)
-                
-              return self.save
-            else
-              return false
-            end
-          end
-          
-          # Clones a model.
-          def clone_versioned_model(orig_model, new_model, process_file_columns=true)
-            self.versioned_attributes.each do |key|
-              # Make sure to ignore file columns, white list columns, timestamp columns and any other ignore columns
-              unless self.file_columns.include?(key) || 
-                     self.white_list_columns.include?(key) || 
-                     self.timestamp_columns.include?(key) ||
-                     self.sync_ignore_columns.include?(key)
-                new_model.send("#{key}=", eval("orig_model.#{key}")) if orig_model.respond_to?(key)
-              end
-            end
-            
-            if process_file_columns
-              # Now copy over file columns
-              begin
-                self.file_columns.each do |key|
-                  if orig_model.has_attribute?(key)
-                    if eval("orig_model.#{key}.nil?")
-                      logger.debug("DEBUG: file column is nil")
-                      new_model.send("#{key}=", nil)
-                    else
-                      logger.debug("DEBUG: file column is not nil")
-                      new_model.send("#{key}=", File.open(eval("orig_model.#{key}")))
-                      FileUtils.cp(eval("orig_model.#{key}"), eval("new_model.#{key}"))
-                    end
-                  end
-                end
-              rescue => err
-                logger.error("ERROR: An error occurred in the explicit_versioning plugin during the clone_versioned_model method (copying file columns).")
-                logger.error("ERROR DETAILS: #{err}")
-              end
-            end
-            
-            # Now set white list columns
-            begin  
-              self.white_list_columns.each do |key|
-                if orig_model.has_attribute?(key)
-                  if eval("orig_model.#{key}.nil?")
-                    new_model.send("#{key}=", nil)
-                  else
-                    new_model.send("#{key}=", eval("orig_model.#{key}"))
-                  end
-                end
-              end
-            rescue => err
-              logger.error("ERROR: An error occurred in the explicit_versioning plugin during the clone_versioned_model method (setting white list columns).")
-              logger.error("ERROR DETAILS: #{err}")
-            end
-            
-            # Set version column accordingly.
-            if orig_model.is_a?(self.class.versioned_class)
-              new_model[new_model.class.inheritance_column] = orig_model[self.class.versioned_inheritance_column]
-            elsif new_model.is_a?(self.class.versioned_class)
-              new_model[self.class.versioned_inheritance_column] = orig_model[orig_model.class.inheritance_column]
-            end
-          end 
-          
-          # Gets the next available version for the current record, or 1 for a new record
-          def next_version
-            return 1 if new_record?
-            (versions.calculate(:max, :version) || 0) + 1
-          end
-          
-          # Returns an array of attribute keys that are versioned.  See non_versioned_columns
-          def versioned_attributes
-            self.attributes.keys.select { |k| !self.class.non_versioned_columns.include?(k) } + extra_attributes
-          end
-        
-        module ClassMethods
-          # Finds a specific version of a specific row of this model
-          def find_version(id, version)
-            find_versions(id, 
-              :conditions => ["#{versioned_foreign_key} = ? AND version = ?", id, version], 
-              :limit => 1).first
-          end
-        
-          # Finds versions of a specific model.  Takes an options hash like <tt>find</tt>
-          def find_versions(id, options = {})
-            versioned_class.find :all, {
-              :conditions => ["#{versioned_foreign_key} = ?", id],
-              :order      => 'version' }.merge(options)
-          end
-          
-          # Returns an array of columns that are versioned.  See non_versioned_columns
-          def versioned_columns
-            self.columns.select { |c| !non_versioned_columns.include?(c.name) }
-          end
-    
-          # Returns an instance of the dynamic versioned model
-          def versioned_class
-            const_get versioned_class_name
-          end
-
-          # Rake migration task to create the versioned table using options passed
-          def create_versioned_table(create_table_options = {})
-            # create version column in main table if it does not exist
-            if !self.content_columns.find { |c| %w(version lock_version).include? c.name }
-              self.connection.add_column table_name, :version, :integer
-            end
-            
-            self.connection.create_table(versioned_table_name, create_table_options) do |t|
-              t.column versioned_foreign_key, :integer
-              t.column :version, :integer
-              t.column revision_comments_column, :text
-            end
-            
-            updated_col = nil
-            self.versioned_columns.each do |col| 
-              updated_col = col if !updated_col && %(updated_at updated_on).include?(col.name)
-              self.connection.add_column versioned_table_name, col.name, col.type, 
-                :limit => col.limit, 
-                :default => col.default
-            end
-        
-            if type_col = self.columns_hash[inheritance_column]
-              self.connection.add_column versioned_table_name, versioned_inheritance_column, type_col.type, 
-                :limit => type_col.limit, 
-                :default => type_col.default
-            end
-    
-            if updated_col.nil?
-              self.connection.add_column versioned_table_name, :updated_at, :timestamp
-            end
-          end
-          
-          # Rake migration task to drop the versioned table
-          def drop_versioned_table
-            self.connection.drop_table versioned_table_name
-          end
-          
-          # Executes the block with the update callbacks disabled.
-          #
-          #   Foo.without_update_callbacks do
-          #     @foo.save
-          #   end
-          #
-          def without_update_callbacks(&block)
-            class_eval do 
-              CALLBACKS.each do |attr_name|
-                alias_method "orig_#{attr_name}".to_sym, attr_name
-                alias_method attr_name, :empty_callback
-              end
-            end
-            block.call
-          ensure
-            class_eval do 
-              CALLBACKS.each do |attr_name|
-                alias_method attr_name, "orig_#{attr_name}".to_sym
-              end
-            end
-          end
-        end
-      end
-    end
-  end
-end
-
-ActiveRecord::Base.class_eval do
-  include Jits::Acts::ExplicitVersioning
-end

Modified: trunk/lib/previews.rb (3064 => 3065)


--- trunk/lib/previews.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/lib/previews.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -5,7 +5,7 @@
 
     self.class_eval do
 
-      belongs_to :preview, :dependent => :destroy
+      belongs_to :preview, :dependent => :destroy, :autosave => true
 
       def image
         preview.image_blob.data if preview && preview.image_blob
@@ -17,6 +17,8 @@
 
       def image=(x)
 
+        x = x.read if x.respond_to?(:read)
+
         self.preview = Preview.new if self.preview.nil?
         self.preview.image_blob = ContentBlob.new if self.preview.image_blob.nil?
 
@@ -25,34 +27,13 @@
 
       def svg=(x)
 
+        x = x.read if x.respond_to?(:read)
+
         self.preview = Preview.new if self.preview.nil?
         self.preview.svg_blob = ContentBlob.new if self.preview.svg_blob.nil?
 
         self.preview.svg_blob.data = x
       end
-
-      after_save { |ob|
-      
-        p = ob.preview
-
-        if p
-
-          ib = p.image_blob
-          sb = p.svg_blob
-
-          if ib && ib.data_changed?
-            ib.save
-            ob.preview.clear_cache
-          end
-
-          if sb && sb.data_changed?
-            sb.save
-            ob.preview.clear_cache
-          end
-          
-          p.save
-        end
-      }
     end
   end
 end

Modified: trunk/lib/rest.rb (3064 => 3065)


--- trunk/lib/rest.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/lib/rest.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -684,7 +684,7 @@
     when 'Attribution';     return nil
     when 'Tagging';         return nil
 
-    when 'Workflow::Version'; return "#{rest_resource_uri(ob.workflow)}?version=#{ob.version}"
+    when 'WorkflowVersion'; return "#{rest_resource_uri(ob.workflow)}?version=#{ob.version}"
   end
 
   raise "Class not processed in rest_resource_uri: #{ob.class.to_s}"
@@ -728,7 +728,7 @@
     when 'Creditation';     return "#{base}/credit.xml?id=#{ob.id}"
     when 'Attribution';     return nil
 
-    when 'Workflow::Version'; return "#{base}/workflow.xml?id=#{ob.workflow.id}&version=#{ob.version}"
+    when 'WorkflowVersion'; return "#{base}/workflow.xml?id=#{ob.workflow.id}&version=#{ob.version}"
   end
 
   raise "Class not processed in rest_access_uri: #{ob.class.to_s}"
@@ -752,7 +752,7 @@
     when 'Download';               return 'download'
     when 'PackContributableEntry'; return rest_object_tag_text(ob.contributable)
     when 'PackRemoteEntry';        return 'external'
-    when 'Workflow::Version';      return 'workflow'
+    when 'WorkflowVersion';        return 'workflow'
     when 'Comment';                return 'comment'
     when 'Bookmark';               return 'favourite'
     when 'ContentType';            return 'type'
@@ -784,7 +784,7 @@
     when 'Download';               return ''
     when 'PackContributableEntry'; return rest_object_label_text(ob.contributable)
     when 'PackRemoteEntry';        return ob.title     
-    when 'Workflow::Version';      return ob.title
+    when 'WorkflowVersion';        return ob.title
     when 'ContentType';            return ob.title
     when 'License';                return ob.title
     when 'CurationEvent';          return ob.category
@@ -1090,12 +1090,15 @@
       return rest_response(500, :reason => "Unable to extract metadata")
     end
 
-    success = if (action == 'create' and opts[:query]['id'])
-      ob.save_as_new_version(revision_comment)
-    else
-      ob.save
+    new_version = action == 'create' && opts[:query]['id']
+
+    if new_version
+      ob.preview = nil
+      ob[:revision_comments] = revision_comment
     end
 
+    success = ob.save
+
     return rest_response(400, :object => ob) unless success
 
     # Elements to update if we're not dealing with a workflow version
@@ -1137,7 +1140,11 @@
   case action
     when 'create':
       return rest_response(401, :reason => "Not authorised to create a file") unless Authorization.is_authorized_for_type?('create', 'Blob', opts[:user], nil)
-      ob = Blob.new(:contributor => opts[:user])
+      if opts[:query]['id']
+        ob, error = obtain_rest_resource('Blob', opts[:query]['id'], opts[:query]['version'], opts[:user], action)
+      else
+        ob = Blob.new(:contributor => opts[:user])
+      end
     when 'read', 'update', 'destroy':
       ob, error = obtain_rest_resource('Blob', opts[:query]['id'], opts[:query]['version'], opts[:user], action)
     else
@@ -1148,18 +1155,21 @@
 
   if action == "destroy"
 
+    return rest_response(400, :reason => "Cannot delete individual versions") if opts[:query]['version']
+      
     ob.destroy
 
   else
 
     data = ""
 
-    title        = parse_element(data, :text,   '/file/title')
-    description  = parse_element(data, :text,   '/file/description')
-    license_type = parse_element(data, :text,   '/file/license-type')
-    type         = parse_element(data, :text,   '/file/type')
-    content_type = parse_element(data, :text,   '/file/content-type')
-    content      = parse_element(data, :binary, '/file/content')
+    title            = parse_element(data, :text,   '/file/title')
+    description      = parse_element(data, :text,   '/file/description')
+    license_type     = parse_element(data, :text,   '/file/license-type')
+    type             = parse_element(data, :text,   '/file/type')
+    content_type     = parse_element(data, :text,   '/file/content-type')
+    content          = parse_element(data, :binary, '/file/content')
+    revision_comment = parse_element(data, :text,   '/workflow/revision-comment')
 
     permissions  = data.find_first('/file/permissions')
 
@@ -1211,18 +1221,29 @@
 
     ob.content_blob = ContentBlob.new(:data ="" content) if content
 
-    if not ob.save
-      return rest_response(400, :object => ob)
+    new_version = action == 'create' && opts[:query][:id]
+
+    if new_version
+      ob[:revision_comments] = revision_comment
     end
 
-    if ob.contribution.policy.nil?
-      ob.contribution.policy = create_default_policy(opts[:user])
-      ob.contribution.save
+    success = ob.save
+
+    return rest_response(400, :object => ob) unless success
+
+    if opts[:query]['version'].nil?
+
+      if ob.contribution.policy.nil?
+        ob.contribution.policy = create_default_policy(opts[:user])
+        ob.contribution.save
+      end
+
+      update_permissions(ob, permissions)
     end
-
-    update_permissions(ob, permissions)
   end
 
+  ob = ob.versioned_resource if ob.respond_to?("versioned_resource")
+
   rest_get_request(ob, opts[:user], { "id" => ob.id.to_s })
 end
 
@@ -2236,10 +2257,10 @@
 # Call dispatcher
 
 def rest_call_request(opts)
-  begin
+# begin
     send(opts[:rules]['Function'], opts)
-  rescue
-    return rest_response(500)
-  end
+# rescue
+#   return rest_response(500)
+# end
 end
 

Modified: trunk/lib/sanity_test.rb (3064 => 3065)


--- trunk/lib/sanity_test.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/lib/sanity_test.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -57,9 +57,10 @@
   blogs         = Blog.find(:all)
   blobs         = Blob.find(:all)
   packs         = Pack.find(:all)
+  services      = Service.find(:all)
   contributions = Contribution.find(:all)
 
-  known_contributables = workflows + blobs + blogs + packs
+  known_contributables = workflows + blobs + blogs + packs + services
 
   should_be_empty("All users must have a name",
       users.select do |u| u.name == nil or u.name.length == 0 end)

Modified: trunk/public/_javascript_s/tabs.js (3064 => 3065)


--- trunk/public/_javascript_s/tabs.js	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/public/_javascript_s/tabs.js	2012-07-31 15:20:18 UTC (rev 3065)
@@ -69,20 +69,27 @@
 
 function showFragment(fragment, scroll) {
 
-  var root = document.all ? "BODY" : "HTML";
-  var el   = document.getElementById(fragment);
+  var root   = document.all ? "BODY" : "HTML";
+  var target = document.getElementById(fragment);
 
-  if (el != undefined) {
+  if (target == undefined) {
+    var namedElements = document.getElementsByName(fragment);
 
-    for (; el.tagName != root; el = parent_el(el)) {
-      if (el.className == 'tabContainer') {
-        selectTab(el.tabsDiv, el.tabsIndex);
-      }
+    if (namedElements.length > 0)
+      target = namedElements[0];
+  }
+
+  if (target == undefined)
+    return;
+
+  for (el = target; el.tagName != root; el = parent_el(el)) {
+    if (el.className == 'tabContainer') {
+      selectTab(el.tabsDiv, el.tabsIndex);
     }
   }
 
   if (scroll) {
-    document.getElementById(fragment).scrollIntoView(false);
+    target.scrollIntoView(false);
   }
 }
 

Modified: trunk/public/stylesheets/styles.css (3064 => 3065)


--- trunk/public/stylesheets/styles.css	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/public/stylesheets/styles.css	2012-07-31 15:20:18 UTC (rev 3065)
@@ -1254,16 +1254,6 @@
 	border: 1px solid #CCCCCC;
 }
 
-.contribution_version_meta_info_box {
-	padding: 0.3em 0.6em; 
-	border: 1px dotted #999999;
-	background-color: #FFFFCC;
-	color: #333333;
-	line-height: 1.2;
-	font-size: 85%;
-	margin-left: 2.5em;  
-}
-
 .contribution_currentlicense {
 	padding: 0 0 0.5em 0;
 }
@@ -2335,3 +2325,22 @@
   background: #ffc0c0;
 }
 
+.version_history .title {
+  font-size: 16px;
+}
+
+.version_history .metadata {
+  margin-left: 12px;
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+
+.version_history .comment {
+	padding: 6px;
+	border: 1px dotted #999999;
+	background-color: #FFFFCC;
+	color: #333333;
+	line-height: 1.2;
+	font-size: 85%;
+}
+

Copied: trunk/test/fixtures/blob_versions.yml (from rev 3064, branches/versions/test/fixtures/blob_versions.yml) (0 => 3065)


--- trunk/test/fixtures/blob_versions.yml	                        (rev 0)
+++ trunk/test/fixtures/blob_versions.yml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -0,0 +1,74 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+
+picture:
+  id: 1
+  blob_id: 1
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_picture.png
+  title: Picture
+  body: some text
+  created_at: 2008-04-22 15:32:01
+  content_type_id: 1
+  content_blob_id: 1
+
+text:
+  id: 2
+  blob_id: 2
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_text.txt
+  title: developers.txt
+  body: myExperiment instructions
+  created_at: 2007-01-01 00:00:03
+  content_type_id: 2
+  content_blob_id: 2
+
+for_true_policy:
+  id: 3
+  blob_id: 3
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_picture.png
+  title: for true policy
+  body: some text
+  created_at: 2008-04-22 15:32:01
+  content_type_id: 1
+  content_blob_id: 1
+
+for_false_policy:
+  id: 4
+  blob_id: 4
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_picture.png
+  title: for false policy
+  body: some text
+  created_at: 2008-04-22 15:32:01
+  content_type_id: 1
+  content_blob_id: 1
+
+for_protected_policy:
+  id: 5
+  blob_id: 5
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_picture.png
+  title: for protected policy
+  body: some text
+  created_at: 2008-04-22 15:32:01
+  content_type_id: 1
+  content_blob_id: 1
+
+for_public_policy:
+  id: 6
+  blob_id: 6
+  version: 1
+  revision_comments: some revision comment
+  local_name: file_picture.png
+  title: for public policy
+  body: some text
+  created_at: 2008-04-22 15:32:01
+  content_type_id: 1
+  content_blob_id: 1
+

Modified: trunk/test/fixtures/blobs.yml (3064 => 3065)


--- trunk/test/fixtures/blobs.yml	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/test/fixtures/blobs.yml	2012-07-31 15:20:18 UTC (rev 3065)
@@ -2,6 +2,7 @@
 
 picture:
   id: 1
+  current_version: 1
   contributor_id: 1
   contributor_type: User
   local_name: file_picture.png
@@ -14,6 +15,7 @@
 
 text:
   id: 2
+  current_version: 1
   contributor_id: 2
   contributor_type: User
   local_name: file_text.txt
@@ -26,6 +28,7 @@
 
 for_true_policy:
   id: 3
+  current_version: 1
   contributor_id: 1
   contributor_type: User
   local_name: file_picture.png
@@ -38,6 +41,7 @@
 
 for_false_policy:
   id: 4
+  current_version: 1
   contributor_id: 1
   contributor_type: User
   local_name: file_picture.png
@@ -50,6 +54,7 @@
 
 for_protected_policy:
   id: 5
+  current_version: 1
   contributor_id: 1
   contributor_type: User
   local_name: file_picture.png
@@ -62,6 +67,7 @@
 
 for_public_policy:
   id: 6
+  current_version: 1
   contributor_id: 1
   contributor_type: User
   local_name: file_picture.png

Modified: trunk/test/functional/api_controller_test.rb (3064 => 3065)


--- trunk/test/functional/api_controller_test.rb	2012-07-31 14:50:51 UTC (rev 3064)
+++ trunk/test/functional/api_controller_test.rb	2012-07-31 15:20:18 UTC (rev 3065)
@@ -115,11 +115,13 @@
 
     title        = "Test file title"
     title2       = "Updated test file title"
+    title3       = "Updated test file title for versions"
     license_type = "by-sa"
     content_type = "text/plain"
     description  = "A description of the test file."
 
-    content = Base64.encode64("This is the content of this test file.")
+    content  = Base64.encode64("This is the content of this test file.")
+    content2 = Base64.encode64("This is the content of this test file, version 2.")
 
     # post a file
 
@@ -140,6 +142,9 @@
 
     file = extra_files.first
 
+    assert_equal(file.versions.length, 1)
+    assert_equal(file.versions.first.version, 1)
+
     # get the file
 
     response = rest_request(:get, 'file', nil, "id" => file.id,
@@ -185,6 +190,53 @@
     assert_equal(title2,      response.find_first('/file/title').inner_xml)
     assert_equal(description, response.find_first('/file/description').inner_xml)
 
+    # add a new version of the file
+
+    rest_request(:post, 'file', "<?xml version='1.0'?>
+      <file>
+        <title>#{title2}</title>
+        <description>#{description}</description>
+        <license-type>#{license_type}</license-type>
+        <content-type>#{content_type}</content-type>
+        <content>#{content2}</content>
+      </file>", "id" => file.id)
+
+    assert_response(:success)
+
+    file.reload
+
+    assert_equal(2, file.versions.length)
+
+    # update the first version of the file
+
+    rest_request(:put, 'file', "<?xml version='1.0'?>
+      <file>
+        <title>#{title3}</title>
+      </file>", "id" => file.id, "version" => 1)
+
+    assert_response(:success)
+
+    file.reload
+    assert_equal(title3, file.find_version(1).title);
+    assert_equal(title2, file.find_version(2).title);
+    assert_equal(title2, file.title);
+
+    # get each version of the file
+
+    response = rest_request(:get, 'file', nil, "id" => file.id, "version" => "1",
+        "elements" => "title")
+
+    assert_response(:success)
+  
+    assert_equal(title3, response.find_first('/file/title').inner_xml)
+
+    response = rest_request(:get, 'file', nil, "id" => file.id, "version" => "2",
+        "elements" => "title")
+
+    assert_response(:success)
+  
+    assert_equal(title2, response.find_first('/file/title').inner_xml)
+
     # delete the file
 
     rest_request(:delete, 'file', nil, "id" => file.id)

reply via email to

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