def valid_activity_type(self, recipient, activity):
        if hasattr(activity, 'APP_VERSION'):
            last_version = recipient.kv.last_app_version.get()
            try:
                if not last_version or util.parse_version(last_version) < activity.APP_VERSION:
                    return False
            except ValueError:
                return False

        return activity.TYPE in self._activity_types
示例#2
0
    def valid_activity_type(self, recipient, activity):
        if hasattr(activity, 'APP_VERSION'):
            last_version = recipient.kv.last_app_version.get()
            try:
                if not last_version or util.parse_version(
                        last_version) < activity.APP_VERSION:
                    return False
            except ValueError:
                return False

        return activity.TYPE in self._activity_types
示例#3
0
    def for_user(cls, user):
        filter_query = Q(owned_by_default=True)

        if user.is_authenticated():
            filter_query |= Q(owners=user)

            try:
                version = parse_version(user.kv.signup_app_version.get())
            except ValueError:
                version = None

            if version is None or version <= (2, 0, 1) or user.date_joined <= datetime.datetime(2013, 9, 27, 12, 0, 0):
                filter_query |= Q(canonical_name="paintbrush")

        return cls.objects.filter(filter_query).distinct()
示例#4
0
    def for_user(cls, user):
        filter_query = Q(owned_by_default=True)

        if user.is_authenticated():
            filter_query |= Q(owners=user)

            try:
                version = parse_version(user.kv.signup_app_version.get())
            except ValueError:
                version = None

            if (version is None or version <= (2, 0, 1)
                    or user.date_joined <= datetime.datetime(
                        2013, 9, 27, 12, 0, 0)):
                filter_query |= Q(canonical_name='paintbrush')

        return cls.objects.filter(filter_query).distinct()
示例#5
0
def user(request, username_or_email):
    try:
        user = User.objects.get(username=username_or_email)
    except User.DoesNotExist:
        try:
            user = User.objects.get(email=username_or_email)
        except User.DoesNotExist:
            ui = get_object_or_404(UserInfo, username_hash=username_or_email)
            user = User.objects.get(id=ui.user_id)

    ugq = Quest.all_objects.filter(author=user, ugq=True)
    cmts = QuestComment.all_objects.filter(author=user)

    ctx = {
        'examined_user': user,
        'username_hash':
        hashlib.sha1(user.username.encode('utf8')).hexdigest(),
        'public_ugq': ugq.filter(visibility=Visibility.PUBLIC),
        'disabled_ugq': ugq.filter(visibility=Visibility.DISABLED),
        'curated_ugq': ugq.filter(visibility=Visibility.CURATED),
        'public_comments': cmts.filter(visibility=Visibility.PUBLIC),
        'disabled_comments': cmts.filter(visibility=Visibility.DISABLED),
        'curated_comments': cmts.filter(visibility=Visibility.CURATED),
        'last_app_version': user.kv.last_app_version.get(),
    }

    try:
        ctx['signup_app_version'] = parse_version(
            user.kv.signup_app_version.get())
    except ValueError:
        ctx['signup_app_version'] = None

    try:
        ctx['facebook_user'] = user.facebookuser
    except FacebookUser.DoesNotExist:
        ctx['facebook_user'] = None

    try:
        ctx['twitter_user'] = user.twitteruser
    except TwitterUser.DoesNotExist:
        ctx['twitter_user'] = None

    return r2r_jinja('staff/user.html', ctx, request)
示例#6
0
def user(request, username_or_email):
    try:
        user = User.objects.get(username=username_or_email)
    except User.DoesNotExist:
        try:
            user = User.objects.get(email=username_or_email)
        except User.DoesNotExist:
            ui = get_object_or_404(UserInfo, username_hash=username_or_email)
            user = User.objects.get(id=ui.user_id)

    ugq = Quest.all_objects.filter(author=user, ugq=True)
    cmts = QuestComment.all_objects.filter(author=user)

    ctx = {
        'examined_user': user,
        'username_hash': hashlib.sha1(user.username.encode('utf8')).hexdigest(),
        'public_ugq': ugq.filter(visibility=Visibility.PUBLIC),
        'disabled_ugq': ugq.filter(visibility=Visibility.DISABLED),
        'curated_ugq': ugq.filter(visibility=Visibility.CURATED),
        'public_comments': cmts.filter(visibility=Visibility.PUBLIC),
        'disabled_comments': cmts.filter(visibility=Visibility.DISABLED),
        'curated_comments': cmts.filter(visibility=Visibility.CURATED),
        'last_app_version': user.kv.last_app_version.get(),
    }

    try:
        ctx['signup_app_version'] = parse_version(user.kv.signup_app_version.get())
    except ValueError:
        ctx['signup_app_version'] = None

    try:
        ctx['facebook_user'] = user.facebookuser
    except FacebookUser.DoesNotExist:
        ctx['facebook_user'] = None

    try:
        ctx['twitter_user'] = user.twitteruser
    except TwitterUser.DoesNotExist:
        ctx['twitter_user'] = None

    return r2r_jinja('staff/user.html', ctx, request)
