From 361dfc4158ba5967ec8c348ee1abc251c9442dbd Mon Sep 17 00:00:00 2001 From: "holger.trampe" Date: Fri, 21 Feb 2020 23:04:59 +0100 Subject: [PATCH] Notificsys fehlte --- .../areas/area_confirm_delete_DELETE.html | 22 + areas/templates/areas/areas_add_DELETE.html | 43 + .../areas/areas_management_DELETE.html | 101 +++ .../templates/areas/areas_update_DELETE.html | 172 ++++ .../__pycache__/functionviews.cpython-38.pyc | Bin 0 -> 1154 bytes cloud/migrations/0005_datadir.py | 32 + cloud/migrations/0006_datafiles.py | 32 + cloud/migrations/0007_auto_20200214_2236.py | 24 + cloud/migrations/0008_auto_20200214_2237.py | 18 + cloud/migrations/0009_auto_20200214_2238.py | 20 + cloud/migrations/0010_auto_20200214_2241.py | 21 + cloud/migrations/0011_auto_20200214_2241.py | 21 + cloud/migrations/0012_auto_20200214_2313.py | 25 + cloud/migrations/0013_auto_20200215_1347.py | 19 + cloud/migrations/0014_auto_20200215_1411.py | 19 + cloud/migrations/0015_auto_20200215_1427.py | 27 + .../0016_remove_datadir_datafiles.py | 17 + cloud/migrations/0017_auto_20200215_1910.py | 30 + cloud/migrations/0018_auto_20200215_1911.py | 30 + .../__pycache__/0005_datadir.cpython-38.pyc | Bin 0 -> 1413 bytes .../__pycache__/0006_datafiles.cpython-38.pyc | Bin 0 -> 1382 bytes .../0007_auto_20200214_2236.cpython-38.pyc | Bin 0 -> 847 bytes .../0008_auto_20200214_2237.cpython-38.pyc | Bin 0 -> 600 bytes .../0009_auto_20200214_2238.cpython-38.pyc | Bin 0 -> 677 bytes .../0010_auto_20200214_2241.cpython-38.pyc | Bin 0 -> 796 bytes .../0011_auto_20200214_2241.cpython-38.pyc | Bin 0 -> 804 bytes .../0012_auto_20200214_2313.cpython-38.pyc | Bin 0 -> 870 bytes .../0013_auto_20200215_1347.cpython-38.pyc | Bin 0 -> 692 bytes .../0014_auto_20200215_1411.cpython-38.pyc | Bin 0 -> 750 bytes .../0015_auto_20200215_1427.cpython-38.pyc | Bin 0 -> 933 bytes ...16_remove_datadir_datafiles.cpython-38.pyc | Bin 0 -> 542 bytes .../0017_auto_20200215_1910.cpython-38.pyc | Bin 0 -> 955 bytes .../0018_auto_20200215_1911.cpython-38.pyc | Bin 0 -> 949 bytes cloud/templates/cloud/noentrie.html | 7 + dasettings/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 157 bytes dasettings/__pycache__/admin.cpython-38.pyc | Bin 0 -> 200 bytes dasettings/__pycache__/apps.cpython-38.pyc | Bin 0 -> 387 bytes dasettings/__pycache__/forms.cpython-38.pyc | Bin 0 -> 4797 bytes dasettings/__pycache__/models.cpython-38.pyc | Bin 0 -> 197 bytes dasettings/__pycache__/urls.cpython-38.pyc | Bin 0 -> 810 bytes dasettings/__pycache__/views.cpython-38.pyc | Bin 0 -> 13020 bytes dasettings/admin.py | 3 + dasettings/apps.py | 5 + dasettings/forms.py | 110 +++ dasettings/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 168 bytes dasettings/models.py | 3 + .../templates/dasettings/agency_content.html | 340 ++++++++ .../templates/dasettings/groups_content.html | 476 +++++++++++ .../templates/dasettings/moduls_content.html | 28 + .../dasettings/notifications_content.html | 64 ++ .../templates/dasettings/profil_content.html | 114 +++ dasettings/templates/dasettings/settings.html | 184 +++++ .../dasettings/structure_content.html | 747 ++++++++++++++++++ .../dasettings/user_changemaindata.html | 16 + .../templates/dasettings/user_content.html | 51 ++ .../dasettings/user_newuser_step1.html | 30 + .../templates/dasettings/user_usprof.html | 325 ++++++++ dasettings/tests.py | 3 + dasettings/urls.py | 16 + dasettings/views.py | 557 +++++++++++++ notificsys/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 159 bytes notificsys/__pycache__/admin.cpython-38.pyc | Bin 0 -> 200 bytes notificsys/__pycache__/apps.cpython-38.pyc | Bin 0 -> 387 bytes notificsys/__pycache__/models.cpython-38.pyc | Bin 0 -> 886 bytes notificsys/__pycache__/urls.cpython-38.pyc | Bin 0 -> 743 bytes notificsys/__pycache__/views.cpython-38.pyc | Bin 0 -> 2993 bytes notificsys/admin.py | 3 + notificsys/apps.py | 5 + notificsys/migrations/0001_initial.py | 31 + .../0002_remove_usernotification_fromuser.py | 17 + .../migrations/0003_auto_20200209_1620.py | 21 + .../0004_usernotification_elementid.py | 18 + notificsys/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-38.pyc | Bin 0 -> 1250 bytes ...e_usernotification_fromuser.cpython-38.pyc | Bin 0 -> 557 bytes .../0003_auto_20200209_1620.cpython-38.pyc | Bin 0 -> 820 bytes ..._usernotification_elementid.cpython-38.pyc | Bin 0 -> 644 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 170 bytes notificsys/models.py | 27 + .../notificsys/allnotifications.html | 87 ++ .../notificsys/notification_mail.html | 172 ++++ notificsys/tests.py | 3 + notificsys/urls.py | 11 + notificsys/views.py | 108 +++ re.txt | 25 + .../standards/standards_noentrie.html | 7 + users/static/users/css/colorPick.css | 88 +++ users/static/users/css/jsLists.css | 24 + users/static/users/js/colorPick.js | 163 ++++ users/static/users/js/jsLists.js | 181 +++++ users/templates/users/agency_DELETE.html | 31 + .../templates/users/agency_update_DELETE.html | 23 + users/templates/users/profile_DELETE.html | 62 ++ .../users/profile_update_DELETE.html | 262 ++++++ .../templates/users/users_adduser_DELETE.html | 24 + .../users/users_management_DELETE.html | 81 ++ users/templates/users/users_prio_DELETE.html | 51 ++ 100 files changed, 5277 insertions(+) create mode 100644 areas/templates/areas/area_confirm_delete_DELETE.html create mode 100644 areas/templates/areas/areas_add_DELETE.html create mode 100644 areas/templates/areas/areas_management_DELETE.html create mode 100644 areas/templates/areas/areas_update_DELETE.html create mode 100644 cloud/__pycache__/functionviews.cpython-38.pyc create mode 100644 cloud/migrations/0005_datadir.py create mode 100644 cloud/migrations/0006_datafiles.py create mode 100644 cloud/migrations/0007_auto_20200214_2236.py create mode 100644 cloud/migrations/0008_auto_20200214_2237.py create mode 100644 cloud/migrations/0009_auto_20200214_2238.py create mode 100644 cloud/migrations/0010_auto_20200214_2241.py create mode 100644 cloud/migrations/0011_auto_20200214_2241.py create mode 100644 cloud/migrations/0012_auto_20200214_2313.py create mode 100644 cloud/migrations/0013_auto_20200215_1347.py create mode 100644 cloud/migrations/0014_auto_20200215_1411.py create mode 100644 cloud/migrations/0015_auto_20200215_1427.py create mode 100644 cloud/migrations/0016_remove_datadir_datafiles.py create mode 100644 cloud/migrations/0017_auto_20200215_1910.py create mode 100644 cloud/migrations/0018_auto_20200215_1911.py create mode 100644 cloud/migrations/__pycache__/0005_datadir.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0006_datafiles.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0007_auto_20200214_2236.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0008_auto_20200214_2237.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0009_auto_20200214_2238.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0010_auto_20200214_2241.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0011_auto_20200214_2241.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0014_auto_20200215_1411.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0015_auto_20200215_1427.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc create mode 100644 cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc create mode 100644 cloud/templates/cloud/noentrie.html create mode 100644 dasettings/__init__.py create mode 100644 dasettings/__pycache__/__init__.cpython-38.pyc create mode 100644 dasettings/__pycache__/admin.cpython-38.pyc create mode 100644 dasettings/__pycache__/apps.cpython-38.pyc create mode 100644 dasettings/__pycache__/forms.cpython-38.pyc create mode 100644 dasettings/__pycache__/models.cpython-38.pyc create mode 100644 dasettings/__pycache__/urls.cpython-38.pyc create mode 100644 dasettings/__pycache__/views.cpython-38.pyc create mode 100644 dasettings/admin.py create mode 100644 dasettings/apps.py create mode 100644 dasettings/forms.py create mode 100644 dasettings/migrations/__init__.py create mode 100644 dasettings/migrations/__pycache__/__init__.cpython-38.pyc create mode 100644 dasettings/models.py create mode 100644 dasettings/templates/dasettings/agency_content.html create mode 100644 dasettings/templates/dasettings/groups_content.html create mode 100644 dasettings/templates/dasettings/moduls_content.html create mode 100644 dasettings/templates/dasettings/notifications_content.html create mode 100644 dasettings/templates/dasettings/profil_content.html create mode 100644 dasettings/templates/dasettings/settings.html create mode 100644 dasettings/templates/dasettings/structure_content.html create mode 100644 dasettings/templates/dasettings/user_changemaindata.html create mode 100644 dasettings/templates/dasettings/user_content.html create mode 100644 dasettings/templates/dasettings/user_newuser_step1.html create mode 100644 dasettings/templates/dasettings/user_usprof.html create mode 100644 dasettings/tests.py create mode 100644 dasettings/urls.py create mode 100644 dasettings/views.py create mode 100644 notificsys/__init__.py create mode 100644 notificsys/__pycache__/__init__.cpython-38.pyc create mode 100644 notificsys/__pycache__/admin.cpython-38.pyc create mode 100644 notificsys/__pycache__/apps.cpython-38.pyc create mode 100644 notificsys/__pycache__/models.cpython-38.pyc create mode 100644 notificsys/__pycache__/urls.cpython-38.pyc create mode 100644 notificsys/__pycache__/views.cpython-38.pyc create mode 100644 notificsys/admin.py create mode 100644 notificsys/apps.py create mode 100644 notificsys/migrations/0001_initial.py create mode 100644 notificsys/migrations/0002_remove_usernotification_fromuser.py create mode 100644 notificsys/migrations/0003_auto_20200209_1620.py create mode 100644 notificsys/migrations/0004_usernotification_elementid.py create mode 100644 notificsys/migrations/__init__.py create mode 100644 notificsys/migrations/__pycache__/0001_initial.cpython-38.pyc create mode 100644 notificsys/migrations/__pycache__/0002_remove_usernotification_fromuser.cpython-38.pyc create mode 100644 notificsys/migrations/__pycache__/0003_auto_20200209_1620.cpython-38.pyc create mode 100644 notificsys/migrations/__pycache__/0004_usernotification_elementid.cpython-38.pyc create mode 100644 notificsys/migrations/__pycache__/__init__.cpython-38.pyc create mode 100644 notificsys/models.py create mode 100644 notificsys/templates/notificsys/allnotifications.html create mode 100644 notificsys/templates/notificsys/notification_mail.html create mode 100644 notificsys/tests.py create mode 100644 notificsys/urls.py create mode 100644 notificsys/views.py create mode 100644 re.txt create mode 100644 standards/templates/standards/standards_noentrie.html create mode 100644 users/static/users/css/colorPick.css create mode 100644 users/static/users/css/jsLists.css create mode 100644 users/static/users/js/colorPick.js create mode 100644 users/static/users/js/jsLists.js create mode 100644 users/templates/users/agency_DELETE.html create mode 100644 users/templates/users/agency_update_DELETE.html create mode 100644 users/templates/users/profile_DELETE.html create mode 100644 users/templates/users/profile_update_DELETE.html create mode 100644 users/templates/users/users_adduser_DELETE.html create mode 100644 users/templates/users/users_management_DELETE.html create mode 100644 users/templates/users/users_prio_DELETE.html diff --git a/areas/templates/areas/area_confirm_delete_DELETE.html b/areas/templates/areas/area_confirm_delete_DELETE.html new file mode 100644 index 0000000..5a73330 --- /dev/null +++ b/areas/templates/areas/area_confirm_delete_DELETE.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+
+ +
+ +
+
+ +
+ {% csrf_token %} +

