News Bugs behoben, Struktur angefangen, Bereiche bis auf löschen fertig inkl. Dragndrop-Order, CKEditor gelöscht

This commit is contained in:
holger.trampe 2020-02-11 23:10:28 +01:00
parent 8ce5f16163
commit 750b36dd2c
20 changed files with 11 additions and 873 deletions

View File

@ -1,22 +0,0 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<div class="media">
<div class="media-body">
<h2 class="account-heading">Bereich {{ object.name }} löschen?</h2>
<hr>
</div>
</div>
<!-- Für das Speichern der Bilder enctype -->
<form method="POST">
{% csrf_token %}
<p>Alle unter diesem Bereich erstellten Aufgaben und Standards werden gelöscht!</p>
<div class="form-group">
<button type="submit" class="btn btn-danger">Bereich löschen</button>&nbsp;
<a href="{% url 'areas-management' %}" class="btn btn-success">Abbrechen</a>
</div>
</form>
</div>
{% endblock content %}

View File

@ -1,43 +0,0 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6">
<h3>Neuen Bereich anlegen</h3>
<hr>
<form method="POST">
{% csrf_token %}
{{ form|crispy }}
<div class="form-group mb-2 mb-3">
<span>Farbe</span><input type="color" id="color-picker" name="areacolor " />
</div>
<p>Nachdem Erstellen eines Bereichs können Mitarbeiter zugewiesen werden.</p>
<hr>
<button type="submit" class="btn btn-success" href="{% url 'areas-addarea' %} ">Bereich anlegen</button>&nbsp;
<a class="btn" href="{% url 'areas-management' %} ">Abbrechen</a>
</form>
</div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/themes/classic.min.css"/> <!-- 'classic' theme -->
<script src="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/pickr.es5.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#div_id_color").hide();
})
const pickr1 = new Pickr({
el: '#color-picker',
default: "#000000",
components: {
preview: false,
hue: true
}
});
pickr1.on('changestop', function(){
var col = pickr1.getColor().toHEXA().toString();
pickr1.setColor(col);
$("#id_color").val(col);
});
</script>
{% endblock content %}

View File

@ -1,101 +0,0 @@
{% extends "users/base.html" %}
{% block content %}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<div class="content-section col-12">
<h3>Bereichsverwaltung</h3>
<hr>
<p>
Bereiche unterteilen die Agentur in verschiedene Verantwortungsbereiche.
</p>
<div class="row">
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'areas-addarea' %} ">Bereich anlegen</a>
</div>
</div>
<div class="row mt-3">
<div class="form-group mb-2">
<input class="form-control" id="tableSearch" size="50" type="text" placeholder="Suche in Tabelle...">
</div>
<div class="table-responsive">
<table class="table table-hover" id="areas_maintable">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Erstellt von</th>
<th scope="col">Erstellt am</th>
<th scope="col">Farbe</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody id="tableresults">
{% for item in areas_of_agency %}
<tr id="{{ item.pk }}">
<td>{{ item.name }}</td>
<td>{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}</td>
<td>{{ item.created_area_date }}</td>
<td><div style="width: 60px; height: 20px; background-color: {{ item.color }}"></div></td>
<td>
<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">Bereichsinfo</div>
<a class="dropdown-item" href="{% url 'areas-manage' item.pk %}">Bearbeiten</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{% url 'areas-delete' item.pk %}" >Löschen</a>
</div>
</div>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(document).ready(function(){
/*$('#areas_maintable').DataTable();*/
$("#tableSearch").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#tableresults tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
});
/*
Update the sort-list by drag'n'drop
*/
$( "tbody" ).sortable({
update: function( event, ui ) {
datatoserver = [];
var rows = $( "tbody" ).sortable( "widget" )[0]['rows'];
for(i = 0; i < rows.length; i++){
datatoserver.push({"id" : rows[i]['id'], "neworder" : i});
}
$.ajax(
{
type: "GET",
url: "/areas/updateorder",
data:{
action: "newareaorder",
finalod : JSON.stringify(datatoserver)
},
success: function( data )
{
console.log(data);
}
});
}
});
</script>
{% endblock content %}

View File

