내일배움캠프 - DRF 4일차 과제

Dongwoo Kim·2022년 6월 21일
0

내일배움캠프 - DRF

목록 보기
7/12

스파르타코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

DRF 강의 4일차 과제

0. 과제내용

  1. admin 페이지에 user admin을 등록하고, userprofile 테이블을 user admin 페이지에서 같이 보고 설정 할 수 있도록 해주세요
  2. article 테이블에 <노출 시작 일자, 노출 종료 일자>을 추가해주세요
  3. article view에 게시글 조회 기능을 만들되, 현재 일자를 기준으로 노출 시작 일자와 노출 종료 일자 사이에 있는 항목들만 리턴해주도록 필터를 설정해주세요
  • 리턴 데이터는 게시글 작성일 기준으로 정렬하여 최근 쓴 글이 가장 먼저 올라오도록 해주세요
  1. 기존 article 생성 기능을 유지하되, article은 admin user 혹은 가입 후 7일이 지난 사용자만 생성 가능하도록 해주세요
  • 조회는 로그인 한 사용자에 대해서만 가능하도록 설정해주세요

1. admin 페이지에 user admin을 등록하고, userprofile 테이블을 user admin 페이지에서 같이 보고 설정 할 수 있도록 해주세요

# user/admin.py
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 테이블에 <노출 시작 일자, 노출 종료 일자>을 추가해주세요

# blog/models.py
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에 게시글 조회 기능을 만들되, 현재 일자를 기준으로 노출 시작 일자와 노출 종료 일자 사이에 있는 항목들만 리턴해주도록 필터를 설정해주세요

  • 리턴 데이터는 게시글 작성일 기준으로 정렬하여 최근 쓴 글이 가장 먼저 올라오도록 해주세요
# blog/views.py

# 사용자 게시글 기능
class UserArticle(APIView):
    # 게시글 조회 기능
    # 로그인한 사용자만 가능
    def get(self, request):
        user = request.user
        if not user.is_authenticated:
            msg = '로그인을 해주세요.'
            return Response({'message': msg})
        
        # articles = Article.objects.filter(author=user)

        # 현재 시간 기준 : 노출 시작 일자와 종료 일자 사이에 있는 게시글 만 보여주기
        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일이 지난 사용자만 생성 가능하도록 해주세요

  • 조회는 로그인 한 사용자에 대해서만 가능하도록 설정해주세요
# user/permissions.py
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
        
# blog/views.py
from user.permissions import IsAdminOrRegistedMoreThanAWeekUser
# 사용자 게시글 기능
class UserArticle(APIView):
    permission_classes = [IsAdminOrRegistedMoreThanAWeekUser]

    # 게시글 조회 기능
    # 로그인한 사용자만 가능
    def get(self, request):
    	...

	# 게시글 작성 기능
    # 관리자 or 가입 후 7일 지난 사용자만 가능
    def post(self, request):
    	...

Github

https://github.com/kimphysicsman/nbcamp-drf-2

profile
kimphysicsman

0개의 댓글