diff --git a/Main/views/CheckNew.py b/Main/views/CheckNew.py new file mode 100644 index 0000000..2577c72 --- /dev/null +++ b/Main/views/CheckNew.py @@ -0,0 +1,24 @@ +from django.contrib.auth.models import User +from django.http import HttpResponse + +from SprintLib.BaseView import BaseView + + +class CheckNew(BaseView): + endpoint = "check_new" + + def post_check_username(self): + username = self.request.POST['username'] + user = User.objects.filter(username=username).first() + if len(username) < 8: + user = 'incorrect' + return HttpResponse(status=400 if user else 200) + + def post_check_email(self): + email = self.request.POST['email'] + user = User.objects.filter(email=email).first() + if email.count('.') == 0 or email.count('@') != 1: + user = 'incorrect' + if email.find('@') > email.rfind('.'): + user = 'incorrect' + return HttpResponse(status=400 if user else 200) diff --git a/Main/views/EnterView.py b/Main/views/EnterView.py index 3b98037..f44e08c 100644 --- a/Main/views/EnterView.py +++ b/Main/views/EnterView.py @@ -1,3 +1,7 @@ +from django.contrib.auth import authenticate, login +from django.contrib.auth.models import User +from django.db.models import Q + from SprintLib.BaseView import BaseView @@ -5,3 +9,14 @@ class EnterView(BaseView): view_file = "enter.html" required_login = False endpoint = "enter" + + def post(self): + username = self.request.POST['username'] + user = User.objects.filter(Q(username=username) | Q(email=username)).first() + if user is None: + return "/enter" + user = authenticate(username=user.username, password=self.request.POST['password']) + if user is None: + return "/enter" + login(self.request, user) + return "/" diff --git a/Main/views/MainView.py b/Main/views/MainView.py index 6548a6d..eacfaae 100644 --- a/Main/views/MainView.py +++ b/Main/views/MainView.py @@ -15,7 +15,7 @@ class MainView(BaseView): @property def view_file(self): - if self.request.user.is_authenticated: + if self.request.user.is_authenticated and self.request.user.userinfo.verified: return "main.html" return "landing.html" diff --git a/Main/views/RegisterView.py b/Main/views/RegisterView.py new file mode 100644 index 0000000..d669b0c --- /dev/null +++ b/Main/views/RegisterView.py @@ -0,0 +1,34 @@ +from django.contrib.auth import login +from django.contrib.auth.models import User +from django.db.models import Q + +from Main.models import UserInfo +from SprintLib.BaseView import BaseView + + +class RegisterView(BaseView): + view_file = "register.html" + required_login = False + endpoint = "register" + + def post(self): + username = self.request.POST['username'] + email = self.request.POST['email'] + surname = self.request.POST['surname'] + name = self.request.POST['name'] + password = self.request.POST['password'] + if User.objects.filter(Q(email=email) | Q(username=username)): + return '/register' + user = User.objects.create_user( + username=username, + email=email, + password=password + ) + UserInfo.objects.create( + surname=surname, + name=name, + user=user, + verified=True + ) + login(self.request, user) + return "/" diff --git a/Main/views/SetUsernameView.py b/Main/views/SetUsernameView.py new file mode 100644 index 0000000..102ffa0 --- /dev/null +++ b/Main/views/SetUsernameView.py @@ -0,0 +1,28 @@ +from django.contrib.auth import login +from django.contrib.auth.models import User + +from SprintLib.BaseView import BaseView + + +class SetUsernameView(BaseView): + endpoint = "set_username" + view_file = "set_username.html" + required_login = False + + def get(self): + if not self.request.user.is_authenticated: + return "/" + + def post(self): + if not self.request.user.is_authenticated: + return "/" + user = User.objects.filter(username=self.request.POST['username']).first() + if user is None: + self.request.user.username = self.request.POST['username'] + self.request.user.userinfo.verified = True + self.request.user.save() + self.request.user.userinfo.save() + login(self.request, self.request.user) + return "/" + else: + return "/set_username" diff --git a/Main/views/TelegramEnterView.py b/Main/views/TelegramEnterView.py new file mode 100644 index 0000000..e3a3c74 --- /dev/null +++ b/Main/views/TelegramEnterView.py @@ -0,0 +1,22 @@ +from django.contrib.auth import authenticate, login +from django.contrib.auth.models import User +from django.db.models import Q + +from SprintLib.BaseView import BaseView + + +class TelegramEnterView(BaseView): + view_file = "telegram_enter.html" + required_login = False + endpoint = "telegram_enter" + + def post(self): + username = self.request.POST['username'] + user = User.objects.filter(Q(username=username) | Q(email=username)).first() + if user is None: + return "/enter" + user = authenticate(username=user.username, password=self.request.POST['password']) + if user is None: + return "/enter" + login(self.request, user) + return "/" diff --git a/Main/views/__init__.py b/Main/views/__init__.py index cd7cc38..6598cde 100644 --- a/Main/views/__init__.py +++ b/Main/views/__init__.py @@ -18,4 +18,8 @@ from Main.views.SetView import SetView from Main.views.GroupView import GroupView from Main.views.CheckersView import CheckersView from Main.views.DownloadFileView import DownloadFileView +from Main.views.RegisterView import RegisterView +from Main.views.CheckNew import CheckNew +from Main.views.TelegramEnterView import TelegramEnterView +from Main.views.SetUsernameView import SetUsernameView from Main.views.social import * diff --git a/Main/views/social/VKAuthView.py b/Main/views/social/VKAuthView.py index eac6d1b..32931f1 100644 --- a/Main/views/social/VKAuthView.py +++ b/Main/views/social/VKAuthView.py @@ -1,10 +1,13 @@ import os +import random +import string from django.contrib.auth import login from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist from requests import get +from Main.models import UserInfo from SprintLib.BaseView import BaseView @@ -22,10 +25,26 @@ class VKAuthView(BaseView): resp = get(f'https://api.vk.com/method/secure.checkToken?token={access_token}&access_token={token}&v=5.131').json() if 'response' in resp and 'success' in resp['response'] and resp['response']['success'] == 1: user_id = resp['response']['user_id'] + random_string = lambda: ''.join(random.choices(string.ascii_uppercase + string.digits, k=100)) try: user = User.objects.get(userinfo__vk_user_id=user_id) except ObjectDoesNotExist: - return "/enter" + resp = get(f'https://api.vk.com/method/users.get?access_token={token}&user_ids={user_id}&v=5.131', + headers={"accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}) + if resp.status_code != 200: + return "/enter" + data = resp.json()['response'][0] + user = User.objects.create_user( + username=random_string(), + email='', + password=random_string() + ) + UserInfo.objects.create( + surname=data['last_name'], + name=data['first_name'], + vk_user_id=user_id, + user=user + ) login(self.request, user) - return "/" + return "/set_username" return "/enter" diff --git a/SprintLib/BaseView.py b/SprintLib/BaseView.py index c66c6a6..2344c79 100644 --- a/SprintLib/BaseView.py +++ b/SprintLib/BaseView.py @@ -33,7 +33,9 @@ class BaseView: if c.required_login is not None: if c.required_login and not request.user.is_authenticated: return HttpResponseRedirect("/enter") - if not c.required_login and request.user.is_authenticated: + if c.required_login and not request.user.userinfo.verified: + return HttpResponseRedirect("/set_username") + if not c.required_login and request.user.is_authenticated and request.user.userinfo.verified: return HttpResponseRedirect("/") request_method = request.method.lower() exec("from Main.models import *") diff --git a/templates/enter.html b/templates/enter.html index 6c5399a..56f4c0c 100644 --- a/templates/enter.html +++ b/templates/enter.html @@ -2,41 +2,6 @@ {% block title %}Вход{% endblock %} -{% block scripts %} - function send_code() { - const p = document.getElementById('message'); - if (document.getElementById('state').value == 'code') { - $.ajax({ - type: "POST", - url: '/send_code', - data: {"username": document.getElementById('username').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "create"}, - success: function(data) { - if (data['success']) { - document.getElementById('code').hidden = false; - document.getElementById('enter').firstChild.data = "Вход"; - document.getElementById('state').value = "verify"; - p.innerHTML = ''; - } else { - p.innerHTML = data['message']; - } - }}); - } else { - $.ajax({ - type: "POST", - url: '/send_code', - data: {"username": document.getElementById('username').value, "code": document.getElementById('code').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check"}, - success: function(data) { - if (data['success']) { - window.location.href = '/'; - } else { - p.innerHTML = data['message']; - } - }, - }); - } - } -{% endblock %} - {% block body %}
@@ -44,18 +9,21 @@

