示例#1
0
    def save_reviews(self, reviews):
        for review in reviews:
            try:
                review.update({
                        'id': self._ids.next_id("reviews"),
                        'user_id': int(review.get('user_id', 0)),
                        'user_name': review.get('user_name', ''),
                        'app_id': int(review.get('app_id', 0)),
                        'rate': float(review.get('rate', 0)),
                        'comment': review.get('comment', ''),
                        'created_time': timestamp_utc_now()
                    })
                self._db.reviews.save(review)
            except Exception, e:
                print e
                continue

            if review['app_id'] == 0:
                continue

            app = self._db.apps.find_one({'id': review['app_id']}, fields=APP_FIELDS_RATING)
            if app is None:
                continue

            self._db.reviews.save(review)

            app_rate_count = app['rate_count'] if 'rate_count' in app else 0
            app_rate = app['rate'] if 'rate' in app else 0
            app_rate = (app_rate + review['rate']) / (app_rate_count + 1.0)
            self._db.apps.update({'_id': app['_id']}, {'$set': {'rate': app_rate, 'rate_count': app_rate_count}})
示例#2
0
文件: push.py 项目: liuliainio/liuli
    def _get_valid_messages(self):
        now = timestamp_utc_now()

        return cached_query('push_valid_nmessages',
            lambda sender : [message for message in sender._db.messages.find({ 'not_valid_before': {'$lte': now}, 'not_valid_after': {'$gt': now} }, fields = message_fields_detail)],
            query_func_state = self,
            timeout = 120,
            return_cache_hit_status = True)
示例#3
0
 def query_login_pictures(self, start_index=0, count=20, order=None):
     if order is None:
         order = [('start_date', self.ORDER_DESC)]
     now = timestamp_utc_now()
     cond = {'start_date': {'$lte': now}, 'end_date': {'$gt': now}}
     return self._db.login_pictures.find(cond,
                                         skip=start_index,
                                         limit=count,
                                         sort=order)
示例#4
0
 def can_query_update(self, client_id):
     now = timestamp_utc_now()
     limit = self._db.limits.find_and_modify({'_id': client_id}, {
         '_id': client_id,
         'last_query': now
     }, True)
     if not limit or (now - limit['last_query'] >
                      self.UPDATE_QUERY_LIMIT_TIME):
         return True
     return False
示例#5
0
    def _get_valid_messages(self):
        now = timestamp_utc_now()

        return cached_query('push_valid_nmessages',
                            lambda sender: [
                                message
                                for message in sender._db.messages.find(
                                    {
                                        'not_valid_before': {
                                            '$lte': now
                                        },
                                        'not_valid_after': {
                                            '$gt': now
                                        }
                                    },
                                    fields=message_fields_detail)
                            ],
                            query_func_state=self,
                            timeout=120,
                            return_cache_hit_status=True)
示例#6
0
 def query_login_pictures(self, start_index=0, count=20, order=None):
     if order is None:
         order = [('start_date', self.ORDER_DESC)]
     now = timestamp_utc_now()
     cond = {'start_date': {'$lte': now}, 'end_date': {'$gt': now}}
     return self._db.login_pictures.find(cond, skip = start_index, limit = count, sort = order)