@ -1,172 +0,0 @@
{% extends "users/base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6" onmouseup="javascript:checkValue()">
<h3>Bereich aktualisieren</h3>
<hr>
<form method="POST">
{% csrf_token %}
{{ form|crispy }}
<div class="form-group mb-2 mb-3">
<span>Farbe</span><input type="color" id="color-picker" name="areacolor " />
</div>
<h6>Mitarbeiter hinzufügen</h6>
<div class="input-group mb-3">
<input class="form-control" list="usersfree" name="searchusers" id="searchusers" type="text" onkeyup="javascript:checkValue()" onchange="javascript:checkValue()" >
<div class="input-group-append">
<button type="button" id="addusertoareabtn" onclick="javascript:addUserToArea()" class="btn btn-success" disabled>Mitarbeiter hinzufügen</button>
<button type="button" onclick="javascript:clearSearchfield()" class="btn btn-secondary" ><i class="fas fa-times"></i></button>
</div>
<datalist id="usersfree">
{% for us in possible_users %}
<option id="{{us.pk}}" value="{{us.first_name}} {{us.last_name}}"></option>
{% endfor %}
</datalist>
</datalist>
</div>
<hr>
<h6>Zugewiesene Mitarbeiter</h6>
<div id="added_users_button">
{% if added_users|length > 0 %}
<p id="no_user_in_area" style="display: none">Noch kein Mitarbeiter zugewiesen.</p>
{% for us in added_users %}
<span id="span_btn_{{us.pk}}" class="badge badge-pill badge-primary mr-2 mt-2"><a class="btn btn-primary" onclick="javascript:removeUserFromArea('{{ us.pk }}')">{{ us.first_name }} {{ us.last_name }}&nbsp;&nbsp;<i class="fas fa-times"></i></a >
</span>
{% endfor %}
{% else %}
<p id="no_user_in_area">Diesem Bereich ist noch kein Mitarbeiter zugewiesen.</p>
{% endif %}
</div>
<hr>
<button type="submit" class="btn btn-success">Bereich aktualisieren</button>&nbsp;
<a class="btn" href="{% url 'areas-management' %} ">Abbrechen</a>
</form>
</div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/themes/classic.min.css"/> <!-- 'classic' theme -->
<script src="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/pickr.es5.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#div_id_color").hide();
})
const pickr1 = new Pickr({
el: '#color-picker',
default: "{{object.color}}",
components: {
preview: false,
hue: true
}
});
pickr1.on('changestop', function(){
var col = pickr1.getColor().toHEXA().toString();
pickr1.setColor(col);
$("#id_color").val(col);
});
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);
if ( isIE ) {
//IE specific code goes here
setInterval(function()
{
checkValue();
},250);
}
var tempid = null;
var tempcounter = 0;
function addUserToArea(){
$.ajax(
{
type: "GET",
url: "/areas/areaajax",
data:{
userid: tempid,
action : 'adduser',
objectid : {{objectid}}
},
success: function( data )
{
clearSearchfield();
//Add User-Button
$("#added_users_button").append('<span id="span_btn_'+data['userid']+'" class="badge badge-pill badge-primary mr-2 mt-2"><a class="btn btn-primary" onclick="javascript:removeUserFromArea('+data['userid']+')">'+data['username_clean']+'&nbsp;&nbsp;<i class="fas fa-times"></i></a ></span>');
$("#usersfree").empty();
for (var i in data['remaining_users']) {
id = data['remaining_users'][i]['id'];
name = data['remaining_users'][i]['first_name'] + " " + data['remaining_users'][i]['last_name'];
$("#usersfree").append('<option id="'+id+'" value="'+name+'"></option>');
}
if(data['remaining_users_counter'] == 0){
$("#no_user_in_area").show();
}
else {
$("#no_user_in_area").hide();
}
}
});
}
//Remove individual User from area, appened to the datalist!
function removeUserFromArea(user_id){
$.ajax(
{
type: "GET",
url: "/areas/areaajax",
data:{
userid: user_id,
action : 'remuser',
objectid : {{objectid}}
},
success: function( data )
{
//Remove User-Button
$("#span_btn_"+data['userid']).remove();
//Rebuilding the Datalist
$("#usersfree").empty();
for (var i in data['remaining_users']) {
id = data['remaining_users'][i]['id'];
name = data['remaining_users'][i]['first_name'] + " " + data['remaining_users'][i]['last_name'];
$("#usersfree").append('<option id="'+id+'" value="'+name+'"></option>');
}
if(data['remaining_users_counter'] == 0){
$("#no_user_in_area").show();
}
else {
$("#no_user_in_area").hide();
}
}
});
}
//Clearing searchfield and set AddUser to false
function clearSearchfield(){
$("#searchusers").val("");
$("#addusertoareabtn").prop('disabled', true);
}
//Check for valid input on inputfield
function checkValue(){
var g = $('#searchusers').val();
var id = $('#usersfree').find('option[value="' + g + '"]').attr('id');
if(id != undefined && id.length > 0){
tempid = id;
$("#addusertoareabtn").prop('disabled', false);
}
else{
tempid = null;
$("#addusertoareabtn").prop("disabled", true);
}
}
</script>
{% endblock content %}

