Bugfixes
+ delete categories + translations + style improvements
This commit is contained in:
parent
51c942746b
commit
a4486909df
14 changed files with 151 additions and 33 deletions
|
|
@ -8,13 +8,13 @@ from django.contrib.auth.models import User
|
||||||
class Object(models.Model):
|
class Object(models.Model):
|
||||||
ammout = models.PositiveIntegerField(default=1, blank=False)
|
ammout = models.PositiveIntegerField(default=1, blank=False)
|
||||||
title = models.TextField(max_length=100, default=None, blank=False)
|
title = models.TextField(max_length=100, default=None, blank=False)
|
||||||
img = models.ImageField(default=None, blank=True)
|
img = models.ImageField(default='/images/None/nopic.svg', blank=True, upload_to='images/')
|
||||||
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
inventarized_date = models.DateTimeField(blank=False, null=True)
|
inventarized_date = models.DateTimeField(blank=False, null=True)
|
||||||
description = models.TextField(max_length=500, blank=True)
|
description = models.TextField(max_length=500, blank=True)
|
||||||
removed_date = models.DateTimeField(blank=True, default=None, null=True)
|
removed_date = models.DateTimeField(blank=True, default=None, null=True)
|
||||||
user_added = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, null=True)
|
user_added = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, null=True)
|
||||||
category = models.ForeignKey('Category', on_delete=models.CASCADE, blank=True, default=None, null=True)
|
category = models.ForeignKey('Category', on_delete=models.SET_NULL, blank=True, default=None, null=True)
|
||||||
|
|
||||||
objects = models.Manager()
|
objects = models.Manager()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from django.utils import timezone
|
||||||
@login_required
|
@login_required
|
||||||
def add(request):
|
def add(request):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = ObjectForm(request.POST)
|
form = ObjectForm(request.POST, request.FILES)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,6 @@ import uuid
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.objlist, name='objlist'),
|
path('', views.objlist, name='objlist'),
|
||||||
path('<str:orderstr>', views.objlist, name='objlist_ordered'),
|
path('<str:orderstr>', views.objlist, name='objlist_ordered'),
|
||||||
path('<str:uuid_url>/delete', views.delete, name='del_obj')
|
path('<str:uuid_url>/delete', views.delete, name='del_obj'),
|
||||||
|
path('<str:uuid_url>/delete/category', views.deleteCategory, name='del_cat')
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ def objlist(request, orderstr=None):
|
||||||
return render(request, 'object_lister/index.html', context)
|
return render(request, 'object_lister/index.html', context)
|
||||||
|
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
form = ObjectForm(request.POST)
|
form = ObjectForm(request.POST, request.FILES)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
result = re.fullmatch(uuidv4pattern, orderstr)
|
result = re.fullmatch(uuidv4pattern, orderstr)
|
||||||
|
|
@ -78,3 +78,10 @@ def delete(request, uuid_url):
|
||||||
obj = get_object_or_404(Object, pk=uuid_url)
|
obj = get_object_or_404(Object, pk=uuid_url)
|
||||||
obj.delete()
|
obj.delete()
|
||||||
return render(request, 'object_lister/delete.html', {'uuid': uuid_url})
|
return render(request, 'object_lister/delete.html', {'uuid': uuid_url})
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def deleteCategory(request, uuid_url):
|
||||||
|
cat = get_object_or_404(Category, pk=uuid_url)
|
||||||
|
cat.delete()
|
||||||
|
return render(request, 'object_lister/delete.html', {'uuid': uuid_url})
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,9 @@ from django.contrib.auth.models import User
|
||||||
|
|
||||||
class SignUpForm(UserCreationForm):
|
class SignUpForm(UserCreationForm):
|
||||||
username = CharField(required=True)
|
username = CharField(required=True)
|
||||||
|
last_name = CharField(required=True)
|
||||||
|
first_name = CharField(required=True)
|
||||||
|
email = CharField(required=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
|
|
|
||||||
|
|
@ -112,17 +112,19 @@
|
||||||
.cattable {
|
.cattable {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
margin-top: 2em;
|
margin: 2em auto 2em auto;
|
||||||
margin-bottom: 2em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cattable * {
|
.cattable .leftalign {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cattable .rightalign{
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
.lower-box {
|
.lower-box {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
width: 50%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.celllink, .celllink:hover, .celllink:visited, .celllink:active {
|
.celllink, .celllink:hover, .celllink:visited, .celllink:active {
|
||||||
|
|
@ -150,3 +152,29 @@
|
||||||
.delbtn{
|
.delbtn{
|
||||||
margin-bottom: 1em !important;
|
margin-bottom: 1em !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.delcatbtn{
|
||||||
|
margin-top: 0.5em !important;
|
||||||
|
margin-bottom: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nodec{
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerformcontainer *{
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerformcontainer input{
|
||||||
|
margin-left: 0.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nomarg{
|
||||||
|
margin: 2em 0 0 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pwdinfo{
|
||||||
|
border: 2px solid rgba(110, 110, 110, 0.28);
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
@ -42,13 +42,13 @@
|
||||||
</ul>
|
</ul>
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li><a href="{% url 'logout' %}"><span class="glyphicon glyphicon-log-out"></span> Log out</a></li>
|
<li><a href="{% url 'logout' %}"><span class="glyphicon glyphicon-log-out"></span> Ausloggen</a></li>
|
||||||
<li><a href="#"><span class="glyphicon glyphicon-cog"></span> Settings</a></li>
|
<li><a href="#"><span class="glyphicon glyphicon-cog"></span> Einstellungen</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% else %}
|
{% else %}
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li><a href="{% url 'register' %}"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
|
<li><a href="{% url 'register' %}"><span class="glyphicon glyphicon-user"></span> Registrieren</a></li>
|
||||||
<li><a href="{% url 'login' %}"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
|
<li><a href="{% url 'login' %}"><span class="glyphicon glyphicon-log-in"></span> Einloggen</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
Das Objekt <strong>{{ obj_name }}</strong> wurde inventarisiert!
|
Das Objekt <strong>{{ obj_name }}</strong> wurde inventarisiert!
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form method="POST" class="post-form invform">
|
<form method="POST" class="post-form invform" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="ammout-wrapper">
|
<div class="ammout-wrapper">
|
||||||
{{ form.ammout.errors }}
|
{{ form.ammout.errors }}
|
||||||
|
|
@ -27,11 +27,13 @@
|
||||||
<label for="{{ form.category.id_for_lable }}">Kategorie:</label>
|
<label for="{{ form.category.id_for_lable }}">Kategorie:</label>
|
||||||
{{ form.category }}
|
{{ form.category }}
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<div class="img-wrapper">
|
<div class="img-wrapper">
|
||||||
{{ form.img.errors }}
|
{{ form.img.errors }}
|
||||||
<label for="{{ form.img.id_for_lable }}">Bild:</label>
|
<label for="{{ form.img.id_for_lable }}">Bild:</label>
|
||||||
{{ form.img }}
|
{{ form.img }}
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
<div class="description-wrapper">
|
<div class="description-wrapper">
|
||||||
{{ form.description.errors }}
|
{{ form.description.errors }}
|
||||||
<label for="{{ form.description.id_for_lable }}">Beschreibung:</label>
|
<label for="{{ form.description.id_for_lable }}">Beschreibung:</label>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
|
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
|
||||||
Abbruch.
|
Abbruch.
|
||||||
</div>
|
</div>
|
||||||
<form method="POST" class="post-form invform">
|
<form method="POST" class="post-form invform" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="ammout-wrapper">
|
<div class="ammout-wrapper">
|
||||||
{{ form.ammout.errors }}
|
{{ form.ammout.errors }}
|
||||||
|
|
@ -31,11 +31,13 @@
|
||||||
<label for="{{ form.category.id_for_lable }}">Kategorie:</label>
|
<label for="{{ form.category.id_for_lable }}">Kategorie:</label>
|
||||||
{{ form.category }}
|
{{ form.category }}
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<div class="img-wrapper">
|
<div class="img-wrapper">
|
||||||
{{ form.img.errors }}
|
{{ form.img.errors }}
|
||||||
<label for="{{ form.img.id_for_lable }}">Bild:</label>
|
<label for="{{ form.img.id_for_lable }}">Bild:</label>
|
||||||
{{ form.img }}
|
{{ form.img }}
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
<div class="description-wrapper">
|
<div class="description-wrapper">
|
||||||
{{ form.description.errors }}
|
{{ form.description.errors }}
|
||||||
<label for="{{ form.description.id_for_lable }}">Beschreibung:</label>
|
<label for="{{ form.description.id_for_lable }}">Beschreibung:</label>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,14 @@
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container shadow">
|
<div class="container shadow">
|
||||||
|
<div class="alert alert-danger alert-dismissible nodisplay" id="delalert">
|
||||||
|
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
|
||||||
|
Kategorie wurde gelöscht.
|
||||||
|
</div>
|
||||||
|
<div class="alert alert-danger alert-dismissible nodisplay" id="abortalert">
|
||||||
|
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
|
||||||
|
Abbruch.
|
||||||
|
</div>
|
||||||
<form>
|
<form>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<table class="objecttable">
|
<table class="objecttable">
|
||||||
|
|
@ -46,17 +54,49 @@
|
||||||
<div class="container shadow lower-box">
|
<div class="container shadow lower-box">
|
||||||
<table class="cattable">
|
<table class="cattable">
|
||||||
<tr>
|
<tr>
|
||||||
<th class="objecttable-head">Kategorie</th>
|
<th class="objecttable-head leftalign">Kategorie</th>
|
||||||
|
<th class="objecttable-head"></th>
|
||||||
</tr>
|
</tr>
|
||||||
{% for category in categories %}
|
{% for category in categories %}
|
||||||
<tr class="objecttable-row">
|
<tr class="objecttable-row">
|
||||||
<td class="objecttable-data">{{ category.name }}</td>
|
<td class="objecttable-data leftalign">{{ category.name }}</td>
|
||||||
|
<td class="objecttable-data rightalign">
|
||||||
|
<button class="btn btn-danger delcatbtn" id="{{ category.id }}" onclick="delcat(this.id)">
|
||||||
|
löschen
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
<p>{{ ncats }} Kategorien insgesamt</p>
|
<p>{{ ncats }} Kategorien insgesamt</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
<script>
|
||||||
|
function delcat(id) {
|
||||||
|
if (confirm('Möchten sie die Kategorie {{ category.name }} wirklich löschen?')) {
|
||||||
|
|
||||||
|
var xhttp = new XMLHttpRequest();
|
||||||
|
|
||||||
|
xhttp.onreadystatechange = function () {
|
||||||
|
|
||||||
|
if (this.readyState == 4 && this.status == 200) {
|
||||||
|
window.location.href = "./"
|
||||||
|
abox = document.getElementById('delalert');
|
||||||
|
abox.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
xhttp.open("GET", './' + id + '/delete/category', true);
|
||||||
|
xhttp.send();
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
abox = document.getElementById('abortalert');
|
||||||
|
abox.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p>Logged out!</p>
|
<p>Ausgelogt.</p>
|
||||||
<a href="{% url 'login'%}">Click here to login again.</a>
|
<a href="{% url 'login'%}">Klicken sie hier um sich erneut einzuloggen.</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container shadow">
|
||||||
{% if form.errors %}
|
{% if form.errors %}
|
||||||
<p class="error">Wrong username/password combination</p>
|
<p class="error">Falscher Nutzername oder falsches Passwort</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if next %}
|
{% if next %}
|
||||||
|
|
@ -19,13 +19,13 @@
|
||||||
<form class="form-horizontal login-form" action="{% url 'login' %}" method="post">
|
<form class="form-horizontal login-form" action="{% url 'login' %}" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="email">Username:</label>
|
<label class="control-label col-sm-2" for="email">Nutzername:</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{{ form.username }}
|
{{ form.username }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="pwd">Password:</label>
|
<label class="control-label col-sm-2" for="pwd">Passwort:</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{{ form.password }}
|
{{ form.password }}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -33,9 +33,9 @@
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
<button type="submit" class="btn btn-primary">Login</button>
|
<button type="submit" class="btn btn-primary">Einloggen</button>
|
||||||
<input type="hidden" name="next" value="{{ next }}">
|
<input type="hidden" name="next" value="{{ next }}">
|
||||||
<span class="reset"><a href="{% url 'password_reset' %}">Lost password?</a></span>
|
<span class="reset"><a href="{% url 'password_reset' %}">Passwort vergessen?</a></span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,20 +5,55 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container shadow">
|
||||||
<h1>registration page</h1>
|
<h1>Registrieren</h1>
|
||||||
<form method="post" action="{% url 'register' %}">
|
<form method="post" action="{% url 'register' %}" class="registerformcontainer">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
{% if form.errors %}
|
{% if form.errors %}
|
||||||
<p>There are errors in the form</p>
|
<p>There are errors in the form</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ form }}
|
<div class="username-wrapper">
|
||||||
<input type="submit" value="Register">
|
{{ form.username.errors }}
|
||||||
|
<label for="{{ form.username.id_for_lable }}">Nutzername:</label>
|
||||||
|
{{ form.username }}
|
||||||
|
</div>
|
||||||
|
<div class="first_name-wrapper">
|
||||||
|
{{ form.first_name.errors }}
|
||||||
|
<label for="{{ form.first_name.id_for_lable }}">Vorname:</label>
|
||||||
|
{{ form.first_name }}
|
||||||
|
</div>
|
||||||
|
<div class="last_name-wrapper">
|
||||||
|
{{ form.last_name.errors }}
|
||||||
|
<label for="{{ form.last_name.id_for_lable }}">Nachname:</label>
|
||||||
|
{{ form.last_name }}
|
||||||
|
</div>
|
||||||
|
<div class="email-wrapper">
|
||||||
|
{{ form.email.errors }}
|
||||||
|
<label for="{{ form.email.id_for_lable }}">E-mail:</label>
|
||||||
|
{{ form.email }}
|
||||||
|
</div>
|
||||||
|
<div class="password1-wrapper">
|
||||||
|
{{ form.password1.errors }}
|
||||||
|
<label for="{{ form.password1.id_for_lable }}">Passwort:</label>
|
||||||
|
{{ form.password1 }}
|
||||||
|
</div>
|
||||||
|
<ul class="nodec pwdinfo">
|
||||||
|
<li>Das Passwort darf nicht zu ähnlich zu Ihren anderen persönlichen Informationen sein.</li>
|
||||||
|
<li>Das Passwort muss mindestens 8 Zeichen enthalten.</li>
|
||||||
|
<li>Das Passwort darf nicht allgemein üblich sein.</li>
|
||||||
|
<li>Das Passwort darf nicht komplett aus Ziffern bestehen.</li>
|
||||||
|
</ul>
|
||||||
|
<div class="password2-wrapper">
|
||||||
|
{{ form.password2.errors }}
|
||||||
|
<label for="{{ form.password2.id_for_lable }}">Passwort bestätigen:</label>
|
||||||
|
{{ form.password2 }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="submit" value="Registrieren" class="btn btn-success nomarg">
|
||||||
</form>
|
</form>
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
{% block content%}
|
{% block content%}
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container shadow">
|
||||||
<h3>Inventarium</h3>
|
<h3>Inventarium</h3>
|
||||||
<p>Mit diesem System können allerlei Dinge inventarisiert werden.</p>
|
<p>Mit diesem System können allerlei Dinge inventarisiert werden.</p>
|
||||||
<p>Zum Beispiel: </p>
|
<p>Zum Beispiel: </p>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue