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))
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)
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))