Completed
Push — master ( 02ad19...c4b8e2 )
by Andrew
01:27
created

statistics()   A

Complexity

Conditions 3

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 10
rs 9.4286
1
# -*- encoding: utf-8 -*-
2
import json
3
4
from django.contrib.auth import authenticate
5
from django.contrib.auth import login as djangologin
6
from django.contrib.auth import logout as djangologout
7
from django.core.context_processors import csrf
8
from django.core.exceptions import ObjectDoesNotExist, ValidationError
9
from django.db import transaction
10
from django.http import Http404
11
from django.http import HttpResponse, HttpResponseNotAllowed
12
from django.http import HttpResponseRedirect
13
from django.shortcuts import render_to_response
14
from django.template import RequestContext
15
from django.views.decorators.http import require_http_methods
16
17
from chat import utils
18
from chat.decorators import login_required_no_redirect
19
from chat.forms import UserProfileForm, UserProfileReadOnlyForm
20
from chat.models import Issue, Room, IssueDetails, IpAddress, UserProfile
21
from chat.settings import ANONYMOUS_REDIS_ROOM, REGISTERED_REDIS_ROOM, VALIDATION_IS_OK, DATE_INPUT_FORMATS_JS, logging
22
from chat.utils import hide_fields, check_user, check_password, check_email, extract_photo, send_email_verification
23
24
logger = logging.getLogger(__name__)
25
26
27
@require_http_methods(['POST'])
28
def validate_email(request):
29
	"""
30
	POST only, validates email during registration
31
	"""
32
	email = request.POST.get('email')
33
	try:
34
		utils.check_email(email)
35
		response = VALIDATION_IS_OK
36
	except ValidationError as e:
37
		response = e.message
38
	return HttpResponse(response, content_type='text/plain')
39
40
41
@require_http_methods(['GET'])
42
def update_session_key(request):
43
	"""
44
	Creates a new session key, saves it to session store and to response
45
	"""
46
	old_key = request.session.session_key
47
	request.session.create()  # updates the session_key
48
	logger.info("Session key %s has been updated to %s", old_key, request.session.session_key)
49
	request.session.modified = True
50
	return HttpResponse(VALIDATION_IS_OK, content_type='text/plain')
51
52
53
@require_http_methods('POST')
54
def validate_user(request):
55
	"""
56
	Validates user during registration
57
	"""
58
	try:
59
		username = request.POST.get('username')
60
		utils.check_user(username)
61
		# hardcoded ok check in register.js
62
		message = VALIDATION_IS_OK
63
	except ValidationError as e:
64
		message = e.message
65
	return HttpResponse(message, content_type='text/plain')
66
67
68
@require_http_methods('GET')
69
def home(request):
70
	"""
71
	Login or logout navbar is creates by means of create_nav_page
72
	@return:  the x intercept of the line M{y=m*x+b}.
73
	"""
74
	return render_to_response('chat.html', csrf(request), context_instance=RequestContext(request))
75
76
77
@login_required_no_redirect
78
def logout(request):
79
	"""
80
	POST. Logs out into system.
81
	"""
82
	djangologout(request)
83
	response = HttpResponseRedirect('/')
84
	return response
85
86
87
@require_http_methods(['POST'])
88
def auth(request):
89
	"""
90
	Logs in into system.
91
	"""
92
	username = request.POST.get('username')
93
	password = request.POST.get('password')
94
	user = authenticate(username=username, password=password)
95
	if user is not None:
96
		djangologin(request, user)
97
		message = VALIDATION_IS_OK
98
	else:
99
		message = 'Login or password is wrong'
100
	logger.debug('Auth request %s ; Response: %s', hide_fields(request.POST, 'password'), message)
101
	response = HttpResponse(message, content_type='text/plain')
102
	return response
103
104
105
@require_http_methods('GET')
106
def confirm_email(request):
107
	"""
108
	Accept the verification code sent to email
109
	"""
110
	code = request.GET.get('code', False)
111
	try:
112
		u = UserProfile.objects.get(verify_code=code)
113
		logger.debug('Processing email confirm (code %s) for user %s', code, u)
114
		if u.email_verified is False:
115
			u.email_verified = True
116
			u.save()
117
			message = VALIDATION_IS_OK
118
			logger.info('Email verification code has been accepted')
119
		else:
120
			message = 'This code is already accepted'
121
			logger.debug(message)
122
		response = {'message': message}
123
		return render_to_response('confirm_mail.html', response, context_instance=RequestContext(request))
124
	except UserProfile.DoesNotExist:
125
		logger.debug('Rejecting verification code %s', code)
126
		raise Http404
127
128
129
@require_http_methods('GET')
130
def get_register_page(request):
131
	c = csrf(request)
132
	c.update({'error code': "welcome to register page"})
