diff --git a/apps/acls/migrations/0006_commandfilteracl_commandgroup.py b/apps/acls/migrations/0006_commandfilteracl_commandgroup.py index 95b12e9f0..cc91c998e 100644 --- a/apps/acls/migrations/0006_commandfilteracl_commandgroup.py +++ b/apps/acls/migrations/0006_commandfilteracl_commandgroup.py @@ -28,6 +28,7 @@ class Migration(migrations.Migration): ('type', models.CharField(choices=[('command', 'Command'), ('regex', 'Regex')], default='command', max_length=16, verbose_name='Type')), ('content', models.TextField(help_text='One line one command', verbose_name='Content')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('ignore_case', models.BooleanField(default=True, verbose_name='Ignore case')), ], options={ @@ -57,7 +58,8 @@ class Migration(migrations.Migration): ('assets', models.JSONField(verbose_name='Asset')), ('commands', models.ManyToManyField(to='acls.CommandGroup', verbose_name='Commands')), ( - 'reviewers', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')), + 'reviewers', + models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')), ], options={ 'verbose_name': 'Command acl', diff --git a/apps/acls/migrations/0008_commandgroup_comment.py b/apps/acls/migrations/0008_commandgroup_comment.py index 631ff8eb7..82e44912c 100644 --- a/apps/acls/migrations/0008_commandgroup_comment.py +++ b/apps/acls/migrations/0008_commandgroup_comment.py @@ -1,18 +1,33 @@ # Generated by Django 3.2.14 on 2022-12-02 04:25 -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): - dependencies = [ ('acls', '0007_auto_20221202_1048'), ] operations = [ - migrations.AddField( - model_name='commandgroup', - name='comment', - field=models.TextField(blank=True, verbose_name='Comment'), + migrations.AlterModelOptions( + name='commandgroup', + options={'verbose_name': 'Command group'}, + ), + migrations.RenameField( + model_name='commandfilteracl', + old_name='commands', + new_name='command_groups', + ), + migrations.AlterModelOptions( + name='commandfilteracl', + options={'ordering': ('priority', 'name'), 'verbose_name': 'Command acl'}, + ), + migrations.AlterModelOptions( + name='loginacl', + options={'ordering': ('priority', 'name'), 'verbose_name': 'Login acl'}, + ), + migrations.AlterModelOptions( + name='loginassetacl', + options={'ordering': ('priority', 'name'), 'verbose_name': 'Login asset acl'}, ), ] diff --git a/apps/acls/migrations/0009_auto_20221204_0001.py b/apps/acls/migrations/0009_auto_20221204_0001.py deleted file mode 100644 index b5286160f..000000000 --- a/apps/acls/migrations/0009_auto_20221204_0001.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.14 on 2022-12-03 16:01 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('acls', '0008_commandgroup_comment'), - ] - - operations = [ - migrations.AlterModelOptions( - name='commandgroup', - options={'verbose_name': 'Command group'}, - ), - migrations.RenameField( - model_name='commandfilteracl', - old_name='commands', - new_name='command_groups', - ), - ] diff --git a/apps/acls/migrations/0009_auto_20221220_1956.py b/apps/acls/migrations/0009_auto_20221220_1956.py new file mode 100644 index 000000000..78f8b1152 --- /dev/null +++ b/apps/acls/migrations/0009_auto_20221220_1956.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('acls', '0008_commandgroup_comment'), + ] + + operations = [ + migrations.AddField( + model_name='commandfilteracl', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='loginacl', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='loginassetacl', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='commandfilteracl', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='commandgroup', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='commandgroup', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='loginacl', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='loginassetacl', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/acls/migrations/0010_auto_20221205_1122.py b/apps/acls/migrations/0010_auto_20221205_1122.py deleted file mode 100644 index 78adde93b..000000000 --- a/apps/acls/migrations/0010_auto_20221205_1122.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.14 on 2022-12-05 03:22 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('acls', '0009_auto_20221204_0001'), - ] - - operations = [ - migrations.AlterModelOptions( - name='commandfilteracl', - options={'ordering': ('priority', 'name'), 'verbose_name': 'Command acl'}, - ), - migrations.AlterModelOptions( - name='loginacl', - options={'ordering': ('priority', 'name'), 'verbose_name': 'Login acl'}, - ), - migrations.AlterModelOptions( - name='loginassetacl', - options={'ordering': ('priority', 'name'), 'verbose_name': 'Login asset acl'}, - ), - ] diff --git a/apps/acls/models/base.py b/apps/acls/models/base.py index 704e3d743..256241361 100644 --- a/apps/acls/models/base.py +++ b/apps/acls/models/base.py @@ -3,7 +3,7 @@ from django.db import models from django.db.models import Q from django.utils.translation import ugettext_lazy as _ -from common.mixins import CommonModelMixin +from common.db.models import JMSBaseModel from common.utils import contains_ip from orgs.mixins.models import OrgModelMixin @@ -58,7 +58,7 @@ class UserAssetAccountACLQuerySet(BaseACLQuerySet): def filter_account(self, username): q = Q(accounts__username_group__contains=username) | \ - Q(accounts__username_group__contains='*') + Q(accounts__username_group__contains='*') return self.filter(q) @@ -67,7 +67,7 @@ class ACLManager(models.Manager): return self.get_queryset().valid() -class BaseACL(CommonModelMixin): +class BaseACL(JMSBaseModel): name = models.CharField(max_length=128, verbose_name=_('Name')) priority = models.IntegerField( default=50, verbose_name=_("Priority"), @@ -77,7 +77,6 @@ class BaseACL(CommonModelMixin): action = models.CharField(max_length=64, default=ActionChoices.reject, verbose_name=_('Action')) reviewers = models.ManyToManyField('users.User', blank=True, verbose_name=_("Reviewers")) is_active = models.BooleanField(default=True, verbose_name=_("Active")) - comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) ActionChoices = ActionChoices objects = ACLManager.from_queryset(BaseACLQuerySet)() diff --git a/apps/acls/models/command_acl.py b/apps/acls/models/command_acl.py index 3db5a738a..b02bc09be 100644 --- a/apps/acls/models/command_acl.py +++ b/apps/acls/models/command_acl.py @@ -7,7 +7,6 @@ from django.utils.translation import ugettext_lazy as _ from common.utils import lazyproperty, get_logger from orgs.mixins.models import JMSOrgBaseModel - from .base import UserAssetAccountBaseACL logger = get_logger(__file__) @@ -26,7 +25,6 @@ class CommandGroup(JMSOrgBaseModel): ) content = models.TextField(verbose_name=_("Content"), help_text=_("One line one command")) ignore_case = models.BooleanField(default=True, verbose_name=_('Ignore case')) - comment = models.TextField(blank=True, verbose_name=_("Comment")) TypeChoices = TypeChoices diff --git a/apps/applications/migrations/0010_appaccount_historicalappaccount.py b/apps/applications/migrations/0010_appaccount_historicalappaccount.py index cd0bf88d1..515754f32 100644 --- a/apps/applications/migrations/0010_appaccount_historicalappaccount.py +++ b/apps/applications/migrations/0010_appaccount_historicalappaccount.py @@ -1,17 +1,17 @@ # Generated by Django 3.1.12 on 2021-08-26 09:07 -import assets.models.base -import common.db.fields -from django.conf import settings +import uuid + import django.core.validators -from django.db import migrations, models import django.db.models.deletion import simple_history.models -import uuid +from django.conf import settings +from django.db import migrations, models + +import common.db.fields class Migration(migrations.Migration): - dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('assets', '0076_delete_assetuser'), @@ -22,14 +22,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name='HistoricalAccount', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(db_index=True, default=uuid.uuid4)), ('name', models.CharField(max_length=128, verbose_name='Name')), - ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], verbose_name='Username')), - ('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), - ('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), + ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[ + django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], + verbose_name='Username')), + ('password', + common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), + ('private_key', + common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), ('public_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH public key')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('date_created', models.DateTimeField(blank=True, editable=False, verbose_name='Date created')), ('date_updated', models.DateTimeField(blank=True, editable=False, verbose_name='Date updated')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), @@ -37,10 +42,17 @@ class Migration(migrations.Migration): ('history_id', models.AutoField(primary_key=True, serialize=False)), ('history_date', models.DateTimeField()), ('history_change_reason', models.CharField(max_length=100, null=True)), - ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), - ('app', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='applications.application', verbose_name='Database')), - ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('systemuser', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='assets.systemuser', verbose_name='System user')), + ('history_type', + models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('app', models.ForeignKey(blank=True, db_constraint=False, null=True, + on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', + to='applications.application', verbose_name='Database')), + ('history_user', + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', + to=settings.AUTH_USER_MODEL)), + ('systemuser', models.ForeignKey(blank=True, db_constraint=False, null=True, + on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', + to='assets.systemuser', verbose_name='System user')), ], options={ 'verbose_name': 'historical Account', @@ -52,20 +64,28 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Account', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('name', models.CharField(max_length=128, verbose_name='Name')), - ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], verbose_name='Username')), - ('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), - ('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), + ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[ + django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], + verbose_name='Username')), + ('password', + common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), + ('private_key', + common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), ('public_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH public key')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), ('version', models.IntegerField(default=1, verbose_name='Version')), - ('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='applications.application', verbose_name='Database')), - ('systemuser', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser', verbose_name='System user')), + ('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, + to='applications.application', verbose_name='Database')), + ('systemuser', + models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser', + verbose_name='System user')), ], options={ 'verbose_name': 'Account', diff --git a/apps/applications/migrations/0027_auto_20221220_1956.py b/apps/applications/migrations/0027_auto_20221220_1956.py new file mode 100644 index 000000000..a72162974 --- /dev/null +++ b/apps/applications/migrations/0027_auto_20221220_1956.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('applications', '0026_auto_20220817_1716'), + ] + + operations = [ + migrations.AddField( + model_name='application', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='application', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='application', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/applications/models.py b/apps/applications/models.py index f1b1bbc8a..60efc8aab 100644 --- a/apps/applications/models.py +++ b/apps/applications/models.py @@ -1,12 +1,11 @@ - from django.db import models from django.utils.translation import ugettext_lazy as _ +from common.db.models import JMSBaseModel from orgs.mixins.models import OrgModelMixin -from common.mixins import CommonModelMixin -class Application(CommonModelMixin, OrgModelMixin): +class Application(JMSBaseModel, OrgModelMixin): name = models.CharField(max_length=128, verbose_name=_('Name')) category = models.CharField( max_length=16, verbose_name=_('Category') @@ -15,9 +14,6 @@ class Application(CommonModelMixin, OrgModelMixin): max_length=16, verbose_name=_('Type') ) attrs = models.JSONField(default=dict, verbose_name=_('Attrs')) - comment = models.TextField( - max_length=128, default='', blank=True, verbose_name=_('Comment') - ) class Meta: verbose_name = _('Application') diff --git a/apps/assets/migrations/0099_auto_20220711_1409.py b/apps/assets/migrations/0099_auto_20220711_1409.py index 01ad1cf1f..58f917ac4 100644 --- a/apps/assets/migrations/0099_auto_20220711_1409.py +++ b/apps/assets/migrations/0099_auto_20220711_1409.py @@ -1,15 +1,16 @@ # Generated by Django 3.2.12 on 2022-07-11 08:59 -import common.db.fields -from django.conf import settings -from django.db import migrations, models +import uuid + import django.db.models.deletion import simple_history.models -import uuid +from django.conf import settings +from django.db import migrations, models + +import common.db.fields class Migration(migrations.Migration): - dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('assets', '0098_auto_20220430_2126'), @@ -20,14 +21,19 @@ class Migration(migrations.Migration): name='HistoricalAccount', fields=[ ('id', models.UUIDField(db_index=True, default=uuid.uuid4)), - ('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')), + ('secret_type', models.CharField( + choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), + ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')), ('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')), ('version', models.IntegerField(default=0, verbose_name='Version'),), ('history_id', models.AutoField(primary_key=True, serialize=False)), ('history_date', models.DateTimeField(db_index=True)), ('history_change_reason', models.CharField(max_length=100, null=True)), - ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), - ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('history_type', + models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('history_user', + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', + to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'historical Account', @@ -40,43 +46,55 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Account', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('name', models.CharField(max_length=128, verbose_name='Name')), ('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')), - ('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')), + ('secret_type', models.CharField( + choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), + ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')), ('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), - ('connectivity', models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')], default='unknown', max_length=16, verbose_name='Connectivity')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('connectivity', models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')], + default='unknown', max_length=16, verbose_name='Connectivity')), ('date_verified', models.DateTimeField(null=True, verbose_name='Date verified')), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), ('privileged', models.BooleanField(default=False, verbose_name='Privileged')), ('version', models.IntegerField(default=0, verbose_name='Version')), - ('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='accounts', to='assets.asset', verbose_name='Asset')), + ('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='accounts', + to='assets.asset', verbose_name='Asset')), ], options={ 'verbose_name': 'Account', - 'permissions': [('view_accountsecret', 'Can view asset account secret'), ('change_accountsecret', 'Can change asset account secret'), ('view_historyaccount', 'Can view asset history account'), ('view_historyaccountsecret', 'Can view asset history account secret')], + 'permissions': [('view_accountsecret', 'Can view asset account secret'), + ('change_accountsecret', 'Can change asset account secret'), + ('view_historyaccount', 'Can view asset history account'), + ('view_historyaccountsecret', 'Can view asset history account secret')], 'unique_together': {('name', 'asset'), ('username', 'asset', 'secret_type')}, }, ), migrations.AddField( model_name='account', name='su_from', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='su_to', to='assets.account', verbose_name='Su from'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='su_to', + to='assets.account', verbose_name='Su from'), ), migrations.CreateModel( name='AccountTemplate', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('name', models.CharField(max_length=128, verbose_name='Name')), ('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')), - ('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type'),), + ('secret_type', models.CharField( + choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), + ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type'),), ('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), diff --git a/apps/assets/migrations/0115_auto_20221220_1956.py b/apps/assets/migrations/0115_auto_20221220_1956.py new file mode 100644 index 000000000..976a8c53b --- /dev/null +++ b/apps/assets/migrations/0115_auto_20221220_1956.py @@ -0,0 +1,183 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0114_remove_redundant_macos'), + ] + + operations = [ + migrations.AddField( + model_name='accountbackupplan', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='baseautomation', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='changesecretrecord', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='domain', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AddField( + model_name='domain', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='domain', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='favoriteasset', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='favoriteasset', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='gathereduser', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='gathereduser', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AddField( + model_name='gathereduser', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='node', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='node', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AddField( + model_name='node', + name='date_created', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created'), + ), + migrations.AddField( + model_name='node', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='node', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='account', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='account', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='accountbackupplan', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='accountbackupplan', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='accounttemplate', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='accounttemplate', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='asset', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='asset', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='baseautomation', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='baseautomation', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='changesecretrecord', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='changesecretrecord', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='domain', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='favoriteasset', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='gathereduser', + name='date_created', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created'), + ), + migrations.AlterField( + model_name='label', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='label', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='label', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index e7d3ae8db..72d494948 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -2,18 +2,17 @@ # -*- coding: utf-8 -*- # -import uuid import logging +import uuid from collections import defaultdict from django.db import models -from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from common.utils import lazyproperty from orgs.mixins.models import OrgManager, JMSOrgBaseModel -from ..platform import Platform from ..base import AbsConnectivity +from ..platform import Platform __all__ = ['Asset', 'AssetQuerySet', 'default_node', 'Protocol'] logger = logging.getLogger(__name__) @@ -110,7 +109,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel): verbose_name=_("Nodes")) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels")) - comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) info = models.JSONField(verbose_name='Info', default=dict, blank=True) objects = AssetManager.from_queryset(AssetQuerySet)() diff --git a/apps/assets/models/automations/base.py b/apps/assets/models/automations/base.py index 9977f6830..a09084fe5 100644 --- a/apps/assets/models/automations/base.py +++ b/apps/assets/models/automations/base.py @@ -1,25 +1,24 @@ import uuid + from celery import current_task from django.db import models from django.utils.translation import ugettext_lazy as _ -from common.const.choices import Trigger -from common.mixins.models import CommonModelMixin -from common.db.fields import EncryptJsonDictTextField -from orgs.mixins.models import OrgModelMixin -from ops.mixin import PeriodTaskModelMixin +from assets.const import AutomationTypes from assets.models import Node, Asset from assets.tasks import execute_automation -from assets.const import AutomationTypes +from common.const.choices import Trigger +from common.db.fields import EncryptJsonDictTextField +from ops.mixin import PeriodTaskModelMixin +from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel -class BaseAutomation(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin): +class BaseAutomation(PeriodTaskModelMixin, JMSOrgBaseModel): accounts = models.JSONField(default=list, verbose_name=_("Accounts")) nodes = models.ManyToManyField('assets.Node', blank=True, verbose_name=_("Nodes")) assets = models.ManyToManyField('assets.Asset', blank=True, verbose_name=_("Assets")) type = models.CharField(max_length=16, choices=AutomationTypes.choices, verbose_name=_('Type')) is_active = models.BooleanField(default=True, verbose_name=_("Is active")) - comment = models.TextField(blank=True, verbose_name=_('Comment')) def __str__(self): return self.name + '@' + str(self.created_by) diff --git a/apps/assets/models/backup.py b/apps/assets/models/backup.py index 3cf49a94d..d4a8b8cc8 100644 --- a/apps/assets/models/backup.py +++ b/apps/assets/models/backup.py @@ -7,26 +7,23 @@ from celery import current_task from django.db import models from django.utils.translation import ugettext_lazy as _ -from orgs.mixins.models import OrgModelMixin -from ops.mixin import PeriodTaskModelMixin -from common.utils import get_logger from common.const.choices import Trigger from common.db.encoder import ModelJSONFieldEncoder -from common.mixins.models import CommonModelMixin +from common.utils import get_logger +from ops.mixin import PeriodTaskModelMixin +from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel __all__ = ['AccountBackupPlan', 'AccountBackupPlanExecution'] logger = get_logger(__file__) -class AccountBackupPlan(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class AccountBackupPlan(PeriodTaskModelMixin, JMSOrgBaseModel): types = models.JSONField(default=list) recipients = models.ManyToManyField( 'users.User', related_name='recipient_escape_route_plans', blank=True, verbose_name=_("Recipient") ) - comment = models.TextField(blank=True, verbose_name=_('Comment')) def __str__(self): return f'{self.name}({self.org_id})' diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py index 03697d427..8c8c08555 100644 --- a/apps/assets/models/base.py +++ b/apps/assets/models/base.py @@ -69,8 +69,6 @@ class BaseAccount(JMSOrgBaseModel): secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('Secret')) privileged = models.BooleanField(verbose_name=_("Privileged"), default=False) is_active = models.BooleanField(default=True, verbose_name=_("Is active")) - comment = models.TextField(blank=True, verbose_name=_('Comment')) - created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) objects = BaseAccountManager.from_queryset(BaseAccountQuerySet)() diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index 9c70f2bb9..dd0d7b0d1 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -7,11 +7,6 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from common.utils import get_logger -from users.models import User, UserGroup -from applications.models import Application -from ..models import SystemUser, Asset, Node - -from common.utils import lazyproperty, get_logger, get_object_or_none from orgs.mixins.models import OrgModelMixin logger = get_logger(__file__) diff --git a/apps/assets/models/domain.py b/apps/assets/models/domain.py index 77758283d..4e2cfc71d 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/domain.py @@ -1,14 +1,12 @@ # -*- coding: utf-8 -*- # -import uuid import random from django.db import models from django.utils.translation import ugettext_lazy as _ from common.utils import get_logger, lazyproperty -from orgs.mixins.models import OrgModelMixin - +from orgs.mixins.models import JMSOrgBaseModel from .gateway import Gateway logger = get_logger(__file__) @@ -16,11 +14,8 @@ logger = get_logger(__file__) __all__ = ['Domain'] -class Domain(OrgModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class Domain(JMSOrgBaseModel): name = models.CharField(max_length=128, verbose_name=_('Name')) - comment = models.TextField(blank=True, verbose_name=_('Comment')) - date_created = models.DateTimeField(auto_now_add=True, null=True, verbose_name=_('Date created')) class Meta: verbose_name = _("Domain") @@ -51,5 +46,3 @@ class Domain(OrgModelMixin): @classmethod def get_gateway_queryset(cls): return Gateway.objects.all() - - diff --git a/apps/assets/models/favorite_asset.py b/apps/assets/models/favorite_asset.py index c5e6db484..8fbaeed64 100644 --- a/apps/assets/models/favorite_asset.py +++ b/apps/assets/models/favorite_asset.py @@ -2,13 +2,12 @@ # from django.db import models -from common.mixins.models import CommonModelMixin - +from common.db.models import JMSBaseModel __all__ = ['FavoriteAsset'] -class FavoriteAsset(CommonModelMixin): +class FavoriteAsset(JMSBaseModel): user = models.ForeignKey('users.User', on_delete=models.CASCADE) asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE) diff --git a/apps/assets/models/gathered_user.py b/apps/assets/models/gathered_user.py index 3c0a743b9..4f7ae4bb8 100644 --- a/apps/assets/models/gathered_user.py +++ b/apps/assets/models/gathered_user.py @@ -1,23 +1,19 @@ # -*- coding: utf-8 -*- # -import uuid from django.db import models from django.utils.translation import ugettext_lazy as _ -from orgs.mixins.models import OrgModelMixin +from orgs.mixins.models import JMSOrgBaseModel __all__ = ['GatheredUser'] -class GatheredUser(OrgModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class GatheredUser(JMSOrgBaseModel): asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_("Asset")) username = models.CharField(max_length=32, blank=True, db_index=True, verbose_name=_('Username')) present = models.BooleanField(default=True, verbose_name=_("Present")) date_last_login = models.DateTimeField(null=True, verbose_name=_("Date last login")) ip_last_login = models.CharField(max_length=39, default='', verbose_name=_("IP last login")) - date_created = models.DateTimeField(auto_now_add=True, verbose_name=_("Date created")) - date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated")) @property def name(self): @@ -33,6 +29,3 @@ class GatheredUser(OrgModelMixin): def __str__(self): return '{}: {}'.format(self.asset.name, self.username) - - - diff --git a/apps/assets/models/label.py b/apps/assets/models/label.py index 2e0ff92ee..3aff63385 100644 --- a/apps/assets/models/label.py +++ b/apps/assets/models/label.py @@ -20,7 +20,6 @@ class Label(JMSOrgBaseModel): category = models.CharField(max_length=128, choices=CATEGORY_CHOICES, default=USER_CATEGORY, verbose_name=_("Category")) is_active = models.BooleanField(default=True, verbose_name=_("Is active")) - comment = models.TextField(blank=True, null=True, verbose_name=_("Comment")) @classmethod def get_queryset_group_by_name(cls): diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 960d858d5..5d1af0ec5 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -1,29 +1,24 @@ # -*- coding: utf-8 -*- # import re -import time -import uuid import threading -import os import time import uuid - from collections import defaultdict + +from django.core.cache import cache from django.db import models, transaction from django.db.models import Q, Manager -from django.db.utils import IntegrityError -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ugettext from django.db.transaction import atomic -from django.core.cache import cache +from django.utils.translation import ugettext +from django.utils.translation import ugettext_lazy as _ -from common.utils.lock import DistributedLock -from common.utils.common import timeit from common.db.models import output_as_string from common.utils import get_logger -from orgs.mixins.models import OrgModelMixin, OrgManager -from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org +from common.utils.lock import DistributedLock +from orgs.mixins.models import OrgManager, JMSOrgBaseModel from orgs.models import Organization +from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org __all__ = ['Node', 'FamilyMixin', 'compute_parent_key', 'NodeQuerySet'] logger = get_logger(__name__) @@ -545,7 +540,7 @@ class SomeNodesMixin: return root_nodes -class Node(OrgModelMixin, SomeNodesMixin, FamilyMixin, NodeAssetsMixin): +class Node(JMSOrgBaseModel, SomeNodesMixin, FamilyMixin, NodeAssetsMixin): id = models.UUIDField(default=uuid.uuid4, primary_key=True) key = models.CharField(unique=True, max_length=64, verbose_name=_("Key")) # '1:1:1:1' value = models.CharField(max_length=128, verbose_name=_("Value")) diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index fd803184c..f5aee2f65 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -19,9 +19,9 @@ class JobAuditLogSerializer(JobExecutionSerializer): class Meta: model = JobAuditLog read_only_fields = [ - "id", "material", "time_cost", - 'date_start', 'date_finished', 'date_created', - 'is_finished', 'is_success', 'creator_by' + "id", "material", "time_cost", 'date_start', + 'date_finished', 'date_created', + 'is_finished', 'is_success', 'created_by', ] fields = read_only_fields + [] diff --git a/apps/authentication/migrations/0016_auto_20221220_1956.py b/apps/authentication/migrations/0016_auto_20221220_1956.py new file mode 100644 index 000000000..d1480629c --- /dev/null +++ b/apps/authentication/migrations/0016_auto_20221220_1956.py @@ -0,0 +1,58 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0015_auto_20221205_1136'), + ] + + operations = [ + migrations.AddField( + model_name='connectiontoken', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='ssotoken', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='temptoken', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='connectiontoken', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='connectiontoken', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='ssotoken', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='ssotoken', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='temptoken', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='temptoken', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/authentication/models/connection_token.py b/apps/authentication/models/connection_token.py index 421ec0969..bb7d282b1 100644 --- a/apps/authentication/models/connection_token.py +++ b/apps/authentication/models/connection_token.py @@ -11,10 +11,9 @@ from rest_framework.exceptions import PermissionDenied from assets.const import Protocol from common.db.fields import EncryptCharField -from common.db.models import JMSBaseModel from common.utils import lazyproperty, pretty_string, bulk_get from common.utils.timezone import as_current_tz -from orgs.mixins.models import OrgModelMixin +from orgs.mixins.models import JMSOrgBaseModel from terminal.models import Applet @@ -22,7 +21,7 @@ def date_expired_default(): return timezone.now() + timedelta(seconds=settings.CONNECTION_TOKEN_EXPIRATION) -class ConnectionToken(OrgModelMixin, JMSBaseModel): +class ConnectionToken(JMSOrgBaseModel): value = models.CharField(max_length=64, default='', verbose_name=_("Value")) user = models.ForeignKey( 'users.User', on_delete=models.SET_NULL, null=True, blank=True, diff --git a/apps/common/db/models.py b/apps/common/db/models.py index 10f553410..7be495538 100644 --- a/apps/common/db/models.py +++ b/apps/common/db/models.py @@ -72,10 +72,11 @@ class ChoicesMixin: class BaseCreateUpdateModel(models.Model): - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) - updated_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Updated by')) + created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by')) + updated_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Updated by')) date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created')) date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated')) + comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) class Meta: abstract = True diff --git a/apps/common/mixins/models.py b/apps/common/mixins/models.py index e0d9b392a..f6705f53c 100644 --- a/apps/common/mixins/models.py +++ b/apps/common/mixins/models.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- # -import uuid + from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ __all__ = [ "NoDeleteManager", "NoDeleteModelMixin", "NoDeleteQuerySet", - "CommonModelMixin" ] @@ -44,16 +43,6 @@ class NoDeleteModelMixin(models.Model): return self.save() -class CommonModelMixin(models.Model): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) - date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created')) - date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated')) - - class Meta: - abstract = True - - class DebugQueryManager(models.Manager): def get_queryset(self): import traceback @@ -64,5 +53,3 @@ class DebugQueryManager(models.Manager): print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<") queryset = super().get_queryset() return queryset - - diff --git a/apps/notifications/migrations/0003_auto_20221220_1956.py b/apps/notifications/migrations/0003_auto_20221220_1956.py new file mode 100644 index 000000000..7cbac3e18 --- /dev/null +++ b/apps/notifications/migrations/0003_auto_20221220_1956.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notifications', '0002_auto_20210909_1946'), + ] + + operations = [ + migrations.AlterField( + model_name='sitemessage', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='sitemessage', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='sitemessageusers', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='sitemessageusers', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='systemmsgsubscription', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='systemmsgsubscription', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='usermsgsubscription', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='usermsgsubscription', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/notifications/models/notification.py b/apps/notifications/models/notification.py index 24995e975..410d07a28 100644 --- a/apps/notifications/models/notification.py +++ b/apps/notifications/models/notification.py @@ -12,6 +12,7 @@ class UserMsgSubscription(JMSBaseModel): verbose_name=_('User') ) receive_backends = models.JSONField(default=list, verbose_name=_('receive backend')) + comment = '' class Meta: verbose_name = _('User message') @@ -25,6 +26,7 @@ class SystemMsgSubscription(JMSBaseModel): users = models.ManyToManyField('users.User', related_name='system_msg_subscriptions') groups = models.ManyToManyField('users.UserGroup', related_name='system_msg_subscriptions') receive_backends = models.JSONField(default=list) + comment = '' message_type_label = '' diff --git a/apps/notifications/models/site_msg.py b/apps/notifications/models/site_msg.py index e08cd5c71..170f21a3f 100644 --- a/apps/notifications/models/site_msg.py +++ b/apps/notifications/models/site_msg.py @@ -6,10 +6,13 @@ __all__ = ('SiteMessageUsers', 'SiteMessage') class SiteMessageUsers(JMSBaseModel): - sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers') - user = models.ForeignKey('users.User', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers') + sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False, + related_name='m2m_sitemessageusers') + user = models.ForeignKey('users.User', on_delete=models.CASCADE, db_constraint=False, + related_name='m2m_sitemessageusers') has_read = models.BooleanField(default=False) read_at = models.DateTimeField(default=None, null=True) + comment = '' class SiteMessage(JMSBaseModel): @@ -24,6 +27,7 @@ class SiteMessage(JMSBaseModel): 'users.User', db_constraint=False, on_delete=models.DO_NOTHING, null=True, default=None, related_name='send_site_message' ) + comment = '' has_read = False read_at = None diff --git a/apps/ops/migrations/0026_auto_20221009_2050.py b/apps/ops/migrations/0026_auto_20221009_2050.py index 699246531..b9965c2bd 100644 --- a/apps/ops/migrations/0026_auto_20221009_2050.py +++ b/apps/ops/migrations/0026_auto_20221009_2050.py @@ -1,13 +1,13 @@ # Generated by Django 3.2.14 on 2022-10-09 12:50 +import uuid + +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion -import uuid class Migration(migrations.Migration): - dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('assets', '0106_auto_20220916_1556'), @@ -23,7 +23,8 @@ class Migration(migrations.Migration): ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ('is_periodic', models.BooleanField(default=False)), ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform')), @@ -32,7 +33,7 @@ class Migration(migrations.Migration): ('account_policy', models.CharField(default='root', max_length=128, verbose_name='Account policy')), ('date_last_run', models.DateTimeField(null=True, verbose_name='Date last run')), ('path', models.FilePathField(max_length=1024, verbose_name='Playbook')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('assets', models.ManyToManyField(to='assets.Asset', verbose_name='Assets')), ], options={ @@ -52,10 +53,11 @@ class Migration(migrations.Migration): ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ('path', models.FilePathField(verbose_name='Path')), - ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ], options={ 'verbose_name': 'Playbook template', @@ -74,8 +76,11 @@ class Migration(migrations.Migration): ('date_start', models.DateTimeField(db_index=True, null=True, verbose_name='Date start')), ('date_finished', models.DateTimeField(null=True, verbose_name='Date finished')), ('path', models.FilePathField(max_length=1024, verbose_name='Run dir')), - ('creator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Creator')), - ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ops.playbook', verbose_name='Task')), + ('creator', + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, + verbose_name='Creator')), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ops.playbook', + verbose_name='Task')), ], options={ 'ordering': ['-date_start'], @@ -85,16 +90,19 @@ class Migration(migrations.Migration): migrations.AddField( model_name='playbook', name='last_execution', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbookexecution', verbose_name='Last execution'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, + to='ops.playbookexecution', verbose_name='Last execution'), ), migrations.AddField( model_name='playbook', name='owner', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Owner'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, verbose_name='Owner'), ), migrations.AddField( model_name='playbook', name='template', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbooktemplate', verbose_name='Template'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbooktemplate', + verbose_name='Template'), ), ] diff --git a/apps/ops/migrations/0031_auto_20221220_1956.py b/apps/ops/migrations/0031_auto_20221220_1956.py new file mode 100644 index 000000000..616d6f4f3 --- /dev/null +++ b/apps/ops/migrations/0031_auto_20221220_1956.py @@ -0,0 +1,58 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ops', '0030_jobauditlog'), + ] + + operations = [ + migrations.AddField( + model_name='jobexecution', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='adhoc', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='adhoc', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='job', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='job', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='jobexecution', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='jobexecution', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='playbook', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='playbook', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index 4f003895e..b849d6a76 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -1,13 +1,13 @@ import json +import logging import os import uuid -import logging +from celery import current_task from django.conf import settings from django.db import models -from django.utils.translation import gettext_lazy as _ from django.utils import timezone -from celery import current_task +from django.utils.translation import gettext_lazy as _ __all__ = ["Job", "JobExecution", "JobAuditLog"] @@ -19,7 +19,6 @@ from orgs.mixins.models import JMSOrgBaseModel class Job(JMSOrgBaseModel, PeriodTaskModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, null=True, verbose_name=_('Name')) instant = models.BooleanField(default=False) args = models.CharField(max_length=1024, default='', verbose_name=_('Args'), null=True, blank=True) diff --git a/apps/orgs/migrations/0001_initial.py b/apps/orgs/migrations/0001_initial.py index 7241ce6a2..a4705e719 100644 --- a/apps/orgs/migrations/0001_initial.py +++ b/apps/orgs/migrations/0001_initial.py @@ -1,12 +1,12 @@ # Generated by Django 2.0.7 on 2018-08-07 03:16 +import uuid + from django.conf import settings from django.db import migrations, models -import uuid class Migration(migrations.Migration): - initial = True dependencies = [ @@ -21,7 +21,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), - ('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('admins', models.ManyToManyField(blank=True, related_name='admin_orgs', to=settings.AUTH_USER_MODEL)), ('users', models.ManyToManyField(blank=True, related_name='orgs', to=settings.AUTH_USER_MODEL)), ], diff --git a/apps/orgs/migrations/0015_auto_20221220_1956.py b/apps/orgs/migrations/0015_auto_20221220_1956.py new file mode 100644 index 000000000..df92f6862 --- /dev/null +++ b/apps/orgs/migrations/0015_auto_20221220_1956.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orgs', '0014_organization_builtin'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='organization', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='organization', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/orgs/models.py b/apps/orgs/models.py index 89f50f4bb..be88ec242 100644 --- a/apps/orgs/models.py +++ b/apps/orgs/models.py @@ -1,8 +1,7 @@ -import uuid - from django.db import models from django.utils.translation import ugettext_lazy as _ +from common.db.models import JMSBaseModel from common.tree import TreeNode from common.utils import lazyproperty, settings @@ -64,13 +63,9 @@ class OrgRoleMixin: return self.get_origin_role_members('user') -class Organization(OrgRoleMixin, models.Model): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class Organization(OrgRoleMixin, JMSBaseModel): name = models.CharField(max_length=128, unique=True, verbose_name=_("Name")) - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) builtin = models.BooleanField(default=False, verbose_name=_('Builtin')) - date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created')) - comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) members = models.ManyToManyField( 'users.User', related_name='orgs', through='rbac.RoleBinding', through_fields=('org', 'user') ) diff --git a/apps/perms/migrations/0034_auto_20221220_1956.py b/apps/perms/migrations/0034_auto_20221220_1956.py new file mode 100644 index 000000000..01b7f0f5f --- /dev/null +++ b/apps/perms/migrations/0034_auto_20221220_1956.py @@ -0,0 +1,54 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('perms', '0033_alter_assetpermission_actions'), + ] + + operations = [ + migrations.AddField( + model_name='assetpermission', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='assetpermission', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='assetpermission', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='assetpermission', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='assetpermission', + name='date_created', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created'), + ), + migrations.AlterField( + model_name='userassetgrantedtreenoderelation', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='userassetgrantedtreenoderelation', + name='id', + field=models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='userassetgrantedtreenoderelation', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/perms/models/__init__.py b/apps/perms/models/__init__.py index 9041990f2..63bd0b025 100644 --- a/apps/perms/models/__init__.py +++ b/apps/perms/models/__init__.py @@ -3,4 +3,3 @@ from .asset_permission import * from .perm_node import * -from .perm_token import * diff --git a/apps/perms/models/asset_permission.py b/apps/perms/models/asset_permission.py index e3b2afdca..ac6fecdb4 100644 --- a/apps/perms/models/asset_permission.py +++ b/apps/perms/models/asset_permission.py @@ -1,4 +1,3 @@ -import uuid import logging from django.db import models @@ -6,16 +5,14 @@ from django.db.models import Q from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from users.models import User from assets.models import Asset, Account -from orgs.mixins.models import OrgManager -from orgs.mixins.models import OrgModelMixin -from common.utils.timezone import local_now from common.db.models import UnionQuerySet from common.utils import date_expired_default - +from common.utils.timezone import local_now +from orgs.mixins.models import JMSOrgBaseModel +from orgs.mixins.models import OrgManager from perms.const import ActionChoices -from .perm_node import PermNode +from users.models import User __all__ = ['AssetPermission', 'ActionChoices'] @@ -54,8 +51,7 @@ class AssetPermissionManager(OrgManager): return self.get_queryset().filter(Q(date_start__lte=now) | Q(date_expired__gte=now)) -class AssetPermission(OrgModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class AssetPermission(JMSOrgBaseModel): name = models.CharField(max_length=128, verbose_name=_('Name')) users = models.ManyToManyField( 'users.User', related_name='%(class)ss', blank=True, verbose_name=_("User") @@ -76,11 +72,8 @@ class AssetPermission(OrgModelMixin): date_expired = models.DateTimeField( default=date_expired_default, db_index=True, verbose_name=_('Date expired') ) - comment = models.TextField(verbose_name=_('Comment'), blank=True) is_active = models.BooleanField(default=True, verbose_name=_('Active')) from_ticket = models.BooleanField(default=False, verbose_name=_('From ticket')) - date_created = models.DateTimeField(auto_now_add=True, verbose_name=_('Date created')) - created_by = models.CharField(max_length=128, blank=True, verbose_name=_('Created by')) objects = AssetPermissionManager.from_queryset(AssetPermissionQuerySet)() @@ -142,11 +135,11 @@ class AssetPermission(OrgModelMixin): @classmethod def get_all_users_for_perms(cls, perm_ids, flat=False): - user_ids = cls.users.through.objects.filter(assetpermission_id__in=perm_ids)\ + user_ids = cls.users.through.objects.filter(assetpermission_id__in=perm_ids) \ .values_list('user_id', flat=True).distinct() - group_ids = cls.user_groups.through.objects.filter(assetpermission_id__in=perm_ids)\ + group_ids = cls.user_groups.through.objects.filter(assetpermission_id__in=perm_ids) \ .values_list('usergroup_id', flat=True).distinct() - group_user_ids = User.groups.through.objects.filter(usergroup_id__in=group_ids)\ + group_user_ids = User.groups.through.objects.filter(usergroup_id__in=group_ids) \ .values_list('user_id', flat=True).distinct() user_ids = set(user_ids) | set(group_user_ids) if flat: diff --git a/apps/perms/models/perm_node.py b/apps/perms/models/perm_node.py index 4dddae98f..675e36e9c 100644 --- a/apps/perms/models/perm_node.py +++ b/apps/perms/models/perm_node.py @@ -1,12 +1,10 @@ - -from django.utils.translation import ugettext_lazy as _ from django.db import models from django.db.models import F, TextChoices +from django.utils.translation import ugettext_lazy as _ from assets.models import Asset, Node, FamilyMixin, Account -from orgs.mixins.models import OrgModelMixin from common.utils import lazyproperty -from common.db.models import BaseCreateUpdateModel +from orgs.mixins.models import JMSOrgBaseModel class NodeFrom(TextChoices): @@ -15,7 +13,7 @@ class NodeFrom(TextChoices): asset = 'asset', 'Direct asset granted' -class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpdateModel): +class UserAssetGrantedTreeNodeRelation(FamilyMixin, JMSOrgBaseModel): NodeFrom = NodeFrom user = models.ForeignKey('users.User', db_constraint=False, on_delete=models.CASCADE) @@ -26,6 +24,7 @@ class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpd db_index=True) node_from = models.CharField(choices=NodeFrom.choices, max_length=16, db_index=True) node_assets_amount = models.IntegerField(default=0) + comment = '' @property def key(self): diff --git a/apps/perms/models/perm_token.py b/apps/perms/models/perm_token.py deleted file mode 100644 index 368750c63..000000000 --- a/apps/perms/models/perm_token.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -class PermToken(models.Model): - """ - 1. 用完失效 - 2. 仅用于授权,不用于认证 - 3. 存 redis 就行 - 4. 有效期 5 分钟 - """ - user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name=_('User')) - asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_('Asset')) - account = models.CharField(max_length=128, verbose_name=_('Account')) - secret = models.CharField(max_length=1024, verbose_name=_('Secret')) - protocol = models.CharField(max_length=32, verbose_name=_('Protocol')) - connect_method = models.CharField(max_length=32, verbose_name=_('Connect method')) - actions = models.IntegerField(verbose_name=_('Actions')) - - class Meta: - abstract = True diff --git a/apps/rbac/migrations/0010_auto_20221220_1956.py b/apps/rbac/migrations/0010_auto_20221220_1956.py new file mode 100644 index 000000000..0dee17c55 --- /dev/null +++ b/apps/rbac/migrations/0010_auto_20221220_1956.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rbac', '0009_auto_20220411_1724'), + ] + + operations = [ + migrations.AddField( + model_name='rolebinding', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='role', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='role', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='rolebinding', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='rolebinding', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + ] diff --git a/apps/terminal/migrations/0016_commandstorage_replaystorage.py b/apps/terminal/migrations/0016_commandstorage_replaystorage.py index 1f1b04966..5eb17046a 100644 --- a/apps/terminal/migrations/0016_commandstorage_replaystorage.py +++ b/apps/terminal/migrations/0016_commandstorage_replaystorage.py @@ -24,7 +24,7 @@ class Migration(migrations.Migration): ('type', models.CharField(choices=[('null', 'Null'), ('server', 'Server'), ('es', 'Elasticsearch')], default='server', max_length=16, verbose_name='Type')), ('meta', common.db.fields.EncryptJsonDictTextField(default={})), - ('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ], options={ 'abstract': False, @@ -43,7 +43,7 @@ class Migration(migrations.Migration): ('oss', 'OSS'), ('azure', 'Azure')], default='server', max_length=16, verbose_name='Type')), ('meta', common.db.fields.EncryptJsonDictTextField(default={})), - ('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ], options={ 'abstract': False, diff --git a/apps/terminal/migrations/0064_auto_20221220_1956.py b/apps/terminal/migrations/0064_auto_20221220_1956.py new file mode 100644 index 000000000..93b47dedc --- /dev/null +++ b/apps/terminal/migrations/0064_auto_20221220_1956.py @@ -0,0 +1,178 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('terminal', '0063_applet_builtin'), + ] + + operations = [ + migrations.AddField( + model_name='commandstorage', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='replaystorage', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='sessionjoinrecord', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='sessionjoinrecord', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='sessionreplay', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='sessionreplay', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='sessionsharing', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='sessionsharing', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='task', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='task', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AddField( + model_name='task', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='task', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='terminal', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AddField( + model_name='terminal', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='terminal', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='applet', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='applet', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='applethostdeployment', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='applethostdeployment', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='appletpublication', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='appletpublication', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='commandstorage', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='endpoint', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='endpoint', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='endpointrule', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='endpointrule', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='replaystorage', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='sessionjoinrecord', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='sessionreplay', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='sessionsharing', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='task', + name='date_created', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created'), + ), + migrations.AlterField( + model_name='terminal', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='terminal', + name='date_created', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created'), + ), + ] diff --git a/apps/terminal/models/component/storage.py b/apps/terminal/models/component/storage.py index b6878fb64..a3f8e4b54 100644 --- a/apps/terminal/models/component/storage.py +++ b/apps/terminal/models/component/storage.py @@ -1,22 +1,23 @@ from __future__ import unicode_literals + import copy import os from importlib import import_module import jms_storage +from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ -from django.conf import settings -from common.mixins import CommonModelMixin +from common.db.fields import EncryptJsonDictTextField +from common.db.models import JMSBaseModel from common.plugins.es import QuerySet as ESQuerySet from common.utils import get_logger -from common.db.fields import EncryptJsonDictTextField from common.utils.timezone import local_now_date_display +from terminal import const from terminal.backends import TYPE_ENGINE_MAPPING from .terminal import Terminal from ..session.command import Command -from terminal import const logger = get_logger(__file__) @@ -25,7 +26,6 @@ class CommonStorageModelMixin(models.Model): name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) meta = EncryptJsonDictTextField(default={}) is_default = models.BooleanField(default=False, verbose_name=_('Default storage')) - comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) class Meta: abstract = True @@ -51,7 +51,7 @@ class CommonStorageModelMixin(models.Model): return objs.first() -class CommandStorage(CommonStorageModelMixin, CommonModelMixin): +class CommandStorage(CommonStorageModelMixin, JMSBaseModel): type = models.CharField( max_length=16, choices=const.CommandStorageType.choices, default=const.CommandStorageType.server.value, verbose_name=_('Type'), @@ -140,7 +140,7 @@ class CommandStorage(CommonStorageModelMixin, CommonModelMixin): verbose_name = _("Command storage") -class ReplayStorage(CommonStorageModelMixin, CommonModelMixin): +class ReplayStorage(CommonStorageModelMixin, JMSBaseModel): type = models.CharField( max_length=16, choices=const.ReplayStorageType.choices, default=const.ReplayStorageType.server.value, verbose_name=_('Type') diff --git a/apps/terminal/models/component/task.py b/apps/terminal/models/component/task.py index 0225dc641..1c081da53 100644 --- a/apps/terminal/models/component/task.py +++ b/apps/terminal/models/component/task.py @@ -1,27 +1,24 @@ from __future__ import unicode_literals -import uuid - from django.db import models from django.utils.translation import ugettext_lazy as _ + +from common.db.models import JMSBaseModel from .terminal import Terminal -class Task(models.Model): +class Task(JMSBaseModel): NAME_CHOICES = ( ("kill_session", "Kill Session"), ) - id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, choices=NAME_CHOICES, verbose_name=_("Name")) args = models.CharField(max_length=1024, verbose_name=_("Args")) kwargs = models.JSONField(default=dict, verbose_name=_("Kwargs")) terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL) is_finished = models.BooleanField(default=False) - date_created = models.DateTimeField(auto_now_add=True) date_finished = models.DateTimeField(null=True) class Meta: db_table = "terminal_task" verbose_name = _("Task") - diff --git a/apps/terminal/models/component/terminal.py b/apps/terminal/models/component/terminal.py index e244c8a40..406d2192a 100644 --- a/apps/terminal/models/component/terminal.py +++ b/apps/terminal/models/component/terminal.py @@ -1,11 +1,11 @@ import time -import uuid from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ from common.const.signals import SKIP_SIGNAL +from common.db.models import JMSBaseModel from common.utils import get_logger, lazyproperty from orgs.utils import tmp_to_root_org from terminal.const import TerminalType as TypeChoices @@ -75,8 +75,7 @@ class StorageMixin: return {"TERMINAL_REPLAY_STORAGE": config} -class Terminal(StorageMixin, TerminalStatusMixin, models.Model): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel): name = models.CharField(max_length=128, verbose_name=_('Name')) type = models.CharField( choices=TypeChoices.choices, default=TypeChoices.koko, @@ -88,8 +87,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model): user = models.OneToOneField(User, related_name='terminal', verbose_name=_('Application User'), null=True, on_delete=models.CASCADE) is_deleted = models.BooleanField(default=False) - date_created = models.DateTimeField(auto_now_add=True) - comment = models.TextField(blank=True, verbose_name=_('Comment')) @property def is_active(self): diff --git a/apps/terminal/models/session/replay.py b/apps/terminal/models/session/replay.py index 5f3e372af..9fd210f48 100644 --- a/apps/terminal/models/session/replay.py +++ b/apps/terminal/models/session/replay.py @@ -1,11 +1,11 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from common.mixins.models import CommonModelMixin +from common.db.models import JMSBaseModel from .session import Session -class SessionReplay(CommonModelMixin): +class SessionReplay(JMSBaseModel): session = models.ForeignKey(Session, on_delete=models.CASCADE, verbose_name=_("Session")) class Meta: @@ -14,5 +14,3 @@ class SessionReplay(CommonModelMixin): ('upload_sessionreplay', _("Can upload session replay")), ('download_sessionreplay', _("Can download session replay")), ] - - diff --git a/apps/terminal/models/session/sharing.py b/apps/terminal/models/session/sharing.py index 8675ced01..b71cad900 100644 --- a/apps/terminal/models/session/sharing.py +++ b/apps/terminal/models/session/sharing.py @@ -1,20 +1,19 @@ import datetime from django.db import models -from django.utils.translation import ugettext_lazy as _ from django.utils import timezone +from django.utils.translation import ugettext_lazy as _ + +from common.db.models import JMSBaseModel +from orgs.mixins.models import OrgModelMixin from orgs.utils import tmp_to_root_org from users.models import User - -from common.mixins import CommonModelMixin -from orgs.mixins.models import OrgModelMixin from .session import Session - __all__ = ['SessionSharing', 'SessionJoinRecord'] -class SessionSharing(CommonModelMixin, OrgModelMixin): +class SessionSharing(JMSBaseModel, OrgModelMixin): session = models.ForeignKey( 'terminal.Session', on_delete=models.CASCADE, verbose_name=_('Session') ) @@ -33,7 +32,7 @@ class SessionSharing(CommonModelMixin, OrgModelMixin): users = models.TextField(blank=True, verbose_name=_("User")) class Meta: - ordering = ('-date_created', ) + ordering = ('-date_created',) verbose_name = _('Session sharing') permissions = [ ('add_supersessionsharing', _("Can add super session sharing")) @@ -71,7 +70,7 @@ class SessionSharing(CommonModelMixin, OrgModelMixin): return True, '' -class SessionJoinRecord(CommonModelMixin, OrgModelMixin): +class SessionJoinRecord(JMSBaseModel, OrgModelMixin): LOGIN_FROM = Session.LOGIN_FROM session = models.ForeignKey( @@ -112,7 +111,7 @@ class SessionJoinRecord(CommonModelMixin, OrgModelMixin): ) class Meta: - ordering = ('-date_joined', ) + ordering = ('-date_joined',) verbose_name = _("Session join record") def __str__(self): diff --git a/apps/tickets/migrations/0020_auto_20220817_1346.py b/apps/tickets/migrations/0020_auto_20220817_1346.py index 783021dc8..a79bf727a 100644 --- a/apps/tickets/migrations/0020_auto_20220817_1346.py +++ b/apps/tickets/migrations/0020_auto_20220817_1346.py @@ -1,6 +1,7 @@ # Generated by Django 3.2.14 on 2022-08-17 05:46 import time + from django.db import migrations, models @@ -15,7 +16,7 @@ def migrate_system_to_account(apps, schema_editor): (apply_login_asset_ticket_model, 'apply_login_system_user', 'apply_login_account', False), ) - print("\n\tStart migrate system user to account") + print("\n Start migrate system user to account") for model, old_field, new_field, m2m in model_system_user_account: print("\t - migrate '{}'".format(model.__name__)) count = 0 @@ -40,12 +41,11 @@ def migrate_system_to_account(apps, schema_editor): updated.append(obj) model.objects.bulk_update(updated, [new_field]) print(" Migrate account: {}-{} using: {:.2f}s".format( - count - len(objects), count, time.time()-start + count - len(objects), count, time.time() - start )) class Migration(migrations.Migration): - dependencies = [ ('tickets', '0019_delete_applyapplicationticket'), ] diff --git a/apps/tickets/migrations/0025_auto_20221206_1820.py b/apps/tickets/migrations/0025_auto_20221206_1820.py index c82a17ce8..ca9947158 100644 --- a/apps/tickets/migrations/0025_auto_20221206_1820.py +++ b/apps/tickets/migrations/0025_auto_20221206_1820.py @@ -1,13 +1,12 @@ # Generated by Django 3.2.14 on 2022-12-06 10:20 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('acls', '0010_auto_20221205_1122'), + ('acls', '0008_commandgroup_comment'), ('tickets', '0024_auto_20221121_1800'), ] @@ -23,6 +22,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='applycommandticket', name='apply_from_cmd_filter_acl', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='acls.commandfilteracl', verbose_name='Command filter acl'), + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='acls.commandfilteracl', + verbose_name='Command filter acl'), ), ] diff --git a/apps/tickets/migrations/0026_auto_20221220_1956.py b/apps/tickets/migrations/0026_auto_20221220_1956.py new file mode 100644 index 000000000..67f590f7b --- /dev/null +++ b/apps/tickets/migrations/0026_auto_20221220_1956.py @@ -0,0 +1,98 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tickets', '0025_auto_20221206_1820'), + ] + + operations = [ + migrations.AddField( + model_name='approvalrule', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='approvalrule', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='comment', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='comment', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='ticket', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='ticketassignee', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='ticketassignee', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='ticketflow', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='ticketflow', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AddField( + model_name='ticketstep', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AddField( + model_name='ticketstep', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='approvalrule', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='comment', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='ticket', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='ticketassignee', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='ticketflow', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + migrations.AlterField( + model_name='ticketstep', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/tickets/models/comment.py b/apps/tickets/models/comment.py index f15057d7e..638ecdc4d 100644 --- a/apps/tickets/models/comment.py +++ b/apps/tickets/models/comment.py @@ -3,12 +3,12 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from common.mixins.models import CommonModelMixin +from common.db.models import JMSBaseModel __all__ = ['Comment'] -class Comment(CommonModelMixin): +class Comment(JMSBaseModel): class Type(models.TextChoices): state = 'state', _('State') common = 'common', _('common') @@ -28,7 +28,7 @@ class Comment(CommonModelMixin): state = models.CharField(max_length=16, null=True) class Meta: - ordering = ('date_created', ) + ordering = ('date_created',) verbose_name = _("Comment") def set_display_fields(self): diff --git a/apps/tickets/models/flow.py b/apps/tickets/models/flow.py index 4dd468f57..0b7518fc6 100644 --- a/apps/tickets/models/flow.py +++ b/apps/tickets/models/flow.py @@ -3,18 +3,17 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from users.models import User -from common.mixins.models import CommonModelMixin - +from common.db.models import JMSBaseModel from orgs.mixins.models import OrgModelMixin from orgs.models import Organization from orgs.utils import tmp_to_org, get_current_org_id +from users.models import User from ..const import TicketType, TicketLevel, TicketApprovalStrategy __all__ = ['TicketFlow', 'ApprovalRule'] -class ApprovalRule(CommonModelMixin): +class ApprovalRule(JMSBaseModel): level = models.SmallIntegerField( default=TicketLevel.one, choices=TicketLevel.choices, verbose_name=_('Approve level') @@ -51,7 +50,7 @@ class ApprovalRule(CommonModelMixin): return assignees -class TicketFlow(CommonModelMixin, OrgModelMixin): +class TicketFlow(JMSBaseModel, OrgModelMixin): type = models.CharField( max_length=64, choices=TicketType.choices, default=TicketType.general, verbose_name=_("Type") diff --git a/apps/tickets/models/ticket/general.py b/apps/tickets/models/ticket/general.py index 271b87166..863a1508f 100644 --- a/apps/tickets/models/ticket/general.py +++ b/apps/tickets/models/ticket/general.py @@ -5,17 +5,17 @@ from typing import Callable from django.db import models from django.db.models import Q -from django.forms import model_to_dict -from django.db.utils import IntegrityError from django.db.models.fields import related +from django.db.utils import IntegrityError +from django.forms import model_to_dict from django.utils.translation import ugettext_lazy as _ -from orgs.utils import tmp_to_org -from orgs.models import Organization +from common.db.encoder import ModelJSONFieldEncoder +from common.db.models import JMSBaseModel from common.exceptions import JMSException from common.utils.timezone import as_current_tz -from common.mixins.models import CommonModelMixin -from common.db.encoder import ModelJSONFieldEncoder +from orgs.models import Organization +from orgs.utils import tmp_to_org from tickets.const import ( TicketType, TicketStatus, TicketState, TicketLevel, StepState, StepStatus @@ -25,11 +25,12 @@ from tickets.handlers import get_ticket_handler from ..flow import TicketFlow __all__ = [ - 'Ticket', 'TicketStep', 'TicketAssignee', 'SuperTicket', 'SubTicketManager' + 'Ticket', 'TicketStep', 'TicketAssignee', + 'SuperTicket', 'SubTicketManager' ] -class TicketStep(CommonModelMixin): +class TicketStep(JMSBaseModel): ticket = models.ForeignKey( 'Ticket', related_name='ticket_steps', on_delete=models.CASCADE, verbose_name='Ticket' @@ -74,7 +75,7 @@ class TicketStep(CommonModelMixin): verbose_name = _("Ticket step") -class TicketAssignee(CommonModelMixin): +class TicketAssignee(JMSBaseModel): assignee = models.ForeignKey( 'users.User', related_name='ticket_assignees', on_delete=models.CASCADE, verbose_name='Assignee' @@ -267,7 +268,7 @@ class StatusMixin: return get_ticket_handler(ticket=self) -class Ticket(StatusMixin, CommonModelMixin): +class Ticket(StatusMixin, JMSBaseModel): title = models.CharField(max_length=256, verbose_name=_('Title')) type = models.CharField( max_length=64, choices=TicketType.choices, diff --git a/apps/users/migrations/0001_initial.py b/apps/users/migrations/0001_initial.py index 01edf24b6..d5c584181 100644 --- a/apps/users/migrations/0001_initial.py +++ b/apps/users/migrations/0001_initial.py @@ -2,15 +2,16 @@ # Generated by Django 1.11 on 2017-12-21 16:06 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 +import django.contrib.auth.models +import django.utils.timezone +from django.conf import settings +from django.contrib.auth.hashers import make_password +from django.db import migrations, models + +import common.utils + def add_default_group(apps, schema_editor): group_model = apps.get_model("users", "UserGroup") @@ -34,7 +35,6 @@ def add_default_admin(apps, schema_editor): class Migration(migrations.Migration): - initial = True dependencies = [ @@ -49,13 +49,17 @@ class Migration(migrations.Migration): ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), ('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')), - ('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')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('username', models.CharField(max_length=20, unique=True, verbose_name='Username')), ('name', models.CharField(max_length=20, verbose_name='Name')), ('email', models.EmailField(max_length=30, unique=True, verbose_name='Email')), - ('role', models.CharField(blank=True, choices=[('Admin', 'Administrator'), ('User', 'User'), ('App', 'Application')], default='User', max_length=10, verbose_name='Role')), + ('role', models.CharField(blank=True, choices=[('Admin', 'Administrator'), ('User', 'User'), + ('App', 'Application')], default='User', max_length=10, + verbose_name='Role')), ('avatar', models.ImageField(null=True, upload_to='avatar', verbose_name='Avatar')), ('wechat', models.CharField(blank=True, max_length=30, verbose_name='Wechat')), ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')), @@ -63,9 +67,10 @@ class Migration(migrations.Migration): ('secret_key_otp', models.CharField(blank=True, max_length=16)), ('_private_key', models.CharField(blank=True, max_length=5000, verbose_name='Private key')), ('_public_key', models.CharField(blank=True, max_length=5000, verbose_name='Public key')), - ('comment', models.TextField(blank=True, max_length=200, verbose_name='Comment')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), ('is_first_login', models.BooleanField(default=False)), - ('date_expired', models.DateTimeField(blank=True, default=common.utils.date_expired_default, null=True, verbose_name='Date expired')), + ('date_expired', models.DateTimeField(blank=True, default=common.utils.date_expired_default, null=True, + verbose_name='Date expired')), ('created_by', models.CharField(default='', max_length=30, verbose_name='Created by')), ], options={ @@ -78,9 +83,11 @@ class Migration(migrations.Migration): migrations.CreateModel( name='AccessKey', fields=[ - ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='AccessKeyID')), + ('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')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_key', + to=settings.AUTH_USER_MODEL, verbose_name='User')), ], ), migrations.CreateModel( @@ -88,7 +95,8 @@ class Migration(migrations.Migration): 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')), + ('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')), @@ -103,7 +111,8 @@ class Migration(migrations.Migration): 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')), + ('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', @@ -127,12 +136,15 @@ class Migration(migrations.Migration): migrations.AddField( model_name='user', name='groups', - field=models.ManyToManyField(blank=True, related_name='users', to='users.UserGroup', verbose_name='User group'), + field=models.ManyToManyField(blank=True, related_name='users', to='users.UserGroup', + verbose_name='User 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'), + 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.RunPython(add_default_group), migrations.RunPython(add_default_admin), diff --git a/apps/users/migrations/0041_auto_20221220_1956.py b/apps/users/migrations/0041_auto_20221220_1956.py new file mode 100644 index 000000000..9ce1be2fe --- /dev/null +++ b/apps/users/migrations/0041_auto_20221220_1956.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.14 on 2022-12-20 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0040_alter_user_source'), + ] + + operations = [ + migrations.AddField( + model_name='usergroup', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='usergroup', + name='updated_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Updated by'), + ), + migrations.AlterField( + model_name='usergroup', + name='comment', + field=models.TextField(blank=True, default='', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='usergroup', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/users/models/group.py b/apps/users/models/group.py index 2f50d24a0..e92e65c81 100644 --- a/apps/users/models/group.py +++ b/apps/users/models/group.py @@ -1,22 +1,16 @@ # -*- coding: utf-8 -*- -import uuid from django.db import models from django.utils.translation import ugettext_lazy as _ -from orgs.mixins.models import OrgModelMixin from common.utils import lazyproperty +from orgs.mixins.models import JMSOrgBaseModel __all__ = ['UserGroup'] -class UserGroup(OrgModelMixin): - id = models.UUIDField(default=uuid.uuid4, primary_key=True) +class UserGroup(JMSOrgBaseModel): name = models.CharField(max_length=128, verbose_name=_('Name')) - comment = models.TextField(blank=True, verbose_name=_('Comment')) - date_created = models.DateTimeField(auto_now_add=True, null=True, - verbose_name=_('Date created')) - created_by = models.CharField(max_length=100, null=True, blank=True) def __str__(self): return self.name @@ -27,7 +21,7 @@ class UserGroup(OrgModelMixin): class Meta: ordering = ['name'] - unique_together = [('org_id', 'name'),] + unique_together = [('org_id', 'name'), ] verbose_name = _("User group") @classmethod