fixed duration conversion

This commit is contained in:
Louis Heredero 2025-02-12 13:53:17 +01:00
parent b24cb55ba8
commit 58a8ae750a
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
2 changed files with 14 additions and 27 deletions

View File

@ -1,4 +1,5 @@
import datetime import datetime
from datetime import timedelta
from dispatcher.models import Task, Project from dispatcher.models import Task, Project
@ -9,6 +10,12 @@ def convert_timedelta(td: datetime.timedelta):
minutes, seconds = divmod(remainder, 60) minutes, seconds = divmod(remainder, 60)
return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}" return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}"
def str_to_timedelta(duration: str):
parts = duration.split(":")
hours = int(parts[0])
minutes = int(parts[1])
return timedelta(hours=hours, minutes=minutes)
def import_tasks(csv_content: str): def import_tasks(csv_content: str):
tasks = [] tasks = []

View File

@ -10,7 +10,7 @@ from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST
from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.status import HTTP_400_BAD_REQUEST
from dispatcher.core import import_tasks, convert_timedelta from dispatcher.core import import_tasks, convert_timedelta, str_to_timedelta
from dispatcher.forms import ProjectForm, ImportForm, ParentForm from dispatcher.forms import ProjectForm, ImportForm, ParentForm
from dispatcher.models import Project, Parent, Clocking, Task, RealSageXHours from dispatcher.models import Project, Parent, Clocking, Task, RealSageXHours
from dispatcher.serializers import ClockingSerializer, RealSageXHoursSerializer from dispatcher.serializers import ClockingSerializer, RealSageXHoursSerializer
@ -175,31 +175,6 @@ def get_stats_by_month(request, year: int, month: int):
) )
return JsonResponse({"status": "success", "data": format_stats(parents, projects, clockings)}) return JsonResponse({"status": "success", "data": format_stats(parents, projects, clockings)})
def get_stats_between(request, start_date: datetime.date, end_date: datetime.date):
parents = Parent.objects.annotate(
total_duration=Sum(
"project__task__duration",
filter=Q(
project__task__date__gte=start_date,
project__task__date__lt=end_date + timedelta(days=1)
)
)
)
projects = Project.objects.annotate(
total_duration=Sum(
"task__duration",
filter=Q(
task__date__gte=start_date,
task__date__lt=end_date + timedelta(days=1)
)
)
)
clockings = Clocking.objects.filter(
date__gte=start_date,
date__lt=end_date + timedelta(days=1)
)
return JsonResponse({"status": "success", "data": format_stats(parents, projects, clockings)})
def format_stats(parents: QuerySet[Parent], projects: QuerySet[Project], clockings: QuerySet[Clocking]): def format_stats(parents: QuerySet[Parent], projects: QuerySet[Project], clockings: QuerySet[Clocking]):
data = { data = {
"parents": [ "parents": [
@ -290,7 +265,12 @@ def set_clocking(request, date: datetime.date):
clocking.out_am = request.POST.get("out_am", clocking.out_am) or None clocking.out_am = request.POST.get("out_am", clocking.out_am) or None
clocking.in_pm = request.POST.get("in_pm", clocking.in_pm) or None clocking.in_pm = request.POST.get("in_pm", clocking.in_pm) or None
clocking.out_pm = request.POST.get("out_pm", clocking.out_pm) or None clocking.out_pm = request.POST.get("out_pm", clocking.out_pm) or None
clocking.remote = request.POST.get("remote", clocking.remote) or None remote = request.POST.get("remote", clocking.remote) or None
if remote is not None:
remote = str_to_timedelta(remote)
else:
remote = timedelta()
clocking.remote = remote
clocking.save() clocking.save()
clocking.refresh_from_db() clocking.refresh_from_db()