def _process_request_form(request): """A helper function for getting info out of a request composer form""" form = RequestForm(request.POST, request=request) foia_request = {} if form.is_valid(): data = form.cleaned_data if request.user.is_anonymous(): _make_user(request, data) title = data['title'] document = data['document'] level = data['jurisdiction'] if level == 'f': jurisdiction = Jurisdiction.objects.filter(level='f')[0] elif level == 's': jurisdiction = data['state'] else: jurisdiction = data['local'] agency_query = Agency.objects.filter(name=data['agency'], jurisdiction=jurisdiction) agency = agency_query[0] if agency_query \ else _make_new_agency(request, data['agency'], jurisdiction) foia_request.update({ 'title': title, 'document': document, 'jurisdiction': jurisdiction, 'agency': agency, }) return foia_request
def create_request(request): """A very important view for composing FOIA requests""" # pylint: disable=too-many-locals # we should refactor this, its too long, and remove the pylint disable initial_data = {} clone = False parent = None try: foia_pk = request.GET['clone'] foia = get_object_or_404(FOIARequest, pk=foia_pk) if not foia.has_perm(request.user, 'view'): raise Http404() initial_data = { 'title': foia.title, 'document': smart_text(foia.requested_docs), 'agency': foia.agency.name if foia.agency else '' } jurisdiction = foia.jurisdiction level = jurisdiction.level if level == 's': initial_data['state'] = jurisdiction elif level == 'l': initial_data['local'] = jurisdiction initial_data['jurisdiction'] = level clone = True parent = foia except (KeyError, ValueError): # KeyError if no clone was passed in # Value error if invalid clone is passed in pass if request.method == 'POST': foia_request = _process_request_form(request) if foia_request: foia, foia_comm = _make_request(request, foia_request, parent) foia_comm.save() foia.save(comment='request drafted') request.session['ga'] = 'request_drafted' return redirect(foia) else: # form is invalid # autocomplete blows up if you pass it a bad value in state # or local - not sure how this is happening, but am removing # non numeric values for these keys # this seems to technically be a bug in autocompletes rendering # should probably fix it there and submit a patch post = request.POST.copy() for chk_val in ['local', 'state']: try: chk_val in post and int(post[chk_val]) except (ValueError, TypeError): del post[chk_val] form = RequestForm(post, request=request) else: if clone: form = RequestForm(initial=initial_data, request=request) else: form = RequestForm(request=request) featured = (FOIARequest.objects.get_viewable(request.user).filter( featured=True).select_related_view().get_public_file_count()) context = {'form': form, 'clone': clone, 'featured': featured} return render( request, 'forms/foia/create.html', context, )