gb_mapfish_appserver 0.8.7 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,11 @@ class ApplicationController < ActionController::Base
6
6
  before_filter :set_zone
7
7
  before_filter :set_locale
8
8
 
9
+ # This is our new function that comes before Devise's one
10
+ before_filter :authenticate_user_from_token!
11
+ # This is Devise's authentication
12
+ # before_filter :authenticate_user!
13
+
9
14
  protected
10
15
 
11
16
  #Zone 'intranet' or 'internet' depending on host name
@@ -70,4 +75,25 @@ class ApplicationController < ActionController::Base
70
75
  end
71
76
  end
72
77
 
78
+ # With a token setup, all you need to do is override
79
+ # your application controller to also consider token
80
+ # lookups:
81
+
82
+
83
+ # For this example, we are simply using token authentication
84
+ # via parameters. However, anyone could use Rails's token
85
+ # authentication features to get the token from a header.
86
+ def authenticate_user_from_token!
87
+ user_token = params[:USER_TOKEN].presence
88
+ user = user_token && User.find_by_authentication_token(user_token.to_s)
89
+
90
+ if user
91
+ # Notice we are passing store false, so the user is not
92
+ # actually stored in the session and a token is needed
93
+ # for every request. If you want the token to work as a
94
+ # sign in token, you can simply remove store: false.
95
+ sign_in user, :store => false
96
+ end
97
+ end
98
+
73
99
  end
@@ -4,6 +4,10 @@ class AppsController < ApplicationController
4
4
  @current_roles = current_roles.roles.collect(&:name)
5
5
 
6
6
  @topic_name = params['topic'] || DEFAULT_TOPIC[@zone].name
7
+
8
+ @back_topic_name = params['back'].nil? ? nil : params['back']
9
+ @over_topic_name = params['over'].blank? ? '[]' : params['over'].split(',').to_json
10
+
7
11
  @main_default_topic = DEFAULT_TOPIC[@zone].name
8
12
  @offlayers = params['offlayers'].blank? ? [] : params['offlayers'].split(',')
9
13
 
@@ -11,6 +15,9 @@ class AppsController < ApplicationController
11
15
  @x = params['x'].nil? ? DEFAULT_X : params['x'].to_f
12
16
  @y = params['y'].nil? ? DEFAULT_Y : params['y'].to_f
13
17
 
18
+ @zoom = params['zoom'].nil? ? DEFAULT_ZOOM : params['zoom'].to_i # for mobile
19
+ @gbapp = params['gbapp'].nil? ? 'default' : params['gbapp'] # for mobile
20
+
14
21
  @seltopic = params['seltopic']
15
22
  @sellayer = params['sellayer']
16
23
  @selproperty = params['selproperty']
@@ -78,6 +78,11 @@ class PrintController < ApplicationController
78
78
  layer["customParams"].delete("DPI")
79
79
  layer["customParams"]["map_resolution"] = request.parameters["dpi"]
80
80
  end
81
+
82
+ topic = Topic.find_by_name(topic_name)
83
+ add_sld_body(topic, layer)
84
+ add_filter(topic, layer)
85
+
81
86
  # For permission check in WMS controller: pass session as WMS request parameter
82
87
  #layer["customParams"]["session"] =
83
88
  else
@@ -199,6 +204,41 @@ class PrintController < ApplicationController
199
204
  end
200
205
  end
201
206
 
207
+ def add_sld_body(topic, layer)
208
+ # add SLD for selection
209
+ unless layer["customParams"]["SELECTION[LAYER]"].blank?
210
+ sld_body = Wms.sld_selection(topic,
211
+ layer["customParams"]["SELECTION[LAYER]"],
212
+ layer["customParams"]["SELECTION[PROPERTY]"],
213
+ layer["customParams"]["SELECTION[VALUES]"].split(',')
214
+ )
215
+
216
+ unless sld_body.nil?
217
+ # add serverside SLD for selection
218
+ layer["customParams"]["SLD_BODY"] = sld_body
219
+ else
220
+ logger.info "Selection layer '#{layer["customParams"]["SELECTION[LAYER]"]}' not found in topic '#{topic.name}'"
221
+ end
222
+
223
+ # remove non-WMS params
224
+ layer["customParams"].delete("SELECTION[LAYER]")
225
+ layer["customParams"].delete("SELECTION[PROPERTY]")
226
+ layer["customParams"].delete("SELECTION[VALUES]")
227
+ end
228
+ end
229
+
230
+ def add_filter(topic, layer)
231
+ filters = Wms.access_filters(current_ability, current_user, topic, layer["layers"])
232
+ if filters.any?
233
+ filters.each do |key, value|
234
+ # remove existing filter
235
+ layer["customParams"].delete(key)
236
+ # add serverside filter
237
+ layer["customParams"][key] = value
238
+ end
239
+ end
240
+ end
241
+
202
242
  protected
203
243
 
204
244
  def rewrite_wms_uri(url, use_cgi)
