Skip to content

Instantly share code, notes, and snippets.

@JackDaniels07
Created June 12, 2020 16:00
Show Gist options
  • Save JackDaniels07/b6f8dedc958b0c484ef87b0c68378764 to your computer and use it in GitHub Desktop.
Save JackDaniels07/b6f8dedc958b0c484ef87b0c68378764 to your computer and use it in GitHub Desktop.
from functools import wraps
from django.db.models import F
from django.db import transaction
from django.utils import timezone
from .models import User, Post, PostsStatistic
def counted(f):
@wraps(f)
def decorator(request, *args, **kwargs):
with transaction.atomic():
counter, created = PostsStatistic.objects.get_or_create( author=kwargs['username'], article=kwargs['post_id'], date=timezone.now())
counter.views += 1
counter.save()
return f(request, *args, **kwargs)
return decorator
from django.contrib.auth import get_user_model
from django.db import models
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.conf import settings
from django.urls import reverse
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.db.models import F
User = get_user_model()
class Post(models.Model):
text = models.TextField()
pub_date = models.DateTimeField('date published', auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='author_posts')
group = models.ForeignKey(Group, on_delete=models.SET_NULL,
null=True, blank=True, related_name='group_posts')
image = models.ImageField(upload_to='posts/', blank=True, null=True)
def __str__(self):
return self.text[:50]
def get_absolute_url(self):
return reverse('post', kwargs={'username': self.user, 'post_id': self.post.id})
class PostsStatistic(models.Model):
article = models.OneToOneField(Post, on_delete=models.CASCADE, primary_key=True)
author = models.ForeignKey(User, on_delete=models.CASCADE) # внешний ключ на статью
date = models.DateField('Дата', auto_now_add=True) # дата
views = models.IntegerField('Просмотры', default=1) #
import datetime
from django.views.generic import ListView
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse_lazy, reverse
from django.views.decorators.cache import cache_page
from django.core.mail import send_mail
from django.views import View
from django.shortcuts import render_to_response, get_object_or_404
from django.utils import timezone
from django.db.models import Sum
from .decorators import counted
from .forms import PostForm, CommentForm, EmailPostForm, SearchForm
from .models import Group, Post, User, Follow, Comment, PostsStatistic
def index(request):
post_list = Post.objects.order_by('-pub_date').all()
paginator = Paginator(post_list, 10)
page_number = request.GET.get('page')
page = paginator.get_page(page_number)
context = {
'page': page,
'paginator': paginator,
"form": SearchForm()
}
return render(request, 'index.html', context)
def group_posts(request, slug):
group = get_object_or_404(Group, slug=slug)
posts_list = Post.objects.filter(group=group).order_by('-pub_date')
paginator = Paginator(posts_list, 10)
page_number = request.GET.get('page')
page = paginator.get_page(page_number)
context = {
'page': page,
'paginator': paginator,
'group': group,
}
return render(request, 'group.html', context)
@login_required
def new_post(request):
form = PostForm(request.POST or None, files=request.FILES or None)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
success_url = reverse('index')
return redirect(success_url)
return render(request, 'new.html', {'form': form})
def profile(request, username):
author = get_object_or_404(User, username=username)
post_author = Post.objects.filter(author=author).order_by('-pub_date').all()
paginator = Paginator(post_author, 5)
page_number = request.GET.get('page')
page = paginator.get_page(page_number)
context = {
'author': author,
'post_author': post_author,
'page': page,
'paginator': paginator,
}
return render(request, 'profile.html', context)
@counted
def post_view(request, username, post_id):
author = get_object_or_404(User, username=username)
post = get_object_or_404(Post, id=post_id)
author_post_count = Post.objects.filter(author=author).count()
items = post.comments.filter(post=post_id).order_by('-created')
context = {
'author' : author,
'author_post_count': author_post_count,
'post': post,
'form': CommentForm(),
'items': items,
}
return render(request, 'post.html', context)
def get_static(request):
popular = PostsStatistic.objects.filter(date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]).order_by('-views')[:5]
context= {
'popular_list': popular,
}
return render(request, 'article.html', context)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment