# -*- coding: utf-8 -*- import json from django.http import HttpResponse, HttpResponseNotFound from django.views.generic.list_detail import object_detail from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from .models import SciBlog, ResultContent from .forms import SciBlogSearchForm, ProperNounSearchForm from info.forms import QuerySearchForm import itertools def blog_detail(request, blogid, block): u''' /blog/1/ 一个简单的显式blog详细内容的view函数 ''' block = block or "source" template = 'sciblog/blog_detail_%s.html' % block blog = get_object_or_404(SciBlog, id=blogid) blockid = block # 用户已经收藏? collected = request.user.is_authenticated() and blog.collected_by.filter(id=request.user.id) # 用户已经懂了? understood = request.user.is_authenticated() and blog.catched_by.filter(id=request.user.id) # 与该文章相关的段落注释和专业名词 annotations = blog.annotations.all_json(user=request.user) return render(request, template, locals()) def blog_index(request): """ Temporary handler for index page render You might want to rename/relocate this """ return render(request,"sciblog/index.html",locals()) def generator_has_content(generator): ''' Returns (has_content, generator) based on the input generator If generator has at least one item, has_content is True. Otherwise, has_content is False. generator will return all items in the input generator ''' #Simplified logic using itertools checkgen, outputgen = itertools.tee(generator, 2) has_content = False for item in checkgen: has_content = True break return (has_content, outputgen) def objects_of_sqs(sqs): u''' 返回search squery set结果对应的model object ''' return itertools.imap(lambda x: x.object, sqs) def limit(resultSet, count = 10): return itertools.islice(resultSet, count) def query(request): u''' Blog查询 ''' tab = 'list' search_history = request.session.get('search_history', '').split('&&&') if request.method == 'GET': form = SciBlogSearchForm(request.GET) elif request.method == 'POST': form = SciBlogSearchForm(request.POST) if form.is_valid() and form.cleaned_data['q']: q = form.cleaned_data['q'] search_history = [s for s in search_history if s != q] search_history.insert(0, q) search_history = search_history[0:5] #只保存最新的五条搜索记录 request.session['search_history'] = '&&&'.join(search_history) results = form.search() (has_blogs, blogs) = generator_has_content(limit(objects_of_sqs(results),10)) questuinsqs = QuerySearchForm(request.GET).search() (has_relate_questions, questions) = generator_has_content(limit(objects_of_sqs(questuinsqs),8)) ppnounsqs = ProperNounSearchForm(request.GET).search() (hasppnouns, ppnouns) = generator_has_content(limit(objects_of_sqs(ppnounsqs),10)) return render(request, 'sciblog/blog_list.html', locals()) else: (has_blogs, blogs) = generator_has_content(limit(SciBlog.objects.all(),10)) return render(request, 'sciblog/blog_list.html', locals()) @login_required def blog_collection(request): blogs = request.user.blog_collection.all() tab = 'collection' has_blogs = len(blogs) > 0 ppnouns = request.user.annotation_collection.all() has_ppnouns = request.user.annotation_collection.count() > 0 return render(request, 'sciblog/blog_list.html', locals()) @login_required def add_user_to_m2m(request, objid, m2m ='collected_by', model = SciBlog): u''' 响应收藏按钮和'懂了'按钮的点击 ''' result = {"error":False, 'added':True} result['id'] = objid result['model'] = model._meta.verbose_name_plural user = request.user try: obj = model.objects.get(id=objid) m2m = getattr(obj, m2m) if not m2m.filter(id = user.id): # 还没有收藏或点击懂了 m2m.add(user) else: # 已经收藏或点击了懂了 m2m.remove(user) result['added'] = False result['times'] = m2m.count() except: result['error'] = True result['added'] = False return HttpResponse(json.dumps(result), mimetype = 'application/json') def show_result(request, resultid): result = get_object_or_404(ResultContent, id=resultid) blog = result.blog return render(request, 'sciblog/blog_detail_results-detail.html', locals())