Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucerna00 committed May 18, 2024
2 parents 942aee1 + fc7233f commit aad5de5
Show file tree
Hide file tree
Showing 43 changed files with 729 additions and 18 deletions.
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions apps/accounts/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from django.contrib import admin
from .models import User

admin.site.register(User)
6 changes: 6 additions & 0 deletions apps/accounts/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AccountsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.accounts'
27 changes: 27 additions & 0 deletions apps/accounts/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 5.0.4 on 2024-05-07 15:35

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='User',
fields=[
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('id', models.CharField(default='', max_length=100, primary_key=True, serialize=False, unique=True)),
('phone_number', models.CharField(default='', max_length=11, unique=True)),
('is_admin', models.BooleanField(default=False)),
],
options={
'db_table': 'user',
},
),
]
Empty file.
61 changes: 61 additions & 0 deletions apps/accounts/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class UserManager(BaseUserManager):
# 일반 user 생성
def create_user(self, id, password, phone_number):
if not id:
raise ValueError('must have an user id')
user = self.model(
id=id,
phone_number=phone_number
)
user.set_password(password)
user.save(using=self._db)
return user

# 관리자 user 생성
def create_superuser(self, id, password, phone_number):
user = self.create_user(
id=id,
password=password,
phone_number=phone_number
)
user.is_admin = True
user.save(using=self._db)
return user


class User(AbstractBaseUser):
id = models.CharField(primary_key=True, default='', max_length=100, null=False, blank=False, unique=True)
phone_number = models.CharField(default='', max_length=11, null=False, blank=False, unique=True)

# User 모델의 필수 필드와 메서드
is_admin = models.BooleanField(default=False)

def has_perm(self, perm, obj=None):
return True

def has_module_perms(self, app_label):
return True

@property
def is_staff(self):
return self.is_admin

# Helper 클래스
objects = UserManager()

# User의 username 필드는 id로 설정
USERNAME_FIELD = 'id'

# 필수로 작성해야하는 필드
REQUIRED_FIELDS = ['password', 'phone_number']

# DB 테이블 이름
class Meta:
db_table = 'user'

def __str__(self):
return self.id
16 changes: 16 additions & 0 deletions apps/accounts/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from .models import User
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user = User.objects.create_user(
id=validated_data['id'],
password=validated_data['password'],
phone_number=validated_data['phone_number']
)
return user

class Meta:
model = User
fields = '__all__'
File renamed without changes.
8 changes: 8 additions & 0 deletions apps/accounts/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.urls import path
from .views import *

urlpatterns = [
path('', RegisterView.as_view(), name='user_register'),
path('/auth', AuthView.as_view(), name='user_auth'),
path('/history', HistoryView.as_view(), name='user_info'),
]
90 changes: 90 additions & 0 deletions apps/accounts/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from rest_framework.views import APIView
from .serializers import *
from rest_framework import status
from rest_framework.response import Response
from django.contrib.auth import authenticate
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework.permissions import IsAuthenticated
from ..optimizations.models import *
from ..optimizations.serializers import *


class RegisterView(APIView):
def post(self, request):
# 역직렬화 (JSON -> model)
serializer = UserSerializer(data=request.data)

# 유효성 검사
if serializer.is_valid():
# DB에 저장
user = serializer.save()
return Response({'result': 'success', 'data': {'id': user.id, 'phone_number': user.phone_number}}, status=status.HTTP_200_OK)