@@ -0,0 +1,20 @@
1
+ # token_authentications_controller.rb
2
+
3
+ class TokenAuthenticationsController < ApplicationController
4
+
5
+ def create
6
+ #@user = User.criteria.id(params[:user_id]).first
7
+ @user = User.find(params[:user_id])
8
+ @user.reset_authentication_token!
9
+ redirect_to edit_user_registration_path(@user)
10
+ end
11
+
12
+ def destroy
13
+ #@user = User.criteria.id(params[:id]).first
14
+ @user = User.find(params[:id])
15
+ @user.authentication_token = nil
16
+ @user.save
17
+ redirect_to edit_user_registration_path(@user)
18
+ end
19
+
20
+ end
@@ -0,0 +1,50 @@
1
+ class UsersController < ApplicationController
2
+
3
+ before_filter :authenticate_user!
4
+ before_filter :accessible_user, :except => [:find]
5
+
6
+ def edit
7
+ end
8
+
9
+ def update
10
+ unless params[:user][:app_infos].blank?
11
+ @user.merge_app_infos(params[:user][:app_infos])
12
+ params[:user].delete(:app_infos)
13
+ end
14
+ if @user.update_attributes(params[:user])
15
+ redirect_to groups_users_url, :notice => 'Benutzer wurde erfolgreich gespeichert.'
16
+ else
17
+ render :action => "edit"
18
+ end
19
+ end
20
+
21
+ # find users by email for autocomplete
22
+ def find
23
+ users = User.where("email ILIKE ?", "#{params[:term]}%").order(:email).pluck(:email)
24
+
25
+ render :json => users
26
+ end
27
+
28
+ private
29
+
30
+ # FIXME: use ability -> User.accessible_by(current_ability)
31
+ def accessible_user
32
+ @user = User.find(params[:id])
33
+
34
+ user_accessible = (@user.id == current_user.id) # can edit self
35
+ unless user_accessible
36
+ # check if user is in accessible group
37
+ groups = Group.accessible_by(current_ability)
38
+ @user.groups_users.each do |groups_user|
39
+ if groups.include?(groups_user.group)
40
+ user_accessible = true
41
+ break
42
+ end
43
+ end
44
+ end
45
+ unless user_accessible
46
+ raise CanCan::AccessDenied.new("Permission error")
47
+ end
48
+ end
49
+
50
+ end
@@ -4,7 +4,7 @@ require 'uri'
4
4
  class WfsController < ApplicationController
5
5
 
6
6
  def show
7
- logger.info "----> WMS call with user '#{current_user.try(:login)}'"
7
+ logger.info "----> WFS call with user '#{current_user.try(:login)}'"
8
8
 
9
9
  #Send redirect for public services
10
10
  #if public?(params[:service], host_zone(request.host))
@@ -14,16 +14,17 @@ class WfsController < ApplicationController
14
14
  # return
15
15
  #end
16
16
 
17
- topic = Topic.where(:name => params[:service]).first
18
- topic_accessible = topic && can?(:show, topic)
19
- wfs_accessible = can?(:show, Wfs.new(params[:service]))
20
- if !topic_accessible && !wfs_accessible
21
- logger.info "----> Topic/WFS '#{params[:service]}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
22
- log_user_permissions(:show, topic) if topic
23
- log_user_permissions(:show, Wfs.new(params[:service]))
17
+ topic_name = params[:service]
18
+ wfs_accessible = can?(:show, Wfs.new(topic_name))
19
+ unless wfs_accessible
20
+ logger.info "----> WFS '#{topic_name}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
21
+ log_user_permissions(:show, Wfs.new(topic_name))
24
22
  request_http_basic_authentication('Secure WFS Login')
25
23
  return
26
24
  end
25
+
26
+ add_filter(topic_name)
27
+
27
28
  call_wfs(request)
28
29
  end
29
30
 
@@ -76,7 +77,11 @@ class WfsController < ApplicationController
76
77
  render :nothing => true
77
78
  return
78
79
  end
79
- send_data response.body, :status => response.code, :type => response.content_type, :disposition => 'inline'
80
+ if (params[:format] == 'json')
81
+ send_data Hash.from_xml(response.body).to_json, :status => response.code, :type => {'Content-Type' => 'application/json'}, :disposition => 'inline'
82
+ else
83
+ send_data response.body, :status => response.code, :type => response.content_type, :disposition => 'inline'
84
+ end
80
85
  end
81
86
 
82
87
  #Public accessible WFS
@@ -90,5 +95,29 @@ class WfsController < ApplicationController
90
95
  end
91
96
  end
92
97
 
