Esempio n. 1
0
    def send(self, graph=None, shared_explicitly=False):
        result = None
        # update the last attempt
        self.last_attempt = datetime.now()
        self.save()

        # see if the graph is enabled
        profile = try_get_profile(self.user)
        user_or_profile = get_instance_for_attribute(
            self.user, profile, 'access_token')
        graph = graph or user_or_profile.get_offline_graph()
        user_enabled = shared_explicitly or \
            (user_or_profile.facebook_open_graph and self.facebook_user_id)
        # start sharing
        if graph and user_enabled:
            graph_location = '%s/%s' % (
                self.facebook_user_id, self.action_domain)
            share_dict = self.get_share_dict()
            from open_facebook.exceptions import OpenFacebookException
            try:
                result = graph.set(graph_location, **share_dict)
                share_id = result.get('id')
                if not share_id:
                    error_message = 'No id in Facebook response, found %s for url %s with data %s' % (
                        result, graph_location, share_dict)
                    logging.error(error_message)
                    raise OpenFacebookException(error_message)
                self.share_id = share_id
                self.error_message = None
                self.completed_at = datetime.now()
                self.save()
            except OpenFacebookException as e:
                logging.warn(
                    'Open graph share failed, writing message %s' % str(e))
                self.error_message = repr(e)
                self.save()
                # maybe we need a new access token
                new_token_required = self.exception_requires_new_token(
                    e, graph)
                # verify that the token didnt change in the mean time
                user_or_profile = user_or_profile.__class__.objects.get(
                    id=user_or_profile.id)
                token_changed = graph.access_token != user_or_profile.access_token
                logging.info('new token required is %s and token_changed is %s',
                             new_token_required, token_changed)
                if new_token_required and not token_changed:
                    logging.info(
                        'a new token is required, setting the flag on the user or profile')
                    # time to ask the user for a new token
                    update_user_attributes(self.user, profile, dict(
                        new_token_required=True), save=True)

        elif not graph:
            self.error_message = 'no graph available'
            self.save()
        elif not user_enabled:
            self.error_message = 'user not enabled'
            self.save()

        return result
Esempio n. 2
0
    def send(self, graph=None):
        result = None
        #update the last attempt
        self.last_attempt = datetime.now()
        self.save()

        #see if the graph is enabled
        profile = self.user.get_profile()
        graph = graph or profile.get_offline_graph()
        user_enabled = profile.facebook_open_graph and self.facebook_user_id

        #start sharing
        if graph and user_enabled:
            graph_location = '%s/%s' % (self.facebook_user_id,
                                        self.action_domain)
            share_dict = self.get_share_dict()
            from open_facebook.exceptions import OpenFacebookException
            try:
                result = graph.set(graph_location, **share_dict)
                share_id = result.get('id')
                if not share_id:
                    error_message = 'No id in Facebook response, found %s for url %s with data %s' % (
                        result, graph_location, share_dict)
                    logger.error(error_message)
                    raise OpenFacebookException(error_message)
                self.share_id = share_id
                self.error_message = None
                self.completed_at = datetime.now()
                self.save()
            except OpenFacebookException, e:
                logger.warn('Open graph share failed, writing message %s' %
                            e.message)
                self.error_message = unicode(e)
                self.save()
Esempio n. 3
0
    def send(self, graph=None):
        result = None
        #update the last attempt
        self.last_attempt = datetime.now()
        self.save()

        #see if the graph is enabled
        profile = self.user.get_profile()
        graph = graph or profile.get_offline_graph()
        user_enabled = profile.facebook_open_graph and self.facebook_user_id

        #start sharing
        if graph and user_enabled:
            graph_location = '%s/%s' % (
                self.facebook_user_id, self.action_domain)
            share_dict = self.get_share_dict()
            from open_facebook.exceptions import OpenFacebookException
            try:
                result = graph.set(graph_location, **share_dict)
                share_id = result.get('id')
                if not share_id:
                    error_message = 'No id in Facebook response, found %s for url %s with data %s' % (result, graph_location, share_dict)
                    logger.error(error_message)
                    raise OpenFacebookException(error_message)
                self.share_id = share_id
                self.error_message = None
                self.completed_at = datetime.now()
                self.save()
            except OpenFacebookException, e:
                logger.warn(
                    'Open graph share failed, writing message %s' % e.message)
                self.error_message = unicode(e)
                self.save()
