Пример #1
0
 def create_from_data(cls, subject, key_func,
                      start = None, end = None):
     chart_type = cls.mro()[0]._chart_type
     period = cls.mro()[3]._period
     globals()["%slyChart" % period['name'].title().replace(' ','')]._check_chart_params({}, subject, start, end)
     mcl = MonthlyChart.get_chart_list(subject)
     if start is None and end is None:
         start = mcl[-period['duration']].start
         end = mcl[-1].end
     wcl = subject.weekly_chart_list
     period_wcl = [wc for wc in wcl
         if start < wc.start < end or start < wc.end < end]
     period_wacl = []
     for wc in period_wcl:
         try:
             period_wacl.append(
                 getattr(subject, "get_weekly_%s_chart" % chart_type)(wc.start, wc.end))
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)
     stats_dict = period_wacl[0].__dict__["_%ss" % chart_type][0].stats.__dict__
     count_attribute = [k for k in stats_dict.keys()
                        if stats_dict[k] is not None and k not in ['_rank', '_subject']][0]
     items = {}
     for wac in period_wacl:
         for item in wac.__dict__["_%ss" % chart_type]:
             key = key_func(item)
             mw_start = max(wac.start, start)
             mw_end = min(wac.end, end)
             count = item.stats.__dict__[count_attribute] * (mw_end - mw_start).days / 7.0
             if key in items:
                 items[key].stats.__dict__[count_attribute] += count
             else:
                 items[key] = item
                 items[key].stats.__dict__[count_attribute] = count
     items = items.values()
     items = [a for a in items if a.stats.__dict__[count_attribute] >= 1]
     items.sort(key = lambda a: a.stats.__dict__[count_attribute], reverse=True)
     for i,item in enumerate(items):
         item.stats._rank = i + 1
         item.stats.__dict__[count_attribute] = safe_int(item.stats.__dict__[count_attribute])
     return globals()[
         "%sly%sChart" % (
             period['name'].title().replace(' ',''),
             chart_type.capitalize()
         )](
         subject = subject,
         start = start,
         end = end,
         stats = Stats(
             subject = subject,
             **{count_attribute[1:]: sum(a.stats.__dict__[count_attribute] for a in items)}
         ),
         **{"%ss" % chart_type: items}
     )
Пример #2
0
 def create_from_data(cls, subject, key_func, start=None, end=None):
     chart_type = cls.mro()[0]._chart_type
     period = cls.mro()[3]._period
     globals()["%slyChart" %
               period['name'].title().replace(' ', '')]._check_chart_params(
                   {}, subject, start, end)
     mcl = MonthlyChart.get_chart_list(subject)
     if start is None and end is None:
         start = mcl[-period['duration']].start
         end = mcl[-1].end
     wcl = subject.weekly_chart_list
     period_wcl = [
         wc for wc in wcl if start < wc.start < end or start < wc.end < end
     ]
     period_wacl = []
     for wc in period_wcl:
         try:
             period_wacl.append(
                 getattr(subject,
                         "get_weekly_%s_chart" % chart_type)(wc.start,
                                                             wc.end))
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)
     stats_dict = period_wacl[0].__dict__["_%ss" %
                                          chart_type][0].stats.__dict__
     count_attribute = [
         k for k in stats_dict.keys()
         if stats_dict[k] is not None and k not in ['_rank', '_subject']
     ][0]
     items = {}
     for wac in period_wacl:
         for item in wac.__dict__["_%ss" % chart_type]:
             key = key_func(item)
             mw_start = max(wac.start, start)
             mw_end = min(wac.end, end)
             count = item.stats.__dict__[count_attribute] * (
                 mw_end - mw_start).days / 7.0
             if key in items:
                 items[key].stats.__dict__[count_attribute] += count
             else:
                 items[key] = item
                 items[key].stats.__dict__[count_attribute] = count
     items = items.values()
     items = [a for a in items if a.stats.__dict__[count_attribute] >= 1]
     items.sort(key=lambda a: a.stats.__dict__[count_attribute],
                reverse=True)
     for i, item in enumerate(items):
         item.stats._rank = i + 1
         item.stats.__dict__[count_attribute] = int(
             item.stats.__dict__[count_attribute])
     return globals()["%sly%sChart" % (period['name'].title().replace(
         ' ', ''), chart_type.capitalize())](
             subject=subject,
             start=start,
             end=end,
             stats=Stats(subject=subject,
                         **{
                             count_attribute[1:]:
                             sum(a.stats.__dict__[count_attribute]
                                 for a in items)
                         }),
             **{
                 "%ss" % chart_type: items
             })
Пример #3
0
 def gen(lst):
     for wc in wcl:
         try:
             yield self.get_weekly_album_chart(wc.start, wc.end)
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)
Пример #4
0
 def gen(lst):
     for mc in mcl:
         try:
             yield self.get_monthly_tag_chart(mc.start, mc.end)
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)
Пример #5
0
 def gen(lst):
     for wc in wcl:
         try:
             yield self.get_weekly_album_chart(wc.start, wc.end)
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)
Пример #6
0
 def gen(lst):
     for mc in mcl:
         try:
             yield self.get_monthly_tag_chart(mc.start, mc.end)
         except LastfmError as ex:
             logging.log_silenced_exceptions(ex)