59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
from django.core.management.base import BaseCommand
|
|
|
|
from ._spreadsheet_constants import *
|
|
from right_tree.api.models import Habitat, Zone
|
|
|
|
|
|
def load_habitat_zone_data(sheet):
|
|
""" Loads habitat and zone objects from data defined in the spreadsheet.
|
|
"""
|
|
|
|
habitats = set()
|
|
zones = set()
|
|
|
|
current_habitat = current_zone = current_variant = current_refined_variant = None
|
|
|
|
for col in sheet.iter_cols(min_col=SITE_DATA_START_COL, max_col=SITE_DATA_STOP_COL, min_row=HABITAT_ROW, max_row=ZONE_REFINED_VARIANT_ROW):
|
|
habitat, zone_name, zone_variant, zone_refined_variant = (cell.value for cell in col)
|
|
|
|
if habitat is not None:
|
|
current_habitat = habitat
|
|
current_zone = current_variant = current_refined_variant = None
|
|
|
|
if zone_name is not None:
|
|
current_zone = zone_name
|
|
current_variant = current_refined_variant = None
|
|
|
|
if zone_variant is not None:
|
|
current_variant = zone_variant
|
|
current_refined_variant = None
|
|
|
|
current_refined_variant = zone_refined_variant if zone_refined_variant is not None else current_refined_variant
|
|
|
|
habitats.add(current_habitat)
|
|
zones.add((current_habitat, current_zone, current_variant, current_refined_variant, col[0].column_letter))
|
|
|
|
# Create habitats - generally this is not needed for updating
|
|
# for habitat in habitats:
|
|
# habitat_obj = Habitat(name=habitat)
|
|
# habitat_obj.save()
|
|
|
|
for habitat, zone, variant, refined_variant, col_letter in zones:
|
|
|
|
# Retrieve existing objects
|
|
habitat_obj = Habitat.objects.get(name=habitat)
|
|
zone_obj = Zone.objects.get(related_svg_segment=col_letter)
|
|
|
|
# Update fields if required
|
|
zone_obj.name = zone
|
|
zone_obj.variant = variant
|
|
zone_obj.refined_variant = refined_variant
|
|
zone_obj.habitat = habitat_obj
|
|
|
|
# Save the object
|
|
zone_obj.save()
|
|
class Command(BaseCommand):
|
|
help = 'Ingests the site spreadsheet data into the database'
|
|
|
|
def handle(self, *args, **options):
|
|
load_habitat_zone_data(SPREADSHEET)
|