View File

@ -1,7 +1,7 @@
from django.urls import path
from django.contrib.auth import views as auth_views
from django.contrib.auth.decorators import login_required, permission_required
from .views import AreasManagement, AreasAddArea, AreaDeleteView, AreaUpdateView
from . import views
'''
@ -12,10 +12,6 @@ Permissions definiert in models.py bei USERS und dann hier vor die View geschrie
'''
urlpatterns = [
path('', permission_required('users.areas_management')(AreasManagement.as_view(template_name="areas/areas_management.html")), name='areas-management'),
path('addarea/', permission_required('users.areas_management')(AreasAddArea.as_view(template_name="areas/areas_add.html")), name='areas-addarea'),
path('areas/<int:pk>/delete', permission_required('users.areas_management')(AreaDeleteView.as_view()), name='areas-delete'),
path('area/<int:pk>/', permission_required('users.areas_management')(AreaUpdateView.as_view()), name='areas-manage'),
path('areaajax/', views.area_addareas_ajax, name="area-ajaxview"),
path('updateorder/', views.area_neworder, name="area-ajaxorder")
]

View File

@ -9,98 +9,6 @@ from django.http import HttpResponse, JsonResponse
import json
class AreasManagement(LoginRequiredMixin, ListView):
model = Areas
# Adding active_link
# Loading only user same agency
# Change context and return for template-data
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# # Get all Users of the Same Agency as logged user
areas_of_agency = Areas.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('areaorder')
context.update({'active_link' : 'areasmanagement', 'areas_of_agency':areas_of_agency})
return context
class AreasAddArea(LoginRequiredMixin, CreateView):
model = Areas
success_url = '/areas'
#fields = ['name', 'color', 'desc', 'usersfield']
form_class = AreaAddAreaForm
#def get(self,request,*args, **kwargs):
# # User ist der hier Aufgerufene, bzw. das Profil!
# return render (request, self.template_name, {'form':self.form_class(self.request.user), 'active_link': 'areasmanagement'})
# Adding active_link
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({'active_link' : 'areasmanagement'})
return context
def form_valid(self, form):
# Send message to the site
messages.success(self.request, f'Bereich angelegt!')
# SAVE OBJECTS TO SIGNALE!
form.instance.agency = self.request.user.profile.agency
form.instance.created_area_by = self.request.user
return super().form_valid(form)
class AreaDeleteView(LoginRequiredMixin, DeleteView):
model = Areas
success_url = '/areas'
template_name = 'areas/area_confirm_delete.html'
def delete(self, request, *args, **kwargs):
area = Areas.objects.get(pk=kwargs['pk'])
response = super(AreaDeleteView, self).delete(request, *args, **kwargs)
name = area.name
messages.success(request, f'Bereich ' +name+ ' wurde gelöscht!')
return response
def get_context_data(self, **kwargs):
context = super(AreaDeleteView, self).get_context_data(**kwargs)
context['active_link'] = 'areasmanagement'
return context
# Hier andere Nutzer ändern, wenn man Usersmanagement darf!
class AreaUpdateView(LoginRequiredMixin, UpdateView):
model = Areas
template_name = 'areas/areas_update.html'
success_url = '/areas'
form_class = AreaAddAreaForm
def form_valid(self, form):
# Send message to the site
messages.success(self.request, f'Bereich aktualisiert!')
print(form)
return super().form_valid(form)
# Form wird geladen; Checkboxen werden vorbereitet und hier rausgerendert.
#def get(self,request,*args, **kwargs):
# # User ist der hier Aufgerufene, bzw. das Profil!
# loggeduser = request.user
#
# return render (request, self.template_name, {'form':self.form_class(loggeduser), 'active_link': 'usersmanagement'})
def get_context_data(self, **kwargs):
context = super(AreaUpdateView, self).get_context_data(**kwargs)
area = Areas.objects.get(pk=context['object'].pk)
# User still in Area
context['added_users'] = area.usersfield.all()
# Get all Users from same Agency which are NOT in context_added_users
possible_users = User.objects.filter(profile__agency__pk=self.request.user.profile.agency.pk).exclude(pk__in=context['added_users'])
context['possible_users'] = possible_users
# Active-Link for Base-Design
context['active_link'] = 'areasmanagement'
# Area ID
context['objectid'] = context['object'].pk
return context
def area_addareas_ajax(request):
if request.method == 'GET':

