diff --git a/apps/audits/migrations/0005_auto_20190228_1715.py b/apps/audits/migrations/0005_auto_20190228_1715.py index 70fc0a2c2..40636ed8c 100644 --- a/apps/audits/migrations/0005_auto_20190228_1715.py +++ b/apps/audits/migrations/0005_auto_20190228_1715.py @@ -9,31 +9,47 @@ class Migration(migrations.Migration): dependencies = [ ('audits', '0004_operatelog_passwordchangelog_userloginlog'), + ('users', '0019_auto_20190304_1459'), ] - - operations = [ + state_operations = [ migrations.CreateModel( name='UserLoginLog', fields=[ - ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('username', models.CharField(max_length=128, verbose_name='Username')), - ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal')], max_length=2, verbose_name='Login type')), + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, + serialize=False)), + ('username', + models.CharField(max_length=128, verbose_name='Username')), + ('type', + models.CharField(choices=[('W', 'Web'), ('T', 'Terminal')], + max_length=2, verbose_name='Login type')), ('ip', models.GenericIPAddressField(verbose_name='Login ip')), - ('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')), - ('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')), - ('mfa', models.SmallIntegerField(choices=[(0, 'Disabled'), (1, 'Enabled'), (2, '-')], default=2, verbose_name='MFA')), - ('reason', models.SmallIntegerField(choices=[(0, '-'), (1, 'Username/password check failed'), (2, 'MFA authentication failed'), (3, 'Username does not exist'), (4, 'Password expired')], default=0, verbose_name='Reason')), - ('status', models.BooleanField(choices=[(True, 'Success'), (False, 'Failed')], default=True, max_length=2, verbose_name='Status')), - ('datetime', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Date login')), + ('city', models.CharField(blank=True, max_length=254, null=True, + verbose_name='Login city')), + ('user_agent', + models.CharField(blank=True, max_length=254, null=True, + verbose_name='User agent')), + ('mfa', models.SmallIntegerField( + choices=[(0, 'Disabled'), (1, 'Enabled'), (2, '-')], + default=2, verbose_name='MFA')), + ('reason', models.SmallIntegerField( + choices=[(0, '-'), (1, 'Username/password check failed'), + (2, 'MFA authentication failed'), + (3, 'Username does not exist'), + (4, 'Password expired')], default=0, + verbose_name='Reason')), + ('status', models.BooleanField( + choices=[(True, 'Success'), (False, 'Failed')], + default=True, max_length=2, verbose_name='Status')), + ('datetime', + models.DateTimeField(default=django.utils.timezone.now, + verbose_name='Date login')), ], options={ 'ordering': ['-datetime', 'username'], }, ), ] - drop_table_sql = "DROP TABLE audits_userloginlog" - rename_table_sql = "RENAME TABLE users_loginlog TO audits_userloginlog" - table_exist = 'users_loginlog' in connection.introspection.table_names() - if table_exist: - operations.append(migrations.RunSQL(drop_table_sql)) - operations.append(migrations.RunSQL(rename_table_sql)) + + operations = [ + migrations.SeparateDatabaseAndState(state_operations=state_operations) + ] diff --git a/apps/authentication/migrations/0001_initial.py b/apps/authentication/migrations/0001_initial.py index f1c5f4710..6e45f932b 100644 --- a/apps/authentication/migrations/0001_initial.py +++ b/apps/authentication/migrations/0001_initial.py @@ -12,9 +12,10 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0019_auto_20190304_1459'), ] - operations = [ + state_operations = [ migrations.CreateModel( name='AccessKey', fields=[ @@ -49,3 +50,7 @@ class Migration(migrations.Migration): }, ), ] + + operations = [ + migrations.SeparateDatabaseAndState(state_operations=state_operations) + ] diff --git a/apps/common/migrations/0001_initial.py b/apps/common/migrations/0001_initial.py new file mode 100644 index 000000000..2b612dc1d --- /dev/null +++ b/apps/common/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-01-11 05:35 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.manager + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Settings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), + ('value', models.TextField(verbose_name='Value')), + ('enabled', models.BooleanField(default=True, verbose_name='Enabled')), + ('comment', models.TextField(verbose_name='Comment')), + ], + managers=[ + ('configs', django.db.models.manager.Manager()), + ], + ), + ] diff --git a/apps/common/migrations/0002_auto_20180111_1407.py b/apps/common/migrations/0002_auto_20180111_1407.py new file mode 100644 index 000000000..7c74b9d2b --- /dev/null +++ b/apps/common/migrations/0002_auto_20180111_1407.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-01-11 06:07 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Settings', + new_name='Setting', + ), + migrations.AlterModelManagers( + name='setting', + managers=[ + ], + ), + migrations.AlterModelTable( + name='setting', + table='settings', + ), + ] diff --git a/apps/common/migrations/0003_setting_category.py b/apps/common/migrations/0003_setting_category.py new file mode 100644 index 000000000..234518287 --- /dev/null +++ b/apps/common/migrations/0003_setting_category.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-01-22 03:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0002_auto_20180111_1407'), + ] + + operations = [ + migrations.AddField( + model_name='setting', + name='category', + field=models.CharField(default='default', max_length=128), + ), + ] diff --git a/apps/common/migrations/0004_setting_encrypted.py b/apps/common/migrations/0004_setting_encrypted.py new file mode 100644 index 000000000..d6862643f --- /dev/null +++ b/apps/common/migrations/0004_setting_encrypted.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1 on 2018-09-03 03:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0003_setting_category'), + ] + + operations = [ + migrations.AddField( + model_name='setting', + name='encrypted', + field=models.BooleanField(default=False), + ), + ] diff --git a/apps/common/migrations/0005_auto_20190221_1902.py b/apps/common/migrations/0005_auto_20190221_1902.py new file mode 100644 index 000000000..997ca7a13 --- /dev/null +++ b/apps/common/migrations/0005_auto_20190221_1902.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.7 on 2019-02-21 11:02 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0004_setting_encrypted'), + ] + + operations = [ + migrations.AlterModelOptions( + name='setting', + options={'verbose_name': 'Setting'}, + ), + ] diff --git a/apps/common/migrations/0006_auto_20190304_1515.py b/apps/common/migrations/0006_auto_20190304_1515.py new file mode 100644 index 000000000..77303a39a --- /dev/null +++ b/apps/common/migrations/0006_auto_20190304_1515.py @@ -0,0 +1,22 @@ +# Generated by Django 2.1.7 on 2019-03-04 07:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0005_auto_20190221_1902'), + ] + + database_operations = [ + migrations.AlterModelTable('setting', 'settings_setting') + ] + state_operations = [migrations.DeleteModel('setting')] + + operations = [ + migrations.SeparateDatabaseAndState( + database_operations=database_operations, + state_operations=state_operations + ) + ] diff --git a/apps/settings/migrations/0001_initial.py b/apps/settings/migrations/0001_initial.py index f332e8d93..1dc429e8b 100644 --- a/apps/settings/migrations/0001_initial.py +++ b/apps/settings/migrations/0001_initial.py @@ -8,18 +8,23 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('common', '0006_auto_20190304_1515'), ] - operations = [ + state_operations = [ migrations.CreateModel( name='Setting', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), + ('id', models.AutoField(auto_created=True, primary_key=True, + serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, + verbose_name='Name')), ('value', models.TextField(verbose_name='Value')), - ('category', models.CharField(default='default', max_length=128)), + ('category', + models.CharField(default='default', max_length=128)), ('encrypted', models.BooleanField(default=False)), - ('enabled', models.BooleanField(default=True, verbose_name='Enabled')), + ('enabled', + models.BooleanField(default=True, verbose_name='Enabled')), ('comment', models.TextField(verbose_name='Comment')), ], options={ @@ -28,3 +33,7 @@ class Migration(migrations.Migration): }, ), ] + + operations = [ + migrations.SeparateDatabaseAndState(state_operations=state_operations) + ] diff --git a/apps/settings/migrations/0002_migrate_data.py b/apps/settings/migrations/0002_migrate_data.py deleted file mode 100644 index 3e36a14b8..000000000 --- a/apps/settings/migrations/0002_migrate_data.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# -from django.db import migrations, connection - - -class Migration(migrations.Migration): - - dependencies = [ - ("settings", "0001_initial"), - ] - sql = "INSERT INTO setting(name, value, category, encrypted, enabled, comment) " \ - "SELECT name, value, category, encrypted, enabled, comment from settings" - rename_sql = "RENAME TABLE settings TO settings_bak" - settings_table_exist = 'settings' in connection.introspection.table_names() - - operations = [] - if settings_table_exist: - operations.append(migrations.RunSQL(sql)) - operations.append(migrations.RunSQL(rename_sql)) diff --git a/apps/settings/models.py b/apps/settings/models.py index bc70bdb50..3364037a3 100644 --- a/apps/settings/models.py +++ b/apps/settings/models.py @@ -122,5 +122,5 @@ class Setting(models.Model): settings.AUTHENTICATION_BACKENDS = old_setting class Meta: - db_table = "setting" + db_table = "settings_setting" verbose_name = _("Setting") diff --git a/apps/users/migrations/0001_initial.py b/apps/users/migrations/0001_initial.py index 7741912bf..01edf24b6 100644 --- a/apps/users/migrations/0001_initial.py +++ b/apps/users/migrations/0001_initial.py @@ -4,8 +4,10 @@ from __future__ import unicode_literals import common.utils from django.contrib.auth.hashers import make_password +from django.conf import settings import django.contrib.auth.models from django.db import migrations, models +import django.db.models.deletion import django.utils.timezone import uuid @@ -73,6 +75,40 @@ class Migration(migrations.Migration): ('objects', django.contrib.auth.models.UserManager()), ], ), + migrations.CreateModel( + name='AccessKey', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='AccessKeyID')), + ('secret', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='AccessKeySecret')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_key', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ], + ), + migrations.CreateModel( + name='LoginLog', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('username', models.CharField(max_length=20, verbose_name='Username')), + ('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal')], max_length=2, verbose_name='Login type')), + ('ip', models.GenericIPAddressField(verbose_name='Login ip')), + ('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')), + ('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')), + ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date login')), + ], + options={ + 'ordering': ['-datetime', 'username'], + }, + ), + migrations.CreateModel( + name='PrivateToken', + fields=[ + ('key', models.CharField(max_length=40, primary_key=True, serialize=False, verbose_name='Key')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='auth_token', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ], + options={ + 'verbose_name': 'Private Token', + }, + ), migrations.CreateModel( name='UserGroup', fields=[ diff --git a/apps/users/migrations/0002_auto_20171225_1157_squashed_0009_auto_20180517_1537.py b/apps/users/migrations/0002_auto_20171225_1157_squashed_0009_auto_20180517_1537.py deleted file mode 100644 index 2b1ebaf82..000000000 --- a/apps/users/migrations/0002_auto_20171225_1157_squashed_0009_auto_20180517_1537.py +++ /dev/null @@ -1,81 +0,0 @@ -# Generated by Django 2.1.7 on 2019-02-28 10:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - replaces = [('users', '0002_auto_20171225_1157'), ('users', '0003_auto_20180101_0046'), ('users', '0004_auto_20180125_1218'), ('users', '0005_auto_20180306_1804'), ('users', '0006_auto_20180411_1135'), ('users', '0007_auto_20180419_1036'), ('users', '0008_auto_20180425_1516'), ('users', '0009_auto_20180517_1537')] - - dependencies = [ - ('users', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='email', - field=models.EmailField(max_length=128, unique=True, verbose_name='Email'), - ), - migrations.AlterField( - model_name='user', - name='name', - field=models.CharField(max_length=128, verbose_name='Name'), - ), - migrations.AlterField( - model_name='user', - name='username', - field=models.CharField(max_length=128, unique=True, verbose_name='Username'), - ), - migrations.AlterField( - model_name='user', - name='wechat', - field=models.CharField(blank=True, max_length=128, verbose_name='Wechat'), - ), - migrations.AlterField( - model_name='user', - name='is_first_login', - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name='usergroup', - name='created_by', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AlterModelOptions( - name='user', - options={'ordering': ['username'], 'verbose_name': 'User'}, - ), - migrations.AlterModelOptions( - name='usergroup', - options={'ordering': ['name'], 'verbose_name': 'User group'}, - ), - migrations.RenameField( - model_name='user', - old_name='secret_key_otp', - new_name='otp_secret_key', - ), - migrations.RemoveField( - model_name='user', - name='enable_otp', - ), - migrations.AddField( - model_name='user', - name='otp_level', - field=models.SmallIntegerField(choices=[(0, 'Disable'), (1, 'Enable'), (2, 'Force enable')], default=0, verbose_name='MFA'), - ), - migrations.RemoveField( - model_name='user', - name='otp_secret_key', - ), - migrations.AddField( - model_name='user', - name='_otp_secret_key', - field=models.CharField(blank=True, max_length=128, null=True), - ), - migrations.AlterField( - model_name='usergroup', - name='name', - field=models.CharField(max_length=128, unique=True, verbose_name='Name'), - ), - ] diff --git a/apps/users/migrations/0010_auto_20180606_1505_squashed_0018_auto_20190107_1912.py b/apps/users/migrations/0010_auto_20180606_1505_squashed_0018_auto_20190107_1912.py deleted file mode 100644 index e83b6fb0b..000000000 --- a/apps/users/migrations/0010_auto_20180606_1505_squashed_0018_auto_20190107_1912.py +++ /dev/null @@ -1,77 +0,0 @@ -# Generated by Django 2.1.7 on 2019-02-28 10:20 - -import common.utils.django -from django.db import migrations, models - - -# Functions from the following migrations need manual copying. -# Move them and any dependencies into this file, then update the -# RunPython operations to refer to the local versions: -# users.migrations.0010_auto_20180606_1505 - -def remove_deleted_group(apps, schema_editor): - db_alias = schema_editor.connection.alias - group_model = apps.get_model("users", "UserGroup") - group_model.objects.using(db_alias).filter(is_discard=True).delete() - - -class Migration(migrations.Migration): - - replaces = [('users', '0010_auto_20180606_1505'), ('users', '0011_user_source'), ('users', '0012_auto_20180710_1641'), ('users', '0013_auto_20180807_1116'), ('users', '0014_auto_20180816_1652'), ('users', '0015_auto_20181105_1112'), ('users', '0016_auto_20181109_1505'), ('users', '0017_auto_20181123_1113'), ('users', '0018_auto_20190107_1912')] - - dependencies = [ - ('users', '0009_auto_20180517_1537'), - ] - - operations = [ - migrations.RunPython( - code=remove_deleted_group, - ), - migrations.RemoveField( - model_name='usergroup', - name='discard_time', - ), - migrations.RemoveField( - model_name='usergroup', - name='is_discard', - ), - migrations.AlterField( - model_name='user', - name='date_expired', - field=models.DateTimeField(blank=True, db_index=True, default=common.utils.django.date_expired_default, null=True, verbose_name='Date expired'), - ), - migrations.AddField( - model_name='user', - name='source', - field=models.CharField(choices=[('local', 'Local'), ('ldap', 'LDAP/AD'), ('openid', 'OpenID'), ('radius', 'Radius')], default='local', max_length=30, verbose_name='Source'), - ), - migrations.AddField( - model_name='usergroup', - name='org_id', - field=models.CharField(blank=True, default=None, max_length=36, null=True), - ), - migrations.AlterField( - model_name='user', - name='last_name', - field=models.CharField(blank=True, max_length=150, verbose_name='last name'), - ), - migrations.AlterField( - model_name='usergroup', - name='name', - field=models.CharField(max_length=128, verbose_name='Name'), - ), - migrations.AlterUniqueTogether( - name='usergroup', - unique_together={('org_id', 'name')}, - ), - migrations.AlterField( - model_name='usergroup', - name='org_id', - field=models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization'), - ), - migrations.AddField( - model_name='user', - name='date_password_last_updated', - field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date password last updated'), - ), - ] diff --git a/apps/users/migrations/0012_auto_20180710_1641.py b/apps/users/migrations/0012_auto_20180710_1641.py index 282ef3bad..ad6628941 100644 --- a/apps/users/migrations/0012_auto_20180710_1641.py +++ b/apps/users/migrations/0012_auto_20180710_1641.py @@ -12,4 +12,19 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AddField( + model_name='loginlog', + name='mfa', + field=models.SmallIntegerField(choices=[(0, 'Disabled'), (1, 'Enabled'), (2, '-')], default=2, verbose_name='MFA'), + ), + migrations.AddField( + model_name='loginlog', + name='reason', + field=models.SmallIntegerField(choices=[(0, '-'), (1, 'Username/password check failed'), (2, 'MFA authentication failed')], default=0, verbose_name='Reason'), + ), + migrations.AddField( + model_name='loginlog', + name='status', + field=models.BooleanField(choices=[(True, 'Success'), (False, 'Failed')], default=True, max_length=2, verbose_name='Status'), + ), ] diff --git a/apps/users/migrations/0015_auto_20181105_1112.py b/apps/users/migrations/0015_auto_20181105_1112.py index dddafd8e8..b84e9fa97 100644 --- a/apps/users/migrations/0015_auto_20181105_1112.py +++ b/apps/users/migrations/0015_auto_20181105_1112.py @@ -10,4 +10,14 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AlterField( + model_name='loginlog', + name='reason', + field=models.SmallIntegerField(choices=[(0, '-'), (1, 'Username/password check failed'), (2, 'MFA authentication failed'), (3, 'Username does not exist')], default=0, verbose_name='Reason'), + ), + migrations.AlterField( + model_name='loginlog', + name='username', + field=models.CharField(max_length=128, verbose_name='Username'), + ), ] diff --git a/apps/users/migrations/0017_auto_20181123_1113.py b/apps/users/migrations/0017_auto_20181123_1113.py index 1b3c9878e..f9a4f7c97 100644 --- a/apps/users/migrations/0017_auto_20181123_1113.py +++ b/apps/users/migrations/0017_auto_20181123_1113.py @@ -1,6 +1,8 @@ # Generated by Django 2.1.1 on 2018-11-23 03:13 +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -15,4 +17,14 @@ class Migration(migrations.Migration): name='date_password_last_updated', field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date password last updated'), ), + migrations.AlterField( + model_name='accesskey', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_keys', to=settings.AUTH_USER_MODEL, verbose_name='User'), + ), + migrations.AlterField( + model_name='loginlog', + name='reason', + field=models.SmallIntegerField(choices=[(0, '-'), (1, 'Username/password check failed'), (2, 'MFA authentication failed'), (3, 'Username does not exist'), (4, 'Password expired')], default=0, verbose_name='Reason'), + ), ] diff --git a/apps/users/migrations/0019_auto_20190304_1459.py b/apps/users/migrations/0019_auto_20190304_1459.py new file mode 100644 index 000000000..6bb9cced0 --- /dev/null +++ b/apps/users/migrations/0019_auto_20190304_1459.py @@ -0,0 +1,28 @@ +# Generated by Django 2.1.7 on 2019-03-04 06:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0018_auto_20190107_1912'), + ] + + database_operations = [ + migrations.AlterModelTable(name='accesskey', table='autentication_accesskey'), + migrations.AlterModelTable(name='privatetoken', table='autentication_privatetoken'), + migrations.AlterModelTable(name='loginlog', table='audits_userloginlog'), + ] + + state_operations = [ + migrations.DeleteModel('accesskey'), + migrations.DeleteModel('privatetoken'), + migrations.DeleteModel('loginlog'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + database_operations=database_operations, + state_operations=state_operations) + ]