def users(request, formset_class=forms.AuthorFormSet, form_class=forms.AuthorForm): headers = SortHeaders(request, (('Username', 'username'), ('Email', None), ('Role', None), ('Videos', 'authored_set__count'))) users = User.objects.all().annotate(Count('authored_set')) users = users.order_by(headers.order_by()) if request.GET.get('show', None) != 'all': filters = _filter_just_humans() users = users.filter(filters) # Display only the appropriate page. Put 50 on each page at a time. user_paginator = Paginator(users, 50) try: page = user_paginator.page(int(request.GET.get('page', 1))) except ValueError: return HttpResponseBadRequest('Not a page number') except EmptyPage: page = user_paginator.page(user_paginator.num_pages) formset = formset_class(queryset=page.object_list) add_user_form = form_class() if request.method == 'POST': if not request.POST.get('form-TOTAL_FORMS'): add_user_form = form_class(request.POST, request.FILES) if add_user_form.is_valid(): add_user_form.save() return HttpResponseRedirect(request.path) else: formset = formset_class(request.POST, request.FILES, queryset=User.objects.all()) if formset.is_valid(): formset.save() return HttpResponseRedirect(request.get_full_path()) return render_to_response('localtv/admin/users.html', { 'formset': formset, 'add_user_form': add_user_form, 'page': page, 'headers': headers }, context_instance=RequestContext(request))
def users(request, formset_class=forms.AuthorFormSet, form_class=forms.AuthorForm): headers = SortHeaders(request, ( ('Username', 'username'), ('Email', None), ('Role', None), ('Videos', 'authored_set__count'))) users = User.objects.all().annotate(Count('authored_set')) users = users.order_by(headers.order_by()) if request.GET.get('show', None) != 'all': filters = _filter_just_humans() users = users.filter(filters) # Display only the appropriate page. Put 50 on each page at a time. user_paginator = Paginator(users, 50) try: page = user_paginator.page(int(request.GET.get('page', 1))) except ValueError: return HttpResponseBadRequest('Not a page number') except EmptyPage: page = user_paginator.page(user_paginator.num_pages) formset = formset_class(queryset=page.object_list) add_user_form = form_class() if request.method == 'POST': if not request.POST.get('form-TOTAL_FORMS'): add_user_form = form_class(request.POST, request.FILES) if add_user_form.is_valid(): add_user_form.save() return HttpResponseRedirect(request.path) else: formset = formset_class(request.POST, request.FILES, queryset=User.objects.all()) if formset.is_valid(): formset.save() return HttpResponseRedirect(request.get_full_path()) return render_to_response('localtv/admin/users.html', {'formset': formset, 'add_user_form': add_user_form, 'page': page, 'headers': headers}, context_instance=RequestContext(request))
class ContestAdminListView(ContestQuerySetMixin, ListView): context_object_name = 'contests' template_name = 'localtv/admin/contests/list.html' paginate_by = 50 def get_queryset(self): self.headers = SortHeaders(self.request, ( ('Name', 'name'), ('Votes', 'vote_count'), ('Videos', 'video_count'))) queryset = super(ContestAdminListView, self).get_queryset() queryset = queryset.annotate( vote_count=Count('contestvideo__contestvote'), video_count=Count('contestvideo')) return queryset.order_by(self.headers.order_by()) def get_context_data(self, **kwargs): context = super(ContestAdminListView, self).get_context_data(**kwargs) context.update({ 'headers': self.headers }) return context
def manage_sources(request): headers = SortHeaders(request, (('Source', 'name__lower'), ('Categories', None), ('User Attribution', None), ('Type', 'type'), ('Import', None), ('Auto Approve', 'auto_approve'))) sort = headers.order_by() if sort.endswith('type'): if sort[0] == '-': orm_sort = '-name__lower' else: orm_sort = 'name__lower' else: orm_sort = sort site_settings = SiteSettings.objects.get_current() feeds = Feed.objects.filter(site=site_settings.site).extra( select={ 'name__lower': 'LOWER(name)' }).order_by(orm_sort) searches = SavedSearch.objects.filter(site=site_settings.site).extra( select={ 'name__lower': 'LOWER(query_string)' }).order_by(orm_sort) search_string = request.GET.get('q', '') if search_string: feeds = feeds.filter( Q(feed_url__icontains=search_string) | Q(name__icontains=search_string) | Q(webpage__icontains=search_string) | Q(description__icontains=search_string)) searches = searches.filter(query_string__icontains=search_string) category = request.GET.get('category') if category: category = get_object_or_404(Category, pk=category) feeds = feeds.filter(auto_categories=category) searches = searches.filter(auto_categories=category) author = request.GET.get('author') if author: author = get_object_or_404(User, pk=author) feeds = feeds.filter(auto_authors=author) searches = searches.filter(auto_authors=author) source_filter = request.GET.get('filter') if source_filter == 'search': queryset = searches elif source_filter in ('feed', 'user'): q = Q(feed_url__iregex=VIDEO_SERVICE_REGEXES[0][1]) for service, regexp in VIDEO_SERVICE_REGEXES[1:]: q = q | Q(feed_url__iregex=regexp) if source_filter == 'user': queryset = feeds.filter(q) else: queryset = feeds.exclude(q) else: reverse = False if orm_sort[0] == '-': reverse = True orm_sort = orm_sort[1:] feeds_list = [(force_unicode(getattr(feed, orm_sort)), feed) for feed in feeds] searches_list = [(force_unicode(getattr(search, orm_sort)), search) for search in searches] queryset = [ l[1] for l in sorted(feeds_list + searches_list, reverse=reverse) ] if sort.endswith('type'): reverse = (sort[0] == '-') queryset = sorted(queryset, reverse=reverse, key=lambda source: source.source_type().lower()) paginator = Paginator(queryset, 15) try: page = paginator.page(int(request.GET.get('page', 1))) except InvalidPage: raise Http404 if request.method == 'POST': formset = forms.SourceFormset(request.POST, request.FILES, queryset=MockQueryset(page.object_list)) if formset.is_valid(): formset.save() bulk_action = request.POST.get('bulk_action', '') for form in formset.bulk_forms: if bulk_action == 'remove': if request.POST.get('keep'): form.instance.video_set.all().update(search=None, feed=None) form.instance.delete() for form in formset.deleted_forms: if request.POST.get('keep'): form.instance.video_set.all().update(search=None, feed=None) form.instance.delete() path = request.get_full_path() if '?' in path: return HttpResponseRedirect(path + '&successful') else: return HttpResponseRedirect(path + '?successful') else: formset = forms.SourceFormset(queryset=MockQueryset(page.object_list)) return render_to_response('localtv/admin/manage_sources.html', { 'add_feed_form': forms.AddFeedForm(), 'page': page, 'paginator': paginator, 'headers': headers, 'search_string': search_string, 'source_filter': source_filter, 'categories': formset._qs_cache['categories'], 'users': formset._qs_cache['authors'], 'successful': 'successful' in request.GET, 'formset': formset }, context_instance=RequestContext(request))
def bulk_edit(request, formset_class=forms.VideoFormSet): if ('just_the_author_field' in request.GET and 'video_id' in request.GET): # generate just the particular form that the user wants template_data = {} form_prefix = request.GET['just_the_author_field'] video = get_object_or_404(Video, pk=int(request.GET['video_id'])) form = forms.BulkEditVideoForm(instance=video, prefix=form_prefix) template_data['form'] = form template = 'localtv/admin/bulk_edit_author_widget.html' return render_to_response(template, template_data, context_instance=RequestContext(request)) site_settings = SiteSettings.objects.get_current() videos = Video.objects.filter(status=Video.ACTIVE, site=site_settings.site) if 'filter' in request.GET: filter_type = request.GET['filter'] if filter_type == 'featured': videos = videos.exclude(last_featured=None) elif filter_type == 'rejected': videos = Video.objects.filter(status=Video.REJECTED) elif filter_type == 'no-attribution': videos = videos.filter(authors=None) elif filter_type == 'no-category': videos = videos.filter(categories=None) elif filter_type == 'unapproved': videos = Video.objects.filter(status=Video.UNAPPROVED) videos = videos.select_related('feed', 'search', 'site') category = request.GET.get('category', '') try: category = int(category) except ValueError: category = '' if category != '': videos = videos.filter(categories__pk=category).distinct() author = request.GET.get('author', '') try: author = int(author) except ValueError: author = '' if author != '': videos = videos.filter(authors__pk=author).distinct() search_string = request.GET.get('q', '') if search_string != '': videos = videos.filter( Q(description__icontains=search_string) | Q(name__icontains=search_string) | Q(categories__name__icontains=search_string) | Q(user__username__icontains=search_string) | Q(user__first_name__icontains=search_string) | Q(user__last_name__icontains=search_string) | Q(video_service_user__icontains=search_string) | Q(feed__name__icontains=search_string)).distinct() headers = SortHeaders(request, ( ('Video Title', 'name'), ('Source', 'source'), ('Categories', None), ('Date Published', '-when_published'), ('Date Imported', '-when_submitted'), )) sort = headers.order_by() if sort.endswith('source'): videos = videos.extra(select={ 'name_lower':'LOWER(localtv_video.name)'}) videos = videos.order_by(sort.replace('source', 'calculated_source_type')) elif sort.endswith('name'): videos = videos.extra(select={ 'name_lower':'LOWER(localtv_video.name)'}).order_by( sort.replace('name', 'name_lower')) else: videos = videos.order_by(sort) video_paginator = Paginator(videos, 30) try: page = video_paginator.page(int(request.GET.get('page', 1))) except ValueError: return HttpResponseBadRequest('Not a page number') except EmptyPage: page = video_paginator.page(video_paginator.num_pages) if request.method == 'POST': formset = formset_class(request.POST, request.FILES, queryset=page.object_list) if formset.is_valid(): formset.save() if 'successful' in request.GET: path_with_success = request.get_full_path() else: path = request.get_full_path() if '?' in path: path_with_success = path + '&successful' else: path_with_success = path + '?successful' return HttpResponseRedirect(path_with_success) else: formset = formset_class(queryset=page.object_list) return render_to_response('localtv/admin/bulk_edit.html', {'formset': formset, 'headers': headers, 'search_string': search_string, 'page': page, 'categories': formset._qs_cache['categories'], 'users': formset._qs_cache['authors']}, context_instance=RequestContext(request))
def index(request): """ Displays the list of playlists for a given user, or the current one if none is specified. """ if not request.user.is_authenticated(): return redirect_to_login(request.get_full_path()) if request.user_is_admin() and request.GET.get( 'show', None) in ('all', 'waiting'): headers = SortHeaders(request, ( ('Playlist', 'name'), ('Description', None), ('Slug', None), ('Username', 'user__username'), ('Status', None), ('Video Count', 'items__count') )) if request.GET.get('show') == 'all': playlists = Playlist.objects.all() else: playlists = Playlist.objects.filter( status=Playlist.WAITING_FOR_MODERATION) else: headers = SortHeaders(request, ( ('Playlist', 'name'), ('Description', None), ('Slug', None), ('Status', None), ('Video Count', 'items__count') )) playlists = Playlist.objects.filter(user=request.user) if headers.ordering == 'items__count': playlists = playlists.annotate(Count('items')) playlists = playlists.order_by(headers.order_by()) formset = forms.PlaylistFormSet(queryset=playlists) form = forms.PlaylistForm() if request.method == 'POST': if 'form-TOTAL_FORMS' in request.POST: # formset formset = forms.PlaylistFormSet(request.POST, queryset=playlists) if formset.is_valid(): formset.save() if request.POST.get('bulk_action') == 'delete': for form in formset.bulk_forms: form.instance.delete() elif request.POST.get('bulk_action') == 'public': if request.user_is_admin(): new_status = Playlist.PUBLIC else: new_status = Playlist.WAITING_FOR_MODERATION for form in formset.bulk_forms: if form.instance.status < Playlist.PUBLIC: form.instance.status = new_status form.instance.save() elif request.POST.get('bulk_action') == 'private': for form in formset.bulk_forms: form.instance.status = Playlist.PRIVATE form.instance.save() return HttpResponseRedirect(request.path) else: video = None if 'video' in request.POST and 'name' in request.POST: # Adding a new playlist from a video view. All we get is a # name, so make up the slug. video = get_object_or_404(Video, pk=request.POST['video']) POST = request.POST.copy() POST['slug'] = slugify(request.POST['name']) POST['description'] = '' request.POST = POST form = forms.PlaylistForm(request.POST, instance=Playlist( site=SiteSettings.objects.get_current().site, user=request.user)) if form.is_valid(): playlist = form.save() if video: playlist.add_video(video) return HttpResponseRedirect('%s?playlist=%i' % ( video.get_absolute_url(), playlist.pk)) return HttpResponseRedirect(request.path) return render_to_response('localtv/playlists/index.html', {'form': form, 'headers': headers, 'formset': formset}, context_instance=RequestContext(request))
def bulk_edit(request): if ('just_the_author_field' in request.GET and 'video_id' in request.GET): # generate just the particular form that the user wants template_data = {} form_prefix = request.GET['just_the_author_field'] video = get_object_or_404(Video, pk=int(request.GET['video_id'])) cache_for_form_optimization = {} form = forms.BulkEditVideoForm( instance=video, prefix=form_prefix, cache_for_form_optimization=cache_for_form_optimization) template_data['form'] = form template = 'localtv/admin/bulk_edit_author_widget.html' return render_to_response(template, template_data, context_instance=RequestContext(request)) sitelocation = SiteLocation.objects.get_current() videos = Video.objects.filter(status=Video.ACTIVE, site=sitelocation.site) if 'filter' in request.GET: filter_type = request.GET['filter'] if filter_type == 'featured': videos = videos.exclude(last_featured=None) elif filter_type == 'rejected': videos = Video.objects.filter(status=Video.REJECTED) elif filter_type == 'no-attribution': videos = videos.filter(authors=None) elif filter_type == 'no-category': videos = videos.filter(categories=None) elif filter_type == 'unapproved': videos = Video.objects.filter(status=Video.UNAPPROVED) videos = videos.select_related('feed', 'search', 'site') category = request.GET.get('category', '') try: category = int(category) except ValueError: category = '' if category != '': videos = videos.filter(categories__pk=category).distinct() author = request.GET.get('author', '') try: author = int(author) except ValueError: author = '' if author != '': videos = videos.filter(authors__pk=author).distinct() search_string = request.GET.get('q', '') if search_string != '': videos = videos.filter( Q(description__icontains=search_string) | Q(name__icontains=search_string) | Q(categories__name__icontains=search_string) | Q(user__username__icontains=search_string) | Q(user__first_name__icontains=search_string) | Q(user__last_name__icontains=search_string) | Q(video_service_user__icontains=search_string) | Q(feed__name__icontains=search_string)).distinct() headers = SortHeaders(request, ( ('Video Title', 'name'), ('Source', 'source'), ('Categories', None), ('Date Published', '-when_published'), ('Date Imported', '-when_submitted'), )) sort = headers.order_by() if sort.endswith('source'): reverse = sort.startswith('-') videos = videos.extra( select={'name_lower': 'LOWER(localtv_video.name)'}) videos = videos.order_by( sort.replace('source', 'calculated_source_type')) elif sort.endswith('name'): videos = videos.extra(select={ 'name_lower': 'LOWER(localtv_video.name)' }).order_by(sort.replace('name', 'name_lower')) else: videos = videos.order_by(sort) video_paginator = Paginator(videos, 30) try: page = video_paginator.page(int(request.GET.get('page', 1))) except ValueError: return HttpResponseBadRequest('Not a page number') except EmptyPage: page = video_paginator.page(video_paginator.num_pages) if request.method == 'POST': formset = forms.VideoFormSet(request.POST, request.FILES, queryset=page.object_list) if formset.is_valid(): tier_prevented_some_action = False tier = sitelocation.get_tier() videos_approved_so_far = 0 for form in list(formset.deleted_forms): form.cleaned_data[DELETION_FIELD_NAME] = False form.instance.status = Video.REJECTED form.instance.save() bulk_edits = formset.extra_forms[0].cleaned_data for key in list( bulk_edits.keys()): # get the list because we'll be # changing the dictionary if not bulk_edits[key]: del bulk_edits[key] bulk_action = request.POST.get('bulk_action', '') if bulk_action: bulk_edits['action'] = bulk_action if bulk_edits: for form in formset.initial_forms: if not form.cleaned_data['BULK']: continue for key, value in bulk_edits.items(): if key == 'action': # do something to the video if value == 'delete': form.instance.status = Video.REJECTED elif value == 'approve': if (sitelocation.enforce_tiers() and tier.remaining_videos() <= videos_approved_so_far): tier_prevented_some_action = True else: form.instance.status = Video.ACTIVE videos_approved_so_far += 1 elif value == 'unapprove': form.instance.status = Video.UNAPPROVED elif value == 'feature': if not form.instance.status == Video.ACTIVE: if (sitelocation.enforce_tiers() and tier.remaining_videos() <= videos_approved_so_far): tier_prevented_some_action = True else: form.instance.status = Video.ACTIVE if form.instance.status == Video.ACTIVE: form.instance.last_featured = datetime.now( ) elif value == 'unfeature': form.instance.last_featured = None elif key == 'tags': form.cleaned_data[key] = value elif key == 'categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) elif key == 'authors': form.cleaned_data[key] = value else: setattr(form.instance, key, value) formset.forms = formset.initial_forms # get rid of the extra bulk # edit form formset.can_delete = False formset.save() path_with_success = None if 'successful' in request.GET: path_with_success = request.get_full_path() else: path = request.get_full_path() if '?' in path: path_with_success = path + '&successful' else: path_with_success = path + '?successful' if tier_prevented_some_action: path = path_with_success + '¬_all_actions_done' else: path = path_with_success return HttpResponseRedirect(path) else: formset = forms.VideoFormSet(queryset=page.object_list) return render_to_response( 'localtv/admin/bulk_edit.html', { 'formset': formset, 'headers': headers, 'search_string': search_string, 'page': page, 'categories': Category.objects.filter(site=sitelocation.site), 'users': User.objects.order_by('username') }, context_instance=RequestContext(request))
def manage_sources(request): headers = SortHeaders(request, ( ('Source', 'name__lower'), ('Categories', None), ('User Attribution', None), ('Type', 'type'), ('Import', None), ('Auto Approve', 'auto_approve'))) sort = headers.order_by() if sort.endswith('type'): if sort[0] == '-': orm_sort = '-name__lower' else: orm_sort = 'name__lower' else: orm_sort = sort site_settings = SiteSettings.objects.get_current() feeds = Feed.objects.filter( site=site_settings.site).extra(select={ 'name__lower': 'LOWER(name)'}).order_by(orm_sort) searches = SavedSearch.objects.filter( site=site_settings.site).extra(select={ 'name__lower': 'LOWER(query_string)'}).order_by( orm_sort) search_string = request.GET.get('q', '') if search_string: feeds = feeds.filter(Q(feed_url__icontains=search_string) | Q(name__icontains=search_string) | Q(webpage__icontains=search_string) | Q(description__icontains=search_string)) searches = searches.filter(query_string__icontains=search_string) category = request.GET.get('category') if category: category = get_object_or_404(Category, pk=category) feeds = feeds.filter(auto_categories=category) searches = searches.filter(auto_categories=category) author = request.GET.get('author') if author: author = get_object_or_404(User, pk=author) feeds = feeds.filter(auto_authors=author) searches = searches.filter(auto_authors=author) source_filter = request.GET.get('filter') if source_filter == 'search': queryset = searches elif source_filter in ('feed', 'user'): q = Q(feed_url__iregex=VIDEO_SERVICE_REGEXES[0][1]) for service, regexp in VIDEO_SERVICE_REGEXES[1:]: q = q | Q(feed_url__iregex=regexp) if source_filter == 'user': queryset = feeds.filter(q) else: queryset = feeds.exclude(q) else: reverse = False if orm_sort[0] == '-': reverse = True orm_sort = orm_sort[1:] feeds_list = [(force_unicode(getattr(feed, orm_sort)), feed) for feed in feeds] searches_list = [(force_unicode(getattr(search, orm_sort)), search) for search in searches] queryset = [l[1] for l in sorted(feeds_list + searches_list, reverse=reverse)] if sort.endswith('type'): reverse = (sort[0] == '-') queryset = sorted(queryset, reverse=reverse, key=lambda source: source.source_type().lower()) paginator = Paginator(queryset, 15) try: page = paginator.page(int(request.GET.get('page', 1))) except InvalidPage: raise Http404 if request.method == 'POST': formset = forms.SourceFormset(request.POST, request.FILES, queryset=MockQueryset(page.object_list)) if formset.is_valid(): formset.save() bulk_action = request.POST.get('bulk_action', '') for form in formset.bulk_forms: if bulk_action == 'remove': if request.POST.get('keep'): form.instance.video_set.all().update( search=None, feed=None) form.instance.delete() for form in formset.deleted_forms: if request.POST.get('keep'): form.instance.video_set.all().update(search=None, feed=None) form.instance.delete() path = request.get_full_path() if '?' in path: return HttpResponseRedirect(path + '&successful') else: return HttpResponseRedirect(path + '?successful') else: formset = forms.SourceFormset(queryset=MockQueryset(page.object_list)) return render_to_response('localtv/admin/sources/manage.html', { 'add_feed_form': forms.AddFeedForm(), 'page': page, 'paginator': paginator, 'headers': headers, 'search_string': search_string, 'source_filter': source_filter, 'categories': formset._qs_cache['categories'], 'users': formset._qs_cache['authors'], 'successful': 'successful' in request.GET, 'formset': formset}, context_instance=RequestContext(request))
def index(request): """ Displays the list of playlists for a given user, or the current one if none is specified. """ if not request.user.is_authenticated(): return redirect_to_login(request.get_full_path()) if request.user_is_admin() and request.GET.get("show", None) in ("all", "waiting"): headers = SortHeaders( request, ( ("Playlist", "name"), ("Description", None), ("Slug", None), ("Username", "user__username"), ("Status", None), ("Video Count", "items__count"), ), ) if request.GET.get("show") == "all": playlists = Playlist.objects.all() else: playlists = Playlist.objects.filter(status=Playlist.WAITING_FOR_MODERATION) else: headers = SortHeaders( request, ( ("Playlist", "name"), ("Description", None), ("Slug", None), ("Status", None), ("Video Count", "items__count"), ), ) playlists = Playlist.objects.filter(user=request.user) if headers.ordering == "items__count": playlists = playlists.annotate(Count("items")) playlists = playlists.order_by(headers.order_by()) formset = forms.PlaylistFormSet(queryset=playlists) form = forms.PlaylistForm() if request.method == "POST": if "form-TOTAL_FORMS" in request.POST: # formset formset = forms.PlaylistFormSet(request.POST, queryset=playlists) if formset.is_valid(): formset.save() if request.POST.get("bulk_action") == "delete": for form in formset.bulk_forms: form.instance.delete() elif request.POST.get("bulk_action") == "public": if request.user_is_admin(): new_status = Playlist.PUBLIC else: new_status = Playlist.WAITING_FOR_MODERATION for form in formset.bulk_forms: if form.instance.status < Playlist.PUBLIC: form.instance.status = new_status form.instance.save() elif request.POST.get("bulk_action") == "private": for form in formset.bulk_forms: form.instance.status = Playlist.PRIVATE form.instance.save() return HttpResponseRedirect(request.path) else: video = None if "video" in request.POST and "name" in request.POST: # Adding a new playlist from a video view. All we get is a # name, so make up the slug. video = get_object_or_404(Video, pk=request.POST["video"]) POST = request.POST.copy() POST["slug"] = slugify(request.POST["name"]) POST["description"] = "" request.POST = POST form = forms.PlaylistForm(request.POST, instance=Playlist(user=request.user)) if form.is_valid(): playlist = form.save() if video: playlist.add_video(video) return HttpResponseRedirect("%s?playlist=%i" % (video.get_absolute_url(), playlist.pk)) return HttpResponseRedirect(request.path) return render_to_response( "localtv/playlists/index.html", {"form": form, "headers": headers, "formset": formset}, context_instance=RequestContext(request), )
def bulk_edit(request): if ('just_the_author_field' in request.GET and 'video_id' in request.GET): # generate just the particular form that the user wants template_data = {} form_prefix = request.GET['just_the_author_field'] video = get_object_or_404(Video, pk=int(request.GET['video_id'])) cache_for_form_optimization = {} form = forms.BulkEditVideoForm(instance=video, prefix=form_prefix, cache_for_form_optimization=cache_for_form_optimization) template_data['form'] = form template = 'localtv/admin/bulk_edit_author_widget.html' return render_to_response(template, template_data, context_instance=RequestContext(request)) sitelocation = SiteLocation.objects.get_current() videos = Video.objects.filter(status=Video.ACTIVE, site=sitelocation.site) if 'filter' in request.GET: filter_type = request.GET['filter'] if filter_type == 'featured': videos = videos.exclude(last_featured=None) elif filter_type == 'rejected': videos = Video.objects.filter(status=Video.REJECTED) elif filter_type == 'no-attribution': videos = videos.filter(authors=None) elif filter_type == 'no-category': videos = videos.filter(categories=None) elif filter_type == 'unapproved': videos = Video.objects.filter(status=Video.UNAPPROVED) videos = videos.select_related('feed', 'search', 'site') category = request.GET.get('category', '') try: category = int(category) except ValueError: category = '' if category != '': videos = videos.filter(categories__pk=category).distinct() author = request.GET.get('author', '') try: author = int(author) except ValueError: author = '' if author != '': videos = videos.filter(authors__pk=author).distinct() search_string = request.GET.get('q', '') if search_string != '': videos = videos.filter( Q(description__icontains=search_string) | Q(name__icontains=search_string) | Q(categories__name__icontains=search_string) | Q(user__username__icontains=search_string) | Q(user__first_name__icontains=search_string) | Q(user__last_name__icontains=search_string) | Q(video_service_user__icontains=search_string) | Q(feed__name__icontains=search_string)).distinct() headers = SortHeaders(request, ( ('Video Title', 'name'), ('Source', 'source'), ('Categories', None), ('Date Published', '-when_published'), ('Date Imported', '-when_submitted'), )) sort = headers.order_by() if sort.endswith('source'): reverse = sort.startswith('-') videos = videos.extra(select={ 'name_lower':'LOWER(localtv_video.name)'}) videos = videos.order_by(sort.replace('source', 'calculated_source_type')) elif sort.endswith('name'): videos = videos.extra(select={ 'name_lower':'LOWER(localtv_video.name)'}).order_by( sort.replace('name', 'name_lower')) else: videos = videos.order_by(sort) video_paginator = Paginator(videos, 30) try: page = video_paginator.page(int(request.GET.get('page', 1))) except ValueError: return HttpResponseBadRequest('Not a page number') except EmptyPage: page = video_paginator.page(video_paginator.num_pages) if request.method == 'POST': formset = forms.VideoFormSet(request.POST, request.FILES, queryset=page.object_list) if formset.is_valid(): tier_prevented_some_action = False tier = sitelocation.get_tier() videos_approved_so_far = 0 for form in list(formset.deleted_forms): form.cleaned_data[DELETION_FIELD_NAME] = False form.instance.status = Video.REJECTED form.instance.save() bulk_edits = formset.extra_forms[0].cleaned_data for key in list(bulk_edits.keys()): # get the list because we'll be # changing the dictionary if not bulk_edits[key]: del bulk_edits[key] bulk_action = request.POST.get('bulk_action', '') if bulk_action: bulk_edits['action'] = bulk_action if bulk_edits: for form in formset.initial_forms: if not form.cleaned_data['BULK']: continue for key, value in bulk_edits.items(): if key == 'action': # do something to the video if value == 'delete': form.instance.status = Video.REJECTED elif value == 'approve': if (sitelocation.enforce_tiers() and tier.remaining_videos() <= videos_approved_so_far): tier_prevented_some_action = True else: form.instance.status = Video.ACTIVE videos_approved_so_far += 1 elif value == 'unapprove': form.instance.status = Video.UNAPPROVED elif value == 'feature': if not form.instance.status == Video.ACTIVE: if (sitelocation.enforce_tiers() and tier.remaining_videos() <= videos_approved_so_far): tier_prevented_some_action = True else: form.instance.status = Video.ACTIVE if form.instance.status == Video.ACTIVE: form.instance.last_featured = datetime.now() elif value == 'unfeature': form.instance.last_featured = None elif key == 'tags': form.cleaned_data[key] = value elif key == 'categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) elif key == 'authors': form.cleaned_data[key] = value else: setattr(form.instance, key, value) formset.forms = formset.initial_forms # get rid of the extra bulk # edit form formset.can_delete = False formset.save() path_with_success = None if 'successful' in request.GET: path_with_success = request.get_full_path() else: path = request.get_full_path() if '?' in path: path_with_success = path + '&successful' else: path_with_success = path + '?successful' if tier_prevented_some_action: path = path_with_success + '¬_all_actions_done' else: path = path_with_success return HttpResponseRedirect(path) else: formset = forms.VideoFormSet(queryset=page.object_list) return render_to_response('localtv/admin/bulk_edit.html', {'formset': formset, 'headers': headers, 'search_string': search_string, 'page': page, 'categories': Category.objects.filter( site=sitelocation.site), 'users': User.objects.order_by('username')}, context_instance=RequestContext(request))