perf: 修改基础 model,继承同一个

pull/9227/head
ibuler 2022-12-20 20:23:42 +08:00
parent a7815dc9e5
commit 58909ee67d
58 changed files with 1135 additions and 344 deletions

View File

@ -28,6 +28,7 @@ class Migration(migrations.Migration):
('type', models.CharField(choices=[('command', 'Command'), ('regex', 'Regex')], default='command', ('type', models.CharField(choices=[('command', 'Command'), ('regex', 'Regex')], default='command',
max_length=16, verbose_name='Type')), max_length=16, verbose_name='Type')),
('content', models.TextField(help_text='One line one command', verbose_name='Content')), ('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')), ('ignore_case', models.BooleanField(default=True, verbose_name='Ignore case')),
], ],
options={ options={
@ -57,7 +58,8 @@ class Migration(migrations.Migration):
('assets', models.JSONField(verbose_name='Asset')), ('assets', models.JSONField(verbose_name='Asset')),
('commands', models.ManyToManyField(to='acls.CommandGroup', verbose_name='Commands')), ('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={ options={
'verbose_name': 'Command acl', 'verbose_name': 'Command acl',

View File

@ -1,18 +1,33 @@
# Generated by Django 3.2.14 on 2022-12-02 04:25 # 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('acls', '0007_auto_20221202_1048'), ('acls', '0007_auto_20221202_1048'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AlterModelOptions(
model_name='commandgroup', name='commandgroup',
name='comment', options={'verbose_name': 'Command group'},
field=models.TextField(blank=True, verbose_name='Comment'), ),
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'},
), ),
] ]

View File

@ -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',
),
]

View File

@ -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'),
),
]

View File

@ -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'},
),
]

View File

@ -3,7 +3,7 @@ from django.db import models
from django.db.models import Q from django.db.models import Q
from django.utils.translation import ugettext_lazy as _ 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 common.utils import contains_ip
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import OrgModelMixin
@ -58,7 +58,7 @@ class UserAssetAccountACLQuerySet(BaseACLQuerySet):
def filter_account(self, username): def filter_account(self, username):
q = Q(accounts__username_group__contains=username) | \ q = Q(accounts__username_group__contains=username) | \
Q(accounts__username_group__contains='*') Q(accounts__username_group__contains='*')
return self.filter(q) return self.filter(q)
@ -67,7 +67,7 @@ class ACLManager(models.Manager):
return self.get_queryset().valid() return self.get_queryset().valid()
class BaseACL(CommonModelMixin): class BaseACL(JMSBaseModel):
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
priority = models.IntegerField( priority = models.IntegerField(
default=50, verbose_name=_("Priority"), default=50, verbose_name=_("Priority"),
@ -77,7 +77,6 @@ class BaseACL(CommonModelMixin):
action = models.CharField(max_length=64, default=ActionChoices.reject, verbose_name=_('Action')) action = models.CharField(max_length=64, default=ActionChoices.reject, verbose_name=_('Action'))
reviewers = models.ManyToManyField('users.User', blank=True, verbose_name=_("Reviewers")) reviewers = models.ManyToManyField('users.User', blank=True, verbose_name=_("Reviewers"))
is_active = models.BooleanField(default=True, verbose_name=_("Active")) is_active = models.BooleanField(default=True, verbose_name=_("Active"))
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
ActionChoices = ActionChoices ActionChoices = ActionChoices
objects = ACLManager.from_queryset(BaseACLQuerySet)() objects = ACLManager.from_queryset(BaseACLQuerySet)()

View File

@ -7,7 +7,6 @@ from django.utils.translation import ugettext_lazy as _
from common.utils import lazyproperty, get_logger from common.utils import lazyproperty, get_logger
from orgs.mixins.models import JMSOrgBaseModel from orgs.mixins.models import JMSOrgBaseModel
from .base import UserAssetAccountBaseACL from .base import UserAssetAccountBaseACL
logger = get_logger(__file__) logger = get_logger(__file__)
@ -26,7 +25,6 @@ class CommandGroup(JMSOrgBaseModel):
) )
content = models.TextField(verbose_name=_("Content"), help_text=_("One line one command")) content = models.TextField(verbose_name=_("Content"), help_text=_("One line one command"))
ignore_case = models.BooleanField(default=True, verbose_name=_('Ignore case')) ignore_case = models.BooleanField(default=True, verbose_name=_('Ignore case'))
comment = models.TextField(blank=True, verbose_name=_("Comment"))
TypeChoices = TypeChoices TypeChoices = TypeChoices

View File

@ -1,17 +1,17 @@
# Generated by Django 3.1.12 on 2021-08-26 09:07 # Generated by Django 3.1.12 on 2021-08-26 09:07
import assets.models.base import uuid
import common.db.fields
from django.conf import settings
import django.core.validators import django.core.validators
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import simple_history.models 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('assets', '0076_delete_assetuser'), ('assets', '0076_delete_assetuser'),
@ -22,14 +22,19 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='HistoricalAccount', name='HistoricalAccount',
fields=[ 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)), ('id', models.UUIDField(db_index=True, default=uuid.uuid4)),
('name', models.CharField(max_length=128, verbose_name='Name')), ('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')), ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[
('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')],
('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), 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')), ('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_created', models.DateTimeField(blank=True, editable=False, verbose_name='Date created')),
('date_updated', models.DateTimeField(blank=True, editable=False, verbose_name='Date updated')), ('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')), ('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_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField()), ('history_date', models.DateTimeField()),
('history_change_reason', models.CharField(max_length=100, null=True)), ('history_change_reason', models.CharField(max_length=100, null=True)),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), ('history_type',
('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')), 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)), ('app', models.ForeignKey(blank=True, db_constraint=False, null=True,
('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')), 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={ options={
'verbose_name': 'historical Account', 'verbose_name': 'historical Account',
@ -52,20 +64,28 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Account', name='Account',
fields=[ 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)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('name', models.CharField(max_length=128, verbose_name='Name')), ('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')), ('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[
('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')), django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')],
('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')), 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')), ('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_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
('version', models.IntegerField(default=1, verbose_name='Version')), ('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')), ('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
('systemuser', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser', verbose_name='System user')), 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={ options={
'verbose_name': 'Account', 'verbose_name': 'Account',

View File

@ -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'),
),
]

