Completed
Push — master ( 1e11de...fb9934 )
by Andrew
01:02
created

handler404()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

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