def create_layer_selection(config_entity, layer, attribute_id): db_entity = layer.db_entity_interest.db_entity connection = connection_dict(layer.config_entity.db) tilestache_layers = [] users = set(get_users_with_perms(config_entity)) | set( get_users_with_perms(layer.db_entity_interest.db_entity)) # Make sure layer_selection instances exist for the users from footprint.main.publishing.layer_publishing import update_or_create_layer_selections_for_layer update_or_create_layer_selections_for_layer(layer, users=users) logger.info("Get/Create layer_selection for config_entity %s, layer %s, users %s" %\ (config_entity.key, layer.db_entity_key, ','.join(map(lambda user: user.username, users)))) # Each layer has a dynamic class representing its SelectedFeature table get_or_create_layer_selection_class_for_layer(layer) if not users: return tilestache_layers config_entity.db_entity_feature_class(key=layer.db_entity_key) layer_selection_class = get_or_create_layer_selection_class_for_layer( layer, config_entity) # Take the first user to create a template query user = list(users)[0] # Each LayerSelection instance is per user layer_selection = layer_selection_class.objects.get_or_create(user=user)[0] # Extract the query from the QuerySet query = re.sub( r'"layer_selection_id" = \d+', r'"layer_selection_id" = {user_id}', str( layer_selection.selected_features.values('wkb_geometry', 'id').query)) logger.info( "Creating tilestache layer_selection for layer %s, user %s, query: %s" % (layer.full_name, user.username, query)) user_id_lookup = map_to_dict( lambda layer_selection: [layer_selection.user.id, layer_selection.id], layer_selection_class.objects.all()) # Embed the id in the Geojson for each feature. # Nothing else is needed, since all other attributes can be looked up based on the id id_field = map(lambda field: field.name + '_id', layer_selection.feature_class._meta.parents.values())[0] vector_selection_layer = build_vector_layer_config( parameters=merge( connection, dict(query=query, column="wkb_geometry", user_id_lookup=user_id_lookup)), provider_id_property=id_field, client_id_property=db_entity._meta.pk.name) layer_key = "layer:{layer},attr_id:{attribute},type:{type}".format( layer=layer.id, attribute=attribute_id, type='selection') logger.info("Creating layer %s" % layer_key) tilestache_layers.append( TSLayer(key=layer_key, value=vector_selection_layer)) return tilestache_layers
def create_vector_layer(config_entity, layer, attribute): # If the db_entity doesn't have an explicit query create a query from the table and schema that joins # in the geography column. db_entity = layer.db_entity_interest.db_entity query = create_query(attribute, config_entity, layer) connection = connection_dict(layer.config_entity.db) vector_layer = build_vector_layer_config(merge(connection, dict(query=query, column="wkb_geometry",)), client_id_property=db_entity._meta.pk.name) return TSLayer(key="layer_{0}_{1}_vector".format(layer.id, attribute), value=vector_layer)
def create_vector_layer(config_entity, layer, attribute): # If the db_entity doesn't have an explicit query create a query from the table and schema that joins # in the geography column. db_entity = layer.db_entity_interest.db_entity query = create_query(attribute, config_entity, layer) connection = connection_dict(layer.config_entity.db) vector_layer = build_vector_layer_config( merge(connection, dict( query=query, column="wkb_geometry", )), client_id_property=db_entity._meta.pk.name) return TSLayer(key="layer_{0}_{1}_vector".format(layer.id, attribute), value=vector_layer)
def create_layer_selection(config_entity, layer, attribute_id): db_entity = layer.db_entity_interest.db_entity connection = connection_dict(layer.config_entity.db) tilestache_layers = [] users = set(get_users_with_perms(config_entity)) | set(get_users_with_perms(layer.db_entity_interest.db_entity)) # Make sure layer_selection instances exist for the users from footprint.main.publishing.layer_publishing import update_or_create_layer_selections_for_layer update_or_create_layer_selections_for_layer(layer, users=users) logger.info("Get/Create layer_selection for config_entity %s, layer %s, users %s" %\ (config_entity.key, layer.db_entity_key, ','.join(map(lambda user: user.username, users)))) # Each layer has a dynamic class representing its SelectedFeature table get_or_create_layer_selection_class_for_layer(layer) if not users: return tilestache_layers config_entity.db_entity_feature_class(key=layer.db_entity_key) layer_selection_class = get_or_create_layer_selection_class_for_layer(layer, config_entity) # Take the first user to create a template query user = list(users)[0] # Each LayerSelection instance is per user layer_selection = layer_selection_class.objects.get_or_create(user=user)[0] # Extract the query from the QuerySet query = re.sub( r'"layer_selection_id" = \d+', r'"layer_selection_id" = {user_id}', str(layer_selection.selected_features.values('wkb_geometry', 'id').query)) logger.info("Creating tilestache layer_selection for layer %s, user %s, query: %s" % (layer.full_name, user.username, query)) user_id_lookup = map_to_dict(lambda layer_selection: [layer_selection.user.id, layer_selection.id], layer_selection_class.objects.all()) # Embed the id in the Geojson for each feature. # Nothing else is needed, since all other attributes can be looked up based on the id id_field = map(lambda field: field.name + '_id', layer_selection.feature_class._meta.parents.values())[0] vector_selection_layer = build_vector_layer_config( parameters=merge(connection, dict(query=query, column="wkb_geometry", user_id_lookup=user_id_lookup)), provider_id_property=id_field, client_id_property=db_entity._meta.pk.name ) layer_key = "layer:{layer},attr_id:{attribute},type:{type}".format(layer=layer.id, attribute=attribute_id, type='selection') logger.info("Creating layer %s" % layer_key) tilestache_layers.append(TSLayer(key=layer_key, value=vector_selection_layer)) return tilestache_layers