|
1 | 1 | from rest_framework import serializers |
2 | 2 | from rest_framework_gis.serializers import GeoFeatureModelSerializer |
3 | 3 |
|
4 | | -from .models import VectorDataset, VectorItem |
| 4 | +from .models import ( |
| 5 | + RasterDataset, |
| 6 | + TabularDataset, |
| 7 | + TabularItem, |
| 8 | + VectorDataset, |
| 9 | + VectorItem, |
| 10 | +) |
| 11 | + |
| 12 | + |
| 13 | +class RasterDatasetSerializer(serializers.ModelSerializer): |
| 14 | + class Meta: |
| 15 | + model = RasterDataset |
| 16 | + fields = "__all__" |
5 | 17 |
|
6 | 18 |
|
7 | 19 | class VectorDatasetSerializer(serializers.ModelSerializer): |
@@ -30,3 +42,47 @@ def unformat_geojson(self, feature): |
30 | 42 | attrs[self.Meta.bbox_geo_field] = Polygon.from_bbox(feature["bbox"]) |
31 | 43 |
|
32 | 44 | return attrs |
| 45 | + |
| 46 | + |
| 47 | +class TabularDatasetSerializer(serializers.ModelSerializer): |
| 48 | + class Meta: |
| 49 | + model = TabularDataset |
| 50 | + fields = "__all__" |
| 51 | + |
| 52 | + |
| 53 | +class TabularItemSerializer(serializers.ModelSerializer): |
| 54 | + class Meta: |
| 55 | + model = TabularItem |
| 56 | + fields = ["id", "data"] |
| 57 | + |
| 58 | + def to_representation(self, instance): |
| 59 | + representation = super().to_representation(instance) |
| 60 | + |
| 61 | + # Extract the data field and merge it with the top level fields |
| 62 | + data_content = representation.pop("data", {}) |
| 63 | + |
| 64 | + return {**representation, **data_content} |
| 65 | + |
| 66 | + |
| 67 | +class TabularItemExcelSerializer(serializers.ModelSerializer): |
| 68 | + # Dynamically add fields based on all possible keys in the data |
| 69 | + def __init__(self, *args, **kwargs): |
| 70 | + super().__init__(*args, **kwargs) |
| 71 | + |
| 72 | + # Get all possible keys from the queryset |
| 73 | + if self.context.get("view"): |
| 74 | + queryset = self.context["view"].get_queryset() |
| 75 | + all_keys = set() |
| 76 | + for item in queryset: |
| 77 | + if item.data and isinstance(item.data, dict): |
| 78 | + all_keys.update(item.data.keys()) |
| 79 | + |
| 80 | + # Create a field for each key |
| 81 | + for key in all_keys: |
| 82 | + self.fields[key] = serializers.CharField( |
| 83 | + source=f"data.{key}", required=False, allow_blank=True, default="" |
| 84 | + ) |
| 85 | + |
| 86 | + class Meta: |
| 87 | + model = TabularItem |
| 88 | + fields = ["id"] |
0 commit comments