def edit_form_data_group(req, group_id): """Edit a model-defined group of forms""" group = get_object_or_404(FormDataGroup, id=group_id) form_validation = None if req.method == "POST": group_form = FormDataGroupForm(req.POST, instance=group) if group_form.is_valid(): if "formdefs" in req.POST: form_ids = req.POST.getlist("formdefs") if not form_ids: form_validation = "You must choose at least one form!" else: group = group_form.save() set_forms = [FormDefModel.objects.get(id=form_id) for form_id in form_ids] previous_forms = group.forms.all() new_forms = [form for form in set_forms if form not in previous_forms] deleted_forms = [form for form in previous_forms if form not in set_forms] # don't forget to do all the default column updates as well. for form in new_forms: group.add_form(form) for form in deleted_forms: group.remove_form(form) if new_forms or deleted_forms: # finally, if anything changed update the sql view group.update_view() # and take them back to the viewing page return HttpResponseRedirect(reverse('xformmanager.views.form_data_group', kwargs={"group_id": group.id })) else: form_validation = "You must choose at least one form!" else: group_form = FormDataGroupForm(instance=group) all_forms = FormDefModel.objects.filter(domain=req.user.selected_domain)\ .order_by("target_namespace", "version") selected_forms = group.forms.all() unused_forms = [form for form in all_forms if form not in selected_forms] return render_to_response(req, "xformmanager/edit_form_data_group.html", {"group_form": group_form, "group": group, "selected_forms": selected_forms, "all_forms": unused_forms, "form_validation": form_validation })
def new_form_data_group(req): """Create a new model-defined group of forms""" form_validation = None if req.method == "POST": form = FormDataGroupForm(req.POST) if form.is_valid(): if "formdefs" in req.POST: form_ids = req.POST.getlist("formdefs") if not form_ids: form_validation = "You must choose at least one form!" else: new_group = form.save(commit=False) new_group.domain = req.user.selected_domain # TODO: better handling of the name attribute. new_group.name = get_unique_value(FormDataGroup.objects, "name", new_group.display_name) forms = [FormDefModel.objects.get(id=form_id) for form_id in form_ids] new_group.save() new_group.forms = forms new_group.save() # don't forget to do all the default column updates as well. for form in forms: new_group.add_form_columns(form) # finally update the sql view new_group.update_view() # when done, take them to the edit page for further tweaking return HttpResponseRedirect(reverse('xformmanager.views.edit_form_data_group', kwargs={"group_id": new_group.id })) else: form_validation = "You must choose at least one form!" else: form = FormDataGroupForm() all_forms = FormDefModel.objects.filter(domain=req.user.selected_domain)\ .order_by("target_namespace", "version") return render_to_response(req, "xformmanager/edit_form_data_group.html", {"group_form": form, "all_forms": all_forms, "selected_forms": [], "form_validation": form_validation })