def on_feature_post_save_tilestache(sender, **kwargs): """ Update/Create the tilestache data for the layers of the given feature """ features = kwargs['instance'] config_entity = features[0].config_entity.subclassed db_entity_interest = config_entity.computed_db_entity_interests(db_entity__key=features[0].db_entity_key)[0] db_entity = db_entity_interest.db_entity logger.info("Handler: on_feature_post_save_tilestache for config_entity %s and db_entity %s" %\ (config_entity.name, db_entity.key)) ids = map(lambda obj: obj.id, features) feature_class = config_entity.db_entity_feature_class(db_entity.key) queryset = feature_class.objects.filter(id__in=ids) # Find all scenarios under the config_entity, whatever it's scope # We need to refresh all LayerLibraries of those scenarios scenarios = config_entity.descendants_by_type(Scenario) if\ not isinstance(config_entity, Scenario)\ else [config_entity] if not scenarios: raise Exception("No scenarios found to invalidate for config_entity %s" % config_entity.full_name) logger.info("Handler: on_feature_post_save_tilestache. Invalidate layer of scenarios %s" % \ (map(lambda scenario: scenario.id, scenarios))) layer_libraries = LayerLibrary.objects.filter( config_entity__id__in=map(lambda scenario: scenario.id, scenarios), key='layer_library__default' ) for layer in resolve_layers(layer_libraries, db_entity_keys=[db_entity.key]): logger.info("Handler: on_feature_post_save_tilestache. Invalidate layer %s, queryset: %s" % (layer.medium_subclassed.style_attributes.all(), queryset)) for attr in layer.medium_subclassed.style_attributes.all(): # layer_key = "layer:{layer},attr_id:{attribute},type:raster".format(layer=layer.id, attribute=attr.id) invalidate_feature_cache(layer_key, queryset)
def update_dependent_scenarios(self, base_features, scenario): if isinstance(scenario, BaseScenario): future_scenarios = FutureScenario.objects.filter( parent_config_entity=scenario.parent_config_entity_subclassed) logger.info("Updating dependent scenarios {0} of {1}".format( future_scenarios, scenario)) for future_scenario in future_scenarios: agriculture_feature_class = future_scenario.db_entity_feature_class( DbEntityKey.FUTURE_AGRICULTURE) future_features = agriculture_feature_class.objects.filter( id__in=base_features, updater__isnull=True) logger.info("Updating {0} features of {1}".format( future_features.count(), future_scenario)) updated_built_forms = [] for feature in future_features.iterator(): base_feature = base_features.get(id=feature.id) if base_feature.built_form_id != feature.built_form_id: updated_built_forms.append(feature) base_attributes = dict( gross_net_pct=base_feature.gross_net_pct, built_form_key=base_feature.built_form_key, built_form_id=base_feature.built_form_id, density_pct=base_feature.density_pct, acres_gross=base_feature.acres_gross, crop_yield=base_feature.crop_yield, market_value=base_feature.market_value, production_cost=base_feature.production_cost, water_consumption=base_feature.water_consumption, labor_force=base_feature.labor_force, truck_trips=base_feature.truck_trips, ) for attr, value in base_attributes.iteritems(): setattr(feature, attr, value) feature.save(update_fields=self.ANALYSIS_FIELDS) layer = Layer.objects.filter( presentation__config_entity=agriculture_feature_class. config_entity, db_entity_interest__db_entity__key=agriculture_feature_class .db_entity_key)[0] if updated_built_forms: for key in layer.keys: # clear tilestache cache for updated dependencies invalidate_feature_cache(key, updated_built_forms)
def update_dependent_scenarios(self, base_features, scenario): if isinstance(scenario, BaseScenario): future_scenarios = FutureScenario.objects.filter(parent_config_entity=scenario.parent_config_entity_subclassed) logger.info("Updating dependent scenarios {0} of {1}".format(future_scenarios, scenario)) for future_scenario in future_scenarios: agriculture_feature_class = future_scenario.db_entity_feature_class(DbEntityKey.FUTURE_AGRICULTURE) future_features = agriculture_feature_class.objects.filter( id__in=base_features, updater__isnull=True ) logger.info("Updating {0} features of {1}".format(future_features.count(), future_scenario)) updated_built_forms = [] for feature in future_features.iterator(): base_feature = base_features.get(id=feature.id) if base_feature.built_form_id != feature.built_form_id: updated_built_forms.append(feature) base_attributes = dict( gross_net_pct=base_feature.gross_net_pct, built_form_key=base_feature.built_form_key, built_form_id=base_feature.built_form_id, density_pct=base_feature.density_pct, acres_gross=base_feature.acres_gross, crop_yield=base_feature.crop_yield, market_value=base_feature.market_value, production_cost=base_feature.production_cost, water_consumption=base_feature.water_consumption, labor_force=base_feature.labor_force, truck_trips=base_feature.truck_trips, ) for attr, value in base_attributes.iteritems(): setattr(feature, attr, value) feature.save(update_fields=self.ANALYSIS_FIELDS) layer = Layer.objects.filter(presentation__config_entity=agriculture_feature_class.config_entity, db_entity_interest__db_entity__key=agriculture_feature_class.db_entity_key)[0] if updated_built_forms: for key in layer.keys: # clear tilestache cache for updated dependencies invalidate_feature_cache(key, updated_built_forms)
def on_feature_post_save_tilestache(sender, **kwargs): """ Update/Create the tilestache data for the layers of the given feature """ features = kwargs['instance'] config_entity = features[0].config_entity.subclassed db_entity_interest = config_entity.computed_db_entity_interests( db_entity__key=features[0].db_entity_key)[0] db_entity = db_entity_interest.db_entity logger.info("Handler: on_feature_post_save_tilestache for config_entity %s and db_entity %s" %\ (config_entity.name, db_entity.key)) ids = map(lambda obj: obj.id, features) feature_class = config_entity.db_entity_feature_class(db_entity.key) queryset = feature_class.objects.filter(id__in=ids) # Find all scenarios under the config_entity, whatever it's scope # We need to refresh all LayerLibraries of those scenarios scenarios = config_entity.descendants_by_type(Scenario) if\ not isinstance(config_entity, Scenario)\ else [config_entity] if not scenarios: raise Exception( "No scenarios found to invalidate for config_entity %s" % config_entity.full_name) logger.info("Handler: on_feature_post_save_tilestache. Invalidate layer of scenarios %s" % \ (map(lambda scenario: scenario.id, scenarios))) layer_libraries = LayerLibrary.objects.filter(config_entity__id__in=map( lambda scenario: scenario.id, scenarios), key='layer_library__default') for layer in resolve_layers(layer_libraries, db_entity_keys=[db_entity.key]): logger.info( "Handler: on_feature_post_save_tilestache. Invalidate layer %s, queryset: %s" % (layer.medium_subclassed.style_attributes.all(), queryset)) for attr in layer.medium_subclassed.style_attributes.all(): # layer_key = "layer:{layer},attr_id:{attribute},type:raster".format( layer=layer.id, attribute=attr.id) invalidate_feature_cache(layer_key, queryset)