This commit is contained in:
Egor Matveev 2022-05-10 23:03:04 +03:00
parent 1a6bf13b96
commit d4d7474d9a
13 changed files with 384 additions and 47 deletions

24
Main/views/CheckNew.py Normal file
View File

@ -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)

View File

@ -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 "/"

View File

@ -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"

View File

@ -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 "/"

View File

@ -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"

View File

@ -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 "/"

View File

@ -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 *

View File

@ -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:
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"

View File

@ -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 *")

View File

@ -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 %}
<div class="center">
<center>
@ -44,18 +9,21 @@
<table><tr><td><img style="height: 80px; width: 80px;" src="/static/assets/img/brand/dark.svg" /></td><td><h1>Sprint</h1></td></tr></table>
</div>
<div>
<form method="POST">
<p id="message" style="color: red;"></p>
{% csrf_token %}
<input type="text" class="form" name="username" id="username" placeholder="username"><br>
<input type="password" class="form" name="code" id="code" placeholder="code" hidden><br>
<input type="text" class="form" name="username" id="username" placeholder="Имя пользователя или email"><br>
<input type="password" class="form" name="password" placeholder="пароль"><br>
<input type="hidden" id="state" value="code">
<button type="button" onclick="send_code()" id="enter" class="sub btn btn-dark form">Отправить код</button>
<button type="submit" id="enter" class="sub btn btn-dark form">Вход</button>
</form>
</div>
<div>
<a href="https://t.me/sprint_notifications_bot" target="_blank" class="sub btn btn-dark form">Регистрация</a>
<a href="/register" class="sub btn btn-dark form">Регистрация</a>
</div><br>
или войти с помощью<br><br>
<a href="https://oauth.vk.com/authorize?client_id=8123759&redirect_uri=http://dev.sprinthub.ru/vk_auth&display=page&response_type=token&v=5.59"><img style="width: 40px; height: 40px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/VK_Compact_Logo_%282021-present%29.svg/1200px-VK_Compact_Logo_%282021-present%29.svg.png"></a>
<a href="https://oauth.vk.com/authorize?client_id=8123759&redirect_uri=http://192.168.0.146:8000/vk_auth&display=page&response_type=token&v=5.59"><img style="width: 40px; height: 40px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/VK_Compact_Logo_%282021-present%29.svg/1200px-VK_Compact_Logo_%282021-present%29.svg.png"></a>
<a href="/telegram_enter"><img style="width: 40px; height: 40px; margin-left: 10px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Telegram_logo.svg/640px-Telegram_logo.svg.png"></a>
</center>
</div>
{% endblock %}

107
templates/register.html Normal file
View File

@ -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 %}
<div class="center">
<center>
<div>
<table><tr><td><img style="height: 80px; width: 80px;" src="/static/assets/img/brand/dark.svg" /></td><td><h1>Sprint</h1></td></tr></table>
</div>
<div>
<form method="POST">
<p id="message" style="color: red;"></p>
{% csrf_token %}
<input type="text" class="form" name="username" onchange="checkUsername();" id="username" placeholder="username"><br>
<input type="email" class="form" name="email" onchange="checkEmail();" id="email" placeholder="email"><br>
<input type="text" class="form" name="surname" onchange="simpleCheck('surname');" id="surname" placeholder="Фамилия"><br>
<input type="text" class="form" name="name" onchange="simpleCheck('name');" id="name" placeholder="Имя"><br>
<input type="password" class="form" name="password" id="password" onchange="checkPassword();" placeholder="Пароль"><br>
<input type="password" class="form" name="repeat" id="repeat" onchange="checkPassword();" placeholder="Повторить пароль"><br>
<button type="submit" id="register" disabled class="sub btn btn-dark form">Регистрация</button>
</form>
</div>
</center>
</div>
{% endblock %}

View File

@ -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 %}
<div class="center">
<center>
<div>
<h1><table><tr><td><i class="fa fa-user"></i></td><td>Sprint</td></tr></table></h1>
</div>
<div>
<form method="POST">
<p id="message" style="color: red;"></p>
{% csrf_token %}
<input type="text" class="form" name="username" onchange="checkUsername();" id="username" placeholder="username"><br>
<button type="submit" id="register" disabled class="sub btn btn-dark form">Подтвердить</button>
</form>
</div>
</center>
</div>
{% endblock %}

View File

@ -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 %}
<div class="center">
<center>
<div>
<table><tr><td><img style="height: 80px; width: 80px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Telegram_logo.svg/640px-Telegram_logo.svg.png" /></td><td><h1><a style="color: black;" href="/enter">Sprint</a></h1></td></tr></table>
</div>
<div>
<p id="message" style="color: red;"></p>
{% csrf_token %}
<input type="text" class="form" name="username" id="username" placeholder="username"><br>
<input type="password" class="form" name="code" id="code" placeholder="code" hidden><br>
<input type="hidden" id="state" value="code">
<button type="button" onclick="send_code()" id="enter" class="sub btn btn-dark form">Отправить код</button>
</div>
<div>
<a href="https://t.me/sprint_notifications_bot" target="_blank" class="sub btn btn-dark form">Регистрация</a>
</div><br>
</center>
</div>
{% endblock %}