Bugfixing und updates

This commit is contained in:
holger.trampe 2020-05-28 21:38:34 +01:00
parent b5d938a2d5
commit f8b21c8f8d
9 changed files with 211 additions and 14 deletions

View File

@ -0,0 +1,20 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
{% if request.user.profile.agency.module_timemanagement %}
<div class="content-section col-6">
<h3>Feiertage anlegen</h3>
<hr>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form.media}}
{{ form|crispy }}
<hr>
<button type="submit" class="btn btn-primary">Feiertage anlegen</button>&nbsp;
<a class="btn" href="{% url 'tm-managemenetfreedays' %} ">Abbrechen</a>
</form>
</div>
{% else %}
<h3>Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.</h3>
{% endif %}
{% endblock content %}

View File

@ -4,7 +4,8 @@
<div class="content-section col-12">
<h3>Feiertage und Schließtage</i></b>{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Erstellen Sie hier Feiertage und Tage, an denen Ihre Agentur generell geschlossen hat." class="far fa-question-circle"></i></small>{% endif %}
<a class="btn btn-primary btn-sm" href="{% url 'tm-freedayadd' %}" style="float: right;"><i class="fas fa-plus"></i>&nbsp;Freier Tag</a>
<a class="btn btn-primary btn-sm" href="#/" onclick="javascript:$('#addMulitpleFreeDays').modal('toggle')" style="float: right;"><i class="fas fa-plus"></i>&nbsp;Feiertage</a>&nbsp;
<a class="btn btn-primary btn-sm mr-2" href="{% url 'tm-freedayadd' %}" style="float: right;"><i class="fas fa-plus"></i>&nbsp;Freier Tag</a>
</h3>
<hr>
<div class="content-section col-12">
@ -59,6 +60,7 @@
</div>
</div>
<!-- PLZ MODAL -->
<div class="modal fade" tabindex="-1" role="dialog" id="plz_error" data-backdrop="static">
<div class="modal-dialog" role="document">
<div class="modal-content">
@ -78,6 +80,52 @@
</div>
</div>
<!-- Load freedays by year -->
<div class="modal fade" tabindex="-1" role="dialog" id="addMulitpleFreeDays" data-backdrop="static">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Feiertage laden</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Laden Sie Feiertage für entsprechende Jahre nach. <br />
<small>Es werden immer automatisch die Feiertage für die nächsten zwei Jahre geladen. </small>
<hr>
<div class="form-group">
<label for="">Jahr:</label>
{% getsomeyears 2023 as years %}
<select class="form-control" id="yearvalue">
{% for y in years %}
<option val="{{y}}" {% if y == yearvalue %} selected{% endif%}>{{y}}</option>
{% endfor %}
</select>
<hr>
<p>Wählen Sie aus, ob nur Feiertage für das Bundesland nach Ihrer PLZ geladen werden oder bundesweite Feiertage.</p>
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="freedays_plz" name="landchoice" checked>
<label class="custom-control-label" for="freedays_plz">Feiertage für meine PLZ ({{user.profile.agency.plz}})</label>
</div>
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="freedays_land" name="landchoice" >
<label class="custom-control-label" for="freedays_land">Deutschlandweite Feiertage</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" onclick="javascript:loadCustomFreeDays()" >Feiertage laden</button>
<button type="button" class="btn" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
@ -127,6 +175,34 @@
}
});
}
function loadCustomFreeDays(){
year = $("#yearvalue").val();
agencyplz = $("#freedays_plz").prop("checked");
land = $("#freedays_land").prop("checked");
$('#addMulitpleFreeDays').modal('toggle');
$.ajax(
{
type: "GET",
url: "{% url 'dasettings-ajax' %}",
data:{
action : "initloadfreedaysmulti",
year : year,
agencyplz : agencyplz,
land : land
},
success: function( data )
{
if(data["success"]){
window.location.href = "{% url 'tm-managemenetfreedays' %}";
}
else{
$("#plz_error").modal("toggle");
}
}
});
}
</script>
<style>
/* DATATABLES */
@ -135,4 +211,4 @@
border: 0px !important;
}
</style>
{% endblock content %}
{% endblock content %}

View File