示例#7
0
文件: views.py 项目: liuliainio/liuli
def client_statistics(request):
    _ERR_CODE_ILL_PARAM = "Illegal Parameter"
    _ERR_CODE_PARAM_ERR = "Get Parameter Error"
    _ERR_CODE_SERV_ERR = "Server Error"
    _ERR_CODE = {
        _ERR_CODE_ILL_PARAM: 'IllegalParameters',
        _ERR_CODE_PARAM_ERR: 'GetParameterError',
        _ERR_CODE_SERV_ERR: 'ServerError',
    }
    key_rename_map = {
        'chn': 'chn',
        'clientid': 'clientid',
        'appid': 'appid',
        'appname': 'appname',
        'md_id': 'id',
        'md_type': 'type',
        'md_num': 'num',
        'md_appid': 'appid',
        'md_appname': 'appname',
        'md_categid': 'categid',
        'md_categname': 'categname',
        'sd_subjectid': 'subjectid',
        'sd_subjectname': 'subjectname',
        'sd_csubjectid': 'csubjectid',
        'sd_csubjectname': 'csubjectname',
        'log_date': 'log_date',
    }
    db_value_map = {
        '_md_type': 'md_type',
        '_md_appid': 'md_appid',
        '_md_appname': 'md_appname',
        '_md_num': 'md_num',
        '_md_categid': 'md_categid',
        '_md_categname': 'md_categname',
        '_sd_subjectid': 'sd_subjectid',
        '_sd_subjectname': 'sd_subjectname',
        '_sd_csubjectid': 'sd_csubjectid',
        '_sd_csubjectname': 'sd_csubjectname',
        '_log_date': 'log_date',
        '_client_id': 'client_id',
        '_chn': 'chn',
    }
    query_dict = {}
    statist_db = StatistcMongoDB(settings.MONGODB_CONF)
    log_date = timestamp_utc_now()
    try:
        client_id = get_parameter_GET(
            request,
            key_rename_map['clientid'])
        chn = get_parameter_GET(
            request,
            key_rename_map['chn'])
        md_type = get_parameter_GET(
            request,
            key_rename_map['md_type'])
        md_appid = get_parameter_GET(
            request,
            key_rename_map['md_appid'])
        md_appname = get_parameter_GET(
            request,
            key_rename_map['md_appname'])
        md_num = get_parameter_GET(
            request,
            key_rename_map['md_num'])
        md_categid = get_parameter_GET(
            request,
            key_rename_map['md_categid'])
        md_categname = get_parameter_GET(
            request,
            key_rename_map['md_categname'])
    except Exception:
        return json_response_error(-1, _ERR_CODE[_ERR_CODE_PARAM_ERR])
    else:
        if md_type not in ('1', '2', '3', '4', '5', '6', '6', '7', '8', '9', '10', '11', '12'):
            return json_response_error(-1, _ERR_CODE[_ERR_CODE_ILL_PARAM])
        if md_type == '8' or md_type == '9':
            try:
                sd_subjectid = get_parameter_GET(
                    request,
                    key_rename_map['sd_subjectid'])
                sd_subjectname = get_parameter_GET(
                    request,
                    key_rename_map['sd_subjectname'])
                sd_csubjectid = get_parameter_GET(
                    request,
                    key_rename_map['sd_csubjectid'])
                sd_csubjectname = get_parameter_GET(
                    request,
                    key_rename_map['sd_csubjectname'])
            except Exception:
                return json_response_error(-1, _ERR_CODE[_ERR_CODE_PARAM_ERR])
            else:
                query_dict = {
                    db_value_map['_md_type']: md_type,
                    db_value_map['_md_appid']: md_appid,
                    db_value_map['_md_appname']: md_appname,
                    db_value_map['_md_num']: md_num,
                    db_value_map['_md_categid']: md_categid,
                    db_value_map['_md_categname']: md_categname,
                    db_value_map['_sd_subjectid']: sd_subjectid,
                    db_value_map['_sd_subjectname']: sd_subjectname,
                    db_value_map['_sd_csubjectid']: sd_csubjectid,
                    db_value_map['_sd_csubjectname']: sd_csubjectname,
                    db_value_map['_log_date']: log_date,
                    db_value_map['_client_id']: client_id,
                    db_value_map['_chn']: chn,
                }
        else:
            query_dict = {
                db_value_map['_md_type']: md_type,
                db_value_map['_md_appid']: md_appid,
                db_value_map['_md_appname']: md_appname,
                db_value_map['_md_num']: md_num,
                db_value_map['_md_categid']: md_categid,
                db_value_map['_md_categname']: md_categname,
                db_value_map['_log_date']: log_date,
                db_value_map['_client_id']: client_id,
                db_value_map['_chn']: chn,
            }
        try:
            if not statist_db.insert_to_StatisticDB(query_dict):
                return json_response_error(-1, _ERR_CODE[_ERR_CODE_SERV_ERR])
        except Exception:
            return json_response_error(-1, _ERR_CODE[_ERR_CODE_SERV_ERR])
        else:
            return json_response_ok()
    finally:
        query_dict.clear()
