Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add strict typeCheckingMode #413

Closed
wants to merge 21 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5368f6b
refactor(type): add pyhton typeCheckingMode strict
ddungiii Sep 14, 2023
bb39233
chore(package): Add install mypy in pipfile
ddungiii Sep 14, 2023
c49a4bd
chore(package): Add django, DRF stubs in pipfile
DoyunShin Sep 21, 2023
83521f0
feat(mypy): Add mypy.ini
DoyunShin Sep 21, 2023
f35ba53
feat(mypy): mypy follow_imports removed
DoyunShin Sep 21, 2023
cfb8bb8
feat(vscode): Set mypy as a default linter.
DoyunShin Sep 21, 2023
78a1605
fix(typo): NewAra
DoyunShin Sep 21, 2023
92a7112
feat(mypy): Add typing-extensions
Qndndn Sep 21, 2023
4804e89
fix(mypy): Removed typing-extensions from package
Qndndn Sep 21, 2023
1459ca1
Merge pull request #420 from sparcs-kaist/refactor/type-hint-common-s…
Qndndn Sep 21, 2023
feba307
fix(mypy): Add all stubs, and ignore no stubs.
DoyunShin Sep 21, 2023
91f6589
Merge pull request #415 from sparcs-kaist/refactor/type-hint-django-s…
DoyunShin Sep 22, 2023
2adca8f
refactor(type): hinting apps.core.models.article
DoyunShin Oct 5, 2023
0112c90
refactor(type): hinting comment, ara
Qndndn Oct 5, 2023
6cf5250
Merge branch 'refactor/type-hint-hyooyh' into refactor/type-hint
Qndndn Oct 5, 2023
c15faed
refactor(type): fix articles in apps
DoyunShin Oct 5, 2023
8f7747b
Merge branch 'refactor/type-hint-roul' into refactor/type-hint
DoyunShin Oct 6, 2023
1bda448
Merge branch 'develop' into refactor/type-hint
injoonH Oct 26, 2023
1fd40ae
fix(hidden): remove unintended init
injoonH Oct 26, 2023
fd79160
fix(comment): remove attribute of enum
injoonH Oct 26, 2023
99990be
feat(type): follow PEP for typing
injoonH Nov 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
feat(type): follow PEP for typing
injoonH committed Nov 23, 2023

Verified

This commit was signed with the committer’s verified signature.
IvanRibakov Ivan Ribakov
commit 99990be88a76a2f1e9cfa1678b5751a5d9af61ba
16 changes: 6 additions & 10 deletions apps/core/management/scripts/portal_crawler.py
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@
import boto3
import requests
from bs4 import BeautifulSoup as bs
from bs4.element import Tag
from django.contrib.auth import get_user_model
from django.db import transaction
from django.utils import timezone
@@ -151,8 +152,6 @@ def _save_portal_image(html, session):
trs = soup.select("table > tbody > tr")
html = None

from bs4.element import Tag

for tr in trs:
if len(list(tr.children)) == 3:
td = tr.find("td")
@@ -187,7 +186,6 @@ def _save_portal_image(html, session):

def crawl_hour(day=None):
# parameter에서 default로 바로 today()하면, 캐싱되어서 업데이트가 안됨
from django.utils import timezone

if day is None:
day = timezone.now().date()
@@ -264,12 +262,12 @@ def _get_board_today(page_num):
):
continue

user_exist = UserProfile.objects.filter(
user_profile = UserProfile.objects.filter(
nickname=info["writer"], is_newara=False
)
).first()

if user_exist:
user = user_exist.first()
if user_profile is not None:
user = user_profile.user
else:
user = get_user_model().objects.create(
username=str(uuid.uuid1()), is_active=False
@@ -364,10 +362,8 @@ def _get_board(page_num):
nickname=info["writer"], is_newara=False
)

from typing import Optional

