Completed
Push — master ( 980095...3e3bf3 )
by Andrew
55s
created

update_session_key()   A

Complexity

Conditions 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 10
rs 9.4286
1
# -*- encoding: utf-8 -*-
2
3
from django.contrib.auth import authenticate
4
from django.contrib.auth import login as djangologin
5
from django.contrib.auth import logout as djangologout
6
from django.core.context_processors import csrf
7
from django.core.exceptions import ObjectDoesNotExist
8
from django.db import transaction
9
from django.http import Http404
10
from django.http import HttpResponse, HttpResponseNotAllowed
11
from django.http import HttpResponseRedirect
12
from django.shortcuts import render_to_response
13
from django.template import RequestContext
14
from django.views.decorators.http import require_http_methods
15
16
from chat import registration_utils
17
from chat.decorators import login_required_no_redirect
18
from chat.forms import UserProfileForm, UserProfileReadOnlyForm
19
from chat.models import Issue, Room, IssueDetails
20
from chat.registration_utils import *
21
from chat.settings import ANONYMOUS_REDIS_ROOM, REGISTERED_REDIS_ROOM, logging, VALIDATION_IS_OK
22
23
logger = logging.getLogger(__name__)
24
25
26
@require_http_methods(['POST'])
27
def validate_email(request):
28
	"""
29
	POST only, validates email during registration
30
	"""
31
	email = request.POST.get('email')
32
	try:
33
		registration_utils.check_email(email)
34
		response = settings.VALIDATION_IS_OK
35
	except ValidationError as e:
36
		response = e.message
37
	return HttpResponse(response, content_type='text/plain')
38
39
40
@require_http_methods(['GET'])
41
def update_session_key(request):
42
	"""
43
	Creates a new session key, saves it to session store and to response
44
	"""
45
	old_key = request.session.session_key
46
	request.session.create()  # updates the session_key
47
	logger.info("Session key %s has been updated to %s", old_key, request.session.session_key)
48
	request.session.modified = True
49
	return HttpResponse(settings.VALIDATION_IS_OK, content_type='text/plain')
50
51
52
@require_http_methods('POST')
53
def validate_user(request):
54
	"""
55
	Validates user during registration
56
	"""
57
	try:
58
		username = request.POST.get('username')
59
		registration_utils.check_user(username)
60
		# hardcoded ok check in register.js
61
		message = settings.VALIDATION_IS_OK
62
	except ValidationError as e:
63
		message = e.message
64
	return HttpResponse(message, content_type='text/plain')
65
66
67
@require_http_methods('GET')
68
def home(request):
69
	"""
70
	Login or logout navbar is creates by means of create_nav_page
71
	@return:  the x intercept of the line M{y=m*x+b}.
72
	"""
73
	return render_to_response('chat.html', csrf(request), context_instance=RequestContext(request))
74
75
76
@login_required_no_redirect
77
def logout(request):
78
	"""
79
	POST. Logs out into system.
80
	"""
81
	djangologout(request)
82
	response = HttpResponseRedirect('/')
83
	return response
84
85
86
@require_http_methods(['POST'])
87
def auth(request):
88
	"""
89
	Logs in into system.
90
	"""
91
	username = request.POST.get('username')
92
	password = request.POST.get('password')
93
	user = authenticate(username=username, password=password)
94
	if user is not None:
95
		djangologin(request, user)
96
		message = settings.VALIDATION_IS_OK
97
	else:
98
		message = 'Login or password is wrong'
99
	logger.debug('Auth request %s ; Response: %s', hide_fields(request.POST, 'password'), message)
100
	response = HttpResponse(message, content_type='text/plain')
101
	return response
102
103
104
@require_http_methods('GET')
105
def confirm_email(request):
106
	"""
107
	Accept the verification code sent to email
108
	"""
109
	code = request.GET.get('code', False)
110
	try:
111
		u = UserProfile.objects.get(verify_code=code)
112
		logger.debug('Processing email confirm (code %s) for user %s', code, u)
113
		if u.email_verified is False:
114
			u.email_verified = True
115
			u.save()
116
			message = VALIDATION_IS_OK
117
			logger.info('Email verification code has been accepted')
118
		else:
119
			message = 'This code is already accepted'
120
			logger.debug(message)
121
		response = {'message': message}
122
		return render_to_response('confirm_mail.html', response, context_instance=RequestContext(request))
123
	except UserProfile.DoesNotExist:
124
		logger.debug('Rejecting verification code %s', code)
125
		raise Http404
126
127
128
@require_http_methods('GET')
129
def get_register_page(request):
130
	c = csrf(request)
131
	c.update({'error code': "welcome to register page"})
132
	return render_to_response("register.html", c, context_instance=RequestContext(request))
133
134
135
@transaction.atomic
136
@require_http_methods('POST')
137
def register(request):
138
	try:
139
		rp = request.POST
140
		logger.info('Got register request %s', hide_fields(rp, 'password', 'repeatpassword'))
141
		(username, password, email, verify_email) = (
142
			rp.get('username'), rp.get('password'), rp.get('email'), rp.get('mailbox'))
143
		check_user(username)
144
		check_password(password)
145
		check_email(email, verify_email == 'on')
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 = settings.VALIDATION_IS_OK
163
		if verify_email == 'on':
164
			send_email_verification(user, request.get_host())
165
	except ValidationError as e:
166
		message = e.message
167
		logger.debug('Rejecting request, reason: %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'] = settings.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 = settings.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(settings.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('')