from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse, Http404, HttpResponseRedirect from django.template import loader from django.urls import reverse from django.core.paginator import Paginator from django.conf import settings from django.contrib.auth.forms import UserCreationForm from django.contrib import messages from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from .models import Post, Comment from .forms import PostForm, CustomUserCreationForm, SigninForm from datetime import datetime import logging import uuid #Users def register(request): if request.method == 'POST': f = CustomUserCreationForm(request.POST) if f.is_valid(): f.save() messages.success(request, 'Account created successfully') return redirect('register') else: f = CustomUserCreationForm() return render(request, 'news/user/register.html', {'form': f}) def signin(request): if request.method == 'POST': f = SigninForm(request.POST) if f.is_valid(): username = f.cleaned_data['username'] password = f.cleaned_data['password'] user = authenticate(username=username, password=password) if user is not None: login(request, user) return HttpResponseRedirect(reverse('news:index')) else: messages.success(request, 'Sign-in failed') return HttpResponseRedirect(reverse('news:signin')) else: f = SigninForm() return render(request, 'news/user/signin.html', {'form': f}) def logout_view(request): logout(request) return HttpResponseRedirect(reverse('news:index')) #Post def index(request): latest_post_list = Post.objects.filter(state=1).order_by('-date') paginator = Paginator(latest_post_list, 25) page = request.GET.get('page') posts = paginator.get_page(page) context = { 'latest_post_list' : posts } return render(request, 'news/index.html', context) def post(request, post_id): post = get_object_or_404(Post, pk=post_id) return render(request, 'news/post.html', {'post': post}) @login_required def submission(request): if request.method == 'POST': form = PostForm(request.POST, request.FILES) if form.is_valid(): post = Post.objects.create(author=request.user,date=datetime.today()) post.title = form.cleaned_data['title'] post.body = form.cleaned_data['body'] post.url = form.cleaned_data['url'] filename = str(uuid.uuid4()) handle_uploaded_file(filename, request.FILES['image']) post.image_url = filename post.state = 1 post.save() return HttpResponseRedirect(reverse('news:submitted')) # if a GET (or any other method) we'll create a blank form else: form = PostForm() return render(request, 'news/submission.html', {'form': form}) def handle_uploaded_file(filename, f): with open(settings.MEDIA_ROOT + filename, 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk) def submitted(request): return render(request, 'news/submitted.html', {}) def comment(request, post_id): comment = Comment(author=request.user,date=datetime.today()) comment.post = get_object_or_404(Post, pk=post_id) comment.body = request.POST['body'] comment.save() return HttpResponseRedirect(reverse('news:post', args=(post_id,)))