Zwischenstand Kalender und Wettergeschichte
This commit is contained in:
parent
3da29bdef0
commit
0cd7f96274
|
|
@ -40,8 +40,42 @@
|
||||||
</table>
|
</table>
|
||||||
<small>Abwesenheitskategorien legen fest, wie sich eine Abwesenheit bzgl. Bestätigung durch einen Mitarbeiter mit entsprechenden Rechten und eines Vertretes verhält.</small>
|
<small>Abwesenheitskategorien legen fest, wie sich eine Abwesenheit bzgl. Bestätigung durch einen Mitarbeiter mit entsprechenden Rechten und eines Vertretes verhält.</small>
|
||||||
<hr>
|
<hr>
|
||||||
|
<h4 >Externer Zugriff{% if request.user.profile.showtooltips %} <small><i data-toggle="tooltip" data-placement="top" title="Legen Sie fest, wie Mitarbeiter auf die Abwesenheitsinformationen zugreifen können. Sollten Sie hier den öffentlichen Zugriff ohne Authentifizierung wählen, dürfen die Links nicht weitergegeben werden, da sonst Unbefugte Zugriff auf agenturinterne Daten haben. Ihre Agentur trägt für die Geheimhaltung dieser Links die Verantwortung." class="far fa-question-circle"></i></small>{% endif %}
|
||||||
|
</h4>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" value="" id="allowExternalAccess" {% if request.user.profile.agency.agencycal_publicstatus == 1 %} checked {% endif %} onchange="javascript:updateExAccess()">
|
||||||
|
<label class="form-check-label" for="allowExternalAccess">
|
||||||
|
Öffentlichen Zugriff ohne Anmeldung erlauben (z.B. für Google-Kalender)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
<a class="btn btn-primary mb-2" href="{% url 'tm-managemenetfreedays' %}">Feiertage bearbeiten</a>
|
<a class="btn btn-primary mb-2" href="{% url 'tm-managemenetfreedays' %}">Feiertage bearbeiten</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function updateExAccess(){
|
||||||
|
$.ajax(
|
||||||
|
{
|
||||||
|
type: "GET",
|
||||||
|
url: "{% url 'dasettings-ajax' %}",
|
||||||
|
data:{
|
||||||
|
newvalue : $("#allowExternalAccess").prop("checked"),
|
||||||
|
agency : {{request.user.profile.agency.pk}},
|
||||||
|
action : 'changeexternalaccess'
|
||||||
|
},
|
||||||
|
success: function( data )
|
||||||
|
{
|
||||||
|
$("#modulesettings_module_timemanagement").modal("toggle");
|
||||||
|
$("#externalAccessUpdate").modal("show");
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function updateTmSettings(){
|
function updateTmSettings(){
|
||||||
$.ajax(
|
$.ajax(
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,25 @@ $(document).ready(function(){
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Modal -->
|
||||||
|
<div class="modal fade" id="externalAccessUpdate" tabindex="20" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="exampleModalLabel">Externer Zugriff aktualisiert</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Die Zugriffseinstellung für den externen Zugriff wurden aktualisiert.
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary" data-dismiss="modal">Schließen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -999,11 +999,37 @@ def SettingsAjaxRouter(request):
|
||||||
if(request.user.has_perm('users.usermanager') and request.user.profile.agency == tempuser.profile.agency):
|
if(request.user.has_perm('users.usermanager') and request.user.profile.agency == tempuser.profile.agency):
|
||||||
deluntildate = tempuser.usertime.usetime_start
|
deluntildate = tempuser.usertime.usetime_start
|
||||||
delete_days = Workday.objects.filter(user=tempuser, start__lt=deluntildate).delete()
|
delete_days = Workday.objects.filter(user=tempuser, start__lt=deluntildate).delete()
|
||||||
|
return JsonResponse({"success" : success, "data" : data})
|
||||||
|
# Change external Access
|
||||||
|
elif request.method == "GET" and request.GET['action'] == "changeexternalaccess" :
|
||||||
|
|
||||||
|
if(request.user.has_perm('users.absencemanager') and request.user.profile.agency.pk == int(request.GET['agency'])):
|
||||||
|
if(request.GET['newvalue'] == "true"):
|
||||||
|
request.user.profile.agency.agencycal_publicstatus = 1
|
||||||
|
|
||||||
|
if len(request.user.profile.agency.agencycalurl) == 0:
|
||||||
|
request.user.profile.agency.agencycalurl = randomStringNum(30)
|
||||||
|
request.user.profile.agency.agencycalurl_all = randomStringNum(30)
|
||||||
|
|
||||||
|
request.user.profile.agency.save()
|
||||||
|
else:
|
||||||
|
request.user.profile.agency.agencycal_publicstatus = 0
|
||||||
|
request.user.profile.agency.save()
|
||||||
|
else:
|
||||||
|
success = False
|
||||||
|
print("DER NICHT")
|
||||||
|
|
||||||
|
|
||||||
return JsonResponse({"success" : success, "data" : data})
|
return JsonResponse({"success" : success, "data" : data})
|
||||||
else:
|
else:
|
||||||
success = False
|
success = False
|
||||||
return JsonResponse({"success" : success, "data" : data})
|
return JsonResponse({"success" : success, "data" : data})
|
||||||
|
|
||||||
|
def randomStringNum(stringLength=20):
|
||||||
|
"""Generate a random string of fixed length """
|
||||||
|
lettersAndNumbers = string.ascii_lowercase + string.digits
|
||||||
|
return ''.join(random.choice(lettersAndNumbers) for i in range(stringLength))
|
||||||
|
|
||||||
|
|
||||||
def loadingFreeDays(plz, year):
|
def loadingFreeDays(plz, year):
|
||||||
# Getting land
|
# Getting land
|
||||||
|
|
@ -1793,8 +1819,6 @@ class BillPlanUpdate(UpdateView):
|
||||||
else:
|
else:
|
||||||
mail_to_send = self.request.user.profile.agency.payment_address
|
mail_to_send = self.request.user.profile.agency.payment_address
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
msg_html = render_to_string('users/newbill_mail.html', {})
|
msg_html = render_to_string('users/newbill_mail.html', {})
|
||||||
send_mail('Digitale Agentur | Rechnung', 'Sehr geehrte Nutzer, es wurde eine Rechnung für Ihre digitale Agentur erstellt. Diese können Sie unter Einstellungen, Abrechnung einsehen.','noreply@digitale-agentur.com',[mail_to_send],html_message=msg_html,fail_silently=True)
|
send_mail('Digitale Agentur | Rechnung', 'Sehr geehrte Nutzer, es wurde eine Rechnung für Ihre digitale Agentur erstellt. Diese können Sie unter Einstellungen, Abrechnung einsehen.','noreply@digitale-agentur.com',[mail_to_send],html_message=msg_html,fail_silently=True)
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -94,6 +94,47 @@ def is_member(id, groupname):
|
||||||
usertocheck = User.objects.get(pk=id)
|
usertocheck = User.objects.get(pk=id)
|
||||||
return usertocheck.groups.filter(name=groupname).exists()
|
return usertocheck.groups.filter(name=groupname).exists()
|
||||||
|
|
||||||
|
|
||||||
|
# Gibt eine zeitabhängige Nachricht zurück (Guten Morgen, Guten Tag, Guten Abend)
|
||||||
|
|
||||||
|
@register.simple_tag(name="gettimemessage")
|
||||||
|
def getTimeMessage():
|
||||||
|
|
||||||
|
hour = datetime.datetime.now().hour
|
||||||
|
returnstring = ""
|
||||||
|
|
||||||
|
if hour >= 5 and hour < 11:
|
||||||
|
returnstring = "Guten Morgen"
|
||||||
|
elif hour >= 11 and hour < 18:
|
||||||
|
returnstring = "Guten Tag"
|
||||||
|
elif hour >= 18 and hour <= 23:
|
||||||
|
returnstring = "Guten Abend"
|
||||||
|
elif hour >= 0 and hour < 5:
|
||||||
|
returnstring = "Guten Abend"
|
||||||
|
return returnstring
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
# Gibt Wetterdaten zurück als String
|
||||||
|
@register.simple_tag(name="getlocalweather")
|
||||||
|
def getLocalWeather(user):
|
||||||
|
weatherinfodata = []
|
||||||
|
|
||||||
|
agency = user.profile.agency
|
||||||
|
if len(agency.city) > 0:
|
||||||
|
r = requests.get('http://api.openweathermap.org/data/2.5/weather?q='+agency.city+'&lang=de&units=metric&APPID=e37ac762a3c233f5fbc434c72df7961f')
|
||||||
|
weatherinfo = r.json()
|
||||||
|
print(weatherinfo)
|
||||||
|
weatherinfodata.append("| " + weatherinfo['weather'][0]['description'])
|
||||||
|
weatherinfodata.append(weatherinfo['weather'][0]['icon'])
|
||||||
|
weatherinfodata.append(str(weatherinfo['main']['temp']) + " °C")
|
||||||
|
else:
|
||||||
|
weatherinfodata = ""
|
||||||
|
|
||||||
|
return weatherinfodata
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Return a Filename splitted to only see the LAST element!
|
# Return a Filename splitted to only see the LAST element!
|
||||||
@register.filter(name="splitdirstyle")
|
@register.filter(name="splitdirstyle")
|
||||||
def split_dir_style(dirtosplit):
|
def split_dir_style(dirtosplit):
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@
|
||||||
{% getBaseURLIcsLink request.user.profile.agency as icsurl %}
|
{% getBaseURLIcsLink request.user.profile.agency as icsurl %}
|
||||||
<b>{{icsurl}}</b>
|
<b>{{icsurl}}</b>
|
||||||
<a href="#\" onclick="javascript:copyURL('{{icsurl}}')"><i class="far fa-copy"></i></a>
|
<a href="#\" onclick="javascript:copyURL('{{icsurl}}')"><i class="far fa-copy"></i></a>
|
||||||
<span id="icsurl" style="display: none;">Kopiert!</span>
|
<span id="icsurl" style="display: none;">Kopiert!</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-primary " data-dismiss="modal">Schließen</button>
|
<button type="button" class="btn btn-primary " data-dismiss="modal">Schließen</button>
|
||||||
|
|
@ -344,7 +344,8 @@
|
||||||
<script>
|
<script>
|
||||||
function copyURL(urldata){
|
function copyURL(urldata){
|
||||||
var $temp = $("<input>");
|
var $temp = $("<input>");
|
||||||
$("body").append($temp);
|
$("#showICSLink").append($temp);
|
||||||
|
$temp.val(urldata).focus();
|
||||||
$temp.val(urldata).select();
|
$temp.val(urldata).select();
|
||||||
document.execCommand("copy");
|
document.execCommand("copy");
|
||||||
$temp.remove();
|
$temp.remove();
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,12 @@ class Agency(models.Model):
|
||||||
phone = models.CharField(default="", max_length=50, blank=True)
|
phone = models.CharField(default="", max_length=50, blank=True)
|
||||||
agencypic = models.ImageField(default='ag_default.jpg', upload_to=picturepath_agency, blank=True)
|
agencypic = models.ImageField(default='ag_default.jpg', upload_to=picturepath_agency, blank=True)
|
||||||
|
|
||||||
|
agencycalurl = models.CharField(default="", blank=True, max_length=1000)
|
||||||
|
agencycalurl_all = models.CharField(default="", blank=True, max_length=1000)
|
||||||
|
# Gibt an, welche Schnittstellen für Kalenderlinks offen sind
|
||||||
|
# 0 = Nur Kalenderdaten per Authenzifizierung
|
||||||
|
# 1 = Kalenderdaten per Authentifizierung UND OHNE (für Google-Kalender)
|
||||||
|
agencycal_publicstatus = models.IntegerField(default=0)
|
||||||
# MONEY
|
# MONEY
|
||||||
#balance = models.FloatField(default=0.0, max_length=9, blank=True)
|
#balance = models.FloatField(default=0.0, max_length=9, blank=True)
|
||||||
#nextdebiting = models.DateTimeField(default=timezone.now, blank=True)
|
#nextdebiting = models.DateTimeField(default=timezone.now, blank=True)
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,13 @@
|
||||||
{% load counter_tag %}
|
{% load counter_tag %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content-section col-12">
|
<div class="content-section col-12">
|
||||||
<h3>Willkommen, {{request.user.first_name}} {{request.user.last_name}}!</h3>
|
{% gettimemessage as timemessage %}
|
||||||
<small>Letzter Login: {{ request.user.last_login }}</small>
|
<h3>{{timemessage}}, {{request.user.first_name}} {{request.user.last_name}}!</h3>
|
||||||
|
<small>Letzter Login: {{ request.user.last_login }}
|
||||||
|
{% getlocalweather request.user as weatherdata %}
|
||||||
|
{% if request.user.profile.agency.city|length > 0 %}
|
||||||
|
{{weatherdata.0}}<img src='https://openweathermap.org/img/wn/{{weatherdata.1}}.png' width="45px" style="margin-bottom: -5px; padding-right: -20px; margin-left: -10px; margin-top: -15px; margin-right: -6px;">{{weatherdata.2}}</small>
|
||||||
|
{% endif %}
|
||||||
<hr>
|
<hr>
|
||||||
<h5>Agentur: <b>{{ request.user.profile.agency.name }}</b></h5>
|
<h5>Agentur: <b>{{ request.user.profile.agency.name }}</b></h5>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
|
||||||
|
|
@ -171,6 +171,11 @@ def randomString(stringLength=10):
|
||||||
letters = string.ascii_lowercase
|
letters = string.ascii_lowercase
|
||||||
return ''.join(random.choice(letters) for i in range(stringLength))
|
return ''.join(random.choice(letters) for i in range(stringLength))
|
||||||
|
|
||||||
|
def randomStringNum(stringLength=20):
|
||||||
|
"""Generate a random string of fixed length """
|
||||||
|
lettersAndNumbers = string.ascii_lowercase + string.digits
|
||||||
|
return ''.join(random.choice(lettersAndNumbers) for i in range(stringLength))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def toUpdate(request):
|
def toUpdate(request):
|
||||||
# NO AGENVYJOBS
|
# NO AGENVYJOBS
|
||||||
|
|
@ -183,7 +188,12 @@ def toUpdate(request):
|
||||||
Auszubildender
|
Auszubildender
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
if len(request.user.profile.agency.agencycalurl) == 0:
|
||||||
|
request.user.profile.agency.agencycalurl = randomStringNum(30)
|
||||||
|
request.user.profile.agency.agencycalurl_all = randomStringNum(30)
|
||||||
|
|
||||||
|
request.user.profile.agency.save()
|
||||||
|
print("CAL-URLS updated for " + str(request.user.profile.agency.pk))
|
||||||
|
|
||||||
agencyjobsobject = AgencyJob.objects.filter(agency__pk=request.user.profile.agency.pk)
|
agencyjobsobject = AgencyJob.objects.filter(agency__pk=request.user.profile.agency.pk)
|
||||||
if(len(agencyjobsobject) == 0):
|
if(len(agencyjobsobject) == 0):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue