$30 off During Our Annual Pro Sale. View Details »

Look Behind the Curtain

Look Behind the Curtain

A Python Zagreb meetup talk about why we should not be afraid of poking into someone else's code.

Senko Rašić

November 14, 2017
Tweet

More Decks by Senko Rašić

Other Decks in Programming

Transcript

  1. Look behind the curtain
    Senko Rašić

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. “When the getDVRConversions is set to True
    it expires conversions automatically.”
    —paid support
    Proprietary software

    View Slide

  6. Open Source

    View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. Sign in with Google *

    *authorized users only

    View Slide

  15. from allauth.socialaccount.adapter import \

    DefaultSocialAccountAdapter
    class MyAdapter(DefaultSocialAccountAdapter):
    def is_open_for_signup(self, request):
    return False

    View Slide

  16. from allauth.socialaccount.adapter import \

    DefaultSocialAccountAdapter
    class MyAdapter(DefaultSocialAccountAdapter):
    def is_open_for_signup(self, req, sociallogin):
    return False

    View Slide


  17. from allauth.socialaccount.adapter import \

    DefaultSocialAccountAdapter
    class MyAdapter(DefaultSocialAccountAdapter):
    def is_open_for_signup(self, req, sociallogin):
    return False

    View Slide

  18. Django Developer Tragedies
    AllAuth won’t log in without SocialAccount,
    but won’t create SocialAccount without signup.

    View Slide

  19. We need to go deeper

    View Slide

  20. allauth.socialaccount.views.SignupView

    View Slide

  21. a.sa.providers.google.views.oauth2_login
    a.sa.providers.oauth2.views.OAuth2LoginView


    a.sa.providers.google.views.oauth2_callback
    a.sa.providers.oauth2.views.OAuth2CallbackView

    allauth.socialaccount.views.SignupView

    View Slide

  22. class OAuth2CallbackView(OAuth2View):
    def dispatch(self, request):

    login = self.adapter.complete_login(…)

    return complete_social_login(request, login)

    # allauth.socialaccount.helpers
    def _complete_social_login(req, sociallogin):

    if sociallogin.is_existing:

    else:
    ret = _process_signup(req, sociallogin)

    # allauth.socialaccount.models
    class SocialLogin(object):
    @property
    def is_existing(self):
    return self.account.pk

    View Slide

  23. View Slide

  24. # a.sa.provider.google.views
    class GoogleOAuth2Adapter(OAuth2Adapter):
    def complete_login(…):

    login = self.get_provider(). \
    sociallogin_from_response(…)

    # a.sa.providers.base
    class Provider(object):
    def sociallogin_from_response(…):

    sociallogin.user = adapter.new_user(req, sociallogin)



    View Slide

  25. View Slide


  26. # allauth.socialaccount.models
    class SocialLogin(object):
    @property
    def is_existing(self):
    return self.account.pk

    View Slide

  27. View Slide

  28. View Slide

  29. # allauth.socialaccount.helpers
    def complete_social_login(request, sociallogin):
    assert not sociallogin.is_existing

    View Slide

  30. View Slide

  31. View Slide

  32. 千⾥里里之⾏行行,始於⾜足下
    Debugging of
    thousand lines
    starts with a single step

    View Slide

  33. Thank you!
    @senkorasic

    View Slide