if user_exist:
user: Optional[UserProfile] = user_exist.first().user
user = user_exist.first().user
else:
user = get_user_model().objects.create(
username=str(uuid.uuid1()), is_active=False
6 changes: 2 additions & 4 deletions apps/core/management/tasks.py
Original file line number Diff line number Diff line change
@@ -25,17 +25,15 @@ def _get_best(days, period):

vote_objs = redis.get_objs_by_values(_get_redis_key(type_), f"({from_ts}", to_ts)

from typing import Any

article_votes: defaultdict[Any, int] = defaultdict(int)
article_votes: defaultdict[int, int] = defaultdict(int)
for obj in vote_objs:
article_id, vote, _, _ = obj.split(":")
article_votes[article_id] += int(vote)

type_ = "hit"
hit_objs = redis.get_objs_by_values(_get_redis_key(type_), f"({from_ts}", to_ts)

article_hits: defaultdict[Any, int] = defaultdict(int)
article_hits: defaultdict[int, int] = defaultdict(int)
for obj in hit_objs:
article_id, hit, _, _ = obj.split(":")
article_hits[article_id] += int(hit)
38 changes: 20 additions & 18 deletions apps/core/models/article.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from __future__ import annotations

from enum import Enum
from typing import TYPE_CHECKING

import bs4
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.files.storage import default_storage
from django.db import IntegrityError, models, transaction
from django.utils import timezone
@@ -20,22 +21,23 @@
MIN_TIME,
SCHOOL_RESPONSE_VOTE_THRESHOLD,
)

from .block import Block
from .board import NameType, BoardAccessPermissionType
from .board import BoardAccessPermissionType, NameType
from .comment import Comment
from .communication_article import SchoolResponseStatus
from .report import Report
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from .topic import Topic
from .board import Board
from datetime import datetime

# TODO: Use get_user_model() to get the right User model
from django.contrib.auth.models import User

from .attachment import Attachment
from .board import Board
from .communication_article import CommunicationArticle
import django.contrib.auth.models
import datetime

User: models.base.ModelBase = get_user_model()
from .topic import Topic


