Files
AdventureLog/backend/server/integrations/models.py
Sean Morley 2aa09dc999 Add Endurain integration support and related features
- Introduced the Endurain integration, allowing users to connect their self-hosted Endurain instance for activity browsing and GPX import.
- Added `EndurainIntegration` model, serializer, and viewset to manage user connections and activities.
- Implemented MFA support for Endurain login, including token handling and validation.
- Enhanced activity handling in `ActivityViewSet` to prioritize user-provided elevation data over GPX-derived values.
- Updated environment configuration and documentation to include Endurain integration details.
- Added tests for Endurain services and integration functionality to ensure reliability and correctness.
- Improved throttling for Endurain authentication to enhance security and performance.
2026-07-19 18:31:20 -04:00

67 lines
2.7 KiB
Python

from django.db import models
from django.contrib.auth import get_user_model
import uuid
User = get_user_model()
class ImmichIntegration(models.Model):
server_url = models.CharField(max_length=255)
api_key = models.CharField(max_length=255)
user = models.ForeignKey(
User, on_delete=models.CASCADE)
copy_locally = models.BooleanField(default=True, help_text="Copy image to local storage, instead of just linking to the remote URL.")
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
def __str__(self):
return self.user.username + ' - ' + self.server_url
class StravaToken(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='strava_tokens')
access_token = models.CharField(max_length=255)
refresh_token = models.CharField(max_length=255)
expires_at = models.BigIntegerField() # Unix timestamp
athlete_id = models.BigIntegerField(null=True, blank=True)
scope = models.CharField(max_length=255, null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
class WandererIntegration(models.Model):
server_url = models.CharField(max_length=255)
api_key = models.CharField(max_length=512)
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='wanderer_integrations')
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
def __str__(self):
return self.user.username + ' - ' + self.server_url
class Meta:
verbose_name = "Wanderer Integration"
verbose_name_plural = "Wanderer Integrations"
class EndurainIntegration(models.Model):
AUTH_PASSWORD = 'password'
AUTH_METHOD_CHOICES = [
(AUTH_PASSWORD, 'Password'),
]
server_url = models.CharField(max_length=255)
access_token = models.CharField(max_length=2048)
refresh_token = models.CharField(max_length=2048)
access_token_expires_at = models.BigIntegerField()
refresh_token_expires_at = models.BigIntegerField(null=True, blank=True)
endurain_user_id = models.BigIntegerField()
username = models.CharField(max_length=255, blank=True, default='')
auth_method = models.CharField(max_length=16, choices=AUTH_METHOD_CHOICES, default=AUTH_PASSWORD)
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='endurain_integrations')
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f'{self.user.username} - {self.server_url}'
class Meta:
verbose_name = 'Endurain Integration'
verbose_name_plural = 'Endurain Integrations'