@ -6,7 +6,8 @@
<table class="table hover" id="usertableall">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Vorname</th>
<th scope="col">Nachname</th>
<th scope="col">E-Mail</th>
<th scope="col">Agenturfunktion</th>
<th scope="col">Letzter Login</th>
@ -19,7 +20,8 @@
<tbody id="tableresults">
{% for item in usersofagency %}
<tr>
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{item.first_name }} {{ item.last_name }}</a></td>
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{item.first_name }}</a></td>
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{ item.last_name }}</a></td>
<td>{{ item.email }}</td>
<td>{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%}</td>
<td>{% if item.last_login != Nonte %}{{ item.last_login }}{% endif %}</td>
@ -48,11 +50,10 @@
</style>
<script>
$(document).ready(function(){
$('#usertableall').DataTable({
"order" : [],
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",

View File

@ -32,6 +32,8 @@ from django.views.generic import DeleteView, UpdateView
from timemanagement.forms import AddFreeDayForm
from django.urls import reverse_lazy
import re
import json
def randomString(stringLength=10):
"""Generate a random string of fixed length """
letters = string.ascii_lowercase
@ -82,7 +84,7 @@ def getAllForms(request, context):
# USER FOR USERTABLE
users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk)
users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name")
return context
@ -91,6 +93,30 @@ def getAllForms(request, context):
'''
@login_required
def DASettings(request):
# CHECK FOR EVERY USER YEAR-DATA
uina = User.objects.filter(profile__agency=request.user.profile.agency)
today = date.today()
for u in uina:
# NO YEARS FOUND
if len(UserYearAbsenceInfo.objects.filter(agency=request.user.profile.agency, user=u)) == 0:
# CREATE DATA FOR EVERY USER
UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year).save()
UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+1).save()
UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+2).save()
# CREATE DATE FOR YEAR PLUS 2
#elif len(UserYearAbsenceInfo.objects.filter(agency=user.profile.agency, year=today.year+2)) == 0:
# uina = User.objects.filter(profile__agency=user.profile.agency)
#
# for u in uina:
# UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save()
context = {
'active_link' : 'dasettings',
'baseurl' : settings.BASE_URL
@ -222,7 +248,8 @@ def FreeDayAdd(request):
"form" : AddFreeDayForm()
}
return render(request, 'dasettings/freedays_add.html', context)
class FreeDayDeleteView(LoginRequiredMixin, DeleteView):
model = FreeDays
success_url = reverse_lazy('tm-managemenetfreedays')
@ -672,6 +699,44 @@ def SettingsAjaxRouter(request):
else:
data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name}
success = False
# LOAD MULTIPLE FREEDAYS
elif request.method == 'GET' and request.GET['action'] == "initloadfreedaysmulti" :
if(request.user.has_perm('users.modulesconfig')):
#tempdays_year = False
if(request.GET["land"] == "true"):
tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], True)
if(tempdays_year != False):
#for k in tempdays_year:
# tempdate = tempdays_year[k][1].split("-")
# FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save()
#messages.success(request, f'Feiertage erfolgreich gespeichert!')
tempdays_year = json.loads(tempdays_year)
print(tempdays_year)
success = True
else:
success = False
else:
tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], False)
if(tempdays_year != False):
for k in tempdays_year.keys():
tempdate = tempdays_year[k]["datum"].split("-")
FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save()
messages.success(request, f'Feiertage erfolgreich gespeichert!')
success = True
else:
success = False
else:
data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name}
success = False
elif request.method == 'GET' and request.GET['action'] == "update_holidays" :
context = {
"user_years" : UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])),
@ -728,6 +793,35 @@ def loadingFreeDays(plz, year):
else:
return False
def loadingFreeDaysMulti(plz, year, onlyland):
# Getting land
file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv')
if(onlyland == False):
land = False
with open(file_path, 'rt') as csvfile:
filecsv = csv.reader(csvfile, delimiter=';')
for row in filecsv:
if str(row[1]) == str(plz):
land = row[6]
break;
URL = "https://feiertage-api.de/api/"
PARAMS = {'jahr':year,'nur_land':land}
r = requests.get(url = URL, params = PARAMS)
return r.json()
elif(onlyland == True):
URL = "https://feiertage-api.de/api/"
PARAMS = {'jahr':year,'nur_daten':1}
r = requests.get(url = URL, params = PARAMS)
return r.json()
else:
return False
'''
UserProfileUpdate
@ -934,6 +1028,11 @@ def NewUserFirstStep(request):
newuser.save()
newuser_id = newuser.id
messages.success(request, f'Benutzer angelegt!')
today = date.today()
UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year).save()
UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+1).save()
UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+2).save()
getadmingroup = AgencyGroup.objects.filter(savefordel=True, is_admin=False, agency=request.user.profile.agency)
for g in getadmingroup:
g.group.user_set.add(newuser)
@ -1181,3 +1280,4 @@ def ModSettingsTm(request):
return JsonResponse({})
else:
return JsonResponse({})

View File

@ -17,10 +17,6 @@ from datetime import datetime, timedelta
sec muss auf dem Server alle Account-Daten haben!!!
wenn fehlt dann anlegen!
Sonst klappt import nicht...
'''
from digitaleagentur.sec import *
@ -176,7 +172,7 @@ LOGIN_URL = 'login'
# https://docs.djangoproject.com/en/2.2/howto/static-files/
#SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
#SITE_ROOT = '/var/www/digitale-agentur.com/digitaleagentur/digitaleagentur/../'
#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static/'))
#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static'))
#DEV-UMBGEUNG
STATIC_URL = '/static/'

View File

@ -3,6 +3,7 @@ from django import forms
from django.forms import ModelForm
from .models import Absence, AbsenceReason, FreeDays
from users.models import UserFullName
from django.forms import HiddenInput
class AddAbsence(forms.ModelForm):
class Meta:
@ -84,4 +85,4 @@ class AddFreeDayForm(forms.ModelForm):
def __init__(self, *arg, **kwargs):
super(AddFreeDayForm, self).__init__(*arg, **kwargs)
self.fields['name'].required = True
self.fields['day'].required = True
self.fields['day'].required = True

View File

@ -106,6 +106,8 @@ def checkDefaultAbsenceReasons(sender, user, request, **kwargs):
for u in uina:
UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save()
'''
class UserYearAbsenceInfo(models.Model):
agency = models.ForeignKey(Agency, on_delete=models.PROTECT, default=None)

1
users/static/admin Symbolic link
View File

@ -0,0 +1 @@
/home/pi/vpython/lib/python3.7/site-packages/django/contrib/admin/static/admin/