return Response({'result': 'fail', 'message': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)


class AuthView(APIView):
# 로그인
def post(self, request):
# user 탐색
user = authenticate(id=request.data.get("id"), password=request.data.get("password"))

if user is not None:
# JWT 발급
token = TokenObtainPairSerializer.get_token(user)
refresh_token = str(token)
access_token = str(token.access_token)
res = Response(
{
'result': 'success',
'data': {
'id': user.id,
'token': {
"access": access_token,
"refresh": refresh_token,
}
},
},
status=status.HTTP_200_OK,
)

# JWT을 쿠키에 저장
res.set_cookie('access', access_token, httponly=True)
res.set_cookie('refresh', refresh_token, httponly=True)
return res
else:
return Response({'result': 'fail', 'message': 'The ID or password is incorrect.'}, status=status.HTTP_400_BAD_REQUEST)

# 로그아웃
def delete(self, request):
# 쿠키에 저장된 JWT 삭제
response = Response({'result': 'success', 'data': {'id': request.user.id}}, status=status.HTTP_202_ACCEPTED)
response.delete_cookie("access")
response.delete_cookie("refresh")
return response


class HistoryView(APIView):
# 인증된 사용자만 view 접근 허용
permission_classes = [IsAuthenticated]

def get(self, request):
# params
vertiport_name = request.GET.get('vertiport', None)
state_sequence = request.GET.get('sequence', None)

if vertiport_name:
vertiport = Vertiport.objects.filter(name=vertiport_name).first()
states = State.objects.filter(user=request.user, vertiport=vertiport)

# 버티포트만 선택됨
if not state_sequence:
return Response({'result': 'success', 'data': {'states': StateSerializer(states, many=True).data}}, status=status.HTTP_200_OK)

# 버티포트랑 식별번호 선택됨
else:
state = states.filter(sequence=state_sequence).first()
optimizations = Optimization.objects.filter(state=state)
return Response({'result': 'success', 'data': {'optimization': OptimizationSerializer(optimizations, many=True).data}}, status=status.HTTP_200_OK)
else:
return Response({'result': 'fail', 'massage': 'vertiport name is required'}, status=status.HTTP_400_BAD_REQUEST)
3 changes: 0 additions & 3 deletions apps/optimization/admin.py

This file was deleted.

3 changes: 0 additions & 3 deletions apps/optimization/models.py

This file was deleted.

3 changes: 0 additions & 3 deletions apps/optimization/views.py

This file was deleted.

Empty file added apps/optimizations/__init__.py
Empty file.
5 changes: 5 additions & 0 deletions apps/optimizations/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.contrib import admin
from .models import *

admin.site.register(State)
admin.site.register(Optimization)
2 changes: 1 addition & 1 deletion apps/optimization/apps.py → apps/optimizations/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

class OptimizationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.optimization'
name = 'apps.optimizations'
66 changes: 66 additions & 0 deletions apps/optimizations/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Generated by Django 5.0.4 on 2024-05-11 12:57

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
('vertiports', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='State',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sequence', models.IntegerField(default=0)),
('datetime', models.DateTimeField(auto_now=True)),
('fato_in_UAM', models.SmallIntegerField(default=0)),
('path_in_UAM', models.SmallIntegerField(default=0)),
('gate_UAM', models.SmallIntegerField(default=0)),
('path_out_UAM', models.SmallIntegerField(default=0)),
('fato_out_UAM', models.SmallIntegerField(default=0)),
('gate_UAM_psg', models.SmallIntegerField(default=0)),
('waiting_room_psg', models.SmallIntegerField(default=0)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('vertiport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vertiports.vertiport')),
],
options={
'db_table': 'state',
},
),
migrations.CreateModel(
name='Optimization',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('weight', models.DecimalField(decimal_places=2, max_digits=3)),
('fato_in_UAM', models.SmallIntegerField(default=0)),
('path_in_UAM', models.SmallIntegerField(default=0)),
('gate_UAM', models.SmallIntegerField(default=0)),
('path_out_UAM', models.SmallIntegerField(default=0)),
('fato_out_UAM', models.SmallIntegerField(default=0)),
('gate_UAM_psg', models.SmallIntegerField(default=0)),
('waiting_room_psg', models.SmallIntegerField(default=0)),
('congestion', models.DecimalField(decimal_places=2, max_digits=4)),
('utilization', models.DecimalField(decimal_places=2, max_digits=4)),
('state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='optimizations.state')),
],
options={
'db_table': 'optimization',
},
),
migrations.AddConstraint(
model_name='state',
constraint=models.UniqueConstraint(fields=('sequence', 'user', 'vertiport'), name='state_composite_primary_key'),
),
migrations.AddConstraint(
model_name='optimization',
constraint=models.UniqueConstraint(fields=('weight', 'state'), name='optimization_composite_primary_key'),
),
]
Empty file.
56 changes: 56 additions & 0 deletions apps/optimizations/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from django.db import models

from apps.accounts.models import User
from apps.vertiports.models import Vertiport


class State(models.Model):
sequence = models.IntegerField(default=0, null=False, blank=False)
datetime = models.DateTimeField(auto_now=True, null=False, blank=False)
fato_in_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
path_in_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
gate_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
path_out_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
fato_out_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
gate_UAM_psg = models.SmallIntegerField(default=0, null=False, blank=False)
waiting_room_psg = models.SmallIntegerField(default=0, null=False, blank=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
vertiport = models.ForeignKey(Vertiport, on_delete=models.CASCADE)

class Meta:
# 다중 기본키 설정
constraints = [
models.UniqueConstraint(fields=['sequence', 'user', 'vertiport'], name='state_composite_primary_key'),
]

# DB 테이블 이름
db_table = 'state'

def __str__(self):
return f'{self.user.id}.{self.vertiport.name}.{self.sequence}'


class Optimization(models.Model):
weight = models.DecimalField(max_digits=3, decimal_places=2, null=False, blank=False)
fato_in_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
path_in_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
gate_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
path_out_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
fato_out_UAM = models.SmallIntegerField(default=0, null=False, blank=False)
gate_UAM_psg = models.SmallIntegerField(default=0, null=False, blank=False)
waiting_room_psg = models.SmallIntegerField(default=0, null=False, blank=False)
congestion = models.DecimalField(max_digits=4, decimal_places=2, null=False, blank=False)
utilization = models.DecimalField(max_digits=4, decimal_places=2, null=False, blank=False)
state = models.ForeignKey(State, on_delete=models.CASCADE)

class Meta:
# 다중 기본키 설정
constraints = [
models.UniqueConstraint(fields=['weight', 'state'], name='optimization_composite_primary_key'),
]

# DB 테이블 이름
db_table = 'optimization'

def __str__(self):
return f'{self.state.user.id}.{self.state.vertiport.name}.{self.state.sequence}.{self.weight}'
14 changes: 14 additions & 0 deletions apps/optimizations/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from .models import State, Optimization
from rest_framework import serializers


class StateSerializer(serializers.ModelSerializer):
class Meta:
model = State
exclude = ['user', 'vertiport']


class OptimizationSerializer(serializers.ModelSerializer):
class Meta:
model = Optimization
exclude = ['state']
3 changes: 3 additions & 0 deletions apps/optimizations/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
6 changes: 6 additions & 0 deletions apps/optimizations/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.urls import path
from .views import *

urlpatterns = [
path('', OptimizationView.as_view(), name='optimization')
]
Empty file.
Loading

0 comments on commit aad5de5

Please sign in to comment.