View File

@ -1,12 +1,11 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.db.models import JMSBaseModel
from orgs.mixins.models import OrgModelMixin 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')) name = models.CharField(max_length=128, verbose_name=_('Name'))
category = models.CharField( category = models.CharField(
max_length=16, verbose_name=_('Category') max_length=16, verbose_name=_('Category')
@ -15,9 +14,6 @@ class Application(CommonModelMixin, OrgModelMixin):
max_length=16, verbose_name=_('Type') max_length=16, verbose_name=_('Type')
) )
attrs = models.JSONField(default=dict, verbose_name=_('Attrs')) attrs = models.JSONField(default=dict, verbose_name=_('Attrs'))
comment = models.TextField(
max_length=128, default='', blank=True, verbose_name=_('Comment')
)
class Meta: class Meta:
verbose_name = _('Application') verbose_name = _('Application')

View File

@ -1,15 +1,16 @@
# Generated by Django 3.2.12 on 2022-07-11 08:59 # Generated by Django 3.2.12 on 2022-07-11 08:59
import common.db.fields import uuid
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import simple_history.models 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('assets', '0098_auto_20220430_2126'), ('assets', '0098_auto_20220430_2126'),
@ -20,14 +21,19 @@ class Migration(migrations.Migration):
name='HistoricalAccount', name='HistoricalAccount',
fields=[ fields=[
('id', models.UUIDField(db_index=True, default=uuid.uuid4)), ('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')), ('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')),
('version', models.IntegerField(default=0, verbose_name='Version'),), ('version', models.IntegerField(default=0, verbose_name='Version'),),
('history_id', models.AutoField(primary_key=True, serialize=False)), ('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField(db_index=True)), ('history_date', models.DateTimeField(db_index=True)),
('history_change_reason', models.CharField(max_length=100, null=True)), ('history_change_reason', models.CharField(max_length=100, null=True)),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), ('history_type',
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), 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={ options={
'verbose_name': 'historical Account', 'verbose_name': 'historical Account',
@ -40,43 +46,55 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Account', name='Account',
fields=[ 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)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('name', models.CharField(max_length=128, verbose_name='Name')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')), ('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')), ('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')),
('connectivity', models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')], default='unknown', max_length=16, verbose_name='Connectivity')), ('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_verified', models.DateTimeField(null=True, verbose_name='Date verified')),
('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
('privileged', models.BooleanField(default=False, verbose_name='Privileged')), ('privileged', models.BooleanField(default=False, verbose_name='Privileged')),
('version', models.IntegerField(default=0, verbose_name='Version')), ('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={ options={
'verbose_name': 'Account', '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')}, 'unique_together': {('name', 'asset'), ('username', 'asset', 'secret_type')},
}, },
), ),
migrations.AddField( migrations.AddField(
model_name='account', model_name='account',
name='su_from', 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( migrations.CreateModel(
name='AccountTemplate', name='AccountTemplate',
fields=[ 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)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('name', models.CharField(max_length=128, verbose_name='Name')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')), ('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')), ('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_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')), ('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),

View File

@ -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'),
),
]

View File

@ -2,18 +2,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import uuid
import logging import logging
import uuid
from collections import defaultdict from collections import defaultdict
from django.db import models from django.db import models
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.utils import lazyproperty from common.utils import lazyproperty
from orgs.mixins.models import OrgManager, JMSOrgBaseModel from orgs.mixins.models import OrgManager, JMSOrgBaseModel
from ..platform import Platform
from ..base import AbsConnectivity from ..base import AbsConnectivity
from ..platform import Platform
__all__ = ['Asset', 'AssetQuerySet', 'default_node', 'Protocol'] __all__ = ['Asset', 'AssetQuerySet', 'default_node', 'Protocol']
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -110,7 +109,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
verbose_name=_("Nodes")) verbose_name=_("Nodes"))
is_active = models.BooleanField(default=True, verbose_name=_('Is active')) is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels")) 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) info = models.JSONField(verbose_name='Info', default=dict, blank=True)
objects = AssetManager.from_queryset(AssetQuerySet)() objects = AssetManager.from_queryset(AssetQuerySet)()

View File

@ -1,25 +1,24 @@
import uuid import uuid
from celery import current_task from celery import current_task
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.const.choices import Trigger from assets.const import AutomationTypes
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.models import Node, Asset from assets.models import Node, Asset
from assets.tasks import execute_automation 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")) accounts = models.JSONField(default=list, verbose_name=_("Accounts"))
nodes = models.ManyToManyField('assets.Node', blank=True, verbose_name=_("Nodes")) nodes = models.ManyToManyField('assets.Node', blank=True, verbose_name=_("Nodes"))
assets = models.ManyToManyField('assets.Asset', blank=True, verbose_name=_("Assets")) assets = models.ManyToManyField('assets.Asset', blank=True, verbose_name=_("Assets"))
type = models.CharField(max_length=16, choices=AutomationTypes.choices, verbose_name=_('Type')) type = models.CharField(max_length=16, choices=AutomationTypes.choices, verbose_name=_('Type'))
is_active = models.BooleanField(default=True, verbose_name=_("Is active")) is_active = models.BooleanField(default=True, verbose_name=_("Is active"))
comment = models.TextField(blank=True, verbose_name=_('Comment'))
def __str__(self): def __str__(self):
return self.name + '@' + str(self.created_by) return self.name + '@' + str(self.created_by)

View File

