def context_dict_for_resource(request, resource, **kwargs): context = context_dict_for_map_feature(request, resource, **kwargs) instance = request.instance # Give them 2 for adding the resource and answering its questions total_progress_items = 3 completed_progress_items = 2 context['external_link'] = None photos = resource.photos() context['photos'] = [context_dict_for_photo(request, photo) for photo in photos] has_photos = len(photos) > 0 if has_photos: completed_progress_items += 1 context['upload_photo_endpoint'] = reverse( 'add_photo_to_map_feature', kwargs={'instance_url_name': instance.url_name, 'feature_id': resource.pk}) context['progress_percent'] = int(100 * ( completed_progress_items / total_progress_items) + .5) context['progress_messages'] = [] if not has_photos: context['progress_messages'].append(_('Add a photo')) audits = _map_feature_audits(request.user, request.instance, resource) _add_audits_to_context(audits, context) _add_share_context(context, request, photos) object_name_alias = to_object_name(context['feature'].__class__.__name__) # some features that were originally written to support plot and tree # have grown to support other resource types, but they expect a context # entry for their type, not just for 'feature'. # For example: # * Plot detail expects 'plot' and 'tree' # * Foo detail would expect 'foo' context[object_name_alias] = context['feature'] if isinstance(resource, PolygonalMapFeature): context['contained_plots'] = resource.contained_plots() area = resource.calculate_area() __, display_area = get_display_value(instance, 'greenInfrastructure', 'area', area, digits=0) display_units = get_unit_abbreviation( get_units(instance, 'greenInfrastructure', 'area')) context['area'] = area context['display_area'] = display_area context['area_units'] = display_units return context
def context_dict_for_resource(request, resource, **kwargs): context = context_dict_for_map_feature(request, resource, **kwargs) instance = request.instance # Give them 2 for adding the resource and answering its questions total_progress_items = 3 completed_progress_items = 2 context['external_link'] = None photos = resource.photos() context['photos'] = [ context_dict_for_photo(request, photo) for photo in photos ] has_photos = len(photos) > 0 if has_photos: completed_progress_items += 1 context['upload_photo_endpoint'] = reverse('add_photo_to_map_feature', kwargs={ 'instance_url_name': instance.url_name, 'feature_id': resource.pk }) context['progress_percent'] = int( 100 * (completed_progress_items / total_progress_items) + .5) context['progress_messages'] = [] if not has_photos: context['progress_messages'].append(_('Add a photo')) audits = _map_feature_audits(request.user, request.instance, resource) _add_audits_to_context(audits, context) _add_share_context(context, request, photos) object_name_alias = to_object_name(context['feature'].__class__.__name__) # some features that were originally written to support plot and tree # have grown to support other resource types, but they expect a context # entry for their type, not just for 'feature'. # For example: # * Plot detail expects 'plot' and 'tree' # * Foo detail would expect 'foo' context[object_name_alias] = context['feature'] if isinstance(resource, PolygonalMapFeature): context['contained_plots'] = resource.contained_plots() __, display_area = get_display_value(instance, 'greenInfrastructure', 'area', resource.calculate_area()) display_units = get_unit_abbreviation( get_units(instance, 'greenInfrastructure', 'area')) context['area'] = '{} {}'.format(display_area, display_units) return context
def get_map_view_context(request, instance): if request.user and not request.user.is_anonymous(): iuser = request.user.get_effective_instance_user(instance) resource_classes = [resource for resource in instance.resource_classes if model_is_creatable(iuser, resource)] else: resource_classes = [] context = { 'fields_for_add_tree': [ (_('Tree Height'), 'Tree.height') ], 'resource_classes': resource_classes, 'only_one_resource_class': len(resource_classes) == 1, 'polygon_area_units': get_unit_abbreviation( get_units(instance, 'greenInfrastructure', 'area')), 'q': request.GET.get('q'), } add_map_info_to_context(context, instance) return context
def render(self, context): explanation = _resolve_variable(self.explanation, context) label, identifier = self.resolve_label_and_identifier(context) user = _resolve_variable(self.user, context) instance = _resolve_variable(self.instance, context) field_template = get_template(_resolve_variable( self.field_template, context)).template if not isinstance(identifier, basestring)\ or not _identifier_regex.match(identifier): raise template.TemplateSyntaxError( 'expected a string with the format "object_name.property" ' 'to follow "from" %s' % identifier) model_name_or_object_name, field_name = dotted_split(identifier, 2, maxsplit=1) model = self.get_model(context, model_name_or_object_name, instance) object_name = to_object_name(model_name_or_object_name) identifier = "%s.%s" % (object_name, field_name) def _field_value(model, field_name, data_type): udf_field_name = field_name.replace('udf:', '') val = None if field_name in [f.name for f in model._meta.get_fields()]: try: val = getattr(model, field_name) except (ObjectDoesNotExist, AttributeError): pass elif _is_udf(model, udf_field_name): if udf_field_name in model.udfs: val = model.udfs[udf_field_name] # multichoices place a json serialized data-value # on the dom element and client-side javascript # processes it into a view table and edit widget if data_type == 'multichoice': val = json.dumps(val) elif data_type == 'multichoice': val = '[]' else: raise ValueError('Could not find field: %s' % field_name) return val if is_json_field_reference(field_name): field_value = get_attr_from_json_field(model, field_name) choices = None is_visible = is_editable = True data_type = "string" else: add_blank = (ADD_BLANK_ALWAYS if self.treat_multichoice_as_choice else ADD_BLANK_IF_CHOICE_FIELD) data_type, label, explanation, choices = field_type_label_choices( model, field_name, label, explanation=explanation, add_blank=add_blank) field_value = _field_value(model, field_name, data_type) if user is not None and hasattr(model, 'field_is_visible'): is_visible = model.field_is_visible(user, field_name) is_editable = model.field_is_editable(user, field_name) else: # This tag can be used without specifying a user. In that case # we assume that the content is visible and upstream code is # responsible for only showing the content to the appropriate # user is_visible = True is_editable = True digits = units = '' if hasattr(model, 'instance'): digits = get_digits_if_formattable( model.instance, object_name, field_name) units = get_units_if_convertible( model.instance, object_name, field_name) if units != '': units = get_unit_abbreviation(units) if data_type == 'foreign_key': # rendered clientside display_val = '' elif field_value is None: display_val = None elif data_type in ['date', 'datetime']: fmt = (model.instance.short_date_format if model.instance else settings.SHORT_DATE_FORMAT) display_val = dateformat.format(field_value, fmt) elif is_convertible_or_formattable(object_name, field_name): display_val = format_value( model.instance, object_name, field_name, field_value) if units != '': display_val += (' %s' % units) elif data_type == 'bool': display_val = _('Yes') if field_value else _('No') elif data_type == 'multichoice': # this is rendered clientside from data attributes so # there's no meaningful intermediate value to send # without rendering the same markup server-side. display_val = None elif choices: display_vals = [choice['display_value'] for choice in choices if choice['value'] == field_value] display_val = display_vals[0] if display_vals else field_value else: display_val = unicode(field_value) context['field'] = { 'label': label, 'explanation': explanation, 'identifier': identifier, 'value': field_value, 'display_value': display_val, 'units': units, 'digits': digits, 'data_type': data_type, 'is_visible': is_visible, 'is_editable': is_editable, 'choices': choices, } self.get_additional_context( context['field'], model, field_name, context.get('q', '')) return field_template.render(context)
def render(self, context): explanation = _resolve_variable(self.explanation, context) label, identifier = self.resolve_label_and_identifier(context) user = _resolve_variable(self.user, context) instance = _resolve_variable(self.instance, context) field_template = get_template(_resolve_variable( self.field_template, context)).template if not isinstance(identifier, basestring)\ or not _identifier_regex.match(identifier): raise template.TemplateSyntaxError( 'expected a string with the format "object_name.property" ' 'to follow "from" %s' % identifier) model_name_or_object_name, field_name = dotted_split(identifier, 2, maxsplit=1) model = self.get_model(context, model_name_or_object_name, instance) object_name = to_object_name(model_name_or_object_name) identifier = "%s.%s" % (object_name, field_name) def _field_value(model, field_name, data_type): udf_field_name = field_name.replace('udf:', '') val = None if field_name in [f.name for f in model._meta.get_fields()]: try: val = getattr(model, field_name) except (ObjectDoesNotExist, AttributeError): pass elif _is_udf(model, udf_field_name): if udf_field_name in model.udfs: val = model.udfs[udf_field_name] # multichoices place a json serialized data-value # on the dom element and client-side javascript # processes it into a view table and edit widget if data_type == 'multichoice': val = json.dumps(val) elif data_type == 'multichoice': val = '[]' else: raise ValueError('Could not find field: %s' % field_name) return val if is_json_field_reference(field_name): field_value = get_attr_from_json_field(model, field_name) choices = None is_visible = is_editable = True data_type = "string" else: add_blank = (ADD_BLANK_ALWAYS if self.treat_multichoice_as_choice else ADD_BLANK_IF_CHOICE_FIELD) data_type, label, explanation, choices = field_type_label_choices( model, field_name, label, explanation=explanation, add_blank=add_blank) field_value = _field_value(model, field_name, data_type) if user is not None and hasattr(model, 'field_is_visible'): is_visible = model.field_is_visible(user, field_name) is_editable = model.field_is_editable(user, field_name) else: # This tag can be used without specifying a user. In that case # we assume that the content is visible and upstream code is # responsible for only showing the content to the appropriate # user is_visible = True is_editable = True digits = units = '' if hasattr(model, 'instance'): digits = get_digits_if_formattable( model.instance, object_name, field_name) units = get_units_if_convertible( model.instance, object_name, field_name) if units != '': units = get_unit_abbreviation(units) if data_type == 'foreign_key': # rendered clientside display_val = '' elif field_value is None: display_val = None elif data_type in ['date', 'datetime']: fmt = (model.instance.short_date_format if model.instance else settings.SHORT_DATE_FORMAT) display_val = dateformat.format(field_value, fmt) elif is_convertible_or_formattable(object_name, field_name): display_val = format_value( model.instance, object_name, field_name, field_value) if units != '': display_val += (' %s' % units) elif data_type == 'bool': display_val = _('Yes') if field_value else _('No') elif data_type == 'multichoice': # this is rendered clientside from data attributes so # there's no meaningful intermediate value to send # without rendering the same markup server-side. display_val = None elif choices: display_vals = [choice['display_value'] for choice in choices if choice['value'] == field_value] display_val = display_vals[0] if display_vals else field_value elif data_type == 'float': display_val = num_format(field_value) else: display_val = unicode(field_value) context['field'] = { 'label': label, 'explanation': explanation, 'identifier': identifier, 'value': field_value, 'display_value': display_val, 'units': units, 'digits': digits, 'data_type': data_type, 'is_visible': is_visible, 'is_editable': is_editable, 'choices': choices, } self.get_additional_context( context['field'], model, field_name, context.get('q', '')) return field_template.render(context)