示例#8
0
    def execute(self, request):
        chn = get_parameter_POST_or_GET(
            request,
            'chn',
            required=False,
            str_max_length=255)
        client_id = get_parameter_POST_or_GET(request, 'clientid')
        source = get_parameter_POST_or_GET(
            request,
            'source',
            str_max_length=255)
        app_id = get_parameter_POST_or_GET(
            request,
            'app_id',
            convert_func=int)
        app_version_code = get_parameter_POST_or_GET(
            request,
            'app_version_code',
            convert_func=int)
        app_version_name = get_parameter_POST_or_GET(
            request,
            'app_version_name')
        user_name = get_parameter_POST_or_GET(request, 'user_name')
        review_rate = get_parameter_POST_or_GET(
            request,
            'rate',
            convert_func=int)
        review_content = get_parameter_POST_or_GET(
            request,
            'content',
            str_max_length=1000)
        ip = get_parameter_META(
            request,
            'REMOTE_ADDR',
            required=False,
            default=u'')
        for q in (client_id, source, app_id, app_version_code, app_version_name, user_name, review_rate, review_content):
            if isinstance(q, HttpResponse):
                return q

        error_code = PostReviewAction.ERROR_CODE_OK
        status = PostReviewAction.REVIEW_STATUS_OK
        if self.contains_block_words(app_version_name + user_name + review_content):
            status = PostReviewAction.REVIEW_STATUS_AWAITING_MODERATION
            error_code = PostReviewAction.ERROR_CODE_AWAITING_MODERATION

        review = {
            'app_id': app_id,
            'app_version_code': app_version_code,
            'app_version_name': app_version_name,
            'user_name': user_name,
            'rate': review_rate,
            'content': review_content,
            'source': source,
            'client_id': client_id,
            'ip': ip,
            'created_time': timestamp_utc_now(),
            'status': status,
        }

        self.app_db.save_reviews(review)

        del review['app_id']
        del review['app_version_code']
        del review['source']
        del review['client_id']
        del review['ip']
        del review['status']
        del review['_id']

        return {'error_code': error_code, 'reviews': [review]}
示例#9
0
            'start_index',
            convert_func=int)
        count = get_parameter_GET(request, 'count', convert_func=int)
        ip = get_parameter_META(
            request,
            'REMOTE_ADDR',
            required=False,
            default=u'')
        for q in (client_id, source, app_id, app_version_code):
            if isinstance(q, HttpResponse):
                return q

        return (
            {'reviews': self.query_reviews(
                app_id,
                start_index=start_index,
                count=count)}
        )


if __name__ == '__main__':
    action = PostReviewAction(None, None)
    print action.contains_block_words('test')
    print action.contains_block_words(u'东西acdsf东西南北论坛sdfsdf')
    print action.contains_block_words(u'a[av]asfasdf')
    print timestamp_utc_now()
    for i in xrange(0, 500):
        action.contains_block_words(
            u'东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a东西a')
    print timestamp_utc_now()
示例#10
0
文件: user.py 项目: liuliainio/liuli
 def can_query_update(self, client_id):
     now = timestamp_utc_now()
     limit = self._db.limits.find_and_modify({'_id':client_id}, {'_id':client_id, 'last_query':now }, True)
     if not limit or (now - limit['last_query'] > self.UPDATE_QUERY_LIMIT_TIME):
         return True
     return False