Sprint

-

- {% csrf_token %} -
-
- - +
+

+ {% csrf_token %} +
+
+ + +
- Регистрация + Регистрация

или войти с помощью

- + + {% endblock %} \ No newline at end of file diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 0000000..52d4393 --- /dev/null +++ b/templates/register.html @@ -0,0 +1,107 @@ +{% extends 'base.html' %} + +{% block title %}Вход{% endblock %} + +{% block scripts %} + var data = { + 'username': false, + 'name': false, + 'surname': false, + 'name': false, + 'password': false + } + function checkData() { + var result = true; + for (const [key, value] of Object.entries(data)) { + result = result && value; + } + const button = document.getElementById('register'); + button.disabled = !result; + } + function checkUsername() { + const username = document.getElementById('username'); + $.ajax({ + type: "POST", + url: '/check_new', + data: {"username": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_username"}, + statusCode: { + 200: function() { + username.style.backgroundColor = '#00FF00AA'; + data['username'] = true; + }, + 400: function() { + username.style.backgroundColor = '#FF0000AA'; + data['username'] = false; + } + } + }); + checkData(); + } + function simpleCheck(element) { + const username = document.getElementById(element); + if (username.value !== "") { + username.style.backgroundColor = '#00FF00AA'; + data[element] = true; + } else { + username.style.backgroundColor = '#FF0000AA'; + data[element] = false; + } + checkData(); + } + function checkEmail() { + const username = document.getElementById('email'); + $.ajax({ + type: "POST", + url: '/check_new', + data: {"email": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_email"}, + statusCode: { + 200: function() { + username.style.backgroundColor = '#00FF00AA'; + data['email'] = true; + }, + 400: function() { + username.style.backgroundColor = '#FF0000AA'; + data['email'] = false; + } + } + }); + checkData(); + } + function checkPassword() { + const password = document.getElementById('password'); + const repeat = document.getElementById('repeat'); + if (password.value !== repeat.value) { + password.style.backgroundColor = '#FF0000AA'; + repeat.style.backgroundColor = '#FF0000AA'; + data['password'] = false; + } else { + password.style.backgroundColor = '#00FF00AA'; + repeat.style.backgroundColor = '#00FF00AA'; + data['password'] = true; + } + checkData(); + } +{% endblock %} + +{% block body %} +
+
+
+

