diff --git a/mycaldav/models.py b/mycaldav/models.py index 28c2d5e..657cde9 100644 --- a/mycaldav/models.py +++ b/mycaldav/models.py @@ -85,7 +85,7 @@ class cls_caldav(): for event in events: item = _caldav_item() item.name = event["SUMMARY"] - item.uiid = event["UID"] + item.uuid = f"{event['UID']}" if Key_separator in item.name: arr = item.name.split(Key_separator) item.key = arr[0] @@ -107,12 +107,14 @@ class cls_caldav(): item.team_2_chef = True item.team_2 = item.team_2.replace("#", "") + if "DESCRIPTION" in event.keys(): - item.desc = event["DESCRIPTION"] - if "#" in item.desc: + item.desc = f"{event['DESCRIPTION']}" + + if "#Fait" in item.desc: item.done = True - if "#Fait" in item.desc: - item.desc = item.desc.replace("#Fait", "") + item.desc = item.desc.replace("#Fait", "") + if '{href=' in item.desc: temp_str = item.desc.split('{href=')[1] @@ -395,25 +397,30 @@ class cls_caldav_client(): class _caldav_item(): - key = "" - name = "" - desc = "" - dtstart = None - str_start_date = "" - str_start_time = "" - dtend = None - str_end_date = "" - str_end_time = "" - dtstamp = None - done = False - href = "" - uiid = "" - team_1 = "" - team_2 = "" - team_1_chef = False - team_2_chef = False - team_transfert = False - team_manif = False + def __init__(self, key="", name="", desc="", dtstart=None, str_start_date="", + str_start_time="", dtend=None, str_end_date="", str_end_time="", + dtstamp=None, done=False, href="", uuid="", team_1="", + team_2="", team_1_chef=False, team_2_chef=False, + team_transfert=False, team_manif=False): + self.key = key + self.name = name + self.desc = desc + self.dtstart = dtstart + self.str_start_date = str_start_date + self.str_start_time = str_start_time + self.dtend = dtend + self.str_end_date = str_end_date + self.str_end_time = str_end_time + self.dtstamp = dtstamp + self.done = done + self.href = href + self.uuid = uuid + self.team_1 = team_1 + self.team_2 = team_2 + self.team_1_chef = team_1_chef + self.team_2_chef = team_2_chef + self.team_transfert = team_transfert + self.team_manif = team_manif def format_str_date(self): self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m") @@ -424,3 +431,24 @@ class _caldav_item(): +from rest_framework import serializers + +class CalDavItemSerializer(serializers.Serializer): + key = serializers.CharField() + name = serializers.CharField() + desc = serializers.CharField(allow_blank=True) + dtstart = serializers.CharField() + str_start_date = serializers.CharField() + str_start_time = serializers.CharField() + dtend = serializers.CharField() + str_end_date = serializers.CharField() + str_end_time = serializers.CharField() + done = serializers.BooleanField() + href = serializers.CharField(allow_blank=True) + uuid = serializers.CharField() + team_1 = serializers.CharField(allow_blank=True) + team_2 = serializers.CharField(allow_blank=True) + team_1_chef = serializers.BooleanField() + team_2_chef = serializers.BooleanField() + team_transfert = serializers.BooleanField() + team_manif = serializers.BooleanField() \ No newline at end of file diff --git a/mycaldav/views.py b/mycaldav/views.py index 81404df..7bbe246 100644 --- a/mycaldav/views.py +++ b/mycaldav/views.py @@ -1,4 +1,6 @@ -from django.http import HttpResponse +import json + +from django.http import HttpResponse, JsonResponse from django.http import FileResponse from django.shortcuts import render from django.views import generic @@ -18,30 +20,92 @@ from mycaldav.settings import * from mycaldav.export_team_pdf import * from comm_op.models import comm_opMessage -class caldav_item: - def __init__(self): - self.uuid = "" - self.name = "" - self.desc = "" - self.key = "" - self.done = False - self.href = "#" - self.str_start_date = "" - self.str_end_date = "" + +from rest_framework.response import Response +from rest_framework import status +from rest_framework.decorators import api_view + +from mycaldav.models import CalDavItemSerializer, _caldav_item + +import logging + +logger = logging.getLogger(__name__) +def to_json(caldav_items): + items_as_dicts = [ + { + 'key': item.key, + 'name': item.name, + 'desc': item.desc, + 'str_start_date': item.str_start_date, + 'str_start_time': item.str_start_time, + 'str_end_date': item.str_end_date, + 'str_end_time': item.str_end_time, + 'done': item.done, + 'href': item.href, + 'uuid': item.uuid, + 'team_1': item.team_1, + 'team_2': item.team_2, + 'team_1_chef': item.team_1_chef, + 'team_2_chef': item.team_2_chef, + 'team_transfert': item.team_transfert, + 'team_manif': item.team_manif, + } + for item in caldav_items + ] + + return items_as_dicts +def serialize_item(caldav_items): + json_data = to_json(caldav_items) + return json.dumps(json_data) -@xframe_options_exempt +def formatResponseArray(o_caldav, inverted=False): + print(o_caldav.items) + try: + if inverted: + o_caldav.items.reverse() + o_caldav.day.reverse() + o_caldav.night.reverse() + + # Serialize data + serializer_items = CalDavItemSerializer(data=[item.__dict__ for item in o_caldav.items], many=True) + serializer_day = CalDavItemSerializer(data=[item.__dict__ for item in o_caldav.day], many=True) + serializer_night = CalDavItemSerializer(data=[item.__dict__ for item in o_caldav.night], many=True) + + # Check validation and print errors + validate_and_log(serializer_items, "items") + validate_and_log(serializer_day, "day") + validate_and_log(serializer_night, "night") + + response_data = { + "items": serializer_items.data, + "day": serializer_day.data, + "night": serializer_night.data, + } + response_status = status.HTTP_200_OK + + except Exception as e: + logger.error(f"An error occurred: {e}") + response_data = {"error": "An error occurred while processing the request."} + response_status = status.HTTP_500_INTERNAL_SERVER_ERROR + + return {"data":response_data, "status": response_status} +def validate_and_log(serializer, label): + if not serializer.is_valid(): + print(f"Validation Error {label}: {serializer.errors}") +@api_view(['GET']) def view_task_caldav(request): o_caldav = cls_caldav(url=caldav_cfg["task"]) o_caldav.get_caldav_data() - template = loader.get_template("task/task.html") - context = {'latest_task_list':o_caldav.day, 'night_task_list': o_caldav.night} + if (datetime.today().day == 1) or 2==1: myClient = cls_caldav_client() myClient.init_task_management() - return HttpResponse(template.render(context,request)) + + response = formatResponseArray(o_caldav) + return Response(response["data"], status=response["status"]) @xframe_options_exempt def view_task_edit_caldav(request, uuid): @@ -64,36 +128,38 @@ def view_vhc_edit_caldav(request, uuid): myClient.mark_as_done_task(calandar=myClient.a_vhc,uuid=uuid) return view_vhc_caldav(request) -@xframe_options_exempt +@api_view(['GET']) def view_vhc_caldav(request): - o_caldav = cls_caldav(url=caldav_cfg["vhc"]) - o_caldav.get_caldav_data(periode=2) - template = loader.get_template("vhc/vhc_view.html") - context = {'latest_task_list': o_caldav.items} - return HttpResponse(template.render(context, request)) + o_caldav = cls_caldav(url=caldav_cfg["vhc"]) + o_caldav.get_caldav_data(periode=2) -@xframe_options_exempt + response = formatResponseArray(o_caldav) + return Response(response["data"], status=response["status"]) + +@api_view(['GET']) def view_rh_caldav(request): o_caldav = cls_caldav(url=caldav_cfg["rh"]) o_caldav.get_caldav_data(periode=2) - template = loader.get_template("rh/rh_view.html") - context = {'latest_task_list': o_caldav.items[::-1], 'today': datetime.today().strftime('%d.%m')} - return HttpResponse(template.render(context, request)) -@xframe_options_exempt + response = formatResponseArray(o_caldav,inverted=True) + return Response(response["data"], status=response["status"]) + + + +@api_view(['GET']) def view_road_caldav(request): o_caldav = cls_caldav(url=caldav_cfg["road"]) o_caldav.get_caldav_data(periode=2) - template = loader.get_template("road/road_view.html") - context = {'latest_task_list': o_caldav.items[::-1]} - return HttpResponse(template.render(context, request)) -@xframe_options_exempt + response = formatResponseArray(o_caldav, inverted=True) + return Response(response["data"], status=response["status"]) + +@api_view(['GET']) def view_op_caldav(request): o_items = comm_opMessage.objects.filter(bDone=False, dtStart__lte= datetime.today() + timedelta(days=1)) all_items = [] for item in o_items: - temp_item = caldav_item() - temp_item.uuid = item.uuid + temp_item = _caldav_item() + temp_item.uuid = f"{item.uuid}" temp_item.name = item.sTitle temp_item.desc = item.sDesc temp_item.key = item.sKey @@ -104,11 +170,20 @@ def view_op_caldav(request): temp_item.str_end_date = None all_items.append(temp_item) - template = loader.get_template("op/op_view.html") - context = {'latest_task_list': all_items} - return HttpResponse(template.render(context, request)) + try: + serializer = CalDavItemSerializer(data=all_items, many=True) + if serializer.is_valid(): + print("Serialized Data:", serializer.data) + else: + print("Validation Error:", serializer.errors) -@xframe_options_exempt + except Exception as e: + logger.error(f"An error occurred: {e}") + return Response({"error": "An error occurred while processing the request."}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + return Response(serializer.data) + +@api_view(['GET']) def view_team_caldav(request): #Change timezone myclient = cls_caldav_client() @@ -122,17 +197,25 @@ def view_team_caldav(request): template = loader.get_template("team/team_view.html") o_caldav.sort_array_by_key(True) - context = {'latest_task_list': o_caldav.day, 'night_task_list': o_caldav.night, 'today': datetime.today().strftime('%d.%m'),'yesterday': (datetime.today() + timedelta(days=-1)).strftime('%d.%m'),'tomorow': (datetime.today() + timedelta(days=+1)).strftime('%d.%m')} - return HttpResponse(template.render(context, request)) + response = formatResponseArray(o_caldav) + additional_data = { + 'today': datetime.today().strftime('%d.%m'), + 'yesterday': (datetime.today() + timedelta(days=-1)).strftime('%d.%m'), + 'tomorrow': (datetime.today() + timedelta(days=1)).strftime('%d.%m') + } + response["data"].update(additional_data) + return Response(response["data"], status=response["status"]) -@xframe_options_exempt + +@api_view(['GET']) def view_manif_caldav(request): o_caldav = cls_caldav(url=caldav_cfg["manif"]) o_caldav.get_caldav_data(periode=1) - template = loader.get_template("manif/manif_view.html") o_caldav.sort_array_by_key(True) - context = {'latest_task_list': o_caldav.items, 'night_task_list': o_caldav.night, 'today': datetime.today().strftime('%d.%m')} - return HttpResponse(template.render(context, request)) + + response = formatResponseArray(o_caldav) + return Response(response["data"], status=response["status"]) + @xframe_options_exempt def view_team_pdf_caldav(request):