View File

@ -27,7 +27,7 @@ SECRET_KEY = '_qv2t2lmsctjxpbb4rrp=op%_20_hxzonv^mvty1o85c)l$s^q'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['digitale-agentur.com', 'www.digitale-agentur.com', 'localhost', "0.0.0.0"]
ALLOWED_HOSTS = ['digitale-agentur.com', 'www.digitale-agentur.com', 'localhost']
@ -45,9 +45,7 @@ INSTALLED_APPS = [
'news.apps.NewsConfig',
'crispy_forms',
'colorful',
'ckeditor',
'django_summernote',
'ckeditor_uploader',
'django.contrib.admin',
'mathfilters',
'django.contrib.humanize',
@ -89,43 +87,6 @@ TEMPLATES = [
WSGI_APPLICATION = 'digitaleagentur.wsgi.application'
ASGI_APPLICATION = 'digitaleagentur.routing.application'
# CKEDITOR
CKEDITOR_JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'
CKEDITOR_UPLOAD_PATH = "uploadsCK/" # <-- this folder you uploaded image saved in s3 under media folder
CKEDITOR_RESTRICT_BY_USER = False
CKEDITOR_REQUIRE_STAFF=False
AWS_QUERYSTRING_AUTH = True
CKEDITOR_IMAGE_BACKEND = "pillow"
#CKEDITOR_PLUGINS.addExternal('youtube', "../ckeditorplugins/youtube/youtube/plugin.js");
CKEDITOR_CONFIGS = {
'default': {
'skin': 'moono-lisa',
'toolbar_Basic': [
['Source', '-', 'Bold', 'Italic']
],
'toolbar_YourCustomToolbarConfig': [
{'name': 'basicstyles',
'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']},
{'name': 'paragraph',
'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-',
'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl',
'Language']},
{'name': 'links', 'items': ['Link', 'Unlink']},
{'name': 'styles', 'items': ['Styles', 'Format', 'Font', 'FontSize']},
{'name': 'colors', 'items': ['TextColor', 'BGColor']},
{'name': 'tools', 'items': ['Maximize', 'ShowBlocks']},
{'name': 'insert',
'items': ['Image', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak']},
'/', # put this to force next toolbar on new line
],
'toolbar': 'YourCustomToolbarConfig', # put selected toolbar config here
},
}
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

View File

@ -5,7 +5,6 @@ from django.conf import settings
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
'''
@ -46,8 +45,3 @@ urlpatterns = [
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
#urlpatterns += [
# path('ckeditor/upload/', login_required(upload), name='ckeditor_upload'),
# path('ckeditor/', include('ckeditor_uploader.urls')),
#]

View File

@ -2,11 +2,8 @@
{% block content %}
{% if request.user.profile.agency.module_news %}
<div class="content-section col-12">
<h3>News</h3>
<h3>News&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Hier können aktuelle Nachrichten für die Agentur erstellt und verwaltet werden." class="far fa-question-circle"></i></small></h3>
<hr>
<p>
Hier können aktuelle Nachrichten für die Agentur erstellt und verwaltet werden.
</p>
<div class="row">
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'news-add' %} " data-toggle="tooltip" data-placement="top" title="Neue News für Ihre Agentur erstellen"><i class="fas fa-plus"></i>&nbsp;News</a>

View File

@ -159,19 +159,6 @@
</li>
{%endif%}
-->
{% if perms.users.areas_management %}
{% if active_link == 'areasmanagement' %}
<li class="nav-item active">
{% else%}
<li class="nav-item">
{%endif%}
<a class="nav-link " href="{% url 'areas-management' %}" aria-expanded="true">
<i class="fas fa-fw fa-layer-group"></i>
<span>Bereiche</span>
</a>
</li>
{%endif%}
{% if perms.users.tasks_management %}
{% if active_link == 'tasksmanagement' %}
<li class="nav-item active">

View File

@ -1,262 +0,0 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}
<script src="{% static 'users/js/cropper.min.js' %}"></script>
<script src="{% static 'users/js/jquery-cropper.js' %}"></script>
<div class="content-section">
<div class="media">
<img class="img-profile " id="profpic" width="17%" src="{{ prof_user.profile.get_photo_url }}">
<div class="media-body col-5">
<h2 class="account-heading">Profil von {{ prof_user.first_name }} {{ prof_user.last_name }}</h2>
<hr>
<div class="row mt-2">
<div class="col-md-6">
<h6><b>Name</b></h6>
<p>
{{ prof_user.first_name}} {{ prof_user.last_name }}
</p>
<h6><b>E-Mail</b></h6>
<p>
{{ prof_user.email }}
</p>
<h6><b>Agenturfunktion</b></h6>
<p>
{{ prof_user.profile.get_func_display }}
</p>
</div>
<div class="col-md-6">
<h6><b>Tätigkeit</b></h6>
<p>
{{ prof_user.profile.compfunc }}
</p>
<h6><b>Festnetz</b></h6>
<p>
{{ prof_user.profile.phoneland }}
</p>
<h6><b>Mobil</b></h6>
<p>
{{ prof_user.profile.phonemobile }}
</p>
</div>
</div>
</div>
</div>
<!-- Für das Speichern der Bilder enctype -->
<div class="col-7 mt-5">
<form method="POST" id="newprofiledata" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">
Profil bearbeiten
</legend>
<!-- FORMS LADEN -->
{{ profileform_form|crispy }}
<button type="button" id="" onclick="javascript:sendPassMail({{prof_user.pk}})" class="btn btn-success">E-Mail mit Link zur Passworterstellung senden</button>&nbsp;&nbsp;<span class="alert alert-success" id="mailsend" role="alert" style="display: none;">&nbsp;E-Mail gesendet!</span>
</fieldset>
Übergeordneter Mitarbeiter: <span id="ps_act">{{prof_user.profile.parent.first_name}} {{prof_user.profile.parent.last_name}}</span>
<div class="input-group mb-3">
<input class="form-control" name="puser" id="puser" list="parentuser" type="text" onkeyup="javascript:checkValueAddParent()">
<div class="input-group-append">
<button type="button" id="addusertouserp" onclick="javascript:addUserParentUser()" class="btn btn-success" disabled>Festlegen</button>
<button type="button" onclick="javascript:clearSearchfield()" class="btn btn-secondary" ><i class="fas fa-times"></i></button>
</div>
<datalist id="parentuser" nmae="parentuser">
{% for us in possible_users %}
<option id="{{us.pk}}" value="{{us.first_name}} {{us.last_name}}"></option>
{% endfor %}
</datalist>
</div>
<hr>
<div class="form-group">
<button type="submit" class="btn btn-success">Speichern</button>&nbsp;
<a href="{% url 'users-management' %}" class="btn">Abbrechen</a>
</div>
</form>
</div>
</div>
<!-- MODAL TO CROP THE IMAGE -->
<!-- MODAL TO CROP THE IMAGE -->
<div class="modal fade " id="modalCrop" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Bereich bestimmen</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="clearImgField()">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="imgmodbody">
<img src="" id="imagemod" style="max-width: 100%; max-height: 100%;">
</div>
<div class="modal-footer">
<div class="btn-group pull-left" role="group">
<button type="button" class="btn btn-default js-zoom-in">
<span class="glyphicon glyphicon-zoom-in"></span>
</button>
<button type="button" class="btn btn-default js-zoom-out">
<span class="glyphicon glyphicon-zoom-out"></span>
</button>
</div>
<button type="button" class="btn btn-default" data-dismiss="modal" onclick="clearImgField()">Abbrechen</button>
<button type="button" class="btn btn-primary js-crop-and-upload">Ausschneiden</button>
</div>
</div>
</div>
</div>
{% block javascript %}
<script>
$("#id_x").val(0);
$("#id_y").val(0);
$("#id_width").val($("#profpic")[0]['naturalWidth']);
$("#id_height").val($("#profpic")[0]['naturalHeight']);
function clearImgField(){
$("#id_image").val("");
}
/* SCRIPT TO OPEN THE MODAL WITH THE PREVIEW */
$("#id_image").change(function () {
if (this.files && this.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$("#imagemod").attr("src", e.target.result);
$("#modalCrop").modal("show");
}
reader.readAsDataURL(this.files[0]);
}
});
var cropBoxData;
var canvasData;
var $image = $("#imagemod");
$("#modalCrop").on("shown.bs.modal", function () {
$image.cropper({
viewMode: 3,
aspectRatio: 1/1,
strict: false,
cropBoxMovable: true,
cropBoxResizable: true,
minCropBoxWidth: 200,
minCropBoxHeight: 200,
ready: function () {
$image.cropper("setCanvasData", canvasData);
$image.cropper("setCropBoxData", cropBoxData);
}
});
$("#imgmodbody").css({
"maxWidth": 465
});
}).on("hidden.bs.modal", function () {
cropBoxData = $image.cropper("getCropBoxData");
canvasData = $image.cropper("getCanvasData");
$image.cropper("destroy");
});
$(".js-zoom-in").click(function () {
$image.cropper("zoom", 0.1);
});
$(".js-zoom-out").click(function () {
$image.cropper("zoom", -0.1);
});
/* SCRIPT TO COLLECT THE DATA AND POST TO THE SERVER */
$(".js-crop-and-upload").click(function () {
var cropData = $image.cropper("getData");
$("#id_x").val(cropData["x"]);
$("#id_y").val(cropData["y"]);
$("#id_height").val(cropData["height"]);
$("#id_width").val(cropData["width"]);
$("#id_image").attr("src", $image);
$("#modalCrop").modal('toggle');
});
</script>
{% endblock %}
<script type="text/javascript">
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);
if ( isIE ) {
//IE specific code goes here
setInterval(function()
{
checkValueAddParent();
},250);
}
//Call Function in view to send e-mail with pass-reset-data
function sendPassMail(id){
$.ajax(
{
type: "GET",
url: "/dashboard/sendpassmail",
data:{
userid : {{prof_user.pk}}
},
success: function( data )
{
if(data["message"] == 0){
$("#mailsend").fadeIn().delay(4000).fadeOut();
}
}
});
}
tempid = null;
function clearSearchfield(){
$("#puser").val("");
$("#addusertouserp").prop('disabled', true);
}
function addUserParentUser(){
$.ajax(
{
type: "GET",
url: "/dashboard/setuserparent",
data:{
userid: tempid,
action : 'adduserp',
objectid : {{prof_user.pk}}
},
success: function( data )
{
console.log(data);
clearSearchfield();
//Add User-Button
$("#ps_act").html(data['username_clean']);
$("#parentuser").empty();
for (var i in data['remaining_users']) {
id = data['remaining_users'][i]['id'];
name = data['remaining_users'][i]['first_name'] + " " + data['remaining_users'][i]['last_name'];
$("#parentuser").append('<option id="'+id+'" value="'+name+'"></option>');
}
}
});
}
function checkValueAddParent()
{
var g = $('#puser').val();
var id = $('#parentuser').find('option[value="' + g + '"]').attr('id');
if(id != undefined && id.length > 0){
tempid = id;
$("#addusertouserp").prop('disabled', false);
}
else{
tempid = null;
$("#addusertouserp").prop('disabled', true);
}
}
</script>
{% endblock content %}

View File

@ -15,7 +15,7 @@
<p>Alle vom Benutzer erstellen Standards werden dem aktuellen Benutzer zugewiesen.<br /><small>(Aktuller Benutzer: {{request.user.pre_name}} {{request.user.last_name}})</small></p>
<div class="form-group">
<button type="submit" class="btn btn-danger">Benutzer löschen</button>&nbsp;
<a href="{% url 'users-management' %}" class="btn btn-success">Abbrechen</a>
<a href="{% url 'dasettings' %}" class="btn btn-success">Abbrechen</a>
</div>
</form>
</div>

View File

@ -1,24 +0,0 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6">
<h3>Neuer Benutzer</h3>
<hr>
<!-- FORMS LADEN users/userforms.py und users/views.py -->
<form method="POST">
{% csrf_token %}
{{ form|crispy }}
<div class="form-check">
<input class="form-check-input" type="checkbox" value="true" id="sendmailnewuser" name="sendmailnewuser">
<label class="form-check-label" for="sendmailnewuser" name="sendmailnewuser">
E-Mailbenachrichtigung schicken
</label>
</div>
<small>*: Der Benutzer erhält direkt eine E-Mail mit einem Link zur Passworterstellung, wenn der Haken bei <i>E-Mailbenachrichtung schicken</i> gesetzt ist. Dies kann später auch wiederholt werden.</small>
<hr>
<button type="submit" class="btn btn-success" href="{% url 'users-adduser' %} ">Benutzer anlegen</button>&nbsp;
<a class="btn" href="{% url 'users-management' %} ">Abbrechen</a>
</form>
</div>
{% endblock content %}

View File

@ -1,81 +0,0 @@
{% extends "users/base.html" %}
{% block content %}
<div class="content-section col-12">
<h3>Benutzerverwaltung</h3>
<hr>
<p>
Erstellen Sie weitere Mitarbeiter ihrer Agentur. Die neuen Benutzer erhalten eine E-Mail mit einem entsprechenden Link, um ihr Passwort zu generieren.
</p>
<div class="row mb-3">
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'users-adduser' %} ">Benutzer anlegen</a>
</div>
</div>
<div class="row">
<div class="form-group mb-2">
<input class="form-control" id="tableSearch" size="50" type="text" placeholder="Suche in Tabelle...">
</div>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Benutzername</th>
<th scope="col">E-Mail</th>
<th scope="col">Agenturfunktion</th>
<th scope="col">Tätigkeit</th>
<th scope="col">Telefon</th>
<th scope="col">Mobil</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody id="tableresults">
{% for item in users_of_agency %}
<tr>
<td><a href="{% url 'orga-single' item.pk %}">{{item.first_name }} {{ item.last_name }}</a></td>
<td>{{ item.username }}</td>
<td>{{ item.email }}</td>
<td>{{ item.profile.get_func_display }}</td>
<td>{{ item.profile.compfunc }}</td>
<td>{{ item.profile.phoneland }}</td>
<td>{{ item.profile.phonemobile }}</td>
<td>
<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>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'users-perm-update' item.profile.pk %}">Rechte</a>
<!--<div class="dropdown-header"></div>-->
<a class="dropdown-item" href="{% url 'users-areataskupdate' item.pk %}">Zuständigkeiten</a>
{% if item != request.user %}
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{% url 'users-delete' item.pk %}" >Löschen</a>
{% endif %}
</div>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<script>
$(document).ready(function(){
$("#tableSearch").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#tableresults tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
});
</script>
{% endblock content %}

View File

@ -16,13 +16,13 @@ Permissions definiert in models.py bei USERS und dann hier vor die View geschrie
urlpatterns = [
path('', views.dashboard, name='users-dashboard'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='users-logout'),
path('usersman/', permission_required('users.users_usermanagement')(UsersManagement.as_view(template_name="users/users_management.html")), name='users-management'),
path('usersman/adduser/', permission_required('users.users_usermanagement')(UsersCreateUser.as_view(template_name="users/users_adduser.html")), name='users-adduser'),
path('usersman/', permission_required('users.usermanager')(UsersManagement.as_view(template_name="users/users_management.html")), name='users-management'),
path('usersman/adduser/', permission_required('users.usermanager')(UsersCreateUser.as_view(template_name="users/users_adduser.html")), name='users-adduser'),
#path('usersman/profile/', views.profile, name='users-profile'),
#path('usersman/<int:pk>/', views.ProfileUpdateView, name='users-update'),
#path('usersman/<int:pk>/', permission_required('users.users_usermanagement')(ProfileUpdateView.as_view()), name='users-update'),
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('usersman/<int:pk>/', permission_required('users.usermanager')(ProfileUpdateView.as_view()), name='users-update'),
path('usersman/<int:pk>/perms', permission_required('users.usermanager')(UsersPermUpdateView.as_view()), name='users-perm-update'),
path('usersman/<int:pk>/delete', permission_required('users.usermanager')(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('usersman/<int:pk>/prio', views.UsersPrio, name='users-prio'),