Sprint

+
+
+
+

+ {% csrf_token %} +
+
+
+
+
+
+ +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/set_username.html b/templates/set_username.html new file mode 100644 index 0000000..beeb099 --- /dev/null +++ b/templates/set_username.html @@ -0,0 +1,55 @@ +{% extends 'base.html' %} + +{% block title %}Вход{% endblock %} + +{% block scripts %} + var data = { + 'username': false, + } + function checkData() { + var result = true; + for (const [key, value] of Object.entries(data)) { + result = result && value; + } + const button = document.getElementById('register'); + button.disabled = !result; + } + function checkUsername() { + const username = document.getElementById('username'); + $.ajax({ + type: "POST", + url: '/check_new', + data: {"username": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_username"}, + statusCode: { + 200: function() { + username.style.backgroundColor = '#00FF00AA'; + data['username'] = true; + checkData(); + }, + 400: function() { + username.style.backgroundColor = '#FF0000AA'; + data['username'] = false; + checkData(); + } + } + }); + } +{% endblock %} + +{% block body %} +
+
+
+

Sprint

+
+
+
+

+ {% csrf_token %} +
+ +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/telegram_enter.html b/templates/telegram_enter.html new file mode 100644 index 0000000..53c3765 --- /dev/null +++ b/templates/telegram_enter.html @@ -0,0 +1,59 @@ +{% extends 'base.html' %} + +{% block title %}Вход{% endblock %} + +{% block scripts %} + function send_code() { + const p = document.getElementById('message'); + if (document.getElementById('state').value == 'code') { + $.ajax({ + type: "POST", + url: '/send_code', + data: {"username": document.getElementById('username').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "create"}, + success: function(data) { + if (data['success']) { + document.getElementById('code').hidden = false; + document.getElementById('enter').firstChild.data = "Вход"; + document.getElementById('state').value = "verify"; + p.innerHTML = ''; + } else { + p.innerHTML = data['message']; + } + }}); + } else { + $.ajax({ + type: "POST", + url: '/send_code', + data: {"username": document.getElementById('username').value, "code": document.getElementById('code').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check"}, + success: function(data) { + if (data['success']) { + window.location.href = '/'; + } else { + p.innerHTML = data['message']; + } + }, + }); + } + } +{% endblock %} + +{% block body %} +
+
+
+

Sprint

+
+
+

+ {% csrf_token %} +
+
+ + +
+
+ Регистрация +

+
+
+{% endblock %}