@ -7,26 +7,23 @@ from celery import current_task
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ 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.const.choices import Trigger
from common.db.encoder import ModelJSONFieldEncoder 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'] __all__ = ['AccountBackupPlan', 'AccountBackupPlanExecution']
logger = get_logger(__file__) logger = get_logger(__file__)
class AccountBackupPlan(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin): class AccountBackupPlan(PeriodTaskModelMixin, JMSOrgBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
types = models.JSONField(default=list) types = models.JSONField(default=list)
recipients = models.ManyToManyField( recipients = models.ManyToManyField(
'users.User', related_name='recipient_escape_route_plans', blank=True, 'users.User', related_name='recipient_escape_route_plans', blank=True,
verbose_name=_("Recipient") verbose_name=_("Recipient")
) )
comment = models.TextField(blank=True, verbose_name=_('Comment'))
def __str__(self): def __str__(self):
return f'{self.name}({self.org_id})' return f'{self.name}({self.org_id})'

View File

@ -69,8 +69,6 @@ class BaseAccount(JMSOrgBaseModel):
secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('Secret')) secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('Secret'))
privileged = models.BooleanField(verbose_name=_("Privileged"), default=False) privileged = models.BooleanField(verbose_name=_("Privileged"), default=False)
is_active = models.BooleanField(default=True, verbose_name=_("Is active")) 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)() objects = BaseAccountManager.from_queryset(BaseAccountQuerySet)()

View File

@ -7,11 +7,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.utils import get_logger 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 from orgs.mixins.models import OrgModelMixin
logger = get_logger(__file__) logger = get_logger(__file__)

View File

@ -1,14 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import uuid
import random import random
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.utils import get_logger, lazyproperty from common.utils import get_logger, lazyproperty
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import JMSOrgBaseModel
from .gateway import Gateway from .gateway import Gateway
logger = get_logger(__file__) logger = get_logger(__file__)
@ -16,11 +14,8 @@ logger = get_logger(__file__)
__all__ = ['Domain'] __all__ = ['Domain']
class Domain(OrgModelMixin): class Domain(JMSOrgBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) 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: class Meta:
verbose_name = _("Domain") verbose_name = _("Domain")
@ -51,5 +46,3 @@ class Domain(OrgModelMixin):
@classmethod @classmethod
def get_gateway_queryset(cls): def get_gateway_queryset(cls):
return Gateway.objects.all() return Gateway.objects.all()

View File

@ -2,13 +2,12 @@
# #
from django.db import models from django.db import models
from common.mixins.models import CommonModelMixin from common.db.models import JMSBaseModel
__all__ = ['FavoriteAsset'] __all__ = ['FavoriteAsset']
class FavoriteAsset(CommonModelMixin): class FavoriteAsset(JMSBaseModel):
user = models.ForeignKey('users.User', on_delete=models.CASCADE) user = models.ForeignKey('users.User', on_delete=models.CASCADE)
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE) asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE)

View File

@ -1,23 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import uuid
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import JMSOrgBaseModel
__all__ = ['GatheredUser'] __all__ = ['GatheredUser']
class GatheredUser(OrgModelMixin): class GatheredUser(JMSOrgBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_("Asset")) 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')) username = models.CharField(max_length=32, blank=True, db_index=True, verbose_name=_('Username'))
present = models.BooleanField(default=True, verbose_name=_("Present")) present = models.BooleanField(default=True, verbose_name=_("Present"))
date_last_login = models.DateTimeField(null=True, verbose_name=_("Date last login")) 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")) 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 @property
def name(self): def name(self):
@ -33,6 +29,3 @@ class GatheredUser(OrgModelMixin):
def __str__(self): def __str__(self):
return '{}: {}'.format(self.asset.name, self.username) return '{}: {}'.format(self.asset.name, self.username)

View File

@ -20,7 +20,6 @@ class Label(JMSOrgBaseModel):
category = models.CharField(max_length=128, choices=CATEGORY_CHOICES, category = models.CharField(max_length=128, choices=CATEGORY_CHOICES,
default=USER_CATEGORY, verbose_name=_("Category")) default=USER_CATEGORY, verbose_name=_("Category"))
is_active = models.BooleanField(default=True, verbose_name=_("Is active")) is_active = models.BooleanField(default=True, verbose_name=_("Is active"))
comment = models.TextField(blank=True, null=True, verbose_name=_("Comment"))
@classmethod @classmethod
def get_queryset_group_by_name(cls): def get_queryset_group_by_name(cls):

View File

@ -1,29 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import re import re
import time
import uuid
import threading import threading
import os
import time import time
import uuid import uuid
from collections import defaultdict from collections import defaultdict
from django.core.cache import cache
from django.db import models, transaction from django.db import models, transaction
from django.db.models import Q, Manager 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.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.db.models import output_as_string
from common.utils import get_logger from common.utils import get_logger
from orgs.mixins.models import OrgModelMixin, OrgManager from common.utils.lock import DistributedLock
from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org from orgs.mixins.models import OrgManager, JMSOrgBaseModel
from orgs.models import Organization 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'] __all__ = ['Node', 'FamilyMixin', 'compute_parent_key', 'NodeQuerySet']
logger = get_logger(__name__) logger = get_logger(__name__)
@ -545,7 +540,7 @@ class SomeNodesMixin:
return root_nodes return root_nodes
class Node(OrgModelMixin, SomeNodesMixin, FamilyMixin, NodeAssetsMixin): class Node(JMSOrgBaseModel, SomeNodesMixin, FamilyMixin, NodeAssetsMixin):
id = models.UUIDField(default=uuid.uuid4, primary_key=True) id = models.UUIDField(default=uuid.uuid4, primary_key=True)
key = models.CharField(unique=True, max_length=64, verbose_name=_("Key")) # '1:1:1:1' key = models.CharField(unique=True, max_length=64, verbose_name=_("Key")) # '1:1:1:1'
value = models.CharField(max_length=128, verbose_name=_("Value")) value = models.CharField(max_length=128, verbose_name=_("Value"))

View File

@ -19,9 +19,9 @@ class JobAuditLogSerializer(JobExecutionSerializer):
class Meta: class Meta:
model = JobAuditLog model = JobAuditLog
read_only_fields = [ read_only_fields = [
"id", "material", "time_cost", "id", "material", "time_cost", 'date_start',
'date_start', 'date_finished', 'date_created', 'date_finished', 'date_created',
'is_finished', 'is_success', 'creator_by' 'is_finished', 'is_success', 'created_by',
] ]
fields = read_only_fields + [] fields = read_only_fields + []

View File

@ -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'),
),
]

View File

@ -11,10 +11,9 @@ from rest_framework.exceptions import PermissionDenied
from assets.const import Protocol from assets.const import Protocol
from common.db.fields import EncryptCharField from common.db.fields import EncryptCharField
from common.db.models import JMSBaseModel
from common.utils import lazyproperty, pretty_string, bulk_get from common.utils import lazyproperty, pretty_string, bulk_get
from common.utils.timezone import as_current_tz 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 from terminal.models import Applet
@ -22,7 +21,7 @@ def date_expired_default():
return timezone.now() + timedelta(seconds=settings.CONNECTION_TOKEN_EXPIRATION) 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")) value = models.CharField(max_length=64, default='', verbose_name=_("Value"))
user = models.ForeignKey( user = models.ForeignKey(
'users.User', on_delete=models.SET_NULL, null=True, blank=True, 'users.User', on_delete=models.SET_NULL, null=True, blank=True,

View File

@ -72,10 +72,11 @@ class ChoicesMixin:
class BaseCreateUpdateModel(models.Model): class BaseCreateUpdateModel(models.Model):
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by'))
updated_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Updated 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_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')) date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated'))
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
class Meta: class Meta:
abstract = True abstract = True

View File

@ -1,13 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import uuid
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
__all__ = [ __all__ = [
"NoDeleteManager", "NoDeleteModelMixin", "NoDeleteQuerySet", "NoDeleteManager", "NoDeleteModelMixin", "NoDeleteQuerySet",
"CommonModelMixin"
] ]
@ -44,16 +43,6 @@ class NoDeleteModelMixin(models.Model):
return self.save() 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): class DebugQueryManager(models.Manager):
def get_queryset(self): def get_queryset(self):
import traceback import traceback
@ -64,5 +53,3 @@ class DebugQueryManager(models.Manager):
print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<") print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
queryset = super().get_queryset() queryset = super().get_queryset()
return queryset return queryset

View File

@ -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'),
),
]

View File

@ -12,6 +12,7 @@ class UserMsgSubscription(JMSBaseModel):
verbose_name=_('User') verbose_name=_('User')
) )
receive_backends = models.JSONField(default=list, verbose_name=_('receive backend')) receive_backends = models.JSONField(default=list, verbose_name=_('receive backend'))
comment = ''
class Meta: class Meta:
verbose_name = _('User message') verbose_name = _('User message')
@ -25,6 +26,7 @@ class SystemMsgSubscription(JMSBaseModel):
users = models.ManyToManyField('users.User', related_name='system_msg_subscriptions') users = models.ManyToManyField('users.User', related_name='system_msg_subscriptions')
groups = models.ManyToManyField('users.UserGroup', related_name='system_msg_subscriptions') groups = models.ManyToManyField('users.UserGroup', related_name='system_msg_subscriptions')
receive_backends = models.JSONField(default=list) receive_backends = models.JSONField(default=list)
comment = ''
message_type_label = '' message_type_label = ''

View File

@ -6,10 +6,13 @@ __all__ = ('SiteMessageUsers', 'SiteMessage')
class SiteMessageUsers(JMSBaseModel): class SiteMessageUsers(JMSBaseModel):
sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers') sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False,
user = models.ForeignKey('users.User', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers') 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) has_read = models.BooleanField(default=False)
read_at = models.DateTimeField(default=None, null=True) read_at = models.DateTimeField(default=None, null=True)
comment = ''
class SiteMessage(JMSBaseModel): class SiteMessage(JMSBaseModel):
@ -24,6 +27,7 @@ class SiteMessage(JMSBaseModel):
'users.User', db_constraint=False, on_delete=models.DO_NOTHING, null=True, default=None, 'users.User', db_constraint=False, on_delete=models.DO_NOTHING, null=True, default=None,
related_name='send_site_message' related_name='send_site_message'
) )
comment = ''
has_read = False has_read = False
read_at = None read_at = None

View File

@ -1,13 +1,13 @@
# Generated by Django 3.2.14 on 2022-10-09 12:50 # 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.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('assets', '0106_auto_20220916_1556'), ('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_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('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')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('is_periodic', models.BooleanField(default=False)), ('is_periodic', models.BooleanField(default=False)),
('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform')), ('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')), ('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')), ('date_last_run', models.DateTimeField(null=True, verbose_name='Date last run')),
('path', models.FilePathField(max_length=1024, verbose_name='Playbook')), ('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')), ('assets', models.ManyToManyField(to='assets.Asset', verbose_name='Assets')),
], ],
options={ options={
@ -52,10 +53,11 @@ class Migration(migrations.Migration):
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('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')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('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')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('path', models.FilePathField(verbose_name='Path')), ('path', models.FilePathField(verbose_name='Path')),
('comment', models.TextField(blank=True, verbose_name='Comment')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
], ],
options={ options={
'verbose_name': 'Playbook template', '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_start', models.DateTimeField(db_index=True, null=True, verbose_name='Date start')),
('date_finished', models.DateTimeField(null=True, verbose_name='Date finished')), ('date_finished', models.DateTimeField(null=True, verbose_name='Date finished')),
('path', models.FilePathField(max_length=1024, verbose_name='Run dir')), ('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')), ('creator',
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ops.playbook', verbose_name='Task')), 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={ options={
'ordering': ['-date_start'], 'ordering': ['-date_start'],
@ -85,16 +90,19 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='playbook', model_name='playbook',
name='last_execution', 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( migrations.AddField(
model_name='playbook', model_name='playbook',
name='owner', 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( migrations.AddField(
model_name='playbook', model_name='playbook',
name='template', 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'),
), ),
] ]

View File

@ -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'),
),
]