Alle unter diesem Bereich erstellten Aufgaben und Standards werden gelöscht!

+
+   + Abbrechen +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/areas/templates/areas/areas_add_DELETE.html b/areas/templates/areas/areas_add_DELETE.html new file mode 100644 index 0000000..8402eb9 --- /dev/null +++ b/areas/templates/areas/areas_add_DELETE.html @@ -0,0 +1,43 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neuen Bereich anlegen

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ Farbe +
+

Nachdem Erstellen eines Bereichs können Mitarbeiter zugewiesen werden.

+
+   + Abbrechen +
+
+ + + + +{% endblock content %} diff --git a/areas/templates/areas/areas_management_DELETE.html b/areas/templates/areas/areas_management_DELETE.html new file mode 100644 index 0000000..b187327 --- /dev/null +++ b/areas/templates/areas/areas_management_DELETE.html @@ -0,0 +1,101 @@ +{% extends "users/base.html" %} +{% block content %} + +
+

Bereichsverwaltung

+
+

+ Bereiche unterteilen die Agentur in verschiedene Verantwortungsbereiche. +

+
+ +
+
+
+ +
+
+ + + + + + + + + + + + {% for item in areas_of_agency %} + + + + + + + + {% endfor %} + +
NameErstellt vonErstellt amFarbe 
{{ item.name }}{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}{{ item.created_area_date }}
+ + +
+
+
+ + +{% endblock content %} diff --git a/areas/templates/areas/areas_update_DELETE.html b/areas/templates/areas/areas_update_DELETE.html new file mode 100644 index 0000000..2922aeb --- /dev/null +++ b/areas/templates/areas/areas_update_DELETE.html @@ -0,0 +1,172 @@ +{% extends "users/base.html" %} +{% load static %} +{% load crispy_forms_tags %} +{% block content %} +
+

Bereich aktualisieren

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ Farbe +
+
Mitarbeiter hinzufügen
+
+ +
+ + +
+ + {% for us in possible_users %} + + {% endfor %} + + +
+
+
Zugewiesene Mitarbeiter
+
+ {% if added_users|length > 0 %} + + {% for us in added_users %} + {{ us.first_name }} {{ us.last_name }}   + + {% endfor %} + {% else %} +

Diesem Bereich ist noch kein Mitarbeiter zugewiesen.

