Skip to content

Commit

Permalink
🧹 clean up types files
Browse files Browse the repository at this point in the history
  • Loading branch information
ashleyzhang01 committed Nov 13, 2024
1 parent df34e66 commit a7a7eab
Show file tree
Hide file tree
Showing 15 changed files with 62 additions and 110 deletions.
7 changes: 2 additions & 5 deletions backend/penndata/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, TypeAlias
from typing import Any

from rest_framework import serializers

Expand All @@ -12,9 +12,6 @@
)


ValidatedData: TypeAlias = dict[str, Any]


class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
Expand Down Expand Up @@ -63,7 +60,7 @@ class Meta:
model = AnalyticsEvent
fields = ("created_at", "cell_type", "index", "post", "poll", "is_interaction")

def create(self, validated_data: ValidatedData) -> AnalyticsEvent:
def create(self, validated_data: dict[str, Any]) -> AnalyticsEvent:
validated_data["user"] = self.context["request"].user
if validated_data["poll"] and validated_data["post"]:
raise serializers.ValidationError(
Expand Down
11 changes: 0 additions & 11 deletions backend/penndata/types.py

This file was deleted.

11 changes: 8 additions & 3 deletions backend/penndata/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import datetime
from datetime import timedelta
from typing import Any, Optional, Sequence, cast
from typing import Any, Optional, Sequence, TypeAlias, cast

import requests
from bs4 import BeautifulSoup
from django.db.models import Manager, QuerySet
from django.shortcuts import get_object_or_404
from django.utils import timezone
from requests.exceptions import ConnectionError
Expand All @@ -28,10 +29,14 @@
FitnessRoomSerializer,
HomePageOrderSerializer,
)
from penndata.types import CalendarEventList, EventList, HomePageOrderList, ValidatedData
from utils.types import get_user


CalendarEventList: TypeAlias = QuerySet[CalendarEvent, Manager[CalendarEvent]]
EventList: TypeAlias = QuerySet[Event, Manager[Event]]
HomePageOrderList: TypeAlias = QuerySet[HomePageOrder, Manager[HomePageOrder]]


