diff --git a/azube/asgi.py b/azube/asgi.py index be0c7d9..c36020e 100755 --- a/azube/asgi.py +++ b/azube/asgi.py @@ -11,6 +11,6 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'azube.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "azube.settings") application = get_asgi_application() diff --git a/azube/settings.py b/azube/settings.py index f990dc2..6450e6e 100755 --- a/azube/settings.py +++ b/azube/settings.py @@ -20,7 +20,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure--nw#rw&yl=j$7c3xdg3dh&p=9o=4hngx6+px7s^py6-r6%c#6*' +SECRET_KEY = "django-insecure--nw#rw&yl=j$7c3xdg3dh&p=9o=4hngx6+px7s^py6-r6%c#6*" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -31,53 +31,53 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - "core" + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "core", ] MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ] -ROOT_URLCONF = 'azube.urls' +ROOT_URLCONF = "azube.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, ] -WSGI_APPLICATION = 'azube.wsgi.application' +WSGI_APPLICATION = "azube.wsgi.application" # Database # https://docs.djangoproject.com/en/4.2/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", } } @@ -87,16 +87,16 @@ DATABASES = { AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] @@ -104,9 +104,9 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/4.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -116,9 +116,9 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.2/howto/static-files/ -STATIC_URL = 'static/' +STATIC_URL = "static/" # Default primary key field type # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" diff --git a/azube/urls.py b/azube/urls.py index 0b36a09..14f9926 100755 --- a/azube/urls.py +++ b/azube/urls.py @@ -14,10 +14,8 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ + from django.contrib import admin from django.urls import path, include -urlpatterns = [ - path('admin/', admin.site.urls), - path('', include('core.urls')) -] +urlpatterns = [path("admin/", admin.site.urls), path("", include("core.urls"))] diff --git a/azube/wsgi.py b/azube/wsgi.py index 57ecb7e..9f865c5 100755 --- a/azube/wsgi.py +++ b/azube/wsgi.py @@ -11,6 +11,6 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'azube.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "azube.settings") application = get_wsgi_application() diff --git a/core/apps.py b/core/apps.py index 0e27c08..1a7d9b2 100755 --- a/core/apps.py +++ b/core/apps.py @@ -2,5 +2,5 @@ from django.apps import AppConfig class MainAppConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'core' + default_auto_field = "django.db.models.BigAutoField" + name = "core" diff --git a/core/azure_auth.py b/core/azure_auth.py index 90eeb01..2636fb9 100755 --- a/core/azure_auth.py +++ b/core/azure_auth.py @@ -1,6 +1,9 @@ import json import base64 +from core.models import Berichtsheft + + class AzureUser: display_name: str id: str @@ -15,14 +18,18 @@ class AzureUser: self.id = request.headers["X-MS-CLIENT-PRINCIPAL-NAME"] # X-MS-CLIENT-PRINCIPAL - claims_json = json.loads(base64.decode(request.headers["X-MS-CLIENT-PRINCIPAL"])) + claims_json = json.loads( + base64.decode(request.headers["X-MS-CLIENT-PRINCIPAL"]) + ) claims = {} for claim in claims_json["claims"]: claims[claim["typ"]] = claim["val"] - + self.claims = claims except: self.display_name = "Anon" self.id = "anon" + def reports(self): + return Berichtsheft.objects.filter(user=self.id) diff --git a/core/doc_gen.py b/core/doc_gen.py index b5f6bb6..e6b3040 100755 --- a/core/doc_gen.py +++ b/core/doc_gen.py @@ -1,5 +1,6 @@ import json + def gen_doc(template: str, vars: dict) -> str: definition = json.loads(open(f"{template}.json").read()) content = open(f"{template}.html").read() @@ -8,4 +9,4 @@ def gen_doc(template: str, vars: dict) -> str: var_r = var["name"].upper() content = content.replace(f"[[{var_r}]]", vars[var["name"]]) - return content \ No newline at end of file + return content diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index 5d758e6..eaacbb1 100755 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -15,15 +15,30 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Berichtsheft', + name="Berichtsheft", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('year', models.PositiveIntegerField()), - ('week', models.PositiveSmallIntegerField()), - ('content', models.JSONField()), - ('approved_by', models.JSONField()), - ('created', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='berichtshefte', to=settings.AUTH_USER_MODEL)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("year", models.PositiveIntegerField()), + ("week", models.PositiveSmallIntegerField()), + ("content", models.JSONField()), + ("approved_by", models.JSONField()), + ("created", models.DateTimeField(auto_now_add=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="berichtshefte", + to=settings.AUTH_USER_MODEL, + ), + ), ], ), ] diff --git a/core/migrations/0002_alter_berichtsheft_id.py b/core/migrations/0002_alter_berichtsheft_id.py index be15824..21edbf1 100755 --- a/core/migrations/0002_alter_berichtsheft_id.py +++ b/core/migrations/0002_alter_berichtsheft_id.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('core', '0001_initial'), + ("core", "0001_initial"), ] operations = [ migrations.AlterField( - model_name='berichtsheft', - name='id', + model_name="berichtsheft", + name="id", field=models.AutoField(primary_key=True, serialize=False), ), ] diff --git a/core/migrations/0003_group_azureuser_alter_berichtsheft_user.py b/core/migrations/0003_group_azureuser_alter_berichtsheft_user.py index 794c758..6050d9c 100755 --- a/core/migrations/0003_group_azureuser_alter_berichtsheft_user.py +++ b/core/migrations/0003_group_azureuser_alter_berichtsheft_user.py @@ -10,54 +10,137 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('core', '0002_alter_berichtsheft_id'), + ("auth", "0012_alter_user_first_name_max_length"), + ("core", "0002_alter_berichtsheft_id"), ] operations = [ migrations.CreateModel( - name='Group', - fields=[ - ], + name="Group", + fields=[], options={ - 'proxy': True, - 'indexes': [], - 'constraints': [], + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('auth.group',), + bases=("auth.group",), managers=[ - ('objects', django.contrib.auth.models.GroupManager()), + ("objects", django.contrib.auth.models.GroupManager()), ], ), migrations.CreateModel( - name='AzureUser', + name="AzureUser", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('groups', models.ManyToManyField(blank=True, related_name='azure_user_groups', to='auth.group')), - ('user_permissions', models.ManyToManyField(blank=True, related_name='azure_user_permissions', to='auth.permission')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, verbose_name="email address" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ( + "groups", + models.ManyToManyField( + blank=True, related_name="azure_user_groups", to="auth.group" + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + related_name="azure_user_permissions", + to="auth.permission", + ), + ), ], options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, }, managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ("objects", django.contrib.auth.models.UserManager()), ], ), migrations.AlterField( - model_name='berichtsheft', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='berichtshefte', to='core.azureuser'), + model_name="berichtsheft", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="berichtshefte", + to="core.azureuser", + ), ), ] diff --git a/core/migrations/0004_remove_berichtsheft_approved_by.py b/core/migrations/0004_remove_berichtsheft_approved_by.py index 27beaa4..aa1f29b 100755 --- a/core/migrations/0004_remove_berichtsheft_approved_by.py +++ b/core/migrations/0004_remove_berichtsheft_approved_by.py @@ -6,12 +6,12 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('core', '0003_group_azureuser_alter_berichtsheft_user'), + ("core", "0003_group_azureuser_alter_berichtsheft_user"), ] operations = [ migrations.RemoveField( - model_name='berichtsheft', - name='approved_by', + model_name="berichtsheft", + name="approved_by", ), ] diff --git a/core/migrations/0005_user_alter_berichtsheft_user_delete_azureuser.py b/core/migrations/0005_user_alter_berichtsheft_user_delete_azureuser.py index cd0eac0..cf368b3 100755 --- a/core/migrations/0005_user_alter_berichtsheft_user_delete_azureuser.py +++ b/core/migrations/0005_user_alter_berichtsheft_user_delete_azureuser.py @@ -9,43 +9,123 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('core', '0004_remove_berichtsheft_approved_by'), + ("auth", "0012_alter_user_first_name_max_length"), + ("core", "0004_remove_berichtsheft_approved_by"), ] operations = [ migrations.CreateModel( - name='User', + name="User", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('groups', models.ManyToManyField(blank=True, related_name='user_groups', to='auth.group')), - ('user_permissions', models.ManyToManyField(blank=True, related_name='user_permissions', to='auth.permission')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, verbose_name="email address" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ( + "groups", + models.ManyToManyField( + blank=True, related_name="user_groups", to="auth.group" + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + related_name="user_permissions", + to="auth.permission", + ), + ), ], options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, }, managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ("objects", django.contrib.auth.models.UserManager()), ], ), migrations.AlterField( - model_name='berichtsheft', - name='user', + model_name="berichtsheft", + name="user", field=models.TextField(), ), migrations.DeleteModel( - name='AzureUser', + name="AzureUser", ), ] diff --git a/core/migrations/0006_berichtsheft_num.py b/core/migrations/0006_berichtsheft_num.py new file mode 100755 index 0000000..985fc22 --- /dev/null +++ b/core/migrations/0006_berichtsheft_num.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.16 on 2024-12-03 09:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0005_user_alter_berichtsheft_user_delete_azureuser"), + ] + + operations = [ + migrations.AddField( + model_name="berichtsheft", + name="num", + field=models.PositiveBigIntegerField(default=0), + ), + ] diff --git a/core/models.py b/core/models.py index 6dbd6ec..0f00920 100755 --- a/core/models.py +++ b/core/models.py @@ -2,35 +2,43 @@ from django.db import models from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import Group as BuiltinGroup + class User(AbstractUser): groups = models.ManyToManyField( - 'auth.Group', - related_name='user_groups', + "auth.Group", + related_name="user_groups", blank=True, ) user_permissions = models.ManyToManyField( - 'auth.Permission', - related_name='user_permissions', + "auth.Permission", + related_name="user_permissions", blank=True, ) + class Group(BuiltinGroup): class Meta: proxy = True + class Berichtsheft(models.Model): id = models.AutoField(primary_key=True) user = models.TextField() + num = models.PositiveBigIntegerField(default=0) year = models.PositiveIntegerField() week = models.PositiveSmallIntegerField() content = models.JSONField() created = models.DateTimeField(auto_now_add=True) def __str__(self): - return f"Berichtsheft: {self.user.username}, Year: {self.year}, Week: {self.week}" + return ( + f"Berichtsheft: {self.user.username}, Year: {self.year}, Week: {self.week}" + ) + class Approval: id = models.AutoField(primary_key=True) user = models.TextField() - report = models.ForeignKey(Berichtsheft, on_delete=models.CASCADE, related_name="report") - + report = models.ForeignKey( + Berichtsheft, on_delete=models.CASCADE, related_name="report" + ) diff --git a/core/report_templates.py b/core/report_templates.py new file mode 100755 index 0000000..a5f2073 --- /dev/null +++ b/core/report_templates.py @@ -0,0 +1,29 @@ +class ReportTemplates: + report_global = { + "vars": [ + {"name": "name", "display_name": "Name"}, + {"name": "num_doc", "display_name": "Berichtsheft Nummer"}, + {"name": "year", "display_name": "Jahr"}, + {"name": "week", "display_name": "Kalenderwoche"}, + {"name": "start_date", "display_name": "Von"}, + {"name": "end_date", "display_name": "bis"}, + {"name": "department", "display_name": "Abteilung"}, + ] + } + + def get_template(id) -> dict: + match id: + case "weekly": + weekly = { + "vars": [ + { + "name": "company_text", + "display_name": "Betriebliche Tätigkeiten", + }, + {"name": "week_topic", "display_name": "Thema der Woche"}, + {"name": "school_text", "display_name": "Berufsschule"}, + ] + } + + weekly["vars"].extend(ReportTemplates.report_global["vars"]) + return weekly diff --git a/core/templates/write.html b/core/templates/write.html index 8f5601e..51cd0ed 100755 --- a/core/templates/write.html +++ b/core/templates/write.html @@ -21,13 +21,29 @@ value = "{{ year }}" {% endif %} + {% if var.name == "start_date" %} + value = "{{ start_date|date:"d.m.Y" }}" + {% endif %} + {% if var.name == "end_date" %} + value = "{{ end_date|date:"d.m.Y" }}" + {% endif %} + + {% if var.name == "num_doc" %} + value = "{{ current_num }}" + {% endif %} + + {% if var.name == "name" %} + value = "{{ user.display_name }}" + {% endif %} > {% endfor %} + + {% csrf_token %} diff --git a/core/urls.py b/core/urls.py index 0740e2c..6a9c653 100755 --- a/core/urls.py +++ b/core/urls.py @@ -2,7 +2,7 @@ from django.urls import path from . import views urlpatterns = [ - path('', views.index, name='index'), - path('write', views.write_new_report, name='write'), - path("test", views.test, name="test") -] \ No newline at end of file + path("", views.index, name="index"), + path("write", views.write_new_report, name="write"), + path("test", views.test, name="test"), +] diff --git a/core/util.py b/core/util.py new file mode 100755 index 0000000..c93ebe8 --- /dev/null +++ b/core/util.py @@ -0,0 +1,32 @@ +import datetime + + +def next_date(year: int, week: int) -> (int, int): + if week >= 52: + return (year + 1, 1) + else: + return (year, week + 1) + + +def first_day_of_iso_week(year, week): + # Create a date object for January 4th of the given year + # This date is always in the first week of the year according to ISO 8601 + jan4 = datetime.datetime(year, 1, 4) + + # Get the ISO week number and the weekday of January 4th + start_iso_week, start_iso_day = jan4.isocalendar()[1:3] + + # Calculate the difference in weeks, then adjust for the start of the week + weeks_diff = week - start_iso_week + days_to_monday = datetime.timedelta(days=(1 - start_iso_day)) + + # Calculate the first day of the given ISO week + return jan4 + days_to_monday + datetime.timedelta(weeks=weeks_diff) + + +def get_week_range(p_year, p_week): + firstdayofweek = datetime.datetime.strptime( + f"{p_year}-W{int(p_week)}-1", "%Y-W%W-%w" + ).date() + lastdayofweek = firstdayofweek + datetime.timedelta(days=6.9) + return firstdayofweek, lastdayofweek diff --git a/core/views.py b/core/views.py index 8323879..33e1180 100755 --- a/core/views.py +++ b/core/views.py @@ -1,47 +1,59 @@ from django.shortcuts import render + +from core.report_templates import ReportTemplates +from core.util import get_week_range, next_date from .azure_auth import AzureUser from .models import Berichtsheft import datetime -import json # Create your views here. -def next_date(year: int, week: int) -> (int, int): - if week >= 52: - return (year + 1, 1) - else: - return (year, week + 1) def write_new_report(request): user = AzureUser(request) # TODO : Get template for user - definition = json.loads(open("report_weekly.json").read()) + definition = ReportTemplates.get_template("weekly") # Get the latest year and week - latest = Berichtsheft.objects.filter(user=user).order_by('-year', '-week').first() + latest = user.reports().order_by("-year", "-week").first() if latest is not None: current_year, current_week = next_date(latest.year, latest.week) else: current_year, current_week, _ = datetime.datetime.today().isocalendar() - # Get cookies for persistent saves + start_date, end_date = get_week_range(current_year, current_week) + if latest is not None: + current_num = latest.num + 1 + else: + current_num = 1 + + # TODO : Cookies for persistent saves + + return render( + request, + "write.html", + { + "user": user, + "year": current_year, + "week": current_week, + "start_date": start_date, + "end_date": end_date, + "current_num": current_num, + "definition": definition, + }, + ) - return render(request, "write.html", { - "user": user, - "year": current_year, - "week": current_week, - "definition": definition - }) def index(request): user = AzureUser(request) # Get all berichtshefte - all_reports = Berichtsheft.objects.filter(user=user) + all_reports = user.reports() return render(request, "index.html", {"user": user, "reports": all_reports}) + def test(request): - return render(request, "test.html", {}) \ No newline at end of file + return render(request, "test.html", {}) diff --git a/manage.py b/manage.py index 0a4fffa..28baf96 100755 --- a/manage.py +++ b/manage.py @@ -6,7 +6,7 @@ import sys def main(): """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'azube.settings') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "azube.settings") try: from django.core.management import execute_from_command_line except ImportError as exc: @@ -18,5 +18,5 @@ def main(): execute_from_command_line(sys.argv) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/report_weekly.json b/report_weekly.json deleted file mode 100755 index 23702ae..0000000 --- a/report_weekly.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "vars": [ - { - "name": "name", - "display_name": "Name" - }, - { - "name": "num_doc", - "display_name": "Berichtsheft Nummer" - }, - { - "name": "year", - "display_name": "Jahr" - }, - { - "name": "week", - "display_name": "Kalenderwoche" - }, - { - "name": "start_date", - "display_name": "Von" - }, - { - "name": "end_date", - "display_name": "bis" - }, - { - "name": "department", - "display_name": "Abteilung" - }, - { - "name": "company_text", - "display_name": "Betriebliche Tätigkeiten" - }, - { - "name": "week_topic", - "display_name": "Thema der Woche" - }, - { - "name": "school_text", - "display_name": "Berufsschule" - } - ] -} \ No newline at end of file