def insert_new_level(request): level_data = copy.copy(request.data) program = Program.objects.get(id=request.data['program']) role = request.user.tola_user.program_role(program.id) if request.user.is_anonymous or role != 'high': return HttpResponseRedirect('/') # Update new Level data in preparation for saving if request.data['parent'] == "root": parent = None else: parent = Level.objects.get(id=request.data['parent']) level_data['parent'] = parent level_data['program'] = program if 'ontology' in request.data: del level_data['ontology'] del level_data['level_depth'] # First update the customsort values of all Levels that getting pushed down by the new Level. # No need to do it if the top tier level is being saved if request.data['parent'] != "root": levels_to_shift = Level.objects\ .filter(program=program, parent_id=parent.id, customsort__gte=request.data['customsort'])\ .order_by('-customsort') for s_level in levels_to_shift: s_level.customsort += 1 s_level.save() new_level = Level(**level_data) try: new_level.full_clean() except ValidationError as e: return Response(e.message_dict, status=400) # Now the new level can be saved new_level.save() # Return all Levels for the program. There shouldn't be so much that it slows things down much. # Also return the newly created Level. all_data = LevelSerializer(Level.objects.filter(program=program), many=True).data return Response({ 'all_data': all_data, 'new_level': LevelSerializer(new_level).data })
def create_levels(program_id, level_data): fixture_data = deepcopy(level_data) tier_labels = LevelTier.get_templates()['mc_standard']['tiers'] for i, tier in enumerate(tier_labels): t = LevelTier(name=tier, tier_depth=i+1, program_id=program_id) t.save() level_map = {} for level_fix in fixture_data: parent = None if 'parent_id' in level_fix['fields']: parent = level_map[level_fix['fields'].pop('parent_id')] level = Level(**level_fix['fields']) level.parent = parent level.program = Program.objects.get(id=program_id) level.save() level_map[level_fix['pk']] = level