Completed
Push — master ( bec94a...1d1e2b )
by Andrew
57s
created

statistics()   B

Complexity

Conditions 5

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 5
dl 0
loc 19
rs 8.5455
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
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
21
from chat.settings import ANONYMOUS_REDIS_ROOM, REGISTERED_REDIS_ROOM, logging, VALIDATION_IS_OK
22
from chat.utils import *
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 = settings.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(settings.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 = settings.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 = settings.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, verify_email) = (
143
			rp.get('username'), rp.get('password'), rp.get('email'), rp.get('mailbox'))
144
		check_user(username)
145
		check_password(password)
146
		check_email(email, verify_email == 'on')
147
		user = UserProfile(username=username, email=email, sex_str=rp.get('sex'))
148
		user.set_password(password)
149
		default_thread, created_default = Room.objects.get_or_create(name=ANONYMOUS_REDIS_ROOM)
150
		registered_only, created_registered = Room.objects.get_or_create(name=REGISTERED_REDIS_ROOM)
151
		user.save()
152
		user.rooms.add(default_thread)
153
		user.rooms.add(registered_only)
154
		user.save()
155
		logger.info(
156
			'Signed up new user %s, subscribed for channels %s, %s',
157
			user, registered_only.name, default_thread.name
158
		)
159
		# You must call authenticate before you can call login
160
		auth_user = authenticate(username=username, password=password)
161
		djangologin(request, auth_user)
162
		# register,js redirect if message = 'Account created'
163
		message = settings.VALIDATION_IS_OK
164
		if verify_email == 'on':
165
			send_email_verification(user, request.get_host())
166
	except ValidationError as e:
167
		message = e.message
168
		logger.debug('Rejecting request, reason: %s', message)
169
	return HttpResponse(message, content_type='text/plain')
170
171
172
@require_http_methods('GET')
173
@login_required_no_redirect
174
def change_profile(request):
175
	user_profile = UserProfile.objects.get(pk=request.user.id)
176
	form = UserProfileForm(instance=user_profile)
177
	c = csrf(request)
178
	c['form'] = form
179
	c['date_format'] = settings.DATE_INPUT_FORMATS_JS
180
	return render_to_response('change_profile.html', c, context_instance=RequestContext(request))
181
182
183
@require_http_methods('GET')
184
def show_profile(request, profile_id):
185
	try:
186
		user_profile = UserProfile.objects.get(pk=profile_id)
187
		form = UserProfileReadOnlyForm(instance=user_profile)
188
		form.username = user_profile.username
189
		return render_to_response(
190
			'show_profile.html',
191
			{'form': form},
192
			context_instance=RequestContext(request)
193
		)
194
	except ObjectDoesNotExist:
195
		raise Http404
196
197
198
@require_http_methods('POST')
199
@login_required_no_redirect
200
def save_profile(request):
201
	logger.info('Saving profile: %s', hide_fields(request.POST, "base64_image", huge=True))
202
	user_profile = UserProfile.objects.get(pk=request.user.id)
203
	image_base64 = request.POST.get('base64_image')
204
205
	if image_base64 is not None:
206
		image = extract_photo(image_base64)
207
		request.FILES['photo'] = image
208
209
	form = UserProfileForm(request.POST, request.FILES, instance=user_profile)
210
	if form.is_valid():
211
		form.save()
212
		response = settings.VALIDATION_IS_OK
213
	else:
214
		response = form.errors
215
	return HttpResponse(response, content_type='text/plain')
216
217
218
@transaction.atomic
219
@require_http_methods(('POST', 'GET'))
220
def report_issue(request):
221
	if request.method == 'GET':
222
		return render_to_response(
223
			'issue.html',  # getattr for anonymous.email
224
			{'email': getattr(request.user, 'email', '')},
225
			context_instance=RequestContext(request)
226
		)
227
	elif request.method == 'POST':
228
		logger.info('Saving issue: %s', hide_fields(request.POST, 'log', huge=True))
229
		issue, created = Issue.objects.get_or_create(content=request.POST['issue'])
230
		issue_details = IssueDetails(
231
			sender_id=request.user.id,
232
			email=request.POST.get('email'),
233
			browser=request.POST.get('browser'),
234
			issue=issue,
235
			log=request.POST.get('log')
236
		)
237
		issue_details.save()
238
239
		return HttpResponse(settings.VALIDATION_IS_OK, content_type='text/plain')
240
	else:
241
		raise HttpResponseNotAllowed
242
243
244
@require_http_methods('GET')
245
def hack(request):
246
	return render_to_response('')
247
248
249
##################### charts #######################
250
251
252
@require_http_methods('GET')
253
def statistics(request):
254
	data = []
255
	pie = {}
256
	for address in IpAddress.objects.all():
257
		data.append({
258
			'ip' : address.ip,
259
			'city' : address.city,
260
			'country' : address.country,
261
			'isp' : address.isp,
262
			'name' : address.user.username if address.user else address.anon_name
263
		})
264
		if address.country:
265
			pie[address.country] = pie.get(address.country, 0) +1
266
	pie_data = [ {'country': key, "count" : value} for key, value in pie.items()]
267
	return render_to_response(
268
			'statistic.html',
269
		{'dataProvider': json.dumps(pie_data)},
270
			context_instance=RequestContext(request)
271
		)