def edit_specialty(request, specialty_id): from forms import SpecialtyForm, GroupInlineForm, SpecialistInlineForm specialty = get_object_or_404(Specialty, id=specialty_id) if request.method == 'POST': group_forms = [] # get all the groups groups = request.POST.get('groups_list','').split(',') if not any(groups): groups = [] group_forms = [] for x in groups: # get the specialists in the group, or make an empty list if there arent any specialists = request.POST.get('g%s-specialists_list' % x, '').split(',') if not any(specialists): specialists = [] try: # if the group exists in the DB, we need a form for an instance group = specialty.groups.get(pk=x) group_form = GroupInlineForm(request.POST, prefix="g%s" % x, instance=group) except Group.DoesNotExist: # if the group doesnt exist in the DB, just make a form with no instance group = None group_form = GroupInlineForm(request.POST, prefix="g%s" % x) # if the group does exist in the DB, then there might be existing Specialists too if group: specialist_forms = [] for s in specialists: try: # if existing Specialist, create form with a Specialist instance specialist = group.specialists.get(pk=s) specialist_forms.append(SpecialistInlineForm(request.POST, prefix="g%s-s%s" % (x,s), instance=specialist)) except Specialist.DoesNotExist: specialist = None specialist_forms.append(SpecialistInlineForm(request.POST, prefix="g%s-s%s" % (x,s))) else: specialist_forms = [SpecialistInlineForm(request.POST, prefix="g%s-s%s" %(x,y)) for y in specialists], group_forms.append( { 'group': group_form, 'specialists' : specialist_forms, 'specialist_list' : specialists, } ) specialty_form = SpecialtyForm(request.POST, instance=specialty) context_dict = { 'specialty_form': specialty_form, 'group_forms' : group_forms, 'group_meta' : Group()._meta, 'specialist_meta' : Specialist()._meta, 'specialist_reference_form' : SpecialistInlineForm(), 'groups_list' : groups, } # validate all forms validations = [ specialty_form.is_valid(), all([ gf['group'].is_valid() for gf in group_forms]), all([ sf.is_valid() for gf in group_forms for sf in gf['specialists'] if type(sf) != type([]) ]), ] if all(validations): new_specialty = specialty_form.save(commit=False) new_specialty.slug = slugify(new_specialty.name) new_specialty.save() for gf in group_forms: new_group = gf['group'].save(commit=False) new_group.specialty = new_specialty new_group.save() for specialist_form in gf['specialists']: if type(sf) != type([]): new_specialist = specialist_form.save(commit=False) new_specialist.group = new_group new_specialist.save() cache_invalidate_specialty(0, new_specialty.id) return HttpResponseRedirect(reverse('show_filtered_list', kwargs = {'doctor' : 'department', 'specialty' : new_specialty.slug} )) else: groups_list = [str(grp.id) for grp in specialty.groups.all()] specialty_form = SpecialtyForm(instance=specialty, initial={'groups_list': ",".join(groups_list)}) group_forms = [] for grp in specialty.groups.all(): specialists = [ str(spec.id) for spec in grp.specialists.all() ] group_forms.append( { 'group': GroupInlineForm(prefix="g%s" % grp.id, instance=grp, initial={'specialists_list':",".join(specialists)}), 'specialists' : [SpecialistInlineForm(prefix="g%s-s%s" %(grp.id,spec.id), instance=spec) for spec in grp.specialists.all()], 'specialist_list' : specialists, } ) context_dict = {'specialty_id' : specialty_id, 'specialty_form': specialty_form, 'group_meta' : Group()._meta, 'specialist_meta' : Specialist()._meta, 'group_forms' : group_forms, 'specialist_reference_form' : SpecialistInlineForm(), 'groups_list' : [ grp.id for grp in specialty.groups.all()], } return render_to_response('specialty_one_shot.html', context_dict, context_instance=RequestContext(request))
def add_specialty(request,): from forms import SpecialtyAddForm as SpecialtyForm from forms import GroupInlineForm, SpecialistInlineForm if request.method == 'POST': specialty_form = SpecialtyForm(request.POST) group_forms = [] groups = request.POST.get('groups_list','').split(',') if not any(groups): groups = [] group_forms = [] for x in groups: specialists = request.POST.get('g%s-specialists_list' % x, '').split(',') if not any(specialists): specialists = [] group_forms.append( { 'group': GroupInlineForm(request.POST, prefix="g%s" % x), 'specialists' : [SpecialistInlineForm(request.POST, prefix="g%s-s%s" %(x,y)) for y in specialists], 'specialist_list' : specialists, } ) context_dict = { 'specialty_form': specialty_form, 'group_forms' : group_forms, 'group_meta' : Group()._meta, 'specialist_meta' : Specialist()._meta, 'specialist_reference_form' : SpecialistInlineForm(), 'groups_list' : groups, } # validate all forms validations = [ specialty_form.is_valid(), all([ gf['group'].is_valid() for gf in group_forms]), all([ sf.is_valid() for gf in group_forms for sf in gf['specialists']]), ] if all(validations): new_specialty = specialty_form.save(commit=False) new_specialty.slug = slugify(new_specialty.name) new_specialty.save() for gf in group_forms: new_group = gf['group'].save(commit=False) new_group.specialty = new_specialty new_group.save() for specialist_form in gf['specialists']: if type(sf) != type([]): new_specialist = specialist_form.save(commit=False) new_specialist.group = new_group new_specialist.save() cache_invalidate_specialty(0, 0) return HttpResponseRedirect(reverse('show_filtered_list', kwargs = {'doctor' : 'department', 'specialty' : new_specialty.slug} )) else: specialty_form = SpecialtyForm() group_forms = [] context_dict = { 'specialty_form': specialty_form, 'group_meta' : Group()._meta, 'specialist_meta' : Specialist()._meta, 'group_forms' : group_forms, 'specialist_reference_form' : SpecialistInlineForm(), 'groups_list' : [], } return render_to_response('specialty_one_shot.html', context_dict, context_instance=RequestContext(request))