gb_mapfish_appserver 0.8.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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