redo migrations, cleanup
This commit is contained in:
parent
dc27316ac8
commit
648f614a1a
|
@ -5,3 +5,4 @@ NOCAPTCHA = True
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'captcha'
|
'captcha'
|
||||||
]
|
]
|
||||||
|
SILENCED_SYSTEM_CHECKS = ['captcha.recaptcha_test_key_error']
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
"""passbook Webserver management command"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
import cherrypy
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
|
from passbook.core.wsgi import application
|
||||||
|
|
||||||
|
LOGGER = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
"""Run CherryPy webserver"""
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
"""passbook cherrypy server"""
|
||||||
|
config = settings.CHERRYPY_SERVER
|
||||||
|
config.update(**options)
|
||||||
|
cherrypy.config.update(config)
|
||||||
|
cherrypy.tree.graft(application, '/')
|
||||||
|
# Mount NullObject to serve static files
|
||||||
|
cherrypy.tree.mount(None, '/static', config={
|
||||||
|
'/': {
|
||||||
|
'tools.staticdir.on': True,
|
||||||
|
'tools.staticdir.dir': settings.STATIC_ROOT,
|
||||||
|
'tools.expires.on': True,
|
||||||
|
'tools.expires.secs': 86400,
|
||||||
|
'tools.gzip.on': True,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
cherrypy.engine.start()
|
||||||
|
cherrypy.engine.block()
|
|
@ -0,0 +1,17 @@
|
||||||
|
"""passbook Worker management command"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
|
from passbook.core.celery import CELERY_APP
|
||||||
|
|
||||||
|
LOGGER = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
"""Run Celery Worker"""
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
"""celery worker"""
|
||||||
|
CELERY_APP.worker_main(['worker', '--autoscale=10,3', '-E'])
|
|
@ -1,13 +1,12 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-10 09:15
|
# Generated by Django 2.1.5 on 2019-02-08 10:42
|
||||||
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
import django.contrib.auth.models
|
import django.contrib.auth.models
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import django.utils.timezone
|
import django.utils.timezone
|
||||||
from django.conf import settings
|
import uuid
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
@ -34,8 +33,6 @@ class Migration(migrations.Migration):
|
||||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False)),
|
||||||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
|
|
||||||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'user',
|
'verbose_name': 'user',
|
||||||
|
@ -46,6 +43,29 @@ class Migration(migrations.Migration):
|
||||||
('objects', django.contrib.auth.models.UserManager()),
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Group',
|
||||||
|
fields=[
|
||||||
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=80, verbose_name='name')),
|
||||||
|
('extra_data', models.TextField(blank=True)),
|
||||||
|
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='passbook_core.Group')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Invitation',
|
||||||
|
fields=[
|
||||||
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||||
|
('expires', models.DateTimeField(blank=True, default=None, null=True)),
|
||||||
|
('fixed_username', models.TextField(blank=True, default=None)),
|
||||||
|
('fixed_email', models.TextField(blank=True, default=None)),
|
||||||
|
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Invitation',
|
||||||
|
'verbose_name_plural': 'Invitations',
|
||||||
|
},
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Provider',
|
name='Provider',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -92,6 +112,7 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('rulemodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='passbook_core.RuleModel')),
|
('rulemodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='passbook_core.RuleModel')),
|
||||||
('name', models.TextField()),
|
('name', models.TextField()),
|
||||||
|
('slug', models.SlugField()),
|
||||||
('launch_url', models.URLField(blank=True, null=True)),
|
('launch_url', models.URLField(blank=True, null=True)),
|
||||||
('icon_url', models.TextField(blank=True, null=True)),
|
('icon_url', models.TextField(blank=True, null=True)),
|
||||||
('skip_authorization', models.BooleanField(default=False)),
|
('skip_authorization', models.BooleanField(default=False)),
|
||||||
|
@ -120,7 +141,7 @@ class Migration(migrations.Migration):
|
||||||
name='FieldMatcherRule',
|
name='FieldMatcherRule',
|
||||||
fields=[
|
fields=[
|
||||||
('rule_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='passbook_core.Rule')),
|
('rule_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='passbook_core.Rule')),
|
||||||
('user_field', models.TextField()),
|
('user_field', models.TextField(choices=[('username', 'username'), ('first_name', 'first_name'), ('last_name', 'last_name'), ('email', 'email'), ('is_staff', 'is_staff'), ('is_active', 'is_active'), ('data_joined', 'data_joined')])),
|
||||||
('match_action', models.CharField(choices=[('startswith', 'Starts with'), ('endswith', 'Ends with'), ('endswith', 'Contains'), ('regexp', 'Regexp'), ('exact', 'Exact')], max_length=50)),
|
('match_action', models.CharField(choices=[('startswith', 'Starts with'), ('endswith', 'Ends with'), ('endswith', 'Contains'), ('regexp', 'Regexp'), ('exact', 'Exact')], max_length=50)),
|
||||||
('value', models.TextField()),
|
('value', models.TextField()),
|
||||||
],
|
],
|
||||||
|
@ -165,11 +186,25 @@ class Migration(migrations.Migration):
|
||||||
name='rules',
|
name='rules',
|
||||||
field=models.ManyToManyField(blank=True, to='passbook_core.Rule'),
|
field=models.ManyToManyField(blank=True, to='passbook_core.Rule'),
|
||||||
),
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='groups',
|
||||||
|
field=models.ManyToManyField(to='passbook_core.Group'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='user_permissions',
|
||||||
|
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
|
||||||
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='usersourceconnection',
|
model_name='usersourceconnection',
|
||||||
name='source',
|
name='source',
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='passbook_core.Source'),
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='passbook_core.Source'),
|
||||||
),
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='group',
|
||||||
|
unique_together={('name', 'parent')},
|
||||||
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='applications',
|
name='applications',
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-10 10:11
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='fieldmatcherrule',
|
|
||||||
name='user_field',
|
|
||||||
field=models.TextField(choices=[('username', 'username'), ('first_name', 'first_name'), ('last_name', 'last_name'), ('email', 'email'), ('is_staff', 'is_staff'), ('is_active', 'is_active'), ('data_joined', 'data_joined')]),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-10 12:13
|
|
||||||
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0002_auto_20181210_1011'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Invitation',
|
|
||||||
fields=[
|
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
||||||
('expires', models.DateTimeField(blank=True, default=None, null=True)),
|
|
||||||
('fixed_username', models.TextField(blank=True, default=None)),
|
|
||||||
('fixed_email', models.TextField(blank=True, default=None)),
|
|
||||||
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Invitation',
|
|
||||||
'verbose_name_plural': 'Invitations',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,19 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-26 15:52
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0003_invite'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='application',
|
|
||||||
name='slug',
|
|
||||||
field=models.SlugField(default=''),
|
|
||||||
preserve_default=False,
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,35 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-26 21:15
|
|
||||||
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth', '0009_alter_user_last_name_max_length'),
|
|
||||||
('passbook_core', '0004_application_slug'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Group',
|
|
||||||
fields=[
|
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
||||||
('name', models.CharField(max_length=80, verbose_name='name')),
|
|
||||||
('parent_group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='passbook_core.Group')),
|
|
||||||
('permissions', models.ManyToManyField(blank=True, related_name='_group_permissions_+', to='auth.Permission')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='groups',
|
|
||||||
field=models.ManyToManyField(to='passbook_core.Group'),
|
|
||||||
),
|
|
||||||
migrations.AlterUniqueTogether(
|
|
||||||
name='group',
|
|
||||||
unique_together={('name', 'parent_group')},
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-26 21:32
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0005_auto_20181226_2115'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='group',
|
|
||||||
name='extra_data',
|
|
||||||
field=models.TextField(blank=True),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,30 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-26 21:42
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0006_group_extra_data'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='group',
|
|
||||||
name='children',
|
|
||||||
field=models.ManyToManyField(blank=True, to='passbook_core.Group'),
|
|
||||||
),
|
|
||||||
migrations.AlterUniqueTogether(
|
|
||||||
name='group',
|
|
||||||
unique_together=set(),
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='group',
|
|
||||||
name='parent_group',
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='group',
|
|
||||||
name='permissions',
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,27 +0,0 @@
|
||||||
# Generated by Django 2.1.4 on 2018-12-26 22:00
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('passbook_core', '0007_auto_20181226_2142'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='group',
|
|
||||||
name='parent',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='passbook_core.Group'),
|
|
||||||
),
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='group',
|
|
||||||
name='children',
|
|
||||||
),
|
|
||||||
migrations.AlterUniqueTogether(
|
|
||||||
name='group',
|
|
||||||
unique_together={('name', 'parent')},
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -10,3 +10,4 @@ celery
|
||||||
redis<3.0
|
redis<3.0
|
||||||
pymysql
|
pymysql
|
||||||
idna<2.8,>=2.5
|
idna<2.8,>=2.5
|
||||||
|
cherrypy
|
||||||
|
|
|
@ -31,9 +31,9 @@ STATIC_ROOT = BASE_DIR + '/static'
|
||||||
SECRET_KEY = CONFIG.get('secret_key')
|
SECRET_KEY = CONFIG.get('secret_key')
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = CONFIG.get('debug')
|
||||||
INTERNAL_IPS = ['127.0.0.1']
|
INTERNAL_IPS = ['127.0.0.1']
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = CONFIG.get('domains')
|
||||||
|
|
||||||
LOGIN_URL = 'passbook_core:auth-login'
|
LOGIN_URL = 'passbook_core:auth-login'
|
||||||
# CSRF_FAILURE_VIEW = 'passbook.core.views.errors.CSRFErrorView.as_view'
|
# CSRF_FAILURE_VIEW = 'passbook.core.views.errors.CSRFErrorView.as_view'
|
||||||
|
@ -189,6 +189,16 @@ CELERY_TASK_DEFAULT_QUEUE = 'passbook'
|
||||||
CELERY_BROKER_URL = 'redis://%s' % CONFIG.get('redis')
|
CELERY_BROKER_URL = 'redis://%s' % CONFIG.get('redis')
|
||||||
CELERY_RESULT_BACKEND = 'redis://%s' % CONFIG.get('redis')
|
CELERY_RESULT_BACKEND = 'redis://%s' % CONFIG.get('redis')
|
||||||
|
|
||||||
|
# CherryPY settings
|
||||||
|
with CONFIG.cd('web'):
|
||||||
|
CHERRYPY_SERVER = {
|
||||||
|
'server.socket_host': CONFIG.get('listen', '0.0.0.0'), # nosec
|
||||||
|
'server.socket_port': CONFIG.get('port', 8000),
|
||||||
|
'server.thread_pool': CONFIG.get('threads', 30),
|
||||||
|
'log.screen': False,
|
||||||
|
'log.access_file': '',
|
||||||
|
'log.error_file': '',
|
||||||
|
}
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/2.1/howto/static-files/
|
# https://docs.djangoproject.com/en/2.1/howto/static-files/
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
{% load static %}
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--[if IE 9]><html lang="en-us" class="ie9 login-pf"><![endif]-->
|
||||||
|
<!--[if gt IE 9]><!-->
|
||||||
|
<html lang="en-us" class="login-pf">
|
||||||
|
<!--<![endif]-->
|
||||||
|
<head>
|
||||||
|
<title>Login Social Account (two column) - Red Hat® Common User Experience</title>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="shortcut icon" href="{% static 'img/favicon.ico' %}">
|
||||||
|
<!-- iPad retina icon -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{% static 'img/apple-touch-icon-precomposed-152.png' %}">
|
||||||
|
<!-- iPad retina icon (iOS < 7) -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{% static 'img/apple-touch-icon-precomposed-144.png' %}">
|
||||||
|
<!-- iPad non-retina icon -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="76x76" href="{% static 'img/apple-touch-icon-precomposed-76.png' %}">
|
||||||
|
<!-- iPad non-retina icon (iOS < 7) -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="{% static 'img/apple-touch-icon-precomposed-72.png' %}">
|
||||||
|
<!-- iPhone 6 Plus icon -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="120x120" href="{% static 'img/apple-touch-icon-precomposed-180.png' %}">
|
||||||
|
<!-- iPhone retina icon (iOS < 7) -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="{% static 'img/apple-touch-icon-precomposed-114.png' %}">
|
||||||
|
<!-- iPhone non-retina icon (iOS < 7) -->
|
||||||
|
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="{% static 'img/apple-touch-icon-precomposed-57.png' %}">
|
||||||
|
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly.min.css' %}">
|
||||||
|
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly-additions.min.css' %}">
|
||||||
|
|
||||||
|
<script src="{% static 'js/jquery.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/bootstrap.min.js' %}"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/js/bootstrap-select.min.js"></script>
|
||||||
|
<script src="{% static 'js/patternfly.min.js' %}"></script>
|
||||||
|
</head>
|
||||||
|
<div class="toast-notifications-list-pf">
|
||||||
|
<div class="toast-pf alert alert-warning alert-dismissable">
|
||||||
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">
|
||||||
|
<span class="pficon pficon-close"></span>
|
||||||
|
</button>
|
||||||
|
<span class="pficon pficon-warning-triangle-o"></span>
|
||||||
|
These examples are included for development testing purposes. For official documentation, see <a href="https://www.patternfly.org" class="alert-link">https://www.patternfly.org</a> and <a href="http://getbootstrap.com" class="alert-link">http://getbootstrap.com</a>.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="login-pf-page login-pf-page-accounts">
|
||||||
|
<header class="login-pf-page-header">
|
||||||
|
<img class="login-pf-brand" src="/" alt="Red Hat® logo" />
|
||||||
|
</header>
|
||||||
|
<div class="card-pf login-pf-accounts">
|
||||||
|
<header class="login-pf-header">
|
||||||
|
<select class="selectpicker">
|
||||||
|
<option>English</option>
|
||||||
|
<option>French</option>
|
||||||
|
<option>Italian</option>
|
||||||
|
</select>
|
||||||
|
<h1>Log In to Your Account</h1>
|
||||||
|
</header>
|
||||||
|
<section class="login-pf-social-section" role="contentinfo" aria-label="Log in to your patternfly account">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="sr-only" for="exampleInputEmail1">Email address</label>
|
||||||
|
<input type="email" class="form-control input-lg" id="exampleInputEmail1" placeholder="Email address">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="sr-only" for="exampleInputPassword1">Password
|
||||||
|
</label>
|
||||||
|
<input type="password" class="form-control input-lg" id="exampleInputPassword1" placeholder="Password">
|
||||||
|
</div>
|
||||||
|
<div class="login-pf-settings">
|
||||||
|
<label class="checkbox-label">
|
||||||
|
<input type="checkbox"> Keep me logged in for 30 days
|
||||||
|
</label>
|
||||||
|
<a href="#">Forgot password?</a>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary btn-block btn-lg">Log In</button>
|
||||||
|
</form>
|
||||||
|
</section><!--login-pf-section-->
|
||||||
|
<section class="login-pf-social-section" role="contentinfo" aria-label="Log in with third party account">
|
||||||
|
<ul class="login-pf-social login-pf-social-double-col list-unstyled">
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/google-logo.svg' %}" alt="Google account login">Google</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/github-logo.svg' %}" alt="github account login">Github</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/facebook-logo.svg' %}" alt="Facebook account login">Facebook</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/twitter-logo.svg' %}" alt="Twitter account login">Twitter</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/linkedin-logo.svg' %}" alt="LinkIn account login">LinkIn</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/stack-exchange-logo.svg' %}" alt="Stack Exchange logo">Stack Exchange</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/open-id-logo.svg' %}" alt="Open ID account login">Open ID</a></li>
|
||||||
|
<li class="login-pf-social-link"><a href="#"><img src="{% static 'img/instagram-logo.png' %}" alt="Instagram account login">Instagram</a></li>
|
||||||
|
<li class="login-pf-social-link login-pf-social-link-more"><a href="#"><img src="{% static 'img/git-logo.svg' %}" alt="Git account login">Git</a></li>
|
||||||
|
<li class="login-pf-social-link login-pf-social-link-more"><a href="#"><img src="{% static 'img/dropbox-logo.svg' %}" alt="dropbox account login">Dropbox</a></li>
|
||||||
|
<li class="login-pf-social-link login-pf-social-link-more"><a href="#"><img src="{% static 'img/fedora-logo.png' %}" alt="fedora account login">Fedora</a></li>
|
||||||
|
<li class="login-pf-social-link login-pf-social-link-more"><a href="#"><img src="{% static 'img/skype-logo.svg' %}" alt="skype account logingit ">Skype</a></li>
|
||||||
|
</ul>
|
||||||
|
<button type="button" id="socialAccountsToggle" class="btn btn-link login-pf-social-toggle">More<span class="caret"></span></button>
|
||||||
|
</section><!--login-pf-section-->
|
||||||
|
<p class="login-pf-signup">Need an account?<a href="#">Sign up</a></p>
|
||||||
|
</div><!-- card -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 col-md-offset-3">
|
||||||
|
<footer class="login-pf-page-footer">
|
||||||
|
<ul class="login-pf-page-footer-links list-unstyled">
|
||||||
|
<li><a class="login-pf-page-footer-link" href="#">Terms of Use</a></li>
|
||||||
|
<li><a class="login-pf-page-footer-link" href="#">Help</a></li>
|
||||||
|
<li><a class="login-pf-page-footer-link" href="#">Privacy Policy</a></li>
|
||||||
|
</ul>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- login-pf-page -->
|
||||||
|
<script>
|
||||||
|
$("#socialAccountsToggle").on("click", function(e) {
|
||||||
|
var $toggle = $(e.target);
|
||||||
|
var text = $toggle.contents().first()[0];
|
||||||
|
var socialContainer = $('.login-pf-social-section > .login-pf-social');
|
||||||
|
|
||||||
|
if ($toggle.hasClass('login-pf-social-toggle-active')) {
|
||||||
|
$toggle.removeClass('login-pf-social-toggle-active');
|
||||||
|
text.textContent = 'More';
|
||||||
|
socialContainer.removeClass('login-pf-social-all');
|
||||||
|
} else {
|
||||||
|
$toggle.addClass('login-pf-social-toggle-active');
|
||||||
|
text.textContent = 'Less';
|
||||||
|
socialContainer.addClass('login-pf-social-all');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -44,7 +44,7 @@ class LoginView(UserPassesTestMixin, FormView):
|
||||||
kwargs['show_password_forget_notice'] = CONFIG.y('passbook.password_reset.enabled')
|
kwargs['show_password_forget_notice'] = CONFIG.y('passbook.password_reset.enabled')
|
||||||
kwargs['sources'] = Source.objects.filter(enabled=True).select_subclasses()
|
kwargs['sources'] = Source.objects.filter(enabled=True).select_subclasses()
|
||||||
if any(source.is_link for source in kwargs['sources']):
|
if any(source.is_link for source in kwargs['sources']):
|
||||||
self.template_name = 'login/with_sources.html'
|
self.template_name = 'login/test.html'
|
||||||
return super().get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
def get_user(self, uid_value) -> User:
|
def get_user(self, uid_value) -> User:
|
||||||
|
|
Reference in New Issue