1
1
from base64 import b64decode
2
2
from datetime import datetime
3
3
from math import ceil
4
- from os import listdir , remove
4
+ from os import remove
5
+ from os .path import isfile , getmtime
5
6
from time import time
6
7
7
8
from django .contrib .auth .decorators import login_required
8
- from django .shortcuts import render , redirect , HttpResponse
9
+ from django .shortcuts import render , redirect
9
10
10
- from tracker import photos_path , utility , temp_path
11
+ from tracker import model_filename , temp_path
12
+ from tracker .engine import predict , train as do_train
11
13
from tracker .forms import UserForm , ImageForm
12
14
from tracker .models import Attendance , User , Image
13
- from tracker .recognition import predict , get_nbr_photos , train as do_train
14
15
15
16
16
17
@login_required
17
18
def home (request ):
18
- return render (request , "home.html" ,
19
- {'photos' : get_nbr_photos (),
20
- 'users' : User .objects .count (),
21
- 'last_training' : utility .last_training ()}, )
19
+ return render (request , "home.html" , {
20
+ 'photos' : Image .objects .count (),
21
+ 'users' : User .objects .count (),
22
+ 'last_training' : datetime .fromtimestamp (getmtime (model_filename )) if isfile (model_filename ) else None
23
+ })
22
24
23
25
24
26
@login_required
25
27
def add_user (request ):
26
28
if request .method == 'POST' :
27
- form = UserForm (request .POST , request .FILES )
28
- instance = form .save (commit = False )
29
- instance .save ()
30
- return redirect (home )
29
+ UserForm (request .POST , request .FILES ).save ()
30
+ return redirect ('users' )
31
31
return render (request , 'userdetails.html' , {'formset' : UserForm ()})
32
32
33
33
@@ -62,14 +62,14 @@ def upload(request):
62
62
63
63
64
64
@login_required
65
- def display_users (request ):
65
+ def users (request ):
66
66
return render (request , 'user.html' , {'users' : User .objects .all ()})
67
67
68
68
69
69
@login_required
70
70
def train (request ):
71
- if not utility . are_there_photos ():
72
- return redirect ('/capture/ ?status=empty' )
71
+ if not Image . objects . count ():
72
+ return redirect ('/capture?status=empty' )
73
73
if request .method == 'GET' :
74
74
return render (request , 'train.html' )
75
75
start = time ()
@@ -78,51 +78,44 @@ def train(request):
78
78
return render (request , 'train.html' , {'duration' : duration })
79
79
80
80
81
- @login_required
82
- def receive_images (request ):
83
- label = request .POST .get ('label' )
84
- photos = request .POST .getlist ('photos[]' )
85
- utility .save_base64_photos (label , photos )
86
- return HttpResponse ()
87
-
88
-
89
81
@login_required
90
82
def profile (request , user_id ):
91
- user_data = User .objects .get (pk = user_id )
92
- images = [filename for filename in listdir (photos_path ) if filename .split ('_' )[0 ] == str (user_id )]
93
- return render (request , 'profile.html' , {'user' : user_data , 'images' : images })
83
+ return render (request , 'profile.html' , {'user' : User .objects .get (pk = user_id )})
94
84
95
85
96
86
@login_required
97
87
def delete_user (request , user_id ):
98
- User .objects .filter (id = user_id ).delete ()
99
- images = [filename for filename in listdir (photos_path ) if filename .split ('_' )[0 ] == str (user_id )]
100
- for image in images :
101
- remove ('static/photos/' + image )
88
+ user = User .objects .get (id = user_id )
89
+ for image in user .image_set .all ():
90
+ try :
91
+ remove (image .Image .path )
92
+ except (FileNotFoundError , ValueError ):
93
+ pass
94
+ user .delete ()
102
95
return redirect ('users' )
103
96
104
97
105
98
@login_required
106
99
def recognize (request ):
107
- if not utility . is_model_trained ( ):
100
+ if not isfile ( model_filename ):
108
101
return redirect ('/train/?status=untrained' )
109
102
if request .method == 'POST' :
110
- paths = []
103
+ files = []
111
104
if frame := request .POST .get ('frame' ):
112
105
ext , img = frame .split (';base64,' )
113
106
ext = ext .split ('/' )[- 1 ]
114
107
name = f'{ temp_path } /rec_frame.{ ext } '
115
108
with open (name , 'wb' ) as fh :
116
109
fh .write (b64decode (img ))
117
- paths .append (name )
110
+ files .append (name )
118
111
if images := request .FILES .getlist ('images' ):
119
112
for i , image in enumerate (images ):
120
113
name = f'{ temp_path } /rec{ i } .jpg'
121
114
with open (name , 'wb' ) as fh :
122
115
fh .write (image .file .read ())
123
- paths .append (name )
124
- if paths :
125
- if predictions := predict (paths ):
116
+ files .append (name )
117
+ if files :
118
+ if predictions := predict (files ):
126
119
user_id , confidence = predictions [0 ][:2 ]
127
120
user = User .objects .get (id = user_id )
128
121
name = 'Unknown' if user_id in (- 1 , None ) else user .first_name + ' ' + user .last_name
0 commit comments