added detail-views and journals for planning-elements

pull/527/head
Stefan Frank 11 years ago
parent 3c6225dc76
commit fe4e604e45
  1. 90
      app/views/api/v2/planning_element_journals/_journal.api.rabl
  2. 56
      app/views/api/v2/planning_element_journals/_journal.api.rsb
  3. 81
      app/views/api/v2/planning_elements/_planning_element.api.rabl
  4. 5
      app/views/api/v2/planning_elements/destroy.api.rabl
  5. 6
      app/views/api/v2/planning_elements/show.api.rabl
  6. 29
      app/views/api/v2/planning_elements/show.api.rsb
  7. 25
      spec/views/api/v2/planning_elements/destroy_api_json_spec.rb
  8. 49
      spec/views/api/v2/planning_elements/show_api_json_spec.rb

@ -0,0 +1,90 @@
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
object @journal
attributes :notes
node :id do |journal|
journal.version
end
node :user do |journal|
{id: journal.user.id, name: journal.user.name}
end
node :changes do |journal|
{:changed_data =>
journal.changed_data.map do |attribute, changes|
attribute, old, new = user_friendly_change(journal, attribute)
{change: {
technical: {
name: attribute.to_s,
old: changes.first,
new: changes.last
},
user_friendly: {
name: attribute,
old: old,
new: new
}
}}
end
}
end
node :created_on do |journal|
journal.created_at.utc.iso8601
end
#api.journal do
# api.id(journal.version)
#
# api.user(:id => journal.user.id, :name => journal.user.name)
#
# api.notes(journal.notes)
#
# api.array(:changes, :size => journal.changed_data.size) do
# journal.changed_data.each do |attribute, changes|
# api.change do
# api.technical do
# api.name(attribute.to_s)
# api.old(changes.first)
# api.new(changes.last)
# end
# attribute, old, new = user_friendly_change(journal, attribute)
# api.user_friendly do
# api.name(attribute)
# api.old(old)
# api.new(new)
# end
# end
# end
# end
#
# api.created_on(journal.created_at.utc.iso8601)
#end
#

@ -1,56 +0,0 @@
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
api.journal do
api.id(journal.version)
api.user(:id => journal.user.id, :name => journal.user.name)
api.notes(journal.notes)
api.array(:changes, :size => journal.changed_data.size) do
journal.changed_data.each do |attribute, changes|
api.change do
api.technical do
api.name(attribute.to_s)
api.old(changes.first)
api.new(changes.last)
end
attribute, old, new = user_friendly_change(journal, attribute)
api.user_friendly do
api.name(attribute)
api.old(old)
api.new(new)
end
end
end
end
api.created_on(journal.created_at.utc.iso8601)
end

@ -0,0 +1,81 @@
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
# This is an intentional duplication from index.api.rabl: rabl has performance-issues with
# extend/partials (@see https://github.com/nesquena/rabl/issues/500)
# which drastically affects the performance of inline vs. partials: as the planning-elements are
# highly performance-critical, we need to live with this duplication until these issues are solved.
object @planning_element
attributes :id, :subject, :description, :project_id, :parent_id
node :start_date, :if => lambda{|pe| pe.start_date.present?} { |pe| pe.start_date.to_formatted_s(:db) }
node :due_date, :if => lambda{|pe| pe.due_date.present?} {|pe| pe.due_date.to_formatted_s(:db) }
node :created_at, if: lambda{|pe| pe.created_at.present?} {|pe| pe.created_at.utc}
node :updated_at, if: lambda{|pe| pe.updated_at.present?} {|pe| pe.updated_at.utc}
child :project do
attributes :id, :identifier, :name
end
node :parent, if: lambda{|pe| pe.parent.present?} do |pe|
child :parent => :parent do
attributes :id, :subject
end
end
child :type => :planning_element_type do
attributes :id, :name
end
node :children, unless: lambda{|pe| pe.children.empty?} do |pe|
pe.children.to_a.map { |wp| { id: wp.id, subject: wp.subject}}
end
node :responsible, if: lambda{|pe| pe.responsible.present?} do |pe|
child :responsible => :responsible do
attributes :id, :name
end
end
node :assigned_to, if: lambda{|pe| pe.assigned_to.present?} do |pe|
child(:assigned_to => :assigned_to) do
attributes :id, :name
end
end
node :journals, if: lambda{|pe| include_journals?} do |pe|
pe.journals.map do |journal|
partial "api/v2/planning_element_journals/journal", object: journal
end
end

