示例#1
0
def login(request, slug=None, username=False, password=False):
    slug = slug or settings.BUZZWORD_SPECIFIC_CORPUS
    username = username or request.POST.get("username")
    password = password or request.POST.get("password")
    nextpage = request.GET.get("next")

    # next page means we need to authenticate them and send to nextpage
    if nextpage:
        # quickfix for these names...
        nextpage = nextpage.strip('/').capitalize()
        if nextpage == "Compare":
            nextpage = "Browse & correct"
        if nextpage == "Explore":
            nextpage = "Analyse"
        error = f"Registration/login required for the {nextpage} page."
        _make_message(request, messages.WARNING, error)
        if slug:
            corpus = Corpus.objects.get(slug=slug)
        else:
            corpus = None
        content = _get_markdown_content(slug, "home")
        context = {"corpus": corpus, "navbar": "home", "content": content}
        specific = "" if not settings.BUZZWORD_SPECIFIC_CORPUS else "-specific"
        return render(request, f"start/start{specific}.html", context)

    user = authenticate(request, username=username, password=password)
    specific = "" if not settings.BUZZWORD_SPECIFIC_CORPUS else "-specific"
    nextpage = nextpage or f"start/start{specific}.html"
    template = loader.get_template(nextpage)
    go_home = {"login", "logout", "signup", "corpus_settings"}
    corpus = Corpus.objects.get(slug=slug)
    current_section = None  # todo
    if current_section in go_home or not current_section:
        current_section = "home"
    content = _get_markdown_content(slug, current_section)
    context = {"corpus": corpus, "navbar": current_section, "content": content}
    if user:
        django_login(request, user)
    else:
        error = "Login unsuccessful. Please sign up or try again."
        _make_message(request, messages.WARNING, error)
    return HttpResponse(template.render(context, request))
示例#2
0
def signup(request):
    """
    Signup modal
    """
    # todo: swisslaw only
    slug = settings.BUZZWORD_SPECIFIC_CORPUS
    current_section = request.path.strip("/") or "home"
    corpus = Corpus.objects.get(slug=slug)
    context = {}
    success = "Registration successful. You are now logged in as {}."
    # user has tried to sign up
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            # save user in db...login
            form.request = request
            user = form.save()
            # user.backend = "django.contrib.auth.backends.ModelBackend"
            username = request.POST.get("username")
            password = request.POST.get("password1")
            user = authenticate(request, username=username, password=password)
            # registration successful
            if user is not None:
                django_login(request, user)
                _make_message(request, messages.SUCCESS,
                              success.format(username))
                return start_specific(request, slug=slug)

        # registration unsuccessful
        _make_message(request, messages.WARNING, form.errors, safe=True)
        return start_specific(request, slug=slug)
    # user wants to sign up
    else:
        print("WANT TO SIGN UP")
        form = CustomUserCreationForm()
        context["form"] = form
        return render(request, 'signup.html', context)
示例#3
0
def browse_collection(request, slug=None):
    """
    Main compare/correct view, showing PDF beside its OCR output

    Use Django's pagination for handling PDFs
    Use martor for the markdown editor
    """
    if not slug:
        slug = settings.BUZZWORD_SPECIFIC_CORPUS
    all_pdfs = PDF.objects.all()
    paginator = Paginator(all_pdfs, 1)
    query = request.GET.get('q')
    if query:
        page_number = int(query)
    else:
        page_number = int(request.GET.get("page", 1))
    page_obj = paginator.get_page(page_number)
    pdf = all_pdfs.get(slug=slug, num=page_number - 1)
    pdf_path = os.path.relpath(pdf.path)
    template = loader.get_template("compare/sidetoside.html")
    # get all the updates for this particular pdf
    this_pdf = OCRUpdate.objects.filter(pdf=pdf)
    # of these, get the latest ocr update submitted by this user
    user_latest = this_pdf.filter(username=request.user.username)
    if user_latest:
        user_latest = user_latest.latest("timestamp")
    # also get the latest ACCEPTED ocr
    regular_latest = this_pdf.filter(accepted=True).latest("timestamp")
    # if there is a user latest, and it's newer than the latest accepted, show that
    if user_latest and user_latest.timestamp >= regular_latest.timestamp:
        plaintext = user_latest.text
    # otherwise, show the latest accepted text
    else:
        plaintext = regular_latest.text

    default_commit = f"Update {os.path.splitext(os.path.basename(pdf_path))[0]}"
    form_data = {"description": plaintext, "commit_msg": default_commit}
    form = PostForm(initial=form_data)
    context = {
        "pdf_filepath": "/" + pdf_path.replace(".tif", ".pdf"),
        "form": form,
        "page_obj": page_obj,
        "specific_nav": bool(settings.BUZZWORD_SPECIFIC_CORPUS),
        "corpus": Corpus.objects.get(slug=slug),
        "navbar": "compare",
    }
    # if the user has tried to update the OCR text
    if request.method == "POST":
        error = False
        form = SubmitForm(request.POST)
        new_text = form["description"].value()
        commit_msg = form["commit_msg"].value()

        if new_text.strip() == plaintext.strip():
            error = "No changes made -- doing nothing"
            _make_message(request, messages.WARNING, error)

        # success case: update the db
        if form.is_valid() and not error:
            new_text = form.cleaned_data["description"]
            commit = form.cleaned_data["commit_msg"]
            buzz_raw_text = markdown_to_buzz_input(new_text, slug)
            # this updates the text file with the latest data. bad idea?
            # store_buzz_raw(buzz_raw_text, slug, pdf_path)
            # todo: handle submitted changes properly
            try:
                user = User.objects.get(id=request.user.id)
            except django.contrib.auth.models.User.DoesNotExist:
                user = None
            updated = OCRUpdate(
                slug=slug,
                commit_msg=commit,
                text=new_text,
                previous=plaintext,
                pdf=pdf,
                username=request.user.username,
                user=user,
                # superuser corrections are automatically accepted
                accepted=request.user.is_superuser)
            updated.save()
            initial = {"description": new_text, "commit_msg": default_commit}
            context["form"] = PostForm(initial=initial)
            msg = "Text successfully updated"
            if commit:
                msg = f"{msg}: {commit} ({str(updated.timestamp).split('.', 1)[0]})"
            _make_message(request, messages.SUCCESS, msg)
        else:
            # user must enter commit msg (but default is provided so it's easy)
            if not commit_msg:
                msg = "Please provide a description of your changes before updating"
                _make_message(request, messages.WARNING, msg)
            if not new_text:
                # i think this is the only possible invalid
                msg = 'No text submitted. Mark blank files with <meta blank="true"/>'
                _make_message(request, messages.WARNING, msg)

    return HttpResponse(template.render(context, request))