98
+ def add_filter(topic_name)
99
+ if !topic_name.blank? && params[:REQUEST] == "GetFeature" && !params[:TYPENAME].blank?
100
+ # get access filters for requested layers
101
+ access_filters = {}
102
+ params[:TYPENAME].split(',').each do |layer|
103
+ access_filter = current_ability.access_filter("WFS", topic_name, layer)
104
+ unless access_filter.nil?
105
+ access_filter.each do |key, value|
106
+ access_filter[key] = AccessFilter.user_value(current_user, value)
107
+ end
108
+ access_filters.merge!(access_filter)
109
+ end
110
+ end
111
+
112
+ if access_filters.any?
113
+ # remove existing filters
114
+ access_filters.each do |key, value|
115
+ request.env["QUERY_STRING"].gsub!(/(^|&)#{key}=.+?(?=(&|$))/, '')
116
+ end
117
+ # add serverside filters
118
+ request.env["QUERY_STRING"] += "&#{access_filters.to_query}"
119
+ end
120
+ end
121
+ end
93
122
 
94
123
  end
@@ -6,29 +6,32 @@ class WmsController < ApplicationController
6
6
  def show
7
7
  logger.debug "----> WMS call with user '#{current_user.try(:login)}'"
8
8
 
9
- topic = Topic.where(:name => params[:service]).first
9
+ topic_name = params[:service]
10
+ topic = Topic.where(:name => topic_name).first
10
11
  add_sld_body(topic)
12
+ add_filter(topic_name)
11
13
 
12
14
  #Send redirect for public services
13
- if request.get? && public?(params[:service], host_zone(request.host))
15
+ if request.get? && public?(topic_name, host_zone(request.host))
14
16
  url, path = mapserv_request_url(request)
15
- #expires_in 2.minutes, :public => true #FIXME: cache_path "wms-public-#{params[:service]}-#{host_zone(request.host)}"
17
+ #expires_in 2.minutes, :public => true #FIXME: cache_path "wms-public-#{topic_name}-#{host_zone(request.host)}"
16
18
  redirect_to "#{url.scheme}://#{url.host}#{path}"
17
19
  return
18
20
  end
19
21
 
20
22
  topic_accessible = topic && can?(:show, topic)
21
- wms_accessible = can?(:show, Wms.new(params[:service]))
23
+ wms_accessible = can?(:show, Wms.new(topic_name))
24
+
22
25
  if topic_accessible && !wms_accessible
23
26
  topic_accessible = session_ok?
24
27
  if !topic_accessible
25
- logger.info "----> WMS '#{params[:service]}' not accessible without valid session!"
28
+ logger.info "----> WMS '#{topic_name}' not accessible without valid session!"
26
29
  end
27
30
  end
28
31
  if !topic_accessible && !wms_accessible && !print_request? # allow all topics for print servlet
29
- logger.info "----> Topic/WMS '#{params[:service]}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
32
+ logger.info "----> Topic/WMS '#{topic_name}' not accessible with roles #{current_roles.roles.collect(&:name).join('+')}!"
30
33
  log_user_permissions(:show, topic) if topic
31
- log_user_permissions(:show, Wms.new(params[:service]))
34
+ log_user_permissions(:show, Wms.new(topic_name))
32
35
  request_http_basic_authentication('Secure WMS Login')
33
36
  return
34
37
  end
@@ -114,11 +117,11 @@ class WmsController < ApplicationController
114
117
  logger.info "Selection layer '#{params[:SELECTION][:LAYER]}' not found in topic '#{topic.name}'"
115
118
  return
116
119
  end
117
- # add serverside SLD for selection
118
- request.env["QUERY_STRING"] += "&SLD_BODY=" + URI.escape(
119
- sld_selection(layer, params[:SELECTION][:PROPERTY], params[:SELECTION][:VALUES].split(',')))
120
+ sld_body = sld_selection(layer, params[:SELECTION][:PROPERTY], params[:SELECTION][:VALUES].split(','))
120
121
  # Remove non-WMS params
121
- request.env["QUERY_STRING"].gsub!(/&SELECTION.+?(?=&)/, '')
122
+ request.env["QUERY_STRING"].gsub!(/(^|&)SELECTION.+?(?=(&|$))/, '')
123
+ # add serverside SLD for selection
124
+ request.env["QUERY_STRING"] += "&SLD_BODY=" + URI.escape(sld_body)
122
125
  params.delete[:SELECTION]
123
126
  end
124
127
  end
@@ -155,6 +158,36 @@ class WmsController < ApplicationController
155
158
  sld
156
159
  end
157
160
 
161
+ def add_filter(topic_name)
162
+ unless params[:LAYERS].blank?
163
+ filters = access_filters(topic_name, params[:LAYERS].split(','))
164
+ if filters.any?
165
+ # remove existing filters
166
+ filters.each do |key, value|
167
+ request.env["QUERY_STRING"].gsub!(/(^|&)#{key}=.+?(?=(&|$))/, '')
168
+ end
169
+ # add serverside filters
170
+ request.env["QUERY_STRING"] += "&#{filters.to_query}"
171
+ end
172
+ end
173
+ end
174
+
175
+ def access_filters(topic_name, layers)
176
+ access_filters = {}
177
+ unless topic_name.blank?
178
+ layers.each do |layer|
179
+ access_filter = current_ability.access_filter("WMS", topic_name, layer)
180
+ unless access_filter.nil?
181
+ access_filter.each do |key, value|
182
+ access_filter[key] = AccessFilter.user_value(current_user, value)
183
+ end
184
+ access_filters.merge!(access_filter)
185
+ end
186
+ end
187
+ end
188
+ access_filters
189
+ end
190
+
158
191
  #Public accessible WMS
159
192
  #REMARK: permission change needs restart!
160
193
  def public?(name, zone)
@@ -120,10 +120,12 @@ class Ability
120
120
  def layer_topics_lookup
121
121
  #Build a lookup hash for all layer -> topic relations
122
122
  @layer_topics ||= begin
123
- layer_topics = resources.all.inject({}) {|hsh,l| hsh[l.id] = []; hsh }
124
- # layer_topics = resources.inject({}) {|hsh,l| hsh[l.id] = []; hsh }
125
- all_topics = Topic.select("topics.id,topics.name,layers.id,layers.name").includes(:layers)
126
- all_topics.each {|t| t.layers.each {|l| layer_topics[l.id] << t.name} }
123
+ layer_topics = resources.all.inject({}) {|hsh,l| hsh[l.id] = []; hsh }
124
+
125
+ # NOTE: query without includes(:layers) is about 5 times faster
126
+ all_topics = Topic.select("id,name")
127
+ all_topics.each {|t| t.layers.select("layers.id,layers.name").each {|l| layer_topics[l.id] << t.name} }
128
+
127
129
  layer_topics
128
130
  end
129
131
  end
@@ -267,6 +269,8 @@ class Ability
267
269
  alias_action :index, :show, :legend, :query, :to => :edit #Edit implies index and show permissions
268
270
  alias_action :legend, :query, :to => :show #Show implies legend and query permissions
269
271
 
272
+ @access_filters = {}
273
+
270
274
  @ability_roles = ability_roles
271
275
  if @ability_roles.has_role?(:admin)
272
276
  can :manage, :all
@@ -296,16 +300,23 @@ class Ability
296
300
 
297
301
  #Attribute permissions
298
302
  ToolResourceType.new.add_ability(self, roles)
299
- end
300
303
 
301
- #Access filters: { resource_type => { resource => filter } }
302
- #@access_filters = {}
303
- #AccessFilter.for_roles(roles).each do |access_filter|
304
- # @access_filters[access_filter.resource_type] ||= {}
305
- # rtaf = @access_filters[access_filter.resource_type]
306
- # res = access_filter.resource.split('/').last
307
- # rtaf[res] = access_filter.condition
308
- #end
304
+ #Access filters:
305
+ # {
306
+ # resource_type => {
307
+ # topic => {
308
+ # layer => condition
309
+ # }
310
+ # }
311
+ # }
312
+ AccessFilter.for_roles(roles).each do |access_filter|
313
+ @access_filters[access_filter.resource_type] ||= {}
314
+
315
+ topic, layer = access_filter.resource.split('/')
316
+ @access_filters[access_filter.resource_type][topic] ||= {}
317
+ @access_filters[access_filter.resource_type][topic][layer] = access_filter.parse_condition
318
+ end
319
+ end
309
320
  end
310
321
 
311
322
  def roles
@@ -317,9 +328,22 @@ class Ability
317
328
  resource_type.roles_permissions(roles, action, resource)
318
329
  end
319
330
 
320
- #def resource_access_filter(resource)
321
- # rtaf = @access_filters[resource.class.to_s]
322
- # return nil if rtaf.nil?
323
- # rtaf[resource.table]
324
- #end
331
+ # specific topic/layer takes precedence over "*" wildcard
332
+ # priorities: topic/layer > topic/* > */layer > */*
333
+ def access_filter(resource_type, topic, layer)
334
+ filter = nil
335
+ unless @access_filters[resource_type].nil?
336
+ unless @access_filters[resource_type][topic].nil?
337
+ # topic/layer or topic/*
338
+ filter = @access_filters[resource_type][topic][layer] || @access_filters[resource_type][topic]["*"]
339
+ end
340
+
341
+ if filter.nil? && !@access_filters[resource_type]["*"].nil?
342
+ # */layer or */*
343
+ filter = @access_filters[resource_type]["*"][layer] || @access_filters[resource_type]["*"]["*"]
344
+ end
345
+ end
346
+ filter
347
+ end
348
+
325
349
  end
@@ -1,3 +1,5 @@
1
+ # NOTE: mark user values with "$user.<attribute>$", e.g. "$user.bfsnr$"
2
+
1
3
  class AccessFilter < ActiveRecord::Base
2
4
  belongs_to :role
3
5
 
@@ -5,4 +7,38 @@ class AccessFilter < ActiveRecord::Base
5
7
 
6
8
  scope :for_roles, lambda { |roles| where(:role_id => roles.collect(&:id)) }
7
9
 
10
+ def parse_condition
11
+ if ["WMS", "WFS"].include?(resource_type)
12
+ wms_condition = condition
13
+ begin
14
+ # try to parse as JSON
15
+ wms_condition = JSON.parse(wms_condition)
16
+ rescue => err
17
+ Rails.logger.info "Could not parse #{resource_type} condition for #{role.name} #{resource} as JSON: #{err}"
18
+ end
19
+ wms_condition
20
+ else
21
+ condition
22
+ end
23
+ end
24
+
25
+ def self.user_value(user, value)
26
+ # replace "$user.<attribute>$" placeholders with user.app_infos[<attribute>] values
27
+ user_attributes = value.to_s.scan(/\$user\.(\w+)\$/).flatten
28
+ unless user_attributes.empty?
29
+ if user.nil?
30
+ # empty values if no user
31
+ value.sub(/\$user\.(\w+)\$/, '')
32
+ else
33
+ user_attributes.each do |key|
34
+ # replace placeholder with value from user.app_infos
35
+ value.sub!(/\$user\.#{key}\$/, user.app_infos[key] || '')
36
+ end
37
+ value
38
+ end
39
+ else
40
+ value
41
+ end
42
+ end
43
+
8
44
  end
data/app/models/layer.rb CHANGED
@@ -103,10 +103,6 @@ EOS
103
103
  #logger.info "************************* Attribute for name '#{name}': #{@attrs[name].inspect}"
104
104
  end
105
105
 
106
- #def filtered(ability)
107
- # feature_class.where(ability.resource_access_filter(self))
108
- #end
109
-
110
106
  def query_fields(ability)
111
107
  return '' if feature_class.nil?
112
108
  ([pkey]+ident_fields_for(ability)+[feature_class.extent_field, feature_class.area_field]).join(',')
@@ -47,7 +47,7 @@ class Permission < ActiveRecord::Base
47
47
  def role_can?(role_id, action, resource)
48
48
  ActiveRecord::Base.silence do
49
49
  can = if has_resource_list?
50
- permitted_resources(role_id, action).include?(resource)
50
+ permitted_resources(role_id, action, resources).include?(resource)
51
51
  else
52
52
  permitted?(resource, permissions(role_id, action))
53
53
  end
@@ -67,6 +67,7 @@ class Permission < ActiveRecord::Base
67
67
  end
68
68
 
69
69
  def roles_can?(roles, action, resource)
70
+ # find first permitted role if any
70
71
  roles.find { |role| role_can?(role.id, action, resource) }
71
72
  end
72
73
 
@@ -74,6 +75,7 @@ class Permission < ActiveRecord::Base
74
75
  ActiveRecord::Base.silence do
75
76
  actions.each do |action|
76
77
  if has_resource_list?
78
+ # use Rails cache
77
79
  ids = Rails.cache.fetch("permitted_resource_ids-#{action}-#{@resource_type_name}-roles-#{roles.collect(&:id).join(',')}") do
78
80
  permitted_resource_ids(roles, action)
79
81
  end
@@ -90,10 +92,12 @@ class Permission < ActiveRecord::Base
90
92
 
91
93
  protected
92
94
 
95
+ # higher sequence takes precedence
93
96
  def permitted?(resource, permissions)
94
97
  allow = false
95
98
  permissions.each do |permission|
96
99
  if permission.deny
100
+ # NOTE: permissions with higher sequence will override this, so deny permissions should have highest sequence
97
101
  allow = false if compare(resource, permission.resource)
98
102
  else
99
103
  allow ||= compare(resource, permission.resource)
@@ -102,10 +106,10 @@ class Permission < ActiveRecord::Base
102
106
  allow
103
107
  end
104
108
 
105
- #All resource permissionsfor a given role_id + action
106
- def permitted_resources(role_id, action)
109
+ #All resource permissions for a given role_id + action
110
+ def permitted_resources(role_id, action, resources_list)
107
111
  permissions = permissions(role_id, action)
108
- resources.select do |r|
112
+ resources_list.select do |r|
109
113
  permitted?(r, permissions)
110
114
  end
111
115
  end
@@ -114,11 +118,12 @@ class Permission < ActiveRecord::Base
114
118
  def permitted_resource_ids(roles, action)
115
119
  ids = []
116
120
  return ids if !has_resource_list?
117
- roles.each { |role| ids += permitted_resources(role.id, action).collect(&:id) }
121
+ resources_list = resources.all # load resources here to optimize loop below
122
+ roles.each { |role| ids += permitted_resources(role.id, action, resources_list).collect(&:id) }
118
123
  ids.sort.uniq
119
124
  end
120
125
 
121
- #All permissions for a given role_id + action
126
+ #All permissions for a given role_id + action, ordered by sequence
122
127
  def permissions(role_id, action)
123
128
  Permission.where(:role_id => role_id,
124
129
  :resource_type => @resource_type_name, :action => action).order(
data/app/models/topic.rb CHANGED
@@ -42,8 +42,9 @@ class Topic < ActiveRecord::Base
42
42
  app.gbapplications_categories.includes(:category).each do |gbapplications_category|
43
43
  category = gbapplications_category.category
44
44
  unless category.nil?
45
- category_topics = category.topics.accessible_by(current_ability).select(
46
- 'topics.*,categories_topics.sort AS categories_topics_sort')
45
+ category_topics = category.topics.accessible_by(current_ability)
46
+ category_topics = category_topics.includes(:organisation).includes(:bg_topic).includes(:overlay_topics) # optimize query performance
47
+ category_topics.select('topics.*,categories_topics.sort AS categories_topics_sort')
47
48
  topics += category_topics.collect do |topic|
48
49
  subtopics = category_topics.select{|t| t.parent_id == topic.id}.collect do |subtopic|
49
50
  {
@@ -188,8 +189,10 @@ class Topic < ActiveRecord::Base
188
189
  end
189
190
 
190
191
  def query_layers(ability, active_layers) #TODO: 0.5s
191
- layers.accessible_by(ability).where('topics_layers.queryable').order('topics_layers.leg_sort DESC').find_all do |layer|
192
- active_layers.include?(layer.name)
192
+ ActiveRecord::Base.silence do
193
+ layers.accessible_by(ability).where('topics_layers.queryable').order('topics_layers.leg_sort DESC').find_all do |layer|
194
+ active_layers.include?(layer.name)
195
+ end
193
196
  end
194
197
  end
195
198
 
@@ -17,12 +17,24 @@
17
17
  <%= @groups_user.group.name %>
18
18
  </div>
19
19
  </div>
20
+ <div class="row">
21
+ <%= f.label 'Login name' %>
22
+ <div class="input uneditable-input">
23
+ <%= @groups_user.user.login %>
24
+ </div>
25
+ </div>
20
26
  <div class="row">
21
27
  <%= f.label 'User' %>
22
28
  <div class="input uneditable-input">
23
29
  <%= @groups_user.user.name %>
24
30
  </div>
25
31
  </div>
32
+ <div class="row">
33
+ <%= f.label 'Email' %>
34
+ <div class="input uneditable-input">
35
+ <a href="mailto:<%= @groups_user.user.email %>?Subject=Best&auml;tigung&Body=<%= render @mail_body %>"><%= @groups_user.user.email %></a>
36
+ </div>
37
+ </div>
26
38
  <div class="row">
27
39
  <%= f.label :granted %>
28
40
  <div class="input">
@@ -1,24 +1,34 @@
1
+ <% if @groups.any? || @groups_users.any? %>
1
2
  <h1>Usergruppen Verwaltung</h1>
3
+ <% end %>
2
4
 
5
+ <% if @groups.any? %>
3
6
  <table>
4
7
  <tr>
5
8
  <th>Group</th>
6
9
  <th>Signup-Link</th>
10
+ <th></th>
7
11
  </tr>
8
12
 
9
13
  <% @groups.each do |group| %>
10
14
  <tr>
11
15
  <td><%= group.name %></td>
12
16
  <td><%= link_to new_user_registration_url(:group => group.name), new_user_registration_path(:group => group.name) %></td>
17
+ <td><%= link_to 'User hinzufügen', new_groups_user_path({:group => group}) %></td>
13
18
  </tr>
14
19
  <% end %>
15
20
  </table>
21
+ <% end %>
16
22
 
23
+ <% if @groups_users.any? %>
17
24
  <table>
18
25
  <tr>
19
26
  <th>Group</th>
27
+ <th>Login</th>
20
28
  <th>User</th>
29
+ <th>EMail</th>
21
30
  <th>Granted</th>
31
+ <th>Info</th>
22
32
  <th></th>
23
33
  <th></th>
24
34
  </tr>
@@ -26,14 +36,35 @@
26
36
  <% @groups_users.each do |groups_user| %>
27
37
  <tr>
28
38
  <td><%= groups_user.group.name %></td>
39
+ <td><%= link_to groups_user.user.login, edit_user_path(groups_user.user) %></td>
29
40
  <td><%= groups_user.user.name %></td>
30
- <td><%= groups_user.granted %></td>
31
- <td><%= link_to 'Edit', edit_groups_user_path(groups_user) %></td>
32
- <td><%= link_to 'Destroy', groups_user, :confirm => 'Are you sure?', :method => :delete %></td>
41
+ <td><%= groups_user.user.email %></td>
42
+ <td><%= link_to groups_user.granted.to_s, edit_groups_user_path(groups_user) %></td>
43
+ <td>
44
+ <% unless groups_user.user.app_infos.nil? %>
45
+ <% groups_user.user.app_infos.each do |key, value| %>
46
+ <i><%= key %></i>: <%= value %><br/>
47
+ <% end %>
48
+ <% end %>
49
+ </td>
50
+ <td><%= link_to 'Bearbeiten', edit_user_path(groups_user.user) %></td>
51
+ <td><%= link_to 'Entfernen', groups_user, :confirm => 'Benutzer aus Gruppe entfernen?', :method => :delete %></td>
33
52
  </tr>
34
53
  <% end %>
35
54
  </table>
55
+ <% end %>
36
56
 
37
- <br />
57
+ <h1>Eigene Gruppen</h1>
38
58
 
39
- <%= link_to 'New Groups user', new_groups_user_path %>
59
+ <table>
60
+ <tr>
61
+ <th>Gruppe</th>
62
+ <th>Freigeschaltet</th>
63
+ </tr>
64
+ <% current_user.groups_users.each do |groups_user| %>
65
+ <tr>
66
+ <td><%= groups_user.group.name %></td>
67
+ <td><%= groups_user.granted ? "ja" : "nein" %></td>
68
+ </tr>
69
+ <% end %>
70
+ </table>
@@ -1,5 +1,44 @@
1
- <h1>New groups_user</h1>
1
+ <% content_for :head do %>
2
+ <script type="text/javascript">
3
+ $(function() {
4
+ $('#user_email').autocomplete({
5
+ source: '/users/find.json',
6
+ minLength: 3
7
+ });
8
+ });
9
+ </script>
10
+ <% end %>
2
11
 
3
- <%= render 'form' %>
12
+ <h1>Benutzer zu Gruppe hinzufügen</h1>
4
13
 
5
- <%= link_to 'Index', groups_users_path %>
14
+ <%= form_for(@groups_user) do |f| %>
15
+ <% if @groups_user.errors.any? %>
16
+ <div id="error_explanation">
17
+ <h2><%= pluralize(@groups_user.errors.count, "error") %> prohibited this groups_user from being saved:</h2>
18
+
19
+ <ul>
20
+ <% @groups_user.errors.full_messages.each do |msg| %>
21
+ <li><%= msg %></li>
22
+ <% end %>
23
+ </ul>
24
+ </div>
25
+ <% end %>
26
+
27
+ <%= f.hidden_field :group_id, :value => @group.id %>
28
+ <div class="row">
29
+ <%= f.label 'Gruppe' %>
30
+ <div class="input uneditable-input">
31
+ <%= @groups_user.group.name %>
32
+ </div>
33
+ </div>
34
+ <div class="row">
35
+ <%= f.label :user_email, 'Benutzer E-Mail' %>
36
+ <%= text_field_tag :user_email %>
37
+ </div>
38
+
39
+ <div class="actions">
40
+ <%= f.submit "Benutzer hinzufügen" %>
41
+ </div>
42
+ <% end %>
43
+
44
+ <%= link_to 'Zurück', groups_users_path %>
@@ -2,15 +2,30 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>GIS-Browser Admin</title>
5
- <%#= stylesheet_link_tag :application, :media => "all" %>
5
+ <%= stylesheet_link_tag :application, :media => "all" %>
6
6
  <% if HOST_ZONE[request.host] == 'intranet' %>
7
7
  <%= stylesheet_link_tag 'http://www.intranet.ktzh.ch/css/global.css' %>
8
8
  <%= stylesheet_link_tag 'http://www.intranet.ktzh.ch/css/intranet.css' %>
9
9
  <% else %>
10
10
  <%= stylesheet_link_tag 'http://www.zh.ch/css/global.css' %>
11
11
  <% end %>
12
+ <style type="text/css">
13
+ div.alert-message {
14
+ background-color: #F2FBF2;
15
+ border: 2px solid #23C123;
16
+ color: #23C123;
17
+ margin-bottom: 30px;
18
+ padding: 5px 51px 5px 10px;
19
+ }
20
+ div.alert-message.error {
21
+ background-color: #FBF2F2;
22
+ border: 2px solid #C12323;
23
+ color: #C12323;
24
+ }
25
+ </style>
12
26
  <%= javascript_include_tag :application %>
13
27
  <%= csrf_meta_tags %>
28
+ <%= yield :head %>
14
29
  </head>
15
30
 
16
31
  <body>
@@ -26,34 +41,38 @@
26
41
  <div id="nav-meta" role="navigation">
27
42
  <ul>
28
43
  <% if user_signed_in? %>
29
- <li><%= link_to current_user.login, edit_user_registration_path(current_user) %></li>
44
+ <li><%= link_to current_user.login, edit_user_path(current_user) %></li>
30
45
  <li><%= link_to('Usergruppen', groups_users_path) %></li>
31
46
  <% else %>
32
47
  <li><%= link_to "Anmelden", new_user_session_path %></li>
33
48
  <% end%>
34
49
  <li><%= link_to "Karte", root_path %></li>
50
+ <% if user_signed_in? %>
51
+ <li><%= link_to "Abmelden", destroy_user_session_path %></li>
52
+ <% end %>
35
53
  </ul>
36
54
  </div>
37
55
 
38
56
  <div id="main-area">
57
+ <div id="content-column">
58
+
39
59
 
40
60
  <% if flash.present? %>
41
- <div class="error-required-box">
42
- <% flash.each do |key, value| %>
43
- <div class='alert-message <%= key %>'>
44
- <p>
45
- <%= value %>
46
- </p>
47
- </div>
48
- <% end %>
49
- <br/>
50
- </div>
61
+ <% flash.each do |key, value| %>
62
+ <div class='<%= key == :alert ? 'error-required-box' : "alert-message #{key}" %>'>
63
+ <p>
64
+ <%= value %>
65
+ </p>
66
+ <br/>
67
+ </div>
68
+ <% end %>
51
69
  <% end %>
52
70
 
53
71
  <%= yield %>
54
72
 
55
73
  <hr />
56
74
  </div>
75
+ </div>
57
76
 
58
77
  <div id="footer" role="complementary">
59
78
 
@@ -61,13 +80,13 @@
61
80
 
62
81
  <ul>
63
82
  <li class="copyright">
64
- &copy; 2012 Kanton Zürich
83
+ &copy; 2013 Kanton Zürich
65
84
  </li>
66
85
  <li >
67
- <a href="http://www.zh.ch/internet/de/service/nav/footer/nutzungsregelungen.html">Nutzungsregelungen</a>
86
+ <a href="http://www.zh.ch/internet/de/service/nav/footer/nutzungsregelungen.html" target="_blank">Nutzungsregelungen</a>
68
87
  </li>
69
88
  <li >
70
- <a href="http://www.zh.ch/internet/de/service/nav/footer/impressum.html">Impressum</a>
89
+ <a href="http://www.zh.ch/internet/de/service/nav/footer/impressum.html" target="_blank">Impressum</a>
71
90
  </li>
72
91
  </ul>
73
92
  <div class="clear"></div>
@@ -31,4 +31,25 @@
31
31
  <div class="row">
32
32
  <%= f.submit "Update" %>
33
33
  </div>
34
+
35
+ <div class="row">
36
+ <%= f.label :token_authentication_key %>
37
+ <p><%= resource.authentication_token.blank? ? "Token Empty" : resource.authentication_token %></p>
38
+ </div>
39
+
40
+ <div class="row">
41
+ <%= link_to "Generate Token", token_authentications_path(:user_id => resource.id), :method => :post, :confirm => "Are you sure?" %>
42
+ <%= link_to "Delete Token", token_authentication_path(resource), :method => :delete, :confirm => "Are you sure?" %>
43
+ </div>
44
+
45
+ <div class="row">
46
+ <% if resource.authentication_token %>
47
+ <p>You can use this url to login<br />
48
+ <%= link_to "http://maps.zh.ch#{root_path(:user_token => resource.authentication_token)}", root_path(:user_token => resource.authentication_token) %></p>
49
+ <% end %>
50
+ </div>
51
+
52
+
53
+
54
+
34
55
  <% end %>
@@ -37,7 +37,7 @@
37
37
  </div>
38
38
 
39
39
  <div class="row">
40
- <%= f.submit "Sign up", :class => 'big-submit' %>
40
+ <%= f.submit "Registrieren", :class => 'big-submit' %>
41
41
  </div>
42
42
  <% end %>
43
43
 
@@ -0,0 +1,63 @@
1
+ <h2>Benutzer bearbeiten</h2>
2
+
3
+ <%= form_for @user do |f| %>
4
+ <% if @user.errors.any? %>
5
+ <div id="error_explanation">
6
+ <h2><%= pluralize(@user.errors.count, "error") %> prohibited this groups_user from being saved:</h2>
7
+
8
+ <ul>
9
+ <% @user.errors.full_messages.each do |msg| %>
10
+ <li><%= msg %></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ <% end %>
15
+
16
+ <div class="row">
17
+ <%= f.label 'Login' %>
18
+ <div class="input uneditable-input">
19
+ <%= @user.login %>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="row">
24
+ <%= f.label 'Name' %>
25
+ <div class="input uneditable-input">
26
+ <%= @user.name %>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="row">
31
+ <%= f.label 'E-Mail' %>
32
+ <div class="input uneditable-input">
33
+ <%= @user.email %>
34
+ </div>
35
+ </div>
36
+
37
+ <% if current_user.id == @user.id %>
38
+ <%= link_to "Bearbeiten", edit_user_registration_path(current_user) %>
39
+ <% end %>
40
+
41
+ <% @user.groups_users.each do |groups_user| %>
42
+ <% next if groups_user.group.nil? %>
43
+ <% if File.exist?(File.join(Rails.root, 'app', 'views', 'registrations', groups_user.group.name)) && (@user.id == current_user.id || current_user.group_admin?(groups_user.group)) %>
44
+ <fieldset>
45
+ <legend><%= groups_user.group.name %> (<%= groups_user.granted ? "freigeschaltet" : "nicht freigeschaltet" %>)</legend>
46
+ <%= render :partial => "registrations/#{groups_user.group.name}/app_infos", :locals => {:f => f} %>
47
+ <%# show user filter fields to group admins only %>
48
+ <% if current_user.group_admin?(groups_user.group) && File.exist?(File.join(Rails.root, 'app', 'views', 'registrations', groups_user.group.name, '_filters.html.erb')) %>
49
+ <div class="row">
50
+ <b><%= f.label "Filter" %></b>
51
+ </div>
52
+ <%= render :partial => "registrations/#{groups_user.group.name}/filters", :locals => {:f => f} %>
53
+ <% end %>
54
+ </fieldset>
55
+ <% end %>
56
+ <% end %>
57
+
58
+ <div class="actions">
59
+ <%= f.submit "Benutzer speichern" %>
60
+ </div>
61
+ <% end %>
62
+
63
+ <%= link_to 'Zurück', groups_users_path %>
data/config/routes.rb CHANGED
@@ -11,10 +11,17 @@ Rails.application.routes.draw do
11
11
  match '/session/welcome' => "registrations#index", :as => :user_welcome
12
12
  match '/session/login' => "registrations#login", :as => :user_login
13
13
  match '/session/logout' => "registrations#logout", :as => :user_logout
14
+ match '/session/confirm' => "registrations#confirm", :as => :user_confirm
14
15
  end
15
16
 
17
+ resources :token_authentications, :only => [:create, :destroy]
16
18
 
17
- resources :groups_users
19
+ resources :groups_users do
20
+ get :register, :on => :collection
21
+ end
22
+ resources :users do
23
+ get :find, :on => :collection
24
+ end
18
25
 
19
26
  resources :topics_layers
20
27
 
@@ -19,20 +19,20 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency "json"
20
20
  s.add_dependency "acts_as_tree", "0.2.0"
21
21
 
22
- s.add_dependency "devise", "2.0.4"
23
- s.add_dependency "cancan", "1.6.7"
22
+ s.add_dependency "devise", "~> 2.2.0"
23
+ s.add_dependency "cancan", "~> 1.6.8"
24
24
 
25
- s.add_dependency "rails_admin", "0.0.5"
25
+ s.add_dependency "rails_admin", "~> 0.4.0"
26
26
  s.add_dependency "fastercsv"# required for rails_admin and Ruby <= 1.8
27
27
  s.add_dependency "sass", "~> 3.2.12" # rails_admin 0.0.5 does not work with sass >=3.3
28
28
 
29
29
  s.add_dependency "GeoRuby", ">= 0.1.4" #used for reading envelope, e.g. in GeoModel#bbox
30
30
 
31
- s.add_dependency "rgeo", "0.3.20"
32
- s.add_dependency "rgeo-geojson", "0.2.1"
31
+ s.add_dependency "rgeo", "~> 0.3.20"
32
+ s.add_dependency "rgeo-geojson", "~> 0.2.3"
33
33
 
34
34
  s.add_dependency "hpricot" # Cascaded WMS FeatureInfo parsing
35
35
 
36
- s.add_dependency "pg", "0.14.0"
36
+ s.add_dependency "pg", "~> 0.14.0"
37
37
  s.add_dependency "activerecord-postgis-adapter", "0.4.1"
38
38
  end
@@ -1,3 +1,3 @@
1
1
  module GbMapfishAppserver
2
- VERSION = "0.8.7"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -75,7 +75,7 @@ module Mapfish
75
75
  #Parts for building a Mapserver URL
76
76
  # Example: http://localhost/cgi-bin/mapserv.fcgi?map=#{Rails.root}/mapconfig/#{options["default-site-name"]}/naturalearth.map)
77
77
  MAPSERV_SERVER = 'http://localhost' #nil for current application server
78
- MAPSERV_URL = '/cgi-bin/mapserv.fcgi'
78
+ MAPSERV_URL = '/cgi-bin/mapserv'
79
79
  MAPSERV_CGI_URL = '/cgi-bin/mapserv'
80
80
  MAPPATH = '#{Rails.root}/mapconfig'
81
81
 
@@ -39,7 +39,7 @@ end
39
39
  #Parts for building a Mapserver URL
40
40
  # Example: http://localhost/cgi-bin/mapserv.fcgi?map=/home/pi/code/rails/dummy/mapconfig/maps.example.com/naturalearth.map)
41
41
  MAPSERV_SERVER = 'http://localhost' #nil for current application server
42
- MAPSERV_URL = '/cgi-bin/mapserv.fcgi'
42
+ MAPSERV_URL = '/cgi-bin/mapserv'
43
43
  MAPSERV_CGI_URL = '/cgi-bin/mapserv'
44
44
  MAPPATH = '/home/pi/code/rails/gb_mapfish_appserver/test/dummy/mapconfig'
45
45
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gb_mapfish_appserver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.7
4
+ version: 0.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-04 00:00:00.000000000 Z
12
+ date: 2014-05-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &23152020 !ruby/object:Gem::Requirement
16
+ requirement: &23267300 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.2.13
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *23152020
24
+ version_requirements: *23267300
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &23151600 !ruby/object:Gem::Requirement
27
+ requirement: &23281540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *23151600
35
+ version_requirements: *23281540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: acts_as_tree
38
- requirement: &23151060 !ruby/object:Gem::Requirement
38
+ requirement: &23280980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
@@ -43,43 +43,43 @@ dependencies:
43
43
  version: 0.2.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *23151060
46
+ version_requirements: *23280980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: devise
49
- requirement: &23150560 !ruby/object:Gem::Requirement
49
+ requirement: &23280440 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
- - - =
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.4
54
+ version: 2.2.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *23150560
57
+ version_requirements: *23280440
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: cancan
60
- requirement: &23150100 !ruby/object:Gem::Requirement
60
+ requirement: &23279720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
- - - =
63
+ - - ~>
64
64
  - !ruby/object:Gem::Version
65
- version: 1.6.7
65
+ version: 1.6.8
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *23150100
68
+ version_requirements: *23279720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rails_admin
71
- requirement: &23149640 !ruby/object:Gem::Requirement
71
+ requirement: &23279060 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
- - - =
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: 0.0.5
76
+ version: 0.4.0
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *23149640
79
+ version_requirements: *23279060
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: fastercsv
82
- requirement: &23149260 !ruby/object:Gem::Requirement
82
+ requirement: &23278480 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *23149260
90
+ version_requirements: *23278480
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sass
93
- requirement: &23148720 !ruby/object:Gem::Requirement
93
+ requirement: &23277660 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 3.2.12
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *23148720
101
+ version_requirements: *23277660
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: GeoRuby
104
- requirement: &23148220 !ruby/object:Gem::Requirement
104
+ requirement: &23276940 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,32 +109,32 @@ dependencies:
109
109
  version: 0.1.4
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *23148220
112
+ version_requirements: *23276940
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rgeo
115
- requirement: &23147760 !ruby/object:Gem::Requirement
115
+ requirement: &23276220 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
- - - =
118
+ - - ~>
119
119
  - !ruby/object:Gem::Version
120
120
  version: 0.3.20
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *23147760
123
+ version_requirements: *23276220
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rgeo-geojson
126
- requirement: &20360520 !ruby/object:Gem::Requirement
126
+ requirement: &23275540 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
- - - =
129
+ - - ~>
130
130
  - !ruby/object:Gem::Version
131
- version: 0.2.1
131
+ version: 0.2.3
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *20360520
134
+ version_requirements: *23275540
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: hpricot
137
- requirement: &20358960 !ruby/object:Gem::Requirement
137
+ requirement: &23274960 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,21 +142,21 @@ dependencies:
142
142
  version: '0'
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *20358960
145
+ version_requirements: *23274960
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: pg
148
- requirement: &20357660 !ruby/object:Gem::Requirement
148
+ requirement: &23290800 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
- - - =
151
+ - - ~>
152
152
  - !ruby/object:Gem::Version
153
153
  version: 0.14.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *20357660
156
+ version_requirements: *23290800
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: activerecord-postgis-adapter
159
- requirement: &20356440 !ruby/object:Gem::Requirement
159
+ requirement: &23290300 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - =
@@ -164,7 +164,7 @@ dependencies:
164
164
  version: 0.4.1
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *20356440
167
+ version_requirements: *23290300
168
168
  description: Mapfish Appserver is a framework for web mapping applications using OGC
169
169
  standards and the Mapfish protocol.
170
170
  email:
@@ -191,8 +191,10 @@ files:
191
191
  - app/controllers/print_controller.rb
192
192
  - app/controllers/registrations_controller.rb
193
193
  - app/controllers/search_controller.rb
194
+ - app/controllers/token_authentications_controller.rb
194
195
  - app/controllers/topics_controller.rb
195
196
  - app/controllers/upload_controller.rb
197
+ - app/controllers/users_controller.rb
196
198
  - app/controllers/wfs_controller.rb
197
199
  - app/controllers/wms_controller.rb
198
200
  - app/helpers/application_helper.rb
@@ -261,6 +263,7 @@ files:
261
263
  - app/views/topics/_print_disclaimer.txt
262
264
  - app/views/topics/legend.html.erb
263
265
  - app/views/topics/query.html.erb
266
+ - app/views/users/edit.html.erb
264
267
  - config/initializers/devise.rb
265
268
  - config/initializers/geodb.rb
266
269
  - config/initializers/mime_types.rb