-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathviews.py
139 lines (112 loc) · 4.24 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import re
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models import Q
from django.http import JsonResponse
from decorators import auth_required
from hierarchy.models import Department
from .models import StudentInfo, StudentStatus
@auth_required
def me(request):
user_info = StudentInfo.objects.get(user=request.user)
return JsonResponse(user_info.as_dict())
@auth_required
def me_edit(request):
user_info = StudentInfo.objects.get(user=request.user)
username = request.POST.get('username')
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
department_id = request.POST.get('department_id')
if username is not None and user_info.user.username != username:
if User.objects.filter(username=username).count():
return JsonResponse({
'status': 'warning',
'message': 'This username is already taken',
})
if 16 < len(username) or len(username) < 4:
return JsonResponse({
'status': 'warning',
'message': 'Length must be between 4 and 16 characters.',
})
if not re.match("^[A-Za-z0-9_]*$", username):
return JsonResponse({
'status': 'warning',
'message': 'Username can only contains letters, numbers and underscores.',
})
user_info.user.username = username
if first_name is not None:
if 30 < len(first_name):
return JsonResponse({
'status': 'warning',
'message': 'Length must be up to 30 characters.',
})
user_info.user.first_name = first_name
if last_name is not None:
if 30 < len(last_name):
return JsonResponse({
'status': 'warning',
'message': 'Length must be up to 30 characters.',
})
user_info.user.last_name = last_name
if department_id is not None:
try:
department = Department.objects.get(id=department_id)
except Exception as e:
return JsonResponse({
'status': 'warning',
'message': 'Department_id is incorrect.',
})
user_info.department = department
user_info.user.save()
user_info.save()
return JsonResponse({
'status': 'success',
'message': 'Changes saved',
'user_info': user_info.as_dict(),
})
@auth_required
def get(request):
student_id = request.GET.get('id')
username = request.GET.get('username')
if student_id is not None:
student = StudentInfo.objects.get(id=student_id)
elif username is not None:
student = StudentInfo.objects.get(user__username=username)
else:
raise ValueError('Please provide either student_id or username')
return JsonResponse(student.as_dict())
@auth_required
def search(request):
query = request.GET.get('q')
department_id = request.GET.get('department_id')
is_avatar_set = request.GET.get('avatar')
status_id = request.GET.get('status_id')
page = request.GET.get('p', 1)
page_size = request.GET.get('ps', 15)
students = StudentInfo.objects.all()
if query is not None:
students = students.filter(user__username__icontains=query)
if department_id is not None:
students = students.filter(department_id=department_id)
if status_id is not None:
students = students.filter(status_id=status_id)
if is_avatar_set is not None:
def_ava = Q(avatar=StudentInfo.avatar.field.default)
students = students.filter(~def_ava if is_avatar_set else def_ava)
paginator = Paginator(students, page_size)
try:
students_page = paginator.page(page)
except PageNotAnInteger:
students_page = paginator.page(1)
except EmptyPage:
students_page = list()
return JsonResponse({'students': [
student.as_dict() for student in students_page
]})
@auth_required
def get_statuses(request):
statuses = StudentStatus.objects.all()
return JsonResponse({'statuses': [
status.as_dict() for status in statuses
]})