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 %}
-
-
-
-
+
или войти с помощью
-
+
+
{% 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 |
+
+
+
+
+{% 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 %}
+
+{% 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 %}
+
+
+
+
+
+ {% csrf_token %}
+
+
+
+
+
+
+
+
+{% endblock %}