Esempio n. 4
0
    def send(self, graph=None, shared_explicitly=False):
        result = None
        # update the last attempt
        self.last_attempt = datetime.now()
        self.save()

        # see if the graph is enabled
        profile = try_get_profile(self.user)
        user_or_profile = get_instance_for_attribute(
            self.user, profile, 'access_token')
        graph = graph or user_or_profile.get_offline_graph()
        user_enabled = shared_explicitly or \
            (user_or_profile.facebook_open_graph and self.facebook_user_id)
        # start sharing
        if graph and user_enabled:
            graph_location = '%s/%s' % (
                self.facebook_user_id, self.action_domain)
            share_dict = self.get_share_dict()
            from open_facebook.exceptions import OpenFacebookException
            try:
                result = graph.set(graph_location, **share_dict)
                share_id = result.get('id')
                if not share_id:
                    error_message = 'No id in Facebook response, found %s for url %s with data %s' % (
                        result, graph_location, share_dict)
                    logger.error(error_message)
                    raise OpenFacebookException(error_message)
                self.share_id = share_id
                self.error_message = None
                self.completed_at = datetime.now()
                self.save()
            except OpenFacebookException as e:
                logger.warn(
                    'Open graph share failed, writing message %s' % str(e))
                self.error_message = repr(e)
                self.save()
                # maybe we need a new access token
                new_token_required = self.exception_requires_new_token(
                    e, graph)
                # verify that the token didnt change in the mean time
                user_or_profile = user_or_profile.__class__.objects.get(
                    id=user_or_profile.id)
                token_changed = graph.access_token != user_or_profile.access_token
                logger.info('new token required is %s and token_changed is %s',
                            new_token_required, token_changed)
                if new_token_required and not token_changed:
                    logger.info(
                        'a new token is required, setting the flag on the user or profile')
                    # time to ask the user for a new token
                    update_user_attributes(self.user, profile, dict(
                        new_token_required=True), save=True)

        elif not graph:
            self.error_message = 'no graph available'
            self.save()
        elif not user_enabled:
            self.error_message = 'user not enabled'
            self.save()

        return result
Esempio n. 5
0
 def recently_failed(self):
     from django_facebook import settings as facebook_settings
     now = datetime.now()
     recent_delta = timedelta(
         days=facebook_settings.FACEBOOK_OG_SHARE_RETRY_DAYS)
     recent = now - recent_delta
     failed = self.failed()
     recently_failed = failed.filter(created_at__gte=recent)
     return recently_failed
Esempio n. 6
0
 def recently_failed(self):
     from django_facebook import settings as facebook_settings
     now = datetime.now()
     recent_delta = timedelta(
         days=facebook_settings.FACEBOOK_OG_SHARE_RETRY_DAYS)
     recent = now - recent_delta
     failed = self.failed()
     recently_failed = failed.filter(created_at__gte=recent)
     return recently_failed
Esempio n. 7
0
def post_on_profile(user, fb, facebook_id, invite_message, force_class=None, force_send=False, raise_=False):
    '''
    Utility function for posting on a users profile.
    Stores the invite in a FacebookInvite model so we can
    - get statistics
    - retry later if the invite failed
    '''
    facebook_classes = [BaseFacebookInvite]
    class_dict = dict([(f.type, f) for f in facebook_classes])
    from django_facebook.models import FacebookInvite
    wallpost_id = None

    try:
        fb_invite, created = FacebookInvite.objects.get_or_create(
            user=user, user_invited=facebook_id, defaults=dict(message=invite_message))
        fb_invite.last_attempt = datetime.now()
        modulo = fb_invite.id % len(facebook_classes)
        message_class = facebook_classes[modulo]
        if force_class:
            message_class = class_dict[force_class]

        if created or force_send:
            # set a different type per style of the message and add custom if
            # there is a custom invite message
            fb_invite.type = message_class.get_type(invite_message)
            fb_invite.save()
            message_instance = message_class()
            wallpost_response = message_instance.set_message(
                user, fb, facebook_id, invite_message)
            wallpost_id = wallpost_response.get('id')
            logger.info(
                'wrote message %s to user %s', invite_message, facebook_id)
            fb_invite.error = False
            fb_invite.error_message = None
            fb_invite.save()
        else:
            logger.info(
                'we are not sending email at the moment cause the invite already existed')
    except facebook_exceptions.OpenFacebookException as e:
        logger.warn(str(e), exc_info=sys.exc_info(), extra={
            'data': {
                'user': user,
                'message': invite_message,
                'facebook_user': facebook_id,
                'body': str(e),
            }
        })
        fb_invite.error = True
        fb_invite.error_message = str(e)
        fb_invite.save()
        if raise_:
            raise

    fb_invite.wallpost_id = wallpost_id
    fb_invite.save()

    return fb_invite
