From 4ebfb25bdda4362ef44443a7b93ec8c96863177f Mon Sep 17 00:00:00 2001 From: William Durand Date: Wed, 4 Nov 2020 09:43:11 +0100 Subject: [PATCH] Implement Stripe Customer Portal (#15905) --- src/olympia/addons/models.py | 11 +++ .../devhub/includes/addons_edit_nav.html | 9 +++ src/olympia/devhub/tests/test_views_edit.py | 31 ++++++++ .../devhub/tests/test_views_subscription.py | 70 +++++++++++++++++-- src/olympia/devhub/urls.py | 3 + src/olympia/devhub/views.py | 31 ++++++++ src/olympia/promoted/tests/test_utils.py | 24 +++++++ src/olympia/promoted/utils.py | 12 ++++ static/css/impala/developers.less | 24 ++++++- 9 files changed, 208 insertions(+), 7 deletions(-) diff --git a/src/olympia/addons/models.py b/src/olympia/addons/models.py index 26acacf1c2..f4651cbb06 100644 --- a/src/olympia/addons/models.py +++ b/src/olympia/addons/models.py @@ -1330,6 +1330,17 @@ class Addon(OnChangeMixin, ModelBase): return PromotedTheme(addon=self, group_id=RECOMMENDED.id) return None + @property + def promoted_subscription(self): + """Returns a PromotedSubscription if it exists, None otherwise.""" + from olympia.promoted.models import PromotedAddon, PromotedSubscription + + try: + return self.promotedaddon.promotedsubscription + except (PromotedAddon.DoesNotExit, PromotedSubscription.DoesNotExist): + pass + return None + @cached_property def tags_partitioned_by_developer(self): """Returns a tuple of developer tags and user tags for this addon.""" diff --git a/src/olympia/devhub/templates/devhub/includes/addons_edit_nav.html b/src/olympia/devhub/templates/devhub/includes/addons_edit_nav.html index d39b19786b..a30a4f51cf 100644 --- a/src/olympia/devhub/templates/devhub/includes/addons_edit_nav.html +++ b/src/olympia/devhub/templates/devhub/includes/addons_edit_nav.html @@ -29,6 +29,15 @@
  • {{ title }}
  • {% endfor %} + + {% if addon.promoted_subscription and addon.promoted_subscription.stripe_checkout_completed %} +
  • +
    + {% csrf_token %} + +
    +
  • + {% endif %}