View File

@ -1,13 +1,13 @@
import json import json
import logging
import os import os
import uuid import uuid
import logging
from celery import current_task
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from celery import current_task from django.utils.translation import gettext_lazy as _
__all__ = ["Job", "JobExecution", "JobAuditLog"] __all__ = ["Job", "JobExecution", "JobAuditLog"]
@ -19,7 +19,6 @@ from orgs.mixins.models import JMSOrgBaseModel
class Job(JMSOrgBaseModel, PeriodTaskModelMixin): class Job(JMSOrgBaseModel, PeriodTaskModelMixin):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, null=True, verbose_name=_('Name')) name = models.CharField(max_length=128, null=True, verbose_name=_('Name'))
instant = models.BooleanField(default=False) instant = models.BooleanField(default=False)
args = models.CharField(max_length=1024, default='', verbose_name=_('Args'), null=True, blank=True) args = models.CharField(max_length=1024, default='', verbose_name=_('Args'), null=True, blank=True)

View File

@ -1,12 +1,12 @@
# Generated by Django 2.0.7 on 2018-08-07 03:16 # Generated by Django 2.0.7 on 2018-08-07 03:16
import uuid
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import uuid
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), ('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')), ('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')), ('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)), ('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)), ('users', models.ManyToManyField(blank=True, related_name='orgs', to=settings.AUTH_USER_MODEL)),
], ],

View File

@ -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'),
),
]

View File

@ -1,8 +1,7 @@
import uuid
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.db.models import JMSBaseModel
from common.tree import TreeNode from common.tree import TreeNode
from common.utils import lazyproperty, settings from common.utils import lazyproperty, settings
@ -64,13 +63,9 @@ class OrgRoleMixin:
return self.get_origin_role_members('user') return self.get_origin_role_members('user')
class Organization(OrgRoleMixin, models.Model): class Organization(OrgRoleMixin, JMSBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, unique=True, verbose_name=_("Name")) 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')) 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( members = models.ManyToManyField(
'users.User', related_name='orgs', through='rbac.RoleBinding', through_fields=('org', 'user') 'users.User', related_name='orgs', through='rbac.RoleBinding', through_fields=('org', 'user')
) )

View File

@ -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'),
),
]

View File

@ -3,4 +3,3 @@
from .asset_permission import * from .asset_permission import *
from .perm_node import * from .perm_node import *
from .perm_token import *

View File

@ -1,4 +1,3 @@
import uuid
import logging import logging
from django.db import models from django.db import models
@ -6,16 +5,14 @@ from django.db.models import Q
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from users.models import User
from assets.models import Asset, Account 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.db.models import UnionQuerySet
from common.utils import date_expired_default 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 perms.const import ActionChoices
from .perm_node import PermNode from users.models import User
__all__ = ['AssetPermission', 'ActionChoices'] __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)) return self.get_queryset().filter(Q(date_start__lte=now) | Q(date_expired__gte=now))
class AssetPermission(OrgModelMixin): class AssetPermission(JMSOrgBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
users = models.ManyToManyField( users = models.ManyToManyField(
'users.User', related_name='%(class)ss', blank=True, verbose_name=_("User") 'users.User', related_name='%(class)ss', blank=True, verbose_name=_("User")
@ -76,11 +72,8 @@ class AssetPermission(OrgModelMixin):
date_expired = models.DateTimeField( date_expired = models.DateTimeField(
default=date_expired_default, db_index=True, verbose_name=_('Date expired') 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')) is_active = models.BooleanField(default=True, verbose_name=_('Active'))
from_ticket = models.BooleanField(default=False, verbose_name=_('From ticket')) 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)() objects = AssetPermissionManager.from_queryset(AssetPermissionQuerySet)()
@ -142,11 +135,11 @@ class AssetPermission(OrgModelMixin):
@classmethod @classmethod
def get_all_users_for_perms(cls, perm_ids, flat=False): 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() .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() .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() .values_list('user_id', flat=True).distinct()
user_ids = set(user_ids) | set(group_user_ids) user_ids = set(user_ids) | set(group_user_ids)
if flat: if flat:

View File

@ -1,12 +1,10 @@
from django.utils.translation import ugettext_lazy as _
from django.db import models from django.db import models
from django.db.models import F, TextChoices from django.db.models import F, TextChoices
from django.utils.translation import ugettext_lazy as _
from assets.models import Asset, Node, FamilyMixin, Account from assets.models import Asset, Node, FamilyMixin, Account
from orgs.mixins.models import OrgModelMixin
from common.utils import lazyproperty from common.utils import lazyproperty
from common.db.models import BaseCreateUpdateModel from orgs.mixins.models import JMSOrgBaseModel
class NodeFrom(TextChoices): class NodeFrom(TextChoices):
@ -15,7 +13,7 @@ class NodeFrom(TextChoices):
asset = 'asset', 'Direct asset granted' asset = 'asset', 'Direct asset granted'
class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpdateModel): class UserAssetGrantedTreeNodeRelation(FamilyMixin, JMSOrgBaseModel):
NodeFrom = NodeFrom NodeFrom = NodeFrom
user = models.ForeignKey('users.User', db_constraint=False, on_delete=models.CASCADE) user = models.ForeignKey('users.User', db_constraint=False, on_delete=models.CASCADE)
@ -26,6 +24,7 @@ class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpd
db_index=True) db_index=True)
node_from = models.CharField(choices=NodeFrom.choices, max_length=16, db_index=True) node_from = models.CharField(choices=NodeFrom.choices, max_length=16, db_index=True)
node_assets_amount = models.IntegerField(default=0) node_assets_amount = models.IntegerField(default=0)
comment = ''
@property @property
def key(self): def key(self):

View File

@ -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

View File

@ -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'),
),
]

View File