Esempio n. 8
0
    def remove(self, graph=None):
        if not self.share_id:
            raise ValueError('Can only delete shares which have an id')
        #see if the graph is enabled
        profile = self.user.get_profile()
        graph = graph or profile.get_offline_graph()

        response = graph.delete(self.share_id)
        self.removed_at = datetime.now()
        self.save()
Esempio n. 9
0
 def remove(self, graph=None):
     if not self.share_id:
         raise ValueError('Can only delete shares which have an id')
     # see if the graph is enabled
     profile = try_get_profile(self.user)
     graph = graph or profile.get_offline_graph()
     response = None
     if graph:
         response = graph.delete(self.share_id)
         self.removed_at = datetime.now()
         self.save()
     return response
Esempio n. 10
0
    def remove(self, graph=None):
        if not self.share_id:
            raise ValueError('Can only delete shares which have an id')
        # see if the graph is enabled
        profile = try_get_profile(self.user)
        user_or_profile = get_instance_for_attribute(
            self.user, profile, 'access_token')
        graph = graph or user_or_profile.get_offline_graph()

        response = None
        if graph:
            response = graph.delete(self.share_id)
            self.removed_at = datetime.now()
            self.save()
        return response
Esempio n. 11
0
def post_on_profile(user,
                    fb,
                    facebook_id,
                    invite_message,
                    force_class=None,
                    force_send=False,
                    raise_=False):
    '''
    Utility function for posting on a users profile.
    Stores the invite in a FacebookInvite model so we can
    - get statistics
    - retry later if the invite failed
    '''
    facebook_classes = [BaseFacebookInvite]
    class_dict = dict([(f.type, f) for f in facebook_classes])
    from django_facebook.models import FacebookInvite
    wallpost_id = None

    try:
        fb_invite, created = FacebookInvite.objects.get_or_create(
            user=user,
            user_invited=facebook_id,
            defaults=dict(message=invite_message))
        fb_invite.last_attempt = datetime.now()
        modulo = fb_invite.id % len(facebook_classes)
        message_class = facebook_classes[modulo]
        if force_class:
            message_class = class_dict[force_class]

        if created or force_send:
            # set a different type per style of the message and add custom if
            # there is a custom invite message
            fb_invite.type = message_class.get_type(invite_message)
            fb_invite.save()
            message_instance = message_class()
            wallpost_response = message_instance.set_message(
                user, fb, facebook_id, invite_message)
            wallpost_id = wallpost_response.get('id')
            logger.info('wrote message %s to user %s', invite_message,
                        facebook_id)
            fb_invite.error = False
            fb_invite.error_message = None
            fb_invite.save()
        else:
            logger.info(
                'we are not sending email at the moment cause the invite already existed'
            )
    except facebook_exceptions.OpenFacebookException, e:
        logger.warn(unicode(e),
                    exc_info=sys.exc_info(),
                    extra={
                        'data': {
                            'user': user,
                            'message': invite_message,
                            'facebook_user': facebook_id,
                            'body': unicode(e),
                        }
                    })
        fb_invite.error = True
        fb_invite.error_message = unicode(e)
        fb_invite.save()
        if raise_:
            raise