- Bugs behoben
- Rechte wurden falsch übernommen, da Benutzer bearbeiten nicht mitgeschickt wurde. - Das andere hab ich vergessen, aber war auch ein Fehler, der nun behoben ist - Jeder Nutzer kann jetzt Bilder für Standards hochladen - Standards - Werden nun korrekt zugewiesen - Es gibt nun Ansichten für Bereiche und Aufgaben, welche über eine Navigation darüber angeklickt werden können - Das Veröffentlichen von Standards und unveröffentlichen ist korrekt umgesetzt - Priorisierung - Jeder Benutzer kann nun individuell für sich oder durch Benuterverwalter eine Priorisierung von Aufgaben einstellen
|
|
@ -6,7 +6,7 @@ from django.conf.urls.static import static
|
|||
from users.views import AgencyCreateView
|
||||
from . import views
|
||||
from ckeditor_uploader.views import upload
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
'''
|
||||
ADMINPAGE - Verwaltung der Super-User
|
||||
- LOGIN-Page
|
||||
|
|
@ -26,8 +26,12 @@ urlpatterns = [
|
|||
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name='password_reset_confirm'),
|
||||
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name='password_reset_complete'),
|
||||
path('register/', AgencyCreateView.as_view(template_name='users/register.html'), name='register'),
|
||||
path('register/done', views.registerdone, name='register-done'),
|
||||
path('ckeditor/', include('ckeditor_uploader.urls')),
|
||||
path('register/done', views.registerdone, name='register-done')
|
||||
]
|
||||
if settings.DEBUG:
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
urlpatterns += [
|
||||
path(r'^ckeditor/upload/', login_required(upload), name='ckeditor_upload'),
|
||||
path(r'^ckeditor/', include('ckeditor_uploader.urls')),
|
||||
]
|
||||
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 838 B |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 844 B |
|
After Width: | Height: | Size: 399 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -0,0 +1,50 @@
|
|||
{% extends "users/base.html" %}
|
||||
{% block content %}
|
||||
<div class="content-section col-12">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h4>Standards aus dem Bereich {{areaname}}</h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
{% for item in standards_of_agency_area %}
|
||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class=" mb-4 col-5">
|
||||
<div class="card">
|
||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||
<a href="{% url 'standard-single' item.pk%}">
|
||||
{% if item.public %}
|
||||
<h4><u>{{item.name}}</u></h4>
|
||||
{% else %}
|
||||
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
||||
{% endif %}
|
||||
</a>
|
||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class="dropdown no-arrow">
|
||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||
</h5>
|
||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor%}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
{% extends "users/base.html" %}
|
||||
{% block content %}
|
||||
<div class="content-section col-12">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||
<li class="breadcrumb-item active"><a href="{% url 'standard-area' areaid %}">{{areaname}}</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-task' taskid %}">{{taskname}}</a></li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h4>Standards aus dem Aufgabenbereich {{taskname}} des Bereichs {{areaname}}</h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
{% for item in standards_of_agency_task %}
|
||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class=" mb-4 col-5">
|
||||
<div class="card">
|
||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||
<a href="{% url 'standard-single' item.pk%}">
|
||||
{% if item.public %}
|
||||
<h4><u>{{item.name}}</u></h4>
|
||||
{% else %}
|
||||
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
||||
{% endif %}
|
||||
</a>
|
||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class="dropdown no-arrow">
|
||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||
</h5>
|
||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor%}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
{% extends "users/base.html" %}
|
||||
{% block content %}
|
||||
<div class="content-section col-12">
|
||||
<h3>Standards</h3>
|
||||
<h3>Standards</h3>
|
||||
<small>Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards. Nicht veröffentlichte sind gelb markiert.</small>
|
||||
<hr>
|
||||
<p>
|
||||
Standards dokumentieren und erläutern verschiedenen Verfahren, strukturiert nach Bereichen und Aufgaben.
|
||||
|
|
@ -14,32 +15,39 @@
|
|||
<hr>
|
||||
<div class="row">
|
||||
{% for item in standards_of_agency %}
|
||||
<div class=" mt-4 col-5">
|
||||
<div class="card">
|
||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||
<a href="{% url 'standard-single' item.pk%}"><h4><u>{{item.name}}</u></h4></a>
|
||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class="dropdown no-arrow">
|
||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||
{% if item.public or item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class=" mb-4 col-5">
|
||||
<div class="card">
|
||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||
<a href="{% url 'standard-single' item.pk%}">
|
||||
{% if item.public %}
|
||||
<h4><u>{{item.name}}</u></h4>
|
||||
{% else %}
|
||||
<h4 class="text-warning"><u>{{item.name}}</u></h4>
|
||||
{% endif %}
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||
</h5>
|
||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if item.created_standard_by == user or perms.users.standard_management %}
|
||||
<div class="dropdown no-arrow">
|
||||
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
|
||||
<!--<div class="dropdown-header">Benutzerdaten</div>-->
|
||||
<a class="dropdown-item" href="{% url 'standard-update' item.pk %}">Bearbeiten</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item text-danger" href="{% url 'standard-delete' item.pk %}" >Löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}} <h6>Zuletzt bearbeitet von {{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }} am {{ item.last_modified_on }}</h6>
|
||||
</h5>
|
||||
<p class="card-text">{{ item.content|truncatechars:250|safe}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor%}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
|
|||
|
|
@ -4,11 +4,12 @@
|
|||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'standards' %}">Standards</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{standard.area.name}}</li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{standard.task.name}}</li>
|
||||
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-area' standard.area.pk %}">{{standard.area.name}}</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page"><a href="{% url 'standard-task' standard.task.pk %}">{{standard.task.name}}</a></li>
|
||||
</ol>
|
||||
</nav>
|
||||
<small>
|
||||
<h2>{{standard.name}}</h2>
|
||||
Erstellt durch {{standard.created_standard_by.first_name}} {{standard.created_standard_by.last_name}} am {{standard.created_standard_date}} | Zuletzt bearbeitet von {{ standard.last_modified_by.first_name}} {{ standard.last_modified_by.last_name}} am {{ standard.last_modified_on}}</small>
|
||||
<hr>
|
||||
{{standard.media}}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
{% if standard_status == False %}
|
||||
<a class="btn btn-primary" href="{% url 'standard-status' standard_id %} ">Standard veröffentlichen</a>
|
||||
{% else %}
|
||||
<a class="btn btn-warning" href="{% url 'standard-status' standard_id %} ">Standard unveröffentlichen</a>
|
||||
<a class="btn btn-warning" href="{% url 'standard-status' standard_id %} ">Veröffentlichung aufheben</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<a class="btn" href="{% url 'standards' %} ">Abbrechen</a>
|
||||
|
|
|
|||
|
|
@ -14,5 +14,7 @@ urlpatterns = [
|
|||
path('ajax/loadtasks/', views.load_tasks, name='ajax_loadtasks'),
|
||||
path('standards/<int:pk>/delete', StandardDeleteView.as_view(), name='standard-delete'),
|
||||
path('standard/<int:pk>/changestat', views.StandardChangePublic, name="standard-status"),
|
||||
path('standard/<int:pk>/single', views.StandardSingle, name="standard-single")
|
||||
path('standard/<int:pk>/single', views.StandardSingle, name="standard-single"),
|
||||
path('standard/<int:pk>/area', views.StandardArea, name="standard-area"),
|
||||
path('standard/<int:pk>/task', views.StandardTask, name="standard-task")
|
||||
]
|
||||
|
|
|
|||
|
|
@ -8,9 +8,10 @@ from django.http import HttpResponse, JsonResponse
|
|||
from .forms import StandardAddStandard, StandardAddStandardEditor, StandardUpdateStandard, StandardUpdateStandardEditor
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from tasks.models import Tasks
|
||||
from areas.models import Areas
|
||||
from datetime import datetime
|
||||
|
||||
# Create your views here.
|
||||
# ALLE STANDARDS EINER AGENTUR
|
||||
class StandardsManagement(LoginRequiredMixin, ListView):
|
||||
model = Standards
|
||||
# Adding active_link
|
||||
|
|
@ -23,32 +24,7 @@ class StandardsManagement(LoginRequiredMixin, ListView):
|
|||
context.update({'active_link' : 'standards', 'standards_of_agency' : standards_of_agency})
|
||||
return context
|
||||
|
||||
'''
|
||||
class StandardAdd(LoginRequiredMixin, CreateView):
|
||||
model = Standards
|
||||
success_url = '/standards'
|
||||
form_class = StandardAddStandardForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(StandardAdd, self).get_form_kwargs()
|
||||
kwargs['user'] = self.request.user
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context.update({'active_link' : 'standards'})
|
||||
return context
|
||||
|
||||
def form_valid(self, form):
|
||||
# Send message to the site
|
||||
messages.success(self.request, f'Standard angelegt!')
|
||||
form.instance.agency = self.request.user.profile.agency
|
||||
form.instance.created_standard_by = self.request.user
|
||||
form.instance.published_by = self.request.user
|
||||
form.instance.last_modifed_by = self.request.user
|
||||
return super().form_valid(form)
|
||||
|
||||
'''
|
||||
@login_required
|
||||
def StandardAdd(request):
|
||||
if request.method == 'POST':
|
||||
|
|
@ -104,8 +80,17 @@ def StandardUpdate(request, id):
|
|||
existing_standard.task = normalForm.cleaned_data['task']
|
||||
existing_standard.area = normalForm.cleaned_data['area']
|
||||
existing_standard.name = normalForm.cleaned_data['name']
|
||||
existing_standard.content = editorForm.cleaned_data['content']
|
||||
if request.user.has_perm('standard_management'):
|
||||
existing_standard.content = editorForm.cleaned_data['content']
|
||||
'''
|
||||
|
||||
AKTUALISIERUNG
|
||||
|
||||
Wennn der User selbst den Standard erstellt hat und Rechte zur Standardverwaltung hat,
|
||||
dann wird der Status nicht verändert (public bleibt true bzw. false). Hat der User
|
||||
aber keine Rechte und ist der Standarf public, wird er auf public=false gesetzt!
|
||||
|
||||
'''
|
||||
if request.user.has_perm('users.standard_management'):
|
||||
messages.success(request, f'Standard {existing_standard.name} aktualisiert!')
|
||||
else:
|
||||
if existing_standard.public:
|
||||
|
|
@ -166,4 +151,34 @@ def StandardSingle(request, pk):
|
|||
'active_link':'standards',
|
||||
'standard' : standard
|
||||
}
|
||||
return render(request, 'standards/standards_single.html', context)
|
||||
return render(request, 'standards/standards_single.html', context)
|
||||
|
||||
|
||||
@login_required
|
||||
def StandardArea(request, pk):
|
||||
standards = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).filter(area__pk=pk)
|
||||
area = Areas.objects.get(pk=pk)
|
||||
context = {
|
||||
'active_link':'standards',
|
||||
'standards_of_agency_area' : standards,
|
||||
'areaid' : pk,
|
||||
'areaname' : area.name
|
||||
}
|
||||
return render(request, 'standards/standard_area.html', context)
|
||||
|
||||
@login_required
|
||||
def StandardTask(request, pk):
|
||||
standards = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).filter(task__pk=pk)
|
||||
task = Tasks.objects.get(pk=pk)
|
||||
area = Areas.objects.get(pk=task.area.pk)
|
||||
context = {
|
||||
'active_link':'standards',
|
||||
'standards_of_agency_task' : standards,
|
||||
'taskid' : pk,
|
||||
'taskname' : task.name,
|
||||
'areaid' : area.pk,
|
||||
'areaname' : area.name
|
||||
}
|
||||
return render(request, 'standards/standard_task.html', context)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ from .models import Tasks
|
|||
from .forms import TasksAddTaskForm
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponse, JsonResponse
|
||||
from users.priomodel import Prio
|
||||
|
||||
|
||||
# Create your views here.
|
||||
class TasksManagement(LoginRequiredMixin, ListView):
|
||||
|
|
@ -84,6 +86,13 @@ class TasksUpdateView(LoginRequiredMixin, UpdateView):
|
|||
context['objectid'] = context['object'].pk
|
||||
return context
|
||||
|
||||
'''
|
||||
|
||||
Hier werden Aufgaben zu Mitarbeitern zugewiesen oder entfernt. Dabei wird bei jeder Aufgabe auch gleich ein
|
||||
Prio-Objekt erzeugt/entfernt, damit der Mitarbeiter seine Prioritäten auf dem Organigramm einstellen kann.
|
||||
|
||||
'''
|
||||
|
||||
def task_addtasks_ajax(request):
|
||||
if request.method == 'GET':
|
||||
|
||||
|
|
@ -92,11 +101,17 @@ def task_addtasks_ajax(request):
|
|||
task = Tasks.objects.get(pk=request.GET['objectid'])
|
||||
task.usersfield.add(User.objects.get(pk=request.GET['userid']))
|
||||
task.save()
|
||||
# PRIO
|
||||
prio = Prio(user=User.objects.get(pk=request.GET['userid']), task=task)
|
||||
prio.save()
|
||||
# REMOVE USER TO MANY-TO-MANY USERSFIELD
|
||||
elif request.GET['action'] == 'remuser':
|
||||
task = Tasks.objects.get(pk=request.GET['objectid'])
|
||||
task.usersfield.remove(User.objects.get(pk=request.GET['userid']))
|
||||
task.save()
|
||||
# DELETE PRIO
|
||||
Prio.objects.filter(user__pk=request.GET['userid']).filter(task__pk=request.GET['objectid']).delete()
|
||||
|
||||
userid = request.GET['userid']
|
||||
workinguser = User.objects.get(pk=userid)
|
||||
username_clean = workinguser.first_name + " " + workinguser.last_name
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
from django.contrib import admin
|
||||
from .models import Profile, Agency
|
||||
from .priomodel import Prio
|
||||
|
||||
admin.site.register(Profile)
|
||||
admin.site.register(Agency)
|
||||
admin.site.register(Prio)
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 2.2.7 on 2019-12-05 17:41
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tasks', '0003_auto_20191205_0809'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('users', '0002_auto_20191204_0857'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Prio',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('prio', models.IntegerField(default=0)),
|
||||
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
|
@ -7,6 +7,7 @@ from PIL import Image
|
|||
from django.contrib.auth.models import AbstractUser, User
|
||||
from django.contrib.auth.models import Permission
|
||||
|
||||
|
||||
# UNIQUE and NO BLANK fields while user-registration
|
||||
User._meta.get_field('email')._unique = True
|
||||
User._meta.get_field('email').blank = False
|
||||
|
|
@ -105,4 +106,6 @@ class Profile(models.Model):
|
|||
('areas_management', 'Bereiche bearbeiten'),
|
||||
('tasks_management', 'Aufgabenbereiche bearbeiten'),
|
||||
('standard_management', 'Standards bearbeiten und freischalten')
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth.models import User, AbstractBaseUser
|
||||
from django.conf import settings
|
||||
|
||||
from tasks.models import Tasks
|
||||
|
||||
|
||||
'''
|
||||
|
||||
Model zum Speichern der Priorisierungen von Aufgaben eines Nutzers
|
||||
|
||||
'''
|
||||
|
||||
class Prio(models.Model):
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
task = models.ForeignKey(Tasks, on_delete=models.CASCADE)
|
||||
prio = models.IntegerField(default=0)
|
||||
|
|
@ -19,8 +19,7 @@ def create_profile(sender, instance, created, **kwargs):
|
|||
temprof = Profile
|
||||
for ele in temprof._meta.permissions:
|
||||
tempperm = Permission.objects.get(codename=ele[0])
|
||||
tempuser.user_permissions.add(tempperm)
|
||||
|
||||
tempuser.user_permissions.add(tempperm)
|
||||
tempuser.save()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -194,6 +194,10 @@
|
|||
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
|
||||
Profil
|
||||
</a>
|
||||
<a class="dropdown-item" href="{% url 'users-prio' user.pk %}">
|
||||
<i class="fab fa-product-hunt fa-sm fa-fw mr-2 text-gray-400"></i>
|
||||
Priorisierung
|
||||
</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item" href="{% url 'users-logout' %}">
|
||||
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
<div class="dropdown-header">Benutzerdaten</div>
|
||||
<a class="dropdown-item" href="{% url 'users-update' item.profile.pk %}">Bearbeiten</a>
|
||||
<a class="dropdown-item" href="{% url 'users-perm-update' item.profile.pk %}">Rechte</a>
|
||||
<a class="dropdown-item" href="#">Priorisierung</a>
|
||||
<a class="dropdown-item" href="{% url 'users-prio' item.pk %}">Priorisierung</a>
|
||||
<hr class="sidebar-divider">
|
||||
<!--<div class="dropdown-header"></div>-->
|
||||
<a class="dropdown-item" href="#">Bereiche</a>
|
||||
|
|
|
|||
|
|
@ -11,18 +11,6 @@
|
|||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% if field.name == 'users_usermanagement'%}
|
||||
{% if user_tochange.pk != request.user.pk %}
|
||||
<div class="custom-control custom-checkbox mb-2">
|
||||
{% if field.value %}
|
||||
<input type="checkbox" name="{{ field.name }}" class="custom-control-input pull-left" id="{{ field.name }}" checked>
|
||||
{% else %}
|
||||
<input type="checkbox" name="{{ field.name }}" class="custom-control-input pull-left" id="{{ field.name }}">
|
||||
{% endif %}
|
||||
<label class="custom-control-label" for="{{ field.name }}">{{ field.help_text }}</label>
|
||||
</div>
|
||||
{%endif %}
|
||||
{% else %}
|
||||
<div class="custom-control custom-checkbox mb-2">
|
||||
{% if field.value %}
|
||||
<input type="checkbox" name="{{ field.name }}" class="custom-control-input pull-left" id="{{ field.name }}" checked>
|
||||
|
|
@ -30,8 +18,7 @@
|
|||
<input type="checkbox" name="{{ field.name }}" class="custom-control-input pull-left" id="{{ field.name }}">
|
||||
{% endif %}
|
||||
<label class="custom-control-label" for="{{ field.name }}">{{ field.help_text }}</label>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-success">Berechtigungen speichern</button>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,51 @@
|
|||
{% extends "users/base.html" %}
|
||||
{% load crispy_forms_tags %}
|
||||
{% block content %}
|
||||
<div class="content-section">
|
||||
<h3>Priorisierung von {{ user_first_name }} {{ user_last_name }} verändern</h3>
|
||||
<small>Elemente mit einer hohen Zahl werden im Organigramm weiter oben angezeigt. Die Änderungen werden sofort gespeichert.</small>
|
||||
<hr>
|
||||
<div class="col-12">
|
||||
{% for area in areas %}
|
||||
<h3>Bereich {{ area.name }}</h3>
|
||||
{% for prio in prios %}
|
||||
{% if prio.task.area == area %}
|
||||
<div class="form-group row">
|
||||
<label for="{{forloop.counter}}" class="col-sm-2 col-form-label"><h5>{{ prio.task.name }}</h5></label>
|
||||
<div class="col-sm-1" style="float:right" >
|
||||
<input type="number" min="0" class="form-control" id="{{forloop.counter}}" value="{{ prio.prio}}" onkeyup="javascript:updatePrio({{prio.pk}}, {{prio.task.pk}}, this.value)" onchange="javascript:updatePrio({{prio.pk}}, {{prio.task.pk}}, this.value)"></div><span class="badge badge-success mt-1 mb-3" id="save_{{prio.pk}}" style="display: none; font-size: 0.8em;">Gespeichert</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor%}
|
||||
<hr>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<a href="{% url 'users-dashboard' %}" class="btn btn-success">Zum Dashboard</a>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
function updatePrio(prio, task, value)
|
||||
{
|
||||
console.log({{userprio.pk}} + " " + prio + " " + task + " VAL: " + value);
|
||||
$.ajax(
|
||||
{
|
||||
type: "GET",
|
||||
url: "/dashboard/prioupdate",
|
||||
data:{
|
||||
userid: {{user_id}},
|
||||
prioid : 'adduser',
|
||||
taskid : task,
|
||||
value : value
|
||||
},
|
||||
success: function( data )
|
||||
{
|
||||
$('#save_'+prio).show();
|
||||
setTimeout(function() {
|
||||
$('#save_'+prio).fadeOut();
|
||||
}, 1000 );
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock content %}
|
||||
|
||||
|
|
@ -22,7 +22,9 @@ urlpatterns = [
|
|||
path('usersman/<int:pk>/perms', permission_required('users.users_usermanagement')(UsersPermUpdateView.as_view()), name='users-perm-update'),
|
||||
path('usersman/<int:pk>/delete', permission_required('users.users_usermanagement')(ProfileDeleteView.as_view()), name='users-delete'),
|
||||
path('agencyinfo/', views.agency, name='agencyinfo'),
|
||||
path('agencyinfo/<int:pk>/', permission_required('users.agency_change')(AgencyUpdateView.as_view()), name='agency-manage'),
|
||||
path('agencyinfo/<int:pk>/', permission_required('users.agency_change')(AgencyUpdateView.as_view()), name='agency-manage'),
|
||||
path('usersman/<int:pk>/prio', views.UsersPrio, name='users-prio'),
|
||||
path('prioupdate/', views.UsersPrioUpdate, name="users-prioupdate")
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -63,16 +63,15 @@ class UsersPermForm(forms.Form):
|
|||
Die erstellen Felder werden entsprechend den Feldern hinzugefügt und ausgegeben.
|
||||
|
||||
@param: user
|
||||
|
||||
- User ist der aufgerufene User!
|
||||
|
||||
'''
|
||||
'''
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
temprof = Profile
|
||||
for ele in temprof._meta.permissions:
|
||||
if isinstance(user, User):
|
||||
if isinstance(user, User):
|
||||
if user.has_perm('users.' + ele[0]):
|
||||
self.fields[ele[0]] = forms.BooleanField(initial=True, help_text=(ele[1]));
|
||||
self.fields[ele[0]] = forms.BooleanField(required=False, initial=True, help_text=(ele[1]))
|
||||
else:
|
||||
self.fields[ele[0]] = forms.BooleanField(initial=False, help_text=(ele[1]));
|
||||
self.fields[ele[0]] = forms.BooleanField(required=False, initial=False, help_text=(ele[1]))
|
||||
|
||||
|
|
|
|||
|
|
@ -10,16 +10,15 @@ from django.db import models
|
|||
from .models import Profile, Agency
|
||||
from django.core.mail import send_mail
|
||||
from django.contrib.auth.models import Permission
|
||||
from django.http import HttpResponseRedirect
|
||||
|
||||
|
||||
from django.http import HttpResponseRedirect,HttpResponse
|
||||
from areas.models import Areas
|
||||
from tasks.models import Tasks
|
||||
from .priomodel import Prio
|
||||
'''
|
||||
|
||||
DASHBOARD-View
|
||||
|
||||
View nach erfolgreichem Login und anzeige des Dashboards.
|
||||
|
||||
TODO: ROLLENVERTEILUNG
|
||||
View nach erfolgreichem Login Dashboard
|
||||
|
||||
Templates: welcomeusers.html und base.html
|
||||
|
||||
|
|
@ -109,19 +108,13 @@ class UsersCreateUser(LoginRequiredMixin, CreateView):
|
|||
# USER muss eingeloggt sein, um diese Seite zu sehen
|
||||
@login_required
|
||||
def profile(request):
|
||||
# NEUE DATEN KOMMEN AN!
|
||||
if request.method == 'POST':
|
||||
# Hier werden die Daten aus POST geholt und in die Instance(konkreten User) gespeichert
|
||||
u_form = UsersChangeProfil(request.POST, instance=request.user)
|
||||
#p_form = UsersAddProfileForm(request.POST, request.FILES, instance=request.user.profile)
|
||||
|
||||
|
||||
if u_form.is_valid():
|
||||
#if u_form.is_valid() and p_form.is_valid():
|
||||
u_form.save()
|
||||
#p_form.save()
|
||||
prename = request.user.first_name
|
||||
name = request.user.last_name
|
||||
#name = p_form.cleaned_data.get('name')
|
||||
messages.success(request, f'Daten für {prename} {name} aktualisiert!')
|
||||
# Daten neu laden und nicht die "Mächten sie die Daten speichern...?"
|
||||
return redirect('users-dashboard')
|
||||
|
|
@ -148,6 +141,7 @@ class UserManagementUpdateForm(LoginRequiredMixin, UpdateView):
|
|||
}
|
||||
fields = ['phoneland','phonemobile','compfunc']
|
||||
|
||||
# Update der Zugrifssrechte eines Users
|
||||
class UsersPermUpdateView(LoginRequiredMixin, View):
|
||||
template_name = 'users/users_perm.html'
|
||||
form_class = UsersPermForm
|
||||
|
|
@ -160,11 +154,6 @@ class UsersPermUpdateView(LoginRequiredMixin, View):
|
|||
user_tochange = Profile.objects.get(pk=kwargs['pk']).user
|
||||
return render (request, self.template_name, {'form':self.form_class(user_tochange), 'active_link': 'usersmanagement', 'user_tochange': user_tochange})
|
||||
|
||||
|
||||
#messages.success(self.request, f'Berechtigungen aktualisiert!')
|
||||
#print(form)
|
||||
#return super().form_valid(form)
|
||||
|
||||
# Handle POST GTTP requests
|
||||
def post(self, request, *args, **kwargs):
|
||||
permissions_loaded = dict(request.POST.lists())
|
||||
|
|
@ -178,7 +167,11 @@ class UsersPermUpdateView(LoginRequiredMixin, View):
|
|||
if ele[0] in permissions_loaded:
|
||||
user_tochange.user_permissions.add(tempperm)
|
||||
else:
|
||||
user_tochange.user_permissions.remove(tempperm)
|
||||
# Eingeloggter User darf sich nicht selbst die Userverwaltungsrechte entziehen
|
||||
if user_tochange == request.user and ele[0]=='users_usermanagement':
|
||||
messages.warning(request, f'Benutzerverwaltungsrechte für {user_tochange.first_name} {user_tochange.last_name} kann nicht entfernt werden.')
|
||||
else:
|
||||
user_tochange.user_permissions.remove(tempperm)
|
||||
user_tochange.save()
|
||||
messages.success(request, f'Berechtigungen für {user_tochange.first_name} {user_tochange.last_name} aktualisiert!')
|
||||
return HttpResponseRedirect('/dashboard/usersman/')
|
||||
|
|
@ -213,8 +206,6 @@ class ProfileDeleteView(LoginRequiredMixin, DeleteView):
|
|||
return False
|
||||
return True
|
||||
|
||||
|
||||
# USER muss eingeloggt sein, um diese Seite zu sehen
|
||||
@login_required
|
||||
def agency(request):
|
||||
context = {
|
||||
|
|
@ -233,4 +224,55 @@ class AgencyUpdateView(LoginRequiredMixin, UpdateView):
|
|||
def get_context_data(self, **kwargs):
|
||||
context = super(AgencyUpdateView, self).get_context_data(**kwargs)
|
||||
context['active_link'] = 'agencyinfo'
|
||||
return context
|
||||
return context
|
||||
|
||||
|
||||
# PRIORISIERUNG
|
||||
'''
|
||||
|
||||
Es werden alle Aufgabenbereiche den Bereichen der Agentur zugeordnet und ausgegeben.
|
||||
|
||||
'''
|
||||
def UsersPrio(request, pk):
|
||||
user = User.objects.get(pk=pk)
|
||||
|
||||
prios = Prio.objects.filter(user__pk=pk)
|
||||
|
||||
areas = Areas.objects.filter(agency__pk=request.user.profile.agency.pk)
|
||||
'''
|
||||
fulldata = []
|
||||
areas_dict = list(areas)
|
||||
|
||||
for area in areas_dict:
|
||||
fulldata.append({"areaname" : area.name, "area" : area, "tasks" : 0})
|
||||
|
||||
|
||||
for fulldataarea in fulldata:
|
||||
tasks_of_area = Tasks.objects.filter(area__pk=fulldataarea['area'].pk).exclude(pk__in=prios)
|
||||
fulldataarea['tasks'] = list(tasks_of_area)
|
||||
print(fulldataarea)
|
||||
|
||||
'''
|
||||
user_first_name = user.first_name
|
||||
user_last_name = user.last_name
|
||||
user_id = user.pk
|
||||
context = {
|
||||
'active_link' : '',
|
||||
'areas' : areas,
|
||||
'user_first_name' : user_first_name,
|
||||
'user_last_name' : user_last_name,
|
||||
'user_id' : user_id,
|
||||
'prios' : prios
|
||||
}
|
||||
return render(request, 'users/users_prio.html', context)
|
||||
|
||||
def UsersPrioUpdate(request):
|
||||
if request.method == 'GET':
|
||||
prio = Prio.objects.filter(user__pk=request.GET['userid']).filter(task__pk=request.GET['taskid'])
|
||||
prio = list(prio)[0]
|
||||
prio.prio = request.GET['value']
|
||||
prio.save()
|
||||
return HttpResponse("udated...")
|
||||
else:
|
||||
return HttpResponse("Request method is not a GET")
|
||||
|
||||