diff --git a/docker-compose.yml b/docker-compose.yml index a743cce..1c541f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,7 @@ services: postgres: container_name: map-postgres image: postgis/postgis + platform: linux/amd64 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s diff --git a/map/serializers.py b/map/serializers.py index 03dd912..db694a0 100644 --- a/map/serializers.py +++ b/map/serializers.py @@ -3,32 +3,32 @@ from map.models import CommunityArea, RestaurantPermit +class CommunityAreaListSerializer(serializers.ListSerializer): + def to_representation(self, data): + + result = {} + for item in data: + child_data = self.child.to_representation(item) + name = child_data["name"] + result[name] = {"area_id": child_data["area_id"], "num_permits": child_data["num_permits"]} + return [result] + + class CommunityAreaSerializer(serializers.ModelSerializer): class Meta: model = CommunityArea - fields = ["name", "num_permits"] + fields = ["name", "area_id", "num_permits"] + list_serializer_class = CommunityAreaListSerializer num_permits = serializers.SerializerMethodField() def get_num_permits(self, obj): - """ - TODO: supplement each community area object with the number - of permits issued in the given year. - - e.g. The endpoint /map-data/?year=2017 should return something like: - [ - { - "ROGERS PARK": { - area_id: 17, - num_permits: 2 - }, - "BEVERLY": { - area_id: 72, - num_permits: 2 - }, - ... - } - ] - """ - - pass + area_id = obj.area_id + num_permits = RestaurantPermit.objects.filter( + community_area_id=str(area_id), + issue_date__year=self.context["year"], + ).count() + return num_permits + + + diff --git a/map/static/js/App.js b/map/static/js/App.js index 5a8ec40..22a3489 100644 --- a/map/static/js/App.js +++ b/map/static/js/App.js @@ -1,8 +1,13 @@ -import React from "react" -import { createRoot } from "react-dom/client" +import React from "react"; +import { createRoot } from "react-dom/client"; -import RestaurantPermitMap from "./RestaurantPermitMap" +import RestaurantPermitMap from "./RestaurantPermitMap"; -const container = document.getElementById("map") -const root = createRoot(container) -root.render() +const container = document.getElementById("map"); +const root = createRoot(container); +root.render( + // Would use ReactErrorBoundary library to catch errors anywhere in RestaurantPermitMap and display a fallback UI. + // + , + // +); diff --git a/map/static/js/RestaurantPermitMap.js b/map/static/js/RestaurantPermitMap.js index 57f8ea0..f7e5112 100644 --- a/map/static/js/RestaurantPermitMap.js +++ b/map/static/js/RestaurantPermitMap.js @@ -1,25 +1,19 @@ -import React, { useEffect, useState } from "react" +import React, { useEffect, useState } from "react"; -import { MapContainer, TileLayer, GeoJSON } from "react-leaflet" +import { MapContainer, TileLayer, GeoJSON } from "react-leaflet"; -import "leaflet/dist/leaflet.css" +import "leaflet/dist/leaflet.css"; -import RAW_COMMUNITY_AREAS from "../../../data/raw/community-areas.geojson" +import RAW_COMMUNITY_AREAS from "../../../data/raw/community-areas.geojson"; -function YearSelect({ setFilterVal }) { - // Filter by the permit issue year for each restaurant - const startYear = 2026 - const years = [...Array(11).keys()].map((increment) => { - return startYear - increment - }) - const options = years.map((year) => { - return ( - - ) - }) +const START_YEAR = 2026; + +// Generates years from 2026 to 2016 +const YEAR_OPTIONS = [...Array(11).keys()].map((increment) => { + return START_YEAR - increment; +}); +function YearSelect({ setFilterVal }) { return ( <>