fix get_color() on ModelInstanceWrapper

This commit is contained in:
Laura Klünder 2017-06-16 18:38:41 +02:00
parent 8fef2a81a9
commit edfb083c61
7 changed files with 33 additions and 30 deletions

View file

@ -92,7 +92,7 @@ class EditorViewSet(ViewSet):
for result in results:
print(type(result).__name__)
return Response([obj.to_geojson() for obj in results])
return Response([obj.to_geojson(instance=obj) for obj in results])
elif space is not None:
space = get_object_or_404(Space.objects.select_related('level', 'level__on_top_of'), pk=space)
level = space.level

View file

@ -53,8 +53,9 @@ class BaseWrapper:
elif isinstance(value, type) and issubclass(value, Exception):
pass
elif callable(value) and name not in self._allowed_callables:
if not isinstance(self, ModelInstanceWrapper) or hasattr(models.Model, name):
raise TypeError('Can not call %s.%s wrapped!' % (type(self), name))
if isinstance(self, ModelInstanceWrapper) and not hasattr(models.Model, name):
return value
raise TypeError('Can not call %s.%s wrapped!' % (type(self), name))
return value
def __setattr__(self, name, value):
@ -307,7 +308,7 @@ class BaseQueryWrapper(BaseWrapper):
return isinstance(pk, str) and pk.startswith('c') and pk[1:].isnumeric()
def _filter_kwarg(self, filter_name, filter_value):
print(filter_name, '=', filter_value, sep='')
# print(filter_name, '=', filter_value, sep='')
segments = filter_name.split('__')
field_name = segments.pop(0)

View file

@ -17,7 +17,7 @@ class GeometryMixin(EditorFormMixin):
class Meta:
abstract = True
def get_geojson_properties(self) -> dict:
def get_geojson_properties(self, *args, **kwargs) -> dict:
result = OrderedDict((
('type', self.__class__.__name__.lower()),
('id', self.pk),
@ -26,10 +26,10 @@ class GeometryMixin(EditorFormMixin):
result['bounds'] = True
return result
def to_geojson(self) -> dict:
def to_geojson(self, instance=None) -> dict:
result = OrderedDict((
('type', 'Feature'),
('properties', self.get_geojson_properties()),
('properties', self.get_geojson_properties(instance=instance)),
('geometry', format_geojson(mapping(self.geometry), round=False)),
))
original_geometry = getattr(self, 'original_geometry', None)

View file

@ -14,11 +14,11 @@ class LevelGeometryMixin(GeometryMixin):
class Meta:
abstract = True
def get_geojson_properties(self) -> dict:
result = super().get_geojson_properties()
def get_geojson_properties(self, *args, instance=None, **kwargs) -> dict:
result = super().get_geojson_properties(*args, **kwargs)
result['level'] = self.level_id
if hasattr(self, 'get_color'):
color = self.get_color()
color = self.get_color(instance=instance)
if color:
result['color'] = color
if hasattr(self, 'opacity'):
@ -70,8 +70,8 @@ class Space(SpecificLocation, LevelGeometryMixin, models.Model):
result['public'] = self.public
return result
def get_color(self):
color = super().get_color()
def get_color(self, *args, **kwargs):
color = super().get_color(*args, **kwargs)
if not color:
color = {
'stairs': '#dddddd',

View file

@ -24,8 +24,8 @@ class SpaceGeometryMixin(GeometryMixin):
result['space'] = self.space_id
return result
def get_geojson_properties(self) -> dict:
result = super().get_geojson_properties()
def get_geojson_properties(self, *args, **kwargs) -> dict:
result = super().get_geojson_properties(*args, **kwargs)
if hasattr(self, 'get_color'):
color = self.get_color()
if color:
@ -62,8 +62,8 @@ class Area(SpecificLocation, SpaceGeometryMixin, models.Model):
result['stuffed'] = self.stuffed
return result
def get_color(self):
color = super().get_color()
def get_color(self, *args, **kwargs):
color = super().get_color(*args, **kwargs)
if not color and self.stuffed:
color = 'rgba(0, 0, 0, 0.04)'
return color
@ -80,8 +80,8 @@ class Stair(SpaceGeometryMixin, models.Model):
verbose_name_plural = _('Stairs')
default_related_name = 'stairs'
def to_geojson(self):
result = super().to_geojson()
def to_geojson(self, *args, **kwargs):
result = super().to_geojson(*args, **kwargs)
original_geometry = result['geometry']
draw = self.geometry.buffer(0.05, join_style=JOIN_STYLE.mitre, cap_style=CAP_STYLE.flat)
result['geometry'] = format_geojson(mapping(draw))
@ -143,8 +143,8 @@ class LineObstacle(SpaceGeometryMixin, models.Model):
def buffered_geometry(self):
return self.geometry.buffer(self.width / 2, join_style=JOIN_STYLE.mitre, cap_style=CAP_STYLE.flat)
def to_geojson(self):
result = super().to_geojson()
def to_geojson(self, *args, **kwargs):
result = super().to_geojson(*args, **kwargs)
result['original_geometry'] = result['geometry']
result['geometry'] = format_geojson(mapping(self.buffered_geometry))
return result
@ -165,8 +165,8 @@ class Point(SpecificLocation, SpaceGeometryMixin, models.Model):
def buffered_geometry(self):
return self.geometry.buffer(0.5)
def to_geojson(self):
result = super().to_geojson()
def to_geojson(self, *args, **kwargs):
result = super().to_geojson(*args, **kwargs)
result['original_geometry'] = result['geometry']
result['geometry'] = format_geojson(mapping(self.buffered_geometry))
return result

View file

@ -31,16 +31,16 @@ class Level(SpecificLocation, EditorFormMixin, models.Model):
def lower(self, level_model=None):
if self.on_top_of_id is not None:
raise TypeError
if level_model is not None:
Level = level_model
return Level.objects.filter(altitude__lt=self.altitude, on_top_of__isnull=True).order_by('-altitude')
if level_model is None:
level_model = Level
return level_model.objects.filter(altitude__lt=self.altitude, on_top_of__isnull=True).order_by('-altitude')
def higher(self, level_model=None):
if self.on_top_of_id is not None:
raise TypeError
if level_model is not None:
Level = level_model
return Level.objects.filter(altitude__gt=self.altitude, on_top_of__isnull=True).order_by('altitude')
if level_model is None:
level_model = Level
return level_model.objects.filter(altitude__gt=self.altitude, on_top_of__isnull=True).order_by('altitude')
@property
def sublevels(self):

View file

@ -112,11 +112,13 @@ class Location(LocationSlug, EditorFormMixin, models.Model):
return self._meta.verbose_name + ' ' + self.slug
return super().title
def get_color(self):
def get_color(self, instance=None):
if self.color:
return self.color
# dont filter in the query here so prefetch_related works
groups = [group for group in self.groups.all() if group.color is not None]
if instance is None:
instance = self
groups = [group for group in instance.groups.all() if group.color is not None]
if not groups:
return None
for group in groups: