Skip to content

Commit

Permalink
Merge pull request #81 from snuhcs-course/dev
Browse files Browse the repository at this point in the history
Merge dev into Main
  • Loading branch information
SeongjunJo authored Dec 1, 2023
2 parents b788e7a + 5ee4f03 commit ca4a304
Show file tree
Hide file tree
Showing 51 changed files with 1,457 additions and 308 deletions.
1 change: 1 addition & 0 deletions backend/haengsha/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
'ec2-13-209-8-183.ap-northeast-2.compute.amazonaws.com',
"localhost",
"127.0.0.1",
"10.150.196.98"
]

# APPEND_SLASH = False
Expand Down
8 changes: 4 additions & 4 deletions backend/post/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ class Duration(models.Model):
event_day = models.DateField(null=False,primary_key=True,default=date.today)

class Post(models.Model):
title = models.CharField(max_length=30)
title = models.CharField(max_length=300)
author = models.ForeignKey(PersonalUser, on_delete=models.CASCADE,null=True)
content = models.CharField(null=True,max_length=1000)
place = models.CharField(null=True,max_length=30)
content = models.CharField(null=True,max_length=10000)
place = models.CharField(null=True,max_length=300)
image = models.URLField(null=True)
is_festival = models.BooleanField(null=True)
like_users = models.ManyToManyField(PersonalUser, blank=True, related_name='like_posts', through='Like')
Expand Down Expand Up @@ -38,4 +38,4 @@ class EventDuration(models.Model):
class Recommend(models.Model):
user = models.ForeignKey(PersonalUser, on_delete=models.CASCADE)
post = models.ForeignKey('post.Post', on_delete=models.CASCADE)
score = models.IntegerField(default=0)
score = models.IntegerField(default=0)
31 changes: 2 additions & 29 deletions backend/post/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,8 @@

app_name = 'post'
urlpatterns = [
# path('', PostListView.as_view(), name='post-list'),

# # 키워드 필터만 사용한 URL
# path('keyword/<str:keyword>/', PostListView.as_view(), name='post-filter-by-keyword'),

# # 축제 여부 필터만 사용한 URL
# path('festival/<int:is_festival>/', PostListView.as_view(), name='post-filter-by-festival'),

# # 날짜 범위 필터만 사용한 URL
# # 홈화면을 위한 single-sided boundary query를 사용한 URL
# path('date/<str:start_date>/<str:end_date>/', PostListView.as_view(), name='post-filter-by-date'),

# # start_date만 사용한 URL
# # fixed duplicate date issue
# path('start_date/<str:start_date>/', PostListView.as_view(), name='post-filter-by-start-date'),

# # end_date만 사용한 URL
# # fixed duplicate date issue.
# path('end_date/<str:end_date>/', PostListView.as_view(), name='post-filter-by-end-date'),

# # 키워드와 축제 여부 필터를 사용한 URL
# path('keyword/<str:keyword>/festival/<int:is_festival>/', PostListView.as_view(), name='post-filter-keyword-and-festival'),

# # 키워드와 날짜 범위 필터를 사용한 URL
# path('keyword/<str:keyword>/date/<str:start_date>/<str:end_date>/', PostListView.as_view(), name='post-filter-keyword-and-date'),

# # 축제 여부와 날짜 범위 필터를 사용한 URL
# # fixed issue with duplicate items in the given date range.
# path('festival/<int:is_festival>/date/<str:start_date>/<str:end_date>/', PostListView.as_view(), name='post-filter-festival-and-date'),
#게시글 올릴 때 사용할 url
path('', PostListView.as_view(), name='post-list'),

# 모든 필터를 사용한 URL
re_path(r'^keyword/(?P<keyword>.*)/festival/(?P<is_festival>\d+)/date/(?P<start_date>[\d-]*)/(?P<end_date>[\d-]*)/$', PostListView.as_view(), name='post-filter-all'),
Expand Down
2 changes: 1 addition & 1 deletion backend/post/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def get(
posts = Post.objects.all()

if keyword != "":
posts = posts.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword))
posts = posts.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword) | Q(author__nickname__icontains=keyword))
if int(is_festival) != 2:
is_festival = bool(int(is_festival))
posts = posts.filter(is_festival=is_festival)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Generated by Django 4.1 on 2023-11-30 08:20

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("user", "0004_alter_personaluser_managers"),
]

operations = [
migrations.AlterField(
model_name="personaluser",
name="grade",
field=models.CharField(
choices=[
("16", "16학번 이상"),
("17", "17학번"),
("18", "18학번"),
("19", "19학번"),
("20", "20학번"),
("21", "21학번"),
("22", "22학번"),
("23", "23학번"),
("Undefined", "Undefined"),
],
default="Undefined",
max_length=10,
),
),
migrations.AlterField(
model_name="personaluser",
name="interest",
field=models.CharField(
choices=[
("dance", "댄스"),
("meetup", "사교"),
("social", "사회"),
("theater", "연극"),
("music", "음악"),
("sports", "운동"),
("art", "예술"),
("religion", "종교"),
("Undefined", "Undefined"),
],
default="Undefined",
max_length=200,
),
),
]
2 changes: 1 addition & 1 deletion backend/user/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class PersonalUser(AbstractUser, PermissionsMixin):
role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='User')
major = models.CharField(max_length=20, choices=MAJOR_CHOICES, default='Undefined')
grade = models.CharField(max_length=10, choices=GRADE_CHOICES, default='Undefined')
interest = models.CharField(max_length=10, choices=INTEREST_CHOICES, default='Undefined')
interest = models.CharField(max_length=200, choices=INTEREST_CHOICES, default='Undefined')