class ArticleHiddenReason(str, Enum):
@@ -99,11 +101,11 @@ class Article(MetaDataModel):
verbose_name="이전된 좋아요 수",
default=0,
)
migrated_negative_vote_count: int = models.PositiveIntegerField(
migrated_negative_vote_count: int = models.PositiveIntegerField(
verbose_name="이전된 싫어요 수",
default=0,
)
created_by: django.contrib.auth.models.User = models.ForeignKey(
created_by: User = models.ForeignKey(
verbose_name="작성자",
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
@@ -127,13 +129,13 @@ class Article(MetaDataModel):
related_name="article_set",
db_index=True,
)
attachments: None | Attachment = models.ManyToManyField(
attachments: Attachment | None = models.ManyToManyField(
verbose_name="첨부 파일(들)",
to="core.Attachment",
blank=True,
db_index=True,
)
commented_at: None | datetime.datetime = models.DateTimeField(
commented_at: datetime | None = models.DateTimeField(
verbose_name="마지막 댓글 시간",
null=True,
default=None,
@@ -145,24 +147,24 @@ class Article(MetaDataModel):
null=True,
default=None,
)
content_updated_at: None | datetime.datetime = models.DateTimeField(
content_updated_at: datetime | None = models.DateTimeField(
verbose_name="제목/본문/첨부파일 수정 시간",
null=True,
default=None,
)
hidden_at: None | datetime.datetime = models.DateTimeField(
hidden_at: datetime | None = models.DateTimeField(
verbose_name="숨김 시간",
blank=True,
null=True,
default=None,
)
topped_at: None | datetime.datetime = models.DateTimeField(
topped_at: datetime | None = models.DateTimeField(
verbose_name="인기글 달성 시각",
blank=True,
null=True,
default=None,
)
communication_article: None | CommunicationArticle
communication_article: CommunicationArticle | None

class Meta(MetaDataModel.Meta):
verbose_name = "게시물"
@@ -237,7 +239,7 @@ def update_vote_status(self) -> None:
self.vote_set.filter(is_positive=True).count()
+ self.migrated_positive_vote_count
)
self.negative_vote_count = (
self.negative_vote_count: int = (
self.vote_set.filter(is_positive=False).count()
+ self.migrated_negative_vote_count
)
20 changes: 11 additions & 9 deletions apps/core/models/comment.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from __future__ import annotations

import hashlib
from enum import Enum
from typing import List, Optional, Union
from typing import TYPE_CHECKING

from django.conf import settings
from django.contrib.auth import get_user_model
@@ -20,6 +22,9 @@
from .board import NameType
from .report import Report

if TYPE_CHECKING:
from apps.core.models import CommentUpdateLog

User = get_user_model()


@@ -29,17 +34,10 @@ class CommentHiddenReason(Enum):
DELETED_CONTENT = "DELETED_CONTENT"


from apps.core.models.comment_log import CommentUpdateLog


class Comment(MetaDataModel):
comment_update_log_set: List["CommentUpdateLog"]
comment_update_log_set: list[CommentUpdateLog]
objects = MetaDataQuerySet.as_manager()

class Meta(MetaDataModel.Meta):
verbose_name = "댓글"
verbose_name_plural = "댓글 목록"

content = models.TextField(
default=None,
verbose_name="본문",
@@ -106,6 +104,10 @@ class Meta(MetaDataModel.Meta):
verbose_name="숨김 시간",
)

class Meta(MetaDataModel.Meta):
verbose_name = "댓글"
verbose_name_plural = "댓글 목록"

def __str__(self) -> str:
return self.content

42 changes: 24 additions & 18 deletions apps/user/models/user_profile.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from __future__ import annotations

import json
from typing import TYPE_CHECKING

from dateutil.relativedelta import relativedelta
from django.conf import settings
@@ -10,17 +13,11 @@
from ara.db.models import MetaDataModel
from ara.settings import MIN_TIME

if TYPE_CHECKING:
from django.contrib.auth.models import AbstractBaseUser

class UserProfile(MetaDataModel):
class Meta(MetaDataModel.Meta):
verbose_name = "유저 프로필"
verbose_name_plural = "유저 프로필 목록"
unique_together = (
("uid", "deleted_at"),
("sid", "deleted_at"),
("nickname", "is_newara", "deleted_at"),
)

class UserProfile(MetaDataModel):
class UserGroup(models.IntegerChoices):
# 뉴아라 계정을 만들지 않은 사람들
UNAUTHORIZED = 0, gettext_lazy("Unauthorized user")
@@ -41,14 +38,14 @@ class UserGroup(models.IntegerChoices):

OFFICIAL_GROUPS = [UserGroup.STORE_EMPLOYEE, UserGroup.KAIST_ORG]

uid = models.CharField(
uid: str | None = models.CharField(
null=True,
default=None,
editable=False,
max_length=30,
verbose_name="Sparcs SSO uid",
)
sid = models.CharField(
sid: str | None = models.CharField(
null=True,
default=None,
editable=False,
@@ -67,7 +64,7 @@ class UserGroup(models.IntegerChoices):
upload_to="user_profiles/pictures",
verbose_name="프로필",
)
nickname = models.CharField(
nickname: str = models.CharField(
blank=True,
default="",
max_length=128,
@@ -77,31 +74,31 @@ class UserGroup(models.IntegerChoices):
default=MIN_TIME,
verbose_name="최근 닉네임 변경일시",
)
see_sexual = models.BooleanField(
see_sexual: bool = models.BooleanField(
default=False,
verbose_name="성인/음란성 보기",
)
see_social = models.BooleanField(
see_social: bool = models.BooleanField(
default=False,
verbose_name="정치/사회성 보기",
)
group = models.IntegerField(
group: int = models.IntegerField(
choices=UserGroup.choices,
default=UserGroup.UNAUTHORIZED,
)
user = models.OneToOneField(
user: models.OneToOneField[AbstractBaseUser] = models.OneToOneField(
on_delete=models.CASCADE,
to=settings.AUTH_USER_MODEL,
related_name="profile",
verbose_name="사용자",
primary_key=True,
)
# 포탈 공지에서 긁어온 작성자 or 이전한 아라 사용자는 is_newara=False
is_newara = models.BooleanField(
is_newara: bool = models.BooleanField(
default=True,
verbose_name="뉴아라 사용자",
)
ara_id = models.CharField(
ara_id: str = models.CharField(
blank=True,
default="",
max_length=128,
@@ -118,6 +115,15 @@ class UserGroup(models.IntegerChoices):
verbose_name="활동정지 마감 일시",
)

class Meta(MetaDataModel.Meta):
verbose_name = "유저 프로필"
verbose_name_plural = "유저 프로필 목록"
unique_together = (
("uid", "deleted_at"),
("sid", "deleted_at"),
("nickname", "is_newara", "deleted_at"),
)

def __str__(self) -> str:
return self.nickname