스파르타코딩클럽
내일배움캠프 AI 웹개발자양성과정 2회차
DRF 강의 4일차 과제
0. 과제내용
- admin 페이지에 user admin을 등록하고, userprofile 테이블을 user admin 페이지에서 같이 보고 설정 할 수 있도록 해주세요
- article 테이블에 <노출 시작 일자, 노출 종료 일자>을 추가해주세요
- article view에 게시글 조회 기능을 만들되, 현재 일자를 기준으로 노출 시작 일자와 노출 종료 일자 사이에 있는 항목들만 리턴해주도록 필터를 설정해주세요
- 리턴 데이터는 게시글 작성일 기준으로 정렬하여 최근 쓴 글이 가장 먼저 올라오도록 해주세요
- 기존 article 생성 기능을 유지하되, article은 admin user 혹은 가입 후 7일이 지난 사용자만 생성 가능하도록 해주세요
- 조회는 로그인 한 사용자에 대해서만 가능하도록 설정해주세요
1. admin 페이지에 user admin을 등록하고, userprofile 테이블을 user admin 페이지에서 같이 보고 설정 할 수 있도록 해주세요
from django.contrib import admin
from .models import User, UserProfile, Hobby
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
class UserProfileInline(admin.StackedInline):
model = UserProfile
class UserAdmin(BaseUserAdmin):
list_display = ('id', 'username', 'fullname', 'email')
list_display_links = ('username', )
list_filter = ('username', )
search_fields = ('username', 'email', )
fieldsets = (
("info", {'fields': ('username', 'password', 'email', 'fullname', 'join_date',)}),
('Permissions', {'fields': ('is_admin', 'is_active', )}),)
filter_horizontal = []
def get_readonly_fields(self, request, obj=None):
if obj:
return ('username', 'join_date', )
else:
return ('join_date', )
inlines = (
UserProfileInline,
)
admin.site.register(User, UserAdmin)
admin.site.register(UserProfile)
admin.site.register(Hobby)
2. article 테이블에 <노출 시작 일자, 노출 종료 일자>을 추가해주세요
class Article(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
content = models.TextField()
category = models.ManyToManyField(Category)
show_start_date = models.DateTimeField('노출 시작 일자', auto_now_add=True)
show_end_date = models.DateTimeField('노출 종료 일자', default="2022-06-25 00:00:00")
def __str__(self):
return f'{self.title} - {self.author}'
3. article view에 게시글 조회 기능을 만들되, 현재 일자를 기준으로 노출 시작 일자와 노출 종료 일자 사이에 있는 항목들만 리턴해주도록 필터를 설정해주세요
- 리턴 데이터는 게시글 작성일 기준으로 정렬하여 최근 쓴 글이 가장 먼저 올라오도록 해주세요
class UserArticle(APIView):
def get(self, request):
user = request.user
if not user.is_authenticated:
msg = '로그인을 해주세요.'
return Response({'message': msg})
show_date_now = timezone.now()
qyery = Q(author=user) & Q(show_start_date__lte=show_date_now) & Q(show_end_date__gte=show_date_now)
articles = Article.objects.filter(qyery).order_by("show_start_date")
return Response(ArticleSerializer(articles, many=True).data)
def post(self, request):
...
4. 기존 article 생성 기능을 유지하되, article은 admin user 혹은 가입 후 7일이 지난 사용자만 생성 가능하도록 해주세요
- 조회는 로그인 한 사용자에 대해서만 가능하도록 설정해주세요
class IsAdminOrRegistedMoreThanAWeekUser(BasePermission):
"""
관리자 또는 가입일 기준 7일 이상 지난 사용자만 접근 가능
"""
message = '관리자 또는 가입 후 7일 이상 지난 사용자만 게시글을 작성하실 수 있습니다.'
SAFE_METHODS = ('GET', )
def has_permission(self, request, view):
user = request.user
if not user.is_authenticated:
response ={
"detail": "서비스를 이용하기 위해 로그인 해주세요.",
}
raise GenericAPIException(status_code=status.HTTP_401_UNAUTHORIZED, detail=response)
if user.is_authenticated and user.is_admin:
return True
if user.is_authenticated and request.user.join_date < (timezone.now() - timedelta(days=7)):
return True
if user.is_authenticated and request.method in self.SAFE_METHODS:
return True
return False
from user.permissions import IsAdminOrRegistedMoreThanAWeekUser
class UserArticle(APIView):
permission_classes = [IsAdminOrRegistedMoreThanAWeekUser]
def get(self, request):
...
def post(self, request):
...
Github
https://github.com/kimphysicsman/nbcamp-drf-2