fixed duration conversion
This commit is contained in:
parent
b24cb55ba8
commit
58a8ae750a
@ -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 = []
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user