Created
June 12, 2020 16:00
-
-
Save JackDaniels07/b6f8dedc958b0c484ef87b0c68378764 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) # |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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