diff options
| author | Zakaria BOUZIANE | 2014-09-15 09:27:13 +0200 |
|---|---|---|
| committer | Zakaria BOUZIANE | 2014-09-15 09:27:13 +0200 |
| commit | 917e13fd1398dc246f2bda95e53ba3bab9794f44 (patch) | |
| tree | becc65439c5fef66166df0be01727fc6bb3267d1 /app | |
| parent | 686dd5c553c1df0260285fc0648fb152acfb15c5 (diff) | |
| parent | 7d44c95dbb514b6dd14151811a3ce7116d679722 (diff) | |
| download | chouette-core-917e13fd1398dc246f2bda95e53ba3bab9794f44.tar.bz2 | |
Merge branch 'sismo' of https://github.com/afimb/chouette2 into sismo
Diffstat (limited to 'app')
54 files changed, 769 insertions, 392 deletions
diff --git a/app/assets/images/export-pending.png b/app/assets/images/export-pending.png Binary files differindex 7fc459926..d5af6a807 100644 --- a/app/assets/images/export-pending.png +++ b/app/assets/images/export-pending.png diff --git a/app/assets/images/export-processing.png b/app/assets/images/export-processing.png Binary files differnew file mode 100644 index 000000000..7fc459926 --- /dev/null +++ b/app/assets/images/export-processing.png diff --git a/app/assets/images/file-validation-completed.png b/app/assets/images/file-validation-completed.png Binary files differdeleted file mode 100644 index 242d68d3b..000000000 --- a/app/assets/images/file-validation-completed.png +++ /dev/null diff --git a/app/assets/images/file-validation-failed.png b/app/assets/images/file-validation-failed.png Binary files differdeleted file mode 100644 index e50298a77..000000000 --- a/app/assets/images/file-validation-failed.png +++ /dev/null diff --git a/app/assets/images/file-validation-pending.png b/app/assets/images/file-validation-pending.png Binary files differdeleted file mode 100644 index 2d19124c0..000000000 --- a/app/assets/images/file-validation-pending.png +++ /dev/null diff --git a/app/assets/javascripts/stop_area_imports.js.coffee b/app/assets/javascripts/stop_area_imports.js.coffee deleted file mode 100644 index e69de29bb..000000000 --- a/app/assets/javascripts/stop_area_imports.js.coffee +++ /dev/null diff --git a/app/controllers/access_links_controller.rb b/app/controllers/access_links_controller.rb index 8c6172a7c..4509de575 100644 --- a/app/controllers/access_links_controller.rb +++ b/app/controllers/access_links_controller.rb @@ -16,7 +16,15 @@ class AccessLinksController < ChouetteController def show @map = AccessLinkMap.new(resource).with_helpers(self) - show! + @access_point = Chouette::AccessPoint.find(params[:access_point_id]) + @access_link = Chouette::AccessLink.find(params[:id]) + @stop_area = @access_link.stop_area + show! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + add_breadcrumb @access_point.name, referential_stop_area_access_point_path(@referential, @stop_area,@access_point) + add_breadcrumb Chouette::AccessLink.model_name.human(:count => 2), access_links_referential_stop_area_path(@referential, @stop_area) + end end def new @@ -34,7 +42,11 @@ class AccessLinksController < ChouetteController data[:name] = name end @access_link = Chouette::AccessLink.new(data) - new! + new! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + add_breadcrumb @access_point.name, referential_stop_area_access_point_path(@referential, @stop_area,@access_point) + end end def create @@ -50,7 +62,12 @@ class AccessLinksController < ChouetteController @access_link = Chouette::AccessLink.find(params[:id]) @stop_area = @access_link.stop_area @orientation = @access_link.link_orientation_type - edit! + edit! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + add_breadcrumb @access_point.name, referential_stop_area_access_point_path(@referential, @stop_area,@access_point) + add_breadcrumb @access_link.name, referential_access_point_access_link_path(@referential, @access_point, @access_link) + end end protected diff --git a/app/controllers/access_points_controller.rb b/app/controllers/access_points_controller.rb index cf7507100..0e06bee19 100644 --- a/app/controllers/access_points_controller.rb +++ b/app/controllers/access_points_controller.rb @@ -30,13 +30,26 @@ class AccessPointsController < ChouetteController } end + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end end + def new + new! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + end + end + def edit access_point.position ||= access_point.default_position map.editable = true - edit! + edit! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + add_breadcrumb @access_point.name, referential_stop_area_access_point_path(@referential, @stop_area,@access_point) + end end diff --git a/app/controllers/companies_controller.rb b/app/controllers/companies_controller.rb index 3b5631a8f..20f84e763 100644 --- a/app/controllers/companies_controller.rb +++ b/app/controllers/companies_controller.rb @@ -14,9 +14,30 @@ class CompaniesController < ChouetteController if collection.out_of_bounds? redirect_to params.merge(:page => 1) end + add_breadcrumb Referential.model_name.human(:count => 2), referentials_path() + add_breadcrumb @referential.name, referential_path(@referential) } end end + + def show + show! do + add_breadcrumb Referential.human_attribute_name("companies"), referential_companies_path(@referential) + end + end + + def new + new! do + add_breadcrumb Referential.human_attribute_name("companies"), referential_companies_path(@referential) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("companies"), referential_companies_path(@referential) + add_breadcrumb @company.name, referential_line_path(@referential, @company) + end + end protected def collection diff --git a/app/controllers/compliance_check_tasks_controller.rb b/app/controllers/compliance_check_tasks_controller.rb index 9acce4510..bf8a670a3 100644 --- a/app/controllers/compliance_check_tasks_controller.rb +++ b/app/controllers/compliance_check_tasks_controller.rb @@ -2,6 +2,17 @@ class ComplianceCheckTasksController < ChouetteController respond_to :html, :js belongs_to :referential + def new + new! do + add_breadcrumb Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) + end + end + + def show + show! do + add_breadcrumb Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) + end + end def references @references = referential.send(params[:type]).where("name ilike ?", "%#{params[:q]}%") respond_to do |format| diff --git a/app/controllers/connection_links_controller.rb b/app/controllers/connection_links_controller.rb index 3c7dd3ab6..ca34aecdc 100644 --- a/app/controllers/connection_links_controller.rb +++ b/app/controllers/connection_links_controller.rb @@ -22,13 +22,31 @@ class ConnectionLinksController < ChouetteController def show @map = ConnectionLinkMap.new(resource).with_helpers(self) - show! + show! do + add_breadcrumb Referential.human_attribute_name("connection_links"), referential_connection_links_path(@referential) + end end + def new + new! do + add_breadcrumb Referential.human_attribute_name("connection_links"), referential_connection_links_path(@referential) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("connection_links"), referential_connection_links_path(@referential) + add_breadcrumb @connection_link.name, referential_connection_link_path(@referential, @connection_link) + end + end + + def select_areas @connection_link = connection_link @departure = connection_link.departure @arrival = connection_link.arrival + add_breadcrumb Referential.human_attribute_name("connection_links"), referential_connection_links_path(@referential) + add_breadcrumb @connection_link.name, referential_connection_link_path(@referential, @connection_link) end protected diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb index ed2ecd329..d5723ff78 100644 --- a/app/controllers/exports_controller.rb +++ b/app/controllers/exports_controller.rb @@ -7,6 +7,7 @@ class ExportsController < ChouetteController def new new! do + add_breadcrumb Referential.human_attribute_name("exports"), referential_exports_path(@referential) available_exports end end @@ -19,6 +20,7 @@ class ExportsController < ChouetteController end def show + add_breadcrumb Referential.human_attribute_name("exports"), referential_exports_path(@referential) show! do |format| format.zip { send_file @export.file, :type => :zip } end diff --git a/app/controllers/group_of_lines_controller.rb b/app/controllers/group_of_lines_controller.rb index 5bbda9b84..7167cc40e 100644 --- a/app/controllers/group_of_lines_controller.rb +++ b/app/controllers/group_of_lines_controller.rb @@ -11,7 +11,9 @@ class GroupOfLinesController < ChouetteController def show @map = GroupOfLineMap.new(resource).with_helpers(self) @lines = resource.lines.order(:name).paginate(:page => params[:page]) - show! + show! do + add_breadcrumb Referential.human_attribute_name("group_of_lines"), referential_group_of_lines_path(@referential) + end end def index @@ -23,12 +25,24 @@ class GroupOfLinesController < ChouetteController } end end + + def new + new! do + add_breadcrumb Referential.human_attribute_name("group_of_lines"), referential_group_of_lines_path(@referential) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("group_of_lines"), referential_group_of_lines_path(@referential) + add_breadcrumb @group_of_line.name, referential_group_of_line_path(@referential, @group_of_line) + end + end def name_filter respond_to do |format| format.json { render :json => filtered_group_of_lines_maps} end - end protected diff --git a/app/controllers/import_tasks_controller.rb b/app/controllers/import_tasks_controller.rb index 1d7e8c3aa..e900c79ce 100644 --- a/app/controllers/import_tasks_controller.rb +++ b/app/controllers/import_tasks_controller.rb @@ -5,12 +5,14 @@ class ImportTasksController < ChouetteController def new new! do + add_breadcrumb Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) available_imports end end def show show! do + add_breadcrumb Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) if import_task.completed? @files_stats = import_task.result["files"]["stats"] @files_list = import_task.result["files"]["list"] diff --git a/app/controllers/journey_patterns_controller.rb b/app/controllers/journey_patterns_controller.rb index 0274b9b71..084f34b03 100644 --- a/app/controllers/journey_patterns_controller.rb +++ b/app/controllers/journey_patterns_controller.rb @@ -27,7 +27,28 @@ class JourneyPatternsController < ChouetteController def show @map = JourneyPatternMap.new(journey_pattern).with_helpers(self) @stop_points = journey_pattern.stop_points.paginate(:page => params[:page]) - show! + show! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + add_breadcrumb @route.name, referential_line_route_path(@referential, @line, @route) + end + end + + def new + new! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + add_breadcrumb @route.name, referential_line_route_path(@referential, @line, @route) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + add_breadcrumb @route.name, referential_line_route_path(@referential, @line, @route) + add_breadcrumb @journey_pattern.name, referential_line_route_journey_pattern_path(@referential, @line, @route, @journey_pattern) + end end def new_vehicle_journey diff --git a/app/controllers/lines_controller.rb b/app/controllers/lines_controller.rb index 3721a957d..2ff732721 100644 --- a/app/controllers/lines_controller.rb +++ b/app/controllers/lines_controller.rb @@ -22,9 +22,23 @@ class LinesController < ChouetteController @map = LineMap.new(resource).with_helpers(self) @routes = @line.routes @group_of_lines = @line.group_of_lines - show! + show! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + end end + def new + new! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + end + end # overwrite inherited resources to use delete instead of destroy # foreign keys will propagate deletion) def destroy_resource(object) diff --git a/app/controllers/networks_controller.rb b/app/controllers/networks_controller.rb index 04d565812..f99ff494b 100644 --- a/app/controllers/networks_controller.rb +++ b/app/controllers/networks_controller.rb @@ -10,7 +10,9 @@ class NetworksController < ChouetteController def show @map = NetworkMap.new(resource).with_helpers(self) - show! + show! do + add_breadcrumb Referential.human_attribute_name("networks"), referential_networks_path(@referential) + end end def index @@ -23,6 +25,19 @@ class NetworksController < ChouetteController end end + def new + new! do + add_breadcrumb Referential.human_attribute_name("networks"), referential_networks_path(@referential) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("networks"), referential_networks_path(@referential) + add_breadcrumb @network.name, referential_line_path(@referential, @network) + end + end + protected def collection diff --git a/app/controllers/routes_controller.rb b/app/controllers/routes_controller.rb index 7b5e096db..7d51c47ad 100644 --- a/app/controllers/routes_controller.rb +++ b/app/controllers/routes_controller.rb @@ -18,9 +18,26 @@ class RoutesController < ChouetteController def show @map = RouteMap.new(route).with_helpers(self) @stop_points = route.stop_points.paginate(:page => params[:page]) - show! + show! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + end end + def new + new! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + end + end + + def edit + edit! do + add_breadcrumb Referential.human_attribute_name("lines"), referential_lines_path(@referential) + add_breadcrumb @line.name, referential_line_path(@referential, @line) + add_breadcrumb @route.name, referential_line_route_path(@referential, @line, @route) + end + end # overwrite inherited resources to use delete instead of destroy # foreign keys will propagate deletion) def destroy_resource(object) diff --git a/app/controllers/rule_parameter_sets_controller.rb b/app/controllers/rule_parameter_sets_controller.rb index fbd5281c8..9918e0eb5 100644 --- a/app/controllers/rule_parameter_sets_controller.rb +++ b/app/controllers/rule_parameter_sets_controller.rb @@ -6,7 +6,26 @@ class RuleParameterSetsController < ChouetteController def new @rule_parameter_set = RuleParameterSet.default( @referential) - new! + new! do + add_breadcrumb Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) + add_breadcrumb Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) + add_breadcrumb Referential.human_attribute_name("rule_parameter_sets"), referential_rule_parameter_sets_path(@referential) + end + end + + def index + index! do + add_breadcrumb Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) + add_breadcrumb Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) + end + end + + def show + show! do + add_breadcrumb Referential.human_attribute_name("import_tasks"), referential_import_tasks_path(@referential) + add_breadcrumb Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) + add_breadcrumb Referential.human_attribute_name("rule_parameter_sets"), referential_rule_parameter_sets_path(@referential) + end end def destroy diff --git a/app/controllers/stop_area_copies_controller.rb b/app/controllers/stop_area_copies_controller.rb index dbb66c2bd..642932acd 100644 --- a/app/controllers/stop_area_copies_controller.rb +++ b/app/controllers/stop_area_copies_controller.rb @@ -8,7 +8,10 @@ class StopAreaCopiesController < ChouetteController def new @stop_area_copy = StopAreaCopy.new(:hierarchy => params[:hierarchy], :source => parent) - new! + new! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + end end def create diff --git a/app/controllers/stop_area_exports_controller.rb b/app/controllers/stop_area_exports_controller.rb deleted file mode 100644 index e675a9826..000000000 --- a/app/controllers/stop_area_exports_controller.rb +++ /dev/null @@ -1,25 +0,0 @@ -class StopAreaExportsController < ChouetteController - belongs_to :referential - - respond_to :csv, :only => [:index] - respond_to :xls, :only => [:index] - - def index - @column_names = column_names - index! do |format| - format.csv { send_data StopAreaExport.new( {:column_names => column_names, :stop_areas => collection} ).to_csv } - format.xls - end - end - - protected - - def column_names - ["id","name","longitude","latitude","area_type","parent_id", "comment","country_code","street_name","mobility_restricted_suitability","stairs_availability","lift_availability","int_user_needs"] - end - - def collection - @stop_areas ||= Chouette::StopArea.order(:country_code, :name) - end - -end diff --git a/app/controllers/stop_area_imports_controller.rb b/app/controllers/stop_area_imports_controller.rb deleted file mode 100644 index ff93dc40e..000000000 --- a/app/controllers/stop_area_imports_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -class StopAreaImportsController < ChouetteController - belongs_to :referential - - actions :new, :create - respond_to :html, :only => :new - - def new - @stop_area_import = StopAreaImport.new - new! - end - - def create - @stop_area_import = StopAreaImport.new(params[:stop_area_import]) - if @stop_area_import.save - redirect_to referential_stop_areas_path( @referential ), notice: I18n.t("stop_area_imports.new.success") - else - flash[:error] = I18n.t("stop_area_imports.errors.import_aborted") + "<br>" + @stop_area_import.errors.full_messages.join("<br>") - render :new - end - end - - protected - -end diff --git a/app/controllers/stop_areas_controller.rb b/app/controllers/stop_areas_controller.rb index e18f89cab..ca72c362b 100644 --- a/app/controllers/stop_areas_controller.rb +++ b/app/controllers/stop_areas_controller.rb @@ -19,30 +19,40 @@ class StopAreasController < ChouetteController def select_parent @stop_area = stop_area @parent = stop_area.parent + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end def add_children @stop_area = stop_area @children = stop_area.children + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end def add_routing_lines @stop_area = stop_area @lines = stop_area.routing_lines + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end def add_routing_stops @stop_area = stop_area @stops = stop_area.routing_stops + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end def access_links @stop_area = stop_area @generic_access_links = stop_area.generic_access_link_matrix @detail_access_links = stop_area.detail_access_link_matrix + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) end - def index + def index request.format.kml? ? @per_page = nil : @per_page = 12 @country_codes = referential.stop_areas.collect(&:country_code).compact.uniq index! do |format| @@ -51,27 +61,39 @@ class StopAreasController < ChouetteController redirect_to params.merge(:page => 1) end } - end + end + end + + def new + @map = StopAreaMap.new( Chouette::StopArea.new).with_helpers(self) + @map.editable = true + new! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + end end def show map.editable = false @access_points = @stop_area.access_points show! do |format| - unless stop_area.position or params[:default] or params[:routing] + unless stop_area.position or params[:default] or params[:routing] format.kml { - render :nothing => true, :status => :not_found + render :nothing => true, :status => :not_found } - + end + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) end end - + def edit stop_area.position ||= stop_area.default_position map.editable = true - edit! + edit! do + add_breadcrumb Referential.human_attribute_name("stop_areas"), referential_stop_areas_path(@referential) + add_breadcrumb @stop_area.name, referential_stop_area_path(@referential, @stop_area) + end end def default_geometry @@ -85,9 +107,9 @@ class StopAreasController < ChouetteController format.json { render :json => referential.stop_areas.collect(&:country_code).compact.uniq.to_json } end end - + protected - + alias_method :stop_area, :resource def map @@ -96,7 +118,7 @@ class StopAreasController < ChouetteController def collection @q = parent.present? ? parent.stop_areas.search(params[:q]) : referential.stop_areas.search(params[:q]) - @stop_areas ||= + @stop_areas ||= begin stop_areas = @q.result(:distinct => true).order(:name) stop_areas = stop_areas.paginate(:page => params[:page], :per_page => @per_page) if @per_page.present? diff --git a/app/controllers/vehicle_journey_exports_controller.rb b/app/controllers/vehicle_journey_exports_controller.rb index ed1cd61a6..0cc30f23a 100644 --- a/app/controllers/vehicle_journey_exports_controller.rb +++ b/app/controllers/vehicle_journey_exports_controller.rb @@ -6,21 +6,28 @@ class VehicleJourneyExportsController < ChouetteController end respond_to :csv, :only => [:index] - respond_to :xls, :only => [:index] + respond_to :zip, :only => [:index] + #respond_to :xls, :only => [:index] def index - @column_names = column_names index! do |format| - format.csv { send_data VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys, :column_names => column_names).to_csv } - format.xls + format.csv { send_data VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys).to_csv(:col_sep => ";") , :filename => t("vehicle_journey_exports.new.basename")+"_#{route.id}.csv" } + format.zip do + begin + temp_file = Tempfile.new("vehicle_journey_export") + VehicleJourneyExport.new(:route => route, :vehicle_journeys => vehicle_journeys).to_zip(temp_file,:col_sep => ";") + send_data File.read(temp_file.path), :filename => t("vehicle_journey_exports.new.basename")+"_#{route.id}.zip" + ensure + temp_file.close + temp_file.unlink + end + end + #format.xls end end protected - def column_names - ["stop_point_id", "stop_area_name"] + vehicle_journeys.collect(&:objectid) - end alias_method :route, :parent diff --git a/app/controllers/vehicle_journey_imports_controller.rb b/app/controllers/vehicle_journey_imports_controller.rb index 8246541bc..136fac6d3 100644 --- a/app/controllers/vehicle_journey_imports_controller.rb +++ b/app/controllers/vehicle_journey_imports_controller.rb @@ -16,7 +16,12 @@ class VehicleJourneyImportsController < ChouetteController def create @vehicle_journey_import = VehicleJourneyImport.new( params[:vehicle_journey_import].present? ? params[:vehicle_journey_import].merge({:route => route}) : {:route => route} ) if @vehicle_journey_import.save - redirect_to referential_line_route_path( @referential, @line, @route ), notice: I18n.t("vehicle_journey_imports.new.success") + notice = I18n.t("vehicle_journey_imports.new.success") + + "<br>" + I18n.t("vehicle_journey_imports.success.created_jp_count",:count => @vehicle_journey_import.created_journey_pattern_count) + + "<br>" + I18n.t("vehicle_journey_imports.success.created_vj_count",:count => @vehicle_journey_import.created_vehicle_journey_count) + + "<br>" + I18n.t("vehicle_journey_imports.success.updated_vj_count",:count => @vehicle_journey_import.updated_vehicle_journey_count) + + "<br>" + I18n.t("vehicle_journey_imports.success.deleted_vj_count",:count => @vehicle_journey_import.deleted_vehicle_journey_count) + redirect_to referential_line_route_path( @referential, @line, @route ), notice: notice else flash[:error] = I18n.t("vehicle_journey_imports.errors.import_aborted") + "<br>" + @vehicle_journey_import.errors.full_messages.join("<br>") render :new diff --git a/app/exporters/chouette/hub/exporter.rb b/app/exporters/chouette/hub/exporter.rb index 96e125814..2d14d3a3b 100644 --- a/app/exporters/chouette/hub/exporter.rb +++ b/app/exporters/chouette/hub/exporter.rb @@ -1,4 +1,5 @@ class Chouette::Hub::Exporter + require "zip" attr_reader :referential attr_reader :hub_export, :lines, :routes, :journey_patterns @@ -174,7 +175,7 @@ class Chouette::Hub::Exporter end - ::Zip::ZipFile.open(zip_file_path, ::Zip::ZipFile::CREATE) do |zipfile| + ::Zip::File.open(zip_file_path, ::Zip::File::CREATE) do |zipfile| Dir[File.join(temp_dir, '*.TXT')].each do |f| #Rails.logger.error("Adding File #{File.basename(f)}") zipfile.add(File.basename(f), f) diff --git a/app/exporters/chouette/kml/exporter.rb b/app/exporters/chouette/kml/exporter.rb index 06af4bc2f..5b6170edc 100644 --- a/app/exporters/chouette/kml/exporter.rb +++ b/app/exporters/chouette/kml/exporter.rb @@ -1,5 +1,7 @@ class Chouette::Kml::Exporter + require 'zip' + attr_reader :referential attr_reader :kml_export, :lines, :routes, :journey_patterns @@ -103,7 +105,7 @@ class Chouette::Kml::Exporter end - ::Zip::ZipFile.open(zip_file_path, ::Zip::ZipFile::CREATE) do |zipfile| + ::Zip::File.open(zip_file_path, ::Zip::File::CREATE) do |zipfile| Dir[File.join(temp_dir, '*.kml')].each do |f| zipfile.add(File.basename(f), f) end diff --git a/app/helpers/exports_helper.rb b/app/helpers/exports_helper.rb index 1ae59c190..9be7a5e46 100644 --- a/app/helpers/exports_helper.rb +++ b/app/helpers/exports_helper.rb @@ -1,15 +1,19 @@ module ExportsHelper def fields_for_export_type(form) - partial_name = "fields_#{form.object.type.underscore}" + #partial_name = "fields_#{form.object.type.underscore}" begin - render :partial => partial_name, :locals => { :form => form } + render :partial => export_partial_name(form), :locals => { :form => form } rescue ActionView::MissingTemplate "" end end + def export_partial_name(form) + "fields_#{form.object.type.underscore}" + end + include TypeIdsModelsHelper end diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb index 22ce8ea98..7f58b229e 100644 --- a/app/helpers/imports_helper.rb +++ b/app/helpers/imports_helper.rb @@ -2,14 +2,18 @@ module ImportsHelper def fields_for_import_task_format(form) - partial_name = "fields_#{form.object.format.underscore}_import" + #partial_name = "fields_#{form.object.format.underscore}_import" begin - render :partial => partial_name, :locals => { :form => form } + render :partial => import_partial_name(form), :locals => { :form => form } rescue ActionView::MissingTemplate "" end end + + def import_partial_name(form) + "fields_#{form.object.format.underscore}_import" + end def compliance_icon( import_task) return nil unless import_task.compliance_check_task diff --git a/app/maps/stop_area_map.rb b/app/maps/stop_area_map.rb index 3fff4a110..ee0adc0bb 100644 --- a/app/maps/stop_area_map.rb +++ b/app/maps/stop_area_map.rb @@ -10,9 +10,6 @@ class StopAreaMap < ApplicationMap end def customize_map(map, page) - page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => Design::EditStopAreaStyleMap.new(helpers).style_map) - page << map.add_layer(:edit_stop_area_layer) - if stop_area.children.present? page.assign "children_layer", kml_layer(stop_area, { :children => true }, :style_map => Design::StopAreasStyleMap.new(helpers).style_map) page << map.add_layer(:children_layer) @@ -23,27 +20,106 @@ class StopAreaMap < ApplicationMap page << map.add_control( hover_control_display_name(:routing_layer) ) page << map.zoom_to_extent(bounds.to_google.to_openlayers) if bounds else - - page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => Design::EditStopAreaStyleMap.new(helpers).style_map) + + + if stop_area.new_record? + page << <<EOF + var createStyleMap = function() { + var defProp = {strokeColor: "red"}; + var defProp = {strokeColor: "black", strokeOpacity: 1, strokeWidth: 2, fillColor: "white", fillOpacity: 1}; + var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]); + return new OpenLayers.StyleMap({'default': defStyle}); + }; + var edit_stop_area_layer = new OpenLayers.Layer.Vector( "edit_stop_area_layer", {styleMap: createStyleMap()}); + +EOF + else + page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => Design::EditStopAreaStyleMap.new(helpers).style_map) + end + + page << <<EOF + var createAddressStyleMap = function() { + var defProp = {strokeColor: "black", strokeOpacity: 1, strokeWidth: 2, fillColor: "#86b41d", fillOpacity: 1}; + var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]); + return new OpenLayers.StyleMap({'default': defStyle, }); + }; + var address_layer = new OpenLayers.Layer.Vector( "address_layer", {styleMap: createAddressStyleMap()}); + + var removeAddress = function() { + address_layer.destroyFeatures(); + }; + + var addAddress = function( lat, lng, name ) { + var wgs84point = new OpenLayers.Geometry.Point( lat, lng); + var point = transformedGeometry( wgs84point, "EPSG:4326", "EPSG:900913" ) + var feature = new OpenLayers.Feature.Vector( point, { name: name}); + address_layer.addFeatures( [feature]); + + var bounds = new OpenLayers.Bounds(); + bounds.extend( feature.geometry.getBounds()); + for (var x in edit_stop_area_layer.features) { + bounds.extend( edit_stop_area_layer.features[x].geometry.getBounds()); + } + map.zoomToExtent(bounds,true); + }; + var transformedGeometry = function( geometry, origin, target ) { + return geometry.clone().transform( new OpenLayers.Projection( origin ), new OpenLayers.Projection( target )); + } +EOF + page << map.add_layer(:address_layer) page << map.add_layer(:edit_stop_area_layer) - + if editable? - page.assign "referential_projection", projection_type.present? ? projection("EPSG:" + projection_type) : JsVar.new("undefined") - # TODO virer ce code inline + page.assign "referential_projection", projection_type.present? ? projection("EPSG:" + projection_type) : JsVar.new("undefined") + + # TODO virer ce code inline page << <<EOF - edit_stop_area_layer.events.on({ - 'afterfeaturemodified': function(event) { - geometry = event.feature.geometry.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); - $('#stop_area_coordinates').val(geometry.y.toString()+ ","+ geometry.x.toString()); - - if(referential_projection != undefined) - { - projection_geometry = event.feature.geometry.clone().transform(new OpenLayers.Projection("EPSG:900913"), referential_projection ); - $('#stop_area_projection_xy').val(projection_geometry.x.toString()+ ","+ projection_geometry.y.toString()); } - } - }); + + var getEventWGS84 = function( event) { + return transformedGeometry( event.geometry, "EPSG:900913", "EPSG:4326"); + } + var getEventProjection = function( event, projCode) { + return transformedGeometry( event.geometry, "EPSG:900913", projCode); + } + var updateStopAreaCoordinates = function( event ) { + var geometry = getEventWGS84( event ); + $('#stop_area_coordinates').val( geometry.y.toString()+ ","+ geometry.x.toString()); + } + var updateStopAreaProjectionXY = function( event, projCode ) { + var geometry = getEventProjection( event, projCode); + $('#stop_area_projection_xy').val( geometry.x.toString()+ ","+ geometry.y.toString()); + } + + var drawControl = new OpenLayers.Control.DrawFeature( edit_stop_area_layer, OpenLayers.Handler.Point, + { featureAdded: function(event) { + console.log( "featureAdded" ); + updateStopAreaCoordinates( event); + if( typeof referential_projection !== 'undefined') { + updateStopAreaProjectionXY( event, referential_projection.projCode); + } + this.deactivate(); + } + }); + + var dragControl = new OpenLayers.Control.DragFeature( edit_stop_area_layer, + { autoActivate: true, + onComplete: function(event) { + updateStopAreaCoordinates( event); + if( typeof referential_projection !== 'undefined') { + updateStopAreaProjectionXY( event, referential_projection.projCode); + } + }, + }); + map.addControl( dragControl); + map.addControl( drawControl); EOF - page << map.add_control(OpenLayers::Control::ModifyFeature.new(:edit_stop_area_layer, :mode => 8, :autoActivate => true)) + + if stop_area.new_record? + page << <<EOF + drawControl.activate(); +EOF + end + #page << map.add_control(OpenLayers::Control::ModifyFeature.new(:edit_stop_area_layer, :mode => 8, :autoActivate => true)) elsif stop_area.children.present? page << map.add_control( hover_control_display_name(:children_layer) ) @@ -52,7 +128,7 @@ EOF page << map.set_center(center.to_google.to_openlayers, 16, false, true) end end - + def projection_type stop_area.referential.projection_type end diff --git a/app/models/export.rb b/app/models/export.rb index 98b3f0ace..4d7b5c56c 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -3,7 +3,7 @@ class Export < ActiveRecord::Base belongs_to :referential validates_presence_of :referential_id - validates_inclusion_of :status, :in => %w{ pending completed failed } + validates_inclusion_of :status, :in => %w{ pending processing completed failed } has_many :log_messages, :class_name => "ExportLogMessage", :order => :position, :dependent => :delete_all @@ -51,12 +51,7 @@ class Export < ActiveRecord::Base end def export_object_type -# case references_type -# when "Chouette::Network" -# "ptnetwork" -# else references_relation ? references_relation.singularize : "line" -# end end before_validation :define_default_attributes, :on => :create @@ -91,10 +86,19 @@ class Export < ActiveRecord::Base log_messages.create :severity => result_severity, :key => status end - @@references_types = [ Chouette::Line, Chouette::Network, Chouette::Company ] - cattr_reader :references_types - validates_inclusion_of :references_type, :in => references_types.map(&:to_s), :allow_blank => true, :allow_nil => true + def self.all_references_types + [ Chouette::Line, Chouette::Network, Chouette::Company , Chouette::StopArea] + end + + def references_types + [ Chouette::Line, Chouette::Network, Chouette::Company ] + end + + # @@references_types = [ Chouette::Line, Chouette::Network, Chouette::Company ] + # cattr_reader :references_types + + # validates_inclusion_of :references_type, :in => references_types.map(&:to_s), :allow_blank => true, :allow_nil => true def self.format_name(format) name_by_format = { @@ -107,6 +111,10 @@ class Export < ActiveRecord::Base } name_by_format[format] end + + def self.format_label(format) + I18n.t 'exchange.format.'+format.sub("Export",'').downcase + end def self.types unless Rails.env.development? diff --git a/app/models/gtfs_export.rb b/app/models/gtfs_export.rb index 9c66e778b..6f43a93eb 100644 --- a/app/models/gtfs_export.rb +++ b/app/models/gtfs_export.rb @@ -5,6 +5,10 @@ class GtfsExport < Export after_initialize :init_time_zone + def references_types + [ Chouette::Line, Chouette::Network, Chouette::Company, Chouette::StopArea ] + end + def init_time_zone if time_zone.nil? self.time_zone = "Paris" diff --git a/app/models/gtfs_import.rb b/app/models/gtfs_import.rb index af83d81a0..c2457548f 100644 --- a/app/models/gtfs_import.rb +++ b/app/models/gtfs_import.rb @@ -7,4 +7,8 @@ class GtfsImport < ImportTask option :ignore_end_chars option :max_distance_for_connection_link + def references_types + [ Chouette::StopArea ] + end + end diff --git a/app/models/import_task.rb b/app/models/import_task.rb index 90783075d..26b3808c7 100644 --- a/app/models/import_task.rb +++ b/app/models/import_task.rb @@ -15,6 +15,10 @@ class ImportTask < ActiveRecord::Base validates_presence_of :user_name validates_inclusion_of :status, :in => %w{ pending processing completed failed } + def references_types + [] + end + protected def self.option(name, type=nil) @@ -41,6 +45,10 @@ class ImportTask < ActiveRecord::Base %w{Neptune Csv Gtfs Netex} end + def self.format_label(format) + I18n.t 'exchange.format.'+format.downcase + end + def delayed_import delay.import end @@ -54,6 +62,7 @@ class ImportTask < ActiveRecord::Base option :no_save, :boolean option :format option :file_path + option :references_type validates_inclusion_of :no_save, :in => [ true, false] validates_inclusion_of :format, :in => self.formats diff --git a/app/models/referential.rb b/app/models/referential.rb index f99c65f9f..41d239961 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -41,6 +41,10 @@ class Referential < ActiveRecord::Base end end + def viewbox_left_top_right_bottom + [ lower_corner.lng, upper_corner.lat, upper_corner.lng, lower_corner.lat ].join(',') + end + def human_attribute_name(*args) self.class.human_attribute_name(*args) end diff --git a/app/models/stop_area_export.rb b/app/models/stop_area_export.rb deleted file mode 100644 index 1b9cc36a7..000000000 --- a/app/models/stop_area_export.rb +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -require "csv" - -class StopAreaExport - include ActiveModel::Validations - include ActiveModel::Conversion - extend ActiveModel::Naming - - attr_accessor :column_names, :stop_areas - - def initialize(attributes = {}) - attributes.each { |name, value| send("#{name}=", value) } - end - - def persisted? - false - end - - def to_csv(options = {}) - CSV.generate(options) do |csv| - csv << column_names - stop_areas.each do |stop_area| - csv << stop_area.attributes.values_at(*column_names) - end - end - end - -end diff --git a/app/models/stop_area_import.rb b/app/models/stop_area_import.rb deleted file mode 100644 index 52d8a94bb..000000000 --- a/app/models/stop_area_import.rb +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- - -class StopAreaImport - include ActiveModel::Validations - include ActiveModel::Conversion - extend ActiveModel::Naming - - attr_accessor :file - - validates_presence_of :file - - def initialize(attributes = {}) - attributes.each { |name, value| send("#{name}=", value) } if attributes - end - - def persisted? - false - end - - def save - begin - Chouette::StopArea.transaction do - if imported_stop_areas.map(&:valid?).all? - imported_stop_areas.each(&:save!) - true - else - imported_stop_areas.each_with_index do |imported_stop_area, index| - imported_stop_area.errors.full_messages.each do |message| - errors.add :base, I18n.t("stop_area_imports.errors.invalid_stop_area", :column => index+2, :message => message) - end - end - false - end - end - rescue Exception => exception - Rails.logger.error(exception.message) - errors.add :base, I18n.t("stop_area_imports.errors.exception") - false - end - end - - def imported_stop_areas - @imported_stop_areas ||= load_imported_stop_areas - end - - def load_imported_stop_areas - spreadsheet = open_spreadsheet(file) - header = spreadsheet.row(1) - (2..spreadsheet.last_row).map do |i| - row = Hash[[header, spreadsheet.row(i)].transpose] - stop_area = Chouette::StopArea.find_by_id(row["id"]) || Chouette::StopArea.new - stop_area.attributes = row.to_hash.slice(*Chouette::StopArea.accessible_attributes) - stop_area - end - end - - def open_spreadsheet(file) - case File.extname(file.original_filename) - when '.csv' then Roo::CSV.new(file.path) - when '.xls' then Roo::Excel.new(file.path) - when '.xlsx' then Roo::Excelx.new(file.path) - else - raise "Unknown file type: #{file.original_filename}" - end - end - -end diff --git a/app/models/vehicle_journey_export.rb b/app/models/vehicle_journey_export.rb index 7f5577e22..3de88b608 100644 --- a/app/models/vehicle_journey_export.rb +++ b/app/models/vehicle_journey_export.rb @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- require "csv" +require "zip" class VehicleJourneyExport include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming - attr_accessor :vehicle_journeys, :column_names, :route + attr_accessor :vehicle_journeys, :route def initialize(attributes = {}) attributes.each { |name, value| send("#{name}=", value) } @@ -16,20 +17,151 @@ class VehicleJourneyExport false end - def vehicle_journey_at_stops_matrix - (vehicle_journeys.collect{ |vj| vj.vehicle_journey_at_stops.collect(&:departure_time).collect{|time| time.strftime("%H:%M")} }).transpose + def label(name) + I18n.t "vehicle_journey_exports.label.#{name}" + end + + def column_names + ["", label("vehicle_journey_id")] + vehicle_journeys.collect(&:id) + end + + # produce a map stop_id => departure time for a vehicle_journey + def time_by_stops(vj) + {}.tap do |hash| + vj.vehicle_journey_at_stops.each do |vjas| + hash[ "#{vjas.stop_point_id}"] = vjas.departure_time.strftime("%H:%M") + end + end + end + + def time_tables (vj) + (vj.time_tables.collect{ |t| t.id }) + end + + def time_tables_array + (vehicle_journeys.collect{ |vj| time_tables(vj).to_s[1..-2] } ) + end + + def vehicle_journey_at_stops_array + (vehicle_journeys.collect{ |vj| time_by_stops vj } ) + end + + def boolean_code(b) + b.nil? ? "" : label("b_"+b.to_s) + end + + def number_array + (vehicle_journeys.collect{ |vj| vj.number ? vj.number.to_s : "" } ) + end + + def vehicle_identifier_array + (vehicle_journeys.collect{ |vj| vj.vehicle_type_identifier ? vj.vehicle_type_identifier : "" } ) + end + + def flexible_service_array + (vehicle_journeys.collect{ |vj| boolean_code vj.flexible_service } ) + end + + def mobility_restricted_suitability_array + (vehicle_journeys.collect{ |vj| boolean_code vj.mobility_restricted_suitability } ) + end + + def empty_array + (vehicle_journeys.collect{ |vj| "" } ) + end + + def times_of_stop(stop_id,vjas_array) + a = [] + vjas_array.each do |map| + a << (map[stop_id.to_s].present? ? map[stop_id.to_s] : "") + end + a end def to_csv(options = {}) CSV.generate(options) do |csv| csv << column_names - route.stop_points.each_with_index do |stop_point, index| - puts vehicle_journey_at_stops_matrix[index].inspect - - times = vehicle_journey_at_stops_matrix[index].present? ? vehicle_journey_at_stops_matrix[index] : [] + csv << ["", label("number")] + number_array + csv << ["", label("vehicle_identifier")] + vehicle_identifier_array + csv << ["", label("mobility")] + mobility_restricted_suitability_array + csv << ["", label("flexible_service")] + flexible_service_array + csv << ["", label("time_table_ids")] + time_tables_array + csv << [label("stop_id"), label("stop_name")] + empty_array + vjas_array = vehicle_journey_at_stops_array + route.stop_points.each_with_index do |stop_point, index| + times = times_of_stop(stop_point.id,vjas_array) csv << [stop_point.id, stop_point.stop_area.name] + times end end end + def tt_day_types(tt) + type = tt.monday ? label("monday") : ".." + type += tt.tuesday ? label("tuesday") : ".." + type += tt.wednesday ? label("wednesday") : ".." + type += tt.thursday ? label("thursday") : ".." + type += tt.friday ? label("friday") : ".." + type += tt.saturday ? label("saturday") : ".." + type += tt.sunday ? label("sunday") : ".." + type + end + + def tt_periods(tt) + periods = "" + tt.periods.each do |p| + periods += "["+p.period_start.to_s+" -> "+p.period_end.to_s+"] " + end + periods + end + + def tt_peculiar_days(tt) + days = "" + tt.included_days.each do |d| + days += d.to_s+" " + end + days + end + + def tt_excluded_days(tt) + days = "" + tt.excluded_days.each do |d| + days += d.to_s+" " + end + days + end + + def tt_data(tt) + [].tap do |array| + # code;name;tags;start;end;day types;periods;peculiar days;excluded days + array << tt.id.to_s + array << tt.comment + array << tt.tag_list + array << tt.start_date.to_s + array << tt.end_date.to_s + array << tt_day_types(tt) + array << tt_day_types(tt) + array << tt_periods(tt) + array << tt_peculiar_days(tt) + array << tt_excluded_days(tt) + end + end + + def time_tables_to_csv (options = {}) + tts = Chouette::TimeTable.all + CSV.generate(options) do |csv| + csv << label("tt_columns").split(";") + tts.each do |tt| + csv << tt_data(tt) + end + end + end + + def to_zip(temp_file,options = {}) + ::Zip::OutputStream.open(temp_file) { |zos| } + ::Zip::File.open(temp_file.path, ::Zip::File::CREATE) do |zipfile| + zipfile.get_output_stream(label("vj_filename")+route.id.to_s+".csv") { |f| f.puts to_csv(options) } + zipfile.get_output_stream(label("tt_filename")+".csv") { |f| f.puts time_tables_to_csv(options) } + end + end + end diff --git a/app/models/vehicle_journey_import.rb b/app/models/vehicle_journey_import.rb index 15569c3d4..42cc24244 100644 --- a/app/models/vehicle_journey_import.rb +++ b/app/models/vehicle_journey_import.rb @@ -6,12 +6,19 @@ class VehicleJourneyImport extend ActiveModel::Naming attr_accessor :file, :route + attr_accessor :created_vehicle_journey_count,:updated_vehicle_journey_count,:deleted_vehicle_journey_count + attr_accessor :created_journey_pattern_count,:error_count validates_presence_of :file validates_presence_of :route def initialize(attributes = {}) attributes.each { |name, value| send("#{name}=", value) } if attributes + self.created_vehicle_journey_count = 0 + self.updated_vehicle_journey_count = 0 + self.created_journey_pattern_count = 0 + self.deleted_vehicle_journey_count = 0 + self.error_count = 0 end def persisted? @@ -27,14 +34,15 @@ class VehicleJourneyImport else imported_vehicle_journeys.each_with_index do |imported_vehicle_journey, index| imported_vehicle_journey.errors.full_messages.each do |message| - errors.add :base, I18n.t("vehicle_journey_imports.errors.invalid_vehicle_journey", :column => index, :message => message) + errors.add :base, I18n.t("vehicle_journey_imports.errors.invalid_vehicle_journey", :column => index+1, :message => message) end end - false + raise end end rescue Exception => exception Rails.logger.error(exception.message) + Rails.logger.error(exception.backtrace) errors.add :base, I18n.t("vehicle_journey_imports.errors.exception") false end @@ -45,21 +53,58 @@ class VehicleJourneyImport end # Find journey pattern on stop points used in vehicle journey at stops - def find_journey_pattern_schedule(hours_by_stop_point_ids) + # if no stop_point used found, return nil to delete vehicle_journey if exists + # if only 1 stop_point used found, raise exception to stop import + def find_journey_pattern_schedule(column,hours_by_stop_point_ids) stop_points_used = hours_by_stop_point_ids.reject{ |key,value| value == nil }.keys + return nil if stop_points_used.empty? + + if stop_points_used.length == 1 + errors.add :base, I18n.t("vehicle_journey_imports.errors.one_stop_point_used", :column => column) + raise + end + journey_pattern_founded = route.journey_patterns.select{ |jp| jp.stop_points.collect(&:id) == stop_points_used }.first # If no journey pattern founded, create a new one - journey_pattern_founded ? journey_pattern_founded : route.journey_patterns.create(:stop_points => Chouette::StopPoint.find(stop_points_used) ) + self.created_journey_pattern_count += 1 if journey_pattern_founded.nil? + journey_pattern_founded ? journey_pattern_founded : route.journey_patterns.create(:stop_points => Chouette::StopPoint.find(stop_points_used) ) + end + + def as_integer(v) + v.blank? ? nil : v.to_i + end + + def as_boolean(v) + v.blank? ? nil : (v[1..1].downcase != "n") + end + + def update_time_tables(vj,tm_ids) + vj.time_tables.clear + return unless tm_ids.present? + ids = tm_ids.split(",").map(&:to_i) + vj.time_tables << Chouette::TimeTable.find(ids) end def load_imported_vehicle_journeys + spreadsheet = open_spreadsheet(file) - vehicle_journeys = [] + vehicle_journeys = [] first_column = spreadsheet.column(1) - stop_point_ids = first_column[1..spreadsheet.last_row].map(&:to_i) + + # fixed rows (first = 1) + number_row = 2 + vehicle_type_identifier_row = 3 + mobility_row = 4 + flexible_service_row = 5 + time_tables_row = 6 + + # rows in column (first = 0) + first_stop_row_index = 7 + + stop_point_ids = first_column[first_stop_row_index..spreadsheet.last_row].map(&:to_i) same_stop_points = route.stop_points.collect(&:id) == stop_point_ids unless same_stop_points @@ -68,22 +113,55 @@ class VehicleJourneyImport end (3..spreadsheet.last_column).each do |i| - vehicle_journey_at_stops = [] - vehicle_journey_objectid = spreadsheet.column(i)[0] - hours_by_stop_point_ids = Hash[[stop_point_ids, spreadsheet.column(i)[1..spreadsheet.last_row]].transpose] + vehicle_journey_id = spreadsheet.column(i)[0] + hours_by_stop_point_ids = Hash[[stop_point_ids, spreadsheet.column(i)[first_stop_row_index..spreadsheet.last_row]].transpose] + + journey_pattern = find_journey_pattern_schedule(i,hours_by_stop_point_ids) + + vehicle_journey = route.vehicle_journeys.where(:id => vehicle_journey_id, :route_id => route.id).first_or_initialize + + if journey_pattern.nil? + if vehicle_journey.id.present? + self.deleted_vehicle_journey_count += 1 + vehicle_journey.delete + end + next + end + if vehicle_journey.id.present? + self.updated_vehicle_journey_count += 1 + else + self.created_vehicle_journey_count += 1 + end + + # number + vehicle_journey.number = as_integer(spreadsheet.row(number_row)[i-1]) + + # vehicle_type_identifier + vehicle_journey.vehicle_type_identifier = spreadsheet.row(vehicle_type_identifier_row)[i-1] + + # flexible_service + vehicle_journey.flexible_service = as_boolean(spreadsheet.row(flexible_service_row)[i-1]) + + # mobility + vehicle_journey.mobility_restricted_suitability = as_boolean(spreadsheet.row(mobility_row)[i-1]) + + # time_tables + update_time_tables(vehicle_journey,spreadsheet.row(time_tables_row)[i-1]) - journey_pattern = find_journey_pattern_schedule(hours_by_stop_point_ids) - vehicle_journey = journey_pattern.vehicle_journeys.where(:objectid => vehicle_journey_objectid, :route_id => route.id, :journey_pattern_id => journey_pattern.id).first_or_initialize + # journey_pattern + vehicle_journey.journey_pattern = journey_pattern + vehicle_journey.vehicle_journey_at_stops.clear line = 0 hours_by_stop_point_ids.each_pair do |key, value| line += 1 if value.present? # Create a vehicle journey at stop when time is present begin - main_time = Time.parse(value) + # force UTC to ignore timezone effects + main_time = Time.parse(value+" UTC") if main_time.present? - vjas = { :stop_point_id => key, :vehicle_journey_id => vehicle_journey.id, :departure_time => main_time, :arrival_time => main_time } - vehicle_journey_at_stops << vjas + vjas = Chouette::VehicleJourneyAtStop.new(:stop_point_id => key, :vehicle_journey_id => vehicle_journey.id, :departure_time => main_time, :arrival_time => main_time ) + vehicle_journey.vehicle_journey_at_stops << vjas end rescue Exception => exception errors.add :base, I18n.t("vehicle_journey_imports.errors.invalid_vehicle_journey_at_stop", :column => i, :line => line, :time => value) @@ -91,7 +169,6 @@ class VehicleJourneyImport end end end - vehicle_journey.vehicle_journey_at_stops_attributes = vehicle_journey_at_stops vehicle_journeys << vehicle_journey end @@ -100,7 +177,7 @@ class VehicleJourneyImport def open_spreadsheet(file) case File.extname(file.original_filename) - when '.csv' then Roo::CSV.new(file.path) + when '.csv' then Roo::CSV.new(file.path, csv_options: {col_sep: ";"}) when '.xls' then Roo::Excel.new(file.path) when '.xlsx' then Roo::Excelx.new(file.path) else diff --git a/app/views/exports/new.html.erb b/app/views/exports/new.html.erb index 553ebe4a2..8405e2c4d 100644 --- a/app/views/exports/new.html.erb +++ b/app/views/exports/new.html.erb @@ -2,7 +2,7 @@ <%= semantic_form_for([@referential, @export], :as => :export, :url => new_referential_export_path(@referential), :method => :get) do |form| %> <%= form.inputs do %> - <%= form.input :type, :as => :radio, :collection => Export.types.map { |format| [ Export.format_name(format), format]}, :required => true, :include_blank => false %> + <%= form.input :type, :as => :radio, :collection => Export.types.map { |format| [ Export.format_label(format), format]}, :required => true, :include_blank => false %> <% end %> <% end %> @@ -14,9 +14,10 @@ <%= form.inputs do %> <%= form.input :type, :as => :hidden %> - <%= form.input :references_type, :as => :select, :collection => Export.references_types.map { |c| [ c.model_name.human.capitalize.pluralize, c.name ] }, :include_blank => t(".all") %> + <p class="warning"><%= t('.'+export_partial_name(form)+'.warning',:default => "")%></p> + <%= form.input :references_type, :as => :select, :collection => export.references_types.map { |c| [ c.model_name.human.capitalize.pluralize, c.name ] }, :include_blank => t(".all") %> - <% Export.references_types.each do |type| %> + <% export.references_types.each do |type| %> <%= type_ids_model_references_input(form, @export, Export, type).input %> <% end %> <% end %> diff --git a/app/views/exports/new.js.coffee b/app/views/exports/new.js.coffee index 0886f53c9..aafa70bed 100644 --- a/app/views/exports/new.js.coffee +++ b/app/views/exports/new.js.coffee @@ -1,4 +1,4 @@ jQuery -> - <% Export.references_types.map { |type| type_ids_model_references_type( Export, type)}.each do |rt| %> + <% Export.all_references_types.map { |type| type_ids_model_references_type( Export, type)}.each do |rt| %> $("textarea.<%= rt.input_class %>").tokenInput('<%= references_referential_compliance_check_tasks_path(@referential, :type => rt.relation_name, :format => :json) %>', { prePopulate: $('#').data('pre'), minChars: 1, hintText: '<%= t('search_hint') %>', noResultsText: '<%= t('no_result_text') %>', searchingText: '<%= t('searching_term') %>'}); <% end %> diff --git a/app/views/help/exports.textile b/app/views/help/exports.textile index c82f8cea2..03ae1f1d0 100644 --- a/app/views/help/exports.textile +++ b/app/views/help/exports.textile @@ -39,6 +39,9 @@ la sélection propose dès le premier caractère saisi la liste des objets dont - Fuseau horaire := fixe le fuseau horaire (paramètre obligatoire des données GTFS) la valeur proposée par défaut est celle de l'espace de données =: +- Données incluses (complément) := +le choix des arrêts permet de n'exporter que les fichiers d'arrêts (stops.txt) et de correspondances (transfers.txt) + 3 champs sont alors ajoutés : l'adresse, la localité et le code postal; ceux-ci seront exploités en retour sur l'import GTFS d'arrêts =: * *NeTex* : pas d'option particulière @@ -49,15 +52,15 @@ fixe le fuseau horaire (paramètre obligatoire des données GTFS) - Début de période := permet d'exporter uniquement les courses circulant à partir de cette date - Fin de période := permet d'exporter uniquement les courses circulant jusqu'à cette date - Fuseau horaire := -fixe le fuseau horaire (paramètre obligatoire des données GTFS) +fixe le fuseau horaire la valeur proposée par défaut est celle de l'espace de données =: - h3. Consultation des résultats p. L'export est lancé en différé; son état d'avancement est affiché sous la forme d'une icône donc la couleur dépend de l'état: +* blanc : en attente * bleu : en cours * vert : terminé correctement; un lien de téléchargement est alors disponible * rouge : terminé en échec diff --git a/app/views/help/imports.textile b/app/views/help/imports.textile index 88b780b7f..66966b515 100644 --- a/app/views/help/imports.textile +++ b/app/views/help/imports.textile @@ -41,6 +41,8 @@ format originaire de ["Google Transit":https://support.google.com/transitpartner p(olnext). - les données exportées en GTFS sont explicités ["ICI":http://www.normes-donnees-tc.org/format-dechange/autres-normes/] +p(olnext). - l'import limité au sous ensemble des arrêts permet de n'importer que les arrêts et les correspondances + h3(#com). Paramètres communs - Pas de sauvegarde := permet d'effectuer une simulation de l'import sans enregistrer les données @@ -79,6 +81,9 @@ distance maximale entre deux arrêts pour les lier par une correspondance, ces correspondances sont hors zone d'arrêt; elles viennent en supplément de celles définies dans GTFS (ce mécanisme tient compte des correspondances exclues), une distance de 0 ne génère aucune correspondance =: +- Sous-ensemble := +choix permetant de limiter l'import aux seuls fichiers stops.txt et transfers.txt +lors de l'import, les attributs d'adresse, localité et code postal ajoutés à l'export associé sont exploités =: * *CSV* : @@ -90,7 +95,7 @@ h3(#imp). l'onglet IMPORTS p. L'onglet IMPORTS contient les objets Import de l'espace de données courant. -p. Chaque objet Import est représenté par une vignette comprenant : sa date, l'utilisateur qui l'a créé, son état (bleu : en cours ; vert : terminé correctement ; rouge : terminé en échec), un lien pour télécharger le fichier importé, un lien vers le détail de l'objet, un lien vers l'objet Validation associé). +p. Chaque objet Import est représenté par une vignette comprenant : sa date, l'utilisateur qui l'a créé, son état (blanc: en attente, bleu : en cours ; vert : terminé correctement ; rouge : terminé en échec), un lien pour télécharger le fichier importé, un lien vers le détail de l'objet, un lien vers l'objet Validation associé). p=. !import.png! diff --git a/app/views/import_tasks/_fields_gtfs_import.erb b/app/views/import_tasks/_fields_gtfs_import.erb index 70ffb207a..8b9dabcc5 100644 --- a/app/views/import_tasks/_fields_gtfs_import.erb +++ b/app/views/import_tasks/_fields_gtfs_import.erb @@ -1,7 +1,7 @@ <%= form.input :object_id_prefix, :input_html => { :value => @referential.prefix } %> -<%= form.input :max_distance_for_commercial , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.max_distance_for_commercial"), :value => 50 } %> +<%= form.input :max_distance_for_commercial , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.max_distance_for_commercial"), :value => 0 } %> <%= form.input :ignore_last_word , :as => :boolean , :input_html => { :title => t("formtastic.titles.import_task.ignore_last_word"), :value => false }%> <%= form.input :ignore_end_chars , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.ignore_end_chars"), :value => 0 }%> -<%= form.input :max_distance_for_connection_link , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.max_distance_for_connection_link"), :value => 100 }%> +<%= form.input :max_distance_for_connection_link , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.max_distance_for_connection_link"), :value => 0 }%> diff --git a/app/views/import_tasks/new.html.erb b/app/views/import_tasks/new.html.erb index 13888ad39..65daee0ca 100644 --- a/app/views/import_tasks/new.html.erb +++ b/app/views/import_tasks/new.html.erb @@ -2,7 +2,7 @@ <%= semantic_form_for([@referential, @import_task], :as => :import_task, :url => new_referential_import_task_path(@referential), :method => :get) do |form| %> <%= form.inputs do %> - <%= form.input :format, :as => :radio, :collection => ImportTask.formats, :required => true, :include_blank => false %> + <%= form.input :format, :as => :radio, :collection => ImportTask.formats.map { |format| [ ImportTask.format_label(format), format]}, :required => true, :include_blank => false %> <% end %> <% end %> @@ -19,6 +19,12 @@ <%= form.input :rule_parameter_set_id, :as => :select, :collection => @referential.rule_parameter_sets.map { |rps| [ rps.name, rps.id ] }, :include_blank => true %> <%= form.input :resources, :as => :file %> + + <% unless import_task.references_types.empty? %> + <p class="warning"><%= t('.'+import_partial_name(form)+'.warning')%></p> + <%= form.input :references_type, :as => :select, :collection => import_task.references_types.map { |c| [ c.model_name.human.capitalize.pluralize, c.name ] }, :include_blank => t(".all") %> + <% end %> + <% end %> <%= form.actions do %> diff --git a/app/views/referentials/index.html.erb b/app/views/referentials/index.html.erb index 220fc17ba..cf4eaa245 100644 --- a/app/views/referentials/index.html.erb +++ b/app/views/referentials/index.html.erb @@ -1,4 +1,4 @@ -<%= title_tag Referential.model_name.human.pluralize %> +<%= title_tag Referential.model_name.human(:count => 2) %> <div class="referentials paginated_content"> <%= paginated_content @referentials %> diff --git a/app/views/routes/show.html.erb b/app/views/routes/show.html.erb index 5621f7a36..b935a6f34 100644 --- a/app/views/routes/show.html.erb +++ b/app/views/routes/show.html.erb @@ -97,6 +97,7 @@ <li><%= link_to t('journey_patterns.actions.new'), new_referential_line_route_journey_pattern_path(@referential, @line, @route), :class => "add" %></li> <% end %> <li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li> + <li><%= link_to image_tag("icons/file_csv.png") + t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "with_fa" %></li> <% if @route.journey_patterns.size > 0 %> <li> <i class="fa fa-clock-o fa-fw"></i><%= link_to t('vehicle_journeys.actions.index'), [@referential, @line, @route, :vehicle_journeys], :class => "with_fa" %> diff --git a/app/views/rule_parameter_sets/show.html.erb b/app/views/rule_parameter_sets/show.html.erb index f2427e36e..f4ca5e912 100644 --- a/app/views/rule_parameter_sets/show.html.erb +++ b/app/views/rule_parameter_sets/show.html.erb @@ -97,13 +97,12 @@ <% content_for :sidebar do %> <ul class="actions"> + <li><%= link_to t('rule_parameter_sets.actions.new'), new_referential_rule_parameter_set_path(@referential), :class => "add" %></li> <% if @rule_parameter_set.persisted? %> - <li><%= link_to t('rule_parameter_sets.actions.index'), referential_rule_parameter_sets_path(@referential), :class => "link" %></li> <li><%= link_to t('rule_parameter_sets.actions.edit'), edit_referential_rule_parameter_set_path(@referential, @rule_parameter_set), :class => "edit" %></li> <% if @referential.rule_parameter_sets.size > 1 %> <li><%= link_to t('rule_parameter_sets.actions.destroy'), referential_rule_parameter_set_path(@referential, @rule_parameter_set), :method => :delete, :data => {:confirm => t('rule_parameter_sets.actions.destroy_confirm')}, :class => "remove" %></li> <% end %> - <li><%= link_to t('rule_parameter_sets.actions.new'), new_referential_rule_parameter_set_path(@referential), :class => "add" %></li> <% end %> </ul> <% end %> diff --git a/app/views/stop_area_exports/index.xls.erb b/app/views/stop_area_exports/index.xls.erb deleted file mode 100644 index e48a97fe0..000000000 --- a/app/views/stop_area_exports/index.xls.erb +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0"?> -<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" - xmlns:o="urn:schemas-microsoft-com:office:office" - xmlns:x="urn:schemas-microsoft-com:office:excel" - xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" - xmlns:html="http://www.w3.org/TR/REC-html40"> - <Worksheet ss:Name="Sheet1"> - <Table> - <Row> - <% @column_names.each do |column_name|%> - <Cell><Data ss:Type="String"><%= column_name %></Data></Cell> - <% end %> - </Row> - <% @stop_areas.each do |stop_area| %> - <Row> - <Cell><Data ss:Type="Number"><%= stop_area.id %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.name %></Data></Cell> - <Cell><Data ss:Type="Number"><%= stop_area.longitude %></Data></Cell> - <Cell><Data ss:Type="Number"><%= stop_area.latitude %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.area_type %></Data></Cell> - <Cell><Data ss:Type="Number"><%= stop_area.parent_id %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.comment %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.country_code %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.street_name %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.mobility_restricted_suitability %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.stairs_availability %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.lift_availability %></Data></Cell> - <Cell><Data ss:Type="String"><%= stop_area.int_user_needs %></Data></Cell> - </Row> - <% end %> - </Table> - </Worksheet> -</Workbook> diff --git a/app/views/stop_area_imports/new.html.erb b/app/views/stop_area_imports/new.html.erb deleted file mode 100644 index d94f1c08b..000000000 --- a/app/views/stop_area_imports/new.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<%= title_tag t('stop_area_imports.new.title') %> - -<%= semantic_form_for [@referential, @stop_area_import] do |form| %> - <br> - <%= form.inputs do %> - <%= form.input :file, :as => :file, :input_html => { :title => "#{t('.tooltip.file')}", :'data-placement' => "right", :'data-toggle' => "tooltip", :'data-trigger' =>"hover" } %> - <% end %> - <%= form.actions do %> - <%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %> - <%= form.action :cancel, :as => :link %> - <% end %> -<% end %> diff --git a/app/views/stop_areas/_form.html.erb b/app/views/stop_areas/_form.html.erb index 4a1ba1c97..5a612614b 100644 --- a/app/views/stop_areas/_form.html.erb +++ b/app/views/stop_areas/_form.html.erb @@ -1,54 +1,52 @@ <%= semantic_form_for [@referential, @stop_area] do |form| %> <div class="row"> - <div class="col-md-6"> + <div class="col-md-6"> <%= form.inputs do %> <%= form.input :id, :as => :hidden %> <%= form.input :name %> <%= form.input :stop_area_type, :as => :select, :input_html => { :disabled => !@stop_area.new_record? }, :collection => Chouette::StopArea.stop_area_types, :include_blank => false, :member_label => Proc.new { |stop_area_type| t("area_types.label.#{stop_area_type}") } %> <div class="location_info"> <h3><%= t("stop_areas.stop_area.localisation") %></h3> - <% if @stop_area.new_record? %> <div id="prefetch"> <label><%= t('.geolocalize') %></label> - <input class="typeahead form-control input-lg" maxlength="255" type="text" placeholder="<%= t('.address') %>" /> + <input class="typeahead form-control input-lg" maxlength="255" type="text" placeholder="<%= t('.address') %>" /> </div> - <% end %> <% unless @referential.projection_type_label.empty? %> - <%= form.input :projection_xy, :label => t("projection_xy", :projection => @referential.projection_type_label), :input_html => { :title => t("formtastic.titles.stop_area.projection_xy")} %> + <%= form.input :projection_xy, :label => t("projection_xy", :projection => @referential.projection_type_label), :input_html => { :title => t("formtastic.titles.stop_area.projection_xy")} %> <% end %> <%= form.input :coordinates, :input_html => { :title => t("formtastic.titles.stop_area.coordinates")} %> - <%= form.input :street_name %> - <%= form.input :country_code %> - <%= form.input :zip_code %> + <%= form.input :street_name %> + <%= form.input :country_code %> + <%= form.input :zip_code %> <%= form.input :city_name %> - <% end %> + <% end %> </div> <div class="col-md-6"> <% if !manage_itl && @map %> - <%= @map.to_html %> + <%= @map.to_html %> <% end %> </div> </div> <div class="stop_areas.stop_area.general_info"> - <h3><%= t("stop_area.general") %></h3> + <h3><%= t("stop_area.general") %></h3> <%= form.inputs do %> - <%= form.input :objectid, :required => !@stop_area.new_record?, :input_html => { :title => t("formtastic.titles.stop_area.objectid")} %> - <%= form.input :registration_number, :input_html => { :title => t("formtastic.titles.stop_area.registration_number")} %> - <%= form.input :fare_code, :as => :number %> - <%= form.input :nearest_topic_name %> + <%= form.input :objectid, :required => !@stop_area.new_record?, :input_html => { :title => t("formtastic.titles.stop_area.objectid")} %> + <%= form.input :registration_number, :input_html => { :title => t("formtastic.titles.stop_area.registration_number")} %> + <%= form.input :fare_code, :as => :number %> + <%= form.input :nearest_topic_name %> <%= form.input :comment, :as => :text, :input_html => { :rows => 5 } %> <% end %> - </div> + </div> <div class="pmr_info"> - <h3><%= t("stop_areas.stop_area.accessibility") %></h3> + <h3><%= t("stop_areas.stop_area.accessibility") %></h3> <%= form.inputs do %> <% if !manage_itl %> <%= form.input :mobility_restricted_suitability,:as => :boolean %> <%= form.input :stairs_availability,:as => :boolean %> - <%= form.input :lift_availability,:as => :boolean %> - <% end %> + <%= form.input :lift_availability,:as => :boolean %> + <% end %> <% end %> - </div> + </div> <%= form.actions do %> <%= form.action :submit, :as => :button %> @@ -57,77 +55,92 @@ <% end %> <script> - var address_display = function( address ) { - var name = ""; - if ( address.house_number) { - name += address.house_number+" "; - } - name += address.road+", "; - if ( address.postalcode) { - name += address.postalcode+" "; - } - if ( address.city) { - name += address.city; - } else if ( address.county ) { - name += address.county; - } else if ( address.country ) { - name += address.country; - } + $(document).ready(function() { + var address_display = function( address ) { + var name = ""; + if ( address.house_number) { + name += address.house_number+" "; + } + name += address.road+", "; + if ( address.suburb) { + name += address.suburb+", "; + } + if ( address.postcode) { + name += address.postcode+" "; + } + if ( address.city) { + name += address.city; + } else if ( address.county ) { + name += address.county; + } else if ( address.country ) { + name += address.country; + } - return name; - }; - var filtering = function(list) { - var selection = $.grep( list, function(item) { - return (item.type == "house" || item.type == "residential") && item.address.road ; - }); - return $.map( selection, function( d) { - return { postcode: d.address.postcode, - road: d.address.road, - lon: d.lon, lat: d.lat, - city: d.address.city, - postcode: d.address.postcode, - the_key: address_display( d.address)}; - }); - }; + return name; + }; + var filtering = function(list) { + // update map view + removeAddress(); - var addressesEngine = new Bloodhound({ - datumTokenizer: function(d) { - return Bloodhound.tokenizers.whitespace(d.id+" : "+d.road); - }, - queryTokenizer: function(d) { - return Bloodhound.tokenizers.whitespace(d.id+" :: "+d.road); - }, - limit: 10, - remote: { - url: 'http://nominatim.openstreetmap.org/search?q=%QUERY&format=json&addressdetails=1', - filter: filtering, - } - }); + var selection = $.grep( list, function(item) { + return (item.type == "house" || item.type == "residential" || + item.type == "tertiary" || item.type == "primary" || + item.type == "secondary") && item.address.road ; + }); + return $.map( selection, function( d) { + return { postcode: d.address.postcode, + road: d.address.road, + lon: d.lon, lat: d.lat, + suburb: d.address.suburb, + city: d.address.city, + postcode: d.address.postcode, + the_key: address_display( d.address)}; + }); + }; + + var addressesEngine = new Bloodhound({ + datumTokenizer: function(d) { + return Bloodhound.tokenizers.whitespace(d.id+" : "+d.road); + }, + queryTokenizer: function(d) { + return Bloodhound.tokenizers.whitespace(d.id+" :: "+d.road); + }, + limit: 10, + remote: { + url: 'http://nominatim.openstreetmap.org/search?q=%QUERY&format=json&addressdetails=1&bounded=1&viewbox='+ + '<%= @referential.viewbox_left_top_right_bottom %>', + filter: filtering, + } + }); - // kicks off the loading/processing of `local` and `prefetch` - var promise = addressesEngine.initialize(); + // kicks off the loading/processing of `local` and `prefetch` + var promise = addressesEngine.initialize(); - // passing in `null` for the `options` arguments will result in the default - // options being used - $('#prefetch .typeahead').typeahead( - { - hint: true, - highlight: true, - minLength: 1 - }, - { - name: 'addresses', - displayKey: 'the_key', - source: addressesEngine.ttAdapter(), - } - ); + // passing in `null` for the `options` arguments will result in the default + // options being used + $('#prefetch .typeahead').typeahead( + { + hint: true, + highlight: true, + minLength: 1 + }, + { + name: 'addresses', + displayKey: 'the_key', + source: addressesEngine.ttAdapter(), + } + ); - $('.typeahead').on('typeahead:selected', function($e, datum) { - $('input[name="stop_area[coordinates]"]').val(datum.lat+","+datum.lon); - $('input[name="stop_area[coordinates]"]').change(); - $('input[name="stop_area[street_name]"]').val(datum.road); - $('input[name="stop_area[zip_code]"]').val(datum.postcode); - $('input[name="stop_area[city_name]"]').val(datum.city); - }) + $('.typeahead').on('typeahead:selected', function($e, datum) { + // update map view + addAddress( datum.lon, datum.lat, datum.road); + // update form fields + <% if @stop_area.new_record? %> + $('input[name="stop_area[street_name]"]').val(datum.road); + $('input[name="stop_area[zip_code]"]').val(datum.postcode); + $('input[name="stop_area[city_name]"]').val(datum.city); + <% end %> + }) + }); </script> diff --git a/app/views/stop_areas/index.html.erb b/app/views/stop_areas/index.html.erb index 3398b8ab7..915e4523a 100644 --- a/app/views/stop_areas/index.html.erb +++ b/app/views/stop_areas/index.html.erb @@ -33,18 +33,6 @@ <ul class="actions"> <li><%= link_to t('stop_areas.actions.new'), new_referential_stop_area_path(@referential), :class => "add" %></li> <li><%= link_to t('stop_areas.actions.default_geometry'), default_geometry_referential_stop_areas_path(@referential), :method => :put, :class => "calculator_edit" %></li> - <li> - <%= link_to t('stop_area_imports.new.title'), new_referential_stop_area_import_path( @referential ), :class => "import" %> - </li> </ul> - <div class="btn-group"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <%= t('stop_area_imports.new.export_stop_areas') %><span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - <li><%= link_to image_tag("icons/file_csv.png") + " Csv" , referential_stop_area_exports_path(@referential, :format => :csv) %></li> - <li><%= link_to image_tag("icons/file_excel.png") + " Excel", referential_stop_area_exports_path(@referential, :format => :xls) %></li> - </ul> - </div> <% end %> diff --git a/app/views/vehicle_journeys/index.html.erb b/app/views/vehicle_journeys/index.html.erb index 74cd73d29..212c06bbf 100644 --- a/app/views/vehicle_journeys/index.html.erb +++ b/app/views/vehicle_journeys/index.html.erb @@ -56,16 +56,19 @@ <li><%= link_to t('vehicle_journeys.actions.new'), new_referential_line_route_vehicle_journey_path(@referential, @line, @route), :class => "add" %></li> <li><%= link_to t('.timeless'), timeless_referential_line_route_vehicle_journeys_path(@referential, @line, @route), :class => "link" %></li> <li><%= link_to t('vehicle_journey_imports.new.title'), new_referential_line_route_vehicle_journey_import_path( @referential, @line, @route ), :class => "import" %></li> + <li><%= link_to image_tag("icons/file_csv.png") + t('vehicle_journey_exports.new.title'), referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :zip), :class => "with_fa" %></li> </ul> + <!-- <div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <%= t('vehicle_journey_imports.new.export_vehicle_journeys') %><span class="caret"></span> + <%= t('vehicle_journey_exports.new.title') %><span class="caret"></span> </button> <ul class="dropdown-menu" role="menu"> <li><%= link_to image_tag("icons/file_csv.png") + " Csv" , referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :csv) %></li> <li><%= link_to image_tag("icons/file_excel.png") + " Excel", referential_line_route_vehicle_journey_exports_path(@referential, @line, @route, :format => :xls) %></li> </ul> </div> + --> <h4><%= t(".selection") %></h4> <h5><%= Chouette::JourneyPattern.model_name.human.pluralize %></h5> diff --git a/app/views/vehicle_journeys/show.html.erb b/app/views/vehicle_journeys/show.html.erb index 1bd1c5ca7..c7ab1e073 100644 --- a/app/views/vehicle_journeys/show.html.erb +++ b/app/views/vehicle_journeys/show.html.erb @@ -115,4 +115,5 @@ <li><font color="#D98F3B"><i class="fa fa-cubes fa-fw"></i></font><%= link_to t('.translation_form'), new_referential_line_route_vehicle_journey_vehicle_translation_path(@referential, @line, @route, @vehicle_journey), {:remote => true, 'data-toggle' => "modal", 'data-target' => '#modal_translation', :class => "with_fa" } %></li> <% end %> </ul> + <%= creation_tag(@vehicle_journey) %> <% end %> |
