Selaa lähdekoodia

Implement first version of sms script

tripeur 2 vuotta sitten
vanhempi
commit
d8b9558251
5 muutettua tiedostoa jossa 79 lisäystä ja 22 poistoa
  1. 21 9
      app/api/endpoints/sms.py
  2. 0 9
      app/schemas/responses.py
  3. 4 0
      script/.env.example
  4. 8 0
      script/run.sh
  5. 46 4
      script/send_sms.py

+ 21 - 9
app/api/endpoints/sms.py

@@ -76,9 +76,7 @@ async def delete_sms(
     session: Session = Depends(deps.get_session),
 ):
     """Delete a sms from the project"""
-    session.execute(
-        delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == str(project_id)))
-    )
+    session.execute(delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == str(project_id))))
     session.commit()
 
 
@@ -89,13 +87,29 @@ async def list_sms_to_send(
 ):
     """List sms that should be send by now"""
     results = session.execute(
-        select(Sms).where(
-            (Sms.sending_time < datetime.datetime.now()) & (Sms.send_time == None)
-        )
+        select(Sms).where((Sms.sending_time < datetime.datetime.now()) & (Sms.send_time == None))
     )
     return results.scalars().all()
 
 
+@router.get("/sms/send-now/{sms_id}", response_model=SMSResponse)
+async def send_sms_now(
+    sms_id: UUID,
+    current_user: User = Depends(deps.get_current_user),
+    session: Session = Depends(deps.get_session),
+):
+    """Update the SMS to be sent now"""
+    sms = session.get(Sms, sms_id)
+    if sms is None:
+        raise HTTPException(status_code=404, detail="SMS not found")
+    elif sms.send_time is not None:
+        raise HTTPException(status_code=400, detail="SMS has already been sent")
+    else:
+        sms.send_time = datetime.datetime.now()
+        session.commit()
+        return sms
+
+
 @router.get("/sms/not-send", response_model=list[SMSResponse])
 async def list_not_sent(
     current_user: User = Depends(deps.get_current_user),
@@ -112,7 +126,5 @@ async def list_future_sms(
     session: Session = Depends(deps.get_session),
 ):
     """List sms that should be sent in the future"""
-    results = session.execute(
-        select(Sms).where(Sms.sending_time > datetime.datetime.now())
-    )
+    results = session.execute(select(Sms).where(Sms.sending_time > datetime.datetime.now()))
     return results.scalars().all()

+ 0 - 9
app/schemas/responses.py

@@ -24,15 +24,6 @@ class UserResponse(BaseResponse):
     email: EmailStr
 
 
-class SmsResponse(BaseResponse):
-    id: str
-    created_at: datetime
-    updated_at: datetime
-    phone_number: str
-    sending_time: datetime
-    send_time: datetime
-
-
 class VolunteerResponse(BaseResponse):
     id: str
     created_at: datetime

+ 4 - 0
script/.env.example

@@ -0,0 +1,4 @@
+API_URL = "https://bdlg-planner.jaquin.fr/api"
+API_LOGIN = "cj@example.com"
+API_PASSWORD = "pwd"
+DEVICE_NAME = "phone name"

+ 8 - 0
script/run.sh

@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -a
+source .env
+set +a
+
+cd ..
+python3 send_sms.py

+ 46 - 4
script/send_sms.py

@@ -1,10 +1,52 @@
+import os
 import requests
 from KdeConnect import KDEConnect
-from app.main import app
 
+from app.schemas.responses import AccessTokenResponse, SMSResponse
 
-# toDO log in to API get access token
 
-# TODO extract sms
+def send_sms_from_api(url: str, login: str, pwd: str, device_name: str):
+    """Connect to sms-server API to retreieve sms to be send and send them using kdeconnect-cli"""
+    # Log in to API get access token
+    response = requests.get(
+        url + "/auth/access-token",
+        data={"grant_type": "password", "username": login, "password": pwd},
+    )
+    authentication: AccessTokenResponse = response.json()
+    headers = {"Authorization": "Bearer " + authentication.access_token}
 
-# TODO send smsm & update api
+    # List SMS to be send
+    response = requests.get(url + "/sms/to-send", headers=headers)
+    sms_list: list[SMSResponse] = response.json()
+
+    # Init KDE Connect
+    kde = KDEConnect(device_name=device_name)
+
+    # send sms & update api
+    for sms in sms_list:
+        kde.send_sms(sms.phone_number, sms.content)
+        requests.get(url + "/sms/sent-now/" + sms.id, headers=headers)
+
+
+class InvalidEnvironnementVariable(Exception):
+    pass
+
+
+def get_env(key: str) -> str:
+    """Get a variable from the environnement or raise an InvalidEnvironnementVariable"""
+    value = os.environ.get(key)
+    if value is None:
+        raise InvalidEnvironnementVariable(key)
+    return value
+
+
+def main():
+    API_URL = get_env("API_URL")
+    API_LOGIN = get_env("API_LOGIN")
+    API_PASSWORD = get_env("API_PASSWORD")
+    DEVICE_NAME = get_env("DEVICE_NAME")
+    send_sms_from_api(API_URL, API_LOGIN, API_PASSWORD, DEVICE_NAME)
+
+
+if __name__ == "__main__":
+    main()