Toggle navigation
Toggle navigation
This project
Loading...
Sign in
cse437_e
/
smartdoorlock-backend
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
최지우
2020-11-13 21:38:46 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
a5a7580e6fcbd481f2dbba969469cd042a73e6ef
a5a7580e
1 parent
edbb57b8
비디오 관련 api 수정 및 비디오 저장 프로세스 예시
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
68 additions
and
57 deletions
api/migrations/0001_initial.py
api/migrations/0002_auto_20201110_1944.py
api/models.py
api/videorecord.py
api/views.py
src/urls.py
api/migrations/0001_initial.py
View file @
a5a7580
# Generated by Django 3.1.2 on 2020-11-
04 11:24
# Generated by Django 3.1.2 on 2020-11-
13 10:30
from
django.db
import
migrations
,
models
import
django.db.models.deletion
import
django.utils.timezone
...
...
@@ -35,27 +34,24 @@ class Migration(migrations.Migration):
],
),
migrations
.
CreateModel
(
name
=
'
Video
'
,
name
=
'
Lock
'
,
fields
=
[
(
'vid_id'
,
models
.
IntegerField
(
primary_key
=
True
,
serialize
=
False
)),
(
'created'
,
models
.
DateTimeField
(
default
=
django
.
utils
.
timezone
.
now
)),
(
's3_link'
,
models
.
CharField
(
max_length
=
255
)),
(
'id'
,
models
.
IntegerField
(
primary_key
=
True
,
serialize
=
False
)),
(
'state'
,
models
.
BooleanField
(
default
=
True
)),
],
),
migrations
.
CreateModel
(
name
=
'Record'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
primary_key
=
True
,
serialize
=
False
,
verbose_name
=
'ID'
)),
(
'id'
,
models
.
IntegerField
(
primary_key
=
True
,
serialize
=
False
)),
(
'recording'
,
models
.
BooleanField
(
default
=
True
)),
(
'door'
,
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
to
=
'api.door'
)),
],
),
migrations
.
CreateModel
(
name
=
'
Lock
'
,
name
=
'
Video
'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
primary_key
=
True
,
serialize
=
False
,
verbose_name
=
'ID'
)),
(
'state'
,
models
.
BooleanField
(
default
=
True
)),
(
'door'
,
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
to
=
'api.door'
)),
(
'vid_name'
,
models
.
CharField
(
max_length
=
255
,
primary_key
=
True
,
serialize
=
False
)),
(
'created'
,
models
.
DateTimeField
(
default
=
django
.
utils
.
timezone
.
now
)),
],
),
]
...
...
api/migrations/0002_auto_20201110_1944.py
deleted
100644 → 0
View file @
edbb57b
# Generated by Django 3.1.2 on 2020-11-10 10:44
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'api'
,
'0001_initial'
),
]
operations
=
[
migrations
.
RemoveField
(
model_name
=
'lock'
,
name
=
'door'
,
),
migrations
.
RemoveField
(
model_name
=
'record'
,
name
=
'door'
,
),
migrations
.
AlterField
(
model_name
=
'lock'
,
name
=
'id'
,
field
=
models
.
IntegerField
(
primary_key
=
True
,
serialize
=
False
),
),
migrations
.
AlterField
(
model_name
=
'record'
,
name
=
'id'
,
field
=
models
.
IntegerField
(
primary_key
=
True
,
serialize
=
False
),
),
]
api/models.py
View file @
a5a7580
...
...
@@ -11,9 +11,8 @@ class Device(models.Model) :
created
=
models
.
DateTimeField
(
default
=
timezone
.
now
)
class
Video
(
models
.
Model
)
:
vid_
id
=
models
.
IntegerField
(
primary_key
=
True
)
vid_
name
=
models
.
CharField
(
max_length
=
255
,
primary_key
=
True
)
created
=
models
.
DateTimeField
(
default
=
timezone
.
now
)
s3_link
=
models
.
CharField
(
max_length
=
255
)
class
Lock
(
models
.
Model
)
:
id
=
models
.
IntegerField
(
primary_key
=
True
)
...
...
api/videorecord.py
0 → 100644
View file @
a5a7580
import
os
import
boto3
import
botocore
import
time
import
datetime
from
django.core
import
serializers
from
api.models
import
Video
,
Record
from
api.serializers
import
VideoSerializer
,
RecordSerializer
'''
import picamera
from boto3.session import Session
from src.settings import AWS_REGION, S3_ACCESS_URL, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_STORAGE_BUCKET_NAME
'''
def
record
()
:
path
=
'/home/pi/recorded'
# 저장할 경로
state
=
True
while
state
:
target
=
Record
.
objects
.
get
(
id
=
1
)
serializer
=
RecordSerializer
(
target
,
many
=
False
)
state
=
serializer
.
data
[
'recording'
]
with
picamera
.
Picamera
()
as
camera
:
camera
.
resolution
=
[
320
,
240
]
now
=
datetime
.
datetime
.
now
()
vid_name
=
now
.
strftime
(
'
%
Y
%
m
%
d-
%
H
%
M
%
S'
)
vid_path
=
path
+
'/'
+
vid_name
+
'.h264'
camera
.
start_recording
(
output
=
vid_path
)
camera
.
wait_recording
(
10
)
camera
.
stop_recording
()
s3
=
boto3
.
client
(
's3'
,
region_name
=
'ap-northeast-2'
)
s3
.
upload_file
(
Filename
=
vid_path
,
Bucket
=
S3_STORAGE_BUCKET_NAME
,
Key
=
vid_name
)
uploadVideo
=
{}
uploadVideo
[
'vid_name'
]
=
vid_name
uploadVideo
[
'created'
]
=
now
serializer
=
VideoSerializer
(
data
=
uploadVideo
)
serializer
.
save
()
os
.
remove
(
vid_path
)
\ No newline at end of file
api/views.py
View file @
a5a7580
import
boto3
import
botocore
import
threading
from
django.http
import
HttpResponse
from
django.core
import
serializers
from
django.core.exceptions
import
FieldDoesNotExist
,
ObjectDoesNotExist
from
django.shortcuts
import
render
from
api.videorecord
import
record
from
api.models
import
Video
,
Device
,
History
,
Lock
,
Record
,
Door
from
api.serializers
import
VideoSerializer
,
DeviceSerializer
,
HistorySerializer
,
RecordSerializer
...
...
@@ -17,16 +20,13 @@ from src.settings import AWS_REGION
from src.settings import S3_ACCESS_URL
from src.settings import S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_STORAGE_BUCKET_NAME
"""
import
time
from
datetime
import
datetime
,
timedelta
# Create your views here.
# 비디오 목록 조회
class
VideoList
(
APIView
)
:
def
get
(
self
,
request
,
format
=
None
)
:
'''
request_id = request.GET.get('last_id') # requst의 last_id 받아옴
queryset = Video.objects.filter(vid_id__range = (request_id, request_id + 10)) # 쿼리셋 필터로 vid_id의 범위가 last_id ~ las_id + 10인 객체 찾기
'''
queryset
=
Video
.
objects
.
all
()
serializer
=
VideoSerializer
(
queryset
,
many
=
True
)
res
=
{
...
...
@@ -35,16 +35,16 @@ class VideoList(APIView) :
return
Response
(
res
,
status
=
status
.
HTTP_200_OK
)
# 비디오 수동 삭제
def
delete
(
self
,
request
,
vid_
id
,
format
=
None
)
:
# request URI에 vid_id가 포함되어있음 : api/video/{vid_id
}
def
delete
(
self
,
request
,
vid_
name
,
format
=
None
)
:
# request URI에 vid_name가 포함되어있음 : api/video/{vid_name
}
try
:
request_id
=
vid_
id
request_id
=
vid_
name
if
request_id
==
'None'
:
raise
FieldDoesNotExist
session
=
boto3
.
session
.
Session
(
aws_access_key_id
=
S3_ACCESS_KEY_ID
,
aws_secret_access_key
=
S3_SECRET_ACCESS_KEY
,
region_name
=
AWS_REGION
)
s3
=
session
.
client
(
's3'
)
target
=
Video
.
objects
.
get
(
vid_
id
=
request_id
)
s3
.
delete_object
(
Bucket
=
S3_STORAGE_BUCKET_NAME
,
Key
=
str
(
target
.
vid_
id
))
target
=
Video
.
objects
.
get
(
vid_
name
=
request_id
)
s3
.
delete_object
(
Bucket
=
S3_STORAGE_BUCKET_NAME
,
Key
=
str
(
target
.
vid_
name
))
target
.
delete
()
return
Response
(
status
=
status
.
HTTP_200_OK
)
except
FieldDoesNotExist
as
error
:
...
...
@@ -55,9 +55,9 @@ class VideoList(APIView) :
# 비디오 확인(다운로드)
class
VideoDownload
(
APIView
)
:
def
get
(
self
,
request
,
vid_
id
,
format
=
None
)
:
# 요청한 URI에 vid_id가 포함되어있음 ex) api/video/1
def
get
(
self
,
request
,
vid_
name
,
format
=
None
)
:
# 요청한 URI에 vid_name가 포함되어있음
try
:
request_id
=
vid_
id
request_id
=
vid_
name
if
request_id
==
'None'
:
raise
FieldDoesNotExist
download_url
=
S3_ACCESS_URL
+
str
(
request_id
)
# S3 다운로드 링크 변환
...
...
@@ -86,7 +86,7 @@ class CheckDate(APIView) :
session
=
boto3
.
session
.
Session
(
aws_access_key_id
=
S3_ACCESS_KEY_ID
,
aws_secret_access_key
=
S3_SECRET_ACCESS_KEY
,
region_name
=
AWS_REGION
)
s3
=
session
.
client
(
's3'
)
for
delvid
in
quaryset
:
s3
.
delete_object
(
Bucket
=
S3_STORAGE_BUCKET_NAME
,
Key
=
str
(
delvid
.
vid_
id
))
s3
.
delete_object
(
Bucket
=
S3_STORAGE_BUCKET_NAME
,
Key
=
str
(
delvid
.
vid_
name
))
quaryset
.
delete
()
return
Response
(
status
=
status
.
HTTP_200_OK
)
...
...
@@ -110,6 +110,10 @@ class Recording(APIView) :
try
:
target
=
Record
.
objects
.
filter
(
id
=
1
)
target
.
update
(
recording
=
request
.
data
[
'recording'
])
if
request
.
data
[
'recording'
]
:
threading
.
Thread
(
target
=
record
)
.
start
()
return
Response
(
status
=
status
.
HTTP_200_OK
)
except
FieldDoesNotExist
as
error
:
return
Response
({
...
...
src/urls.py
View file @
a5a7580
...
...
@@ -21,7 +21,7 @@ from api import views
urlpatterns
=
[
path
(
'admin/'
,
admin
.
site
.
urls
),
path
(
'api/video'
,
views
.
VideoList
.
as_view
()),
path
(
'api/video/<
int:vid_id
>'
,
views
.
VideoDownload
.
as_view
()),
path
(
'api/video/<
str:vid_name
>'
,
views
.
VideoDownload
.
as_view
()),
path
(
'auto/checkDate'
,
views
.
CheckDate
.
as_view
()),
path
(
'api/setting'
,
views
.
Recording
.
as_view
()),
]
...
...
Please
register
or
login
to post a comment