+ {% endif %} +
+
+ +   + Abbrechen +
+
+ + + + +{% endblock content %} diff --git a/cloud/__pycache__/functionviews.cpython-38.pyc b/cloud/__pycache__/functionviews.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84d3af5bcbaf65818882ec0bce933699df0a4162 GIT binary patch literal 1154 zcmZ`&%W~5&6t$d}<2cX0AB4v)n|uJnFqEV(rgYJ!EHoK9uB9X{k{zyOXqmDqOMZk8 zVTNz;mQ{a&6<1C=bfCzitD|$JdvzZ^sa9PJ$M>(>Z<{&G`e`a>oy z#2nF(P1?-(vS`T#x{&d%Sd>e2DdQ_*S+3BP40~c#uFHudU@IZG++B%5GVRXdbC&;kZ;YApA z3aQ%z?rZ)gJE7o)H+sdj4x_O`TxWdbCqkbp9fLpSM*VW@ zc>A=!e}ve3rD6<8P2))M!@xMY9X0|pdpOk-6j#B}?LQu*C6xpLSIXp5ay^MzT9`r@X(UP}SgtfIqvdZFtmE>l-+MYV zDN)0{Sd2Lg`*Dy+9%(h)-5(5DI1aThIEE4F1creLeK<;@K!(_L1Ec0aY&xPCgRScw875(XdHLdBnBNMT7d}`Okbz#b6pTe8p5-#pXfJY u7Va9HXg!5R!`QLPvYQq2j@U3t=NY~{5&XI7G1W%VARgJo`S0i0Hu(*7*F8l5 literal 0 HcmV?d00001 diff --git a/cloud/migrations/0005_datadir.py b/cloud/migrations/0005_datadir.py new file mode 100644 index 0000000..4caf8d8 --- /dev/null +++ b/cloud/migrations/0005_datadir.py @@ -0,0 +1,32 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:34 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0062_auto_20200213_2207'), + ('cloud', '0004_data_subdir'), + ] + + operations = [ + migrations.CreateModel( + name='DataDir', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('is_root', models.BooleanField(default=True)), + ('date_created', models.DateTimeField(default=django.utils.timezone.now)), + ('date_last_modified', models.DateTimeField(default=django.utils.timezone.now)), + ('agency', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('dirs', models.ManyToManyField(blank=True, related_name='dirs_in_dirs', to='cloud.DataDir')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('visibleby', models.ManyToManyField(blank=True, related_name='visible_by_user', to='users.AgencyGroup')), + ], + ), + ] diff --git a/cloud/migrations/0006_datafiles.py b/cloud/migrations/0006_datafiles.py new file mode 100644 index 0000000..6c4d1a4 --- /dev/null +++ b/cloud/migrations/0006_datafiles.py @@ -0,0 +1,32 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:34 + +import cloud.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0062_auto_20200213_2207'), + ('cloud', '0005_datadir'), + ] + + operations = [ + migrations.CreateModel( + name='DataFiles', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('file', models.FileField(max_length=255, null=True, upload_to=cloud.models.user_directory_path)), + ('date_created', models.DateTimeField(default=django.utils.timezone.now)), + ('date_last_modified', models.DateTimeField(default=django.utils.timezone.now)), + ('agency', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cloud.DataDir')), + ], + ), + ] diff --git a/cloud/migrations/0007_auto_20200214_2236.py b/cloud/migrations/0007_auto_20200214_2236.py new file mode 100644 index 0000000..182225b --- /dev/null +++ b/cloud/migrations/0007_auto_20200214_2236.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0006_datafiles'), + ] + + operations = [ + migrations.AddField( + model_name='datadir', + name='datafiles', + field=models.ManyToManyField(blank=True, related_name='files_in_dir', to='cloud.DataFiles'), + ), + migrations.AlterField( + model_name='datafiles', + name='parent', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='thisfileindir', to='cloud.DataDir'), + ), + ] diff --git a/cloud/migrations/0008_auto_20200214_2237.py b/cloud/migrations/0008_auto_20200214_2237.py new file mode 100644 index 0000000..d9c9c93 --- /dev/null +++ b/cloud/migrations/0008_auto_20200214_2237.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0007_auto_20200214_2236'), + ] + + operations = [ + migrations.AlterField( + model_name='datadir', + name='is_root', + field=models.BooleanField(default=False), + ), + ] diff --git a/cloud/migrations/0009_auto_20200214_2238.py b/cloud/migrations/0009_auto_20200214_2238.py new file mode 100644 index 0000000..8606028 --- /dev/null +++ b/cloud/migrations/0009_auto_20200214_2238.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:38 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0062_auto_20200213_2207'), + ('cloud', '0008_auto_20200214_2237'), + ] + + operations = [ + migrations.RenameModel( + old_name='DataFiles', + new_name='DataFile', + ), + ] diff --git a/cloud/migrations/0010_auto_20200214_2241.py b/cloud/migrations/0010_auto_20200214_2241.py new file mode 100644 index 0000000..2ef2f99 --- /dev/null +++ b/cloud/migrations/0010_auto_20200214_2241.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cloud', '0009_auto_20200214_2238'), + ] + + operations = [ + migrations.AlterField( + model_name='datadir', + name='owner', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cloud/migrations/0011_auto_20200214_2241.py b/cloud/migrations/0011_auto_20200214_2241.py new file mode 100644 index 0000000..bc70796 --- /dev/null +++ b/cloud/migrations/0011_auto_20200214_2241.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.2 on 2020-02-14 22:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cloud', '0010_auto_20200214_2241'), + ] + + operations = [ + migrations.AlterField( + model_name='datadir', + name='owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cloud/migrations/0012_auto_20200214_2313.py b/cloud/migrations/0012_auto_20200214_2313.py new file mode 100644 index 0000000..18985ed --- /dev/null +++ b/cloud/migrations/0012_auto_20200214_2313.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0.2 on 2020-02-14 23:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0062_auto_20200213_2207'), + ('cloud', '0011_auto_20200214_2241'), + ] + + operations = [ + migrations.AddField( + model_name='datadir', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dir_in_dir', to='cloud.DataDir'), + ), + migrations.AlterField( + model_name='datadir', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/cloud/migrations/0013_auto_20200215_1347.py b/cloud/migrations/0013_auto_20200215_1347.py new file mode 100644 index 0000000..b25c06f --- /dev/null +++ b/cloud/migrations/0013_auto_20200215_1347.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.2 on 2020-02-15 13:47 + +import cloud.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0012_auto_20200214_2313'), + ] + + operations = [ + migrations.AlterField( + model_name='datafile', + name='file', + field=models.FileField(blank=True, max_length=255, null=True, upload_to=cloud.models.user_directory_path), + ), + ] diff --git a/cloud/migrations/0014_auto_20200215_1411.py b/cloud/migrations/0014_auto_20200215_1411.py new file mode 100644 index 0000000..71355a6 --- /dev/null +++ b/cloud/migrations/0014_auto_20200215_1411.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.2 on 2020-02-15 14:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0013_auto_20200215_1347'), + ] + + operations = [ + migrations.AlterField( + model_name='datafile', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='thisfileindir', to='cloud.DataDir'), + ), + ] diff --git a/cloud/migrations/0015_auto_20200215_1427.py b/cloud/migrations/0015_auto_20200215_1427.py new file mode 100644 index 0000000..d5d566e --- /dev/null +++ b/cloud/migrations/0015_auto_20200215_1427.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.2 on 2020-02-15 14:27 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0062_auto_20200213_2207'), + ('cloud', '0014_auto_20200215_1411'), + ] + + operations = [ + migrations.AlterField( + model_name='datafile', + name='agency', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='datafile', + name='owner', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cloud/migrations/0016_remove_datadir_datafiles.py b/cloud/migrations/0016_remove_datadir_datafiles.py new file mode 100644 index 0000000..70b797a --- /dev/null +++ b/cloud/migrations/0016_remove_datadir_datafiles.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.2 on 2020-02-15 15:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0015_auto_20200215_1427'), + ] + + operations = [ + migrations.RemoveField( + model_name='datadir', + name='datafiles', + ), + ] diff --git a/cloud/migrations/0017_auto_20200215_1910.py b/cloud/migrations/0017_auto_20200215_1910.py new file mode 100644 index 0000000..6d478ea --- /dev/null +++ b/cloud/migrations/0017_auto_20200215_1910.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0.2 on 2020-02-15 19:10 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0062_auto_20200213_2207'), + ('cloud', '0016_remove_datadir_datafiles'), + ] + + operations = [ + migrations.AlterField( + model_name='datadir', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AlterField( + model_name='datadir', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='dir_in_dir', to='cloud.DataDir'), + ), + migrations.AlterField( + model_name='datafile', + name='agency', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + ] diff --git a/cloud/migrations/0018_auto_20200215_1911.py b/cloud/migrations/0018_auto_20200215_1911.py new file mode 100644 index 0000000..4d0aad7 --- /dev/null +++ b/cloud/migrations/0018_auto_20200215_1911.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0.2 on 2020-02-15 19:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0062_auto_20200213_2207'), + ('cloud', '0017_auto_20200215_1910'), + ] + + operations = [ + migrations.AlterField( + model_name='datadir', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='datadir', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dir_in_dir', to='cloud.DataDir'), + ), + migrations.AlterField( + model_name='datafile', + name='agency', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/cloud/migrations/__pycache__/0005_datadir.cpython-38.pyc b/cloud/migrations/__pycache__/0005_datadir.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d67dac4ded478eff87fd5dda82c778031b73f50c GIT binary patch literal 1413 zcmZuxOK%%D5MJ)Cq+MC^Lzd&%X`4$gx(KTJLW81+BiT;S+9_iBvJgs8BE6wPEmd+i zu6%8;{txZ3|E6bN+e>~yfdYLDxl-aoSKw&o<8a>OWwTlL;G4Hjzk5^hyx*;G_X|OI z3`;)&LOqIvH%AFVmiL7}50YRWCZUr9QAw(R2cni#Pdysa%1<7xuwWMb7$gx5F1$|l z4cPHI$V8guInPqv@lAcsQ$=zvGi|DKNtw{+Q>%CP+Xmq=Ed2)%<|T-FiO+(cLspqp ze?b&cKMj(a^+p34vUpaf75G(YjYhZOl}}^9HUOzpOB)Vr0@eU&^A>@|7D!FDIoq0T z&vsVW_WxizfVF4~G~9fQ3ESxd-;{(S3T~AqQ6Xt>(UsmLA^vp!;B@ z`yPG2)JUudrr~T%6(c#LW@DlFoTw#!#g--p zPn-yT!%X8fQxmBf&d8jZ&{2>7R)Z#nrZN#Edu3{rU6DfM&`9zF7A#Bim!Mh*VQO4s zC1u`0Y8U!u8W0x4Yo{$I38HfhZRb}U0;!UeWz*&PO~d8eJ#u0vD9^_-!!RE#XU5N^ z2_ZWTMuB1uJMe$gbXDlCQig*q=U6de6Lop02NtTx>x`+6uMR;fq4+h|d?MInX|`4@ zo-DDA^Xp5n`k;}`hs`SAD~NN=sdnKl~(*ReBuO_aT!CO(2;II$s^ zc<_>_l5ISZQZSO0QWMI-Mtsgnu}WtoOC`)y&V@En4m&q8VI(?ak-yFdkH(jF zg2zv#NSPWB<+PZyEZ5`HXQMIYDbEQ64DHSfHFixLzk3+QFw~#Ap@t@R7fS`Nl^4U( z9|DPjI`WbKcUTLN@3&DKZNh4!L)5bCPye6rUw5Jtn~gH}?o?)1WyRwaLMN^{WmON} xg5B~->aMGxy5KR{TkX3FcGm@TPTpl*a*sgYL|>Nk@RjYqj({}KHi}Rb{0EN>rfmQK literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0006_datafiles.cpython-38.pyc b/cloud/migrations/__pycache__/0006_datafiles.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f81e114c5215a557f7e211fb8e7ef198be80b46 GIT binary patch literal 1382 zcmZuxOONA35O({K*iJIf%#+7~TP{%uVtELmjgpz!1!i}(let(Ctxl@rb+%)Nw#_he z-~!kD2RL%)hj8u_5~uwK2nm+z_RQ`gVaw(2ud1u7zN+raRx7md`F`i@>t8*~`a@6N zd|aH|$1nc^1z13Y6%qW~!d^O&Lp0_Hcj-mmvKH0MoQQhl8`~iA&n$4k`_TfAdyDV~ zCklaFSe@Dn^k+Tl5as8*D3UbJJGKg!Ni12BWNEHy%M7^4XWH(~X9Fkq@ymZl!A&%g z&7GfI^k4g#00BF8qB?gLJ~-g=U=f0cZw>0;uid!~0b&hALeR2luohxX*uW@Ti(s(< zn`;Lxw-DXrTZ`?*&SDp~*95Vh|G{<fuh)P71KRKRKGGI5 zk(HpDyQSG!9g`vGFdWtO`r2?72rMz z6Uhx%&2PD!W;v%RTXN+ZX(hkaEelN}1*>_a%G%lW@X(@zq=eX~S zmsqThBlqwp_fe>zT#1YUEi%=_Fgd*qqeEm{>vs$&SYA+Ugk+vzgf$lPbawsdrfF#C z4$KtYniWBoQtTLBaAl)cFS|;)?AY=hz302yXKlqKPm7zD;i#)g8710e+h}nQ0eREu#(;^aXlVlF46Y*sFj+I({Ma6Ew| zP6{TtE>}^?iJ^P)`fN|IIq#X~)V+~+SJx8n9!uXu`FkjQCnPqp|90yxvF$c#lYRW! zKka|qm&U%+h?-R;tE-}7s8MC#on`5~Dn)RMz|>T&qWkC-*sWG~?|6`13?bUP m)f*1GcNCg^UlUP{K0$lse^xch=ejX+or+JIWQ+L3cm4%#{gw>? literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0007_auto_20200214_2236.cpython-38.pyc b/cloud/migrations/__pycache__/0007_auto_20200214_2236.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58d9837b5190e85163ff1057b6bf4e5729d52ebf GIT binary patch literal 847 zcmYjPJ8u&~5Z-(Ge10JcB%p!Pjb#i95<)0ZLJUF)C^!YD6RVA9a@k{jXZFrTXravy z;Rn%dOGQr=DT3K^Uc1`Symn^3nK|tBVn*lh-Rb9FE@Qu~aQpZqY|^VnM1X;#*uqJi zg`2pJm0jf}{*-|S{tpH|I(hKjO9F5|vSILt{;;8I;)Tq#sAXAHCR~(&s@k7h+wIdP zVUu2UKm=Lh083nOGAHrS&nY5!80IbTA%GBCXC6dn))G zPcT0^jE8gL$2_Y9nRvH(MOw`mv<20=g2k&RE zw`V3Umv}kipG-fZ&<#2NwEZGItWa0!n^I+{)17j@S`h9koxYu=ATwDDg(4%>N~aC@ z^k!XB8qaesR&~iIkDdGd@;CQmm;%TsMvvqi6ZKqT_qe}3RQF5Ujc6?gB#KX3eo yAq}(vFoL6|5o`GOua%?qUXHGy>4z4B&2fWf%{?ZaiC(T-{>pZ-vTk>r$omgkukz*q literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0008_auto_20200214_2237.cpython-38.pyc b/cloud/migrations/__pycache__/0008_auto_20200214_2237.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9de3225ff523b5aba8ba775193dd41ef7815143 GIT binary patch literal 600 zcmZWm&1%&^6rRZ>_vVIMD5&%egn*P7#fpejE4{j~8|}gn9L9T2LoSodbtYN3)@|2) zhQ88lUHJ-v)HA8lf@heIIo~;)pKnfgb}~k`ytDdr!5RAzoZA+Yb4b_SCjbUqvyNB1 zi>ipT6@v)GcLoCaMtl>MfcQPjlb@8!^2ldh+gLTUrgwhU89?pUA#~ejY8;F#i?S%n zhmU1hK6>Kkpauo4_4C$AYs_$*b0YCfje5uh4I2iOz3R}%6DDUZYB|IKj z;Md2aXZ5K=>*_Z~H)!kEW<7S;53XLl{ZK>Ow1c8D4N;@5r@iYNscTZ;>Hi8G>~Fu? z@SQ<%w@Z+U=qgTP9?{8u$5&JIB#-?9HmYyTK75|`m}Z}XH$z^(?okz=KEGDvMOe{= H#dpOY?Gc@r literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0009_auto_20200214_2238.cpython-38.pyc b/cloud/migrations/__pycache__/0009_auto_20200214_2238.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a0eae67564527116786f168467c52487d474ff2 GIT binary patch literal 677 zcmZWmO>fjN5VhlEH=AySMEUp)xvWBpXp0a6v1N}1N7Y@&0=?OTFIF_iy z3C0#X(kV$oFq$Dwxcd=tSCEzafg~>Xj!`)H4ml{q#@C{4iz?TEgR;mQ))uPLnGIjJ z8_fhtFh_|a$Y)o0tHBq{F?Vv3455i{8*=ZHljCH>2heP2M)S+cp<}#Gi$OL ztZNmGqd1D<2ir7`qaDl0r0Te3M7uW_4}r10V@6ZfvX_Mv+W40c(tIU3tyn3HUx~9G z9fpDNX%8ti0i~tlofLq_l%94>S~{f-fmzKRea7mVoj{z6T2x$A*?HsG(5>go#Q|L& z?;p|mo9X^*GycaY;1wH3!WNn$y_w)RApT$ zs#d47SBsPvdC@W{SPoZRllB^fgc5Z(3Kj^n1Z0wl@-?zu#6=%G{ywQAE8L0i-&2P}(~lbu>Nwm0lLs(OZN z{{tNPOMB(SU#P^#*y)$VSUZ||JFA&D&*SA~pP*em8h)Hug#4_N`(|UZjYn^x6GYIQ z6f~r?j;-7(SjY-Hw40pePUsGau!ZxL2nSf!`ohANV5g+({=)a9OO250Cc- z?@Z^mA_Z;yoxB3IUw2fsaK_)43eu!}3m3)}SzIR4SYl$lW@_BKX}v!=9u0O!#+Ng= z*5U_I&+v8Qu0HH;MPm(0M+Y)bKt+3UIxnECbToW3ibR^ERh&bdAT(D|v&-mC*C+_q zga5X=vEG|qCgtDezb5iw~tw&42o n7VIs4rQQumwN|sKyWR0xM9&d3-m8Tguj}n=7hQ+0Qjh%u7HhDJkRnbZ+||S{ssGIQj@2b7DlD*k$;u$NVDrhA7J1xCOI9>Qc!*)Hl|do;Ml8H(3w3$_VO`{Z^s?BUP3tf_fA7z_s_tt&}JgVA6x8g7%( zXnSZ{G_6vaE91*6!PKPZ8Gpu8@zHpq=G?TUAh0~Em~kuF!vM^JAtEgqv{>(7=8V(R z-i8TDQzyhkgg{@-8N?kzKGi9=y@V(XP|c>kN*9ZC2KSULn4nC|mkLC3%=+GRa!jTd zhv($v?BMXN>D+bXOq*zrS4caNA!jl@CKgIQp>-aD?1HUf>}YzGuI^zs)^JwzgWlKbPWiMML|hLT3$Q qE38|0#s2D->feG?TNaI-c8_Zny?~ktU#`@6W!cvOxDMJtA^rz9^WPZ& literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc b/cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56406f956b041dfc2fb1cc6c7b47e536a7dd8871 GIT binary patch literal 870 zcmY*XO>fjN5Oti7&8E9m4@i8J3*7b+?QScO5JFvb>4Ffwv^@|-wbGp-O7JF&lN{PB zT>Brm@|S$ ydX#5kd}wdAqKelvda#wWvJz-au~UYtI%8T)0NyTc)8k7gB;0S1<2 zD=V^AJmQw|xwIo^!N3ORI|B!;-2G-pF7P8Za(`0{8*v@1vQ#B?Ru+}^RwbaU4wvTc z?l3&|XjZ3WkVO`-h=T<@<&lj}?wU8y%X{F0i+i)+YO2p4?DpZwzI3B;4ilnJaF&$6GVNoCJfIN{Ef|iS68y(IGGtbn>)$W;0iZ9wJ8Yy+ZBos=l zQ4bW#q(%@$vO>-4a%7WuMzHS0Y0ury8A{Mzl47wuzZkUa!&&Q%xY{KB)E1dTs?!&3 zq!2m~f-*G{X+IF+Ym-Qm&3J%oEP#?_SSe1C+MfX&m{$~i3Z{dDQel=BAMjjzkS9f2 zY7S@GZ+TN+b#H%mv_G4_)xk{GsM=T^lxzIg_n%BXGrWws`n3NlJ~5KV?@F1Xis$9B zS&?j2ym)^cLzZTBBGJ@WH!5z`i*Nr>OkKF&C+fn^WG7soEAwA_G^?j%e4AVRkK;KO zt=5xk$L)3xuAQqEIr4PBD<_1rw(_pt$Nvw*?z@IJg{p1J+s5A3)9s$qh4x=}8ox2J LRff!#<=cM&y2bJ# literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc b/cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93684c61491bee31bfbc3265a7082625febe480c GIT binary patch literal 692 zcmY*X&2H2%5O!i`Hwmp&2_yt>kjrX+3P=c{qM|MwsE}w6L=l#|)b@0+pkB3=AT~iR)3F!03v>_=;jp3Na!kHhJ?831Op^(gWE0 z)9Gx^#n5X$pU$V#`D~xh7qf+pLG9JP74#odyBkkDPyZ=%nFL8M*4Ux#Vksv!!}1|FZjymF1{Y&Obwe8fjN5OqE`8+N7MDiCnbCEDFCLP8ZP>e2-v3WDu{C?d-4Oj8FZS)Alhu5j%S z;V=2h2?_oH5-Q__(h6H1d7j5J^PYV&9{Y^OkDtr;_f5vWY3Js!$vL1^hh%_(Ay{EV zMqx&#p?yoDrYc@O%-!72Z-E0Y3@#k-E-Z>1!I0|uYWVW1 zAXRrZqG}=9olK^CN!m75GMmgMliBn^GToa$R34;FdddYVcbiHqo0S?jXS~)BFM-QX z<1RzEptuE>fuo$YNXrk(E?XhguqqRxgbk{ZM3FWKNtqU?%%%z~BCiSeh~44NDMtav z!B}}ohbM{hlZ4`0fwUhb$;UPoI#zptTPy*~4aZv28!_cS5e>>Cokdz5a8ya;S@{Cb zl?!=VW|cBwP1JN>q`Mlte)DSe^l+v8YKwp0;wzJP>2_y+y*qpqpVTPp_*o?~l<}h4 zv<0bA$IIud7nU}U>8z#*= zzwOKJG;r0hZ##r_$Fb*i`yUwg-zK~wBzJY^I`cJ$es_;BSKL0i-&2P}(~li64{YdiR%s$AjP z{{ToF_)B}`#F1;IO3d1QAy{c=XLi2bnfYcWOG~zd>-+DWci&V=`YDW?OG9H5cd>y2 zB#@bu$et_XGCazwo`}$lNMuSw?AC zI10CuD9nR0%F==xNd}Y^`!j*Nx!P!K;w}~_sN~5Yc?wm(XjG4luQJG>gct>*S)hVO zTd@r~7#P1Dcj8vO6yE|9tWzCYr|JdD{ts$d{C9~96>kL$%)8B7dzVRK#(GuIyx@0x zy=N{7sxl*P&+YZx{!`+*y>)?@v8)1t=&$~TSR?(_exF+ql)*e=lp8@v)7i;*|6`~A zwL7S7N9X#K1?hWk0-XmHE4h|djPX{M5~PThlq+TCs7RlnjHE$A5hA2Mk0=AKXU8ec zo!i_ZwU-cX6N2c9QPewxe5e8@UJ#OF*Cl?ZI1UzzV2XaA3z~w+ELVhUc`zC8lF8BN zknA07jb8K46(XVqw+F1G`L>9gi(%pRc9zp9OkdFxZa^HQVa64hV&Nip>@_!sgQMYK zYsAerhX>=)aLny&K`#d3hm=3YZ)$P&cDUhB1mpg0#zLC=TiL8iXj&Hj&dae6Q5cm0 zqk_n?%Ke&p|9Yr=Y{J?oz{i<4Z(AQtZ8kx*1yR%GQ|Gc|F__s=!G(H@*@XEoNb zc)O{lJIm5}!%ger2BtNQ4FUJAF1yW4cP}f?ABxIEv_|n7osJFfubX? H$d>vCfgJ^0 literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc b/cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6b69ceaf73e8f8bd75e4dcb9d0b8ceb5aaaadca GIT binary patch literal 542 zcmY*VO>fjN5Vf6TyA3UH>z!LJRl4FsLI@#1Yb?yfc7W z_Nqgl27g#=_^FHuDSa*_6^t4w-jed?sB|a_2ylfxV83Y5SwTYllOycRFZ|M?2A`W1 z-YUId_8GlLcP&4?txp|VSMM9$pshcf#n@p#xO#qYQbXIcgVLxPN{zOTqU!r!t4ZE# zY2zSyt0>-4(C+HDO=#4Fj(bXOnuv9prCf0FFI~sC!y=(CSgO7;yYM}39`pA*-bBx- R-A~`$$bTPLT~N7|{0EEckL3UW literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc b/cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce6a17bd07b70a910df157318b051a556c06b5bd GIT binary patch literal 955 zcmY*YOK;Oa5cWGxnv{Z&DnLkZ0p$`o0a}3&YSq#fAqs-_fMs>%W~P?S+74?QslC!` ze+YkRublV+T#!J_uKP$=+VRZnJic#sy+0WA3|fz$?i?&ThVfGw^NW1O8trOC0t_&@ zk(;5JTcKqt+v0ZUY#U&Mb83KtX6AmkLl>-1#?bvmImXbEy*y1sT&HDGNiQz}d9^!L zXY;F1#v1MFlmr@~2}Wpv307i-HaeNBdZ3qe(9gP=m-Vs*aKSsXpmTO{?yGa?LU%5v z2Mf?Yb1$O?Z54`IycXxejW#N=!#*q${w3LccLAJOxJ`wklFLD`GGTF3muwPDf?zU! z!X}eoRYgpB*+6(d2*xW+U|xPh25}ujD)jd#T+n){M5`?5$7l!E#0FOIY@673oPnA*;6f2N=wDbK%*FKQsd233|;9S^0@dy znGNScUAOED#GlU_FQR>QFVRlP6BN;AIc;*9Nfm9s*^3}e(mLj- zCS5lo(xZv4o?}E;wR-I`pRw`taWI-43-$Cnw5vxXeA_aue~#yv^fhn)b=+3FJForL zIYUo&TQVa!)XZD9cP^cy_8%Bs&=mKmgU-ET)@l#wK>9D+8NX6Ps}!sy)3^TvRo4b8 literal 0 HcmV?d00001 diff --git a/cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc b/cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47475555335f24c0828cf88a37c176f520726acf GIT binary patch literal 949 zcmZWnO>fjN5KWvon@x91`H&DuTtGs~CCV-z1%yynUD_f9Mms^8#F-s5iG&z;=M*MNd^PM~*waqsGT=tF-6 zXh^AqJjo)l@R2+WX+t{xjj^|mJm z+mq>A<&{hRuX(;1@}Xv=&99H!ui_*9Bk^7-QZD0ZId2xINfqzDJB%SqvpNx6D_u7- zZl#H@8ZpLCdh!1!je_Ng)J@;RSv^MMTErxOY{xcnHShekX}7z-y8GG2_>Ss##RM>G qEAOhkcX=3e-5*?(DIeeqZR}NL-R==yDED=z@f$5#rD<)LuJsrF2?7lO literal 0 HcmV?d00001 diff --git a/cloud/templates/cloud/noentrie.html b/cloud/templates/cloud/noentrie.html new file mode 100644 index 0000000..bddf137 --- /dev/null +++ b/cloud/templates/cloud/noentrie.html @@ -0,0 +1,7 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Auf diesen Dateibereich haben Sie keinen Zugriff!

