diff --git a/blogging/admin.py b/blogging/admin.py index 1175916..252e3ee 100644 --- a/blogging/admin.py +++ b/blogging/admin.py @@ -2,5 +2,17 @@ from blogging.models import Post, Category -admin.site.register(Post) -admin.site.register(Category) +class CategoryInline(admin.StackedInline): + model = Category.posts.through + + +class PostAdmin(admin.ModelAdmin): + inlines = [CategoryInline, ] + + +class CategoryAdmin(admin.ModelAdmin): + exclude = ('posts', ) + + +admin.site.register(Post, PostAdmin) +admin.site.register(Category, CategoryAdmin) diff --git a/mysite/feeds.py b/mysite/feeds.py new file mode 100644 index 0000000..5faaac1 --- /dev/null +++ b/mysite/feeds.py @@ -0,0 +1,22 @@ +from django.contrib.syndication.views import Feed +from django.urls import reverse +from blogging.models import Post + + +class LatestEntriesFeed(Feed): + title = "Blog entries" + link = "/posts/" + description = "Most recent blog entries" + + def items(self): + published = Post.objects.exclude(published_date__exact=None) + return published.order_by('-published_date')[:5] + + def item_title(self, item): + return item.title + + def item_description(self, item): + return item.text + + def item_link(self, item): + return reverse('blog_detail', args=[item.pk]) \ No newline at end of file diff --git a/mysite/production.py b/mysite/production.py new file mode 100644 index 0000000..025698f --- /dev/null +++ b/mysite/production.py @@ -0,0 +1,14 @@ +import os +import dj_database_url +from .settings import * + + +DATABASES = { + 'default': dj_database_url.config(default='sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')) + } + +DEBUG = False +TEMPLATE_DEBUG = False +ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS'), 'localhost'] +STATIC_ROOT = os.path.join(BASE_DIR, 'static') +SECRET_KEY = os.environ.get('SECRET_KEY') \ No newline at end of file diff --git a/mysite/quickstart/__init__.py b/mysite/quickstart/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mysite/quickstart/admin.py b/mysite/quickstart/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/mysite/quickstart/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/mysite/quickstart/apps.py b/mysite/quickstart/apps.py new file mode 100644 index 0000000..3308061 --- /dev/null +++ b/mysite/quickstart/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class QuickstartConfig(AppConfig): + name = 'quickstart' diff --git a/mysite/quickstart/migrations/__init__.py b/mysite/quickstart/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mysite/quickstart/models.py b/mysite/quickstart/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/mysite/quickstart/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/mysite/quickstart/serializers.py b/mysite/quickstart/serializers.py new file mode 100644 index 0000000..942dfd4 --- /dev/null +++ b/mysite/quickstart/serializers.py @@ -0,0 +1,27 @@ +from django.contrib.auth.models import User, Group +from blogging.models import Post, Category +from rest_framework import serializers + + +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ['url', 'username', 'email', 'groups'] + + +class GroupSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Group + fields = ['url', 'name'] + + +class PostSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Post + fields = ['title', 'text', 'author', 'created_date', 'modified_date', 'published_date'] + + +class CategorySerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Category + fields = ['name', 'description', 'posts'] \ No newline at end of file diff --git a/mysite/quickstart/tests.py b/mysite/quickstart/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/mysite/quickstart/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/mysite/quickstart/views.py b/mysite/quickstart/views.py new file mode 100644 index 0000000..fac9561 --- /dev/null +++ b/mysite/quickstart/views.py @@ -0,0 +1,30 @@ +from django.shortcuts import render +from django.contrib.auth.models import User, Group +from blogging.models import Post, Category +from rest_framework import viewsets +from rest_framework import permissions +from mysite.quickstart.serializers import UserSerializer, GroupSerializer, PostSerializer, CategorySerializer + + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all().order_by('-date_joined') + serializer_class = UserSerializer + permission_classes = [permissions.IsAuthenticated] + + +class GroupViewSet(viewsets.ModelViewSet): + queryset = Group.objects.all() + serializer_class = GroupSerializer + permission_classes = [permissions.IsAuthenticated] + + +class PostViewSet(viewsets.ModelViewSet): + queryset = Post.objects.all().order_by('-created_date') + serializer_class = PostSerializer + permission_classes = [permissions.IsAuthenticated] + + +class CategoryViewSet(viewsets.ModelViewSet): + queryset = Category.objects.all() + serializer_class = CategorySerializer + permission_classes = [permissions.IsAuthenticated] \ No newline at end of file diff --git a/mysite/settings.py b/mysite/settings.py index 14e4a11..663aaa4 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -39,6 +39,7 @@ 'django.contrib.staticfiles', 'polling', 'blogging', + 'rest_framework', ] MIDDLEWARE = [ @@ -123,3 +124,8 @@ LOGIN_URL = '/login/' LOGIN_REDIRECT_URL = '/' + +REST_FRAMEWORK = { + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 10, +} diff --git a/mysite/templates/base.html b/mysite/templates/base.html index 4bb0230..9835a36 100644 --- a/mysite/templates/base.html +++ b/mysite/templates/base.html @@ -1,4 +1,4 @@ -{% load staticfiles %} +{% load static %} diff --git a/mysite/urls.py b/mysite/urls.py index 446cd8f..4645143 100644 --- a/mysite/urls.py +++ b/mysite/urls.py @@ -16,12 +16,25 @@ from django.contrib import admin from django.urls import path, include from django.contrib.auth.views import LoginView, LogoutView +from rest_framework import routers +from mysite.quickstart import views +from mysite.feeds import LatestEntriesFeed + + +router = routers.DefaultRouter() +router.register(r'users', views.UserViewSet) +router.register(r'groups', views.GroupViewSet) +router.register(r'posts', views.PostViewSet) +router.register(r'categories', views.CategoryViewSet) urlpatterns = [ - path('', include('blogging.urls')), + path('', include(router.urls)), + path('blogging/', include('blogging.urls')), path('polling/', include('polling.urls')), path('admin/', admin.site.urls), path('login/', LoginView.as_view(template_name='login.html'), name="login"), path('logout/', LogoutView.as_view(next_page='/'), name="logout"), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), + path('latest/feed/', LatestEntriesFeed()), ] diff --git a/requirements.txt b/requirements.txt index 81580ab..4cfe887 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,8 @@ -Django==2.1.1 +asgiref==3.3.1 +dj-database-url==0.5.0 +Django==3.1.7 +djangorestframework==3.12.2 +psycopg2==2.7.7 +psycopg2-binary==2.8.6 pytz==2019.3 +sqlparse==0.4.1