USERNAME_FIELD = 'email'
Expand Down
19 changes: 14 additions & 5 deletions backend/user/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ def contains_number(s):
return any(character.isdigit() for character in s)

email = request.data.get("email")

user = PersonalUser.objects.filter(email=email)
if not user:
return Response(
Expand All @@ -166,6 +167,10 @@ def contains_number(s):

user = PersonalUser.objects.get(email=email)
password = request.data.get("password")

print(f'email: {email}')
print(f'password: {password}')

if len(password) < 4 or len(password) > 20:
return Response(
{
Expand Down Expand Up @@ -275,20 +280,24 @@ def signup(request): # for users
)

valid_interest_choices = [choice[0] for choice in PersonalUser.INTEREST_CHOICES]
if not interest in valid_interest_choices:
return Response(
{"message": "Invalid interest."}, status=status.HTTP_400_BAD_REQUEST
)

interest_list = interest.split(", ")
for elem in interest_list:
if not elem in valid_interest_choices:
return Response(
{"message": "Invalid interest."}, status=status.HTTP_400_BAD_REQUEST
)

PersonalUser.objects.create_user(
nickname=nickname,
email=email,
password=password,
role=role,
major=major,
grade=grade,
interest=interest,
grade=grade
)

try:
return Response({"message": "created user account"}, status=status.HTTP_200_OK)
except Exception as e:
Expand Down
2 changes: 1 addition & 1 deletion frontend/.idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion frontend/.idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion frontend/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.example.haengsha.instrumentedTest.navigationTest

import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.ComposeNavigator
import androidx.navigation.testing.TestNavHostController
import com.example.haengsha.model.route.BoardRoute
import com.example.haengsha.model.viewModel.NavigationViewModel
import com.example.haengsha.model.viewModel.UserViewModel
import com.example.haengsha.model.viewModel.board.BoardApiViewModel
import com.example.haengsha.model.viewModel.board.BoardViewModel
import com.example.haengsha.testConfig.assertCurrentRouteName
import com.example.haengsha.ui.screens.dashBoard.Board
import org.junit.Before
import org.junit.Rule
import org.junit.Test

class BoardScreenNavigationTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()

private lateinit var boardNavController: TestNavHostController
private lateinit var userViewModel: UserViewModel
private lateinit var boardViewModel: BoardViewModel
private lateinit var boardApiViewModel: BoardApiViewModel
private lateinit var navigationViewModel: NavigationViewModel

@Before
fun setupMainNavHost() {
composeTestRule.setContent {
boardNavController = TestNavHostController(LocalContext.current).apply {
navigatorProvider.addNavigator(ComposeNavigator())
}
userViewModel = UserViewModel()
val userUiState by userViewModel.uiState.collectAsState()
boardViewModel = viewModel()
boardApiViewModel = viewModel(factory = BoardApiViewModel.Factory)
navigationViewModel = viewModel()

Board(
innerPadding = PaddingValues(0.dp),
userUiState = userUiState,
boardViewModel = boardViewModel,
boardApiViewModel = boardApiViewModel,
navigationViewModel = navigationViewModel,
boardNavController = boardNavController,
isTest = true
)
}
}

@Test
fun boardNavController_verifyStartDestination() {
boardNavController.assertCurrentRouteName(BoardRoute.Dashboard.route)
}

@Test
fun boardNavController_clickEvent_navigateToDetailScreen() {
composeTestRule.onNodeWithText("test").performClick()
boardNavController.assertCurrentRouteName(BoardRoute.BoardDetail.route)
}

@Test
fun boardNavController_clickPost_navigateToPostScreen() {
composeTestRule.onNodeWithContentDescription("event post Button").performClick()
boardNavController.assertCurrentRouteName(BoardRoute.BoardPost.route)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.example.haengsha.instrumentedTest.navigationTest

import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.ComposeNavigator
import androidx.navigation.testing.TestNavHostController
import com.example.haengsha.model.route.FavoriteRoute
import com.example.haengsha.model.viewModel.NavigationViewModel
import com.example.haengsha.model.viewModel.UserViewModel
import com.example.haengsha.model.viewModel.board.BoardApiViewModel
import com.example.haengsha.testConfig.assertCurrentRouteName
import com.example.haengsha.ui.screens.favorite.Favorite
import org.junit.Before
import org.junit.Rule
import org.junit.Test

class FavoriteScreenNavigationTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()

private lateinit var favoriteNavController: TestNavHostController
private lateinit var userViewModel: UserViewModel
private lateinit var boardApiViewModel: BoardApiViewModel
private lateinit var navigationViewModel: NavigationViewModel

@Before
fun setupMainNavHost() {
composeTestRule.setContent {
favoriteNavController = TestNavHostController(LocalContext.current).apply {
navigatorProvider.addNavigator(ComposeNavigator())
}
userViewModel = UserViewModel()
val userUiState by userViewModel.uiState.collectAsState()
boardApiViewModel = viewModel(factory = BoardApiViewModel.Factory)
navigationViewModel = viewModel()

Favorite(
innerPadding = PaddingValues(0.dp),
userUiState = userUiState,
boardApiViewModel = boardApiViewModel,
navigationViewModel = navigationViewModel,
favoriteNavController = favoriteNavController,
isTest = true
)
}
}

@Test
fun favoriteNavController_verifyStartDestination() {
favoriteNavController.assertCurrentRouteName(FavoriteRoute.FavoriteBoard.route)
}

@Test
fun favoriteNavController_clickFavoriteEvent_navigateToFavoriteDetailScreen() {
composeTestRule.onNodeWithText("test").performClick()
favoriteNavController.assertCurrentRouteName(FavoriteRoute.FavoriteDetail.route)
}
}
Loading

0 comments on commit ca4a304

Please sign in to comment.