Skip to content

Commit

Permalink
setup purpose groups
Browse files Browse the repository at this point in the history
  • Loading branch information
ambrazasp committed Oct 1, 2024
1 parent 24adea5 commit 6d3a177
Show file tree
Hide file tree
Showing 7 changed files with 165 additions and 21 deletions.
9 changes: 8 additions & 1 deletion create-database.sh
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,19 @@ curl -sf "https://www.registrucentras.lt/aduomenys/?byla=adr_savivaldybes.csv" |
ogr2ogr -append -f GPKG data-sources/parcels.gpkg "data-sources/gis_pub_parcels_$code.json" -nln polygons
done

# Importing purpose groups
echo "Importing purpose groups"
curl -f -L --max-redirs 5 --retry 3 -o data-sources/purpose_groups.psv https://www.registrucentras.lt/aduomenys/?byla=klas_Paskirties_grupes.csv
calculate_md5 data-sources/purpose_groups.psv >> data-sources/data-source-checksums.txt
ogr2ogr -append -f SQLite boundaries.sqlite data-sources/purpose_groups.psv -lco FID=group_id \
-sql "SELECT CAST(pasg_grupe AS integer(8)) AS group_id, pasg_pav AS name, pasg_pav_i AS full_name, pasg_koregavimo_data AS updated_at FROM purpose_groups"

# Importing purpose types
echo "Importing purpose types"
curl -f -L --max-redirs 5 --retry 3 -o data-sources/purpose_types.psv https://www.registrucentras.lt/aduomenys/?byla=klas_NTR_paskirciu_tipai.csv
calculate_md5 data-sources/purpose_types.psv >> data-sources/data-source-checksums.txt
ogr2ogr -append -f SQLite boundaries.sqlite data-sources/purpose_types.psv -lco FID=purpose_id \
-sql "SELECT CAST(pask_tipas AS integer(8)) AS purpose_id, CAST(pasg_grupe AS integer(8)) AS purpose_group, pask_pav AS name, pask_pav_i AS full_name, pask_pav_i_en AS full_name_en, pask_koregavimo_data AS updated_at FROM purpose_types"
-sql "SELECT CAST(pask_tipas AS integer(8)) AS purpose_id, CAST(pasg_grupe AS integer(8)) AS purpose_group_id, pask_pav AS name, pask_pav_i AS full_name, pask_pav_i_en AS full_name_en, pask_koregavimo_data AS updated_at FROM purpose_types"

# Importing status types
echo "Importing status types"
Expand Down
69 changes: 65 additions & 4 deletions src/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -780,6 +780,67 @@
}
}

openapi_examples_purpose_groups_filtering: Dict[str, Example] = {
"example_purpose_groups_ids": {
"summary": "Filter by purpose group IDs",
"description": "Retrieve data for purpose groups by specifying purpose group IDs.",
"value": {
"filters": [
{
"purpose_groups": {
"group_ids": [9]
}
}
]
}
},
"example_purpose_group_name_contains": {
"summary": "Filter by purpose type name containing substring",
"description": "Retrieve data for purpose types where purpose type name contains the specified substring.",
"value": {
"filters": [
{
"purpose_groups": {
"name": {
"contains": "naudojimo"
}
}
}
]
}
},
"example_purpose_group_name_exact": {
"summary": "Filter by purpose group exact name",
"description": "Retrieve data for purpose groups matching the exact purpose group name.",
"value": {
"filters": [
{
"purpose_groups": {
"name": {
"exact": "žemės naudojimo"
}
}
}
]
}
},
"example_purpose_group_name_starts": {
"summary": "Filter by purpose group name starting with prefix",
"description": "Retrieve data for purpose groups where purpose group name starts with the specified prefix.",
"value": {
"filters": [
{
"purpose_groups": {
"name": {
"starts": "žemės"
}
}
}
]
}
}
}

