Files
AdventureLog/backend/server/billing/migrations/0001_initial.py
Sean Morley 59a103ea8c Cloud (#1170)
* Add new default light and dark themes to match AdventureLog styles

* Allow different theme for site and maps
Fixes #1130

* Update settings page to use translation keys for currency and map style descriptions

* Add global flag to CollectionItineraryItemSerializer and implement map view persistence in frontend

* Update appVersion to v0.12.0-main-052126

* Enhance permissions for shared collections and restrict publicity changes to owners only

* Update appVersion to v0.12.1-beta-052126

* Add new localization strings and descriptions for various languages

- Updated Spanish (es.json) with new map style and preferred currency descriptions.
- Enhanced French (fr.json) with additional details for Strava activities and currency descriptions.
- Added new strings in Hungarian (hu.json) for map style and preferred currency.
- Included additional details in Italian (it.json) for Strava activities and currency descriptions.
- Updated Japanese (ja.json) with new strings for map style and preferred currency.
- Enhanced Korean (ko.json) with additional details for Strava activities and currency descriptions.
- Added new strings in Dutch (nl.json) for map style and preferred currency.
- Updated Norwegian (no.json) with new strings for map style and preferred currency.
- Enhanced Polish (pl.json) with additional details for Strava activities and currency descriptions.
- Updated Brazilian Portuguese (pt-br.json) with new map style and preferred currency descriptions.
- Added new strings in Romanian (ro.json) for additional details and currency descriptions.
- Enhanced Russian (ru.json) with new strings for map style and preferred currency.
- Updated Slovak (sk.json) with additional details for map style and preferred currency.
- Enhanced Swedish (sv.json) with new strings for map style and preferred currency.
- Added new strings in Turkish (tr.json) for map style and preferred currency.
- Updated Ukrainian (uk.json) with new strings for map style and preferred currency.
- Enhanced Chinese (zh.json) with additional details for map style and preferred currency.

* feat: Implement cloud billing system with subscription management

- Added billing app with models, serializers, views, and admin configuration for Subscription.
- Integrated Stripe for payment processing and subscription management.
- Created middleware for cloud access control based on user subscriptions.
- Developed frontend components for subscription status and billing management.
- Updated settings to include cloud mode and Stripe configuration.
- Added routes for billing and subscription management in the API.
- Implemented user subscription creation and management on user registration and checkout.

* feat: Implement media storage limit and usage tracking

- Added media storage limit configuration in settings.
- Introduced utility functions for managing media storage limits and usage.
- Updated models to delete media files using storage backend.
- Enhanced serializers to build media URLs dynamically.
- Implemented media usage tracking in user views and added endpoint for fetching media usage.
- Updated frontend to display media storage usage and limits.
- Added translations for media storage related strings in multiple languages.

* feat: Implement conditional throttling for various external services and update settings for rate limits
2026-05-30 11:02:44 -04:00

74 lines
2.7 KiB
Python

from datetime import timedelta
from django.conf import settings
from django.db import migrations, models
from django.utils import timezone
import django.db.models.deletion
def create_subscriptions(apps, schema_editor):
user_model_label, user_model_name = settings.AUTH_USER_MODEL.split(".")
User = apps.get_model(user_model_label, user_model_name)
Subscription = apps.get_model("billing", "Subscription")
if getattr(settings, "CLOUD_MODE", False):
trial_ends_at = timezone.now() + timedelta(days=getattr(settings, "CLOUD_TRIAL_DAYS", 30))
defaults = {
"status": "trial",
"trial_ends_at": trial_ends_at,
}
else:
defaults = {"status": "active", "trial_ends_at": None}
for user in User.objects.all():
Subscription.objects.get_or_create(user=user, defaults=defaults)
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Subscription",
fields=[
("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("stripe_customer_id", models.CharField(blank=True, max_length=255)),
("stripe_subscription_id", models.CharField(blank=True, max_length=255)),
(
"status",
models.CharField(
choices=[
("trial", "Trial"),
("active", "Active"),
("canceled", "Canceled"),
("past_due", "Past Due"),
],
default="trial",
max_length=50,
),
),
("trial_ends_at", models.DateTimeField(blank=True, null=True)),
("current_period_ends_at", models.DateTimeField(blank=True, null=True)),
("cancel_at_period_end", models.BooleanField(default=False)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="subscription",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"ordering": ["-created_at"],
},
),
migrations.RunPython(create_subscriptions, migrations.RunPython.noop),
]