@ -26,4 +26,7 @@
# See doc/COPYRIGHT.rdoc for more details. # See doc/COPYRIGHT.rdoc for more details.
#++ #++
render_planning_element(api, planning_element) object @planning_element
node :planning_element do
partial("api/v2/planning_elements/planning_element", object: @planning_element)
end

@ -26,4 +26,8 @@
# See doc/COPYRIGHT.rdoc for more details. # See doc/COPYRIGHT.rdoc for more details.
#++ #++
render_planning_element(api, @planning_element) object @planning_element
node :planning_element do
partial("api/v2/planning_elements/planning_element", object: @planning_element)
end

@ -1,29 +0,0 @@
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2013 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
render_planning_element(api, @planning_element)

@ -28,16 +28,12 @@
require File.expand_path('../../../../../spec_helper', __FILE__) require File.expand_path('../../../../../spec_helper', __FILE__)
describe 'api/v2/planning_elements/destroy.api.rsb' do describe 'api/v2/planning_elements/destroy.api.rabl' do
before do
view.extend TimelinesHelper
view.extend PlanningElementsHelper
end
before do before do
view.stub(:include_journals?).and_return(false) view.stub(:include_journals?).and_return(false)
params[:format] = 'xml' params[:format] = 'json'
end end
let(:planning_element) { FactoryGirl.build(:work_package) } let(:planning_element) { FactoryGirl.build(:work_package) }
@ -48,23 +44,8 @@ describe 'api/v2/planning_elements/destroy.api.rsb' do
render render
response.should have_selector('planning_element', :count => 1) response.body.should have_json_path('planning_element')
end end
it 'calls the render_planning_element helper once' do
assign(:planning_element, planning_element)
view.should_receive(:render_planning_element).once.and_return('')
render
end
it 'passes the planning element as local var to the helper' do
assign(:planning_element, planning_element)
view.should_receive(:render_planning_element).once.with(anything, planning_element).and_return('')
render
end
end end
end end

@ -28,16 +28,12 @@
require File.expand_path('../../../../../spec_helper', __FILE__) require File.expand_path('../../../../../spec_helper', __FILE__)
describe 'api/v2/planning_elements/show.api.rsb' do describe 'api/v2/planning_elements/show.api.rabl' do
before do
view.extend TimelinesHelper
view.extend PlanningElementsHelper
end
before do before do
view.stub(:include_journals?).and_return(false) view.stub(:include_journals?).and_return(false)
params[:format] = 'xml' params[:format] = 'json'
end end
let(:planning_element) { FactoryGirl.build(:work_package) } let(:planning_element) { FactoryGirl.build(:work_package) }
@ -48,24 +44,9 @@ describe 'api/v2/planning_elements/show.api.rsb' do
render render
response.should have_selector('planning_element', :count => 1) response.body.should have_json_path('planning_element')
end end
it 'calls the render_planning_element helper once' do
assign(:planning_element, planning_element)
view.should_receive(:render_planning_element).once.and_return('')
render
end
it 'passes the planning element as local var to the helper' do
assign(:planning_element, planning_element)
view.should_receive(:render_planning_element).once.with(anything, planning_element).and_return('')
render
end
end end
describe 'with an assigned planning element describe 'with an assigned planning element
@ -101,17 +82,19 @@ describe 'api/v2/planning_elements/show.api.rsb' do
render render
response.should have_selector('journals', :count => 1) do |journal| response.should have_json_size(1).at_path('planning_element/journals')
journal.should have_selector('changes', :count => 1) do |changes| #do |journal|
changes.each do |attr, (old, new)| #
changes.should have_selector('name', :text => attr) # journal.should have_selector('changes', :count => 1) do |changes|
changes.should have_selector('old', :text => old) # changes.each do |attr, (old, new)|
changes.should have_selector('new', :text => new) # changes.should have_selector('name', :text => attr)
end # changes.should have_selector('old', :text => old)
end # changes.should have_selector('new', :text => new)
# end
end # end
#
#end
end end
end end
end end
Loading…
Cancel
Save