Skip to content

Commit

Permalink
Merge pull request #30 from wafflestudio18-5/Feature/#29
Browse files Browse the repository at this point in the history
Feature/#29
  • Loading branch information
gyusang authored Jan 3, 2021
2 parents 52d034f + b4e3e7d commit 34270e6
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 3 deletions.
52 changes: 51 additions & 1 deletion wadium/story/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,53 @@
from django.contrib import admin

# Register your models here.
from .models import Story


class TrendingListFilter(admin.SimpleListFilter):
title = 'Trending'

parameter_name = 'trending'

def lookups(self, request, model_admin):
return (
('true', 'is trending'),
('false', 'is not trending'),
)

def queryset(self, request, queryset):
if self.value() == 'true':
return queryset.filter(trending_order__gte=1,
trending_order__lte=6).order_by('trending_order')
if self.value() == 'false':
return queryset.filter(trending_order=None)


class MainListFilter(admin.SimpleListFilter):
title = 'Main'

parameter_name = 'main'

def lookups(self, request, model_admin):
return (
('true', 'is main'),
('false', 'is not main'),
)

def queryset(self, request, queryset):
if self.value() == 'true':
return queryset.filter(main_order__gte=1,
main_order__lte=6).order_by('trending_order')
if self.value() == 'false':
return queryset.filter(main_order=None)


class StoryAdmin(admin.ModelAdmin):
list_display = ('id', 'writer_id', 'writer', 'title', 'main_order', 'trending_order', 'published_at')
list_display_links = ('title',)
list_editable = ('main_order', 'trending_order')
list_filter = (MainListFilter, TrendingListFilter)
ordering = ('-published_at',)
search_fields = ['writer__username', 'writer__userprofile__name']


admin.site.register(Story, StoryAdmin)
23 changes: 23 additions & 0 deletions wadium/story/migrations/0006_auto_20210102_1558.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 3.1.3 on 2021-01-02 17:53

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('story', '0005_auto_20210101_1728'),
]

operations = [
migrations.AddField(
model_name='story',
name='main_order',
field=models.PositiveSmallIntegerField(blank=True, choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], null=True),
),
migrations.AddField(
model_name='story',
name='trending_order',
field=models.PositiveSmallIntegerField(blank=True, choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6')], null=True),
),
]
5 changes: 5 additions & 0 deletions wadium/story/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ class Story(models.Model):
updated_at = models.DateTimeField(auto_now=True)
published = models.BooleanField(default=False)
published_at = models.DateTimeField(null=True)
MAIN_ORDER_CHOICES = list(zip(range(1, 6), map(str, range(1, 6))))
TRENDING_ORDER_CHOICES = list(zip(range(1, 7), map(str, range(1, 7))))
main_order = models.PositiveSmallIntegerField(null=True, blank=True, choices=MAIN_ORDER_CHOICES)
trending_order = models.PositiveSmallIntegerField(null=True, blank=True, choices=TRENDING_ORDER_CHOICES)
# blank set to integer fields to pass validation in admin site


class StoryComment(models.Model):
Expand Down
43 changes: 41 additions & 2 deletions wadium/story/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,18 @@ class StoryViewSet(viewsets.GenericViewSet):
pagination_class = StoryPagination

cache_story_page1_key = 'story:list-1'
cache_story_main_key = 'story:main'
cache_story_trending_key = 'story:trending'
cache_timeout = 60
cache_timeout_long = 600

def get_serializer_class(self):
if self.action in ('list',):
if self.action in ('list', 'main', 'trending'):
return SimpleStorySerializer
return self.serializer_class

def get_permissions(self):
if self.action in ('retrieve', 'list'):
if self.action in ('retrieve', 'list', 'main', 'trending'):
return (AllowAny(),)
return self.permission_classes

Expand Down Expand Up @@ -63,6 +66,8 @@ def list(self, request):
if 'tag' in request.query_params:
return Response({'error': 'tag query is not implemented'}, status=status.HTTP_501_NOT_IMPLEMENTED)
# is_cacheable = False
if is_cacheable:
queryset = queryset.filter(main_order=None, trending_order=None)
if is_cacheable and request.query_params.get('page', 1) in (1, '1'):
cached_data = cache.get(self.cache_story_page1_key)
if cached_data is None:
Expand All @@ -83,6 +88,40 @@ def list(self, request):

return self.get_paginated_response(serializer.data)

@action(methods=['GET'], detail=False)
def main(self, request):
cached_data = cache.get(self.cache_story_main_key)
if cached_data is None:
queryset = self.get_queryset(). \
filter(published=True). \
filter(main_order__gte=1, main_order__lte=5). \
order_by('main_order'). \
defer('body'). \
select_related('writer'). \
prefetch_related('writer__userprofile')
data = self.get_serializer(queryset, many=True).data
cache.set(self.cache_story_main_key, data, timeout=self.cache_timeout_long)
else:
data = cached_data
return Response(data)

@action(methods=['GET'], detail=False)
def trending(self, request):
cached_data = cache.get(self.cache_story_trending_key)
if cached_data is None:
queryset = self.get_queryset(). \
filter(published=True). \
filter(trending_order__gte=1, trending_order__lte=6). \
order_by('trending_order'). \
defer('body'). \
select_related('writer'). \
prefetch_related('writer__userprofile')
data = self.get_serializer(queryset, many=True).data
cache.set(self.cache_story_trending_key, data, timeout=self.cache_timeout_long)
else:
data = cached_data
return Response(data)

@action(methods=['POST'], detail=True)
def publish(self, request, pk=None):
story = self.get_object()
Expand Down

0 comments on commit 34270e6

Please sign in to comment.