


class OrderView(ViewSetMixin):# core methods/etcdef shipping_total(self):# do core stuffif self.client == 'client1':# do client1 stuffelif self.client == 'client2':# do client2 stuff
/order
class OrderView(ViewSetMixin):# core methods/etcdef shipping_total(self):# do core stufftry:# import client module# do client stuffexcept:# nevermind# more core stuff

class OrderView(ViewSetMixin): # core methods/etcdef shipping_total(self):# core stuff
from core import OrderView as CoreOrderViewclass OrderView(CoreOrderView):def shipping_total(self):# custom code# super available - if necessary
class WebServicefrom core.service import WebService as CoreWebService
class WebService(CoreWebService)class Meta:
saas_url_param = 'merchant_slug'
saas_lookup_field = 'slug'
'SAAS': {'MODEL': 'merchant.models.Merchant', 'MODULE': 'customizations' }
/web/service
/client1/web/service
/client2/web/service
class ViewSetMixin(object):...def as_view(cls, actions=None, **initkwargs):...def get_cls(...):# determine clsreturn clsdef view(request, *args, **kwargs):...cls = get_cls(...)self = cls(**initkwargs)return self.dispatch(request, *args, **kwargs)return view
project
├── customizations
│ └──client
│ └── app
│ └── subpackage
│ └── module.py
└── app
└── subpackage
└── module.py
class ViewSetMixin(object):...def as_view(cls, actions=None, **initkwargs):...def get_cls(...):- use value of saas_url_parameter, if available, to lookup merchant record via saas_lookup_field - try importing class from merchant path- if found, cls = merchant class- otherwise, use core classreturn clsdef view(request, *args, **kwargs): # initialize ViewSetreturn view
drf_saasy_demo
├── customizations
│ └── tiny-client
│ └── product
│ └── views.py
└── product
└── views.py