text: from django.conf import settings
  
  from authentication.socialaccount.providers.base import ProviderAccount
  from authentication.socialaccount.providers.oauth2.provider import OAuth2Provider
  
  
  class ShopifyAccount(ProviderAccount):
      pass
  
  
  class ShopifyProvider(OAuth2Provider):
      id = 'shopify'
      name = 'Shopify'
      account_class = ShopifyAccount
  
      @property
      def is_per_user(self):
          grant_options = getattr(settings, 'SOCIALACCOUNT_PROVIDERS', {}).get(
              'shopify', {}).get('AUTH_PARAMS', {}).get('grant_options[]', '')
          return grant_options.lower().strip() == 'per-user'
  
      def get_auth_params(self, request, action):
          ret = super(ShopifyProvider, self).get_auth_params(request, action)
          shop = request.GET.get('shop', None)
          if shop:
              ret.update({'shop': shop})
          return ret
  
      def get_default_scope(self):
          return ['read_orders', 'read_products']
  
      def extract_uid(self, data):
          if self.is_per_user:
              return str(data['associated_user']['id'])
          else:
              return str(data['shop']['id'])
  
      def extract_common_fields(self, data):
          if self.is_per_user:
              return dict(
                  email=data['associated_user']['email'],
                  first_name=data['associated_user']['first_name'],
                  last_name=data['associated_user']['last_name'],
              )
          else:
              # See: https://docs.shopify.com/api/shop
              # Without online mode, User is only available with Shopify Plus,
              # email is the only common field
              return dict(email=data['shop']['email'])
  
  
  provider_classes = [ShopifyProvider]
  