+
+
+{% endblock %} \ No newline at end of file diff --git a/dasettings/__init__.py b/dasettings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dasettings/__pycache__/__init__.cpython-38.pyc b/dasettings/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b34a815a05caf112d85beb9de9f5bea26c77257 GIT binary patch literal 157 zcmWIL<>g`kf{y~`aUl9Jh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6ws*(xTqIJKxa z#v?x`J+&ytB|o_|H#M)MIL6&GBqk*@J+mY+Cp9r0C{$V$Q=D2-l9`uY91|a(nU`4- ZAFo$Xd5gm)H$SB`C)EyQ_Gchw002E4Cg}hG literal 0 HcmV?d00001 diff --git a/dasettings/__pycache__/admin.cpython-38.pyc b/dasettings/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af142da6ceb77c8866f4590d4e9b9bf9f6ef899d GIT binary patch literal 200 zcmYjKy$ZrG7))9O5h}h$m#%_{|DY}|+C_p8`-Kq6k0j~fBl${Qot)jA{MyNbyW?)S zE3<4s5PCentk7R=_(y_afea%QAV4)S^h_y%WyVL=E%s#Yp2T}qe8!m@hC3d$dLGBCr-@Jd;kcm*cT zNu~Cr`|jsEe|PeJHj9Dm`sU#UDgOB4+(If+a(6|5fUJO$WsJcFFhKqV$Tj=qS%BdV zl8axOf`s*xWz($c>NPh9-#Ir%MN01G1R64iK(ATGF(3ur&)3VHZri*vZdAx(RPNZ> zCSe~*S*cP>*~e0rHFky1r&7LmsyH&CkKbS;+A+Xiy1Es6r>zr@bz!s>>-x}@x@w)+ zJUt7{P2Q?PD?_c$iqlG=n#L`f56el*e}@YQA~w`pI`|UbRAuUgpR=ADnA7Spn-I}Q OcjLYH{u2hBDgOrrl3POn literal 0 HcmV?d00001 diff --git a/dasettings/__pycache__/forms.cpython-38.pyc b/dasettings/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..278fb38b0771f625189cdacf7ab4839dd163dc33 GIT binary patch literal 4797 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 T&0jH__C|H1y|J;;+VK7ZwJDBS literal 0 HcmV?d00001 diff --git a/dasettings/__pycache__/models.cpython-38.pyc b/dasettings/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0bfe95d5de18475f89085c94d570cd2d8ead85c GIT binary patch literal 197 zcmWIL<>g`kf{y~`aW+8uF^Gc(44TX@fuanW zjJMcw^HWlDiv2X1ZgHk$CFZ5)>!ldTLRO zOMY@`Zfaghag4iXNK8s*dS*#tPHJL0P^h#hCMB^rwWK67FTFShV!mEM}Mcm003lEGC=?U literal 0 HcmV?d00001 diff --git a/dasettings/__pycache__/urls.cpython-38.pyc b/dasettings/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91cb794c23dbdaf6c3c1b9fcfa9e3c409b5a84c5 GIT binary patch literal 810 zcmZuvOOMkq5RRLskM!NHxWT;#8gX5%s$F))10dccaPOzlnGjh$dS6ms1&KZFZ^ z2gz4X`xoHCxC$)?9C`B1H#44xz3lZu4_5T!>HBxS=lyibzpD+(Ic)tM1obFNJ%KPn z4%gC}@Ns>Q{WK5_+z?IN1icQn7TEkf4pLvVaa)8q6dl|_9z(Rj{B4&uY3r*GTAMX# zc!z*%-yzzm*zSSt0NbnBK6v%$pwfm1ABd+T$0h;p)A7QaPVS**Z;EU^CuRfx;1g#% zJ+0Y(nk8JW6#H0k#i*U+ObM2eGUbEd&GxdxsZ5D>*cI4F8D!bt+TjrD) zX8Vr1+z^?tSA@$l5FjHPQlgnLTqfF;A&FpRDA}$6??^u>M-J$jlY&T+FonC7`NpLy z$Lsx>g^td+G^hFPJi-Ug1#t=aNg0qW`5cvlW4_0ZDIXR(heD6h`(vsUb3AsLSH->u z=LZd4PY1R`x6ny8D^#jg4aQ(66|>HyQT)S<6lSB~y?8csaJ3(-ee@r%8D;BC5tAvc z>JXp;7v-s@!!0M=6T{)v#iE)N9{)ub(88OnFihDF)B?8%Q0i}<8oNLzew|;Q#!ENF z_(hh&0OPA{T?i(Pj-S7L8&jTeLsAB_m8MYfaX_)_ZkB(stuv9)B4u-T;rawb7j@AP N_DQ3U9>53k_a6jz^z8ru literal 0 HcmV?d00001 diff --git a/dasettings/__pycache__/views.cpython-38.pyc b/dasettings/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8b88b495729b6477ce2903abfaf81313ed4f8f3 GIT binary patch literal 13020 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 knV(l26Ca2KczG$)edCMXCP((04~ETjQ{`u literal 0 HcmV?d00001 diff --git a/dasettings/models.py b/dasettings/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/dasettings/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/dasettings/templates/dasettings/agency_content.html b/dasettings/templates/dasettings/agency_content.html new file mode 100644 index 0000000..81cd17c --- /dev/null +++ b/dasettings/templates/dasettings/agency_content.html @@ -0,0 +1,340 @@ +{% load crispy_forms_tags %} +{% load static %} +{% load mathfilters %} +{% load humanize %} + +
+ + +
+ +
+ + + {% csrf_token %} +
+ +
+
+ {% for formfield in agencyform %} + {% if forloop.counter|divisibleby:5 %} +
+
+ {{formfield|as_crispy_field}} + {% else %} + {{formfield|as_crispy_field}} + {% endif %} + {% endfor %} +
+
+
Abrechnung
+

Kontostand: {{request.user.profile.agency.balance|floatformat:0}} €

+

Nächste Abbuchung am {{request.user.profile.agency.nextdebiting|date:"d.m.Y"}}

+

Max. Nutzungszeit:  {{request.user.profile.agency.balance|div:30|floatformat:0}} Monate

+

IBAN: DE4412345678912345

+

Laden Sie das Konto mit einem beliebigen Geldbetrag auf. Die Kosten belaufen sich auf 40 € pro Monat.

+
+
+
+
+
+   +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/groups_content.html b/dasettings/templates/dasettings/groups_content.html new file mode 100644 index 0000000..432cbec --- /dev/null +++ b/dasettings/templates/dasettings/groups_content.html @@ -0,0 +1,476 @@ +{% load counter_tag %} +
+ + + + + + +
+
+{% for aggroup in agencygroups %} +{% setvar 0 %} + {% for user in usersofagency %} + {% for group in user.groups.all %} + {% if group.name == aggroup.group.name %} + {% incvar %} + {% endif %} + {% endfor %} + {% endfor %} +{% getvar as varcounter %} +
+
+
+     + + + {% if not aggroup.savefordel %} + + {% endif %} + {% if aggroup.savefordel %} + + {% endif %} +
+
+ +
+
+
Gruppenrechte 
+
+
+ {% for perm in perms %} + {% if forloop.counter|divisibleby:7 %} +
+
+
+ + +
+ {% else %} +
+ + +
+ {% endif %} + {% endfor %} +
+
+
+
+
Mitarbeiter zur Gruppe {{aggroup.agencygroupname}} hinzufügen
+
+ +
+ +
+ + {% for user in usersofagency %} + {% if not user|has_group:aggroup.group.name %} + + +
+
+
Gruppenmitglieder in {{aggroup.agencygroupname}}
+ {% if varcounter > 0 %} + + {% else %} + Diese Gruppe hat noch keine Mitglieder. + {% endif %} +
+ {% for user in usersofagency %} + {% for group in user.groups.all %} + {% if group.name == aggroup.group.name %} + {% if request.user == user and aggroup.is_admin %} + + {% else %} + {{ user.first_name }} {{ user.last_name }}   + + {% endif %} + {% endif %} + {% endfor %} + {% endfor %} +
+
+ +
+
+
+{% endfor %} +
+
+
+ +{% for aggroup in agencygroups %} + {% for p in aggroup.group.permissions.all %} + {% for perm in perms %} + {% if p.codename == perm.name %} + + {% endif %} + {% endfor %} + {% endfor %} +{% endfor %} + + + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/moduls_content.html b/dasettings/templates/dasettings/moduls_content.html new file mode 100644 index 0000000..4db9b03 --- /dev/null +++ b/dasettings/templates/dasettings/moduls_content.html @@ -0,0 +1,28 @@ +{% load crispy_forms_tags %} +
+ + + + + + + + + + + {% csrf_token %} + + +{% for formfield in modulform %} + + + + + +{% endfor %} + +
ModulAktiviertEinstellungen
{{formfield.label_tag}}{{formfield}}
+ + +
+ diff --git a/dasettings/templates/dasettings/notifications_content.html b/dasettings/templates/dasettings/notifications_content.html new file mode 100644 index 0000000..d5accf2 --- /dev/null +++ b/dasettings/templates/dasettings/notifications_content.html @@ -0,0 +1,64 @@ +{% load crispy_forms_tags %} +
+ + + + + + + + + +{% for formfield in notificationform %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} +{% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+ +
+ \ No newline at end of file diff --git a/dasettings/templates/dasettings/profil_content.html b/dasettings/templates/dasettings/profil_content.html new file mode 100644 index 0000000..855b187 --- /dev/null +++ b/dasettings/templates/dasettings/profil_content.html @@ -0,0 +1,114 @@ +{% load crispy_forms_tags %} +
+ +
+ +
+
+
+
Name
+

+ {{ user.first_name }} {{ user.last_name }} +

+
E-Mail
+

+ {{ user.email }} +

+
Agenturfunktion
+

+ {{ user.profile.func }} +

+
+
+
Tätigkeit
+

+ {{ user.profile.compfunc }} +

+
Festnetz
+

+ {{ user.profile.phoneland }} +

+
Mobil
+

+ {{ user.profile.phonemobile }} +

+
+
+
+
+ +
+
+ {% csrf_token %} + + +
+ + Profil bearbeiten + + {% if request.user.profile.showtooltips %} +
+ + +
+ {% else %} +
+ + +
+ {% endif %} + + {{ userform|crispy }} +
+ + Agenturrelevante Daten (Bild, Telefonnummer etc.) werden in der Benutzerverwaltung verändert. +
+   +
+
+
+ {% csrf_token %} + + +
+ + {{ passwordform|crispy}} +
+ +
+   +
+
+
+ diff --git a/dasettings/templates/dasettings/settings.html b/dasettings/templates/dasettings/settings.html new file mode 100644 index 0000000..ecdd3dc --- /dev/null +++ b/dasettings/templates/dasettings/settings.html @@ -0,0 +1,184 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} + +
+ + +
+
+ + +
+
+ +

Einstellungen 

+
+ +
+
+
Profileinstellungen 
+
+ {% block profil_content %} + {% include "dasettings/profil_content.html" %} + {% endblock %} +
+
+
Benachrichtigungen 
+ + {% block notifications_content %} + {% include "dasettings/notifications_content.html" %} + {% endblock %} +
+ {% if user|usergperm:"agencyinfo" %} +
+
Agenturinformationen 
+
+ {% block agency_content %} + {% include "dasettings/agency_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"structuremanager" %} +
+
Struktur 
+
+ {% block structure_content %} + {% include "dasettings/structure_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"usermanager" %} +
+
Mtarbeiter 
+
+ {% block user_content %} + {% include "dasettings/user_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"groupmanager" %} +
+
Gruppen 
+
+ {% block groups_content %} + {% include "dasettings/groups_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"modulesconfig" %} +
+
Module 
+ {% block moduls_content %} + {% include "dasettings/moduls_content.html" %} + {% endblock %} +
+ {% endif %} +
+
+ +{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/structure_content.html b/dasettings/templates/dasettings/structure_content.html new file mode 100644 index 0000000..2398b06 --- /dev/null +++ b/dasettings/templates/dasettings/structure_content.html @@ -0,0 +1,747 @@ +{% load static %} +{% load counter_tag %} + + + + + + + + +
+ +
+ +
+
+{%for area in agencyareas%} +
+
+
+ +      + + + + +
+
+
+
+ + + + + + + + + + + + + {% for task in alltasks %} + {% if task.area.pk == area.pk %} + + + + + + + + {% endif %} + {% endfor %} + +
NameBereichErstellt vonErstellt am 
{{task.name }}{{ task.area.name }}{{ task.created_area_by.first_name }} {{ task.created_area_by.last_name }}{{ task.created_area_date }} + + +
+
+
+
+ +{% endfor %} +
+
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/dasettings/templates/dasettings/user_changemaindata.html b/dasettings/templates/dasettings/user_changemaindata.html new file mode 100644 index 0000000..8694f97 --- /dev/null +++ b/dasettings/templates/dasettings/user_changemaindata.html @@ -0,0 +1,16 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Stammdaten von {{user_fullname}} ändern

+
+
+ {% csrf_token %} + {{ userform|crispy }} +
+ Abbrechen + +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/user_content.html b/dasettings/templates/dasettings/user_content.html new file mode 100644 index 0000000..a42305c --- /dev/null +++ b/dasettings/templates/dasettings/user_content.html @@ -0,0 +1,51 @@ +{% load counter_tag %} ++ Mitarbeiter +
+
+
+ +
+
+ + + + + + + + + + + + + + {% for item in usersofagency %} + + + + + + + + + + {% endfor %} + +
NameE-MailAgenturfunktionTätigkeitTelefonMobil 
{{item.first_name }} {{ item.last_name }}{{ item.email }}{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%}{{ item.profile.compfunc }}{{ item.profile.phoneland }}{{ item.profile.phonemobile }} + {% if item != request.user %} + + {% endif %} +
+
+
+ + diff --git a/dasettings/templates/dasettings/user_newuser_step1.html b/dasettings/templates/dasettings/user_newuser_step1.html new file mode 100644 index 0000000..e1f1c87 --- /dev/null +++ b/dasettings/templates/dasettings/user_newuser_step1.html @@ -0,0 +1,30 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neuer Benutzer 

+
+
+
Schritt 1: Stammdaten
+
+Legen Sie hier die Stammdaten des neuen Mitarbeiters fest. + +
+ {% csrf_token %} + {{ newuserform|crispy }} + +
+ + +
+ *: Der Benutzer erhält direkt eine E-Mail mit einem Link zur Passworterstellung, wenn der Haken bei E-Mailbenachrichtung schicken gesetzt ist. Dies kann später auch wiederholt werden. + +
+ Abbrechen + +
+
+ +{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/user_usprof.html b/dasettings/templates/dasettings/user_usprof.html new file mode 100644 index 0000000..294e25c --- /dev/null +++ b/dasettings/templates/dasettings/user_usprof.html @@ -0,0 +1,325 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load static %} +{% block content %} + + + + +
+ + +
+
+ + +
+ + +
+

Profil von {{user_fullname}} bearbeiten 

+
+ {% if newuser == 1 %} +
+
Schritt 2: Profildaten festlegen
+
+ {% endif %} +
+ +
+
+
+
Name
+

+ {{ user_fullname }} +

+
E-Mail
+

+ {{ mail }} +

+ Stammdaten ändern +
+
+
+
+
+
+ +
+

Gruppen 

+
+
+ {% for g in agencygroups %} + {% if forloop.counter|divisibleby:6 %} +
+
+ {% if vieweduser|useringroupbyid:g.group.name %} + + {% else %} + + {% endif %} + +
+ {% else %} +
+ {% if vieweduser|useringroupbyid:g.group.name %} + + {% else %} + + {% endif %} + +
+ {% endif %} + {% endfor %} +
+
+
+
+

Übergeordneter Mitarbeiter 

+ +
+
+

Persönliches Profil

+ {% csrf_token %} +
+
+ {% for field in profileform %} + {% if forloop.counter|divisibleby:6 %} +
+
+ {{field|as_crispy_field}} + {% else %} + {{field|as_crispy_field}} + {% endif %} + {% endfor %} +
+
+ +
+ {% if newuser == 1 %} + + {% else %} + + {% endif %} + Profilbearbeitung abbrechen +
+
+ + + + +{% endblock content %} \ No newline at end of file diff --git a/dasettings/tests.py b/dasettings/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/dasettings/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/dasettings/urls.py b/dasettings/urls.py new file mode 100644 index 0000000..555fd34 --- /dev/null +++ b/dasettings/urls.py @@ -0,0 +1,16 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required +from . import views +from .views import NewUserFirstStep, UserProfileUpdate, UserChangeMain +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('main/', views.DASettings, name='dasettings'), + path('newuser/s1', permission_required('users.usermanager')(views.NewUserFirstStep), name='newuserfirst'), + path('changeus//', permission_required('users.usermanager')(views.UserChangeMain), name='changeusermaindata'), + path('ajax/', views.SettingsAjaxRouter, name="dasettings-ajax"), + path('usprof//', permission_required('users.usermanager')(views.UserProfileUpdate), name="user_updateprofile") +] \ No newline at end of file diff --git a/dasettings/views.py b/dasettings/views.py new file mode 100644 index 0000000..ab270f9 --- /dev/null +++ b/dasettings/views.py @@ -0,0 +1,557 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm +from django.contrib import messages +from django.contrib.auth import update_session_auth_hash +from django.contrib.auth.forms import PasswordChangeForm +from users.usersforms import AgencyUpdateForm +from users.models import AgencyJob, AgencyGroup +from django.contrib.auth.models import User, Group, Permission +import random +import string +from users.usersforms import UsersPermForm +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView +from users.models import Profile +from areas.models import Areas +from tasks.models import Tasks +import webcolors +from datetime import datetime +from standards.models import Standards + +def randomString(stringLength=10): + """Generate a random string of fixed length """ + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(stringLength)) + +@login_required +def checkForGroupName(request, newgroupname): + stat = True + groupsagency = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk) + for group in groupsagency: + if group.agencygroupname.upper() == newgroupname.upper(): + stat = False + return stat + +@login_required +def getAllForms(request, context): + # USERFORMS + userform = UsersSelfChangeForm(instance=request.user) + passwordform = PasswordChangeForm(request.user) + context.update({'userform' : userform}) + context.update({'passwordform' : passwordform}) + + # NOTIFICTAION FORMS + notificationform = UsersNotificationForm(instance=request.user.profile) + context.update({'notificationform' : notificationform}) + + # AGENCY UPDATE FORMS + agencyform = AgencyUpdateForm(instance=request.user.profile.agency) + context.update({'agencyform' : agencyform}) + + #PERMS + perms = AgencyGroupPerms() + context.update({'perms' : perms}) + + #MODULFORMS + modulform = AgencyModulsForm(instance=request.user.profile.agency) + context.update({'modulform' : modulform}) + + # USER FOR USERTABLE + users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) + return context + + +''' + Lädt die Formulare für die einzelnen Einstellungen vollständig +''' +@login_required +def DASettings(request): + context = { + 'active_link' : 'dasettings' + } + context = getAllForms(request, context) + + # USERS FOR MEMBERS AND GROUPCOUNTERS + usersofagency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name") + context.update({"usersofagency" : usersofagency}) + + # LOAD AGENCYJOBS + context.update({"agencyjobs" : AgencyJob.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("name")}) + + # LOAD GROUPS + agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname") + context.update({"agencygroups" : agencygroups}) + + # LOAD AREAS + agencyareas = Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder') + context.update({"agencyareas" : agencyareas}) + + # LOAD TASKS + alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name') + context.update({"alltasks" : alltasks}) + + if request.method == 'POST' and request.POST.get("settings_area") == "profil": + return SettingsProfilManagement(request, context) + elif request.method == 'POST' and request.POST.get("settings_area") == "agency": + return SettingsAgency(request, context) + elif request.method == 'POST' and request.POST.get("settings_area") == "moduls": + return SettingsAgencyModuls(request, context) + + + + # Returning the data from database for normal-loading Settings + else: + # DEFAULT DATA FORM-INFOS + # Hier müssen alle Standard-Formulare rein, damit die Seite Settings + # generell geladen werden kann. + # PROFILE FORMS + userform = UsersSelfChangeForm(instance=request.user) + passwordform = PasswordChangeForm(request.user) + context.update({'userform' : userform}) + context.update({'passwordform' : passwordform}) + + # NOTIFICTAION FORMS + notificationform = UsersNotificationForm(instance=request.user.profile) + context.update({'notificationform' : notificationform}) + + # AGENCY UPDATE FORMS + agencyform = AgencyUpdateForm(instance=request.user.profile.agency) + context.update({'agencyform' : agencyform}) + + return render(request, 'dasettings/settings.html', context) + +''' + +AGENCY + +Hier werden die Agenturinfos ink. Agenturcropper für das Agenturbild angepasst. + +''' +@login_required +def SettingsAgency(request, context): + if request.POST.get("form_type") == "agencyform": + agencyform = AgencyUpdateForm(request.POST, instance=request.user.profile.agency) + if agencyform.is_valid(): + if 'agencypic' in request.FILES: + request.user.profile.agency.agencypic = request.FILES['agencypic'] + agencyform.save() + context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) + messages.success(request, f'Agenturdaten aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Daten falsch eingegeben!') + context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) + return render(request, 'dasettings/settings.html', context) + +@login_required +def SettingsAgencyModuls(request, context): + if request.POST.get("form_type") == "agencymodform": + agencymoduleform = AgencyModulsForm(request.POST, instance=request.user.profile.agency) + if agencymoduleform.is_valid(): + agencymoduleform.save() + context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) + messages.success(request, f'Moduleinstellungen aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) + messages.success(request, f'Fehler beim aktualisieren! Bitte wenden Sie sich an den Support.') + return render(request, 'dasettings/settings.html', context) + +''' + +Hier werden die Profilinfos des User zurückgesetzt; Parameter kommen von Settings() + +- Email +- Passwort aktualisieren + +''' +@login_required +def SettingsProfilManagement(request, context): + # Check, which form + # USERFORM + if request.POST.get("form_type") == "userform": + userform = UsersSelfChangeForm(request.POST, instance=request.user) + if userform.is_valid(): + userform.save() + messages.success(request, f'E-Mailadresse aktualisiert!') + passwordform = PasswordChangeForm(request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Keine E-Mailadresse eingegeben oder E-Mail bereits vorhanden!') + passwordform = PasswordChangeForm(request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + # PASSWORDFORM + elif request.POST.get("form_type") == "passwordform": + passwordform = PasswordChangeForm(request.user, request.POST) + if passwordform.is_valid(): + passwordform.save() + update_session_auth_hash(request, request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + messages.success(request, f'Passwort aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Passwort falsch eingegeben!') + passwordform = PasswordChangeForm(request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + +@login_required +def SettingsAjaxRouter(request): + success = False + data = {} + # UPDATE NOTIFICATIONS BY FIELDNAME AND NEW VALUE + if request.method == 'GET' and request.GET['action'] == "update_notifications" : + success = False + new_stat = request.GET['new_stat'] + field_to_change = getattr(request.user.profile, request.GET['fieldname']) + if(field_to_change or not field_to_change): + if(new_stat == "1"): + setattr(request.user.profile, request.GET['fieldname'], True) + else: + setattr(request.user.profile, request.GET['fieldname'], False) + request.user.profile.save() + success = True + # UPDATE TOOLTUP + elif request.method == 'GET' and request.GET['action'] == "change_showtooltips" : + newtooltipvalue = False + user = User.objects.get(pk=request.user.pk, profile__agency=request.user.profile.agency) + if user.profile.showtooltips: + user.profile.showtooltips = False + else: + user.profile.showtooltips = True + newtooltipvalue = True + user.save() + success = True + data = {'newttvalue' : newtooltipvalue} + # UPDATE AGENCYJOB + elif request.method == 'GET' and request.GET['action'] == "update_agencyfunc" : + job_id = request.GET['id'] + job_value = request.GET['newvalue'] + tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) + tempjob.name = job_value + tempjob.save() + success = True + # DELETE AGENVY JOB FUNC - RETURN ONLY NAME FOR CONFIRM + elif request.method == 'GET' and request.GET['action'] == "get_agencyfunc" : + job_id = request.GET['id'] + tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) + data = {"funcname" : tempjob.name} + success = True + # DELETE FINAL AGECY 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) + tempjob.delete() + success = True + elif request.method == 'GET' and request.GET['action'] == "add_agencyfunc" : + tempjob = AgencyJob(name="", agency=request.user.profile.agency) + tempjob.save() + data = {"new_id" : tempjob.pk} + success = True + # GRUPPENAMEN AKTUALISIEREN + elif request.method == 'GET' and request.GET['action'] == "update_groupname" : + group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + if(checkForGroupName(request, request.GET['newvalue'])): + group.agencygroupname = request.GET['newvalue'] + group.save() + data = {"newvalue" : group.agencygroupname} + success = True + else: + success = False + # GRUPPENNAMEN HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_groupname" : + group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + data = {"groupname" : group.agencygroupname} + success = True + 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} + else: + success = False + elif request.method == 'GET' and request.GET['action'] == "delete_group" : + groupag = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + 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 + group_id = request.GET['id'] + perm_name = request.GET['perm'] + val = request.GET['val'] + aggroup = AgencyGroup.objects.get(pk=group_id, agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + if(request.user.profile.agency.pk == aggroup.agency.pk): + if(val == "true"): + tempperm = Permission.objects.get(codename=perm_name) + aggroup.group.permissions.add(tempperm) + else: + tempperm = Permission.objects.get(codename=perm_name) + aggroup.group.permissions.remove(tempperm) + else: + success = False + # REMOVE USER FROM GROUP + elif request.method == 'GET' and request.GET['action'] == "remove_user_from_group" : + success = True + groupid = request.GET['groupid'] + userid = request.GET['userid'] + aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) + usertoremove = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + if(request.user.profile.agency.pk == aggroup.agency.pk): + if aggroup.group in usertoremove.groups.all(): + aggroup.group.user_set.remove(usertoremove) + + data = {"userid" : usertoremove.pk, "groupid" : aggroup.pk, "user_fname" : usertoremove.first_name, "user_lname" : usertoremove.last_name} + else: + success = False + # ADD USER TO GROUP + elif request.method == 'GET' and request.GET['action'] == "add_user_to_group" : + success = True + groupid = request.GET['groupid'] + userid = request.GET['userid'] + aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) + usertoadd = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + 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} + else: + success = False + # AREA + # AREANAMEN HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_areaname" : + area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + data = {"areaname" : area.name, "areacolor" : area.color} + success = True + # ARENAMEN UPDATE + elif request.method == 'GET' and request.GET['action'] == "update_areaname" : + area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + area.name = request.GET['newvalue'] + area.color = request.GET['color'] + area.save() + data = {"newvalue" : area.name, "color" : area.color} + success = True + # ADD AREA + elif request.method == 'GET' and request.GET['action'] == "add_area" : + area = Areas(created_area_by=request.user, agency=request.user.profile.agency, name=request.GET["newvalue"], color=request.GET['color']) + area.save() + success = True + # REMOVE AREA + elif request.method == 'GET' and request.GET['action'] == "remove_area" : + Areas(pk=request.GET['id']).delete() + success = True + # ADD TASK + elif request.method == 'GET' and request.GET['action'] == "add_task" : + task = Tasks(created_area_by=request.user, area=Areas.objects.get(pk=request.GET['areaid']), agency=request.user.profile.agency, name=request.GET["newvalue"]) + task.save() + taskcreator_fullname = task.created_area_by.first_name + " " + task.created_area_by.last_name + data = {"name" : task.name, "newtaskid" : task.pk, "areaname" : task.area.name, "taskcreator_fullname" : taskcreator_fullname, "createdate" : task.created_area_date.strftime("%d. %B %Y")} + success = True + # TASKNAME VISIBLE UND USERS HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_taskname" : + task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + # User still in Area + # Get all Users from same Agency which are NOT in context_added_users + added_users = task.usersfield.all() + addus = {} + posus = {} + i = 0 + # GET ADDED USERS + for us in added_users: + addus.update({ i : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) + i += 1 + + # GET POSSIBLE TO ADD USERS + k = 0 + possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).exclude(pk__in=added_users) + print(possible_users) + for us in possible_users: + posus.update({ k : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) + k += 1 + print(posus) + data = {"taskname" : task.name, "visible" : task.visible, "added_users" : addus, "addedl" : i, "possl" : k, "possible_users" : posus, "taskarea" : task.area.pk} + success = True + # REMOVE Task + elif request.method == 'GET' and request.GET['action'] == "remove_task" : + Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency).delete() + success = True + # UPDATE TASK VISIBLE + elif request.method == 'GET' and request.GET['action'] == "update_visible_taskname" : + task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + if(task.visible): + task.visible = False; + else: + task.visible = True; + task.save() + success = True + # UPDATE TASKNAME + elif request.method == 'GET' and request.GET['action'] == "change_taskname" : + task = Tasks.objects.get(pk=request.GET['id']) + task.name = request.GET["newvalue"] + data = {"newvalue" : task.name} + newareaid = request.GET["newareaid"] + standardsmoved = False + if int(task.area.pk) != int(newareaid): + standardsmoved = True + newareaobj = Areas.objects.get(pk=newareaid, agency=request.user.profile.agency) + Standards.objects.filter(agency=request.user.profile.agency, area=task.area).update(area=newareaobj) + task.area = newareaobj + task.save() + data = {"newvalue" : task.name, "smoved" : standardsmoved} + success = True + else: + success = False + return JsonResponse({"success" : success, "data" : data}) + + +''' + UserProfileUpdate + + unterscheidet zwischen newuser=0 --> PROFIL AKTUALISIEREN + und newuser=1 --> PROFIL Neu speichern + +''' +@login_required +def UserProfileUpdate(request, pk, newuser=0): + usertochange = User.objects.get(pk=pk) + user_fullname = usertochange.first_name + " " + usertochange.last_name + parentuser = "" + if(usertochange.profile.parent != None): + parentuser = usertochange.profile.parent.pk + + if request.method == 'POST': + if 'image' in request.FILES: + usertochange.profile.image = request.FILES['image'] + formtosave = False + + formtosave = UserProfileForm(request.POST, instance=usertochange.profile) + + if formtosave.is_valid(): + try: + usertochange.profile.parent = User.objects.get(pk=request.POST['usertoparent'], profile__agency=request.user.profile.agency) + usertochange.save() + except Exception as e: + usertochange.profile.parent = None + usertochange.save() + + formtosave.save() + messages.success(request, f'Profil gespeichert!') + return redirect('dasettings') + else: + messages.success(request, f'Fehlerhafte Eingabe!') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'newuser' : newuser, + 'vieweduser' : usertochange.pk, + 'parentuser' : parentuser, + 'mail' : usertochange.email, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) + } + return render(request, 'dasettings/user_usprof.html', context) + else: + + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'newuser' : newuser, + 'mail' : usertochange.email, + 'vieweduser' : usertochange.pk, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'parentuser' : parentuser, + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True), + 'agencygroups' : AgencyGroup.objects.filter(agency__pk=usertochange.profile.agency.pk).order_by("agencygroupname") + } + return render(request, 'dasettings/user_usprof.html', context) + +# View zur Veränderung der Stammdaten des Benutzers +@login_required +def UserChangeMain(request, pk): + usertochange = User.objects.get(pk=pk, profile__agency=request.user.profile.agency) + user_fullname = usertochange.first_name + " " + usertochange.last_name + if request.method == 'POST': + formtosave = UserNewUserForm(request.POST, instance=usertochange) + if formtosave.is_valid(): + formtosave.save() + formtosave.save() + messages.success(request, f'Stammdaten aktualisiert!') + return redirect('dasettings') + else: + messages.success(request, f'Fehlerhafte Eingabe! Mailadresse bereits vorhanden!') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'userform' : UserNewUserForm(request.POST, instance=usertochange), + } + return render(request, 'dasettings/user_changemaindata.html', context) + else: + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'userform' : UserNewUserForm(instance=usertochange), + } + return render(request, 'dasettings/user_changemaindata.html', context) + +# Method for first User-Creation-Step +@login_required +def NewUserFirstStep(request): + + context = { + 'active_link' : 'dasettings' + } + + if request.method == 'POST': + newuserform = UserNewUserForm(request.POST) + if newuserform.is_valid(): + if(request.POST.get("sendmailnewuser")): + 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://digitale-agentur.com/password-reset/ ein Passwort.', + 'support@digitale-agentur.com', + [newuserform.cleaned_data.get('email')], + html_message=msg_html, + fail_silently=False, + ) + 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() + newuser_id = newuser.id + messages.success(request, f'Benutzer angelegt!') + getadmingroup = AgencyGroup.objects.filter(savefordel=True, is_admin=False, agency=request.user.profile.agency) + for g in getadmingroup: + g.group.user_set.add(newuser) + return redirect('/dasettings/usprof/'+str(newuser_id)+'/1') + else: + messages.success(request, f'Daten falsch eingegeben!') + context['newuserform'] = UserNewUserForm(request.POST) + return render(request, 'dasettings/user_newuser_step1.html', context) + + # Returning the data from database for normal-loading Settings + else: + newuserform = UserNewUserForm() + context.update({'newuserform' : newuserform}) + + return render(request, 'dasettings/user_newuser_step1.html', context) diff --git a/notificsys/__init__.py b/notificsys/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notificsys/__pycache__/__init__.cpython-38.pyc b/notificsys/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d95a1e3a5a6d52aa125e2f1782612e6ed81484c GIT binary patch literal 159 zcmWIL<>g`kf`y_EaUl9Jh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6wo*(xTqIJKxa z#v?x`J+&ytB|o_|H#M)MIL6&GBqk*@J+mY+Cp9r0C{$V$lb2tTnUg`kf`y_EaZW(`F^Gc(44TX@fuanW zjJH@5Q*tx&{4|-O_)@YG^V0M6lJoOQiZYXmKnAR2C}IXuVB(jfvsFxJacWU zdTLROOMY@`Zfaghag4iXNK8s*dS*#tPHJL0P^h#hCNIAvGc7Z@xUx6~Y=>S!npKy+B$J>szO_FXY#(*P3Oes z;Ynawl%1-yDyY?4aa<`>+qzYIu$;8~cesEcVq?9fgU|6rHHBIEIqSKRIj)|v84*Kt NJ>7fbKVj6F^IzXlTn+#L literal 0 HcmV?d00001 diff --git a/notificsys/__pycache__/models.cpython-38.pyc b/notificsys/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b86a6f2311a9cf3babfb96d60a5e7799919614a2 GIT binary patch literal 886 zcmZ8f%Wl*#6t(kCni+=2s(it0<^xcLTBfuVL^o|WRz#GJZ>Jd?yEqQ*u!U`Zfjxi1 zH+ahe^%q!ios7f?OTIeC_u=E~dodbi1lRXw|HE&ekYA2$uK>wD?)EJjPB;~$p^Q?8 zJ>fMz^Ly-zpb1#ege>fNAfhH_F(t=@hdla5cm#BneDzt%<1;c%9KO^v7hJ2E?QnogCeuj)l* zY9&!;s$_|p!N9{FYC6XkWleQg3Xn^4ZNp1Z$&W`E7<0I)I$=(yzRoey2C@@E?;w2m ziDvrDCS@tB2FlWAWr@w|gu{7Re(EYQc(mtIvm>RUUdnf{){#4i=Lcu=gTvP>GO9z7 zHl1Hr`ltrM*+gzBHtQR(`75OaRC4ggw^iGM#V|axo3)Oy+6Z?$Mw9pxI`(oer(-$^df(|ZvngLya;awg za_CsT;hm{P+rLMvU#a6fI&|skCEAN1aO(hRmn=>?5JCY#_f}R*N&zX?h*0zo`U(Aj z{F2sA`Griqbdy-tDZS<=0Wjc_DK0o? z&;dtwlp`GF3Rii;Q@-$3AOaPNkTc}qq5~fIza8QMx)8R!iyrh^-bWt>EgxbCdo6#3 z0gNoqe9?vdIh%~{$pM@2#=S|Z#XYwZzZuUKn0~)3tNd%8CRJV*ra8L6>O*4kbXz{0 zFUr+>DYw-(vqe&5xFuedpL1LxG-E)yv!Xd7ZJrmI+*(r~q}E8WX(STk=b{ZzBns>O z46B{?(XLb<8uFY-`P69hMdIKEwSHaT>Zxsg4nNizB60k3q3%%-vknpo8|sm7exeRY zrrjgqKa$Hyuj#`#IZc!9p)SlF(|fjH z;bA&^7hfCHCjMB;40U{7rb~rIW#WrZS25&SUL_KfjHIQGTYu)(#MZ&d&21B&suGqG S&+MHrBZ2{c>kRn+=iwhzg6N+B literal 0 HcmV?d00001 diff --git a/notificsys/__pycache__/views.cpython-38.pyc b/notificsys/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..704ac268a71498562037d54d313616ee430432c5 GIT binary patch literal 2993 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 +

Alle Benachrichtigungen

+
+ + {% for notification in usernotifications %} + +
+
+ +

+ {% if notification.notificationtype == "agencynews" %} + + {{notification.notificationtext}} +
+ {% else %} + {{notification.notificationtext}}
+ {% endif %} + Am {{notification.created}} +

+
+ {% endfor %} + + + + + + +{% endblock content %} \ No newline at end of file diff --git a/notificsys/templates/notificsys/notification_mail.html b/notificsys/templates/notificsys/notification_mail.html new file mode 100644 index 0000000..a7c7c9d --- /dev/null +++ b/notificsys/templates/notificsys/notification_mail.html @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+

+ +
+
+

Digitale Agentur | Benachrichtigung

+
+
+
+

Hallo {{username}},

+

{{notificationtext}}

+

Weitere Informationen erhalten Sie von Ihrem Agenturleiter. Vielen Dank, dass Sie die Plattform Digitale Agentur nutzen!

+

Mit freundlichen Grüßen

+

Ihr Team von Digitale Agentur

+
+
+

+ +
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/notificsys/tests.py b/notificsys/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/notificsys/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/notificsys/urls.py b/notificsys/urls.py new file mode 100644 index 0000000..c195aac --- /dev/null +++ b/notificsys/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from .views import CheckNotifications, GetBasicNotifications, ShowAllNotifications, ChangeNotificationsToViewed, delAllNotification, delSingleNotification + +urlpatterns = [ + path('checknotifications/', CheckNotifications, name='checknotifications'), + path('getnotifications/', GetBasicNotifications, name='getnotifications'), + path('showallnotificaions/', ShowAllNotifications, name='showallnotificaions'), + path('newnotificationsviewed/', ChangeNotificationsToViewed, name='newnotificationsviewed'), + path('delsingle/', delSingleNotification, name='delsinglenotification'), + path('delall/', delAllNotification, name='delall'), +] diff --git a/notificsys/views.py b/notificsys/views.py new file mode 100644 index 0000000..812a1c7 --- /dev/null +++ b/notificsys/views.py @@ -0,0 +1,108 @@ +from django.shortcuts import render +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from .models import UserNotification +from django.views import generic +from django.contrib.auth.decorators import login_required +# Create your views here. + +@login_required +def CheckNotifications(request): + if request.method == 'GET': + if request.GET['action'] == 'checknotifications': + #print("HERE WE ARE") + unknownnotification = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=False).order_by('-created')[:5] + + data = {}; + i = 0 + for notify in unknownnotification: + + elelink = "notifications/showallnotificaions/" + if notify.notificationtype == "agencynews": + elelink = "news/news/" + str(notify.elementid) + "/single" + + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext, + "elelink" : elelink + }}) + i += 1 + notify.save() + + return JsonResponse({"unknownnotification" : data}) + +# Create your views here. +@login_required +def GetBasicNotifications(request): + if request.method == 'GET': + if request.GET['action'] == 'oldnotifications': + #print("HERE WE ARE") + oldnotifications = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=True, wasviewed=False).order_by('-created')[:5] + + data = {}; + i = 0 + for notify in oldnotifications: + + elelink = "notifications/showallnotificaions/" + if notify.notificationtype == "agencynews": + elelink = "news/news/" + str(notify.elementid) + "/single" + + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext, + "elelink" : elelink + }}) + i += 1 + notify.save() + + return JsonResponse({"oldnotifications" : data}) + +@login_required +def ShowAllNotifications(request): + context ={} + context["usernotifications"] = UserNotification.objects.filter(touser__pk=request.user.pk).order_by('-created') + return render(request, "notificsys/allnotifications.html", context) + +@login_required +def ChangeNotificationsToViewed(request): + if request.method == 'GET': + if request.GET['action'] == 'newnotificationsviewed': + oldnotifications = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=False, wasviewed=False).order_by('-created')[:5] + data = {}; + i = 0 + for notify in oldnotifications: + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext + }}) + i += 1 + notify.wassend = True + notify.save() + return JsonResponse({}) + +@login_required +def delSingleNotification(request): + if request.method == 'GET': + if request.GET['action'] == 'delsingle': + todelnotification = UserNotification.objects.get(pk=request.GET['todelid']) + todelnotification.delete() + + return JsonResponse({}) + +@login_required +def delAllNotification(request): + if request.method == 'GET': + if request.GET['action'] == 'delall': + todelnotification = UserNotification.objects.filter(touser__pk=request.user.pk).delete() + + return JsonResponse({}) \ No newline at end of file diff --git a/re.txt b/re.txt new file mode 100644 index 0000000..01b20d0 --- /dev/null +++ b/re.txt @@ -0,0 +1,25 @@ +Django==3.0.2 +django-appconf==1.0.3 +django-bootstrap-datepicker-plus==3.0.5 +django-cleanup==4.0.0 +django-colorful==1.3 +django-crispy-forms==1.8.1 +django-image-cropping==1.3.0 +django-js-asset==1.2.2 +django-jsonfield==1.3.1 +django-mathfilters==0.4.0 +django-mptt==0.11.0 +django-polymorphic==2.0.3 +django-redis==4.11.0 +django-staticfiles==1.2.1 +django-summernote==0.8.11.6 +django-templatetags==1.1 +django-user-agents==0.4.0 +djangorestframework==3.11.0 +easy-thumbnails==2.7 +mysqlclient==1.4.6 +Pillow==6.2.1 +requests==2.22.0 +requests-oauthlib==1.3.0 +user-agents==2.1 +webcolors==1.10 diff --git a/standards/templates/standards/standards_noentrie.html b/standards/templates/standards/standards_noentrie.html new file mode 100644 index 0000000..45453ac --- /dev/null +++ b/standards/templates/standards/standards_noentrie.html @@ -0,0 +1,7 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Auf diesen Standard haben Sie keinen Zugriff!

+
+
+{% endblock %} \ No newline at end of file diff --git a/users/static/users/css/colorPick.css b/users/static/users/css/colorPick.css new file mode 100644 index 0000000..9554afb --- /dev/null +++ b/users/static/users/css/colorPick.css @@ -0,0 +1,88 @@ +/*! +* +* ColorPick jQuery plugin +* https://github.com/philzet/ColorPick.js +* +* Copyright (c) 2017-2019 Phil Zet (a.k.a. Phil Zakharchenko) +* Licensed under the MIT License +* +*/ + +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), + url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3bO3LdcAZYWl9Si6vvxL-qU.woff) + format("woff"); +} +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), + url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzKRDOzjiPcYnFooOUGCOsRk.woff) + format("woff"); +} + +#colorPick * { + -webkit-transition: all linear 0.2s; + -moz-transition: all linear 0.2s; + -ms-transition: all linear 0.2s; + -o-transition: all linear 0.2s; + transition: all linear 0.2s; +} + +#colorPick { + background: rgba(255, 255, 255, 0.85); + -webkit-backdrop-filter: blur(15px); + position: absolute; + border-radius: 5px; + box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2); + padding: 15px; + font-family: "Open Sans", sans-serif; + width: 140px; +} + +#colorPick span { + font-size: 9pt; + text-transform: uppercase; + font-weight: bold; + color: #bbb; + margin-bottom: 5px; + display: block; + clear: both; +} + +.customColorHash { + border-radius: 5px; + height: 23px; + width: 122px; + margin: 1px 4px; + padding: 0 4px; + border: 1px solid #babbba; + outline: none; +} +.customColorHash.error { + border-color: #ff424c; + color: #ff424c; +} + +.colorPickButton { + border-radius: 5px; + width: 20px; + height: 20px; + margin: 0px 3px; + cursor: pointer; + display: inline-block; + border: thin solid #eee; +} + +.colorPickButton:hover { + transform: scale(1.1); +} + +.colorPickDummy { + background: #fff; + border: 1px dashed #bbb; +} diff --git a/users/static/users/css/jsLists.css b/users/static/users/css/jsLists.css new file mode 100644 index 0000000..10ba2ee --- /dev/null +++ b/users/static/users/css/jsLists.css @@ -0,0 +1,24 @@ +*, *:before, *:after {box-sizing: border-box;} +ul, ol {margin: 0; padding: 0;} +li {list-style: none; line-height: 1.6rem;} + +/* List styling */ +.jslists{ + font-size: 1.3rem; + font-family: Arial, Helvetica, sans-serif; +} +.jslist-ul, .jslist-ol, .jslist-li {margin-left: 12px;} /* Unordered lists */ +.jsl-collapsed {display: none;} +.jsl-list-closed { + float: left; + clear: both; + margin: 2px 4px 2px 0px; + width: 18px; + height: 18px; + cursor: pointer; + background-image: url('data:image/svg+xml;utf8,'); + background-repeat: no-repeat; + background-position: center; +} +.jsl-open {display: block;} +.jsl-list-open {background-image: url('data:image/svg+xml;utf8,');} \ No newline at end of file diff --git a/users/static/users/js/colorPick.js b/users/static/users/js/colorPick.js new file mode 100644 index 0000000..8473191 --- /dev/null +++ b/users/static/users/js/colorPick.js @@ -0,0 +1,163 @@ +/*! +* +* ColorPick jQuery plugin +* https://github.com/philzet/ColorPick.js +* +* Copyright (c) 2017-2019 Phil Zet (a.k.a. Phil Zakharchenko) +* Licensed under the MIT License +* +*/ +(function( $ ) { + + $.fn.colorPick = function(config) { + + return this.each(function() { + new $.colorPick(this, config || {}); + }); + + }; + + $.colorPick = function (element, options) { + options = options || {}; + this.options = $.extend({}, $.fn.colorPick.defaults, options); + if(options.str) { + this.options.str = $.extend({}, $.fn.colorPick.defaults.str, options.str); + } + $.fn.colorPick.defaults = this.options; + this.color = this.options.initialColor.toUpperCase(); + this.element = $(element); + + var dataInitialColor = this.element.data('initialcolor'); + if (dataInitialColor) { + this.color = dataInitialColor; + this.appendToStorage(this.color); + } + + var uniquePalette = []; + $.each($.fn.colorPick.defaults.palette.map(function(x){ return x.toUpperCase() }), function(i, el){ + if($.inArray(el, uniquePalette) === -1) uniquePalette.push(el); + }); + + this.palette = uniquePalette; + + return this.element.hasClass(this.options.pickrclass) ? this : this.init(); + }; + + $.fn.colorPick.defaults = { + 'initialColor': '#3498db', + 'paletteLabel': 'Farbauswahl', + 'allowRecent': true, + 'recentMax': 5, + 'allowCustomColor': false, + 'palette': ["#1abc9c", "#16a085", "#2ecc71", "#27ae60", "#3498db", "#2980b9", "#9b59b6", "#8e44ad", "#34495e", "#2c3e50", "#f1c40f", "#f39c12", "#e67e22", "#d35400", "#e74c3c", "#c0392b", "#ecf0f1", "#bdc3c7", "#95a5a6", "#7f8c8d"], + 'onColorSelected': function() { + this.element.css({'backgroundColor': this.color, 'color': this.color}); + } + }; + + $.colorPick.prototype = { + + init : function(){ + + var self = this; + var o = this.options; + + $.proxy($.fn.colorPick.defaults.onColorSelected, this)(); + + this.element.click(function(event) { + event.preventDefault(); + self.show(event.pageX, event.pageY); + + $('.customColorHash').val(self.color); + + $('.colorPickButton').click(function(event) { + self.color = $(event.target).attr('hexValue'); + self.appendToStorage($(event.target).attr('hexValue')); + self.hide(); + $.proxy(self.options.onColorSelected, self)(); + return false; + }); + $('.customColorHash').click(function(event) { + return false; + }).keyup(function (event) { + var hash = $(this).val(); + if (hash.indexOf('#') !== 0) { + hash = "#"+hash; + } + if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hash)) { + self.color = hash; + self.appendToStorage(hash); + $.proxy(self.options.onColorSelected, self)(); + $(this).removeClass('error'); + } else { + $(this).addClass('error'); + } + }); + + return false; + }).blur(function() { + self.element.val(self.color); + $.proxy(self.options.onColorSelected, self)(); + self.hide(); + return false; + }); + + $(document).on('click', function(event) { + self.hide(); + return true; + }); + + return this; + }, + + appendToStorage: function(color) { + if ($.fn.colorPick.defaults.allowRecent === true) { + var storedColors = JSON.parse(localStorage.getItem("colorPickRecentItems")); + if (storedColors == null) { + storedColors = []; + } + if ($.inArray(color, storedColors) == -1) { + storedColors.unshift(color); + storedColors = storedColors.slice(0, $.fn.colorPick.defaults.recentMax) + localStorage.setItem("colorPickRecentItems", JSON.stringify(storedColors)); + } + } + }, + + show: function(left, top) { + + $("#colorPick").remove(); + + $("#mainmodalArea").append(''); + jQuery.each(this.palette, function (index, item) { + $("#colorPick").append('
'); + }); + if ($.fn.colorPick.defaults.allowCustomColor === true) { + $("#colorPick").append(''); + } + if ($.fn.colorPick.defaults.allowRecent === true) { + $("#colorPick").append('Kürzlich'); + if (JSON.parse(localStorage.getItem("colorPickRecentItems")) == null || JSON.parse(localStorage.getItem("colorPickRecentItems")) == []) { + $("#colorPick").append('
'); + } else { + jQuery.each(JSON.parse(localStorage.getItem("colorPickRecentItems")), function (index, item) { + $("#colorPick").append('
'); + if (index == $.fn.colorPick.defaults.recentMax-1) { + return false; + } + }); + } + } + $("#colorPick").fadeIn(200); + }, + + hide: function() { + $( "#colorPick" ).fadeOut(200, function() { + $("#colorPick").remove(); + return this; + }); + }, + + }; + +}( jQuery )); diff --git a/users/static/users/js/jsLists.js b/users/static/users/js/jsLists.js new file mode 100644 index 0000000..9f53550 --- /dev/null +++ b/users/static/users/js/jsLists.js @@ -0,0 +1,181 @@ +/* + * JSLists v0.4.5 + * © 2016 George Duff + * + * Release date: 01/06/2016 + * The MIT License (MIT) + * Copyright (c) 2016 George Duff + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +// TO DO LIST - Will get round to most of them at some point! +// Add folder & file icons dynamically from param +// Collapse All & Open All are ropey at best! +// Add a search function +// Make the margins user definable +// Add support for UL & OL + +var blackCircle = '● '; +var openCircle = '◎ '; + +(function() { + "use strict"; + function define_JSLists() { + var JSLists = {}; + + var JSLists_Error = function(error, alertType) { + console.log(error); + } + var getUl = function(){ + return document.getElementsByTagName("UL"); + }; + + var getOl = function(){ + return document.getElementsByTagName("OL"); + }; + + var getAllLists = function(){ + var olLists = Array.prototype.slice.call(document.getElementsByTagName("UL")), + ulLists = Array.prototype.slice.call(document.getElementsByTagName("OL")) + var gLists = olLists.concat(ulLists); + return gLists; + } + + JSLists.searchList = function(listId, searchTerm) { + var i, j, lilNodes, liItems = document.getElementsByTagName("LI"); + for(i=0; i 0) { + curElem = document.getElementById(listItems[i].id); + ulCount = document.getElementById(listItems[i].id).getElementsByTagName("UL"); + if(ulCount.length > 0){ + for(j=0; j 0) { //There is a nested UL in this LI element, now find the position of the UL + for(j=0; j +

