Add all 13 integration modules (Notion, Google Drive, Google Sheets, Airtable, Dropbox, OneDrive, MEGA, Nextcloud, Google Calendar, Apple Calendar/CalDAV, Slack, Discord, Home Assistant) with fields(), connect(), and test() implementations. Add config/integrations/*.yaml.example files and gitignore rules for live config files. Add 5 new registry/schema tests bringing total to 193 passing.
48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
from __future__ import annotations
|
|
from scripts.integrations.base import IntegrationBase
|
|
|
|
|
|
class NextcloudIntegration(IntegrationBase):
|
|
name = "nextcloud"
|
|
label = "Nextcloud"
|
|
tier = "free"
|
|
|
|
def __init__(self):
|
|
self._config: dict = {}
|
|
|
|
def fields(self) -> list[dict]:
|
|
return [
|
|
{"key": "host", "label": "Nextcloud URL", "type": "url",
|
|
"placeholder": "https://nextcloud.example.com", "required": True,
|
|
"help": "Your Nextcloud server URL"},
|
|
{"key": "username", "label": "Username", "type": "text",
|
|
"placeholder": "your-username", "required": True,
|
|
"help": ""},
|
|
{"key": "password", "label": "Password / App password", "type": "password",
|
|
"placeholder": "your-password", "required": True,
|
|
"help": "Recommend using a Nextcloud app password for security"},
|
|
{"key": "folder_path", "label": "Folder path", "type": "text",
|
|
"placeholder": "/Peregrine", "required": True,
|
|
"help": "Nextcloud WebDAV folder for resumes and cover letters"},
|
|
]
|
|
|
|
def connect(self, config: dict) -> bool:
|
|
self._config = config
|
|
return bool(config.get("host") and config.get("username") and config.get("password"))
|
|
|
|
def test(self) -> bool:
|
|
try:
|
|
import requests
|
|
host = self._config["host"].rstrip("/")
|
|
username = self._config["username"]
|
|
folder = self._config.get("folder_path", "")
|
|
dav_url = f"{host}/remote.php/dav/files/{username}{folder}"
|
|
r = requests.request(
|
|
"PROPFIND", dav_url,
|
|
auth=(username, self._config["password"]),
|
|
headers={"Depth": "0"},
|
|
timeout=8,
|
|
)
|
|
return r.status_code in (207, 200)
|
|
except Exception:
|
|
return False
|