add bulk import endpoint for assessments with legacy JSON support
All checks were successful
Build & Push / Build & Push image (push) Successful in 40s
All checks were successful
Build & Push / Build & Push image (push) Successful in 40s
This commit is contained in:
@@ -126,6 +126,80 @@ def save_assessment():
|
|||||||
detail={'status': status})
|
detail={'status': status})
|
||||||
return jsonify({'assessment': assessment.to_dict()})
|
return jsonify({'assessment': assessment.to_dict()})
|
||||||
|
|
||||||
|
@api_bp.route('/assessments/bulk-import', methods=['POST'])
|
||||||
|
@login_required
|
||||||
|
@limiter.limit('5 per minute')
|
||||||
|
def bulk_import_assessments():
|
||||||
|
"""
|
||||||
|
Importeer beoordelingen vanuit de legacy standalone JSON export.
|
||||||
|
Body: { "vakken": { "vak_id": { "goal_id": "status", ... }, ... } }
|
||||||
|
of v4 formaat: { "vakken": { "vak_id": { "statussen": { "goal_id": "status" } } } }
|
||||||
|
"""
|
||||||
|
if not current_user.school_id:
|
||||||
|
return jsonify({'error': 'Account niet gekoppeld aan een school'}), 400
|
||||||
|
|
||||||
|
school_year = get_active_year(current_user.school_id)
|
||||||
|
if not school_year:
|
||||||
|
return jsonify({'error': 'Geen actief schooljaar'}), 400
|
||||||
|
|
||||||
|
data = request.get_json() or {}
|
||||||
|
vakken = data.get('vakken', {})
|
||||||
|
if not vakken:
|
||||||
|
return jsonify({'error': 'Geen vakken gevonden in payload'}), 400
|
||||||
|
|
||||||
|
totaal = 0
|
||||||
|
fouten = 0
|
||||||
|
|
||||||
|
for vak_id, vak_data in vakken.items():
|
||||||
|
if not isinstance(vak_id, str) or len(vak_id) > 100:
|
||||||
|
fouten += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Ondersteun zowel { statussen: {...} } als { goal_id: status }
|
||||||
|
if isinstance(vak_data, dict) and 'statussen' in vak_data:
|
||||||
|
statussen = vak_data['statussen']
|
||||||
|
else:
|
||||||
|
statussen = vak_data
|
||||||
|
|
||||||
|
if not isinstance(statussen, dict):
|
||||||
|
continue
|
||||||
|
|
||||||
|
for goal_id, status in statussen.items():
|
||||||
|
if not isinstance(goal_id, str) or len(goal_id) > 50:
|
||||||
|
fouten += 1
|
||||||
|
continue
|
||||||
|
if status not in ('groen', 'oranje', 'roze'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
assessment = Assessment.query.filter_by(
|
||||||
|
user_id=current_user.id,
|
||||||
|
school_year_id=school_year.id,
|
||||||
|
vak_id=vak_id,
|
||||||
|
goal_id=goal_id,
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if assessment:
|
||||||
|
assessment.status = status
|
||||||
|
assessment.updated_at = datetime.utcnow()
|
||||||
|
else:
|
||||||
|
db.session.add(Assessment(
|
||||||
|
user_id=current_user.id,
|
||||||
|
school_id=current_user.school_id,
|
||||||
|
school_year_id=school_year.id,
|
||||||
|
vak_id=vak_id,
|
||||||
|
goal_id=goal_id,
|
||||||
|
status=status,
|
||||||
|
))
|
||||||
|
totaal += 1
|
||||||
|
except Exception:
|
||||||
|
db.session.rollback()
|
||||||
|
fouten += 1
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
audit_log('assessment.bulk_import', 'assessment',
|
||||||
|
detail={'totaal': totaal, 'fouten': fouten})
|
||||||
|
return jsonify({'totaal': totaal, 'fouten': fouten})
|
||||||
|
|
||||||
# ── Directeur schooloverzicht ──────────────────────────────────────────────────
|
# ── Directeur schooloverzicht ──────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user