Ejemplo n.º 1
0
def _get_chart():
    def _serialize(item):
        work = item['object']
        item['object'] = serializers.serialize_work(work)
        return item
    w = weekly()
    chart = compare_charts(
        PopularWorksChart(w, 5),
        PopularWorksChart(w.prev())
    )
    return map(_serialize, chart)
Ejemplo n.º 2
0
def main(request):
    w = weekly()
    chart = compare_charts(
        PopularWorksChart(w, 5),
        PopularWorksChart(w.prev())
    )
    return render(request, 'chart/index.html', {
        'weekly_works': load_comments(chart),
        'timeline': (History.objects.select_related('user', 'work')
                .filter(work__index__record_count__gt=1)
                .exclude(comment='')[:6].transform(include_records))
    })
Ejemplo n.º 3
0
def detail(request, chart_class, range_class=None, title=''):
    if range_class:
        range = range_class.last()
        chart = compare_charts(chart_class(range), chart_class(range.prev()))
    else:
        range = None
        chart = chart_class()

    return render(request, 'chart/detail.html', {
        'title': title,
        'chart': chart,
        'cache_key': str(chart_class) + '_' + repr(range),
        'has_diff': range != None,
    })
Ejemplo n.º 4
0
def get_chart(request, type):
    if type == 'work':
        chart_class = PopularWorksChart
    elif type == 'user':
        chart_class = ActiveUsersChart
    else:
        raise Http404

    period = request.GET.get('period')
    if period == 'week':
        period_class = Week
    elif period == 'month':
        period_class = Month
    else:
        period_class = None

    count = min(int(request.GET.get('count', 100)), 1000)

    if period_class:
        period = period_class.last()
        chart = compare_charts(
            chart_class(period, count),
            chart_class(period.prev())
        )
    else:
        period = None
        chart = chart_class(None, count)

    result = {}
    if period:
        result['start_date'] = chart.start
        result['end_date'] = chart.end

    result['items'] = items = []
    for item in chart:
        if period:
            if item['diff'] is None:
                del item['diff']
            else:
                item['diff'] *= item['sign']
                del item['sign']
        if type == 'work':
            work = item['object']
            item['work'] = work.title
        elif type == 'user':
            item['user'] = item['object'].username
        del item['object']
        items.append(item)

    return result
Ejemplo n.º 5
0
 def get(self, request):
     def _serialize(item):
         work = item['object']
         item['object'] = serialize_work(work)
         return item
     w = PopularWorksChartView.range_func()
     limit = int(request.GET['limit'])
     cache_key = '/charts/works/weekly/%s?limit=%d' % (str(w.sunday), limit)
     result = cache.get(cache_key)
     if result is None:
         chart = compare_charts(
             PopularWorksChart(w, limit),
             PopularWorksChart(w.prev())
         )
         result = map(_serialize, chart)
         cache.set(cache_key, result, 60 * 60)
     return result
Ejemplo n.º 6
0
    def get(self, request, range):
        if range == 'weekly':
            range_obj = weekly()
        elif range == 'monthly':
            range_obj = monthly()
        else:
            range_obj = None

        limit = int(request.GET['limit'])

        def serialize_chart(chart, limit):
            data = {}
            if chart.range:
                data['start'] = chart.start.strftime('%Y-%m-%d')
                data['end'] = chart.end.strftime('%Y-%m-%d')
                data['has_diff'] = True
            else:
                data['has_diff'] = False
            items = []
            for item in chart:
                if item['rank'] > limit:
                    break
                item['object'] = {
                    'link': item['object'].get_absolute_url(),
                    'text': unicode(item['object'])
                }
                items.append(item)
            data['items'] = items
            return data

        cache_key = '/charts/{}/{}/{}?limit=%d'.format(
            self.chart_class.__name__, range, limit)
        result = cache.get(cache_key)
        if result is None:
            if range_obj:
                chart = compare_charts(self.chart_class(range_obj, limit),
                                       self.chart_class(range_obj.prev()))
            else:
                chart = self.chart_class(limit=limit)
            result = serialize_chart(chart, limit)
            result['title'] = self.chart_class.title
            cache.set(cache_key, result, 60 * 60 * 2)
        return result
Ejemplo n.º 7
0
def detail(request, chart_class, range_class=None, title=''):
    if range_class:
        range = range_class.last()
        chart = compare_charts(chart_class(range), chart_class(range.prev()))
    else:
        range = None
        chart = chart_class()

    cache_key = 'chart/' + str(chart_class) + '_' + repr(range)
    chart_json = cache.get(cache_key)
    if not chart_json:
        chart_json = serialize_chart(chart, 100)
        cache.set(cache_key, chart_json, 7200)

    return render(request, 'chart.html', {
        'title': title,
        'preload_data': {
            'current_user': serializers.serialize_user(request.user, request.user) if request.user.is_authenticated() else None,
            'title': title,
            'chart': chart_json,
            'has_diff': range != None,
        }
    })