@ -24,7 +24,7 @@ class Migration(migrations.Migration):
('type', models.CharField(choices=[('null', 'Null'), ('server', 'Server'), ('es', 'Elasticsearch')], ('type', models.CharField(choices=[('null', 'Null'), ('server', 'Server'), ('es', 'Elasticsearch')],
default='server', max_length=16, verbose_name='Type')), default='server', max_length=16, verbose_name='Type')),
('meta', common.db.fields.EncryptJsonDictTextField(default={})), ('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={ options={
'abstract': False, 'abstract': False,
@ -43,7 +43,7 @@ class Migration(migrations.Migration):
('oss', 'OSS'), ('azure', 'Azure')], default='server', max_length=16, ('oss', 'OSS'), ('azure', 'Azure')], default='server', max_length=16,
verbose_name='Type')), verbose_name='Type')),
('meta', common.db.fields.EncryptJsonDictTextField(default={})), ('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={ options={
'abstract': False, 'abstract': False,

View File

@ -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'),
),
]

View File

@ -1,22 +1,23 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import copy import copy
import os import os
from importlib import import_module from importlib import import_module
import jms_storage import jms_storage
from django.conf import settings
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ 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.plugins.es import QuerySet as ESQuerySet
from common.utils import get_logger from common.utils import get_logger
from common.db.fields import EncryptJsonDictTextField
from common.utils.timezone import local_now_date_display from common.utils.timezone import local_now_date_display
from terminal import const
from terminal.backends import TYPE_ENGINE_MAPPING from terminal.backends import TYPE_ENGINE_MAPPING
from .terminal import Terminal from .terminal import Terminal
from ..session.command import Command from ..session.command import Command
from terminal import const
logger = get_logger(__file__) logger = get_logger(__file__)
@ -25,7 +26,6 @@ class CommonStorageModelMixin(models.Model):
name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True)
meta = EncryptJsonDictTextField(default={}) meta = EncryptJsonDictTextField(default={})
is_default = models.BooleanField(default=False, verbose_name=_('Default storage')) is_default = models.BooleanField(default=False, verbose_name=_('Default storage'))
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
class Meta: class Meta:
abstract = True abstract = True
@ -51,7 +51,7 @@ class CommonStorageModelMixin(models.Model):
return objs.first() return objs.first()
class CommandStorage(CommonStorageModelMixin, CommonModelMixin): class CommandStorage(CommonStorageModelMixin, JMSBaseModel):
type = models.CharField( type = models.CharField(
max_length=16, choices=const.CommandStorageType.choices, max_length=16, choices=const.CommandStorageType.choices,
default=const.CommandStorageType.server.value, verbose_name=_('Type'), default=const.CommandStorageType.server.value, verbose_name=_('Type'),
@ -140,7 +140,7 @@ class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
verbose_name = _("Command storage") verbose_name = _("Command storage")
class ReplayStorage(CommonStorageModelMixin, CommonModelMixin): class ReplayStorage(CommonStorageModelMixin, JMSBaseModel):
type = models.CharField( type = models.CharField(
max_length=16, choices=const.ReplayStorageType.choices, max_length=16, choices=const.ReplayStorageType.choices,
default=const.ReplayStorageType.server.value, verbose_name=_('Type') default=const.ReplayStorageType.server.value, verbose_name=_('Type')

View File

@ -1,27 +1,24 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import uuid
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.db.models import JMSBaseModel
from .terminal import Terminal from .terminal import Terminal
class Task(models.Model): class Task(JMSBaseModel):
NAME_CHOICES = ( NAME_CHOICES = (
("kill_session", "Kill Session"), ("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")) name = models.CharField(max_length=128, choices=NAME_CHOICES, verbose_name=_("Name"))
args = models.CharField(max_length=1024, verbose_name=_("Args")) args = models.CharField(max_length=1024, verbose_name=_("Args"))
kwargs = models.JSONField(default=dict, verbose_name=_("Kwargs")) kwargs = models.JSONField(default=dict, verbose_name=_("Kwargs"))
terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL) terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL)
is_finished = models.BooleanField(default=False) is_finished = models.BooleanField(default=False)
date_created = models.DateTimeField(auto_now_add=True)
date_finished = models.DateTimeField(null=True) date_finished = models.DateTimeField(null=True)
class Meta: class Meta:
db_table = "terminal_task" db_table = "terminal_task"
verbose_name = _("Task") verbose_name = _("Task")

View File

@ -1,11 +1,11 @@
import time import time
import uuid
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.const.signals import SKIP_SIGNAL from common.const.signals import SKIP_SIGNAL
from common.db.models import JMSBaseModel
from common.utils import get_logger, lazyproperty from common.utils import get_logger, lazyproperty
from orgs.utils import tmp_to_root_org from orgs.utils import tmp_to_root_org
from terminal.const import TerminalType as TypeChoices from terminal.const import TerminalType as TypeChoices
@ -75,8 +75,7 @@ class StorageMixin:
return {"TERMINAL_REPLAY_STORAGE": config} return {"TERMINAL_REPLAY_STORAGE": config}
class Terminal(StorageMixin, TerminalStatusMixin, models.Model): class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
type = models.CharField( type = models.CharField(
choices=TypeChoices.choices, default=TypeChoices.koko, 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, user = models.OneToOneField(User, related_name='terminal', verbose_name=_('Application User'), null=True,
on_delete=models.CASCADE) on_delete=models.CASCADE)
is_deleted = models.BooleanField(default=False) is_deleted = models.BooleanField(default=False)
date_created = models.DateTimeField(auto_now_add=True)
comment = models.TextField(blank=True, verbose_name=_('Comment'))
@property @property
def is_active(self): def is_active(self):

View File

@ -1,11 +1,11 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.mixins.models import CommonModelMixin from common.db.models import JMSBaseModel
from .session import Session from .session import Session
class SessionReplay(CommonModelMixin): class SessionReplay(JMSBaseModel):
session = models.ForeignKey(Session, on_delete=models.CASCADE, verbose_name=_("Session")) session = models.ForeignKey(Session, on_delete=models.CASCADE, verbose_name=_("Session"))
class Meta: class Meta:
@ -14,5 +14,3 @@ class SessionReplay(CommonModelMixin):
('upload_sessionreplay', _("Can upload session replay")), ('upload_sessionreplay', _("Can upload session replay")),
('download_sessionreplay', _("Can download session replay")), ('download_sessionreplay', _("Can download session replay")),
] ]

View File

@ -1,20 +1,19 @@
import datetime import datetime
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone 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 orgs.utils import tmp_to_root_org
from users.models import User from users.models import User
from common.mixins import CommonModelMixin
from orgs.mixins.models import OrgModelMixin
from .session import Session from .session import Session
__all__ = ['SessionSharing', 'SessionJoinRecord'] __all__ = ['SessionSharing', 'SessionJoinRecord']
class SessionSharing(CommonModelMixin, OrgModelMixin): class SessionSharing(JMSBaseModel, OrgModelMixin):
session = models.ForeignKey( session = models.ForeignKey(
'terminal.Session', on_delete=models.CASCADE, verbose_name=_('Session') '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")) users = models.TextField(blank=True, verbose_name=_("User"))
class Meta: class Meta:
ordering = ('-date_created', ) ordering = ('-date_created',)
verbose_name = _('Session sharing') verbose_name = _('Session sharing')
permissions = [ permissions = [
('add_supersessionsharing', _("Can add super session sharing")) ('add_supersessionsharing', _("Can add super session sharing"))
@ -71,7 +70,7 @@ class SessionSharing(CommonModelMixin, OrgModelMixin):
return True, '' return True, ''
class SessionJoinRecord(CommonModelMixin, OrgModelMixin): class SessionJoinRecord(JMSBaseModel, OrgModelMixin):
LOGIN_FROM = Session.LOGIN_FROM LOGIN_FROM = Session.LOGIN_FROM
session = models.ForeignKey( session = models.ForeignKey(
@ -112,7 +111,7 @@ class SessionJoinRecord(CommonModelMixin, OrgModelMixin):
) )
class Meta: class Meta:
ordering = ('-date_joined', ) ordering = ('-date_joined',)
verbose_name = _("Session join record") verbose_name = _("Session join record")
def __str__(self): def __str__(self):

View File

@ -1,6 +1,7 @@
# Generated by Django 3.2.14 on 2022-08-17 05:46 # Generated by Django 3.2.14 on 2022-08-17 05:46
import time import time
from django.db import migrations, models 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), (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: for model, old_field, new_field, m2m in model_system_user_account:
print("\t - migrate '{}'".format(model.__name__)) print("\t - migrate '{}'".format(model.__name__))
count = 0 count = 0
@ -40,12 +41,11 @@ def migrate_system_to_account(apps, schema_editor):
updated.append(obj) updated.append(obj)
model.objects.bulk_update(updated, [new_field]) model.objects.bulk_update(updated, [new_field])
print(" Migrate account: {}-{} using: {:.2f}s".format( 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('tickets', '0019_delete_applyapplicationticket'), ('tickets', '0019_delete_applyapplicationticket'),
] ]

View File

@ -1,13 +1,12 @@
# Generated by Django 3.2.14 on 2022-12-06 10:20 # Generated by Django 3.2.14 on 2022-12-06 10:20
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('acls', '0010_auto_20221205_1122'), ('acls', '0008_commandgroup_comment'),
('tickets', '0024_auto_20221121_1800'), ('tickets', '0024_auto_20221121_1800'),
] ]
@ -23,6 +22,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='applycommandticket', model_name='applycommandticket',
name='apply_from_cmd_filter_acl', 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'),
), ),
] ]

