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 from SprintLib.BaseView import BaseView
@ -5,3 +9,14 @@ class EnterView(BaseView):
view_file = "enter.html" view_file = "enter.html"
required_login = False required_login = False
endpoint = "enter" 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 @property
def view_file(self): 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 "main.html"
return "landing.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.GroupView import GroupView
from Main.views.CheckersView import CheckersView from Main.views.CheckersView import CheckersView
from Main.views.DownloadFileView import DownloadFileView 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 * from Main.views.social import *

View File

@ -1,10 +1,13 @@
import os import os
import random
import string
from django.contrib.auth import login from django.contrib.auth import login
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from requests import get from requests import get
from Main.models import UserInfo
from SprintLib.BaseView import BaseView 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() 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: if 'response' in resp and 'success' in resp['response'] and resp['response']['success'] == 1:
user_id = resp['response']['user_id'] user_id = resp['response']['user_id']
random_string = lambda: ''.join(random.choices(string.ascii_uppercase + string.digits, k=100))
try: try:
user = User.objects.get(userinfo__vk_user_id=user_id) user = User.objects.get(userinfo__vk_user_id=user_id)
except ObjectDoesNotExist: 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) login(self.request, user)
return "/" return "/set_username"
return "/enter" return "/enter"

View File

@ -33,7 +33,9 @@ class BaseView:
if c.required_login is not None: if c.required_login is not None:
if c.required_login and not request.user.is_authenticated: if c.required_login and not request.user.is_authenticated:
return HttpResponseRedirect("/enter") 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("/") return HttpResponseRedirect("/")
request_method = request.method.lower() request_method = request.method.lower()
exec("from Main.models import *") exec("from Main.models import *")

View File

@ -2,41 +2,6 @@
{% block title %}Вход{% endblock %} {% 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 %} {% block body %}
<div class="center"> <div class="center">
<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> <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>
<div> <div>
<p id="message" style="color: red;"></p> <form method="POST">
{% csrf_token %} <p id="message" style="color: red;"></p>
<input type="text" class="form" name="username" id="username" placeholder="username"><br> {% csrf_token %}
<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="hidden" id="state" value="code"> <input type="password" class="form" name="password" placeholder="пароль"><br>
<button type="button" onclick="send_code()" id="enter" class="sub btn btn-dark form">Отправить код</button> <input type="hidden" id="state" value="code">
<button type="submit" id="enter" class="sub btn btn-dark form">Вход</button>
</form>
</div> </div>
<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> </div><br>
или войти с помощью<br><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> </center>
</div> </div>
{% endblock %} {% 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 %}