-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
43 changed files
with
729 additions
and
18 deletions.
There are no files selected for viewing
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from django.test import TestCase | ||
|
||
# Create your tests here. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
Oops, something went wrong.