Source code for book.views.people

"""인스타그램 내용 파싱."""
import requests
from book import models, utils
from book.nav import get_render_dict
from book.templatetags import book_extras
from celery import shared_task
from django.contrib.auth.decorators import user_passes_test
from django.db.models import Count
from django.shortcuts import render


[docs]@user_passes_test(lambda u: u.is_superuser) def people(request): """ 이미지 제공. :param request: :return: """ render_dict = get_render_dict("people") query = request.GET.get("query", "") unclassified = models.PeopleImage.objects.filter(selected=None, rating=None) unclassified_count = unclassified.count() distinct = ( unclassified.order_by() .values("user_id") .distinct() .annotate(Count("id")) .order_by("id__count") ) distinct = utils.to_table(distinct, 5) render_dict["distinct"] = distinct query_count = unclassified.filter(title__contains=query).count() image_list = unclassified.filter(title__contains=query).order_by("?")[:100] render_dict["unclassified_count"] = unclassified_count render_dict["query_count"] = query_count render_dict["distinct"] = distinct if query: id_select = unclassified.filter(url__contains=query) render_dict["query_count"] += id_select.count() render_dict["image_list"] = id_select[:50].values() | image_list.values() else: render_dict["image_list"] = image_list.values() render_dict["query"] = query return render(request, "book/people/people.html", render_dict)
[docs]@user_passes_test(lambda u: u.is_superuser) def people_result(request, page=1): """분류 결과 선택.""" selected = request.GET.get("arg", "True") render_dict = get_render_dict("people_result_{}".format(selected)) render_dict["arg"] = selected selected = selected == "True" query = request.GET.get("query", "") selected_list = models.PeopleImage.objects.filter(selected=selected) distinct = ( selected_list.order_by() .values("user_id") .distinct() .annotate(Count("id")) .order_by("-id__count") ) distinct = utils.to_table(distinct, 5) render_dict["distinct"] = distinct if query: queried_list = selected_list.filter(url__contains=query) selected_list = queried_list | selected_list.filter(title__contains=query) else: selected_list = models.PeopleImage.objects.filter(selected=selected) selected_list = selected_list.order_by("-id") p, page_info = utils.get_page_info(selected_list, page, 120) row_count = 6 people_table = utils.to_table(p, row_count) render_dict["people_table"] = people_table render_dict["page_info"] = page_info render_dict["query"] = query return render(request, "book/people/people_result.html", render_dict)
[docs]@user_passes_test(lambda u: u.is_superuser) def people_high_expectation(request): """우선순위 순으로 보여줌.""" render_dict = get_render_dict("people_high_expectation") query = request.GET.get("query", "") order = request.GET.get("order", "decreasing") selected_list = models.Rating.objects.filter( image__selected=None, deep_model__latest=True ) render_dict["unclassified_count"] = selected_list.count() if query: queried_list = selected_list.filter(image__url__contains=query)[:100] selected_list = ( queried_list | selected_list.filter(image__title__contains=query)[:100] ) render_dict["query_count"] = selected_list.count() if order == "decreasing": selected_list = selected_list.order_by("-positive")[:100] elif order == "increasing": selected_list = selected_list.order_by("positive")[:100] else: selected_list = selected_list.order_by("?")[:100] unclassified = [rating.image for rating in selected_list] render_dict["rating"] = selected_list render_dict["image_list"] = unclassified render_dict["query"] = query return render(request, "book/people/people.html", render_dict)
@shared_task def get_new_people_links(): """ 인스타그램 text 속에 있는 user link 추출 후 링크 제공. :return: """ selected_list = models.PeopleImage.objects.filter(title__contains="@").filter( content_parsed=None )[:100] new_id = 0 user_names = set() for selected_image in selected_list: names = book_extras.user_pattern.findall(selected_image.title) for name in names: if not models.User.objects.filter(username=name).exists(): user_names.add(name) new_id += 1 selected_image.content_parsed = True selected_image.save() while user_names: user = user_names.pop() r = requests.get("https://www.instagram.com/" + user) if r.status_code == 200: models.User(username=user, checked=None).save() else: models.User(username=user, checked=False).save()
[docs]@user_passes_test(lambda u: u.is_superuser) def people_result_download(_, selected, page): """이미지 통합 다운로드.""" image_list = models.PeopleImage.objects.filter(selected=selected).only( "url", "selected", "page" ) count = 1000 return utils.get_compressed_result(image_list, count, page)