import datetime from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect, HttpResponse from django.utils.timezone import utc from django.contrib.auth.decorators import login_required from stories.models import Story from stories.forms import StoryForm def score(story, gravity=1.8, timebase=120): points = (story.points - 1)**0.8 now = datetime.datetime.utcnow().replace(tzinfo=utc) age = int((now - story.created_at).total_seconds())/60 return points/(age+timebase)**1.8 def top_stories(top=180, consider=1000): latest_stories = Story.objects.all().order_by('-created_at')[:consider] ranked_stories = sorted([(score(story), story) for story in latest_stories], reverse=True) return [story for _, story in ranked_stories][:top] def index(request): stories = top_stories(top=30) if request.user.is_authenticated(): liked_stories = request.user.liked_stories.filter(id__in=[story.id for story in stories]) else: liked_stories = [] return render(request, 'stories/index.html', { 'stories': stories, 'user': request.user, 'liked_stories': liked_stories }) @login_required def story(request): if request.method == 'POST': form = StoryForm(request.POST) if form.is_valid(): story = form.save(commit=False) story.moderator = request.user story.save() return HttpResponseRedirect('/') else: form = StoryForm() return render(request, 'stories/story.html', {'form': form}) def story_detail(request, story_id): return HttpResponse("Story Detail View") @login_required def vote(request): story = get_object_or_404(Story, pk=request.POST.get('story')) story.points += 1 story.save() user = request.user user.liked_stories.add(story) user.save() return HttpResponse()