class News(APIView):
"""
GET: Get's news article from the DP
Expand Down Expand Up @@ -156,7 +161,7 @@ class HomePage(APIView):

class Cell:
def __init__(
self, myType: str, myInfo: Optional[ValidatedData] = None, myWeight: int = 0
self, myType: str, myInfo: Optional[dict[str, Any]] = None, myWeight: int = 0
) -> None:
self.type = myType
self.info = myInfo
Expand Down
5 changes: 4 additions & 1 deletion backend/pennmobile/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.contrib import admin, messages
from django.contrib.admin.apps import AdminConfig
from django.http import HttpRequest
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.html import format_html

Expand Down Expand Up @@ -31,7 +32,9 @@ def add_post_poll_message(request: HttpRequest, model: Type[ContentType]) -> Non
class CustomAdminSite(admin.AdminSite):
site_header = "Penn Mobile Backend Admin"

def index(self, request: HttpRequest, extra_context: Optional[AdminContext] = None) -> Any:
def index(
self, request: HttpRequest, extra_context: Optional[AdminContext] = None
) -> TemplateResponse:
from portal.models import Poll, Post

add_post_poll_message(request, Post)
Expand Down
21 changes: 10 additions & 11 deletions backend/portal/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,18 @@
from rest_framework.exceptions import PermissionDenied

from portal.models import Poll, PollOption, PollVote, TargetPopulation
from portal.types import PopulationGroups, PopulationList
from utils.types import DjangoUserType
from utils.types import UserType


def get_user_info(user: DjangoUserType) -> dict[str, Any]:
def get_user_info(user: UserType) -> dict[str, Any]:
"""Returns Platform user information"""
response = authenticated_request(user, "GET", "https://platform.pennlabs.org/accounts/me/")
if response.status_code == 403:
raise PermissionDenied("IPC request failed")
return json.loads(response.content)


def get_user_clubs(user: DjangoUserType) -> list[dict[str, Any]]:
def get_user_clubs(user: UserType) -> list[dict[str, Any]]:
"""Returns list of clubs that user is a member of"""
response = authenticated_request(user, "GET", "https://pennclubs.com/api/memberships/")
if response.status_code == 403:
Expand All @@ -27,7 +26,7 @@ def get_user_clubs(user: DjangoUserType) -> list[dict[str, Any]]:
return res_json


def get_club_info(user: DjangoUserType, club_code: str) -> dict[str, Any]:
def get_club_info(user: UserType, club_code: str) -> dict[str, Any]:
"""Returns club information based on club code"""
response = authenticated_request(user, "GET", f"https://pennclubs.com/api/clubs/{club_code}/")
if response.status_code == 403:
Expand All @@ -36,12 +35,12 @@ def get_club_info(user: DjangoUserType, club_code: str) -> dict[str, Any]:
return {"name": res_json["name"], "image": res_json["image_url"], "club_code": club_code}


def get_user_populations(user: DjangoUserType) -> PopulationGroups:
def get_user_populations(user: UserType) -> list[list[TargetPopulation]]:
"""Returns the target populations that the user belongs to"""

user_info = get_user_info(user)

year: PopulationList = (
year: list[TargetPopulation] = (
[
TargetPopulation.objects.get(
kind=TargetPopulation.KIND_YEAR, population=user_info["student"]["graduation_year"]
Expand All @@ -51,7 +50,7 @@ def get_user_populations(user: DjangoUserType) -> PopulationGroups:
else []
)

school: PopulationList = (
school: list[TargetPopulation] = (
[
TargetPopulation.objects.get(kind=TargetPopulation.KIND_SCHOOL, population=x["name"])
for x in user_info["student"]["school"]
Expand All @@ -60,7 +59,7 @@ def get_user_populations(user: DjangoUserType) -> PopulationGroups:
else []
)

major: PopulationList = (
major: list[TargetPopulation] = (
[
TargetPopulation.objects.get(kind=TargetPopulation.KIND_MAJOR, population=x["name"])
for x in user_info["student"]["major"]
Expand All @@ -69,7 +68,7 @@ def get_user_populations(user: DjangoUserType) -> PopulationGroups:
else []
)

degree: PopulationList = (
degree: list[TargetPopulation] = (
[
TargetPopulation.objects.get(
kind=TargetPopulation.KIND_DEGREE, population=x["degree_type"]
Expand All @@ -83,7 +82,7 @@ def get_user_populations(user: DjangoUserType) -> PopulationGroups:
return [year, school, major, degree]


def check_targets(obj: Poll, user: DjangoUserType) -> bool:
def check_targets(obj: Poll, user: UserType) -> bool:
"""
Check if user aligns with target populations of poll or post
"""
Expand Down
4 changes: 2 additions & 2 deletions backend/portal/management/commands/polls_populate.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@

from portal.models import Poll, PollOption, PollVote, TargetPopulation
from user.models import Profile
from utils.types import DjangoUserModel, DjangoUserType
from utils.types import DjangoUserModel, UserType


class Command(BaseCommand):
def _create_user(
self, username: str, email: str, password: str, graduation_date: datetime.date
) -> DjangoUserType:
) -> UserType:
"""Helper to create a user with profile"""
if not DjangoUserModel.objects.filter(username=username).exists():
user = DjangoUserModel.objects.create_user(username, email, password)
Expand Down
15 changes: 7 additions & 8 deletions backend/portal/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from portal.logic import check_targets, get_user_clubs, get_user_populations
from portal.models import Content, Poll, PollOption, PollVote, Post, TargetPopulation
from portal.types import ClubCode, ValidationData


class TargetPopulationSerializer(serializers.ModelSerializer):
Expand All @@ -32,7 +31,7 @@ class Meta:
read_only_fields: tuple[str, ...] = ("id", "created_date")
abstract = True

def _auto_add_target_population(self, validated_data: ValidationData) -> None:
def _auto_add_target_population(self, validated_data: dict[str, Any]) -> None:
# auto add all target populations of a kind if not specified
if target_populations := validated_data.get("target_populations"):
auto_add_kind = [
Expand All @@ -46,8 +45,8 @@ def _auto_add_target_population(self, validated_data: ValidationData) -> None:
else:
validated_data["target_populations"] = list(TargetPopulation.objects.all())

def create(self, validated_data: ValidationData) -> Poll:
club_code: ClubCode = validated_data["club_code"]
def create(self, validated_data: dict[str, Any]) -> Poll:
club_code: str = validated_data["club_code"]
user = self.context["request"].user
# ensures user is part of club
if not any([x["club"]["code"] == club_code for x in get_user_clubs(user)]):
Expand All @@ -72,7 +71,7 @@ def create(self, validated_data: ValidationData) -> Poll:

return super().create(validated_data)

def update(self, instance: Content, validated_data: ValidationData) -> Content:
def update(self, instance: Content, validated_data: dict[str, Any]) -> Content:
# if Content is updated, then approve should be false
if not self.context["request"].user.is_superuser:
validated_data["status"] = Content.STATUS_DRAFT
Expand All @@ -94,15 +93,15 @@ class Meta:
fields: tuple[str, ...] = ("id", "poll", "choice", "vote_count")
read_only_fields: tuple[str, ...] = ("id", "vote_count")

def create(self, validated_data: ValidationData) -> PollOption:
def create(self, validated_data: dict[str, Any]) -> PollOption:
poll_options_count = PollOption.objects.filter(poll=validated_data["poll"]).count()
if poll_options_count >= 5:
raise serializers.ValidationError(
detail={"detail": "You cannot have more than 5 poll options for a poll"}
)
return super().create(validated_data)

def update(self, instance: PollOption, validated_data: ValidationData) -> PollOption:
def update(self, instance: PollOption, validated_data: dict[str, Any]) -> PollOption:
# if Poll Option is updated, then corresponding Poll approval should be false
poll = cast(Poll, instance.poll)
poll.status = Poll.STATUS_DRAFT
Expand Down Expand Up @@ -138,7 +137,7 @@ class Meta:
fields: tuple[str, ...] = ("id", "id_hash", "poll_options", "created_date")
read_only_fields: tuple[str, ...] = ("id", "created_date")

def create(self, validated_data: ValidationData) -> PollVote:
def create(self, validated_data: dict[str, Any]) -> PollVote:

options = validated_data["poll_options"]
id_hash = validated_data["id_hash"]
Expand Down
21 changes: 0 additions & 21 deletions backend/portal/types.py

This file was deleted.

19 changes: 9 additions & 10 deletions backend/portal/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Any, List, Optional
from typing import Any, List, Optional, TypeAlias

from django.db.models import Count, Q
from django.db.models import Count, Manager, Q, QuerySet
from django.db.models.functions import Trunc
from django.utils import timezone
from rest_framework import generics, viewsets
Expand Down Expand Up @@ -35,16 +35,15 @@
RetrievePollVoteSerializer,
TargetPopulationSerializer,
)
from portal.types import (
PollOptionQuerySet,
PollQuerySet,
PollVoteQuerySet,
PostQuerySet,
VoteStatistics,
)
from utils.types import AuthRequest, get_auth_user


PollQuerySet: TypeAlias = QuerySet[Poll, Manager[Poll]]
PostQuerySet: TypeAlias = QuerySet[Post, Manager[Post]]
PollVoteQuerySet: TypeAlias = QuerySet[PollVote, Manager[PollVote]]
PollOptionQuerySet: TypeAlias = QuerySet[PollOption, Manager[PollOption]]


class UserInfo(APIView):
"""Returns User information"""

Expand Down Expand Up @@ -257,7 +256,7 @@ def get(self, request: Request, poll_id: int) -> Response:
.order_by("date")
)

statistics: VoteStatistics = {
statistics: dict[str, Any] = {
"time_series": time_series,
"poll_statistics": get_demographic_breakdown(poll_id),
}
Expand Down
16 changes: 0 additions & 16 deletions backend/sublet/types.py

This file was deleted.

12 changes: 9 additions & 3 deletions backend/sublet/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Any, Type, cast
from typing import Any, Type, TypeAlias, cast

from django.db.models import QuerySet, prefetch_related_objects
from django.db.models import Manager, QuerySet, prefetch_related_objects
from django.http import QueryDict
from django.utils import timezone
from django.utils.dateparse import parse_date
Expand Down Expand Up @@ -29,10 +29,16 @@
SubletSerializerRead,
SubletSerializerSimple,
)
from sublet.types import ImageList, OfferQuerySet, SubletQuerySet, UserOfferQuerySet
from utils.types import get_user


SubletQuerySet: TypeAlias = QuerySet[Sublet, Manager[Sublet]]
OfferQuerySet: TypeAlias = QuerySet[Offer, Manager[Offer]]
AmenityQuerySet: TypeAlias = QuerySet[Amenity, Manager[Amenity]]
ImageList: TypeAlias = QuerySet[SubletImage, Manager[SubletImage]]
UserOfferQuerySet: TypeAlias = QuerySet[Offer, Manager[Offer]]


class Amenities(generics.ListAPIView):
serializer_class = AmenitySerializer
queryset = Amenity.objects.all()
Expand Down
2 changes: 1 addition & 1 deletion backend/tests/penndata/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from utils.types import DjangoUserModel, UserType


def fakeFitnessGet(url: str, *args: Any, **kwargs: Any) -> Any:
def fakeFitnessGet(url: str, *args: Any, **kwargs: Any) -> mock.MagicMock:
if "docs.google.com/spreadsheets/" in url:
with open("tests/penndata/fitness_snapshot.html", "rb") as f:
m = mock.MagicMock(content=f.read())
Expand Down
Loading

0 comments on commit a7a7eab

Please sign in to comment.