Completed
Push — master ( fe07f3...924f02 )
by Andrew
57s
created

ProfileView.get()   A

Complexity

Conditions 1

Size

Total Lines 8

Duplication

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