openapi_examples_purpose_types_filtering: Dict[str, Example] = {
"example_purpose_types_ids": {
"summary": "Filter by purpose IDs",
Expand Down Expand Up @@ -825,8 +886,8 @@
}
},
"example_purpose_types_name_starts": {
"summary": "Filter by purpose type cadastral number starting with prefix",
"description": "Retrieve data for purpose types where purpose type cadastral number starts with the specified prefix.",
"summary": "Filter by purpose type name starting with prefix",
"description": "Retrieve data for purpose types where purpose type name starts with the specified prefix.",
"value": {
"filters": [
{
Expand Down Expand Up @@ -887,8 +948,8 @@
}
},
"example_status_types_name_starts": {
"summary": "Filter by status type cadastral number starting with prefix",
"description": "Retrieve data for status types where status type cadastral number starts with the specified prefix.",
"summary": "Filter by status type name starting with prefix",
"description": "Retrieve data for status types where status type name starts with the specified prefix.",
"value": {
"filters": [
{
Expand Down
32 changes: 29 additions & 3 deletions src/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,35 @@ class Meta:
geom_field = models.Addresses.geom


class PurposeTypesFilter(BaseFilter):
class PurposeGroupsFilter(BaseFilter):

def apply(
self,
search_filter: schemas.PurposeGroupsSearchFilterRequest,
db: Session
) -> Iterator[ColumnExpressionArgument]:
yield from super().apply(search_filter, db)

if groups_filter := search_filter.purpose_groups:
yield from self._apply_purpose_groups_filters(groups_filter)

@staticmethod
def _apply_purpose_groups_filters(groups_filter: schemas.PurposeGroupFilter) -> Iterator[ColumnExpressionArgument]:

group_ids = groups_filter.group_ids
if group_ids and len(group_ids) > 0:
yield models.PurposeGroups.group_id.in_(group_ids)

if groups_filter.name:
yield from _filter_by_string_field(string_filter=groups_filter.name,
string_field=models.PurposeGroups.name)

if groups_filter.full_name:
yield from _filter_by_string_field(string_filter=groups_filter.full_name,
string_field=models.PurposeGroups.full_name)


class PurposeTypesFilter(PurposeGroupsFilter):

def apply(
self,
Expand All @@ -261,8 +289,6 @@ def _apply_purposes_filters(purpose_filter: schemas.PurposeTypeFilter) -> Iterat
if purpose_ids and len(purpose_ids) > 0:
yield models.PurposeTypes.purpose_id.in_(purpose_ids)

if purpose_filter.purpose_group:
yield models.PurposeTypes.purpose_group == purpose_filter.purpose_group

if purpose_filter.name:
yield from _filter_by_string_field(string_filter=purpose_filter.name,
Expand Down
18 changes: 17 additions & 1 deletion src/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,27 @@ class StatusTypes(Base):

parcels = relationship("Parcels", back_populates="status")


class PurposeGroups(Base):
__tablename__ = "purpose_groups"

group_id = Column(Integer, primary_key=True)

name = Column(String, nullable=False)
full_name = Column(String, nullable=False)

updated_at = Column(Date, nullable=False)

purpose_types = relationship("PurposeTypes", back_populates="purpose_group")


class PurposeTypes(Base):
__tablename__ = "purpose_types"

purpose_id = Column(Integer, primary_key=True)
purpose_group = Column(Integer)

purpose_group_id = Column(Integer, ForeignKey("purpose_groups.group_id"), nullable=True)
purpose_group = relationship("PurposeGroups", back_populates="purpose_types")

name = Column(String, nullable=False)
full_name = Column(String, nullable=False)
Expand Down
1 change: 1 addition & 0 deletions src/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ def parcels_search(
**constants.openapi_examples_parcels_filtering,
**constants.openapi_examples_purpose_types_filtering,
**constants.openapi_examples_status_types_filtering,
**constants.openapi_examples_purpose_groups_filtering,
**constants.openapi_examples_municipalities_filtering,
**constants.openapi_examples_geometry_filtering,
})
Expand Down
47 changes: 36 additions & 11 deletions src/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,20 +180,26 @@ class Room(BaseModel):
address: ShortAddress = Field(description="Address of the room")


class PurposeGroup(BaseModel):
group_id: int = Field(description="Purpose group ID")
name: str = Field(description="Purpose group name")
full_name: str = Field(description="Purpose group full name")


class Purpose(BaseModel):
purpose_id: int = Field(description="Purpose ID")
purpose_group: int = Field(description="Purpose group")
purpose_group: Optional[PurposeGroup] = Field(description="Purpose group")
name: str = Field(description="Purpose name")
full_name: str = Field(description="Purpose full name")
full_name_en: str = Field(description="Purpose full name in english")


class Status(BaseModel):
status_id: int = Field(description="Status ID")
name: str = Field(description="Purpose name")
name_en: str = Field(description="Purpose name in english")
full_name: str = Field(description="Purpose full name")
full_name_en: str = Field(description="Purpose full name in english")
name: str = Field(description="Status name")
name_en: str = Field(description="Status name in english")
full_name: str = Field(description="Status full name")
full_name_en: str = Field(description="Status full name in english")


class Parcel(BaseModel):
Expand Down Expand Up @@ -414,11 +420,6 @@ class PurposeTypeFilter(BaseModel):
description="Filter by purpose IDs",
)

purpose_group: Optional[int] = Field(
default=None,
description="Filter by purpose group"
)

name: Optional[StringFilter] = Field(
default=None,
description="Filter by name"
Expand All @@ -435,6 +436,23 @@ class PurposeTypeFilter(BaseModel):
)


class PurposeGroupFilter(BaseModel):
group_ids: Optional[List[int]] = Field(
default=None,
description="Filter by purpose group IDs",
)

name: Optional[StringFilter] = Field(
default=None,
description="Filter by name"
)

full_name: Optional[StringFilter] = Field(
default=None,
description="Filter by full name"
)


class StatusTypesFilter(BaseModel):
status_ids: Optional[List[int]] = Field(
default=None,
Expand Down Expand Up @@ -541,7 +559,14 @@ class RoomsSearchFilterRequest(AddressesSearchFilterRequest):
)


class PurposeTypesSearchFilterRequest(BaseModel):
class PurposeGroupsSearchFilterRequest(BaseModel):
purpose_groups: Optional[PurposeGroupFilter] = Field(
default=None,
description="Filter by purpose groups",
)


class PurposeTypesSearchFilterRequest(PurposeGroupsSearchFilterRequest):
purposes: Optional[PurposeTypeFilter] = Field(
default=None,
description="Filter by purposes",
Expand Down
10 changes: 9 additions & 1 deletion src/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,19 @@
type_=JSONB,
).label("address")

_purpose_group_object = func.json_object(
text("'group_id', purpose_groups.group_id"),
text("'name', purpose_groups.name"),
text("'full_name', purpose_groups.full_name"),
type_=JSONB,
).label("purpose_group")

_purpose_type_object = func.json_object(
text("'purpose_id', purpose_types.purpose_id"),
text("'purpose_group', purpose_types.purpose_group"),
text("'name', purpose_types.name"),
text("'full_name', purpose_types.full_name"),
text("'full_name_en', purpose_types.full_name_en"),
"purpose_group", _purpose_group_object,
type_=JSONB,
).label("purpose")

Expand Down Expand Up @@ -386,6 +393,7 @@ def _get_select_query(
.outerjoin(models.Parcels.municipality) \
.outerjoin(models.Parcels.purpose) \
.outerjoin(models.Parcels.status) \
.outerjoin(models.PurposeTypes.purpose_group) \
.outerjoin(models.Municipalities.county)

# Currently not implemented - unique numbers are duplicates
Expand Down

0 comments on commit 6d3a177

Please sign in to comment.