#ARC-2 Add backend for authentication with username and email

remotes/origin/setup
Mukhtar 10 years ago
parent ff323a7e25
commit cff8033bdd
  1. 27
      archilance/settings/base.py
  2. 2
      archilance/settings/dev.py
  3. 4
      archilance/urls.py
  4. 1
      templates/home.html
  5. 5
      templates/partials/base.html
  6. 1
      templates/password_reset/base.html
  7. 20
      templates/password_reset/recovery_done.html
  8. 9
      templates/password_reset/recovery_email.txt
  9. 29
      templates/password_reset/recovery_form.html
  10. 46
      templates/password_reset/reset.html
  11. 28
      templates/password_reset/reset_sent.html
  12. 10
      templates/registration/registration_form.html
  13. 25
      users/backend.py
  14. 20
      users/migrations/0019_auto_20160710_1950.py
  15. 2
      users/models.py
  16. 2
      users/templates/contractor_profile.html
  17. 2
      users/urls.py
  18. 6
      users/views.py
  19. 41
      work_sell/templates/upload.html

@ -15,11 +15,11 @@ DEBUG = True
ALLOWED_HOSTS = []
# Application definition
DJANGO_APPS = [
'django.contrib.admin',
'registration',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
@ -33,9 +33,10 @@ THIRD_PARTY_APPS = [
'django_extensions',
'social.apps.django_app.default',
'mptt',
'registration',
'rest_framework',
'sorl.thumbnail',
'compressor',
'password_reset',
]
LOCAL_APPS = [
@ -47,11 +48,9 @@ LOCAL_APPS = [
'specializations',
'users',
'reviews',
'chat',
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
MIDDLEWARE_CLASSES = [
@ -85,7 +84,6 @@ TEMPLATES = [
WSGI_APPLICATION = 'archilance.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
@ -107,7 +105,6 @@ DATABASES = {
}
}
# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
@ -118,14 +115,14 @@ AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]
AUTHENTICATION_BACKENDS = (
'social.backends.facebook.FacebookOAuth2',
'social.backends.google.GoogleOAuth2',
'social.backends.twitter.TwitterOAuth',
'social.backends.vk.VKOAuth2',
'social.backends.odnoklassniki.OdnoklassnikiOAuth2',
'django.contrib.auth.backends.ModelBackend',
# 'django.contrib.auth.backends.ModelBackend',
'users.backend.EmailOrUsernameModelBackend',
)
# SOCIAL_AUTH_FACEBOOK_KEY = '222531191461451'
@ -158,7 +155,6 @@ SOCIAL_AUTH_VK_OAUTH2_SCOPE = [
'email',
]
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/'
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/'
@ -193,7 +189,6 @@ USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
@ -212,11 +207,9 @@ ACCOUNT_ACTIVATION_DAYS = 7
REGISTRATION_AUTO_LOGIN = True
LOGIN_REDIRECT_URL = '/projects/'
if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
@ -233,3 +226,13 @@ REST_FRAMEWORK = {
}
SITE_ID = 1
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = ''
EMAIL_HOST_USER = ''
EMAIL_PORT = 25
EMAIL_USE_TLS = False
EMAIL_USE_SSL = False
EMAIL_TIMEOUT = 60
EMAIL_DEFAULT = 'noreply@archilance.ru'

@ -1,6 +1,6 @@
from .base import *
AUTH_PASSWORD_VALIDATORS = []
# AUTH_PASSWORD_VALIDATORS = []
# INSTALLED_APPS += ['debug_toolbar',]

@ -16,9 +16,9 @@ urlpatterns = [
url(r'^projects/', include('projects.urls')),
url(r'^chat/', include('chat.urls')),
url(r'^specializations/', include('specializations.urls')),
url(r'^users/', include('registration.backends.default.urls')),
url(r'^users/', include('users.urls')),
url(r'^users/', include('registration.backends.default.urls')),
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

@ -6,6 +6,7 @@
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
{# {% url "password_reset_recover" %}#}
<p class="welcomeMain">Основная задача сайта</p>
<p>

@ -9,7 +9,9 @@
<!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>-->
<title>Archilance</title>
{% load compress %}
{% compress css %}
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
@ -23,6 +25,9 @@
<link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
<link rel='stylesheet' href='{% static "css/dev-colors.css" %}'> <!-- Dev-time only, temporary!!! -->
{% endcompress %}
</head>
<body>

@ -0,0 +1 @@
{% extends 'partials/base.html' %}

@ -0,0 +1,20 @@
{% extends "password_reset/base.html" %}{% load i18n %}
{% block title %}{% trans "New password set" %}{% endblock %}
{% block content %}
<div class="container container_1200">
<hr>
</div>
<!-- block_registr -->
<div class="container container_1200">
<div class="block_registr" style="height: auto;">
<div class="text-center registr">Успех</div>
{% trans "Your password has successfully been reset. You can use it right now on the login page." %}
</div>
</div>
<!-- block_registr end -->
{% endblock %}

@ -0,0 +1,9 @@
{% load i18n %}{% blocktrans %}Dear {{ username }},{% endblocktrans %}
{% blocktrans with domain=site.domain %}You -- or someone pretending to be you -- has requested a password reset on {{ domain }}.{% endblocktrans %}
{% trans "You can set your new password by following this link:" %}
http{% if secure %}s{% endif %}://{{ site.domain }}
{% trans "If you don't want to reset your password, simply ignore this email and it will stay unchanged." %}

@ -0,0 +1,29 @@
{% extends "password_reset/base.html" %}
{% load i18n %}
{% block title %}{% trans "Password recovery" %}{% endblock %}
{% block content %}
{% include 'partials/header.html' %}
<div class="col-lg-12">
<p class="titleScore">Восстановление пароля</p>
</div>
<div class="form-regestration">
<form method="post" action="{{ url }}">
{% csrf_token %}
<div class="col-lg-12 select-reg">
<input type="email" name="{{ form.username_or_email.name }}" class="box-sizing pass-reg" id="inputEmail"
placeholder="Электронная почта">
<p>{{ form.username_or_email.errors.as_text }}</p>
</div>
<div class="col-lg-12 select-reg">
<button type="submit" class="reg-sub">
Восстановить
</button>
</div>
</form>
</div>
{% endblock %}

@ -0,0 +1,46 @@
{% extends "password_reset/base.html" %}{% load i18n %}
{% block content %}
<div class="container container_1200">
<hr>
</div>
<!-- block_registr -->
<div class="container container_1200">
<div class="block_registr" style="height: auto;">
<div class="text-center registr">Сброс пароля</div>
{% if invalid %}{% url "password_reset_recover" as recovery_url %}
{% blocktrans %}Sorry, this password reset link is invalid. You can still
<a href="{{ recovery_url }}">request a new one</a>.{% endblocktrans %}
{% else %}
{% blocktrans %}Hi, <strong>{{ username }}</strong>. Please choose your new password.{% endblocktrans %}
<form method="post" action="{% url "password_reset_reset" token %}">
{% csrf_token %}
<div class="form-group">
<input type="password" name="{{ form.password1.name }}" class="col-xs-10 form-control" id="id_password1"
placeholder="Новый пароль">
<p>{{ form.password1.errors.as_text }}</p>
</div>
<div class="form-group">
<input type="password" name="{{ form.password2.name }}" class="col-xs-10 form-control" id="id_password2"
placeholder="Подтверждение">
<p>{{ form.password2.errors.as_text }}</p>
</div>
<div>
<button type="submit" class="btn registr_button">
Изменить пароль
</button>
</div>
</form>
{% endif %}
</div>
</div>
<!-- block_registr end -->
{% endblock %}

@ -0,0 +1,28 @@
{% extends "password_reset/base.html" %}
{% load i18n %}
{% block title %}{% trans "Password recovery sent" %}{% endblock %}
{#{% block content %}#}
{# <p></p>#}
{#{% endblock %}#}
{% block content %}
<div class="container container_1200">
<hr>
</div>
<!-- block_registr -->
<div class="container container_1200">
<div class="block_registr" style="height: 300px;">
<div class="text-center registr">Письмо отправлено</div>
{# <div class="alert alert-success">#}
{% blocktrans with ago=timestamp|timesince %}An email was sent to <strong>{{ email }}</strong> {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}
</div>
{# </div>#}
</div>
<!-- block_registr end -->
{% endblock %}

@ -10,8 +10,16 @@
<div class="col-lg-12 select-reg polsF1">
{% if request.GET.type == 'customer' %}
<input type="hidden" name="group_id" value="Заказчики" />
{% else %}
{% elif request.GET.type == 'contractor' %}
<input type="hidden" name="group_id" value="Исполнители" />
{% else %}
<div class="col-lg-12 select-reg polsF1">
<select class="selectpicker3" name="group_id">
<option>Выберете вашу роль</option>
<option value="Исполнители">Исполнитель</option>
<option value="Заказчики">Заказчик</option>
</select>
</div>
{% endif %}
</div>
<div class="col-lg-12 select-reg">

@ -0,0 +1,25 @@
from django.conf import settings
from django.contrib.auth import get_user_model
from .models import User
class EmailOrUsernameModelBackend(object):
def authenticate(self, username=None, password=None):
if '@' in username:
kwargs = {'email': username}
else:
kwargs = {'username': username}
try:
user = get_user_model().objects.get(**kwargs)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, username):
try:
return get_user_model().objects.get(pk=username)
except get_user_model().DoesNotExist:
return None

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-10 16:50
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0018_auto_20160710_1838'),
]
operations = [
migrations.RenameField(
model_name='user',
old_name='data_joined',
new_name='date_joined',
),
]

@ -90,7 +90,7 @@ class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True, db_index=True)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(default=timezone.now)
data_joined = models.DateTimeField(default=timezone.now)
date_joined = models.DateTimeField(default=timezone.now)
last_time_visit = models.DateTimeField(default=timezone.now)
contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True)
contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES)

@ -54,7 +54,7 @@
<div class="col-lg-9 divCol9">
<div class="col-lg-4">
<p class="nameUser">
{{ contractor.get_full_name }}[ivanov_petr]
{{ contractor.get_full_name }}[{{ contractor.username }}]
</p>
<p class="cityUser">Россия, Москва</p>
<p class="navv">На сайте 8 лет и 3 месяца</p>

@ -1,4 +1,5 @@
from django.conf import urls
from django.conf.urls import include
from django.contrib.auth.views import login, logout
from .views import (
@ -23,6 +24,7 @@ from .views import (
app_name = 'users'
urlpatterns = [
urls.url(r'^password/', include('password_reset.urls')),
urls.url(r'^customers/(?P<pk>\d+)/$', CustomerProfileOpenProjectsView.as_view(), name='customer-profile-open-projects'),
urls.url(r'^customers/(?P<pk>\d+)/trashed-projects/$', CustomerProfileTrashedProjectsView.as_view(), name='customer-profile-trashed-projects'),
urls.url(r'^customers/(?P<pk>\d+)/current-projects/$', CustomerProfileCurrentProjectsView.as_view(), name='customer-profile-current-projects'),

@ -19,11 +19,7 @@ from django.core.mail import send_mail
def send_mail_test(request):
send_mail(
'Subject here',
'Here is the message.',
'magomed-gadzhiev-1984@mail.ru',
['dagdahzub@mail.ru'], )
send_mail('Subject here', 'Here is the message.Mukhtar hello ', '', ['muhtarzubanchi05@gmail.com'], fail_silently=False)
return HttpResponse("Mail send")

@ -1,6 +1,47 @@
{% extends 'partials/base.html' %}
{% block content %}
<h1>Upload Files</h1>
<form id="fileupload" method="POST" enctype="multipart/form-data">
<div class="col-lg-6" style="padding-left: 100px;">
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Add files...</span>
<input type="file" name="files[]" multiple>
</span>
<button type="submit" class="btn btn-primary start">
<i class="glyphicon glyphicon-upload"></i>
<span>Start upload</span>
</button>
<button type="reset" class="btn btn-warning cancel">
<i class="glyphicon glyphicon-ban-circle"></i>
<span>Cancel upload</span>
</button>
<button type="button" class="btn btn-danger delete">
<i class="glyphicon glyphicon-trash"></i>
<span>Delete</span>
</button>
<input type="checkbox" class="toggle">
</div>
</form>
{% endblock %}
{% block js_block %}
<script>
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo(document.body);
});
}
});
});
</script>
{% endblock %}

Loading…
Cancel
Save