1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
module Chouette
class Line < Chouette::ActiveRecord
has_metadata
include LineRestrictions
include LineReferentialSupport
include ObjectidSupport
include StifTransportModeEnumerations
include StifTransportSubmodeEnumerations
belongs_to :company
belongs_to :network
belongs_to :line_referential
has_array_of :secondary_companies, class_name: 'Chouette::Company'
has_many :routes, :dependent => :destroy
has_many :journey_patterns, :through => :routes
has_many :vehicle_journeys, :through => :journey_patterns
has_many :routing_constraint_zones, through: :routes
has_many :time_tables, -> { distinct }, :through => :vehicle_journeys
has_and_belongs_to_many :group_of_lines, :class_name => 'Chouette::GroupOfLine', :order => 'group_of_lines.name'
has_many :footnotes, :inverse_of => :line, :validate => :true, :dependent => :destroy
accepts_nested_attributes_for :footnotes, :reject_if => :all_blank, :allow_destroy => true
attr_reader :group_of_line_tokens
# validates_presence_of :network
# validates_presence_of :company
# validates_format_of :registration_number, :with => %r{\A[\d\w_\-]+\Z}, :allow_nil => true, :allow_blank => true
validates_format_of :stable_id, :with => %r{\A[\d\w_\-]+\Z}, :allow_nil => true, :allow_blank => true
validates_format_of :url, :with => %r{\Ahttps?:\/\/([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?\Z}, :allow_nil => true, :allow_blank => true
validates_format_of :color, :with => %r{\A[0-9a-fA-F]{6}\Z}, :allow_nil => true, :allow_blank => true
validates_format_of :text_color, :with => %r{\A[0-9a-fA-F]{6}\Z}, :allow_nil => true, :allow_blank => true
validates_presence_of :name
scope :by_text, ->(text) { where('lower(name) LIKE :t or lower(published_name) LIKE :t or lower(objectid) LIKE :t or lower(comment) LIKE :t or lower(number) LIKE :t',
t: "%#{text.downcase}%") }
scope :by_name, ->(name) {
joins('LEFT OUTER JOIN public.companies ON companies.id = lines.company_id')
.where('
lines.number LIKE :q
OR lines.name LIKE :q
OR companies.name ILIKE :q',
q: "%#{sanitize_sql_like(name)}%"
)
}
scope :for_organisation, ->(organisation){
if objectids = organisation&.lines_scope
where(objectid: objectids)
else
all
end
}
def self.nullable_attributes
[:published_name, :number, :comment, :url, :color, :text_color, :stable_id]
end
def geometry_presenter
Chouette::Geometry::LinePresenter.new self
end
def commercial_stop_areas
Chouette::StopArea.joins(:children => [:stop_points => [:route => :line] ]).where(:lines => {:id => self.id}).uniq
end
def stop_areas
Chouette::StopArea.joins(:stop_points => [:route => :line]).where(:lines => {:id => self.id})
end
def stop_areas_last_parents
Chouette::StopArea.joins(:stop_points => [:route => :line]).where(:lines => {:id => self.id}).collect(&:root).flatten.uniq
end
def group_of_line_tokens=(ids)
self.group_of_line_ids = ids.split(",")
end
def vehicle_journey_frequencies?
self.vehicle_journeys.unscoped.where(journey_category: 1).count > 0
end
def display_name
[self.get_objectid.short_id, number, name, company.try(:name)].compact.join(' - ')
end
def companies
line_referential.companies.where(id: ([company_id] + Array(secondary_company_ids)).compact)
end
def deactivate
self.deactivated = true
end
def activate
self.deactivated = false
end
def deactivate!
update_attribute :deactivated, true
end
def activate!
update_attribute :deactivated, false
end
def activated?
!deactivated
end
def status
activated? ? :activated : :deactivated
end
end
end
|