def file_delete(request, lang, path, name): try: page = Page(path, lang) except InvalidPageError: return HttpResponseNotFound() if page.lpath != path: return HttpResponseNotFound() try: file = File(page, name) except InvalidFileError: return HttpResponseNotFound() if request.method == u'POST': button = clean_button(request.POST, [u'delete']) if button == u'delete': file.delete() return HttpResponseRedirect(reverse(u'admin:pages_edit', args=[lang, page.lpath])) else: # Invalid button return HttpResponseBadRequest() return render(request, u'pages/admin/file_delete.html', { u'title': u'Delete Page Attachment', u'lang': lang, u'page': page, u'file': file, })
def delete(request, lang, path): try: page = Page(path, lang, keep_last=True) except InvalidPageError: return HttpResponseNotFound() if page.lpath != path: return HttpResponseNotFound() if page.is_root: return HttpResponseNotFound() if request.method == u'POST': button = clean_button(request.POST, [u'delete']) if button == u'delete': page.delete() return HttpResponseRedirect(reverse(u'admin:pages_index', args=[lang])) else: # Invalid button return HttpResponseBadRequest() return render(request, u'pages/admin/delete.html', { u'title': u'Delete Page', u'lang': lang, u'page': page, })
def wizard_view(wizard_class, request, index, *args, **kwargs): try: wizard = wizard_class(request, index, *args, **kwargs) except WizzardRollback as e: return HttpResponseRedirect(e.step.get_url()) if request.method != u'POST': return wizard.current_step.render() button = clean_button(request.POST, [u'save', u'next']) if button == u'save': wizard.commit() return HttpResponseRedirect(wizard.current_step.get_url()) if button == u'next': if not wizard.current_step.is_valid(): return wizard.current_step.render() wizard.commit() if not wizard.current_step.is_last(): return HttpResponseRedirect(wizard.next_step().get_url()) url = wizard.finish() wizard.reset() return HttpResponseRedirect(url) raise SuspiciousOperation()
def index(request): if request.method == u'POST': button = clean_button(request.POST, [u'jump', u'reset']) if button == u'jump': form = forms.WarpForm(request.POST) if form.is_valid(): jumpto = form.cleaned_data[u'jumpto'] speedup = form.cleaned_data[u'speedup'] if jumpto is not None or speedup is not None: timewarp.jump(jumpto, speedup) return HttpResponseRedirect(reverse(u'admin:timewarp')) elif button == u'reset': timewarp.reset() return HttpResponseRedirect(reverse(u'admin:timewarp')) else: # invalid button form = forms.WarpForm() else: form = forms.WarpForm() return render(request, u'timewarp/timewarp.html', { u'timewarp': timewarp, u'form': form, u'title': u'Timewarp', })
def wizard_view(wizard_class, request, index, finish, *args, **kwargs): if issubclass(wizard_class, WizardGroup): wizard = wizard_class.find_applicable(request, *args, **kwargs) else: wizard = wizard_class(request, *args, **kwargs) try: wizard.step(index) except WizzardRollback as e: return HttpResponseRedirect(e.step.get_url()) if request.method != u'POST': return wizard.current_step.render() button = clean_button(request.POST, [u'save', u'next']) if button == u'save': wizard.commit() return HttpResponseRedirect(wizard.current_step.get_url()) if button == u'next': if not wizard.current_step.is_valid(): return wizard.current_step.render() wizard.commit() if not wizard.current_step.is_last(): return HttpResponseRedirect(wizard.next_step().get_url()) url = finish(wizard) wizard.reset() return HttpResponseRedirect(url) return HttpResponseBadRequest()
def file_create_or_edit(request, lang, path, name, create): u""" If ``create`` is False, then ``name`` should point to the page file we want to edit. If ``create`` is True, then ``name`` is ignored. """ try: page = Page(path, lang) except InvalidPageError: raise Http404() if page.lpath != path: raise Http404() try: file = File(page, name) if not create else None except InvalidFileError: raise Http404() if request.method == u'POST': button = clean_button(request.POST, [u'save', u'save-and-continue']) if button in [u'save', u'save-and-continue']: form = forms.FileEditForm(page, file, create, request.POST, request.FILES) if form.is_valid(): try: new_file = form.save() except forms.FormSaveError: pass else: if button == u'save': return HttpResponseRedirect( reverse(u'admin:pages_edit', args=[lang, page.lpath])) else: # save-and-continue return HttpResponseRedirect( reverse(u'admin:pages_file_edit', args=[lang, page.lpath, new_file.name])) else: # Invalid button raise SuspiciousOperation() else: # GET form = forms.FileEditForm(page, file, create) return render( request, u'pages/admin/file_edit.html', { u'title': u'Add Page Attachment' if create else u'Edit Page Attachment', u'create': create, u'lang': lang, u'page': page, u'file': file, u'form': form, })
def _add_smail(request, inforequest_pk, form_class): assert form_class.action_type in Action.OBLIGEE_ACTION_TYPES inforequest = (Inforequest.objects .not_closed() .owned_by(request.user) .prefetch_related(Inforequest.prefetch_branches(None, Branch.objects.select_related(u'historicalobligee'))) .prefetch_related(Branch.prefetch_last_action(u'branches')) .get_or_404(pk=inforequest_pk) ) if request.method != u'POST': # The user can save a draft even if he may not submit. if inforequest.has_undecided_emails: return HttpResponseNotFound() if not inforequest.can_add_action(form_class.action_type): return HttpResponseNotFound() draft = inforequest.actiondraft_set.filter(type=form_class.action_type).order_by_pk().first() session = Session.objects.get(session_key=request.session.session_key) attached_to = (session, draft) if draft else (session,) if request.method != u'POST': form = form_class(inforequest=inforequest, attached_to=attached_to) if draft: form.load_from_draft(draft) return render_form(request, form, inforequest=inforequest) button = clean_button(request.POST, [u'add', u'draft']) if button == u'draft': form = form_class(request.POST, inforequest=inforequest, attached_to=attached_to, draft=True) if not form.is_valid(): return json_form(request, form, inforequest=inforequest) if not draft: draft = ActionDraft(inforequest=inforequest, type=form_class.action_type) form.save_to_draft(draft) draft.save() return json_draft() if button == u'add': form = form_class(request.POST, inforequest=inforequest, attached_to=attached_to) if not form.is_valid(): return json_form(request, form, inforequest=inforequest) action = Action(type=form_class.action_type) form.save(action) action.save() if draft: draft.delete() # The inforequest was changed, we need to refetch it inforequest = Inforequest.objects.prefetch_detail().get(pk=inforequest.pk) return json_success(request, inforequest, action) return HttpResponseBadRequest()
def file_create_or_edit(request, lang, path, name, create): u""" If ``create`` is False, then ``name`` should point to the page file we want to edit. If ``create`` is True, then ``name`` is ignored. """ try: page = Page(path, lang) except InvalidPageError: raise Http404() if page.lpath != path: raise Http404() try: file = File(page, name) if not create else None except InvalidFileError: raise Http404() if request.method == u'POST': button = clean_button(request.POST, [u'save', u'save-and-continue']) if button in [u'save', u'save-and-continue']: form = forms.FileEditForm(page, file, create, request.POST, request.FILES) if form.is_valid(): try: new_file = form.save() except forms.FormSaveError: pass else: if button == u'save': return HttpResponseRedirect(reverse(u'admin:pages_edit', args=[lang, page.lpath])) else: # save-and-continue return HttpResponseRedirect(reverse(u'admin:pages_file_edit', args=[lang, page.lpath, new_file.name])) else: # Invalid button raise SuspiciousOperation() else: # GET form = forms.FileEditForm(page, file, create) return render(request, u'pages/admin/file_edit.html', { u'title': u'Add Page Attachment' if create else u'Edit Page Attachment', u'create': create, u'lang': lang, u'page': page, u'file': file, u'form': form, })
def create_or_edit(request, lang, path, create): u""" If ``create`` is False, then ``path`` should point to the page we want to edit. If ``create`` is True, then ``path`` should point to the page that will be the parent of the new page. """ try: page = Page(path, lang, keep_last=True) except InvalidPageError: raise Http404() if page.lpath != path: raise Http404() if create and page.is_redirect: raise Http404() if request.method == u'POST': button = clean_button(request.POST, [u'save', u'save-and-continue']) if button in [u'save', u'save-and-continue']: form = forms.PageEditForm(page, create, request.POST) if form.is_valid(): try: new_page = form.save() except forms.FormSaveError: pass else: if button == u'save': return HttpResponseRedirect( reverse(u'admin:pages_index', args=[lang])) else: # save-and-continue return HttpResponseRedirect( reverse(u'admin:pages_edit', args=[lang, new_page.lpath])) else: # Invalid button raise SuspiciousOperation() else: # GET form = forms.PageEditForm(page, create) return render( request, u'pages/admin/edit.html', { u'title': u'Add Page' if create else u'Edit Page', u'create': create, u'lang': lang, u'page': page, u'form': form, })
def new_action_appeal2(request, inforequest_pk, branch_pk): inforequest = Inforequest.objects.not_closed().owned_by(request.user).get_or_404(pk=inforequest_pk) branch = inforequest.branch_set.get_or_404(pk=branch_pk) if not branch.can_add_appeal: return HttpResponseNotFound() if inforequest.has_undecided_emails: return HttpResponseNotFound() wizard = AppealWizards.find_applicable(branch) if request.method != u"POST": wizard.start() return render_step(request, wizard.current_step) try: wizard.step(request.POST) except WizzardRollback as e: return json_step(request, e.step) button = clean_button(request.POST, [u"save", u"prev", u"next"]) if button == u"save": wizard.commit() return json_step(request, wizard.current_step) if button == u"prev": return json_step(request, wizard.prev_step()) if button == u"next": if not wizard.current_step.is_valid(): return json_step(request, wizard.current_step) wizard.commit() if not wizard.current_step.is_last(): return json_step(request, wizard.next_step()) branch.add_expiration_if_expired() action = Action(type=Action.TYPES.APPEAL) wizard.save(action) action.save() # The inforequest was changed, we need to refetch it. inforequest = Inforequest.objects.prefetch_detail().get(pk=inforequest.pk) return json_success(request, inforequest, action) return HttpResponseBadRequest()
def create_or_edit(request, lang, path, create): u""" If ``create`` is False, then ``path`` should point to the page we want to edit. If ``create`` is True, then ``path`` should point to the page that will be the parent of the new page. """ try: page = Page(path, lang, keep_last=True) except InvalidPageError: raise Http404() if page.lpath != path: raise Http404() if create and page.is_redirect: raise Http404() if request.method == u'POST': button = clean_button(request.POST, [u'save', u'save-and-continue']) if button in [u'save', u'save-and-continue']: form = forms.PageEditForm(page, create, request.POST) if form.is_valid(): try: new_page = form.save() except forms.FormSaveError: pass else: if button == u'save': return HttpResponseRedirect(reverse(u'admin:pages_index', args=[lang])) else: # save-and-continue return HttpResponseRedirect( reverse(u'admin:pages_edit', args=[lang, new_page.lpath])) else: # Invalid button raise SuspiciousOperation() else: # GET form = forms.PageEditForm(page, create) return render(request, u'pages/admin/edit.html', { u'title': u'Add Page' if create else u'Edit Page', u'create': create, u'lang': lang, u'page': page, u'form': form, })
def inforequest_create(request, draft_pk=None): template = u'inforequests/create/create.html' draft = InforequestDraft.objects.owned_by(request.user).get_or_404( pk=draft_pk) if draft_pk else None session = Session.objects.get(session_key=request.session.session_key) attached_to = (session, draft) if draft else (session, ) if request.method != u'POST': form = InforequestForm(attached_to=attached_to, user=request.user) if draft: form.load_from_draft(draft) return render(request, template, dict(form=form)) button = clean_button(request.POST, [u'submit', u'draft']) if button == u'draft': form = InforequestForm(request.POST, draft=True, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) if not draft: draft = InforequestDraft(applicant=request.user) form.save_to_draft(draft) draft.save() return HttpResponseRedirect(reverse(u'inforequests:index')) if button == u'submit': form = InforequestForm(request.POST, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) inforequest = Inforequest(applicant=request.user) form.save(inforequest) inforequest.save() inforequest.main_branch.last_action.send_by_email() if draft: draft.delete() return HttpResponseRedirect(inforequest.get_absolute_url()) return HttpResponseBadRequest()
def inforequest_create(request, draft_pk=None): template = u'inforequests/create.html' draft = InforequestDraft.objects.owned_by(request.user).get_or_404(pk=draft_pk) if draft_pk else None session = Session.objects.get(session_key=request.session.session_key) attached_to = (session, draft) if draft else (session,) if request.method != u'POST': form = InforequestForm(attached_to=attached_to, user=request.user) if draft: form.load_from_draft(draft) return render(request, template, dict(form=form)) button = clean_button(request.POST, [u'submit', u'draft']) if button == u'draft': form = InforequestForm(request.POST, draft=True, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) if not draft: draft = InforequestDraft(applicant=request.user) form.save_to_draft(draft) draft.save() return HttpResponseRedirect(reverse(u'inforequests:index')) if button == u'submit': form = InforequestForm(request.POST, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) inforequest = Inforequest(applicant=request.user) form.save(inforequest) inforequest.save() inforequest.main_branch.last_action.send_by_email() if draft: draft.delete() return HttpResponseRedirect(reverse(u'inforequests:detail', args=(inforequest.pk,))) return HttpResponseBadRequest()
def inforequest_create(request, draft_pk=None): template = u"inforequests/create/create.html" draft = InforequestDraft.objects.owned_by(request.user).get_or_404(pk=draft_pk) if draft_pk else None session = Session.objects.get(session_key=request.session.session_key) attached_to = (session, draft) if draft else (session,) if request.method != u"POST": form = InforequestForm(attached_to=attached_to, user=request.user) if draft: form.load_from_draft(draft) return render(request, template, dict(form=form)) button = clean_button(request.POST, [u"submit", u"draft"]) if button == u"draft": form = InforequestForm(request.POST, draft=True, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) if not draft: draft = InforequestDraft(applicant=request.user) form.save_to_draft(draft) draft.save() return HttpResponseRedirect(reverse(u"inforequests:index")) if button == u"submit": form = InforequestForm(request.POST, attached_to=attached_to, user=request.user) if not form.is_valid(): return render(request, template, dict(form=form)) inforequest = form.save() inforequest.save() inforequest.main_branch.last_action.send_by_email() if draft: draft.delete() return HttpResponseRedirect(inforequest.get_absolute_url()) raise SuspiciousOperation()
def test_valid_button(self): post = {u'button': u'valid'} clean = clean_button(post, [u'valid', u'another']) self.assertEqual(clean, u'valid')
def test_missing_button(self): post = {u'other': u'valid'} clean = clean_button(post, [u'valid', u'another']) self.assertIsNone(clean)
def test_default_value(self): post = {u'button': u'invalid'} clean = clean_button(post, [u'valid', u'another'], u'default') self.assertEqual(clean, u'default')
def _new_action(request, inforequest_pk, form_class): assert form_class.action_type in Action.APPLICANT_ACTION_TYPES inforequest = ( Inforequest.objects.not_closed() .owned_by(request.user) .prefetch_related(Inforequest.prefetch_branches(None, Branch.objects.select_related(u"historicalobligee"))) .prefetch_related(Branch.prefetch_last_action(u"branches")) .get_or_404(pk=inforequest_pk) ) if request.method != u"POST": # The user can save a draft even if he may not submit. if inforequest.has_undecided_emails: return HttpResponseNotFound() if not inforequest.can_add_action(form_class.action_type): return HttpResponseNotFound() draft = inforequest.actiondraft_set.filter(type=form_class.action_type).order_by_pk().first() session = Session.objects.get(session_key=request.session.session_key) attached_to = (session, draft) if draft else (session,) if request.method != u"POST": form = form_class(inforequest=inforequest, attached_to=attached_to) if draft: form.load_from_draft(draft) return render_form(request, form, inforequest=inforequest) if form_class.action_type in Action.APPLICANT_EMAIL_ACTION_TYPES: button = clean_button(request.POST, [u"email", u"print", u"draft"]) else: button = clean_button(request.POST, [u"print", u"draft"]) if button == u"draft": form = form_class(request.POST, inforequest=inforequest, attached_to=attached_to, draft=True) if not form.is_valid(): return json_form(request, form, inforequest=inforequest) if not draft: draft = ActionDraft(inforequest=inforequest, type=form_class.action_type) form.save_to_draft(draft) draft.save() return json_draft() if button in [u"email", u"print"]: form = form_class(request.POST, inforequest=inforequest, attached_to=attached_to) if not form.is_valid(): return json_form(request, form, inforequest=inforequest) if form_class.action_type == Action.TYPES.APPEAL: form.cleaned_data[u"branch"].add_expiration_if_expired() action = Action(effective_date=local_today(), type=form_class.action_type) form.save(action) action.save() if draft: draft.delete() # The inforequest was changed, we need to refetch it. inforequest = Inforequest.objects.prefetch_detail().get(pk=inforequest.pk) action.branch = inforequest.branch_by_pk(action.branch_id) if button == u"email": action.send_by_email() return json_success(request, inforequest, action, button == u"print") return HttpResponseBadRequest()
def test_custom_button_name(self): post = {u'other': u'valid'} clean = clean_button(post, [u'valid', u'another'], key=u'other') self.assertEqual(clean, u'valid')
def test_invalid_button(self): post = {u'button': u'invalid'} clean = clean_button(post, [u'valid', u'another']) self.assertIsNone(clean)