View File

@ -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'),
),
]

View File

@ -3,12 +3,12 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from common.mixins.models import CommonModelMixin from common.db.models import JMSBaseModel
__all__ = ['Comment'] __all__ = ['Comment']
class Comment(CommonModelMixin): class Comment(JMSBaseModel):
class Type(models.TextChoices): class Type(models.TextChoices):
state = 'state', _('State') state = 'state', _('State')
common = 'common', _('common') common = 'common', _('common')
@ -28,7 +28,7 @@ class Comment(CommonModelMixin):
state = models.CharField(max_length=16, null=True) state = models.CharField(max_length=16, null=True)
class Meta: class Meta:
ordering = ('date_created', ) ordering = ('date_created',)
verbose_name = _("Comment") verbose_name = _("Comment")
def set_display_fields(self): def set_display_fields(self):

View File

@ -3,18 +3,17 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from users.models import User from common.db.models import JMSBaseModel
from common.mixins.models import CommonModelMixin
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import OrgModelMixin
from orgs.models import Organization from orgs.models import Organization
from orgs.utils import tmp_to_org, get_current_org_id from orgs.utils import tmp_to_org, get_current_org_id
from users.models import User
from ..const import TicketType, TicketLevel, TicketApprovalStrategy from ..const import TicketType, TicketLevel, TicketApprovalStrategy
__all__ = ['TicketFlow', 'ApprovalRule'] __all__ = ['TicketFlow', 'ApprovalRule']
class ApprovalRule(CommonModelMixin): class ApprovalRule(JMSBaseModel):
level = models.SmallIntegerField( level = models.SmallIntegerField(
default=TicketLevel.one, choices=TicketLevel.choices, default=TicketLevel.one, choices=TicketLevel.choices,
verbose_name=_('Approve level') verbose_name=_('Approve level')
@ -51,7 +50,7 @@ class ApprovalRule(CommonModelMixin):
return assignees return assignees
class TicketFlow(CommonModelMixin, OrgModelMixin): class TicketFlow(JMSBaseModel, OrgModelMixin):
type = models.CharField( type = models.CharField(
max_length=64, choices=TicketType.choices, max_length=64, choices=TicketType.choices,
default=TicketType.general, verbose_name=_("Type") default=TicketType.general, verbose_name=_("Type")

View File

@ -5,17 +5,17 @@ from typing import Callable
from django.db import models from django.db import models
from django.db.models import Q 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.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 django.utils.translation import ugettext_lazy as _
from orgs.utils import tmp_to_org from common.db.encoder import ModelJSONFieldEncoder
from orgs.models import Organization from common.db.models import JMSBaseModel
from common.exceptions import JMSException from common.exceptions import JMSException
from common.utils.timezone import as_current_tz from common.utils.timezone import as_current_tz
from common.mixins.models import CommonModelMixin from orgs.models import Organization
from common.db.encoder import ModelJSONFieldEncoder from orgs.utils import tmp_to_org
from tickets.const import ( from tickets.const import (
TicketType, TicketStatus, TicketState, TicketType, TicketStatus, TicketState,
TicketLevel, StepState, StepStatus TicketLevel, StepState, StepStatus
@ -25,11 +25,12 @@ from tickets.handlers import get_ticket_handler
from ..flow import TicketFlow from ..flow import TicketFlow
__all__ = [ __all__ = [
'Ticket', 'TicketStep', 'TicketAssignee', 'SuperTicket', 'SubTicketManager' 'Ticket', 'TicketStep', 'TicketAssignee',
'SuperTicket', 'SubTicketManager'
] ]
class TicketStep(CommonModelMixin): class TicketStep(JMSBaseModel):
ticket = models.ForeignKey( ticket = models.ForeignKey(
'Ticket', related_name='ticket_steps', 'Ticket', related_name='ticket_steps',
on_delete=models.CASCADE, verbose_name='Ticket' on_delete=models.CASCADE, verbose_name='Ticket'
@ -74,7 +75,7 @@ class TicketStep(CommonModelMixin):
verbose_name = _("Ticket step") verbose_name = _("Ticket step")
class TicketAssignee(CommonModelMixin): class TicketAssignee(JMSBaseModel):
assignee = models.ForeignKey( assignee = models.ForeignKey(
'users.User', related_name='ticket_assignees', 'users.User', related_name='ticket_assignees',
on_delete=models.CASCADE, verbose_name='Assignee' on_delete=models.CASCADE, verbose_name='Assignee'
@ -267,7 +268,7 @@ class StatusMixin:
return get_ticket_handler(ticket=self) return get_ticket_handler(ticket=self)
class Ticket(StatusMixin, CommonModelMixin): class Ticket(StatusMixin, JMSBaseModel):
title = models.CharField(max_length=256, verbose_name=_('Title')) title = models.CharField(max_length=256, verbose_name=_('Title'))
type = models.CharField( type = models.CharField(
max_length=64, choices=TicketType.choices, max_length=64, choices=TicketType.choices,

View File

@ -2,15 +2,16 @@
# Generated by Django 1.11 on 2017-12-21 16:06 # Generated by Django 1.11 on 2017-12-21 16:06
from __future__ import unicode_literals 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 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): def add_default_group(apps, schema_editor):
group_model = apps.get_model("users", "UserGroup") group_model = apps.get_model("users", "UserGroup")
@ -34,7 +35,6 @@ def add_default_admin(apps, schema_editor):
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -49,13 +49,17 @@ class Migration(migrations.Migration):
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('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')), ('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')), ('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')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('username', models.CharField(max_length=20, unique=True, verbose_name='Username')), ('username', models.CharField(max_length=20, unique=True, verbose_name='Username')),
('name', models.CharField(max_length=20, verbose_name='Name')), ('name', models.CharField(max_length=20, verbose_name='Name')),
('email', models.EmailField(max_length=30, unique=True, verbose_name='Email')), ('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')), ('avatar', models.ImageField(null=True, upload_to='avatar', verbose_name='Avatar')),
('wechat', models.CharField(blank=True, max_length=30, verbose_name='Wechat')), ('wechat', models.CharField(blank=True, max_length=30, verbose_name='Wechat')),
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')), ('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)), ('secret_key_otp', models.CharField(blank=True, max_length=16)),
('_private_key', models.CharField(blank=True, max_length=5000, verbose_name='Private key')), ('_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')), ('_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)), ('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')), ('created_by', models.CharField(default='', max_length=30, verbose_name='Created by')),
], ],
options={ options={
@ -78,9 +83,11 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='AccessKey', name='AccessKey',
fields=[ 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')), ('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( migrations.CreateModel(
@ -88,7 +95,8 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('username', models.CharField(max_length=20, verbose_name='Username')), ('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')), ('ip', models.GenericIPAddressField(verbose_name='Login ip')),
('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')), ('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')), ('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')),
@ -103,7 +111,8 @@ class Migration(migrations.Migration):
fields=[ fields=[
('key', models.CharField(max_length=40, primary_key=True, serialize=False, verbose_name='Key')), ('key', models.CharField(max_length=40, primary_key=True, serialize=False, verbose_name='Key')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('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={ options={
'verbose_name': 'Private Token', 'verbose_name': 'Private Token',
@ -127,12 +136,15 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='user', model_name='user',
name='groups', 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( migrations.AddField(
model_name='user', model_name='user',
name='user_permissions', 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_group),
migrations.RunPython(add_default_admin), migrations.RunPython(add_default_admin),

View File

@ -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'),
),
]

View File

@ -1,22 +1,16 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import uuid
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orgs.mixins.models import OrgModelMixin
from common.utils import lazyproperty from common.utils import lazyproperty
from orgs.mixins.models import JMSOrgBaseModel
__all__ = ['UserGroup'] __all__ = ['UserGroup']
class UserGroup(OrgModelMixin): class UserGroup(JMSOrgBaseModel):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
name = models.CharField(max_length=128, verbose_name=_('Name')) 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): def __str__(self):
return self.name return self.name
@ -27,7 +21,7 @@ class UserGroup(OrgModelMixin):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
unique_together = [('org_id', 'name'),] unique_together = [('org_id', 'name'), ]
verbose_name = _("User group") verbose_name = _("User group")
@classmethod @classmethod