diff --git a/app/controllers/dmsf_workflows_controller.rb b/app/controllers/dmsf_workflows_controller.rb index 9416ea3b..d85d993c 100644 --- a/app/controllers/dmsf_workflows_controller.rb +++ b/app/controllers/dmsf_workflows_controller.rb @@ -22,7 +22,7 @@ class DmsfWorkflowsController < ApplicationController before_filter :find_workflow, :except => [:create, :new, :index, :assign, :assignment] before_filter :find_project, :except => [:start] - before_filter :authorize_global #, :except => [:action, :new_action] + before_filter :authorize_global def index if @project @@ -36,7 +36,7 @@ class DmsfWorkflowsController < ApplicationController end def new_action - if params[:commit] == l(:submit_commit) + if params[:commit] == l(:button_submit) action = DmsfWorkflowStepAction.new( :dmsf_workflow_step_assignment_id => params[:dmsf_workflow_step_assignment_id], :action => params[:step_action], @@ -57,13 +57,17 @@ class DmsfWorkflowsController < ApplicationController end def assignment - if params[:commit] == l(:button_assign) + if params[:commit] == l(:button_submit) revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] if revision revision.set_workflow(params[:dmsf_workflow_id], params[:action]) revision.assign_workflow(params[:dmsf_workflow_id]) - if request.post? && revision.save - flash[:notice] = l(:notice_successful_update) + if request.post? + if revision.save + flash[:notice] = l(:notice_successful_update) + else + flash[:error] = l(:error_workflow_assign) + end end end end @@ -137,7 +141,7 @@ class DmsfWorkflowsController < ApplicationController else step = params[:step].to_i end - operator = 1 ? params[:commit] == l(:dmsf_and) : 0 + operator = (params[:commit] == l(:dmsf_and)) ? DmsfWorkflowStep::OPERATOR_AND : DmsfWorkflowStep::OPERATOR_OR users.each do |user| @workflow.dmsf_workflow_steps << DmsfWorkflowStep.new( :dmsf_workflow_id => @workflow.id, diff --git a/app/models/dmsf_workflow.rb b/app/models/dmsf_workflow.rb index 7b995ee3..54d573d5 100644 --- a/app/models/dmsf_workflow.rb +++ b/app/models/dmsf_workflow.rb @@ -16,10 +16,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -class DmsfWorkflow < ActiveRecord::Base - belongs_to :project - - has_many :dmsf_workflow_steps, :dependent => :destroy +class DmsfWorkflow < ActiveRecord::Base + has_many :dmsf_workflow_steps, :dependent => :destroy, :order => 'step ASC, operator DESC' validates_uniqueness_of :name validates :name, :presence => true @@ -35,9 +33,8 @@ class DmsfWorkflow < ActiveRecord::Base project ? where(:project_id => project) : where('project_id IS NULL') end - def project - @project = Project.find_by_id(project_id) unless @project - @project + def project + Project.find_by_id(project_id) if project_id end def to_s @@ -50,8 +47,8 @@ class DmsfWorkflow < ActiveRecord::Base if s.step == step wa << s end - end - wa.sort_by { |obj| -obj.operator } + end + wa end def steps @@ -60,8 +57,8 @@ class DmsfWorkflow < ActiveRecord::Base unless ws.include? s.step ws << s.step end - end - ws.sort + end + ws end def reorder_steps(step, move_to) @@ -129,16 +126,31 @@ class DmsfWorkflow < ActiveRecord::Base end end - def get_free_assignment(user, dmsf_file_revision_id) - steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all(:order => 'step ASC') - steps.each do |step| + def next_assignments(dmsf_file_revision_id) + self.dmsf_workflow_steps.each do |step| unless step.finished?(dmsf_file_revision_id) - return step.get_free_assignment(dmsf_file_revision_id, user) + return step.next_assignments(dmsf_file_revision_id) end end return nil end + def self.assignments_to_users_str(assignments) + str = '' + if assignments + assignments.each_with_index do |assignment, index| + user = User.find_by_id assignment.user_id + if user + if index > 0 + str << ', ' + end + str << user.name + end + end + end + str + end + def assign(dmsf_file_revision_id) dmsf_workflow_steps.each do |ws| ws.assign(dmsf_file_revision_id) @@ -148,9 +160,8 @@ class DmsfWorkflow < ActiveRecord::Base def try_finish(dmsf_file_revision_id, action, user_id) res = nil case action.action - when DmsfWorkflowStepAction::ACTION_APPROVE - steps = DmsfWorkflowStep.where(:dmsf_workflow_id => self.id).all - steps.each do |step| + when DmsfWorkflowStepAction::ACTION_APPROVE + self.dmsf_workflow_steps.each do |step| res = step.result dmsf_file_revision_id unless step.finished? dmsf_file_revision_id return diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index 52458ed6..2593fea4 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -26,6 +26,9 @@ class DmsfWorkflowStep < ActiveRecord::Base validates :user_id, :presence => true validates :operator, :presence => true validates_uniqueness_of :user_id, :scope => [:dmsf_workflow_id, :step] + + OPERATOR_OR = 0 + OPERATOR_AND = 1 def soperator operator == 1 ? l(:dmsf_and) : l(:dmsf_or) @@ -44,7 +47,7 @@ class DmsfWorkflowStep < ActiveRecord::Base end def finished?(dmsf_file_revision_id) - res = result(dmsf_file_revision_id) + res = self.result(dmsf_file_revision_id) res == DmsfWorkflow::STATE_APPROVED || res == DmsfWorkflow::STATE_REJECTED end @@ -72,21 +75,22 @@ class DmsfWorkflowStep < ActiveRecord::Base end end - def get_free_assignment(dmsf_file_revision_id, user) - assignment = DmsfWorkflowStepAssignment.where( + def next_assignments(dmsf_file_revision_id) + results = Array.new + assignments = DmsfWorkflowStepAssignment.where( :dmsf_workflow_step_id => self.id, - :dmsf_file_revision_id => dmsf_file_revision_id, - :user_id => user.id).first - if assignment - actions = DmsfWorkflowStepAction.where( - :dmsf_workflow_step_assignment_id => assignment.id).all - actions.each do |action| - if action && action.is_finished? - return - end - end - return assignment.id - end + :dmsf_file_revision_id => dmsf_file_revision_id) + assignments.each do |assignment| + add = true + assignment.dmsf_workflow_step_actions.each do |action| + if action.is_finished? + add = false + break + end + end + results << assignment if add + end + return results end end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step_assignment.rb b/app/models/dmsf_workflow_step_assignment.rb index 1ffc5250..7dd52f12 100644 --- a/app/models/dmsf_workflow_step_assignment.rb +++ b/app/models/dmsf_workflow_step_assignment.rb @@ -20,6 +20,7 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base belongs_to :dmsf_workflow_step has_many :dmsf_workflow_step_actions, :dependent => :destroy + has_one :dmsf_workflow_step_assignment validates :dmsf_workflow_step_id, :presence => true validates :dmsf_file_revision_id, :presence => true diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index d1a1f17b..bc022dca 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -149,7 +149,8 @@
<%= label_tag('workflow', l(:label_workflow) + ':') %> <%= select_tag( 'dmsf_workflow_id', dmsf_workflows_for_select(@project, nil))%> -
- + <% end %> diff --git a/app/views/dmsf_workflows/_log.html.erb b/app/views/dmsf_workflows/_log.html.erb index 5524da96..eb649cdc 100644 --- a/app/views/dmsf_workflows/_log.html.erb +++ b/app/views/dmsf_workflows/_log.html.erb @@ -1,12 +1,20 @@<% if params[:dmsf_file_revision_id].present? %> <% revision = DmsfFileRevision.find_by_id(params[:dmsf_file_revision_id]) %> <% if revision %> - <%= link_to @workflow.name, edit_dmsf_workflow_path(@workflow) %><%= " - #{revision.workflow_str false}" %> +
| <%= l(:label_dmsf_workflow_step) %> | <%= l(:label_user) %> | @@ -15,15 +23,15 @@<%=l(:label_date)%> | ||
|---|---|---|---|---|
| - | +||||
| <%= link_to_user User.find_by_id(revision.dmsf_workflow_assigned_by) if revision.dmsf_workflow_assigned_by %> | <%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_ASSIGN) %> | <%= format_time(revision.dmsf_workflow_assigned_at) if revision.dmsf_workflow_assigned_at %> | ||
| - | +||||
| <%= link_to_user User.find_by_id(revision.dmsf_workflow_started_by) if revision.dmsf_workflow_started_by %> | <%= DmsfWorkflowStepAction.action_str(DmsfWorkflowStepAction::ACTION_START) %> | @@ -32,7 +40,7 @@ <% sql = "SELECT c.action, c.note, c.created_at, c.author_id, a.user_id, s.step FROM dmsf_workflow_step_actions c RIGHT JOIN dmsf_workflow_step_assignments a ON a.id = c.dmsf_workflow_step_assignment_id JOIN dmsf_workflow_steps s ON s.id = a.dmsf_workflow_step_id WHERE a.dmsf_file_revision_id = #{revision.id} ORDER BY s.step, c.created_at" %> <% result = DmsfWorkflowStep.connection.execute sql %> <% result.each_with_index do |row, i| %> - | ||
| <%= row[5] %> | <%= link_to_user User.find_by_id(row[3].present? ? row[3] : row[4]) %> | <%= DmsfWorkflowStepAction.action_str(row[0]) %> | diff --git a/assets/stylesheets/dmsf.css b/assets/stylesheets/dmsf.css index 5c8623cb..13e64c1c 100644 --- a/assets/stylesheets/dmsf.css +++ b/assets/stylesheets/dmsf.css @@ -256,6 +256,30 @@ div.revision_box .ui-widget-header { font-weight: normal; } -table.steps td.note { - width: 30%; +table.list td.note { + width: 30%; } + +table.list td.step, td.date { + text-align: center; +} + +.log_header_box{ + padding:6px; + margin-bottom: 10px; +} +.log_header_left { + width: 50%; + float: left; +} + +.log_header_box label{ + font-weight: bold; + margin-left: 0px; + margin-right: 3px; + padding: 3px 0 3px 0; +} + +.modal a, a:link, a:visited{ color: #169; text-decoration: none; } +.modal a:hover, a:active{ color: #c61a1a; text-decoration: underline;} +.modal{ font-size: 12px} \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 03eb745c..7f4d56a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -207,33 +207,35 @@ en: :label_webdav_strategy: "Webdav strategy" :note_webdav_strategy: "Enables the administrator to decide if webdav is a read-only or read-write platform for end users." - label_dmsf_workflow_new: New approval workflow - label_dmsf_workflow: Approval workflow - label_dmsf_workflow_plural: Approval workflows - error_unable_delete_dmsf_workflow: Unable to delete the workflow + error_unable_delete_dmsf_workflow: 'Unable to delete the workflow' + error_empty_note: "The note can't be empty" + error_workflow_assign: 'An error occured while assigning' + label_dmsf_workflow_new: 'New approval workflow' + label_dmsf_workflow: 'Approval workflow' + label_dmsf_workflow_plural: 'Approval workflows' label_dmsf_workflow_step: Step label_dmsf_workflow_step_plural: Steps label_dmsf_workflow_approval: Approval label_dmsf_workflow_approval_plural: Approvals - dmsf_and: AND - dmsf_or: OR - dmsf_new_step: New step label_dmsf: DMSF label_dmsf_wokflow_action_approve: Approve label_dmsf_wokflow_action_reject: Reject label_dmsf_wokflow_action_delegate: 'Delegate to' label_dmsf_wokflow_action_assign: 'Assign an approval workflow' - message_dmsf_wokflow_note: Your note... + label_dmsf_wokflow_action_start: 'Start workflow' + label_action: Action + label_note: Note title_draft: Draft title_rejected: Rejected title_delegated: Delegated title_assigned: Assigned - title_started: Started - label_dmsf_wokflow_action_start: Start workflow - info_revision: "r%{rev}" - link_workflow: Workflow - button_assign: Assign - error_empty_note: "The note can't be empty" + title_started: Started title_dmsf_workflow_log: 'Approval workflow log' - label_action: Action - label_note: Note \ No newline at end of file + dmsf_and: AND + dmsf_or: OR + dmsf_new_step: New step + message_dmsf_wokflow_note: Your note... + info_revision: "r%{rev}" + link_workflow: Workflow + + \ No newline at end of file