Agentur {{ request.user.profile.agency.name }}

+
+
+
Inhaber
+

+ {{ request.user.profile.agency.inhaber }} +

+
Adresse
+

+ {{ request.user.profile.agency.street }} +

+

+ {{ request.user.profile.agency.plz }} {{ request.user.profile.agency.city }} +

+
Kontaktdaten
+

+ {{ request.user.profile.agency.agency_email }} +

+

+ {{ request.user.profile.agency.phone }} +

+
Agenturbild
+

+ +

+
+ +{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/agency_update_DELETE.html b/users/templates/users/agency_update_DELETE.html new file mode 100644 index 0000000..72c4ffc --- /dev/null +++ b/users/templates/users/agency_update_DELETE.html @@ -0,0 +1,23 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+ +
+
+ {% csrf_token %} +
+ + Agenturinformationen bearbeiten + + + {{ form|crispy }} +
+
+   + Abbrechen +
+
+
+
+{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/profile_DELETE.html b/users/templates/users/profile_DELETE.html new file mode 100644 index 0000000..64a37a6 --- /dev/null +++ b/users/templates/users/profile_DELETE.html @@ -0,0 +1,62 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+ +
+ +
+
+
+
Name
+

+ {{ user.first_name }} {{ user.last_name }} +

+
E-Mail
+

+ {{ user.email }} +

+
Agenturfunktion
+

+ {{ user.profile.get_func_display }} +

+
+
+
Tätigkeit
+

+ {{ user.profile.compfunc }} +

+
Festnetz
+

+ {{ user.profile.phoneland }} +

+
Mobil
+

+ {{ user.profile.phonemobile }} +

+
+
+
+
+ +
+
+ {% csrf_token %} +
+ + Profil bearbeiten + + + {{ u_form|crispy }} +
+ + Agenturrelevante Daten werden in der Benutzerverwaltung verändert. +
+   + Abbrechen +
+
+
+
+{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/profile_update_DELETE.html b/users/templates/users/profile_update_DELETE.html new file mode 100644 index 0000000..4865676 --- /dev/null +++ b/users/templates/users/profile_update_DELETE.html @@ -0,0 +1,262 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load static %} +{% block content %} + + +
+
+ +
+ +
+
+
+
Name
+

+ {{ prof_user.first_name}} {{ prof_user.last_name }} +

+
E-Mail
+

+ {{ prof_user.email }} +

+
Agenturfunktion
+

+ {{ prof_user.profile.get_func_display }} +

+
+
+
Tätigkeit
+

+ {{ prof_user.profile.compfunc }} +

+
Festnetz
+

+ {{ prof_user.profile.phoneland }} +

+
Mobil
+

+ {{ prof_user.profile.phonemobile }} +

+
+
+
+
+ +
+
+ {% csrf_token %} +
+ + Profil bearbeiten + + + {{ profileform_form|crispy }} +    +
+ Übergeordneter Mitarbeiter: {{prof_user.profile.parent.first_name}} {{prof_user.profile.parent.last_name}} +
+ +
+ + +
+ + {% for us in possible_users %} + + {% endfor %} + + +
+
+
+   + Abbrechen +
+
+
+
+ + + +{% block javascript %} + +{% endblock %} + + +{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/users_adduser_DELETE.html b/users/templates/users/users_adduser_DELETE.html new file mode 100644 index 0000000..e91c08e --- /dev/null +++ b/users/templates/users/users_adduser_DELETE.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neuer Benutzer

+
+ +
+ {% csrf_token %} + {{ form|crispy }} +
+ + +
+ *: Der Benutzer erhält direkt eine E-Mail mit einem Link zur Passworterstellung, wenn der Haken bei E-Mailbenachrichtung schicken gesetzt ist. Dies kann später auch wiederholt werden. +
+   + Abbrechen +
+ +
+{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/users_management_DELETE.html b/users/templates/users/users_management_DELETE.html new file mode 100644 index 0000000..61af915 --- /dev/null +++ b/users/templates/users/users_management_DELETE.html @@ -0,0 +1,81 @@ + + + + +{% extends "users/base.html" %} +{% block content %} +
+

Benutzerverwaltung

+
+

+ Erstellen Sie weitere Mitarbeiter ihrer Agentur. Die neuen Benutzer erhalten eine E-Mail mit einem entsprechenden Link, um ihr Passwort zu generieren. +

+ +
+
+ +
+
+ + + + + + + + + + + + + + + {% for item in users_of_agency %} + + + + + + + + + + + {% endfor %} + +
NameBenutzernameE-MailAgenturfunktionTätigkeitTelefonMobil 
{{item.first_name }} {{ item.last_name }}{{ item.username }}{{ item.email }}{{ item.profile.get_func_display }}{{ item.profile.compfunc }}{{ item.profile.phoneland }}{{ item.profile.phonemobile }} + +
+
+
+
+ +{% endblock content %} \ No newline at end of file diff --git a/users/templates/users/users_prio_DELETE.html b/users/templates/users/users_prio_DELETE.html new file mode 100644 index 0000000..eb7bf2e --- /dev/null +++ b/users/templates/users/users_prio_DELETE.html @@ -0,0 +1,51 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Reihenfolge im Organigramm von {{ user_first_name }} {{ user_last_name }}

+ Elemente mit einer größeren Zahl werden im Organigramm weiter oben angezeigt. Die Änderungen werden sofort gespeichert. +
+
+ {% for area in areas %} +

Bereich {{ area.name }}

+ {% for prio in prios %} + {% if prio.task.area == area %} +
+ +
+
+
+ {% endif %} + {% endfor%} +
+ {% endfor %} +
+ Zum Dashboard +
+ + +{% endblock content %} +