fix get_color() on ModelInstanceWrapper
This commit is contained in:
parent
8fef2a81a9
commit
edfb083c61
7 changed files with 33 additions and 30 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue