{% if messages %}
{% for message in messages %}
@@ -543,7 +542,7 @@ function removeNotification(notifyid){
}
-
+/*
$(document).on('click', function (e) {
if(e.target["id"] != 'chatButton'){
@@ -551,13 +550,13 @@ $(document).on('click', function (e) {
$("#chat_alluserscontent").fadeOut();
}
}
-});
+});*/
diff --git a/adm/templates/adm/adm_import_flow.html b/adm/templates/adm/adm_import_flow.html
new file mode 100644
index 0000000..9c52961
--- /dev/null
+++ b/adm/templates/adm/adm_import_flow.html
@@ -0,0 +1,264 @@
+{% extends "adm/adm_base.html" %}
+{% block content %}
+{% load adm_tags %}
+
+
Agenturimport der Agentur {{agency.name}}
+ Die Seite nicht verlassen oder neu laden!
+
+
+
Es werden {{groups|length}} Gruppen angelegt...
+
+
Es werden {{users|length}} Benutzer angelegt und in die Gruppen gepackt. Die Nutzer müssen sich dann ein neues Passwort setzen.
+
+
Es werden {{files|length}} Dateien und {{dirs|length}} Ordner angelegt und mit Zugriffsrechten gesetzt.
+
Gruppenordner wird angelegt
+
+
Standarddateien von {{standard_pk|length}} Standards werden neu zugewiesen...
+
Standarddateien konnten nicht zugewiesen werden. Bitte manuell prüfen.
+
+
Migration vollständig. Bitte diese Seite ausdrucken oder Speichern. Ein erneuter Import ist nicht möglich!
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/adm/templates/adm/adm_import_overview.html b/adm/templates/adm/adm_import_overview.html
new file mode 100644
index 0000000..b9b639f
--- /dev/null
+++ b/adm/templates/adm/adm_import_overview.html
@@ -0,0 +1,58 @@
+{% extends "adm/adm_base.html" %}
+{% block content %}
+{% load adm_tags %}
+
+
Agenturimport
+ Agenturen können hier importiert werden und erhalten einen detallierten Bericht. Bereits importierte Agenturen speichern ihre MainGroupID in Nextcloud
+
+
Benachrichtigungen{% if request.user.profile.showtooltips %} {% endif %}
@@ -170,7 +176,7 @@
{% endblock content %}
\ No newline at end of file
diff --git a/dasettings/templates/dasettings/user_usprof.html b/dasettings/templates/dasettings/user_usprof.html
index 4468ce6..b162fa3 100644
--- a/dasettings/templates/dasettings/user_usprof.html
+++ b/dasettings/templates/dasettings/user_usprof.html
@@ -61,8 +61,8 @@
{{ mail }}
-
-
E-Mail gesendet!
+
diff --git a/dasettings/views.py b/dasettings/views.py
index 357bf04..8987cb2 100644
--- a/dasettings/views.py
+++ b/dasettings/views.py
@@ -547,6 +547,7 @@ Hier werden die Profilinfos des User zurückgesetzt; Parameter kommen von Settin
- Passwort aktualisieren
'''
+import requests
@login_required
def SettingsProfilManagement(request, context):
# Check, which form
@@ -590,6 +591,10 @@ def SettingsProfilManagement(request, context):
context['passwordform'] = passwordform
return render(request, 'dasettings/settings.html', context)
+def get_random_number(length = 6):
+ result_str = ''.join(random.choice("0123456789") for i in range(length))
+ return result_str
+
@login_required
def SettingsAjaxRouter(request):
success = False
@@ -645,7 +650,7 @@ def SettingsAjaxRouter(request):
tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency)
data = {"funcname" : tempjob.name}
success = True
- # DELETE FINAL AGECY JOB
+ # DELETE FINAL AGENCY JOB
elif request.method == 'GET' and request.GET['action'] == "delete_agencyfunc" :
job_id = request.GET['id']
tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency)
@@ -663,7 +668,31 @@ def SettingsAjaxRouter(request):
group.agencygroupname = request.GET['newvalue']
group.save()
data = {"newvalue" : group.agencygroupname}
+
+ # Update Groupname in NC
+ '''
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true',
+ }
+ '''
+ '''
+ data_nc = {
+ "groupid" : group.nc_name,
+ "newvalue" : request.GET['newvalue']
+ }
+ '''
+ #r = requests.post(settings.NEXTCLOUD_URL + "/apps/agency/updateagencygroup", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+
+ data = {
+ "name": request.GET['newvalue'],
+ "id" : group.nc_name
+ }
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/da_agency/api/v1/renameagg?format=json", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data)
+ #r = requests.post(settings.NEXTCLOUD_URL + "/apps/agency/api/v1/renameagg", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
success = True
+ data = {"newvalue" : request.GET['newvalue']}
else:
success = False
# GRUPPENNAMEN HOLEN
@@ -671,21 +700,70 @@ def SettingsAjaxRouter(request):
group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency)
data = {"groupname" : group.agencygroupname}
success = True
+ # SAVE NEW GROUP ADD GROUP
elif request.method == 'GET' and request.GET['action'] == "add_group" :
if(checkForGroupName(request, request.GET['newvalue'])):
tempgroup = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8))
tempgroup.save()
tempgroup_ag = AgencyGroup(savefordel=False, group=tempgroup, agency=request.user.profile.agency, agencygroupname=request.GET['newvalue'])
- tempgroup_ag.save()
+
success = True
data = {"group_id" : tempgroup_ag.pk, "group_name" : tempgroup_ag.agencygroupname}
+ nc_groupid = "agencymaingroupid_" + str(tempgroup_ag.agency.pk) + "_subgroup_" + get_random_number()
+ tempgroup_ag.nc_name = nc_groupid
+ tempgroup_ag.save()
+
+ # ADD group in NC
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "groupid" : nc_groupid,
+ }
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v1.php/cloud/groups", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+
+ # Group created, set display name in NC
+ data_nc = {
+ "name": tempgroup_ag.agencygroupname,
+ "id" : nc_groupid
+ }
+
+ r = requests.post(settings.NEXTCLOUD_URL + "apps/agency/regr", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+
+ # Add current User to this Group
+ # TODO: Hier checken, ob das wirklich nötig ist...?
+ #data_nc = {
+ # "groupid" : nc_groupid
+ #}
+ data = {
+ "name": tempgroup_ag.agencygroupname,
+ "id" : nc_groupid
+ }
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/da_agency/api/v1/renameagg?format=json", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data)
+ #r = requests.post(settings.NEXTCLOUD_URL + "ocs/v1.php/cloud/users/" + request.user.username + "/groups", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+
else:
success = False
+ # DELETE A GROUP
elif request.method == 'GET' and request.GET['action'] == "delete_group" :
groupag = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency)
+
+ # DELETE GROUP IN NC
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "groupid" : groupag.nc_name,
+ }
+ r = requests.request("DELETE", settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/groups/" + groupag.nc_name,headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
group_to_del = groupag.group
group_to_del.delete()
success = True
+
# PERMISSIONS ON GROUP!
elif request.method == 'GET' and request.GET['action'] == "change_perm_group" :
success = True
@@ -716,6 +794,18 @@ def SettingsAjaxRouter(request):
aggroup.group.user_set.remove(usertoremove)
data = {"userid" : usertoremove.pk, "groupid" : aggroup.pk, "user_fname" : usertoremove.first_name, "user_lname" : usertoremove.last_name}
+ # User add
+ # NC REMOVE USER FROM GROUP
+ # first_name and last_name CHANGE - Update in NC as DisplayName
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "groupid" : aggroup.nc_name,
+ }
+ r = requests.request("DELETE", settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + usertoremove.username + "/groups",headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
else:
success = False
# ADD USER TO GROUP
@@ -729,6 +819,20 @@ def SettingsAjaxRouter(request):
if(request.user.profile.agency.pk == aggroup.agency.pk):
aggroup.group.user_set.add(usertoadd)
data = {"userid" : usertoadd.pk, "groupid" : aggroup.pk, "user_fname" : usertoadd.first_name, "user_lname" : usertoadd.last_name}
+
+ # User add
+ # NC ADD USER TO GROUP
+ # first_name and last_name CHANGE - Update in NC as DisplayName
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "groupid" : aggroup.nc_name,
+ }
+ r = requests.post(settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + usertoadd.username + "/groups",headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
+
else:
success = False
# AREA
@@ -851,8 +955,19 @@ def SettingsAjaxRouter(request):
success = False
else:
tempuser.email = newmail
- tempuser.username = newmail
+ #tempuser.username = newmail
tempuser.save()
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "key" : "email",
+ "value" : newmail
+ }
+ r = requests.put(settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + tempuser.username,headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
+ print(r.text)
success = True
else:
data = {"mail" : tempmail}
@@ -870,6 +985,18 @@ def SettingsAjaxRouter(request):
tempuser.save()
data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name}
success = True
+
+ # first_name and last_name CHANGE - Update in NC as DisplayName
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "key" : "displayname",
+ "value" : tempuser.first_name + " " + tempuser.last_name
+ }
+ r = requests.put(settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + tempuser.username,headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
else:
data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name}
success = False
@@ -1542,7 +1669,7 @@ def UserChangeMain(request, pk):
}
return render(request, 'dasettings/user_changemaindata.html', context)
-# Method for first User-Creation-Step
+# Method for first User-Creation-Step - NEW USER
@login_required
def NewUserFirstStep(request):
context = {
@@ -1551,24 +1678,45 @@ def NewUserFirstStep(request):
if request.method == 'POST':
newuserform = UserNewUserForm(request.POST)
if newuserform.is_valid():
- if(request.POST.get("sendmailnewuser")):
- msg_html = render_to_string('users/newusers_email.html', {'username': newuserform.cleaned_data.get('first_name') + " " + newuserform.cleaned_data.get('last_name')})
- send_mail(request.user.profile.agency.name + ' Account', 'Hallo ' + newuserform.cleaned_data.get('first_name') + ' ' + newuserform.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf https://app.digitale-agentur.com/password-reset/ ein Passwort.','noreply@digitale-agentur.com',[newuserform.cleaned_data.get('email')],html_message=msg_html,fail_silently=True)
+ #if(request.POST.get("sendmailnewuser")):
+ # msg_html = render_to_string('users/newusers_email.html', {'username': newuserform.cleaned_data.get('first_name') + " " + newuserform.cleaned_data.get('last_name')})
+ # send_mail(request.user.profile.agency.name + ' Account', 'Hallo ' + newuserform.cleaned_data.get('first_name') + ' ' + newuserform.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf https://app.digitale-agentur.com/password-reset/ ein Passwort.','noreply@digitale-agentur.com',[newuserform.cleaned_data.get('email')],html_message=msg_html,fail_silently=True)
newuser = newuserform.save(commit=False)
newuser.username = newuser.email
newprofile = Profile(agency=request.user.profile.agency, parent=None)
newprofile.save()
newuser.profile = newprofile
newuser.save()
+
+ # NEW USER IN DJANGO - ADD USER TO NC
+ # Data for the new User
+ try:
+ data_nc = {
+ "userid": newuser.username,
+ "password": "",
+ "displayName": newuser.first_name + " " + newuser.last_name,
+ "email": newuser.email,
+ "groups[]": "agencymaingroupid_" + str(request.user.profile.agency.pk)
+ }
+
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+
+ # Request for adding the new User
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v1.php/cloud/users", data=data_nc, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+ except:
+ pass
# USERTIME
user_time = UserTime(user=newuser)
user_time.save()
# USER NOTIFICATIONS
- user_notifications = UserNotifications(user=newuser)
- user_notifications.save()
-
- newuser.usernotifications = user_notifications
+ #user_notifications = UserNotifications.objects.create(user=newuser)
+ #user_notifications.save()
+ #newuser.usernotifications = user_notifications
newuser.usertime = user_time
diff --git a/digitaleagentur/asgi.py b/digitaleagentur/asgi.py
index 27056c6..25e5156 100644
--- a/digitaleagentur/asgi.py
+++ b/digitaleagentur/asgi.py
@@ -2,11 +2,11 @@
ASGI entrypoint. Configures Django and then runs the application
defined in the ASGI_APPLICATION setting.
"""
-
+'''
import os
import django
from channels.routing import get_default_application
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "digitaleagentur.settings")
-django.setup()
-application = get_default_application()
\ No newline at end of file
+'''
+#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "digitaleagentur.settings")
+#django.setup()
+#application = get_default_application()
\ No newline at end of file
diff --git a/digitaleagentur/routing.py b/digitaleagentur/routing.py
index f67ce3e..93b4e87 100644
--- a/digitaleagentur/routing.py
+++ b/digitaleagentur/routing.py
@@ -1,7 +1,9 @@
+'''
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import users.routing
+
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
'websocket': AuthMiddlewareStack(
@@ -9,4 +11,6 @@ application = ProtocolTypeRouter({
users.routing.websocket_urlpatterns
)
),
-})
\ No newline at end of file
+})
+
+'''
\ No newline at end of file
diff --git a/digitaleagentur/settings.py b/digitaleagentur/settings.py
index 06c63b4..67da986 100644
--- a/digitaleagentur/settings.py
+++ b/digitaleagentur/settings.py
@@ -25,14 +25,15 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Nach zehn Stunden läuft der Cookie ab!
# TASK: Zehn stunden auto-auslog einmal checken Sekunden!
-SESSION_COOKIE_AGE = 8*60*60
+SESSION_COOKIE_AGE = 100*60*60
+SESSION_COOKIE_SECURE = False
-
-CHANNELS_PRESENCE_MAX_AGE = 30
+#CHANNELS_PRESENCE_MAX_AGE = 30
# FOR SUMMERNOTE ORIGIN
-X_FRAME_OPTIONS = 'SAMEORIGIN'
+#X_FRAME_OPTIONS = 'SAMEORIGIN'
#X_FRAME_OPTIONS = 'ALLOWALL'
+X_FRAME_OPTIONS = 'allow-from *cloud.digitale-agentur.com'
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
@@ -47,10 +48,8 @@ MAILINFOKEY = "jka7sd8iukashdna78skduJAHDsu6dilaksdjba65a68iadbhjak"
#ALTER ZUM TESTEN
#LEX_API = "8f9ba01f-9e84-42c7-9548-48c254f14c19"
-# Neuer KEY
-LEX_API = "p6xxyzOul0BaLDr-xuhVNYNzZ5s"
# Gültig bis 17.10.2022
-#LEX_API = "8dcbd7a5-9447-417f-a4a4-989818742a36"
+LEX_API = "8dcbd7a5-9447-417f-a4a4-989818742a36"
# KEYS FOR ENCRYPTED FILE FIELDS
DEFF_SALT = 'A-!GDtuKp?H/H5-UUatEh6ZcG/6h-VQf1OkDORRkK0(:(qCf//'
@@ -62,6 +61,8 @@ DEFF_FETCH_URL_NAME = 'getdoc'
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
+NC_SECRETKEY = "lkjahstaszd76uhjNJABHM65rftzvb323ADSD567tzu9ztz"
+
# Application definition
INSTALLED_APPS = [
'django.contrib.contenttypes',
@@ -95,8 +96,8 @@ INSTALLED_APPS = [
'django_user_agents',
'rest_framework',
'rest_framework.authtoken',
- 'channels',
- 'channels_presence',
+ #'channels',
+ #'channels_presence',
'simple_history',
'captcha',
'auditlog',
@@ -112,11 +113,14 @@ MIDDLEWARE = [
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_user_agents.middleware.UserAgentMiddleware',
'simple_history.middleware.HistoryRequestMiddleware',
- 'auditlog.middleware.AuditlogMiddleware'
+ 'auditlog.middleware.AuditlogMiddleware',
+ #'users.middleware.oauth.OAuthMiddleware'
]
ROOT_URLCONF = 'digitaleagentur.urls'
+#CSRF_COOKIE_SECURE = False
+
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -134,16 +138,20 @@ TEMPLATES = [
]
REST_FRAMEWORK = {
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework.authentication.TokenAuthentication',
- ),
- 'DEFAULT_PERMISSION_CLASSES': [
- 'rest_framework.permissions.IsAuthenticated',
- ],
+ #'DEFAULT_AUTHENTICATION_CLASSES': (
+ #'rest_framework.authentication.TokenAuthentication',
+ #'rest_framework.permissions.AllowAny',
+ #),
+ #'DEFAULT_PERMISSION_CLASSES': [
+ # 'rest_framework.permissions.IsAuthenticated',
+ #],
}
-#WSGI_APPLICATION = 'digitaleagentur.wsgi.application'
+WSGI_APPLICATION = 'digitaleagentur.wsgi.application'
ASGI_APPLICATION = "digitaleagentur.routing.application"
+
+
+'''
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
@@ -152,6 +160,7 @@ CHANNEL_LAYERS = {
},
},
}
+'''
@@ -205,11 +214,11 @@ LOGIN_REDIRECT_URL = 'users-dashboard'
# LOGIN PAGE FOR LOGIN-REDIRECT
LOGIN_URL = 'login'
+# NC Default Login findet im Dashboard statt!
+#LOGIN_URL = NEXTCLOUD_URL
STATIC_URL = '/static/'
-
-
'''
SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) + '/..'
diff --git a/digitaleagentur/utils.py b/digitaleagentur/utils.py
index 1e461f2..2750adf 100644
--- a/digitaleagentur/utils.py
+++ b/digitaleagentur/utils.py
@@ -1,5 +1,7 @@
from timemanagement.models import *
from digitaleagentur.timemanagement_utils import *
+from django.conf import settings
+from django.shortcuts import redirect
'''
Hier sind Funktion implementiert, die in verschiedenen Module benötigt werden
@@ -44,6 +46,35 @@ def getAbsenceForOneDay(user, day):
- Abwesenheit ist der komplette Tag, dann wird dieser Arbeitstag gelöscht, wenn es is_time false ist, sprich die Zeiterfassung soll nicht angefasst werden
- Abwesenheit ist kompletter Tag und die Abwesenheit soll Zeiterfassung beeinflussen (z.B. Gleitzeit) dann wird der Arbeitstag nicht verändert. Ist die Gleitzeit ein halber Tag, wird die Zielarbeitszeit halbiert.
'''
+'''
+def checkAbsenceWorkdayCollide(absence):
+ # Alle einzelnen Tage der Abwesenheit werden durchgegangen:
+ # TODO: Hier einmal testen ob das korrekto ist
+ for day in daterange(absence.start, absence.end):
+ # Arbeitstage an diesem Tag werden geladen
+ #workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year)
+ workdays = Workday.objects.filter(user=absence.user, start__day=day.day, start__month=day.month, start__year=day.year)
+ # Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat.
+ for workday in workdays:
+ # Arbeitstag in Tag ohne Zeit umwandeln
+ # Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich.
+ #if absence.reason.is_time == False:
+ if absence.reason.is_time == True:
+ # Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren.
+ #if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year):
+ if(getIsAbsenceStartEndHalf(absence)):
+ workday.target = workday.target / 2
+ workday.save()
+ # Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht
+ else:
+ if workday.delflag == True:
+ workday.delflag = False
+ workday.save()
+ else:
+ workday.delflag = True
+ workday.save()
+
+'''
def checkAbsenceWorkdayCollide(absence):
# Alle einzelnen Tage der Abwesenheit werden durchgegangen:
for day in daterange(absence.start, absence.end):
@@ -68,6 +99,33 @@ def checkAbsenceWorkdayCollide(absence):
workday.delflag = True
workday.save()
+'''
+def checkAbsenceWorkdayCollideDelete(absence):
+ # Alle einzelnen Tage der Abwesenheit werden durchgegangen:
+ for day in daterange(absence.start, absence.end):
+ # Arbeitstage an diesem Tag werden geladen
+ workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year)
+
+ # Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat.
+ for workday in workdays:
+ # Arbeitstag in Tag ohne Zeit umwandeln
+ # Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich.
+ if absence.reason.is_time == False:
+ # Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren.
+ if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year):
+ if(getIsAbsenceStartEndHalf(absence)):
+ workday.target = workday.target / 2
+ workday.save()
+ # Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht
+ else:
+ workday.delflag = False
+ workday.save()
+ else:
+ # Sollte der ganze Tag mal als zu löschen markiert worden sein, wird dies hier zurückgenommen
+ if workday.delflag == True:
+ workday.delflag = False
+ workday.save()
+'''
def checkAbsenceWorkdayCollideDelete(absence):
# Alle einzelnen Tage der Abwesenheit werden durchgegangen:
for day in daterange(absence.start, absence.end):
@@ -94,10 +152,38 @@ def checkAbsenceWorkdayCollideDelete(absence):
-
-
-
-
+
+# NC LOGIN
+'''
+
+ A User has to be logged in in NC. If yes, we check the user-status and retrieving the userId. If the logged user by this session is the same we want to see in Django, than the user will logged in.
+
+ Double-Check: Logged-Session from NC (session-id cannot be hacked cause it is serverside) and we check userId local, django and NC
+
+'''
+
+import xmltodict, json, requests
+'''
+ getNCLoggedUserBySession
+
+ Returns the UserId of the user in the given session
+
+ @params:
+ - sid (string) from nc_session_id, saved in the server and cookie
+'''
+from django.core.mail import send_mail
+def getNCLoggedUserBySession(sid):
+ nc_login_headers = {'Authorization' : 'Bearer ' + sid}
+ r = requests.get(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/user_status/api/v1/user_status", headers=nc_login_headers)
+ xpars = xmltodict.parse(r.text)
+ js = json.dumps(xpars)
+
+ final_json = json.loads(js)
+ return final_json['ocs']['data']['userId']
+ #except:
+ # return redirect('users-dashboard')
+
+
diff --git a/firstrun.py b/firstrun.py
index 49b4e97..2de5e3e 100644
--- a/firstrun.py
+++ b/firstrun.py
@@ -1,6 +1,3 @@
-from django.conf import settings
-settings.configure()
-
from django.contrib.auth.models import User
from users.models import Profile,Agency
diff --git a/news/urls.py b/news/urls.py
index 13be753..de5e098 100644
--- a/news/urls.py
+++ b/news/urls.py
@@ -17,5 +17,5 @@ urlpatterns = [
path('newsga/', permission_required('users.modulenews')(views.NewsGoToArchiv), name="news-gotoarchiv"),
#path('standard//area', views.StandardArea, name="standard-area"),
- #path('standard//task', views.StandardTask, name="standard-task")
+ #path('standard//task', views.StandardTask, name="standard-task")
]
diff --git a/news/views.py b/news/views.py
index 0835f29..7dadf33 100644
--- a/news/views.py
+++ b/news/views.py
@@ -1,3 +1,4 @@
+from django.http.response import JsonResponse
from django.shortcuts import render, redirect
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView
@@ -17,6 +18,7 @@ class NewsManagement(LoginRequiredMixin, ListView):
# Loading only user same agency
# Change context and return for template-data
def get_context_data(self, **kwargs):
+
filterdate = timezone.now()
news = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__gt=filterdate).order_by('-created_date') | News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__isnull=True).order_by('-created_date')
@@ -134,8 +136,3 @@ def NewsSingle(request, pk):
return render(request, 'news/news_single.html', context)
-
-
-
-
-
diff --git a/recoverdir/views.py b/recoverdir/views.py
index a171fae..93ab0a6 100644
--- a/recoverdir/views.py
+++ b/recoverdir/views.py
@@ -465,7 +465,7 @@ class RecoverDirAddPL(CreateView):
template_name = "recoverdir/rd_pers_add.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -513,7 +513,7 @@ class RDAoneAddDoc(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_adddoc.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -544,7 +544,7 @@ class RDAoneViewDoc(DetailView):
context_object_name = 'document'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -556,7 +556,7 @@ class RDAoneDelDoc(DeleteView):
context_object_name = 'document'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -573,7 +573,7 @@ class RDAoneUpdateDoc(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_adddoc.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -625,7 +625,7 @@ class RDAoneUpdateHL(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_addhl.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -643,7 +643,7 @@ class RDAoneAddFC(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_addfc.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -664,7 +664,7 @@ class RDAoneUpdateContact(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_addfc.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -681,7 +681,7 @@ class RDAoneViewContact(DetailView):
context_object_name = 'contact'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -693,7 +693,7 @@ class RDAoneDelContact(DeleteView):
context_object_name = 'contact'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -711,7 +711,7 @@ class RDAoneViewTrust(DetailView):
context_object_name = 'contact'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -723,7 +723,7 @@ class RDAoneDelTrust(DeleteView):
context_object_name = 'contact'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -740,7 +740,7 @@ class RDAoneAddTrust(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_addtrust.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -761,7 +761,7 @@ class RDAoneUpdateTrust(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_1_addtrust.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -780,7 +780,7 @@ class RDAtwoAddHLFV(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addhlvf.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -801,7 +801,7 @@ class RDAtwoUpdateFV(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addhlvf.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -819,7 +819,7 @@ class RDAtwoViewdeposit(DetailView):
context_object_name = 'deposit'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -831,7 +831,7 @@ class RDAtwoDeldeposit(DeleteView):
context_object_name = 'deposit'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -848,7 +848,7 @@ class RDAtwoAdddeposit(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_adddeposit.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -877,7 +877,7 @@ class RDAtwoUpdatedeposit(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_adddeposit.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -899,7 +899,7 @@ class RDAtwoViewergo(DetailView):
context_object_name = 'ergo'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -911,7 +911,7 @@ class RDAtwoDelergo(DeleteView):
context_object_name = 'ergo'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -928,7 +928,7 @@ class RDAtwoAddergo(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addergo.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -949,7 +949,7 @@ class RDAtwoUpdateergo(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addergo.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -971,7 +971,7 @@ class RDAtwoViewonlinebank(DetailView):
context_object_name = 'onlinebank'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -983,7 +983,7 @@ class RDAtwoDelonlinebank(DeleteView):
context_object_name = 'onlinebank'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1000,7 +1000,7 @@ class RDAtwoAddonlinebank(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1030,7 +1030,7 @@ class RDAtwoUpdateonlinebank(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1059,7 +1059,7 @@ class RDAthreeViewstreaming(DetailView):
context_object_name = 'streaming'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1071,7 +1071,7 @@ class RDAthreeDelstreaming(DeleteView):
context_object_name = 'streaming'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1088,7 +1088,7 @@ class RDAthreeAddstreaming(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1117,7 +1117,7 @@ class RDAthreeUpdatestreaming(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1146,7 +1146,7 @@ class RDAfourViewdigitalaccount(DetailView):
context_object_name = 'account'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1159,7 +1159,7 @@ class RDAfourDeldigitalaccount(DeleteView):
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1176,7 +1176,7 @@ class RDAfourAdddigitalaccount(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1206,7 +1206,7 @@ class RDAfourUpdatedigitalaccount(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1235,7 +1235,7 @@ class RDAfiveViewpersonal(DetailView):
context_object_name = 'personal'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1247,7 +1247,7 @@ class RDAfiveDelpersonal(DeleteView):
context_object_name = 'personal'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1264,7 +1264,7 @@ class RDAfiveAddpersonal(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_5_addpersonal.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1286,7 +1286,7 @@ class RDAfiveUpdatepersonal(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_5_addpersonal.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1308,7 +1308,7 @@ class RDAnineViewelse(DetailView):
context_object_name = 'else'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1320,7 +1320,7 @@ class RDAnineDelelse(DeleteView):
context_object_name = 'ele'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1337,7 +1337,7 @@ class RDAnineAddelse(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_9_addelse.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1359,7 +1359,7 @@ class RDAnineUpdateelse(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_9_addelse.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1381,7 +1381,7 @@ class RDAsevenViewcontract(DetailView):
context_object_name = 'contract'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1393,7 +1393,7 @@ class RDAsevenDelcontract(DeleteView):
context_object_name = 'ele'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1410,7 +1410,7 @@ class RDAsevenAddcontract(CreateView):
template_name = "recoverdir/rd_elements_forms/rd_area_7_addcontract.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self)):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1431,7 +1431,7 @@ class RDAsevenUpdatecontract(UpdateView):
template_name = "recoverdir/rd_elements_forms/rd_area_7_addcontract.html"
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1454,7 +1454,7 @@ class PLSingleHistory(DetailView):
context_object_name = 'persletter'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1481,7 +1481,7 @@ class HLSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_1_hl_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1510,7 +1510,7 @@ class HLVFSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_2_hl_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1539,7 +1539,7 @@ class ContactSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_1_contact_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1568,7 +1568,7 @@ class TrustSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_1_trust_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1597,7 +1597,7 @@ class DepositSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_2_deposit_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1626,7 +1626,7 @@ class DocumentSingleHistory(DetailView):
template_name = 'recoverdir/rd_doc_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1655,7 +1655,7 @@ class ErgoSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_2_ergo_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1684,7 +1684,7 @@ class OnlinebankSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1713,7 +1713,7 @@ class StreamingSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1742,7 +1742,7 @@ class DigitalAccountSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1771,7 +1771,7 @@ class PersonalSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_5_personal_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1800,7 +1800,7 @@ class ContractSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_7_contract_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
@@ -1829,7 +1829,7 @@ class ElseSingleHistory(DetailView):
template_name = 'recoverdir/rd_elements_forms/rd_area_9_else_single.html'
def dispatch(self, *args, **kwargs):
- if(checkForLogin(self) and self.get_object().agency == self.request.user.profile.agency):
+ if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency):
return super().dispatch(*args, **kwargs)
else:
return redirect('recoverdir-login')
diff --git a/requirements.txt b/requirements.txt
index 684c26e..80ab509 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -36,3 +36,6 @@ xhtml2pdf==0.2.5
django-simple-captcha==0.5.13
auditlog3==1.0.1
filetype==1.0.7
+Authlib==0.15.3
+xmltodict==0.12.0
+django-user-sessions==1.7.1
\ No newline at end of file
diff --git a/standards/models.py b/standards/models.py
index 13dcfeb..e6fc628 100644
--- a/standards/models.py
+++ b/standards/models.py
@@ -22,7 +22,7 @@ class StandardComments(models.Model):
comment_by = models.ForeignKey(User, on_delete=models.CASCADE)
comment_on = models.DateTimeField(default=timezone.now, blank=True)
last_modified_on = models.DateTimeField(default=timezone.now, blank=True)
-
+
class Standards(models.Model):
agency = models.ForeignKey(Agency, on_delete=models.CASCADE)
area = models.ForeignKey(Areas, on_delete=models.SET_NULL, blank=True, null=True)
@@ -66,6 +66,8 @@ class Standards(models.Model):
# FILES
addedfiles = models.ManyToManyField(DataFile, blank=True)
+ addedfiles_nc = models.ManyToManyField('NCFile', blank=True)
+
# VERLINKTE STANDARDS
linked_standards = models.ManyToManyField('Standards', blank=True)
# GORUPS
@@ -94,3 +96,8 @@ class Standards(models.Model):
# Hier Path für Templates des Models mit Parametern
def get_absolute_url(self):
return reverse('standards-add', kwargs={'pk':self.pk})
+
+class NCFile(models.Model):
+ agency = models.ForeignKey(Agency, on_delete=models.CASCADE)
+ nc_id = models.IntegerField(default=0)
+ file_id = models.ForeignKey(DataFile, on_delete=models.CASCADE, null=True, blank=True, default=None)
diff --git a/standards/templates/standards/jscode_icon.js b/standards/templates/standards/jscode_icon.js
new file mode 100644
index 0000000..738f482
--- /dev/null
+++ b/standards/templates/standards/jscode_icon.js
@@ -0,0 +1,15 @@
+var button = document.createElement("a");
+button.innerHTML = '';
+
+// ICON
+button.classList.add("header-menu");
+
+var header = document.getElementsByClassName("header-right")[0];
+header.prepend(button);
+
+button.style.padding = "20px";
+
+
+button.addEventListener ("click", function() {
+ alert("did something");
+});
\ No newline at end of file
diff --git a/standards/templates/standards/standards_add.html b/standards/templates/standards/standards_add.html
index 264876e..e3f2d5f 100644
--- a/standards/templates/standards/standards_add.html
+++ b/standards/templates/standards/standards_add.html
@@ -5,7 +5,7 @@
{% if update == True %}
-
Standard Bearbeiten{% if request.user.profile.showtooltips %} {% endif %}
+
Standard Bearbeiten {% if request.user.profile.showtooltips %} {% endif %}
{% else %}
Neuen Standard anlegen{% if request.user.profile.showtooltips %} {% endif %}
{% endif %}
@@ -144,24 +144,29 @@
Verlinkte Dateien:
{% if update == True %}
- {% for f in standard.addedfiles.all %}
-
{{f.name}}
+ {% for f in standard.addedfiles_nc.all %}
+ {% getNCFileInfos request f.nc_id as filename %}
+
{{filename}}
{% endfor %}
{% endif %}
+
{% if user|usergperm:"filesmanager" %}
- klicken/hineinziehen
Dateien werden im Uploadordner für Standards gespeichert.
+ klicken/hineinziehen
Dateien werden im Verzeichnis Agenturdaten/Standards Uploadbereich gespeichert.
{% endif %}
@@ -717,8 +722,9 @@
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);
var isSafari = /Safari/.test(ua);
-
-if ( isIE || isSafari) {
+var isChrome = /Chrome/.test(ua);
+if ( isIE || (isSafari && !isChrome)) {
+
//IE specific code goes here
setInterval(function()
{
@@ -762,7 +768,7 @@ function checkGroupVerant(){
$("#id_group_verant").val(act_verant_group);
}
- console.log($("#id_group_verant").val());
+ //console.log($("#id_group_verant").val());
}
function removeGroupFromVeran(id, name){
@@ -772,7 +778,7 @@ function removeGroupFromVeran(id, name){
$("#id_group_verant").val(act_verant_group);
$("#span_btn_verant_group_" + id).remove();
- console.log($("#id_group_verant").val());
+ //console.log($("#id_group_verant").val());
}
//AUSFÜHRENDER
@@ -798,7 +804,7 @@ function checkGroupEx(){
$("#id_group_ex").val(act_ex_group);
}
- console.log($("#id_group_ex").val());
+ //console.log($("#id_group_ex").val());
}
function removeGroupFromEx(id, name){
@@ -808,7 +814,7 @@ function removeGroupFromEx(id, name){
$("#id_group_ex").val(act_ex_group);
$("#span_btn_ex_group_" + id).remove();
- console.log($("#id_group_ex").val());
+ //console.log($("#id_group_ex").val());
}
//VERTRETER
@@ -1005,8 +1011,8 @@ actualStandards = [];
actualFiles = [];
{% if update == True %}
actualFiles = [
- {% for f in standard.addedfiles.all %}
- '{{f.pk}}',
+ {% for f in standard.addedfiles_nc.all %}
+ '{{f.nc_id}}',
{% endfor %}
];
$("#id_added_files").val(actualFiles);
@@ -1054,8 +1060,7 @@ function clearSearchField(type){
function updateLinkedElements(type){
var g = $('#searchfield_' + type).val();
var id = $('#poss_' + type).find('option[value="' + g + '"]').attr('id');
-
- if(id != undefined && id.length > 0){
+ if((id != undefined || id != "undefined") && id.length > 0){
clearSearchField(type);
tempid = id.split("_")[1];
@@ -1100,6 +1105,7 @@ function remEle(type, id, name){
index_to_rem = actualFiles.indexOf(id);
actualFiles.splice(index_to_rem,1);
$("#id_added_" + type).val(actualFiles);
+
}
else if(type == 'quicklinks'){
index_to_rem = actualQuicklinks.indexOf(id);
@@ -1176,6 +1182,7 @@ function replaceFileDirectChoice(filetodo, choice){
doUploadAction(filetodo_ex, choice);
}
+
function uploadAction(filetodo){
filetodo_ex = filetodo;
@@ -1183,7 +1190,7 @@ function uploadAction(filetodo){
$.ajax(
{
type: "GET",
- url: "{% url 'cloud-adddir' parentid %}",
+ url: "{% url 'cloud-adddir' 0 %}",
data:{
action : "check_doublefile",
name : filetodo.name
@@ -1223,7 +1230,7 @@ function doUploadAction(filetodo, replacestat){
if(c && filetodo.type.length > 0){
$.ajax({
- url: "{% url 'cloud-adddir' parentid %}",
+ url: "{% url 'standard-uploadfile' %}",
headers: {
"X-CSRFTOKEN": "{{ csrf_token }}"
},
@@ -1246,6 +1253,7 @@ function doUploadAction(filetodo, replacestat){
return xhr;
},
success: function(data) {
+ console.log(data);
if(data["success"] == true){
setTimeout(function(){
hideUpload();
diff --git a/standards/templates/standards/standards_single.html b/standards/templates/standards/standards_single.html
index d5ffc01..602502d 100644
--- a/standards/templates/standards/standards_single.html
+++ b/standards/templates/standards/standards_single.html
@@ -27,7 +27,7 @@
- {% if standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %}
+ {% if standard.addedfiles_nc.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles_nc.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %}
{% else %}
@@ -42,7 +42,7 @@
- {% if standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %}
+ {% if standard.addedfiles_nc.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles_nc.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %}
@@ -131,19 +131,26 @@
- {% if standard.addedfiles.all|length > 0 %}
+ {% if standard.addedfiles_nc.all|length > 0 %}
Dateien
- {% for files in standard.addedfiles.all %}
- {{files.name|truncatechars:30}}
+ {% for file in standard.addedfiles_nc.all %}
+ {% getNCFileInfos request file.nc_id as filename %}
+ {% getNCFileInfosURL request file.nc_id as filelink %}
+ {% getNCDirInfosURL request file.nc_id as dirlink %}
+ {% getNextcloudURL as nc_url %}
+ {{filename|truncatechars:30}}
+
{% endfor %}
+
+{% endblock content %}
\ No newline at end of file
diff --git a/users/templates/users/nclog.html b/users/templates/users/nclog.html
new file mode 100644
index 0000000..9a3dcd3
--- /dev/null
+++ b/users/templates/users/nclog.html
@@ -0,0 +1 @@
+
{{error}}
\ No newline at end of file
diff --git a/users/templates/users/password_reset.html b/users/templates/users/password_reset.html
index a3cfc37..73965aa 100644
--- a/users/templates/users/password_reset.html
+++ b/users/templates/users/password_reset.html
@@ -1,25 +1,8 @@
-{% extends "users/publicbase.html" %}
-{% load crispy_forms_tags %}
-{% block content %}
-
-
-
-
-
Bitte geben Sie ihre E-Mailadresse ein, mit der Sie sich bei der Digitalen Agentur registriert haben.
-
-
-
-{% endblock content %}
\ No newline at end of file
+{% load static %}
+
+
\ No newline at end of file
diff --git a/users/templates/users/password_reset.html_SAVE b/users/templates/users/password_reset.html_SAVE
new file mode 100644
index 0000000..a3cfc37
--- /dev/null
+++ b/users/templates/users/password_reset.html_SAVE
@@ -0,0 +1,25 @@
+{% extends "users/publicbase.html" %}
+{% load crispy_forms_tags %}
+{% block content %}
+
+
+
+
+
Bitte geben Sie ihre E-Mailadresse ein, mit der Sie sich bei der Digitalen Agentur registriert haben.
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/users/templates/users/register.html b/users/templates/users/register.html
index bdc5651..73965aa 100644
--- a/users/templates/users/register.html
+++ b/users/templates/users/register.html
@@ -1,67 +1,8 @@
-
-{% extends "users/publicbase.html" %}
-
-{% load crispy_forms_tags %}
-
-{% block content %}
-
-
- {% if messages %}
- {% for message in messages %}
-
- {{ message }}
-
-
- {% endfor %}
- {% endif %}
-
-
-
-
-{% endblock content %}
\ No newline at end of file
+{% load static %}
+
+
\ No newline at end of file
diff --git a/users/templates/users/register.html_SAVE b/users/templates/users/register.html_SAVE
new file mode 100644
index 0000000..bdc5651
--- /dev/null
+++ b/users/templates/users/register.html_SAVE
@@ -0,0 +1,67 @@
+
+{% extends "users/publicbase.html" %}
+
+{% load crispy_forms_tags %}
+
+{% block content %}
+
+
+ {% if messages %}
+ {% for message in messages %}
+
+ {{ message }}
+
+
+ {% endfor %}
+ {% endif %}
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/users/templates/users/registercomplete.html b/users/templates/users/registercomplete.html
index d721e66..73965aa 100644
--- a/users/templates/users/registercomplete.html
+++ b/users/templates/users/registercomplete.html
@@ -1,24 +1,8 @@
-
-{% extends "users/publicbase.html" %}
-
-{% load crispy_forms_tags %}
-
-{% block content %}
-
-
-
-
-
-
Ihre Agentur wurde erfolgreich angelegt! Bitte prüfen Sie Ihre E-Mails, um sich ein Passwort für Ihren Account zu erstellen. Anschließend können Sie sich in Ihrer Agentur anmelden.
-
-
-
-{% endblock content %}
\ No newline at end of file
+{% load static %}
+
+
\ No newline at end of file
diff --git a/users/templates/users/registercomplete.html_SAVE b/users/templates/users/registercomplete.html_SAVE
new file mode 100644
index 0000000..d721e66
--- /dev/null
+++ b/users/templates/users/registercomplete.html_SAVE
@@ -0,0 +1,24 @@
+
+{% extends "users/publicbase.html" %}
+
+{% load crispy_forms_tags %}
+
+{% block content %}
+
+
+
+
+
+
Ihre Agentur wurde erfolgreich angelegt! Bitte prüfen Sie Ihre E-Mails, um sich ein Passwort für Ihren Account zu erstellen. Anschließend können Sie sich in Ihrer Agentur anmelden.
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/users/urls.py b/users/urls.py
index fcf564b..4131d2c 100644
--- a/users/urls.py
+++ b/users/urls.py
@@ -14,21 +14,16 @@ Permissions definiert in models.py bei USERS und dann hier vor die View geschrie
'''
urlpatterns = [
+ path('nclog/', views.ncLogin, name='nclog'),
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.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//', views.ProfileUpdateView, name='users-update'),
- #path('usersman//', permission_required('users.usermanager')(ProfileUpdateView.as_view()), name='users-update'),
path('usersman//perms', permission_required('users.usermanager')(UsersPermUpdateView.as_view()), name='users-perm-update'),
path('usersman//delete', permission_required('users.usermanager')(ProfileDeleteView.as_view()), name='users-delete'),
path('usersman/gd/', views.getDataFromToDelUser, name="users-delete-getdata"),
path('userlog/', views.showUserLog, name="users-log"),
- #path('agencyinfo/', views.agency, name='agencyinfo'),
- #path('agencyinfo//', permission_required('users.agency_change')(AgencyUpdateView.as_view()), name='agency-manage'),
path('usersman//prio', views.UsersPrio, name='users-prio'),
- #path('prioupdate/', views.UsersPrioUpdate, name="users-prioupdate"),
path('areataskupdate//', views.UsersAreaTaskUpdate, name="users-areataskupdate"),
path('globalsearch/', views.GlobalSearch, name="globalsearch"),
path('standardrout/', views.searchStandardRouter, name="standardrouter"),
@@ -46,9 +41,9 @@ urlpatterns = [
path('icsall/', views.getICSFileAll, name="geticsall"),
path('icspublic//', views.getICSFileEx, name="getics"),
path('icspublicall//', views.getICSFileExAll, name="geticsall"),
- path('updateuserorga/', views.UpdateUserOrga, name="update-user-orga")
- #path('recalculateabsence/', views.recalculateAbsence, name="recalculateabsence"),
-
+ path('updateuserorga/', views.UpdateUserOrga, name="update-user-orga"),
+ # OAUTH
+ #path('oauth/callback/', views.oauthCallBack, name="oauthcallback"),
]
diff --git a/users/views.py b/users/views.py
index 1a9c7b5..bee1abf 100644
--- a/users/views.py
+++ b/users/views.py
@@ -36,17 +36,17 @@ from message.models import Message
from notificsys.models import UserNotification
from organizer.models import AGContacts, AGPassword
import sys, os
-from asgiref.sync import async_to_sync
-from channels_presence.models import Room
-from channels_presence.models import Presence
-import channels.layers
+#from asgiref.sync import async_to_sync
+#from channels_presence.models import Room
+#from channels_presence.models import Presence
+#import channels.layers
from datetime import date, timedelta
from timemanagement.models import Workday, Absence, Breaks
import base64
import filetype
from django.db.models.signals import m2m_changed
from django.contrib.auth.models import User, Group
-from users.signals import adjust_group_notifications_permission
+#from users.signals import adjust_group_notifications_permission
from django.core.exceptions import ObjectDoesNotExist
from digitaleagentur.utils import *
from digitaleagentur.timemanagement_utils import *
@@ -67,6 +67,175 @@ import base64
from django.http import HttpResponse
+
+# NC LOGIN
+'''
+
+ A User has to be logged in in NC. If yes, we check the user-status and retrieving the userId. If the logged user by this session is the same we want to see in Django, than the user will logged in.
+
+ Double-Check: Logged-Session from NC (session-id cannot be hacked cause it is serverside) and we check userId local, django and NC
+
+'''
+import xmltodict, json
+import urllib.request as urllib2
+from django.contrib.auth import login, logout
+from django.core.mail import send_mail
+from django.views.generic import TemplateView
+
+def get_random_number(length = 6):
+ result_str = ''.join(random.choice("0123456789") for i in range(length))
+ return result_str
+
+def create_group_id(agencygroupname, agency):
+ newgroupid = ""
+ pregroupstr = "agencymaingroupid_"
+ if(agencygroupname == "Mitarbeiter"):
+ newgroupid = pregroupstr + str(agency.pk)
+ # NORMAL GROUOPS
+ elif(agencygroupname == "Administratoren"):
+ newgroupid = pregroupstr + str(agency.pk) + "_defaultadmingroup"
+ elif(agencygroupname == "Notfallhilfe"):
+ newgroupid = pregroupstr + str(agency.pk) + "_recover"
+ else:
+ newgroupid = pregroupstr + str(agency.pk) + "_subgroup_" + get_random_number()
+
+ return newgroupid
+
+def createNewAgencyByNC(request, uid):
+ print("CREATE NEW AGENCY")
+ # Creating Agency and prepare basic-Structure
+ email = uid
+ agency = Agency()
+ agency.name = email + "'s Agentur"
+ agency.vve = ""
+ agency.save()
+ pr=Profile()
+ pr.agency=agency
+
+ # Create new User
+ try:
+ print("CREATE NEW USER IN DJANGO")
+ user=User.objects.create_user(email, email, randomString(30))
+
+ except:
+ print("PREDICTED EXCEPT - CONTINUE")
+ user = User.objects.get(username=email)
+ user.first_name = email
+ user.last_name = email
+ user.usernotification = UserNotification()
+ #user.usertime = UserTime()
+ pr.user=user
+ pr.save()
+ user.profile = pr
+ user.save()
+ print("USER DONE")
+ request.user = user
+
+ # Creating all Standard-Django-Stuff
+ toUpdate(request)
+ loadPreStructure(agency)
+
+ # Creating all NC-Stuff
+ # Agency-Groupfolder and Standard-Folder
+ data = {
+ "gid" : "agencymaingroupid_" + str(agency.pk),
+ "aid" : str(agency.pk),
+ "newagency" : True
+ }
+
+ print("CREATING GROUPFOLDER")
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/da_agency/api/v1/creategf?format=json", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data)
+ print(r.text)
+
+
+ print("CREATING GROUPS IN NC FROM DJANGO")
+ groups = AgencyGroup.objects.filter(agency=agency)
+ for g in groups:
+ newgroupid = create_group_id(g.agencygroupname, agency)
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data = {
+ "groupid" : newgroupid
+ }
+ print("CREATE GROUP " + g.agencygroupname)
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v1.php/cloud/groups", data=data, headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+ print(r.text)
+
+ r_status = json.loads(r.text)
+ if(r_status['ocs']['meta']['statuscode'] == 100):
+ # Group created, save new group id in Django
+ g.nc_name = newgroupid
+ g.save()
+
+ # Group created, set display name in NC
+ data = {
+ "name": g.agencygroupname,
+ "id" : newgroupid
+ }
+ print("GROUP OK - CHANGE DISPLAY NAME")
+ r = requests.post(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/da_agency/api/v1/renameagg?format=json", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data)
+ print(r.text)
+
+ # Add current user to all Groups!
+ print("ADDING CURRENT USER TO ALL GROUPS")
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+ data_nc = {
+ "groupid" : g.nc_name,
+ }
+ r = requests.post(settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + user.username + "/groups",headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API), data=data_nc)
+ print(r.text)
+
+ print("CREATING STANDARDFOLDER")
+ r_2 = requests.request("MKCOL", settings.NEXTCLOUD_URL + "remote.php/dav/files/" + user.username + "/Agenturdaten/Standards Uploadbereich", auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+ print(r_2.text)
+
+ print("DONE! Redirecting to nclogin")
+ #return redirect(settings.NEXTCLOUD_URL)
+ #return redirect('nclog', uid)
+
+
+
+# Entry-Point for NC
+def ncLogin(request, uid):
+ logout(request)
+ #print(uid)
+ if(User.objects.filter(username=uid).exists()):
+ user = User.objects.get(username=uid)
+ if(len(user.profile.nc_sid) > 0 and getNCLoggedUserBySession(user.profile.nc_sid) == uid):
+ # Checking, if all necessary folders are created
+ #r = requests.request("MKCOL", settings.NEXTCLOUD_URL + "remote.php/dav/files/" + user.username + '/Agenturdaten/Standards Uploadbereich/', auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
+
+ headers = {
+ 'Authorization': 'Bearer ' + user.profile.nc_sid
+ }
+ # Groupfolder for Standards
+ r = requests.request("MKCOL", settings.NEXTCLOUD_URL + "remote.php/dav/files/" + user.username + '/Agenturdaten/Standards Uploadbereich/', headers=headers)
+
+ login(request, user)
+ return redirect('users-dashboard')
+ else:
+ return render(request, 'users/nclog.html',{'error' : "Die Agenturdaten wurden aktualisiert. Bitte melden Sie sich ab und wieder an. Sollten Sie diese Meldung weiterhin sehen, kontaktieren Sie den Support."})
+ else:
+ print("NO USER FOUND - NEW AGENCY REGISTRATION!")
+ createNewAgencyByNC(request, uid)
+ return render(request, 'users/nclog.html',{'error' : "Die Agenturdaten wurden aktualisiert. Bitte melden Sie sich ab und wieder an. Sollten Sie diese Meldung weiterhin sehen, kontaktieren Sie den Support."})
+
+ #return render(request, 'users/nclog.html',{'error' : "Die Agenturdaten wurden aktualisiert. Bitte melden Sie sich ab und wieder an. Sollten Sie diese Meldung weiterhin sehen, kontaktieren Sie den Support."})
+ #except:
+ #
+ # try:
+
+ # except:
+ # return render(request, 'users/nclog.html',{'error' : "Die Agenturdaten wurden aktualisiert. Bitte melden Sie sich ab und wieder an. Sollten Sie diese Meldung weiterhin sehen, kontaktieren Sie den Support."})
+ #return render(request, 'users/nclog.html',{'error' : "Die Agenturdaten wurden aktualisiert. Bitte melden Sie sich ab und wieder an. Sollten Sie diese Meldung weiterhin sehen, kontaktieren Sie den Support."})
+
def getICSFile(request, ag):
if 'HTTP_AUTHORIZATION' in request.META:
auth = request.META['HTTP_AUTHORIZATION'].split()
@@ -222,45 +391,6 @@ def getICSFileExAll(request, code, ag):
response.status_code = 404
return response
-'''
-def getICSFileExAll(request, code, ag):
- if(request.method == "GET"):
- #try:
- agency = Agency.objects.get(pk=ag)
- if agency != None and agency.agencycal_publicstatus == 1 and str(code) == str(agency.agencycalurl_all):
- c = Calendar()
- absencedays = Absence.objects.filter(agency=ag).exclude(confirm_status=2)
- for ab in absencedays:
- if ab.start != None and ab.end != None:
- e = Event()
- e.name = ab.user.first_name + " " + ab.user.last_name + " | " + ab.reason.name
- e.uid = "da-ab-" + str(ab.pk)
- if ab.start < ab.end:
- e.begin = ab.start
- e.end = ab.end
- else:
- e.begin = ab.start
- e.end = ab.start + timedelta(minutes=1)
- e.allday = True
- c.events.add(e)
- return HttpResponse(c, content_type='text/calendar')
- else:
- realm = ""
- response = HttpResponse()
- response.status_code = 400
- return response
- except:
- realm = ""
- response = HttpResponse()
- response.status_code = 403
- return response
- else:
- realm = ""
- response = HttpResponse()
- response.status_code = 404
- return response
-'''
-
'''
@@ -391,6 +521,14 @@ def toUpdate(request):
temgroup_verwaltung_ag = AgencyGroup(savefordel=True, is_admin=True, group=temgroup_verwaltung, agency=request.user.profile.agency, agencygroupname="Administratoren")
temgroup_verwaltung_ag.save()
+ temgroup_Notfallhilfe = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8))
+ temgroup_Notfallhilfe.save()
+ temgroup_Notfallhilfe_ag = AgencyGroup(savefordel=True, group=temgroup_Notfallhilfe, agency=request.user.profile.agency, agencygroupname="Notfallhilfe")
+ temgroup_Notfallhilfe_ag.save()
+
+ recoverdirmanagingperm = Permission.objects.get(codename='recoverdirmanager')
+ temgroup_Notfallhilfe_ag.group.permissions.add(recoverdirmanagingperm)
+
#print("default groups created...adding users...")
users_of_agency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk)
for user in users_of_agency:
@@ -425,7 +563,7 @@ def toUpdate(request):
#print("recoverdirgroup added and perms set")
# CHECK FOR ALL POSSIBLE RIGHTS ON ADMINGROUP
- m2m_changed.disconnect(adjust_group_notifications_permission, sender=Group.permissions.through)
+ #m2m_changed.disconnect(adjust_group_notifications_permission, sender=Group.permissions.through)
ag_admingroup = list(AgencyGroup.objects.filter(agency=request.user.profile.agency, is_admin=True))[0]
perms = AgencyGroup._meta.permissions
@@ -434,7 +572,7 @@ def toUpdate(request):
ag_admingroup.group.permissions.add(tempperm)
-
+ '''
# INITIAL ROOT DIR
rootdir = DataDir.objects.filter(is_root=True, agency__pk=request.user.profile.agency.pk)
@@ -470,7 +608,7 @@ def toUpdate(request):
#print("AGENCY DEF STANDARD DIR - FILESMODULE READY")
pass
-
+ '''
# CHANGE RIGHTS ORGNAIZER
admingroups = AgencyGroup.objects.filter(is_admin=True)
for a in admingroups:
@@ -478,7 +616,7 @@ def toUpdate(request):
a.group.permissions.add(Permission.objects.get(codename="agencynetwork"))
- m2m_changed.connect(adjust_group_notifications_permission, sender=Group.permissions.through)
+ #m2m_changed.connect(adjust_group_notifications_permission, sender=Group.permissions.through)
# USER TIME MODEL
usersofagency = User.objects.filter(profile__agency=request.user.profile.agency)
@@ -757,6 +895,7 @@ def showUserLog(request, pk):
context = {}
return render(request, 'users/userlog_forbidden.html', context)
+
@login_required
def dashboard(request):
# UPDATE FUNCTIONS BY NEW MODEL-CHANGES FOR COPIEN SOME DATA
@@ -1119,10 +1258,19 @@ class ProfileDeleteView(LoginRequiredMixin, DeleteView):
a.published_by = logged_user
a.save()
'''
+ # NC DELETE USER IN NC TOO!
+ headers = {
+ 'Accept' : 'application/json',
+ 'Access-Control-Allow-Headers' : 'OCS-APIRequest',
+ 'OCS-APIRequest' : 'true'
+ }
+
+ r = requests.request("DELETE", settings.NEXTCLOUD_URL + "/ocs/v1.php/cloud/users/" + user.username,headers=headers, auth=(settings.NEXTCLOUD_USER_API, settings.NEXTCLOUD_PW_API))
response = super(ProfileDeleteView, self).delete(request, *args, **kwargs)
name = user.first_name + " " + user.last_name
messages.success(request, f'Benutzer ' +name+ ' wurde gelöscht!')
+
return response
# Saves a new User in parent of others Users.