Files
keinasystem/backend/apps/fields/views.py
Akira 543de30b1c Day 5 の作付け計画API実装が完了しました。
実装内容
バグ修正
- fields/views.py: OfficialChusakanField → OfficialChusankanField
init_crops コマンド
 python manage.py init_crops
水稲: 5 varieties
大豆: 3 varieties
小麦: 2 varieties
そば: 2 varieties
とうきび: 1 varieties
serializers.py
- CropSerializer - 作物マスタ
- VarietySerializer - 品種マスタ
- PlanSerializer - 作付け計画(crop_name, variety_name, field_name 付き)
views.py
- CropViewSet, VarietyViewSet, PlanViewSet
- アクション: summary, copy_from_previous_year, get_crops_with_varieties
API エンドポイント
- /api/plans/crops/ - 作物一覧
- /api/plans/varieties/ - 品種一覧
- /api/plans/ - 作付け計画CRUD
- /api/plans/summary/?year=2025 - 集計
テスト結果
GET /api/plans/crops/ → 
GET /api/plans/ →  (空配列)
2026-02-15 12:10:38 +09:00

134 lines
4.7 KiB
Python

import pandas as pd
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from .models import OfficialKyosaiField, OfficialChusankanField, Field
@csrf_exempt
@require_http_methods(["POST"])
def import_kyosai_master(request):
if 'file' not in request.FILES:
return JsonResponse({'error': 'No file uploaded'}, status=400)
ods_file = request.FILES['file']
try:
df = pd.read_excel(ods_file, engine='odf')
created_count = 0
updated_count = 0
for _, row in df.iterrows():
k_num = str(row.get('k_num', '')).strip() if pd.notna(row.get('k_num')) else ''
s_num = str(row.get('s_num', '')).strip() if pd.notna(row.get('s_num')) else ''
if not k_num:
continue
defaults = {
's_num': s_num,
'address': str(row.get('address', '')).strip() if pd.notna(row.get('address')) else '',
'kanji_name': str(row.get('kanji_name', '')).strip() if pd.notna(row.get('kanji_name')) else '',
'area': float(row.get('area', 0)) if pd.notna(row.get('area')) else 0,
}
obj, created = OfficialKyosaiField.objects.update_or_create(
k_num=k_num,
defaults=defaults
)
if created:
created_count += 1
else:
updated_count += 1
return JsonResponse({
'success': True,
'created': created_count,
'updated': updated_count,
'message': f'共済マスタ: {created_count}件作成, {updated_count}件更新'
})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
@csrf_exempt
@require_http_methods(["POST"])
def import_yoshida_fields(request):
if 'file' not in request.FILES:
return JsonResponse({'error': 'No file uploaded'}, status=400)
ods_file = request.FILES['file']
try:
df = pd.read_excel(ods_file, engine='odf')
created_count = 0
updated_count = 0
for _, row in df.iterrows():
name = str(row.get('name', '')).strip() if pd.notna(row.get('name')) else ''
if not name:
continue
raw_kyosai_k = str(int(row.get('raw_kyosai_k_num', 0))) if pd.notna(row.get('raw_kyosai_k_num')) else None
raw_kyosai_s = str(int(row.get('raw_kyosai_s_num', 0))) if pd.notna(row.get('raw_kyosai_s_num')) else None
raw_chusankan = str(int(row.get('raw_chusankan_id', 0))) if pd.notna(row.get('raw_chusankan_id')) else None
area_tan = float(row.get('area_tan', 0)) if pd.notna(row.get('area_tan')) else 0
area_m2 = int(row.get('area_m2', 0)) if pd.notna(row.get('area_m2')) else 0
defaults = {
'address': str(row.get('address', '')).strip() if pd.notna(row.get('address')) else '',
'area_tan': area_tan,
'area_m2': area_m2,
'owner_name': str(row.get('owner_name', '')).strip() if pd.notna(row.get('owner_name')) else '',
'raw_kyosai_k_num': raw_kyosai_k,
'raw_kyosai_s_num': raw_kyosai_s,
'raw_chusankan_id': raw_chusankan,
}
field, created = Field.objects.update_or_create(
name=name,
defaults=defaults
)
if created:
created_count += 1
else:
updated_count += 1
if raw_kyosai_k:
try:
kyosai_record = OfficialKyosaiField.objects.get(k_num=raw_kyosai_k)
field.kyosai_fields.add(kyosai_record)
except OfficialKyosaiField.DoesNotExist:
pass
if raw_kyosai_s:
try:
kyosai_record = OfficialKyosaiField.objects.get(s_num=raw_kyosai_s)
field.kyosai_fields.add(kyosai_record)
except OfficialKyosaiField.DoesNotExist:
pass
if raw_chusankan:
try:
chusankan_record = OfficialChusankanField.objects.get(c_id=raw_chusankan)
field.chusankan_fields.add(chusankan_record)
except OfficialChusankanField.DoesNotExist:
pass
return JsonResponse({
'success': True,
'created': created_count,
'updated': updated_count,
'message': f'実圃場: {created_count}件作成, {updated_count}件更新'
})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)