updated gcal coupling
This commit is contained in:
BIN
blechreiz/calendarCredentials.dat
Normal file
BIN
blechreiz/calendarCredentials.dat
Normal file
Binary file not shown.
@@ -308,9 +308,7 @@ def delete_all_gcal_events(service=None):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
# Use batch request for efficiency
|
# Use batch request for efficiency
|
||||||
from googleapiclient.http import BatchHttpRequest
|
batch = service.new_batch_http_request()
|
||||||
|
|
||||||
batch = BatchHttpRequest()
|
|
||||||
for gcal_id in gcal_ids:
|
for gcal_id in gcal_ids:
|
||||||
batch.add(service.events().delete(calendarId="primary", eventId=gcal_id))
|
batch.add(service.events().delete(calendarId="primary", eventId=gcal_id))
|
||||||
|
|
||||||
@@ -359,9 +357,7 @@ def sync_from_local_to_google(service=None):
|
|||||||
events_to_create_django_id = local_events_django_id - events_at_google_django_id
|
events_to_create_django_id = local_events_django_id - events_at_google_django_id
|
||||||
events_to_delete_google_id = events_at_google_google_id - local_events_google_id
|
events_to_delete_google_id = events_at_google_google_id - local_events_google_id
|
||||||
|
|
||||||
from googleapiclient.http import BatchHttpRequest
|
batch = service.new_batch_http_request()
|
||||||
|
|
||||||
batch = BatchHttpRequest()
|
|
||||||
batch_is_empty = True
|
batch_is_empty = True
|
||||||
|
|
||||||
for event_django_id in events_to_create_django_id:
|
for event_django_id in events_to_create_django_id:
|
||||||
|
|||||||
80
eventplanner_gcal/management/commands/gcal_setup.py
Normal file
80
eventplanner_gcal/management/commands/gcal_setup.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
"""
|
||||||
|
One-time OAuth2 setup command for Google Calendar integration.
|
||||||
|
|
||||||
|
Run this locally (not in Docker) to authorize the app and generate
|
||||||
|
the credentials token file (calendarCredentials.dat).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python manage.py gcal_setup --client-secrets /path/to/client_secret_*.json
|
||||||
|
|
||||||
|
The command opens a browser for the OAuth2 consent flow, then saves
|
||||||
|
the access+refresh token to the path configured in settings.GCAL_COUPLING['credentials_file'].
|
||||||
|
Copy that file to the server afterwards.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
|
||||||
|
SCOPES = ["https://www.googleapis.com/auth/calendar"]
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = (
|
||||||
|
"Perform one-time OAuth2 authorization for Google Calendar. "
|
||||||
|
"Run locally, then copy the resulting credentials file to the server."
|
||||||
|
)
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument(
|
||||||
|
"--client-secrets",
|
||||||
|
required=True,
|
||||||
|
metavar="FILE",
|
||||||
|
help="Path to the client_secret_*.json downloaded from Google Cloud Console",
|
||||||
|
)
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
try:
|
||||||
|
from google_auth_oauthlib.flow import InstalledAppFlow
|
||||||
|
except ImportError:
|
||||||
|
raise CommandError(
|
||||||
|
"google-auth-oauthlib is not installed. "
|
||||||
|
"Run: pip install google-auth-oauthlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
client_secrets = options["client_secrets"]
|
||||||
|
if not os.path.exists(client_secrets):
|
||||||
|
raise CommandError(f"Client secrets file not found: {client_secrets}")
|
||||||
|
|
||||||
|
credentials_file = settings.GCAL_COUPLING["credentials_file"]
|
||||||
|
|
||||||
|
self.stdout.write(
|
||||||
|
"Starting OAuth2 flow. A browser window will open for authorization."
|
||||||
|
)
|
||||||
|
self.stdout.write(
|
||||||
|
"Make sure you are authorizing with the Google account whose "
|
||||||
|
"calendar you want to use.\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
flow = InstalledAppFlow.from_client_secrets_file(client_secrets, SCOPES)
|
||||||
|
creds = flow.run_local_server(port=0)
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(credentials_file), exist_ok=True) if os.path.dirname(credentials_file) else None
|
||||||
|
|
||||||
|
with open(credentials_file, "wb") as token:
|
||||||
|
pickle.dump(creds, token)
|
||||||
|
|
||||||
|
self.stdout.write(
|
||||||
|
self.style.SUCCESS(
|
||||||
|
f"Credentials saved to: {credentials_file}\n"
|
||||||
|
f"Copy this file to the server at the same path inside the container."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.stdout.write(
|
||||||
|
"\nTo copy to server (adjust paths as needed):\n"
|
||||||
|
f" docker cp {credentials_file} blechreiz:/app/calendarCredentials.dat\n"
|
||||||
|
"Or via scp:\n"
|
||||||
|
f" scp {credentials_file} core@server.fritz.box:/docker/blechreiz-website/calendarCredentials.dat"
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user