Skip to content

Commit

Permalink
Merge pull request #267 from sparcs-kaist/develop
Browse files Browse the repository at this point in the history
2021/10/22 v1.2.4 update
  • Loading branch information
jessyoon14 authored Oct 21, 2021
2 parents 7d4da3b + e5ea5b9 commit 0a98a0e
Show file tree
Hide file tree
Showing 15 changed files with 348 additions and 223 deletions.
6 changes: 4 additions & 2 deletions apps/core/management/scripts/portal_crawler.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,18 @@ def _login_kaist_portal():
'otp': _make_2fa_token()
},
)
k_uid = login_response.json()['dataMap']['USER_INFO']['kaist_uid']
k_uid = login_response.json()['dataMap']['encKaistUid']
result = login_response.json()['dataMap']['encData']
state = login_response.json()['dataMap']['state']

session.post(
'https://portal.kaist.ac.kr/statics/redirectUri.jsp',
data={
'k_uid': k_uid,
'result': result,
'state': state,
'success': 'true',
'result': login_response.text,
'enc': 'true',
'user_id': PORTAL_ID,
},
)
Expand Down
21 changes: 20 additions & 1 deletion apps/core/models/article.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import bs4
import typing
from enum import Enum
from typing import Dict, Union

import bs4
from django.core.files.storage import default_storage

from django.db import models, IntegrityError, transaction
Expand All @@ -11,9 +12,11 @@
from django.utils.translation import gettext

from apps.user.views.viewsets import make_random_profile_picture, hashlib
from ara.classes.decorator import cache_by_user
from ara.db.models import MetaDataModel
from ara.sanitizer import sanitize
from ara.settings import HASH_SECRET_VALUE
from .block import Block
from .report import Report
from .comment import Comment

Expand Down Expand Up @@ -222,3 +225,19 @@ def postprocessed_created_by(self) -> Union[settings.AUTH_USER_MODEL, Dict]:
},
}

@cache_by_user
def hidden_reasons(self, user: settings.AUTH_USER_MODEL) -> typing.List:
reasons = []
if Block.is_blocked(blocked_by=user, user=self.created_by):
reasons.append(ArticleHiddenReason.BLOCKED_USER_CONTENT)
if self.is_content_sexual and not user.profile.see_sexual:
reasons.append(ArticleHiddenReason.ADULT_CONTENT)
if self.is_content_social and not user.profile.see_social:
reasons.append(ArticleHiddenReason.SOCIAL_CONTENT)
# 혹시 몰라 여기 두기는 하는데 여기 오기전에 Permission에서 막혀야 함
if not self.parent_board.group_has_access(user.profile.group):
reasons.append(ArticleHiddenReason.ACCESS_DENIED_CONTENT)
if self.is_hidden_by_reported():
reasons.append(ArticleHiddenReason.REPORTED_CONTENT)

return reasons
23 changes: 23 additions & 0 deletions apps/core/models/comment.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import typing
from enum import Enum
from typing import Dict, Union
import hashlib

Expand All @@ -10,12 +12,20 @@
from django.utils.translation import gettext

from apps.user.views.viewsets import NOUNS, make_random_profile_picture
from ara.classes.decorator import cache_by_user
from ara.db.models import MetaDataModel, MetaDataQuerySet
from ara.sanitizer import sanitize
from ara.settings import HASH_SECRET_VALUE
from .block import Block
from .report import Report


class CommentHiddenReason(Enum):
REPORTED_CONTENT = 'REPORTED_CONTENT'
BLOCKED_USER_CONTENT = 'BLOCKED_USER_CONTENT'
DELETED_CONTENT = 'DELETED_CONTENT'


class Comment(MetaDataModel):
objects = MetaDataQuerySet.as_manager()

Expand Down Expand Up @@ -175,6 +185,19 @@ def postprocessed_created_by(self) -> Union[settings.AUTH_USER_MODEL, Dict]:
}
}

@cache_by_user
def hidden_reasons(self, user: settings.AUTH_USER_MODEL) -> typing.List:
reasons: typing.List[CommentHiddenReason] = []

if Block.is_blocked(blocked_by=user, user=self.created_by):
reasons.append(CommentHiddenReason.BLOCKED_USER_CONTENT)
if self.is_hidden_by_reported():
reasons.append(CommentHiddenReason.REPORTED_CONTENT)
if self.is_deleted():
reasons.append(CommentHiddenReason.DELETED_CONTENT)

return reasons


def make_anonymous_name(hash_val, unique_tail) -> str:
nickname = '익명의 ' + NOUNS[hash_val % len(NOUNS)] + ' ' + unique_tail
Expand Down
92 changes: 13 additions & 79 deletions apps/core/serializers/article.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,21 @@
from apps.core.documents import ArticleDocument
from apps.core.models import Article, ArticleReadLog, Board, Block, Scrap, ArticleHiddenReason
from apps.core.serializers.board import BoardSerializer
from apps.core.serializers.mixins.hidden import HiddenSerializerMixin, HiddenSerializerFieldMixin
from apps.core.serializers.topic import TopicSerializer
from apps.user.serializers.user import PublicUserSerializer
from ara.classes.serializers import MetaDataModelSerializer