示例#7
0
def heavy_state_sync(user, app_version=None, app_version_tuple=None, tab_last_seen_timestamps={}):
    from drawquest.apps.brushes.models import Brush
    from drawquest.apps.palettes.models import user_palettes, Color

    twitter_keys = '{}@{}'.format(settings.TWITTER_APP_KEY , settings.TWITTER_APP_SECRET)
    twitter_keys = twitter_keys[-6:] + twitter_keys[:-6]
    twitter_keys = swapcase(twitter_keys)

    ret = {
        'realtime_sync': realtime_sync(user),
        'user_palettes': user_palettes(user),
        'current_quest': current_quest_details(),
        'onboarding_quest_id': knobs.ONBOARDING_QUEST_ID,
        'sync': twitter_keys,
        'tumblr_success_regex': '''<div style="margin-bottom:10px; font-size:40px; color:#777;">Done!</div>''',
        'rewards': {
            'amounts': knobs.REWARDS,
            'copy': {
                'quest_of_the_day': _("You drew the Quest of the Day"),
                'archived_quest':   _("You drew a Quest"),
                'first_quest':      _("Woo! Your first Quest ever!"),
                'streak_3':         _("Quest Streak: 3"),
                'streak_10':        _("Quest Streak: 10"),
                'streak_100':       _("Epic! 100 straight Quests"),
            },
            'iphone_copy': {
                'archived_quest': _("You drew a Quest"),
                'first_quest': _("Your first Quest!"),
                'quest_of_the_day': _("Quest of the Day!"),
                'streak_10': _("Bonus Streak"),
                'streak_100': _("Bonus Streak"),
                'streak_3': _("Bonus Streak"),
                'personal_share': _("Shared with Facebook"),
                'personal_twitter_share': _("Shared with Twitter"),
            },
        },
        'features': {
            'invite_from_facebook': True,
            'invite_from_twitter': True,
            'user_search': True,
            'urban_airship_registration_before_auth': True,
            'urban_airship_registration': True,
        },
        'logging': {
            'on': True,
            'authentication-controller': {
                'request-for-me': False,
            },
            'facebook-controller': {
                'open-active-session-with-read-permissions': False,
                'request-new-publish-permissions': False,
                'request-new-publish-permissions-cancelled': False,
                'request-new-read-permissions': False,
                'request-new-read-permissions-cancelled': False,
            },
            'facebook-friends-coordinator': {
                'present-requests-dialog': False,
                'request-my-friends': False,
            },
            'http-request': {
                'error-auth/login_with_facebook': {
                    'mute-error-codes': {
                        '403': True,
                    }
                },
                'error-auth/login_with_twitter': {
                    'mute-error-codes': {
                        '403': True,
                    }
                },
                'error-quests/gallery_for_comment': {
                    'mute-error-codes': {
                        '404': True,
                    }
                }
            },
            'private-api': {
                'failed-activity/iphone_activities': {
                    'mute-error-codes': {
                        '1005': True,
                    }
                }
            },
            'sharing-controller': {
                'present-feed-dialog': False,
                'present-share-dialog-with-link': False,
            },
            'shop-controller': {
                'add-payment': False,
                'brush-products-request': False,
                'coin-products-request': False,
            },
            'twitter-api-manager': {
                'step-1': False,
                'step-2': False,
            },
            'twitter-controller': {
                'request-data-cursored-user-ids': False,
                'request-data-send-dm': False,
                'request-data-unknown': False,
                'request-data-users-for-ids': False,
            },
        },
        #TODO use settings.LOCALES once that's ready
        'supported_languages': ['de', 'en', 'es', 'fr', 'ja', 'ko', 'nl', 'pt', 'ru', 'th', 'zh-Hant', 'zh-Hans'],
        'l10n_files_url': None,
        'user_colors': list(Color.for_user(user)),
        'user_brushes': list(Brush.for_user(user)),
        'global_brushes': list(Brush.for_global()),
        'comment_view_logging_interval': 10,
        'papertrail': {
            'host': 'logs.papertrailapp.com',
            'port': 27889,
            'disabled_logging_points': [],
        },
        'modals': {},
    }

    if app_version_tuple and app_version_tuple >= (3,):
        ret['appirater_url'] = 'itms-apps://itunes.apple.com/app/idAPP_ID'
    else:
        ret['appirater_url'] = 'itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APP_ID'

    try:
        ret['color_alert_version'] = int(redis.get('color_alert_version'))
    except TypeError:
        ret['color_alert_version'] = 0

    if user.is_authenticated():
        user_kv_items = user.kv.hgetall()
        user_kv_items = dict((key, val) for key, val in user_kv_items.items()
                             if key in [
                                 'saw_update_modal_for_version',
                                 'saw_share_web_profile_modal',
                                 'publish_to_facebook',
                                 'publish_to_twitter',
                             ])

        ret.update({
            'user_email': user.email,
            'user_profile': user_profile(user.username),
            'balance': economy.balance(user),
            'completed_quest_ids': completed_quest_ids(user),
            'web_profile_privacy': user.kv.web_profile_privacy.get(),
            'twitter_privacy': user.kv.twitter_privacy.get(),
            'facebook_privacy': user.kv.facebook_privacy.get(),
            'user_kv': user_kv_items,
            'reminders': {
                'invite': 1,
            },
        })

        if (app_version and parse_version(knobs.CURRENT_APP_VERSION) > parse_version(app_version)):
            saw_version = user_kv_items.get('saw_update_modal_for_version')
            if (saw_version is None
                    or parse_version(saw_version) < parse_version(knobs.CURRENT_APP_VERSION)):
                ret['modals']['show_update_modal_for_version'] = knobs.CURRENT_APP_VERSION
                ret['modals']['update_modal_type'] = 'alert'

        if not user_kv_items.get('saw_share_web_profile_modal'):
            ret['modals']['show_share_web_profile_modal'] = (user.date_joined <= (datetime.now() - td(days=2))
                                                             or user.comments.count() >= 3)

    ret['tab_badge_type'] = 'flag'
    if tab_last_seen_timestamps:
        ret['tab_badges'] = tab_badges(user, last_seen_timestamps=tab_last_seen_timestamps)

    return ret
