danmunn / redmine_dmsf

Fork of svn repository for redmine_dmsf
GNU General Public License v2.0
418 stars 194 forks source link

Delete previous revisions #1432

Closed SinghNanak closed 1 year ago

SinghNanak commented 1 year ago

Provide a functionality that will enable a certain user with privileges to a folder to delete all previous revisions of every file inside selected folders. It would be much great if there was a choice to save the latest 2, 3 or n number of revisions while deleting the others.

picman commented 1 year ago

It sounds interesting. However, I cannot imagine any usage for other users.

SinghNanak commented 1 year ago

@picman Many users will benefit from and be attracted to this plugin. For instance, many users have large files. Several new users work in fields other than software development. These new users only want older revisions of their files when the project is active however, when the project is Done or completed only the most recent files are important when closing a project, deleting previous revisions will reduces the project's size from 80 GB to 4 GB.

SinghNanak commented 1 year ago
pmap.permission :delete_older_revisions => [:delete_revision, :file_delete]
items << {:name => l(:label_dmsf_delete_older_revisions),
          :url => {:controller => 'files', :action => 'delete_older_revisions'},
          :icon => 'delete',
          :class => 'icon icon-del'}
class DmsfController < ApplicationController
  include DmsfHelper

  before_action :find_file, only: [:delete_older_revisions]
  before_action :authorize_global, only: [:delete_older_revisions]

  def delete_older_revisions
    if request.post?
      revisions_to_keep = params[:revisions_to_keep].to_i
      @file.delete_older_revisions(revisions_to_keep)
      redirect_to :controller => 'files', :action => 'index', :folder_id => @file.folder_id
    else
      respond_to do |format|
        format.js
      end
    end
  end

  private

  def find_file
    @file = File.find(params[:id])
  end
end
<% title = l(:label_dmsf_delete_older_revisions) %>
<%= javascript_tag do %>
  $(file).ready(function() {
    var fileId = '<%= @file.id %>';
    var revisionsCount = '<%= @file.revisions.count %>';
    var defaultRevisionsToKeep = 1;
    var content = '<p><%= l(:label_dmsf_delete_older_revisions_info) %></p>' +
                  '<p><%= l(:label_dmsf_delete_older_revisions_info_current, revisionsCount) %></p>' +
                  '<label for="revisions_to_keep"><%= l(:label_dmsf_delete_older_revisions_input) %></label>' +
                  '<input type="number" id="revisions_to_keep" value="' + defaultRevisionsToKeep + '" min="1" max="' + revisionsCount + '" required>';

    var dialog = createDialog(title, content, [
      {
        text: '<%= l(:button_cancel) %>',
        click: function() {
          $(this).dialog('close');
        }
      },
      {
        text: '<%= l(:button_delete) %>',
        click: function() {
          var revisionsToKeep = $('#revisions_to_keep').val();
          var data = {
            authenticity_token: '<%= form_authenticity_token %>',
            revisions_to_keep: revisionsToKeep
          };
          $.post('<%= url_for(:controller => 'files', :action => 'delete_older_revisions', :id => @file.id) %>', data)
            .done(function() {
              location.reload();
            })
            .fail(function() {
              alert('<%= l(:label_dmsf_delete_older_revisions_error) %>');
            });
          $(this).dialog('close');
        }
      }
    ]);
    dialog.dialog('open');
  });
<% end %>
def delete_older_revisions(revisions_to_keep)
  return if revisions_to_keep >= revisions.count

  revisions_to_delete = revisions.order('revision DESC').offset(revisions_to_keep)
  revisions_to_delete.each(&:destroy)
  file.each { |file| file.delete_older_revisions(revisions_to_keep) }
end