CAN_OVERRIDE_REASONS = [
ArticleHiddenReason.SOCIAL_CONTENT,
ArticleHiddenReason.ADULT_CONTENT,
ArticleHiddenReason.BLOCKED_USER_CONTENT
]
class BaseArticleSerializer(HiddenSerializerMixin, MetaDataModelSerializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.CAN_OVERRIDE_REASONS = [
ArticleHiddenReason.SOCIAL_CONTENT,
ArticleHiddenReason.ADULT_CONTENT,
ArticleHiddenReason.BLOCKED_USER_CONTENT
]


class BaseArticleSerializer(MetaDataModelSerializer):
class Meta:
model = Article
exclude = ('content', 'content_text', 'attachments',
Expand All @@ -45,22 +47,6 @@ def get_my_scrap(obj) -> typing.Optional[dict]:

return BaseScrapSerializer(my_scrap).data

def get_is_mine(self, obj) -> bool:
return self.context['request'].user == obj.created_by

def get_is_hidden(self, obj) -> bool:
return not self.visible_verdict(obj)

def get_why_hidden(self, obj) -> typing.List[str]:
_, _, reasons = self.hidden_info(obj)
return [reason.value for reason in reasons]

def get_can_override_hidden(self, obj) -> typing.Optional[bool]:
hidden, can_override, _ = self.hidden_info(obj)
if not hidden:
return
return can_override

def get_title(self, obj) -> typing.Optional[str]:
if self.visible_verdict(obj):
return obj.title
Expand Down Expand Up @@ -107,53 +93,16 @@ def get_article_current_page(self, obj) -> typing.Optional[int]:
)

return queryset.count() // view.paginator.page_size + 1

return None

def visible_verdict(self, obj):
hidden, can_override, _ = self.hidden_info(obj)
return not hidden or (can_override and self.requested_override_hidden)

@property
def requested_override_hidden(self):
return 'override_hidden' in self.context and self.context['override_hidden'] is True

# TODO: 전체 캐싱 (여기에 이 메소드 자체가 없도록 디자인을 바꿔야할듯)
def hidden_info(self, obj) -> typing.Tuple[bool, bool, typing.List[ArticleHiddenReason]]:
reasons: typing.List[ArticleHiddenReason] = []
request = self.context['request']

if Block.is_blocked(blocked_by=request.user, user=obj.created_by):
reasons.append(ArticleHiddenReason.BLOCKED_USER_CONTENT)
if obj.is_content_sexual and not request.user.profile.see_sexual:
reasons.append(ArticleHiddenReason.ADULT_CONTENT)
if obj.is_content_social and not request.user.profile.see_social:
reasons.append(ArticleHiddenReason.SOCIAL_CONTENT)
# 혹시 몰라 여기 두기는 하는데 여기 오기전에 Permission에서 막혀야 함
if not obj.parent_board.group_has_access(request.user.profile.group):
reasons.append(ArticleHiddenReason.ACCESS_DENIED_CONTENT)
if obj.is_hidden_by_reported():
reasons.append(ArticleHiddenReason.REPORTED_CONTENT)

cannot_override_reasons = [reason for reason in reasons if reason not in CAN_OVERRIDE_REASONS]
can_override = len(cannot_override_reasons) == 0

return len(reasons) > 0, can_override, reasons


class SideArticleSerializer(BaseArticleSerializer):
class SideArticleSerializer(HiddenSerializerFieldMixin, BaseArticleSerializer):
class Meta(BaseArticleSerializer.Meta):
pass

created_by = serializers.SerializerMethodField(
read_only=True,
)
is_hidden = serializers.SerializerMethodField(
read_only=True,
)
why_hidden = serializers.SerializerMethodField(
read_only=True,
)
can_override_hidden = serializers.SerializerMethodField(
read_only=True,
)
Expand All @@ -165,7 +114,7 @@ class Meta(BaseArticleSerializer.Meta):
)


class ArticleSerializer(BaseArticleSerializer):
class ArticleSerializer(HiddenSerializerFieldMixin, BaseArticleSerializer):
class Meta(BaseArticleSerializer.Meta):
exclude = ('migrated_hit_count', 'migrated_positive_vote_count', 'migrated_negative_vote_count', 'content_text',)

Expand Down Expand Up @@ -326,15 +275,6 @@ def get_side_articles_of_recent_article(self, obj, request):
is_mine = serializers.SerializerMethodField(
read_only=True,
)
is_hidden = serializers.SerializerMethodField(
read_only=True,
)
why_hidden = serializers.SerializerMethodField(
read_only=True,
)
can_override_hidden = serializers.SerializerMethodField(
read_only=True,
)
title = serializers.SerializerMethodField(
read_only=True,
)
Expand All @@ -358,19 +298,13 @@ def get_side_articles_of_recent_article(self, obj, request):
)


class ArticleListActionSerializer(BaseArticleSerializer):
class ArticleListActionSerializer(HiddenSerializerFieldMixin, BaseArticleSerializer):
parent_topic = TopicSerializer(
read_only=True,
)
parent_board = BoardSerializer(
read_only=True,
)
is_hidden = serializers.SerializerMethodField(
read_only=True,
)
why_hidden = serializers.SerializerMethodField(
read_only=True,
)
title = serializers.SerializerMethodField(
read_only=True,
)
Expand All @@ -382,7 +316,7 @@ class ArticleListActionSerializer(BaseArticleSerializer):
)


class BestArticleListActionSerializer(BaseArticleSerializer):
class BestArticleListActionSerializer(HiddenSerializerFieldMixin, BaseArticleSerializer):
title = serializers.SerializerMethodField(
read_only=True,
)
Expand Down
Loading

0 comments on commit 0a98a0e

Please sign in to comment.