示例#11
0
def select_messages(
        messages, client_id, source, chn, is_test_device, count, device_model='', os_v=0, screensize='', sim_operator=0,
        user_phone='', client_version=0, ip=None, debug=0, debug_user_tags=None, perf=None, push_db=None, user_db=None, location_db=None):
    if not messages:
        if debug:
            messages.append({'debug_message': 'no message found'})
        return messages

    time_now = timestamp_utc_now()

    final_messages = messages
    if perf:
        perf.set('pre')

    # push time check
    user_pushed_messages = push_db.get_pushed_messages(client_id)
    if user_pushed_messages:
        print 'pushed'
        final_messages = [message for message in final_messages if str(
            message['message_id']) not in user_pushed_messages]
        last_message_push_time = max(message[1]
                                     for message in user_pushed_messages.iteritems())
        # no two messages within 12 hours
        if time_now - last_message_push_time < MESSAGE_PUSH_INTERVAL:
            # push only if there's direct message
            if all(_get_message_group_name(message) != '' for message in final_messages):
                final_messages = []
                if debug:
                    final_messages.append(
                        {'debug_message': 'no direct message',
                         'last_message_push_time': last_message_push_time,
                         'now': time_now,
                         'messages': messages,
                         'user_pushed_messages': user_pushed_messages})
                return final_messages
    if perf:
        perf.set('ptc')

    print 'end .....'
    # filter messages which run out of quota
    pushed_counts = push_db.get_message_pushed_counts(final_messages)
    pushed_counts = dict([(item['_id'], item)
                         for item in pushed_counts]) if pushed_counts else {}
    date_now = _date_key_from_time(time_now)
    final_messages_new = []
    for message in final_messages:
        push_total = _get_message_target_value(
            message,
            'push_total',
            defauld_value=0)
        push_daily = _get_message_target_value(
            message,
            'push_daily',
            defauld_value=0)

        pushed_total = 0
        pushed_today = 0
        pushed_count = pushed_counts.get(message['message_id'], None)
        if pushed_count:
            pushed_total = pushed_count.get('total', 0)
            pushed_today = pushed_count.get(date_now, 0)

        if push_total != 0 and push_total <= pushed_total:
            continue
        if push_daily != 0 and push_daily <= pushed_today:
            continue

        # 1000000, this will be used for message sampling
        message['push_today'] = (
            push_daily - pushed_today) if push_daily != 0 else 1000000
        final_messages_new.append(message)
    final_messages = final_messages_new
    if perf:
        perf.set('qt')
    if not final_messages:
        if debug:
            final_messages.append(
                {'debug_message': 'all messages run out of quota',
                 'messages': messages,
                 'pushed_counts': pushed_counts})
        return final_messages

    # step 0: get user data
    user_tags = user_db.query_user_tags(client_id)
    if perf:
        perf.set('qut')
    user_apps = user_db.query_apps_installed(client_id)
    if perf:
        perf.set('qua')
    user_tags = _update_user_tags(
        user_tags,
        user_apps,
        chn,
        device_model,
        os_v,
        screensize,
        sim_operator,
        user_phone,
        client_version,
        ip,
        user_pushed_messages,
        debug_user_tags,
        location_db,
        perf)
    if perf:
        perf.set('uut')

    # step 1: filter message
    print '11111'
    print final_messages
    message_matcher = MessageMatcher(user_tags, time_now, debug=debug)
    final_messages = message_matcher.do_match(final_messages)
    # no message filter for test device:
    if is_test_device:
        final_messages = messages
    if perf:
        perf.set('fltr')

    # step 2: rank and select message
    message_ranker = MessageRanker(user_tags, debug=debug)
    final_messages = message_ranker.do_rank(final_messages, count)
    if perf:
        perf.set('rnk')

    if client_id == 'apitest':
        # client: apitest is a very special test id, it could always get all
        # valid messages
        final_messages = messages
    else:
        for message in final_messages:
            if 'targets' in message:
                del message['targets']
            if 'push_today' in message:
                del message['push_today']
        if not debug:
            _update_pushed_messages(
                client_id,
                time_now,
                user_pushed_messages,
                final_messages,
                push_db)
    if perf:
        perf.set('ums')

    if debug:
        debug_data = {'debug': debug,
                      'user_tags': user_tags,
                      'message_matcher': message_matcher.debug_logs,
                      'message_ranker': message_ranker.debug_logs,
                      'user_pushed_messages': user_pushed_messages,
                      'pushed_counts': pushed_counts}
        final_messages.append(debug_data)

    return final_messages