예제 #1
0
파일: views.py 프로젝트: hensom/fancyashow
def best_artists(request):
  act_info       = []
  unknown        = 0
  no_info        = 0
  total          = 0
  with_media     = 0
  with_resources = 0
  
  for show in Show.objects():
    artist_map = show.related_artists()
    
    total += 1
    
    if any( a.media for a in artist_map.values() ):
      with_media += 1

    if show.parse_meta.resources:
      with_resources += 1
    
    had_headliner     = False
    chosen            = -1
    chosen_play_count = 0
        
    for i, a in enumerate(show.artists):
      to_add = i + 1 - len(act_info)
      
      for x in range(to_add):
        act_info.append({
          'num_total':      0,
          'num_with_media': 0,
          'should_see':     0
        })
        
      play_count = 0
      
      act_info[i]['num_total'] += 1
      
      artist = None
      
      if a.artist_id:
        artist = artist_map.get(a.artist_id)
      
      if artist:
        play_count = reduce(lambda x, y: max(x, y), [m.stats.number_of_plays for m in artist.media], 0)
      
        if artist.media:
          act_info[i]['num_with_media'] += 1
      
      if i == 0 and play_count > 0:
        had_headliner = True
      
      if play_count > chosen_play_count:
        chosen = i
        chosen_play_count = play_count
        
    if chosen == -1:
      no_info += 1
    else:
      if not had_headliner:
        unknown += 1
      else:
        act_info[chosen]['should_see'] += 1
        
  for info in act_info:
    info['percent_with_media'] = int(100.0 * info['num_with_media'] / info['num_total'])

  context = {
    'act_info':       act_info,
    'total':          total,
    'with_media':     with_media,
    'with_resources': with_resources,
    'unknown':        unknown,
    'no_info':        no_info
  }

  return render_to_response('fancy_admin/best_artists.html', context)
예제 #2
0
파일: views.py 프로젝트: hensom/fancyashow
def shows(request):
  page_number = request.GET.get('page', 1)
  
  today   = datetime.now().date()
  
  initial = {
    'show_range': 'on',
    'show_date':  today 
  }
  
  data = None
  
  if request.GET.get('search'):
    data = request.GET

  show_form = AdminShowFilterForm(data = data, initial = initial)
  
  if data and not show_form.is_valid():
    raise Exception('Invalid admin filters')
    
  if data:
    filters = show_form.cleaned_data
  else:
    filters = initial
  
  shows = Show.objects()
  
  if filters.get('query'):
    f = SearchFilter(filters.get('query'), 'title', 'venue__name', 'parse_meta__parser_id')
    
    shows = f.apply(shows)

  if filters.get('show_date'):
    range_map = {
      'on':      None,
      'before': 'lt',
      'after':  'gt'
    }
    range_method = range_map[filters.get('show_range')]

    f = DateFilter(filters.get('show_date'), 'date', range_method)
    
    shows = f.apply(shows)

  if filters.get('is_hidden'):
    shows = shows.filter(visible = False)
    
  if filters.get('no_image'):
    shows = shows.filter(image_url = None)

  if filters.get('restrict') == 'handling_failed':
    shows = transform_exec_js(Show, shows, show_has_resource_state(RESOURCE_HANDLING_FAILED))
  elif filters.get('restrict') == 'not_handled':
    shows = transform_exec_js(Show, shows, show_has_resource_state(RESOURCE_NOT_HANDLED))
  elif filters.get('restrict') == 'no_headliner':
    shows = transform_exec_js(Show, shows, show_lacks_headliner)
    
  if filters.get('resource') not in ('', None):
    shows = transform_exec_js(Show, shows, show_has_resource(filters.get('resource')))
    
  shows = shows.order_by('date', '-rank')
  
  paginator = Paginator(shows, 100)
  
  page  = paginator.page(page_number)

  shows = list(page.object_list)

  today          = datetime.today().replace(hour = 0, minute = 0, second = 0)
  three_days_ago = today - timedelta(days = 3)

  for show in shows:
    artist_map = show.related_artists()

    for a in show.artists:
      a.full = artist_map.get(a.artist_id)

  context = {
    'show_form': show_form,
    'shows':     shows,
    'page':      page,
    'paginator': paginator
  }

  return render_to_response('fancy_admin/shows.html', context)
예제 #3
0
파일: views.py 프로젝트: hensom/fancyashow
def show_details(request, venue, year, month, day, artist):
    venue = Venue.objects.get(slug=venue)
    day = datetime(int(year), int(month), int(day))
    today = datetime.today()
    look_until = today + timedelta(days=30)

    matching_shows = Show.objects(venue__url=venue.url, date=day)
    show = None

    for prospect in matching_shows:
        if prospect.slug() == artist:
            show = prospect

            break

    if not show:
        return show_list(request, matching_shows, "fancy_main/shows_at_venue.html", {"venue": venue, "day": day})

    artist_ids = {}
    artist_map = {}
    artists = []
    shows_by_artist = {}

    for info in filter(lambda x: x.artist_id, show.artists):
        if info.artist_id not in artist_map:
            artist_ids[info.artist_id] = True

    if artist_ids:
        show_range = Q(date__gte=today) & Q(date__lte=look_until)
        artist_shows = (
            Show.objects(artist_ids__in=artist_ids.keys(), id__ne=show.id).filter(show_range).order_by("date")
        )

        for artist_show in artist_shows:
            for info in filter(lambda x: x.artist_id, artist_show.artists):
                if info.artist_id not in shows_by_artist:
                    shows_by_artist[info.artist_id] = []

                shows_by_artist[info.artist_id].append(artist_show)

        artist_map = Artist.objects.in_bulk(artist_ids.keys())

    for artist_info in show.artists:
        artists.append(
            {
                "info": artist_info,
                "artist": artist_map.get(artist_info.artist_id),
                "shows": shows_by_artist.get(artist_info.artist_id, []),
            }
        )

    venues = list(Venue.objects())

    saved_shows = {}

    if request.user.is_authenticated():
        saved_shows = request.user.starred_show_set.get_id_dict()

    context = {
        "show": show,
        "shows": [show],
        "artists": artists,
        "venue": Venue.objects.get(url=show.venue.url),
        "venues": venues,
        "saved_shows": saved_shows,
    }

    return render_to_response("fancy_main/show_details.html", RequestContext(request, context))