diff options
46 files changed, 205 insertions, 263 deletions
diff --git a/app/controllers/calendars_controller.rb b/app/controllers/calendars_controller.rb index 5cc7912b7..75d4cbd09 100644 --- a/app/controllers/calendars_controller.rb +++ b/app/controllers/calendars_controller.rb @@ -8,14 +8,21 @@ class CalendarsController < ChouetteController respond_to :json, only: :show respond_to :js, only: :index + belongs_to :workgroup + def index index! do - @calendars = CalendarDecorator.decorate(@calendars) + @calendars = decorate_calendars(@calendars) end end def show - @year = params[:year] ? params[:year].to_i : Date.today.cwyear + show! do + @year = params[:year] ? params[:year].to_i : Date.today.cwyear + @calendar = @calendar.decorate(context: { + workgroup: workgroup + }) + end end def month @@ -45,6 +52,16 @@ class CalendarsController < ChouetteController end private + + def decorate_calendars(calendars) + CalendarDecorator.decorate( + calendars, + context: { + workgroup: workgroup + } + ) + end + def calendar_params permitted_params = [:id, :name, :short_name, :shared, periods_attributes: [:id, :begin, :end, :_destroy], date_values_attributes: [:id, :value, :_destroy]] permitted_params << :shared if policy(Calendar).share? @@ -60,25 +77,30 @@ class CalendarsController < ChouetteController end protected + + alias_method :workgroup, :parent + helper_method :workgroup + def resource - @calendar = Calendar.where('organisation_id = ? OR shared = true', current_organisation.id).find_by_id(params[:id]).decorate + @calendar ||= workgroup.calendars.where('(organisation_id = ? OR shared = ?)', current_organisation.id, true).find_by_id(params[:id]) end def build_resource super.tap do |calendar| + calendar.workgroup = workgroup calendar.organisation = current_organisation end end def collection - return @calendars if @calendars - scope = Calendar.where('organisation_id = ? OR shared = ?', current_organisation.id, true) - scope = shared_scope(scope) - @q = scope.ransack(params[:q]) - - calendars = @q.result - calendars = calendars.order(sort_column + ' ' + sort_direction) if sort_column && sort_direction - @calendars = calendars.paginate(page: params[:page]) + @calendars ||= begin + scope = workgroup.calendars.where('(organisation_id = ? OR shared = ?)', current_organisation.id, true) + scope = shared_scope(scope) + @q = scope.ransack(params[:q]) + calendars = @q.result + calendars = calendars.order(sort_column + ' ' + sort_direction) if sort_column && sort_direction + calendars = calendars.paginate(page: params[:page]) + end end def ransack_contains_date @@ -103,4 +125,4 @@ class CalendarsController < ChouetteController scope end -end +end
\ No newline at end of file diff --git a/app/decorators/calendar_decorator.rb b/app/decorators/calendar_decorator.rb index be1f9e3bf..4c6088e8e 100644 --- a/app/decorators/calendar_decorator.rb +++ b/app/decorators/calendar_decorator.rb @@ -1,6 +1,6 @@ class CalendarDecorator < AF83::Decorator decorates Calendar - + set_scope { context[:workgroup] } create_action_link with_instance_decorator do |instance_decorator| diff --git a/app/decorators/company_decorator.rb b/app/decorators/company_decorator.rb index aadce68bb..5580e0d4a 100644 --- a/app/decorators/company_decorator.rb +++ b/app/decorators/company_decorator.rb @@ -1,34 +1,21 @@ class CompanyDecorator < AF83::Decorator decorates Chouette::Company + set_scope { context[:referential] } + create_action_link do |l| l.content { h.t('companies.actions.new') } - l.href { [:new, context[:referential], :company] } end with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href { [context[:referential], object] } - end + instance_decorator.show_action_link instance_decorator.edit_action_link do |l| l.content {|l| l.action == "show" ? h.t('actions.edit') : h.t('companies.actions.edit') } - l.href { - h.edit_line_referential_company_path( - context[:referential], - object - ) - } end instance_decorator.destroy_action_link do |l| l.content { h.destroy_link_content('companies.actions.destroy') } - l.href { - h.edit_line_referential_company_path( - context[:referential], - object - ) - } l.data {{ confirm: h.t('companies.actions.destroy_confirm') }} end end diff --git a/app/decorators/compliance_control_decorator.rb b/app/decorators/compliance_control_decorator.rb index c57a7ccc7..fd2dbd9ce 100644 --- a/app/decorators/compliance_control_decorator.rb +++ b/app/decorators/compliance_control_decorator.rb @@ -1,6 +1,8 @@ class ComplianceControlDecorator < AF83::Decorator decorates ComplianceControl + set_scope { object.compliance_control_set } + with_instance_decorator do |instance_decorator| instance_decorator.show_action_link do |l| l.content h.t('compliance_control_sets.actions.show') @@ -12,23 +14,9 @@ class ComplianceControlDecorator < AF83::Decorator end end - instance_decorator.edit_action_link do |l| - l.href do - h.edit_compliance_control_set_compliance_control_path( - object.compliance_control_set_id, - object.id - ) - end - end + instance_decorator.edit_action_link instance_decorator.destroy_action_link do |l| - l.content h.destroy_link_content - l.href do - h.compliance_control_set_compliance_control_path( - object.compliance_control_set.id, - object.id - ) - end l.data confirm: h.t('compliance_controls.actions.destroy_confirm') end end diff --git a/app/decorators/import_decorator.rb b/app/decorators/import_decorator.rb index c6b1f2349..1964365ae 100644 --- a/app/decorators/import_decorator.rb +++ b/app/decorators/import_decorator.rb @@ -1,6 +1,8 @@ class ImportDecorator < AF83::Decorator decorates Import + set_scope { context[:workbench] } + define_instance_method :import_status_css_class do cls ='' cls = 'overheaded-success' if object.status == 'successful' @@ -11,13 +13,10 @@ class ImportDecorator < AF83::Decorator create_action_link do |l| l.content t('imports.actions.new') - l.href { h.new_workbench_import_path(workbench_id: context[:workbench]) } end with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href { h.workbench_import_path(context[:workbench], object) } - end + instance_decorator.show_action_link instance_decorator.action_link secondary: :show do |l| l.content t('imports.actions.download') diff --git a/app/decorators/line_decorator.rb b/app/decorators/line_decorator.rb index adeb89f70..0e7b6b9ae 100644 --- a/app/decorators/line_decorator.rb +++ b/app/decorators/line_decorator.rb @@ -1,9 +1,10 @@ class LineDecorator < AF83::Decorator decorates Chouette::Line + set_scope { context[:line_referential] } + create_action_link do |l| l.content t('lines.actions.new') - l.href { h.new_line_referential_line_path(context[:line_referential]) } end with_instance_decorator do |instance_decorator| @@ -14,18 +15,17 @@ class LineDecorator < AF83::Decorator instance_decorator.show_action_link do |l| l.content t('lines.actions.show') - l.href { [context[:line_referential], object] } end instance_decorator.action_link secondary: :show do |l| l.content t('lines.actions.show_network') - l.href { [context[:line_referential], object.network] } + l.href { [scope, object.network] } l.disabled { object.network.nil? } end instance_decorator.action_link secondary: :show do |l| l.content t('lines.actions.show_company') - l.href { [context[:line_referential], object.company] } + l.href { [scope, object.company] } l.disabled { object.company.nil? } end @@ -34,7 +34,6 @@ class LineDecorator < AF83::Decorator instance_decorator.with_condition can_edit_line do edit_action_link do |l| l.content {|l| l.primary? ? h.t('actions.edit') : h.t('lines.actions.edit') } - l.href { h.edit_line_referential_line_path(context[:line_referential], object.id) } end action_link on: :index, secondary: :index do |l| @@ -64,7 +63,6 @@ class LineDecorator < AF83::Decorator instance_decorator.destroy_action_link do |l| l.content { h.destroy_link_content('lines.actions.destroy') } - l.href { h.line_referential_line_path(context[:line_referential], object) } l.data confirm: h.t('lines.actions.destroy_confirm') l.add_class "delete-action" end diff --git a/app/decorators/network_decorator.rb b/app/decorators/network_decorator.rb index 90f0d0e82..ea0f73dc2 100644 --- a/app/decorators/network_decorator.rb +++ b/app/decorators/network_decorator.rb @@ -1,6 +1,7 @@ class NetworkDecorator < AF83::Decorator decorates Chouette::Network + set_scope { context[:line_referential] } # Action links require: # context: { # line_referential: , @@ -8,15 +9,10 @@ class NetworkDecorator < AF83::Decorator create_action_link do |l| l.content t('networks.actions.new') - l.href { h.new_line_referential_network_path(context[:line_referential]) } end with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href do - h.line_referential_network_path(context[:line_referential], object) - end - end + instance_decorator.show_action_link instance_decorator.action_link secondary: true, policy: :edit do |l| l.content t('networks.actions.edit') @@ -30,12 +26,6 @@ class NetworkDecorator < AF83::Decorator instance_decorator.destroy_action_link do |l| l.content h.destroy_link_content('networks.actions.destroy') - l.href do - h.line_referential_network_path( - context[:line_referential], - object - ) - end l.data confirm: h.t('networks.actions.destroy_confirm') end end diff --git a/app/decorators/purchase_window_decorator.rb b/app/decorators/purchase_window_decorator.rb index 54b241173..9b58577b2 100644 --- a/app/decorators/purchase_window_decorator.rb +++ b/app/decorators/purchase_window_decorator.rb @@ -1,32 +1,20 @@ class PurchaseWindowDecorator < AF83::Decorator decorates Chouette::PurchaseWindow + set_scope { context[:referential] } + create_action_link do |l| l.content t('purchase_windows.actions.new') - l.href { h.new_referential_purchase_window_path(context[:referential]) } end with_instance_decorator do |instance_decorator| instance_decorator.show_action_link do |l| l.content t('purchase_windows.actions.show') - l.href do - h.referential_purchase_window_path( - context[:referential], - object - ) - end end - instance_decorator.edit_action_link do |l| - l.href do - h.edit_referential_purchase_window_path(context[:referential].id, object) - end - end + instance_decorator.edit_action_link instance_decorator.destroy_action_link do |l| - l.href do - h.referential_purchase_window_path(context[:referential].id, object) - end l.data confirm: h.t('purchase_windows.actions.destroy_confirm') end end diff --git a/app/decorators/referential_line_decorator.rb b/app/decorators/referential_line_decorator.rb index 8f884a8e0..3ac846d76 100644 --- a/app/decorators/referential_line_decorator.rb +++ b/app/decorators/referential_line_decorator.rb @@ -1,6 +1,8 @@ class ReferentialLineDecorator < AF83::Decorator decorates Chouette::Line + set_scope { context[:referential] } + # Action links require: # context: { # referential: , @@ -8,9 +10,7 @@ class ReferentialLineDecorator < AF83::Decorator # } with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href { h.referential_line_path(context[:referential], object) } - end + instance_decorator.show_action_link instance_decorator.action_link secondary: true do |l| l.content Chouette::Line.human_attribute_name(:footnotes) @@ -21,7 +21,7 @@ class ReferentialLineDecorator < AF83::Decorator l.content h.t('routing_constraint_zones.index.title') l.href do h.referential_line_routing_constraint_zones_path( - context[:referential], + scope, object ) end @@ -37,7 +37,7 @@ class ReferentialLineDecorator < AF83::Decorator secondary: true ) do |l| l.content h.t('routes.actions.new') - l.href { h.new_referential_line_route_path(context[:referential], object) } + l.href { h.new_referential_line_route_path(scope, object) } end end end diff --git a/app/decorators/referential_network_decorator.rb b/app/decorators/referential_network_decorator.rb index ff3467188..c508452c0 100644 --- a/app/decorators/referential_network_decorator.rb +++ b/app/decorators/referential_network_decorator.rb @@ -1,6 +1,8 @@ class ReferentialNetworkDecorator < AF83::Decorator decorates Chouette::Network + set_scope { context[:referential] } + # Action links require: # context: { # referential: , @@ -8,33 +10,18 @@ class ReferentialNetworkDecorator < AF83::Decorator create_action_link do |l| l.content t('networks.actions.new') - l.href { h.new_referential_network_path(context[:referential]) } end with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href { h.referential_network_path(context[:referential], object) } - end + instance_decorator.show_action_link instance_decorator.edit_action_link do |l| l.content t('networks.actions.edit') - l.href do - h.edit_referential_network_path( - context[:referential], - object - ) - end end instance_decorator.destroy_action_link do |l| l.content h.destroy_link_content('networks.actions.destroy') - l.href do - h.referential_network_path( - context[:referential], - object - ) - end l.data confirm: h.t('networks.actions.destroy_confirm') end end -end
\ No newline at end of file +end diff --git a/app/decorators/route_decorator.rb b/app/decorators/route_decorator.rb index f9870fbbe..fa6367924 100644 --- a/app/decorators/route_decorator.rb +++ b/app/decorators/route_decorator.rb @@ -7,26 +7,12 @@ class RouteDecorator < AF83::Decorator # line: # } + set_scope { [context[:referential], context[:line]] } + with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href do - h.referential_line_route_path( - context[:referential], - context[:line], - object - ) - end - end + instance_decorator.show_action_link - instance_decorator.edit_action_link do |l| - l.href do - h.edit_referential_line_route_path( - context[:referential], - context[:line], - object - ) - end - end + instance_decorator.edit_action_link instance_decorator.action_link( if: ->() { object.stop_points.any? }, @@ -86,13 +72,6 @@ class RouteDecorator < AF83::Decorator end instance_decorator.destroy_action_link do |l| - l.href do - h.referential_line_route_path( - context[:referential], - context[:line], - object - ) - end l.data confirm: h.t('routes.actions.destroy_confirm') end end diff --git a/app/decorators/routing_constraint_zone_decorator.rb b/app/decorators/routing_constraint_zone_decorator.rb index 962625fa7..de73068be 100644 --- a/app/decorators/routing_constraint_zone_decorator.rb +++ b/app/decorators/routing_constraint_zone_decorator.rb @@ -1,6 +1,8 @@ class RoutingConstraintZoneDecorator < AF83::Decorator decorates Chouette::RoutingConstraintZone + set_scope { [context[:referential], context[:line]] } + # Action links require: # context: { # referential: , @@ -12,44 +14,13 @@ class RoutingConstraintZoneDecorator < AF83::Decorator h.policy(Chouette::RoutingConstraintZone).create? && context[:referential].organisation == h.current_organisation } - ) do |l| - l.href do - h.new_referential_line_routing_constraint_zone_path( - context[:referential], - context[:line] - ) - end - end + ) with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href do - h.referential_line_routing_constraint_zone_path( - context[:referential], - context[:line], - object - ) - end - end - - instance_decorator.edit_action_link do |l| - l.href do - h.edit_referential_line_routing_constraint_zone_path( - context[:referential], - context[:line], - object - ) - end - end + instance_decorator.show_action_link + instance_decorator.edit_action_link instance_decorator.destroy_action_link do |l| - l.href do - h.referential_line_routing_constraint_zone_path( - context[:referential], - context[:line], - object - ) - end l.data confirm: h.t('routing_constraint_zones.actions.destroy_confirm') end end diff --git a/app/decorators/stop_area_decorator.rb b/app/decorators/stop_area_decorator.rb index 2e57da0e4..525681971 100644 --- a/app/decorators/stop_area_decorator.rb +++ b/app/decorators/stop_area_decorator.rb @@ -7,23 +7,11 @@ class StopAreaDecorator < AF83::Decorator end with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link do |l| - l.href do - h.stop_area_referential_stop_area_path( - object.stop_area_referential, - object - ) - end - end + set_scope { object.stop_area_referential } + instance_decorator.show_action_link instance_decorator.edit_action_link do |l| l.content h.t('stop_areas.actions.edit') - l.href do - h.edit_stop_area_referential_stop_area_path( - object.stop_area_referential, - object - ) - end end instance_decorator.action_link policy: :deactivate, secondary: true do |l| @@ -54,12 +42,6 @@ class StopAreaDecorator < AF83::Decorator instance_decorator.destroy_action_link do |l| l.content h.destroy_link_content('stop_areas.actions.destroy') - l.href do - h.stop_area_referential_stop_area_path( - object.stop_area_referential, - object - ) - end l.data confirm: h.t('stop_areas.actions.destroy_confirm') end end diff --git a/app/helpers/table_builder_helper.rb b/app/helpers/table_builder_helper.rb index 9a255e757..2068dd23c 100644 --- a/app/helpers/table_builder_helper.rb +++ b/app/helpers/table_builder_helper.rb @@ -330,7 +330,7 @@ module TableBuilderHelper else menu = content_tag :ul, class: 'dropdown-menu' do ( - CustomLinks.new(item, pundit_user, links, referential).links + + CustomLinks.new(item, pundit_user, links, referential, workgroup).links + action_links.select { |link| link.is_a?(Link) } ).map do |link| gear_menu_link(link) @@ -395,7 +395,6 @@ module TableBuilderHelper klass << link.extra_class if link.extra_class klass << 'delete-action' if link.method == :delete klass << 'disabled' if link.disabled - content_tag( :li, link_to( @@ -414,4 +413,10 @@ module TableBuilderHelper # cases, avoid a `NoMethodError`. @__referential__ ||= try(:current_referential) end + + def workgroup + # Certain controllers don't define a `#current_referential`. In these + # cases, avoid a `NoMethodError`. + @__workgroup__ ||= try(:current_workgroup) + end end diff --git a/app/helpers/table_builder_helper/custom_links.rb b/app/helpers/table_builder_helper/custom_links.rb index b1bb11f10..e09078be0 100644 --- a/app/helpers/table_builder_helper/custom_links.rb +++ b/app/helpers/table_builder_helper/custom_links.rb @@ -8,13 +8,14 @@ module TableBuilderHelper unarchive: :put } - attr_reader :actions, :object, :user_context, :referential + attr_reader :actions, :object, :user_context, :referential, :workgroup - def initialize(object, user_context, actions, referential = nil) + def initialize(object, user_context, actions, referential = nil, workgroup = nil) @object = object @user_context = user_context @actions = actions @referential = referential + @workgroup = workgroup end def links @@ -34,7 +35,7 @@ module TableBuilderHelper polymorph_url << action end - polymorph_url += URL.polymorphic_url_parts(object, referential) + polymorph_url += URL.polymorphic_url_parts(object, referential, workgroup) end def method_for_action(action) diff --git a/app/helpers/table_builder_helper/url.rb b/app/helpers/table_builder_helper/url.rb index 28f1ade76..0e3dce0aa 100644 --- a/app/helpers/table_builder_helper/url.rb +++ b/app/helpers/table_builder_helper/url.rb @@ -1,6 +1,6 @@ module TableBuilderHelper class URL - def self.polymorphic_url_parts(item, referential) + def self.polymorphic_url_parts(item, referential, workgroup) polymorph_url = [] unless item.is_a?(Calendar) || item.is_a?(Referential) || item.is_a?(ComplianceControlSet) @@ -20,6 +20,7 @@ module TableBuilderHelper end end else + polymorph_url << item.workgroup if item.respond_to? :workgroup polymorph_url << item end diff --git a/app/models/calendar.rb b/app/models/calendar.rb index 561a2e3f7..84b569ab4 100644 --- a/app/models/calendar.rb +++ b/app/models/calendar.rb @@ -10,8 +10,9 @@ class Calendar < ActiveRecord::Base has_paper_trail class_name: 'PublicVersion' belongs_to :organisation + belongs_to :workgroup - validates_presence_of :name, :short_name, :organisation + validates_presence_of :name, :short_name, :organisation, :workgroup validates_uniqueness_of :short_name has_many :time_tables diff --git a/app/models/concerns/timetable_support.rb b/app/models/concerns/timetable_support.rb index d2bc99d51..5242abc33 100644 --- a/app/models/concerns/timetable_support.rb +++ b/app/models/concerns/timetable_support.rb @@ -100,6 +100,7 @@ module TimetableSupport period.period_start = Date.parse(item['period_start']) period.period_end = Date.parse(item['period_end']) + period.save if period.is_a?(ActiveRecord::Base) && period.changed? item['id'] = period.id diff --git a/app/models/workgroup.rb b/app/models/workgroup.rb index 3d761e81f..3af20ae23 100644 --- a/app/models/workgroup.rb +++ b/app/models/workgroup.rb @@ -3,6 +3,7 @@ class Workgroup < ActiveRecord::Base belongs_to :stop_area_referential has_many :workbenches + has_many :calendars has_many :organisations, through: :workbenches has_many :referentials, through: :workbenches diff --git a/app/views/calendar_mailer/created.html.slim b/app/views/calendar_mailer/created.html.slim index 37b2a86ea..bee071150 100644 --- a/app/views/calendar_mailer/created.html.slim +++ b/app/views/calendar_mailer/created.html.slim @@ -1,4 +1,4 @@ -div = t('mailers.calendar_mailer.created.body', cal_name: @calendar.name, cal_index_url: calendars_url) +div = t('mailers.calendar_mailer.created.body', cal_name: @calendar.name, cal_index_url: workgroup_calendars_url(@calendar.workgroup)) table style="border-collapse:collapse;font-family:'Open Sans', Arial, sans serif;width:550px;margin:0px auto;color:#333333;" @@ -16,7 +16,7 @@ table style="border-collapse:collapse;font-family:'Open Sans', Arial, sans serif = t('mailers.calendar_mailer.updated.subject') p style="font-size:14px;margin:0px 0px 10px 0px;" - = t('mailers.calendar_mailer.created.body', cal_name: @calendar.name, cal_index_url: calendars_url).html_safe + = t('mailers.calendar_mailer.created.body', cal_name: @calendar.name, cal_index_url: workgroup_calendars_url(@calendar.workgroup)).html_safe tr td style="text-align:center;padding:20px 0 0 0;border-top:1px solid #007fbb;" diff --git a/app/views/calendar_mailer/updated.html.slim b/app/views/calendar_mailer/updated.html.slim index bf128439a..0bdc2e7db 100644 --- a/app/views/calendar_mailer/updated.html.slim +++ b/app/views/calendar_mailer/updated.html.slim @@ -14,7 +14,7 @@ table style="border-collapse:collapse;font-family:'Open Sans', Arial, sans serif = t('mailers.calendar_mailer.updated.subject') p style="font-size:14px;margin:0px 0px 10px 0px;" - = t('mailers.calendar_mailer.updated.body', cal_name: @calendar.name, cal_index_url: calendars_url).html_safe + = t('mailers.calendar_mailer.updated.body', cal_name: @calendar.name, cal_index_url: workgroup_calendars_url(@calendar.workgroup)).html_safe tr td style="text-align:center;padding:20px 0 0 0;border-top:1px solid #007fbb;" diff --git a/app/views/calendars/_filters.html.slim b/app/views/calendars/_filters.html.slim index d9c936b64..35441b053 100644 --- a/app/views/calendars/_filters.html.slim +++ b/app/views/calendars/_filters.html.slim @@ -1,4 +1,4 @@ -= search_form_for @q, url: calendars_path, builder: SimpleForm::FormBuilder, html: { method: :get, class: 'form form-filter' } do |f| += search_form_for @q, url: workgroup_calendars_path(current_workgroup), builder: SimpleForm::FormBuilder, html: { method: :get, class: 'form form-filter' } do |f| .ffg-row .input-group.search_bar class=filter_item_class(params[:q], :name_or_short_name_cont) = f.search_field :name_or_short_name_cont, class: 'form-control', placeholder: 'Indiquez un nom/nom court de calendrier...' @@ -18,5 +18,5 @@ = f.input :contains_date, as: :date, label: false, wrapper_html: { class: 'date smart_date' }, class: 'form-control', include_blank: true .actions - = link_to 'Effacer', calendars_path, class: 'btn btn-link' + = link_to 'Effacer', workgroup_calendars_path(current_workgroup), class: 'btn btn-link' = f.submit 'Filtrer', id: 'calendar_filter_btn', class: 'btn btn-default' diff --git a/app/views/calendars/_form_simple.html.slim b/app/views/calendars/_form_simple.html.slim index 2f469ada7..ba18c765b 100644 --- a/app/views/calendars/_form_simple.html.slim +++ b/app/views/calendars/_form_simple.html.slim @@ -1,6 +1,6 @@ .row .col-lg-8.col-lg-offset-2.col-md-8.col-md-offset-2.col-sm-10.col-sm-offset-1 - = simple_form_for @calendar, html: { class: 'form-horizontal', id: 'calendar_form' }, wrapper: :horizontal_form do |f| + = simple_form_for [@workgroup, @calendar], html: { class: 'form-horizontal', id: 'calendar_form' }, wrapper: :horizontal_form do |f| .row .col-lg-12 = f.input :name diff --git a/app/views/calendars/edit.html.slim b/app/views/calendars/edit.html.slim index e64790daf..79ab1f5d0 100644 --- a/app/views/calendars/edit.html.slim +++ b/app/views/calendars/edit.html.slim @@ -1,4 +1,4 @@ -- breadcrumb :calendar, @calendar +- breadcrumb :calendar, @workgroup, @calendar - page_header_content_for @calendar .page_content .container-fluid diff --git a/app/views/calendars/index.html.slim b/app/views/calendars/index.html.slim index 92c24be5b..0b58c0c72 100644 --- a/app/views/calendars/index.html.slim +++ b/app/views/calendars/index.html.slim @@ -1,4 +1,4 @@ -- breadcrumb :calendars +- breadcrumb :calendars, workgroup .page_content .container-fluid @@ -16,7 +16,7 @@ key: :name, \ attribute: 'name', \ link_to: lambda do |calendar| \ - calendar_path(calendar) \ + workgroup_calendar_path(workgroup, calendar) \ end \ ), \ TableBuilderHelper::Column.new( \ diff --git a/app/views/calendars/new.html.slim b/app/views/calendars/new.html.slim index b3840b705..5657a0c55 100644 --- a/app/views/calendars/new.html.slim +++ b/app/views/calendars/new.html.slim @@ -1,4 +1,4 @@ -- breadcrumb :calendars +- breadcrumb :calendars, @workgroup .page_content .container-fluid = render 'form_simple' diff --git a/app/views/calendars/show.html.slim b/app/views/calendars/show.html.slim index ec53be0ef..cec4f66a5 100644 --- a/app/views/calendars/show.html.slim +++ b/app/views/calendars/show.html.slim @@ -1,4 +1,4 @@ -- breadcrumb :calendar, @calendar +- breadcrumb :calendar, @workgroup, @calendar - page_header_content_for @calendar .page_content diff --git a/app/views/dashboards/_dashboard.html.slim b/app/views/dashboards/_dashboard.html.slim index 075b94ddc..58cfcc542 100644 --- a/app/views/dashboards/_dashboard.html.slim +++ b/app/views/dashboards/_dashboard.html.slim @@ -22,13 +22,13 @@ .panel.panel-default .panel-heading h3.panel-title.with_actions - = link_to I18n.t("activerecord.models.calendar", count: @dashboard.current_organisation.calendars.size), calendars_path + = link_to I18n.t("activerecord.models.calendar", count: @dashboard.current_organisation.calendars.size), workgroup_calendars_path(current_workgroup) div - = link_to '', calendars_path, class: ' fa fa-chevron-right pull-right' + = link_to '', workgroup_calendars_path(current_workgroup), class: ' fa fa-chevron-right pull-right' - if @dashboard.current_organisation.calendars.present? .list-group - @dashboard.current_organisation.calendars.order("updated_at desc").limit(5).each do |calendar| - = link_to calendar.name, calendar_path(calendar), class: 'list-group-item' + = link_to calendar.name, workgroup_calendars_path(current_workgroup, calendar), class: 'list-group-item' - else .panel-body em.small.text-muted diff --git a/app/views/errors/forbidden.html.slim b/app/views/errors/forbidden.html.slim index 23ea67eff..8c35b46a8 100644 --- a/app/views/errors/forbidden.html.slim +++ b/app/views/errors/forbidden.html.slim @@ -9,7 +9,7 @@ p strong = "Désolé, la page demandée la page n'est pas accessible avec votre profil utilisateur." - p = "Vous pouvez néanmoins continuer à utiliser l'application IBOO." + p = "Vous pouvez néanmoins continuer à utiliser l'application." - else p diff --git a/app/views/errors/server_error.html.slim b/app/views/errors/server_error.html.slim index 189a48760..529ad73e8 100644 --- a/app/views/errors/server_error.html.slim +++ b/app/views/errors/server_error.html.slim @@ -9,7 +9,7 @@ p strong = "Désolé, une erreur est survenue." - p = "Vous pouvez néanmoins continuer à utiliser l'application IBOO." + p = "Vous pouvez néanmoins continuer à utiliser l'application." - else p diff --git a/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim b/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim index 3963d4cd4..1b7293d21 100644 --- a/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim +++ b/app/views/layouts/navigation/_main_nav_left_content_stif.html.slim @@ -29,7 +29,7 @@ span Jeux de données = link_to workbench_imports_path(current_offer_workbench), class: "list-group-item #{(params[:controller] == 'imports') ? 'active' : ''}" do span Import - = link_to calendars_path, class: 'list-group-item' do + = link_to workgroup_calendars_path(current_workgroup), class: 'list-group-item' do span Modèles de calendrier = link_to workbench_compliance_check_sets_path(current_offer_workbench), class: 'list-group-item' do span Rapport de contrôle diff --git a/app/views/stif/dashboards/_dashboard.html.slim b/app/views/stif/dashboards/_dashboard.html.slim index 64e7d4f96..c28696a94 100644 --- a/app/views/stif/dashboards/_dashboard.html.slim +++ b/app/views/stif/dashboards/_dashboard.html.slim @@ -60,12 +60,12 @@ span.badge.ml-xs = @dashboard.calendars.count if @dashboard.calendars.present? div - = link_to '', calendars_path, class: ' fa fa-chevron-right pull-right', title: t('.see') + = link_to '', workgroup_calendars_path(current_workgroup), class: ' fa fa-chevron-right pull-right', title: t('.see') - if @dashboard.calendars.present? .list-group - @dashboard.calendars.first(5).each_with_index do |calendar, i| - = link_to calendar.name, calendar_path(calendar), class: 'list-group-item' if i < 6 + = link_to calendar.name, workgroup_calendar_path(current_workgroup, calendar), class: 'list-group-item' if i < 6 - else .panel-body diff --git a/config/breadcrumbs.rb b/config/breadcrumbs.rb index 6da96d73a..2772895fe 100644 --- a/config/breadcrumbs.rb +++ b/config/breadcrumbs.rb @@ -202,13 +202,13 @@ crumb :purchase_window do |referential, purchase_window| parent :purchase_windows, referential end -crumb :calendars do - link I18n.t('calendars.index.title'), calendars_path +crumb :calendars do |workgroup| + link I18n.t('calendars.index.title'), workgroup_calendars_path(workgroup) end -crumb :calendar do |calendar| - link breadcrumb_name(calendar), calendar_path(calendar) - parent :calendars +crumb :calendar do |workgroup, calendar| + link breadcrumb_name(calendar), workgroup_calendar_path(workgroup, calendar) + parent :calendars, workgroup end crumb :referential_line do |referential, line| diff --git a/config/routes.rb b/config/routes.rb index fc2807ab1..5fc39ba92 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -111,11 +111,13 @@ ChouetteIhm::Application.routes.draw do resources :companies resources :networks end - - resources :calendars do - get :autocomplete, on: :collection, controller: 'autocomplete_calendars' - member do - get 'month', defaults: { format: :json } + + resources :workgroups do + resources :calendars do + get :autocomplete, on: :collection, controller: 'autocomplete_calendars' + member do + get 'month', defaults: { format: :json } + end end end diff --git a/db/migrate/20180123174450_add_workgroup_id_to_calendars.rb b/db/migrate/20180123174450_add_workgroup_id_to_calendars.rb new file mode 100644 index 000000000..64ad1a752 --- /dev/null +++ b/db/migrate/20180123174450_add_workgroup_id_to_calendars.rb @@ -0,0 +1,6 @@ +class AddWorkgroupIdToCalendars < ActiveRecord::Migration + def change + add_column :calendars, :workgroup_id, :integer, limit: 8 + add_index :calendars, :workgroup_id + end +end diff --git a/db/schema.rb b/db/schema.rb index cd4d42005..596682ce8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -90,12 +90,14 @@ ActiveRecord::Schema.define(version: 20180202170009) do t.integer "organisation_id", limit: 8 t.datetime "created_at" t.datetime "updated_at" + t.integer "workgroup_id", limit: 8 t.integer "int_day_types" t.date "excluded_dates", array: true end add_index "calendars", ["organisation_id"], name: "index_calendars_on_organisation_id", using: :btree add_index "calendars", ["short_name"], name: "index_calendars_on_short_name", unique: true, using: :btree + add_index "calendars", ["workgroup_id"], name: "index_calendars_on_workgroup_id", using: :btree create_table "clean_up_results", id: :bigserial, force: :cascade do |t| t.string "message_key" @@ -418,9 +420,9 @@ ActiveRecord::Schema.define(version: 20180202170009) do t.string "type" t.integer "parent_id", limit: 8 t.string "parent_type" - t.datetime "notified_parent_at" t.integer "current_step", default: 0 t.integer "total_steps", default: 0 + t.datetime "notified_parent_at" t.string "creator" end diff --git a/lib/af83/decorator.rb b/lib/af83/decorator.rb index f990555fe..71cf1170d 100644 --- a/lib/af83/decorator.rb +++ b/lib/af83/decorator.rb @@ -2,40 +2,49 @@ class AF83::Decorator < ModelDecorator include AF83::Decorator::EnhancedDecorator extend AF83::Decorator::EnhancedDecorator::ClassMethods - def self.decorates klass - instance_decorator.decorates klass - end + class << self + def decorates klass + instance_decorator.decorates klass + end - def self.instance_decorator - @instance_decorator ||= begin - klass = Class.new(AF83::Decorator::InstanceDecorator) - klass.delegate_all - klass + def instance_decorator + @instance_decorator ||= begin + klass = Class.new(AF83::Decorator::InstanceDecorator) + klass.delegate_all + klass + end end - end - def self.with_instance_decorator - @_with_instance_decorator = true - yield instance_decorator - @_with_instance_decorator = false - end + def with_instance_decorator + @_with_instance_decorator = true + yield instance_decorator + @_with_instance_decorator = false + end + + def decorate object, options = {} + if object.is_a?(ActiveRecord::Base) + return instance_decorator.decorate object, options + else + self.new object, options.update(with: instance_decorator) + end + end - def self.decorate object, options = {} - if object.is_a?(ActiveRecord::Base) - return instance_decorator.decorate object, options - else - self.new object, options.update(with: instance_decorator) + def define_instance_method method_name, &block + instance_decorator.send(:define_method, method_name, &block) end - end - def self.define_instance_method method_name, &block - instance_decorator.send(:define_method, method_name, &block) - end + # Defines a class method on the decorated object's class. These + # can be called like `object.class.my_method`. + def define_instance_class_method method_name, &block + instance_decorator.send(:define_singleton_method, method_name, &block) + end + + def set_scope_with_instance_decorator value=nil, &block + set_scope_without_instance_decorator value, &block + instance_decorator.set_scope value, &block + end - # Defines a class method on the decorated object's class. These - # can be called like `object.class.my_method`. - def self.define_instance_class_method method_name, &block - instance_decorator.send(:define_singleton_method, method_name, &block) + alias_method_chain :set_scope, :instance_decorator end class ActionLinks diff --git a/lib/af83/decorator/enhanced_decorator.rb b/lib/af83/decorator/enhanced_decorator.rb index 904d1b2da..fff8bb8b3 100644 --- a/lib/af83/decorator/enhanced_decorator.rb +++ b/lib/af83/decorator/enhanced_decorator.rb @@ -25,7 +25,7 @@ module AF83::Decorator::EnhancedDecorator policy: :create, before_block: -> (l){ l.content { h.t('actions.add') } - l.href { [:new, object.klass.name.underscore.singularize] } + l.href { [:new, scope, object.klass.model_name.singular] } } } action_link opts.update(args), &block @@ -37,7 +37,7 @@ module AF83::Decorator::EnhancedDecorator primary: :index, before_block: -> (l){ l.content { h.t('actions.show') } - l.href { [object] } + l.href { [scope, object] } } } action_link opts.update(args), &block @@ -49,7 +49,7 @@ module AF83::Decorator::EnhancedDecorator policy: :edit, before_block: -> (l){ l.content { h.t('actions.edit') } - l.href { [:edit, object] } + l.href { [:edit, scope, object] } } } action_link opts.update(args), &block @@ -62,7 +62,7 @@ module AF83::Decorator::EnhancedDecorator secondary: :show, before_block: -> (l){ l.content { h.destroy_link_content } - l.href { [object] } + l.href { [scope, object] } l.method :delete l.data {{ confirm: h.t('actions.destroy_confirm') }} } @@ -70,6 +70,14 @@ module AF83::Decorator::EnhancedDecorator action_link opts.update(args), &block end + def set_scope value=nil, &block + @scope = value || block + end + + def scope + @scope + end + def t key eval "-> (l){ h.t('#{key}') }" end @@ -142,4 +150,10 @@ module AF83::Decorator::EnhancedDecorator def check_feature feature h.has_feature? feature end + + def scope + scope = self.class.scope + scope = instance_exec &scope if scope.is_a? Proc + scope + end end diff --git a/lib/af83/decorator/link.rb b/lib/af83/decorator/link.rb index 7d2896e6a..de7106740 100644 --- a/lib/af83/decorator/link.rb +++ b/lib/af83/decorator/link.rb @@ -30,7 +30,8 @@ class AF83::Decorator::Link @options[name] = block elsif args.size == 0 out = @options[name] - out = context.instance_exec(self, &out) if out.is_a?(Proc) + out = context.instance_exec(self, &out) if out.is_a?(Proc) + out = out.flatten.compact if name.to_s == "href" && out.is_a?(Array) out else # we can use l.foo("bar") or l.foo = "bar" diff --git a/lib/stif/dashboard.rb b/lib/stif/dashboard.rb index b6b6b8284..46c635091 100644 --- a/lib/stif/dashboard.rb +++ b/lib/stif/dashboard.rb @@ -4,12 +4,16 @@ module Stif @workbench ||= current_organisation.workbenches.find_by(name: "Gestion de l'offre") end + def workgroup + workbench.workgroup + end + def referentials @referentials ||= self.workbench.all_referentials end def calendars - @calendars ||= Calendar.where('organisation_id = ? OR shared = ?', current_organisation.id, true) + @calendars ||= Calendar.where('(organisation_id = ? OR shared = ?) AND workgroup_id = ?', current_organisation.id, true, workgroup.id) end end end diff --git a/spec/factories/calendars.rb b/spec/factories/calendars.rb index 5f3188bee..d9fd242d1 100644 --- a/spec/factories/calendars.rb +++ b/spec/factories/calendars.rb @@ -6,6 +6,7 @@ FactoryGirl.define do sequence(:dates) { |n| [ Date.yesterday - n, Date.yesterday - 2*n ] } shared false organisation + workgroup end sequence :date_range do |n| diff --git a/spec/features/calendars_permissions_spec.rb b/spec/features/calendars_permissions_spec.rb index 9b47ab2bb..4857592d5 100644 --- a/spec/features/calendars_permissions_spec.rb +++ b/spec/features/calendars_permissions_spec.rb @@ -2,6 +2,7 @@ RSpec.describe 'Calendars', type: :feature do login_user let(:calendar) { create :calendar, organisation_id: 1 } + let(:workgroup) { calendar.workgroup } describe 'permissions' do before do @@ -13,7 +14,7 @@ RSpec.describe 'Calendars', type: :feature do end context 'on show view' do - let( :path ){ calendar_path(calendar) } + let( :path ){ workgroup_calendar_path(workgroup, calendar) } context 'if present → ' do let( :permission ){ true } @@ -33,7 +34,7 @@ RSpec.describe 'Calendars', type: :feature do end context 'on edit view' do - let( :path ){ edit_calendar_path(calendar) } + let( :path ){ edit_workgroup_calendar_path(workgroup, calendar) } context 'if present → ' do let( :permission ){ true } @@ -51,7 +52,7 @@ RSpec.describe 'Calendars', type: :feature do end context 'on index view' do - let( :path ){ calendars_path } + let( :path ){ workgroup_calendars_path(workgroup) } context 'if present → ' do let( :permission ){ true } diff --git a/spec/mailers/calendar_mailer_spec.rb b/spec/mailers/calendar_mailer_spec.rb index 9a2076f64..00d73a58b 100644 --- a/spec/mailers/calendar_mailer_spec.rb +++ b/spec/mailers/calendar_mailer_spec.rb @@ -20,7 +20,7 @@ RSpec.describe CalendarMailer, type: :mailer do end it 'should have correct body' do - key = I18n.t("mailers.calendar_mailer.#{type}.body", cal_name: calendar.name, cal_index_url: calendars_url) + key = I18n.t("mailers.calendar_mailer.#{type}.body", cal_name: calendar.name, cal_index_url: workgroup_calendars_url(calendar.workgroup)) expect(email).to have_body_text /#{key}/ end end diff --git a/spec/support/pundit/pundit_view_policy.rb b/spec/support/pundit/pundit_view_policy.rb index 91be0624c..330209049 100644 --- a/spec/support/pundit/pundit_view_policy.rb +++ b/spec/support/pundit/pundit_view_policy.rb @@ -2,9 +2,8 @@ module Pundit module PunditViewPolicy def self.included into into.let(:permissions){ nil } - into.let(:organisation){ referential.try(:organisation) } - into.let(:current_referential){ referential || build_stubbed(:referential) } - into.let(:current_user){ build_stubbed :user, permissions: permissions, organisation: organisation } + into.let(:current_referential){ referential || build_stubbed(:referential, organisation: organisation) } + into.let(:current_user){ create :user, permissions: permissions, organisation: organisation } into.let(:pundit_user){ UserContext.new(current_user, referential: current_referential) } into.before do allow(view).to receive(:pundit_user) { pundit_user } diff --git a/spec/support/referential.rb b/spec/support/referential.rb index 497ff47a8..9acdce73a 100644 --- a/spec/support/referential.rb +++ b/spec/support/referential.rb @@ -11,8 +11,8 @@ module ReferentialHelper def self.included(base) base.class_eval do extend ClassMethods - alias_method :referential, :first_referential - alias_method :organisation, :first_organisation + base.let(:referential){ first_referential } + base.let(:organisation){ first_organisation } end end diff --git a/spec/views/referentials/show.html.erb_spec.rb b/spec/views/referentials/show.html.erb_spec.rb index 4a2afe2ca..6fd51949a 100644 --- a/spec/views/referentials/show.html.erb_spec.rb +++ b/spec/views/referentials/show.html.erb_spec.rb @@ -3,20 +3,22 @@ require 'spec_helper' describe "referentials/show", type: :view do let!(:referential) do - referential = create(:referential) + referential = create(:referential, organisation: organisation) assign :referential, referential.decorate(context: { current_organisation: referential.organisation }) end let(:permissions){ [] } let(:current_organisation) { organisation } - let(:current_offer_workbench) { create :workbench, organisation: current_organisation} + let(:current_offer_workbench) { create :workbench, organisation: organisation} + let(:current_workgroup) { current_offer_workbench.workgroup } let(:readonly){ false } before :each do assign :reflines, [] allow(view).to receive(:current_offer_workbench).and_return(current_offer_workbench) allow(view).to receive(:current_organisation).and_return(current_organisation) + allow(view).to receive(:current_workgroup).and_return(current_workgroup) allow(view).to receive(:current_user).and_return(current_user) allow(view).to receive(:resource).and_return(referential) |
