Browse Source

add satursday_date in gsaheet_api & url parsing

tripeur 2 years ago
parent
commit
508ac05380
3 changed files with 34 additions and 16 deletions
  1. 4 4
      app/api/endpoints/project.py
  2. 28 9
      app/gsheet.py
  3. 2 3
      app/schemas/requests.py

+ 4 - 4
app/api/endpoints/project.py

@@ -14,7 +14,7 @@ from app.schemas.requests import (
     ProjectSMSBatchRequest,
 )
 from app.schemas.responses import ProjectListResponse, ProjectResponse, SMSResponse
-from app.gsheet import parseGsheet
+from app.gsheet import parseGsheet, extract_doc_uid
 
 router = APIRouter()
 
@@ -50,7 +50,7 @@ async def create_project(
     try:
         session.commit()
     except IntegrityError as e:
-        raise HTTPException(422, "Project name already exist")
+        raise HTTPException(400, "Project name already exist")
 
     session.refresh(project)
 
@@ -110,8 +110,8 @@ async def update_project_from_gsheet(
     p = session.get(Project, project_id)
     if p is None:
         raise HTTPException(status_code=404, detail="Project not found")
-    url = gsheet.sheet_url
-    df_contact, df_creneau, df_planning = parseGsheet()
+    doc_id = extract_doc_uid(gsheet.sheet_url)
+    df_contact, df_creneau, df_planning = parseGsheet(doc_id, gsheet.satursday_date)
     # Create the volunteer list
     volunteer_map: dict[str, Volunteer] = {}
     for _, row in df_contact.iterrows():

+ 28 - 9
app/gsheet.py

@@ -2,12 +2,12 @@ import datetime
 import io
 import os
 from enum import Enum
+from urllib.parse import urlparse
 from uuid import uuid4
 
 import pandas as pd
 import requests
 
-
 planning_gid = "1001381542"
 creneau_gid = "1884137958"
 benevole_gid = "82247394"
@@ -57,6 +57,23 @@ def split_csv_row(raw_data: str, separator: str = ",", escape: str = '"') -> lis
     return arr
 
 
+class InvalidUrlError(Exception):
+    pass
+
+
+def extract_doc_uid(url: str) -> str:
+    res = urlparse(url)
+    if res.netloc != "docs.google.com":
+        raise InvalidUrlError("Invalid netloc")
+    if not res.path.startswith("/spreadsheets/d/"):
+        raise InvalidUrlError("Invalid path")
+    doc_id = res.path.split("/")[3]
+    l_doc_id = len(doc_id)
+    if l_doc_id < 32 and 50 > l_doc_id:
+        raise InvalidUrlError("Invalid path")
+    return doc_id
+
+
 def build_sheet_url(doc_id, sheet_id):
     return f"https://docs.google.com/spreadsheets/d/{doc_id}/export?format=csv&gid={sheet_id}"
 
@@ -93,16 +110,18 @@ def getPlanningDataFrame(csv_filename, starting_date, skip_column=3):
 
     def getDate(day: str) -> datetime.datetime:
         s = day.lower()
-        if s.startswith("jeudi"):
-            return starting_date
+        if s.startswith("mercredi"):
+            return starting_date + datetime.timedelta(days=-3)
+        elif s.startswith("jeudi"):
+            return starting_date + datetime.timedelta(days=-2)
         elif s.startswith("vendredi"):
-            return starting_date + datetime.timedelta(days=1)
+            return starting_date + datetime.timedelta(days=-1)
         elif s.startswith("samedi"):
-            return starting_date + datetime.timedelta(days=2)
+            return starting_date
         elif s.startswith("dimanche"):
-            return starting_date + datetime.timedelta(days=3)
+            return starting_date + datetime.timedelta(days=1)
         elif s.startswith("lundi"):
-            return starting_date + datetime.timedelta(days=4)
+            return starting_date + datetime.timedelta(days=2)
         raise KeyError("This day is not valid : " + s)
 
     def getTime(time_str: str) -> datetime.timedelta:
@@ -173,7 +192,7 @@ def getPlanningDataFrame(csv_filename, starting_date, skip_column=3):
     return pd.DataFrame.from_dict(list_creneau)
 
 
-def parseGsheet(doc_uuid="1Ueuw8VVAmnx5k_t8tjHwLIuYwQJrKcwNbibbaqWRWAs"):
+def parseGsheet(doc_uuid: str, saturday_date: datetime.datetime):
     suffix = "_2023"
     fname_planning = f"./planning{suffix}.csv"
     fname_creneau = f"./creneau{suffix}.csv"
@@ -186,7 +205,7 @@ def parseGsheet(doc_uuid="1Ueuw8VVAmnx5k_t8tjHwLIuYwQJrKcwNbibbaqWRWAs"):
     df_contact["key"] = df_contact["Prénom"] + " " + df_contact.Nom.str.slice(0, 1)
 
     df_creneau = getCreneauDataFrame(fname_creneau)
-    df_planning = getPlanningDataFrame(fname_planning, datetime.datetime(2023, 9, 14))
+    df_planning = getPlanningDataFrame(fname_planning, saturday_date)
 
     os.remove(fname_planning)
     os.remove(fname_creneau)

+ 2 - 3
app/schemas/requests.py

@@ -46,6 +46,7 @@ class ProjectRequest(BaseRequest):
 
 class ProjectImportGsheetRequest(BaseRequest):
     sheet_url: str
+    satursday_date: datetime.datetime
 
 
 class ProjectSMSBatchRequest(BaseRequest):
@@ -59,9 +60,7 @@ class ProjectSMSBatchRequest(BaseRequest):
      - {fin} slot.ending_ting
      - {prenom} volunteer.name
      - {nom} volunteer.surname""",
-        examples=[
-            "Bonjour {prenom},\nTon créneau {titre} commence à {debut}.\nla com bénévole"
-        ],
+        examples=["Bonjour {prenom},\nTon créneau {titre} commence à {debut}.\nla com bénévole"],
     )
     delta_t: int = Field(
         default=10,