示例#8
0
def heavy_state_sync(user,
                     app_version=None,
                     app_version_tuple=None,
                     tab_last_seen_timestamps={}):
    from drawquest.apps.brushes.models import Brush
    from drawquest.apps.palettes.models import user_palettes, Color

    twitter_keys = '{}@{}'.format(settings.TWITTER_APP_KEY,
                                  settings.TWITTER_APP_SECRET)
    twitter_keys = twitter_keys[-6:] + twitter_keys[:-6]
    twitter_keys = swapcase(twitter_keys)

    ret = {
        'realtime_sync':
        realtime_sync(user),
        'user_palettes':
        user_palettes(user),
        'current_quest':
        current_quest_details(),
        'onboarding_quest_id':
        knobs.ONBOARDING_QUEST_ID,
        'sync':
        twitter_keys,
        'tumblr_success_regex':
        '''<div style="margin-bottom:10px; font-size:40px; color:#777;">Done!</div>''',
        'rewards': {
            'amounts': knobs.REWARDS,
            'copy': {
                'quest_of_the_day': _("You drew the Quest of the Day"),
                'archived_quest': _("You drew a Quest"),
                'first_quest': _("Woo! Your first Quest ever!"),
                'streak_3': _("Quest Streak: 3"),
                'streak_10': _("Quest Streak: 10"),
                'streak_100': _("Epic! 100 straight Quests"),
            },
            'iphone_copy': {
                'archived_quest': _("You drew a Quest"),
                'first_quest': _("Your first Quest!"),
                'quest_of_the_day': _("Quest of the Day!"),
                'streak_10': _("Bonus Streak"),
                'streak_100': _("Bonus Streak"),
                'streak_3': _("Bonus Streak"),
                'personal_share': _("Shared with Facebook"),
                'personal_twitter_share': _("Shared with Twitter"),
            },
        },
        'features': {
            'invite_from_facebook': True,
            'invite_from_twitter': True,
            'user_search': True,
            'urban_airship_registration_before_auth': True,
            'urban_airship_registration': True,
        },
        'logging': {
            'on': True,
            'authentication-controller': {
                'request-for-me': False,
            },
            'facebook-controller': {
                'open-active-session-with-read-permissions': False,
                'request-new-publish-permissions': False,
                'request-new-publish-permissions-cancelled': False,
                'request-new-read-permissions': False,
                'request-new-read-permissions-cancelled': False,
            },
            'facebook-friends-coordinator': {
                'present-requests-dialog': False,
                'request-my-friends': False,
            },
            'http-request': {
                'error-auth/login_with_facebook': {
                    'mute-error-codes': {
                        '403': True,
                    }
                },
                'error-auth/login_with_twitter': {
                    'mute-error-codes': {
                        '403': True,
                    }
                },
                'error-quests/gallery_for_comment': {
                    'mute-error-codes': {
                        '404': True,
                    }
                }
            },
            'private-api': {
                'failed-activity/iphone_activities': {
                    'mute-error-codes': {
                        '1005': True,
                    }
                }
            },
            'sharing-controller': {
                'present-feed-dialog': False,
                'present-share-dialog-with-link': False,
            },
            'shop-controller': {
                'add-payment': False,
                'brush-products-request': False,
                'coin-products-request': False,
            },
            'twitter-api-manager': {
                'step-1': False,
                'step-2': False,
            },
            'twitter-controller': {
                'request-data-cursored-user-ids': False,
                'request-data-send-dm': False,
                'request-data-unknown': False,
                'request-data-users-for-ids': False,
            },
        },
        #TODO use settings.LOCALES once that's ready
        'supported_languages': [
            'de', 'en', 'es', 'fr', 'ja', 'ko', 'nl', 'pt', 'ru', 'th',
            'zh-Hant', 'zh-Hans'
        ],
        'l10n_files_url':
        None,
        'user_colors':
        list(Color.for_user(user)),
        'user_brushes':
        list(Brush.for_user(user)),
        'global_brushes':
        list(Brush.for_global()),
        'comment_view_logging_interval':
        10,
        'papertrail': {
            'host': 'logs.papertrailapp.com',
            'port': 27889,
            'disabled_logging_points': [],
        },
        'modals': {},
    }

    if app_version_tuple and app_version_tuple >= (3, ):
        ret['appirater_url'] = 'itms-apps://itunes.apple.com/app/idAPP_ID'
    else:
        ret['appirater_url'] = 'itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APP_ID'

    try:
        ret['color_alert_version'] = int(redis.get('color_alert_version'))
    except TypeError:
        ret['color_alert_version'] = 0

    if user.is_authenticated():
        user_kv_items = user.kv.hgetall()
        user_kv_items = dict((key, val) for key, val in user_kv_items.items()
                             if key in [
                                 'saw_update_modal_for_version',
                                 'saw_share_web_profile_modal',
                                 'publish_to_facebook',
                                 'publish_to_twitter',
                             ])

        ret.update({
            'user_email': user.email,
            'user_profile': user_profile(user.username),
            'balance': economy.balance(user),
            'completed_quest_ids': completed_quest_ids(user),
            'web_profile_privacy': user.kv.web_profile_privacy.get(),
            'twitter_privacy': user.kv.twitter_privacy.get(),
            'facebook_privacy': user.kv.facebook_privacy.get(),
            'user_kv': user_kv_items,
            'reminders': {
                'invite': 1,
            },
        })

        if (app_version and parse_version(knobs.CURRENT_APP_VERSION) >
                parse_version(app_version)):
            saw_version = user_kv_items.get('saw_update_modal_for_version')
            if (saw_version is None or parse_version(saw_version) <
                    parse_version(knobs.CURRENT_APP_VERSION)):
                ret['modals'][
                    'show_update_modal_for_version'] = knobs.CURRENT_APP_VERSION
                ret['modals']['update_modal_type'] = 'alert'

        if not user_kv_items.get('saw_share_web_profile_modal'):
            ret['modals']['show_share_web_profile_modal'] = (
                user.date_joined <= (datetime.now() - td(days=2))
                or user.comments.count() >= 3)

    ret['tab_badge_type'] = 'flag'
    if tab_last_seen_timestamps:
        ret['tab_badges'] = tab_badges(
            user, last_seen_timestamps=tab_last_seen_timestamps)

    return ret