133
	return render_to_response("register.html", c, context_instance=RequestContext(request))
134
135
136
@transaction.atomic
137
@require_http_methods('POST')
138
def register(request):
139
	try:
140
		rp = request.POST
141
		logger.info('Got register request %s', hide_fields(rp, 'password', 'repeatpassword'))
142
		(username, password, email) = (rp.get('username').strip(), rp.get('password').strip(), rp.get('email').strip())
143
		check_user(username)
144
		check_password(password)
145
		check_email(email)
146
		user = UserProfile(username=username, email=email, sex_str=rp.get('sex'))
147
		user.set_password(password)
148
		default_thread, created_default = Room.objects.get_or_create(name=ANONYMOUS_REDIS_ROOM)
149
		registered_only, created_registered = Room.objects.get_or_create(name=REGISTERED_REDIS_ROOM)
150
		user.save()
151
		user.rooms.add(default_thread)
152
		user.rooms.add(registered_only)
153
		user.save()
154
		logger.info(
155
			'Signed up new user %s, subscribed for channels %s, %s',
156
			user, registered_only.name, default_thread.name
157
		)
158
		# You must call authenticate before you can call login
159
		auth_user = authenticate(username=username, password=password)
160
		djangologin(request, auth_user)
161
		# register,js redirect if message = 'Account created'
162
		message = VALIDATION_IS_OK
163
		if email:
164
			send_email_verification(user, request.get_host())
165
	except ValidationError as e:
166
		message = e.message
167
		logger.debug('Rejecting request because "%s"', message)
168
	return HttpResponse(message, content_type='text/plain')
169
170
171
@require_http_methods('GET')
172
@login_required_no_redirect
173
def change_profile(request):
174
	user_profile = UserProfile.objects.get(pk=request.user.id)
175
	form = UserProfileForm(instance=user_profile)
176
	c = csrf(request)
177
	c['form'] = form
178
	c['date_format'] = DATE_INPUT_FORMATS_JS
179
	return render_to_response('change_profile.html', c, context_instance=RequestContext(request))
180
181
182
@require_http_methods('GET')
183
def show_profile(request, profile_id):
184
	try:
185
		user_profile = UserProfile.objects.get(pk=profile_id)
186
		form = UserProfileReadOnlyForm(instance=user_profile)
187
		form.username = user_profile.username
188
		return render_to_response(
189
			'show_profile.html',
190
			{'form': form},
191
			context_instance=RequestContext(request)
192
		)
193
	except ObjectDoesNotExist:
194
		raise Http404
195
196
197
@require_http_methods('POST')
198
@login_required_no_redirect
199
def save_profile(request):
200
	logger.info('Saving profile: %s', hide_fields(request.POST, "base64_image", huge=True))
201
	user_profile = UserProfile.objects.get(pk=request.user.id)
202
	image_base64 = request.POST.get('base64_image')
203
204
	if image_base64 is not None:
205
		image = extract_photo(image_base64)
206
		request.FILES['photo'] = image
207
208
	form = UserProfileForm(request.POST, request.FILES, instance=user_profile)
209
	if form.is_valid():
210
		form.save()
211
		response = VALIDATION_IS_OK
212
	else:
213
		response = form.errors
214
	return HttpResponse(response, content_type='text/plain')
215
216
217
@transaction.atomic
218
@require_http_methods(('POST', 'GET'))
219
def report_issue(request):
220
	if request.method == 'GET':
221
		return render_to_response(
222
			'issue.html',  # getattr for anonymous.email
223
			{'email': getattr(request.user, 'email', '')},
224
			context_instance=RequestContext(request)
225
		)
226
	elif request.method == 'POST':
227
		logger.info('Saving issue: %s', hide_fields(request.POST, 'log', huge=True))
228
		issue, created = Issue.objects.get_or_create(content=request.POST['issue'])
229
		issue_details = IssueDetails(
230
			sender_id=request.user.id,
231
			email=request.POST.get('email'),
232
			browser=request.POST.get('browser'),
233
			issue=issue,
234
			log=request.POST.get('log')
235
		)
236
		issue_details.save()
237
238
		return HttpResponse(VALIDATION_IS_OK, content_type='text/plain')
239
	else:
240
		raise HttpResponseNotAllowed
241
242
243
@require_http_methods('GET')
244
def hack(request):
245
	return render_to_response('')
246
247
248
@require_http_methods('GET')
249
def statistics(request):
250
	pie = {}
251
	for address in IpAddress.objects.all().filter(country__isnull=False):
252
		pie[address.country] = pie.get(address.country, 0) + 1
253
	pie_data = [{'country': key, "count": value} for key, value in pie.items()]
254
	return render_to_response(
255
		'statistic.html',
256
		{'dataProvider': json.dumps(pie_data)},
257
		context_instance=RequestContext(request)
258
	)
259