mirror of
https://github.com/Findus23/acronomy.git
synced 2024-09-19 15:33:45 +02:00
better login form and validators
This commit is contained in:
parent
d88e58f5c0
commit
77012ee325
8 changed files with 103 additions and 24 deletions
|
@ -59,3 +59,6 @@ admin.site.register(PaperReference, PaperAdmin)
|
||||||
admin.site.register(Tag, TagAdmin)
|
admin.site.register(Tag, TagAdmin)
|
||||||
admin.site.register(Acronym, AcronymAdmin)
|
admin.site.register(Acronym, AcronymAdmin)
|
||||||
admin.site.register(Host)
|
admin.site.register(Host)
|
||||||
|
|
||||||
|
admin.site.site_header="Acronomy Administration"
|
||||||
|
admin.site.site_title="Acronomy Administration"
|
||||||
|
|
28
acros/migrations/0031_auto_20200613_2011.py
Normal file
28
acros/migrations/0031_auto_20200613_2011.py
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# Generated by Django 3.0.6 on 2020-06-13 20:11
|
||||||
|
|
||||||
|
import acros.models.Acronym
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('acros', '0030_auto_20200608_1823'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='historicalacronym',
|
||||||
|
name='created_date',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='acronym',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='historicalacronym',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=100),
|
||||||
|
),
|
||||||
|
]
|
24
acros/migrations/0032_auto_20200613_2014.py
Normal file
24
acros/migrations/0032_auto_20200613_2014.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 3.0.6 on 2020-06-13 20:14
|
||||||
|
|
||||||
|
import acros.models.Acronym
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('acros', '0031_auto_20200613_2011'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='acronym',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=100, validators=[acros.models.valid_acronym]),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='historicalacronym',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=100, validators=[acros.models.valid_acronym]),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,3 +1,4 @@
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
|
@ -7,8 +8,13 @@ from acros.models import Tag
|
||||||
from acros.utils.conversion import md_to_html
|
from acros.utils.conversion import md_to_html
|
||||||
|
|
||||||
|
|
||||||
|
def valid_acronym(value: str):
|
||||||
|
if ":" in value:
|
||||||
|
raise ValidationError('Acronyms are not allowed to contain a ":"')
|
||||||
|
|
||||||
|
|
||||||
class Acronym(models.Model):
|
class Acronym(models.Model):
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100, validators=[valid_acronym])
|
||||||
full_name = models.CharField(max_length=1000)
|
full_name = models.CharField(max_length=1000)
|
||||||
slug = models.SlugField(null=False, unique=True)
|
slug = models.SlugField(null=False, unique=True)
|
||||||
description_md = models.TextField(blank=True)
|
description_md = models.TextField(blank=True)
|
||||||
|
@ -35,3 +41,12 @@ class Acronym(models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["name"]
|
ordering = ["name"]
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
new_slug = slugify(self.name)
|
||||||
|
try:
|
||||||
|
found = Acronym.objects.get(slug=new_slug)
|
||||||
|
except Acronym.DoesNotExist:
|
||||||
|
found = False
|
||||||
|
if found:
|
||||||
|
raise ValidationError(f"slug '{new_slug}' already exists")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from .Tag import Tag
|
from .Tag import Tag
|
||||||
from .Acronym import Acronym
|
from .Acronym import Acronym,valid_acronym
|
||||||
from .Host import Host
|
from .Host import Host
|
||||||
from .PaperReference import PaperReference
|
from .PaperReference import PaperReference
|
||||||
from .Weblink import Weblink
|
from .Weblink import Weblink
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from rest_framework import viewsets, filters
|
from rest_framework import viewsets, filters
|
||||||
|
@ -34,10 +35,11 @@ class EditView(LoginRequiredMixin, generic.UpdateView):
|
||||||
form_class = EditForm
|
form_class = EditForm
|
||||||
|
|
||||||
|
|
||||||
class AddView(LoginRequiredMixin, generic.CreateView):
|
class AddView(LoginRequiredMixin, SuccessMessageMixin, generic.CreateView):
|
||||||
template_name = "acros/add.html"
|
template_name = "acros/add.html"
|
||||||
form_class = AddForm
|
form_class = AddForm
|
||||||
model = Acronym
|
model = Acronym
|
||||||
|
success_message = 'Acronym "%(name)s" was created successfully'
|
||||||
|
|
||||||
|
|
||||||
class TagListView(generic.ListView):
|
class TagListView(generic.ListView):
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
//@import "node_modules/bootstrap/scss/progress";
|
//@import "node_modules/bootstrap/scss/progress";
|
||||||
//@import "node_modules/bootstrap/scss/media";
|
//@import "node_modules/bootstrap/scss/media";
|
||||||
//@import "node_modules/bootstrap/scss/list-group";
|
//@import "node_modules/bootstrap/scss/list-group";
|
||||||
//@import "node_modules/bootstrap/scss/close";
|
@import "node_modules/bootstrap/scss/close";
|
||||||
//@import "node_modules/bootstrap/scss/toasts";
|
//@import "node_modules/bootstrap/scss/toasts";
|
||||||
//@import "node_modules/bootstrap/scss/modal";
|
//@import "node_modules/bootstrap/scss/modal";
|
||||||
@import "node_modules/bootstrap/scss/tooltip";
|
@import "node_modules/bootstrap/scss/tooltip";
|
||||||
|
|
|
@ -1,29 +1,36 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
{% load bootstrap4 %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block containerclasses %}text-center{% endblock %}
|
{% block heading %}
|
||||||
|
<h1>Login</h1>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{#{% block containerclasses %}text-center{% endblock %}#}
|
||||||
{% block extra_head %}
|
{% block extra_head %}
|
||||||
<link rel="stylesheet" href="{% static "login.css" %}">
|
{# <link rel="stylesheet" href="{% static "login.css" %}">#}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% if next %}
|
||||||
|
<div class="alert alert-info">
|
||||||
|
You need to log in before you can access
|
||||||
|
<code>{{ next }}</code>.
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<form class="form-signin" method="post" action="{% url 'login' %}">
|
<form action="{% url 'login' %}" method="post" class="form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<h1 class="h3 mb-3 font-weight-normal">Anmeldung</h1>
|
{% bootstrap_form form %}
|
||||||
<label for="{{ form.username.id_for_label }}" class="sr-only">Benutzername</label>
|
{% url 'admin_password_reset' as password_reset_url %}
|
||||||
<input class="form-control" id="{{ form.username.id_for_label }}" maxlength="30"
|
<div class="password-reset-link">
|
||||||
name="{{ form.username.html_name }}" type="text"
|
<a href="{% url 'password_reset' %}">Forgotten your password or username?</a>
|
||||||
placeholder="Benutzername"/>
|
</div>
|
||||||
{# <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>#}
|
{% buttons %}
|
||||||
<label for="{{ form.password.id_for_label }}" class="sr-only">Passwort</label>
|
<button type="submit" class="btn btn-lg btn-primary btn-block">
|
||||||
<input type="password" id="{{ form.password.id_for_label }}" name="{{ form.password.html_name }}"
|
Sign in
|
||||||
class="form-control" placeholder="Passwort" required>
|
</button>
|
||||||
<input type="hidden" name="next" value="{{ next }}">
|
{% endbuttons %}
|
||||||
|
</form>
|
||||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
|
|
||||||
{{ form.non_field_errors }}
|
|
||||||
|
|
||||||
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Reference in a new issue