Permalink
Browse files

Merge pull request #637 from serdardalgic/use_case_doc_for_combining_…

…two_functions_in_the_pipeline

Use case doc for combining two functions in the pipeline
  • Loading branch information...
2 parents 45f629b + 26848c8 commit 0d2a26d00e4e5ea9cac1c3a6c82bab3e7313b71e @omab committed Mar 18, 2013
Showing with 43 additions and 0 deletions.
  1. +43 −0 doc/use_cases.rst
View
@@ -71,3 +71,46 @@ At the moment just a few backends were tested against token refreshing
(Google OAuth2, Facebook and Stripe). Other backends probably also support
it (if they follow the OAuth2 standard) with the default mechanism. Others
don't support it because the token is not supposed to expire.
+
+
+Combining associate_user and load_extra_data functions in the pipeline
+----------------------------------------------------------------------
+
+Two functions under backends.pipeline.social module, ``associate_user`` and
+``load_extra_data`` are commonly used back to back in the ``SOCIAL_AUTH_PIPELINE``.
+Both of these modules hit the database for associating the social_user and
+loading extra data for this social_user. If you want to combine these two functions
+in order to decrease number of database visits, you can use this function::
+
+ def social_associate_and_load_data(backend, details, response, uid, user,
+ social_user=None, *args, **kwargs):
+ """
+ The combination of associate_user and load_extra_data functions
+ of django-social-auth. The reason for combining these two pipeline
+ functions is decreasing the number of database visits.
+ """
+ if not social_user and user:
+ try:
+ social_user = UserSocialAuth.create_social_auth(user,
+ uid,
+ backend.name)
+ except Exception, e:
+ if not SOCIAL_AUTH_MODELS_MODULE.is_integrity_error(e):
+ raise
+ # Protect for possible race condition, those bastard with FTL
+ # clicking capabilities, check issue #131:
+ # https://github.com/omab/django-social-auth/issues/131
+ social_data = social_auth_user(backend, uid, user,
+ social_user=social_user,
+ *args, **kwargs)
+ social_user = social_data['social_user']
+
+ extra_data = backend.extra_data(user, uid, response, details)
+ if extra_data and social_user.extra_data != extra_data:
+ if social_user.extra_data:
+ social_user.extra_data.update(extra_data)
+ else:
+ social_user.extra_data = extra_data
+ social_user.save()
+ return {'social_user': social_user}
+

0 comments on commit 0d2a26d

Please sign in to comment.