mirror of https://github.com/jumpserver/jumpserver
perf: 修改基础 model,继承同一个
parent
a7815dc9e5
commit
58909ee67d
|
@ -28,6 +28,7 @@ class Migration(migrations.Migration):
|
|||
('type', models.CharField(choices=[('command', 'Command'), ('regex', 'Regex')], default='command',
|
||||
max_length=16, verbose_name='Type')),
|
||||
('content', models.TextField(help_text='One line one command', verbose_name='Content')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('ignore_case', models.BooleanField(default=True, verbose_name='Ignore case')),
|
||||
],
|
||||
options={
|
||||
|
@ -57,7 +58,8 @@ class Migration(migrations.Migration):
|
|||
('assets', models.JSONField(verbose_name='Asset')),
|
||||
('commands', models.ManyToManyField(to='acls.CommandGroup', verbose_name='Commands')),
|
||||
(
|
||||
'reviewers', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')),
|
||||
'reviewers',
|
||||
models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Command acl',
|
||||
|
|
|
@ -1,18 +1,33 @@
|
|||
# Generated by Django 3.2.14 on 2022-12-02 04:25
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('acls', '0007_auto_20221202_1048'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='commandgroup',
|
||||
name='comment',
|
||||
field=models.TextField(blank=True, verbose_name='Comment'),
|
||||
migrations.AlterModelOptions(
|
||||
name='commandgroup',
|
||||
options={'verbose_name': 'Command group'},
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='commandfilteracl',
|
||||
old_name='commands',
|
||||
new_name='command_groups',
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='commandfilteracl',
|
||||
options={'ordering': ('priority', 'name'), 'verbose_name': 'Command acl'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='loginacl',
|
||||
options={'ordering': ('priority', 'name'), 'verbose_name': 'Login acl'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='loginassetacl',
|
||||
options={'ordering': ('priority', 'name'), 'verbose_name': 'Login asset acl'},
|
||||
),
|
||||
]
|
||||
|
|
|
@ -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',
|
||||
),
|
||||
]
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -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'},
|
||||
),
|
||||
]
|
|
@ -3,7 +3,7 @@ from django.db import models
|
|||
from django.db.models import Q
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.mixins import CommonModelMixin
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.utils import contains_ip
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
|
||||
|
@ -58,7 +58,7 @@ class UserAssetAccountACLQuerySet(BaseACLQuerySet):
|
|||
|
||||
def filter_account(self, username):
|
||||
q = Q(accounts__username_group__contains=username) | \
|
||||
Q(accounts__username_group__contains='*')
|
||||
Q(accounts__username_group__contains='*')
|
||||
return self.filter(q)
|
||||
|
||||
|
||||
|
@ -67,7 +67,7 @@ class ACLManager(models.Manager):
|
|||
return self.get_queryset().valid()
|
||||
|
||||
|
||||
class BaseACL(CommonModelMixin):
|
||||
class BaseACL(JMSBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
priority = models.IntegerField(
|
||||
default=50, verbose_name=_("Priority"),
|
||||
|
@ -77,7 +77,6 @@ class BaseACL(CommonModelMixin):
|
|||
action = models.CharField(max_length=64, default=ActionChoices.reject, verbose_name=_('Action'))
|
||||
reviewers = models.ManyToManyField('users.User', blank=True, verbose_name=_("Reviewers"))
|
||||
is_active = models.BooleanField(default=True, verbose_name=_("Active"))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
ActionChoices = ActionChoices
|
||||
objects = ACLManager.from_queryset(BaseACLQuerySet)()
|
||||
|
|
|
@ -7,7 +7,6 @@ from django.utils.translation import ugettext_lazy as _
|
|||
|
||||
from common.utils import lazyproperty, get_logger
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
|
||||
from .base import UserAssetAccountBaseACL
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
@ -26,7 +25,6 @@ class CommandGroup(JMSOrgBaseModel):
|
|||
)
|
||||
content = models.TextField(verbose_name=_("Content"), help_text=_("One line one command"))
|
||||
ignore_case = models.BooleanField(default=True, verbose_name=_('Ignore case'))
|
||||
comment = models.TextField(blank=True, verbose_name=_("Comment"))
|
||||
|
||||
TypeChoices = TypeChoices
|
||||
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
# Generated by Django 3.1.12 on 2021-08-26 09:07
|
||||
|
||||
import assets.models.base
|
||||
import common.db.fields
|
||||
from django.conf import settings
|
||||
import uuid
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import simple_history.models
|
||||
import uuid
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
import common.db.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('assets', '0076_delete_assetuser'),
|
||||
|
@ -22,14 +22,19 @@ class Migration(migrations.Migration):
|
|||
migrations.CreateModel(
|
||||
name='HistoricalAccount',
|
||||
fields=[
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('id', models.UUIDField(db_index=True, default=uuid.uuid4)),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], verbose_name='Username')),
|
||||
('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')),
|
||||
('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[
|
||||
django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')],
|
||||
verbose_name='Username')),
|
||||
('password',
|
||||
common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')),
|
||||
('private_key',
|
||||
common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')),
|
||||
('public_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH public key')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('date_created', models.DateTimeField(blank=True, editable=False, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(blank=True, editable=False, verbose_name='Date updated')),
|
||||
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
|
||||
|
@ -37,10 +42,17 @@ class Migration(migrations.Migration):
|
|||
('history_id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('history_date', models.DateTimeField()),
|
||||
('history_change_reason', models.CharField(max_length=100, null=True)),
|
||||
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('app', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='applications.application', verbose_name='Database')),
|
||||
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||||
('systemuser', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='assets.systemuser', verbose_name='System user')),
|
||||
('history_type',
|
||||
models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('app', models.ForeignKey(blank=True, db_constraint=False, null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING, related_name='+',
|
||||
to='applications.application', verbose_name='Database')),
|
||||
('history_user',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+',
|
||||
to=settings.AUTH_USER_MODEL)),
|
||||
('systemuser', models.ForeignKey(blank=True, db_constraint=False, null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING, related_name='+',
|
||||
to='assets.systemuser', verbose_name='System user')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'historical Account',
|
||||
|
@ -52,20 +64,28 @@ class Migration(migrations.Migration):
|
|||
migrations.CreateModel(
|
||||
name='Account',
|
||||
fields=[
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')], verbose_name='Username')),
|
||||
('password', common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')),
|
||||
('private_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, validators=[
|
||||
django.core.validators.RegexValidator('^[0-9a-zA-Z_@\\-\\.]*$', 'Special char not allowed')],
|
||||
verbose_name='Username')),
|
||||
('password',
|
||||
common.db.fields.EncryptCharField(blank=True, max_length=256, null=True, verbose_name='Password')),
|
||||
('private_key',
|
||||
common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH private key')),
|
||||
('public_key', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='SSH public key')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
|
||||
('version', models.IntegerField(default=1, verbose_name='Version')),
|
||||
('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='applications.application', verbose_name='Database')),
|
||||
('systemuser', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser', verbose_name='System user')),
|
||||
('app', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
|
||||
to='applications.application', verbose_name='Database')),
|
||||
('systemuser',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser',
|
||||
verbose_name='System user')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Account',
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -1,12 +1,11 @@
|
|||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from common.mixins import CommonModelMixin
|
||||
|
||||
|
||||
class Application(CommonModelMixin, OrgModelMixin):
|
||||
class Application(JMSBaseModel, OrgModelMixin):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
category = models.CharField(
|
||||
max_length=16, verbose_name=_('Category')
|
||||
|
@ -15,9 +14,6 @@ class Application(CommonModelMixin, OrgModelMixin):
|
|||
max_length=16, verbose_name=_('Type')
|
||||
)
|
||||
attrs = models.JSONField(default=dict, verbose_name=_('Attrs'))
|
||||
comment = models.TextField(
|
||||
max_length=128, default='', blank=True, verbose_name=_('Comment')
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Application')
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
# Generated by Django 3.2.12 on 2022-07-11 08:59
|
||||
|
||||
import common.db.fields
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import uuid
|
||||
|
||||
import django.db.models.deletion
|
||||
import simple_history.models
|
||||
import uuid
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
import common.db.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('assets', '0098_auto_20220430_2126'),
|
||||
|
@ -20,14 +21,19 @@ class Migration(migrations.Migration):
|
|||
name='HistoricalAccount',
|
||||
fields=[
|
||||
('id', models.UUIDField(db_index=True, default=uuid.uuid4)),
|
||||
('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')),
|
||||
('secret_type', models.CharField(
|
||||
choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'),
|
||||
('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')),
|
||||
('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')),
|
||||
('version', models.IntegerField(default=0, verbose_name='Version'),),
|
||||
('history_id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('history_date', models.DateTimeField(db_index=True)),
|
||||
('history_change_reason', models.CharField(max_length=100, null=True)),
|
||||
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||||
('history_type',
|
||||
models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('history_user',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+',
|
||||
to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'historical Account',
|
||||
|
@ -40,43 +46,55 @@ class Migration(migrations.Migration):
|
|||
migrations.CreateModel(
|
||||
name='Account',
|
||||
fields=[
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')),
|
||||
('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')),
|
||||
('secret_type', models.CharField(
|
||||
choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'),
|
||||
('token', 'Token')], default='password', max_length=16, verbose_name='Secret type')),
|
||||
('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('connectivity', models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')], default='unknown', max_length=16, verbose_name='Connectivity')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('connectivity', models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')],
|
||||
default='unknown', max_length=16, verbose_name='Connectivity')),
|
||||
('date_verified', models.DateTimeField(null=True, verbose_name='Date verified')),
|
||||
('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
|
||||
('privileged', models.BooleanField(default=False, verbose_name='Privileged')),
|
||||
('version', models.IntegerField(default=0, verbose_name='Version')),
|
||||
('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='accounts', to='assets.asset', verbose_name='Asset')),
|
||||
('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='accounts',
|
||||
to='assets.asset', verbose_name='Asset')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Account',
|
||||
'permissions': [('view_accountsecret', 'Can view asset account secret'), ('change_accountsecret', 'Can change asset account secret'), ('view_historyaccount', 'Can view asset history account'), ('view_historyaccountsecret', 'Can view asset history account secret')],
|
||||
'permissions': [('view_accountsecret', 'Can view asset account secret'),
|
||||
('change_accountsecret', 'Can change asset account secret'),
|
||||
('view_historyaccount', 'Can view asset history account'),
|
||||
('view_historyaccountsecret', 'Can view asset history account secret')],
|
||||
'unique_together': {('name', 'asset'), ('username', 'asset', 'secret_type')},
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='account',
|
||||
name='su_from',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='su_to', to='assets.account', verbose_name='Su from'),
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='su_to',
|
||||
to='assets.account', verbose_name='Su from'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='AccountTemplate',
|
||||
fields=[
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('username', models.CharField(blank=True, db_index=True, max_length=128, verbose_name='Username')),
|
||||
('secret_type', models.CharField(choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'), ('token', 'Token')], default='password', max_length=16, verbose_name='Secret type'),),
|
||||
('secret_type', models.CharField(
|
||||
choices=[('password', 'Password'), ('ssh_key', 'SSH key'), ('access_key', 'Access key'),
|
||||
('token', 'Token')], default='password', max_length=16, verbose_name='Secret type'),),
|
||||
('secret', common.db.fields.EncryptTextField(blank=True, null=True, verbose_name='Secret')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||
('created_by', models.CharField(max_length=128, null=True, verbose_name='Created by')),
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -2,18 +2,17 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
import uuid
|
||||
import logging
|
||||
import uuid
|
||||
from collections import defaultdict
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils import lazyproperty
|
||||
from orgs.mixins.models import OrgManager, JMSOrgBaseModel
|
||||
from ..platform import Platform
|
||||
from ..base import AbsConnectivity
|
||||
from ..platform import Platform
|
||||
|
||||
__all__ = ['Asset', 'AssetQuerySet', 'default_node', 'Protocol']
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -110,7 +109,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
|
|||
verbose_name=_("Nodes"))
|
||||
is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
|
||||
labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels"))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
info = models.JSONField(verbose_name='Info', default=dict, blank=True)
|
||||
|
||||
objects = AssetManager.from_queryset(AssetQuerySet)()
|
||||
|
|
|
@ -1,25 +1,24 @@
|
|||
import uuid
|
||||
|
||||
from celery import current_task
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.const.choices import Trigger
|
||||
from common.mixins.models import CommonModelMixin
|
||||
from common.db.fields import EncryptJsonDictTextField
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from ops.mixin import PeriodTaskModelMixin
|
||||
from assets.const import AutomationTypes
|
||||
from assets.models import Node, Asset
|
||||
from assets.tasks import execute_automation
|
||||
from assets.const import AutomationTypes
|
||||
from common.const.choices import Trigger
|
||||
from common.db.fields import EncryptJsonDictTextField
|
||||
from ops.mixin import PeriodTaskModelMixin
|
||||
from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel
|
||||
|
||||
|
||||
class BaseAutomation(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin):
|
||||
class BaseAutomation(PeriodTaskModelMixin, JMSOrgBaseModel):
|
||||
accounts = models.JSONField(default=list, verbose_name=_("Accounts"))
|
||||
nodes = models.ManyToManyField('assets.Node', blank=True, verbose_name=_("Nodes"))
|
||||
assets = models.ManyToManyField('assets.Asset', blank=True, verbose_name=_("Assets"))
|
||||
type = models.CharField(max_length=16, choices=AutomationTypes.choices, verbose_name=_('Type'))
|
||||
is_active = models.BooleanField(default=True, verbose_name=_("Is active"))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __str__(self):
|
||||
return self.name + '@' + str(self.created_by)
|
||||
|
|
|
@ -7,26 +7,23 @@ from celery import current_task
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from ops.mixin import PeriodTaskModelMixin
|
||||
from common.utils import get_logger
|
||||
from common.const.choices import Trigger
|
||||
from common.db.encoder import ModelJSONFieldEncoder
|
||||
from common.mixins.models import CommonModelMixin
|
||||
from common.utils import get_logger
|
||||
from ops.mixin import PeriodTaskModelMixin
|
||||
from orgs.mixins.models import OrgModelMixin, JMSOrgBaseModel
|
||||
|
||||
__all__ = ['AccountBackupPlan', 'AccountBackupPlanExecution']
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class AccountBackupPlan(CommonModelMixin, PeriodTaskModelMixin, OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class AccountBackupPlan(PeriodTaskModelMixin, JMSOrgBaseModel):
|
||||
types = models.JSONField(default=list)
|
||||
recipients = models.ManyToManyField(
|
||||
'users.User', related_name='recipient_escape_route_plans', blank=True,
|
||||
verbose_name=_("Recipient")
|
||||
)
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.name}({self.org_id})'
|
||||
|
|
|
@ -69,8 +69,6 @@ class BaseAccount(JMSOrgBaseModel):
|
|||
secret = fields.EncryptTextField(blank=True, null=True, verbose_name=_('Secret'))
|
||||
privileged = models.BooleanField(verbose_name=_("Privileged"), default=False)
|
||||
is_active = models.BooleanField(default=True, verbose_name=_("Is active"))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by'))
|
||||
|
||||
objects = BaseAccountManager.from_queryset(BaseAccountQuerySet)()
|
||||
|
||||
|
|
|
@ -7,11 +7,6 @@ from django.db import models
|
|||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils import get_logger
|
||||
from users.models import User, UserGroup
|
||||
from applications.models import Application
|
||||
from ..models import SystemUser, Asset, Node
|
||||
|
||||
from common.utils import lazyproperty, get_logger, get_object_or_none
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
import uuid
|
||||
import random
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils import get_logger, lazyproperty
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
from .gateway import Gateway
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
@ -16,11 +14,8 @@ logger = get_logger(__file__)
|
|||
__all__ = ['Domain']
|
||||
|
||||
|
||||
class Domain(OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class Domain(JMSOrgBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, null=True, verbose_name=_('Date created'))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Domain")
|
||||
|
@ -51,5 +46,3 @@ class Domain(OrgModelMixin):
|
|||
@classmethod
|
||||
def get_gateway_queryset(cls):
|
||||
return Gateway.objects.all()
|
||||
|
||||
|
||||
|
|
|
@ -2,13 +2,12 @@
|
|||
#
|
||||
from django.db import models
|
||||
|
||||
from common.mixins.models import CommonModelMixin
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
|
||||
__all__ = ['FavoriteAsset']
|
||||
|
||||
|
||||
class FavoriteAsset(CommonModelMixin):
|
||||
class FavoriteAsset(JMSBaseModel):
|
||||
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
|
||||
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE)
|
||||
|
||||
|
|
|
@ -1,23 +1,19 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
import uuid
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
|
||||
__all__ = ['GatheredUser']
|
||||
|
||||
|
||||
class GatheredUser(OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class GatheredUser(JMSOrgBaseModel):
|
||||
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_("Asset"))
|
||||
username = models.CharField(max_length=32, blank=True, db_index=True, verbose_name=_('Username'))
|
||||
present = models.BooleanField(default=True, verbose_name=_("Present"))
|
||||
date_last_login = models.DateTimeField(null=True, verbose_name=_("Date last login"))
|
||||
ip_last_login = models.CharField(max_length=39, default='', verbose_name=_("IP last login"))
|
||||
date_created = models.DateTimeField(auto_now_add=True, verbose_name=_("Date created"))
|
||||
date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated"))
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -33,6 +29,3 @@ class GatheredUser(OrgModelMixin):
|
|||
|
||||
def __str__(self):
|
||||
return '{}: {}'.format(self.asset.name, self.username)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ class Label(JMSOrgBaseModel):
|
|||
category = models.CharField(max_length=128, choices=CATEGORY_CHOICES,
|
||||
default=USER_CATEGORY, verbose_name=_("Category"))
|
||||
is_active = models.BooleanField(default=True, verbose_name=_("Is active"))
|
||||
comment = models.TextField(blank=True, null=True, verbose_name=_("Comment"))
|
||||
|
||||
@classmethod
|
||||
def get_queryset_group_by_name(cls):
|
||||
|
|
|
@ -1,29 +1,24 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
import re
|
||||
import time
|
||||
import uuid
|
||||
import threading
|
||||
import os
|
||||
import time
|
||||
import uuid
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.db import models, transaction
|
||||
from django.db.models import Q, Manager
|
||||
from django.db.utils import IntegrityError
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.translation import ugettext
|
||||
from django.db.transaction import atomic
|
||||
from django.core.cache import cache
|
||||
from django.utils.translation import ugettext
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils.lock import DistributedLock
|
||||
from common.utils.common import timeit
|
||||
from common.db.models import output_as_string
|
||||
from common.utils import get_logger
|
||||
from orgs.mixins.models import OrgModelMixin, OrgManager
|
||||
from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org
|
||||
from common.utils.lock import DistributedLock
|
||||
from orgs.mixins.models import OrgManager, JMSOrgBaseModel
|
||||
from orgs.models import Organization
|
||||
from orgs.utils import get_current_org, tmp_to_org, tmp_to_root_org
|
||||
|
||||
__all__ = ['Node', 'FamilyMixin', 'compute_parent_key', 'NodeQuerySet']
|
||||
logger = get_logger(__name__)
|
||||
|
@ -545,7 +540,7 @@ class SomeNodesMixin:
|
|||
return root_nodes
|
||||
|
||||
|
||||
class Node(OrgModelMixin, SomeNodesMixin, FamilyMixin, NodeAssetsMixin):
|
||||
class Node(JMSOrgBaseModel, SomeNodesMixin, FamilyMixin, NodeAssetsMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
key = models.CharField(unique=True, max_length=64, verbose_name=_("Key")) # '1:1:1:1'
|
||||
value = models.CharField(max_length=128, verbose_name=_("Value"))
|
||||
|
|
|
@ -19,9 +19,9 @@ class JobAuditLogSerializer(JobExecutionSerializer):
|
|||
class Meta:
|
||||
model = JobAuditLog
|
||||
read_only_fields = [
|
||||
"id", "material", "time_cost",
|
||||
'date_start', 'date_finished', 'date_created',
|
||||
'is_finished', 'is_success', 'creator_by'
|
||||
"id", "material", "time_cost", 'date_start',
|
||||
'date_finished', 'date_created',
|
||||
'is_finished', 'is_success', 'created_by',
|
||||
]
|
||||
fields = read_only_fields + []
|
||||
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -11,10 +11,9 @@ from rest_framework.exceptions import PermissionDenied
|
|||
|
||||
from assets.const import Protocol
|
||||
from common.db.fields import EncryptCharField
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.utils import lazyproperty, pretty_string, bulk_get
|
||||
from common.utils.timezone import as_current_tz
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
from terminal.models import Applet
|
||||
|
||||
|
||||
|
@ -22,7 +21,7 @@ def date_expired_default():
|
|||
return timezone.now() + timedelta(seconds=settings.CONNECTION_TOKEN_EXPIRATION)
|
||||
|
||||
|
||||
class ConnectionToken(OrgModelMixin, JMSBaseModel):
|
||||
class ConnectionToken(JMSOrgBaseModel):
|
||||
value = models.CharField(max_length=64, default='', verbose_name=_("Value"))
|
||||
user = models.ForeignKey(
|
||||
'users.User', on_delete=models.SET_NULL, null=True, blank=True,
|
||||
|
|
|
@ -72,10 +72,11 @@ class ChoicesMixin:
|
|||
|
||||
|
||||
class BaseCreateUpdateModel(models.Model):
|
||||
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
||||
updated_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Updated by'))
|
||||
created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by'))
|
||||
updated_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Updated by'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created'))
|
||||
date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated'))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
__all__ = [
|
||||
"NoDeleteManager", "NoDeleteModelMixin", "NoDeleteQuerySet",
|
||||
"CommonModelMixin"
|
||||
]
|
||||
|
||||
|
||||
|
@ -44,16 +43,6 @@ class NoDeleteModelMixin(models.Model):
|
|||
return self.save()
|
||||
|
||||
|
||||
class CommonModelMixin(models.Model):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created'))
|
||||
date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated'))
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
||||
class DebugQueryManager(models.Manager):
|
||||
def get_queryset(self):
|
||||
import traceback
|
||||
|
@ -64,5 +53,3 @@ class DebugQueryManager(models.Manager):
|
|||
print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
|
||||
queryset = super().get_queryset()
|
||||
return queryset
|
||||
|
||||
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -12,6 +12,7 @@ class UserMsgSubscription(JMSBaseModel):
|
|||
verbose_name=_('User')
|
||||
)
|
||||
receive_backends = models.JSONField(default=list, verbose_name=_('receive backend'))
|
||||
comment = ''
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('User message')
|
||||
|
@ -25,6 +26,7 @@ class SystemMsgSubscription(JMSBaseModel):
|
|||
users = models.ManyToManyField('users.User', related_name='system_msg_subscriptions')
|
||||
groups = models.ManyToManyField('users.UserGroup', related_name='system_msg_subscriptions')
|
||||
receive_backends = models.JSONField(default=list)
|
||||
comment = ''
|
||||
|
||||
message_type_label = ''
|
||||
|
||||
|
|
|
@ -6,10 +6,13 @@ __all__ = ('SiteMessageUsers', 'SiteMessage')
|
|||
|
||||
|
||||
class SiteMessageUsers(JMSBaseModel):
|
||||
sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers')
|
||||
user = models.ForeignKey('users.User', on_delete=models.CASCADE, db_constraint=False, related_name='m2m_sitemessageusers')
|
||||
sitemessage = models.ForeignKey('notifications.SiteMessage', on_delete=models.CASCADE, db_constraint=False,
|
||||
related_name='m2m_sitemessageusers')
|
||||
user = models.ForeignKey('users.User', on_delete=models.CASCADE, db_constraint=False,
|
||||
related_name='m2m_sitemessageusers')
|
||||
has_read = models.BooleanField(default=False)
|
||||
read_at = models.DateTimeField(default=None, null=True)
|
||||
comment = ''
|
||||
|
||||
|
||||
class SiteMessage(JMSBaseModel):
|
||||
|
@ -24,6 +27,7 @@ class SiteMessage(JMSBaseModel):
|
|||
'users.User', db_constraint=False, on_delete=models.DO_NOTHING, null=True, default=None,
|
||||
related_name='send_site_message'
|
||||
)
|
||||
comment = ''
|
||||
|
||||
has_read = False
|
||||
read_at = None
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
# Generated by Django 3.2.14 on 2022-10-09 12:50
|
||||
|
||||
import uuid
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('assets', '0106_auto_20220916_1556'),
|
||||
|
@ -23,7 +23,8 @@ class Migration(migrations.Migration):
|
|||
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('is_periodic', models.BooleanField(default=False)),
|
||||
('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Cycle perform')),
|
||||
|
@ -32,7 +33,7 @@ class Migration(migrations.Migration):
|
|||
('account_policy', models.CharField(default='root', max_length=128, verbose_name='Account policy')),
|
||||
('date_last_run', models.DateTimeField(null=True, verbose_name='Date last run')),
|
||||
('path', models.FilePathField(max_length=1024, verbose_name='Playbook')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('assets', models.ManyToManyField(to='assets.Asset', verbose_name='Assets')),
|
||||
],
|
||||
options={
|
||||
|
@ -52,10 +53,11 @@ class Migration(migrations.Migration):
|
|||
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
|
||||
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('org_id',
|
||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||
('name', models.CharField(max_length=128, verbose_name='Name')),
|
||||
('path', models.FilePathField(verbose_name='Path')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Playbook template',
|
||||
|
@ -74,8 +76,11 @@ class Migration(migrations.Migration):
|
|||
('date_start', models.DateTimeField(db_index=True, null=True, verbose_name='Date start')),
|
||||
('date_finished', models.DateTimeField(null=True, verbose_name='Date finished')),
|
||||
('path', models.FilePathField(max_length=1024, verbose_name='Run dir')),
|
||||
('creator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Creator')),
|
||||
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ops.playbook', verbose_name='Task')),
|
||||
('creator',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL,
|
||||
verbose_name='Creator')),
|
||||
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ops.playbook',
|
||||
verbose_name='Task')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-date_start'],
|
||||
|
@ -85,16 +90,19 @@ class Migration(migrations.Migration):
|
|||
migrations.AddField(
|
||||
model_name='playbook',
|
||||
name='last_execution',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbookexecution', verbose_name='Last execution'),
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
|
||||
to='ops.playbookexecution', verbose_name='Last execution'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='playbook',
|
||||
name='owner',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Owner'),
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL,
|
||||
to=settings.AUTH_USER_MODEL, verbose_name='Owner'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='playbook',
|
||||
name='template',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbooktemplate', verbose_name='Template'),
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='ops.playbooktemplate',
|
||||
verbose_name='Template'),
|
||||
),
|
||||
]
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -1,13 +1,13 @@
|
|||
import json
|
||||
import logging
|
||||
import os
|
||||
import uuid
|
||||
import logging
|
||||
|
||||
from celery import current_task
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils import timezone
|
||||
from celery import current_task
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
__all__ = ["Job", "JobExecution", "JobAuditLog"]
|
||||
|
||||
|
@ -19,7 +19,6 @@ from orgs.mixins.models import JMSOrgBaseModel
|
|||
|
||||
|
||||
class Job(JMSOrgBaseModel, PeriodTaskModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
name = models.CharField(max_length=128, null=True, verbose_name=_('Name'))
|
||||
instant = models.BooleanField(default=False)
|
||||
args = models.CharField(max_length=1024, default='', verbose_name=_('Args'), null=True, blank=True)
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
# Generated by Django 2.0.7 on 2018-08-07 03:16
|
||||
|
||||
import uuid
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import uuid
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
|
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
|
|||
('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
|
||||
('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
|
||||
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
|
||||
('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
('admins', models.ManyToManyField(blank=True, related_name='admin_orgs', to=settings.AUTH_USER_MODEL)),
|
||||
('users', models.ManyToManyField(blank=True, related_name='orgs', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -1,8 +1,7 @@
|
|||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.tree import TreeNode
|
||||
from common.utils import lazyproperty, settings
|
||||
|
||||
|
@ -64,13 +63,9 @@ class OrgRoleMixin:
|
|||
return self.get_origin_role_members('user')
|
||||
|
||||
|
||||
class Organization(OrgRoleMixin, models.Model):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class Organization(OrgRoleMixin, JMSBaseModel):
|
||||
name = models.CharField(max_length=128, unique=True, verbose_name=_("Name"))
|
||||
created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by'))
|
||||
builtin = models.BooleanField(default=False, verbose_name=_('Builtin'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created'))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
members = models.ManyToManyField(
|
||||
'users.User', related_name='orgs', through='rbac.RoleBinding', through_fields=('org', 'user')
|
||||
)
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -3,4 +3,3 @@
|
|||
|
||||
from .asset_permission import *
|
||||
from .perm_node import *
|
||||
from .perm_token import *
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import uuid
|
||||
import logging
|
||||
|
||||
from django.db import models
|
||||
|
@ -6,16 +5,14 @@ from django.db.models import Q
|
|||
from django.utils import timezone
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from users.models import User
|
||||
from assets.models import Asset, Account
|
||||
from orgs.mixins.models import OrgManager
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from common.utils.timezone import local_now
|
||||
from common.db.models import UnionQuerySet
|
||||
from common.utils import date_expired_default
|
||||
|
||||
from common.utils.timezone import local_now
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
from orgs.mixins.models import OrgManager
|
||||
from perms.const import ActionChoices
|
||||
from .perm_node import PermNode
|
||||
from users.models import User
|
||||
|
||||
__all__ = ['AssetPermission', 'ActionChoices']
|
||||
|
||||
|
@ -54,8 +51,7 @@ class AssetPermissionManager(OrgManager):
|
|||
return self.get_queryset().filter(Q(date_start__lte=now) | Q(date_expired__gte=now))
|
||||
|
||||
|
||||
class AssetPermission(OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class AssetPermission(JMSOrgBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
users = models.ManyToManyField(
|
||||
'users.User', related_name='%(class)ss', blank=True, verbose_name=_("User")
|
||||
|
@ -76,11 +72,8 @@ class AssetPermission(OrgModelMixin):
|
|||
date_expired = models.DateTimeField(
|
||||
default=date_expired_default, db_index=True, verbose_name=_('Date expired')
|
||||
)
|
||||
comment = models.TextField(verbose_name=_('Comment'), blank=True)
|
||||
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
|
||||
from_ticket = models.BooleanField(default=False, verbose_name=_('From ticket'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, verbose_name=_('Date created'))
|
||||
created_by = models.CharField(max_length=128, blank=True, verbose_name=_('Created by'))
|
||||
|
||||
objects = AssetPermissionManager.from_queryset(AssetPermissionQuerySet)()
|
||||
|
||||
|
@ -142,11 +135,11 @@ class AssetPermission(OrgModelMixin):
|
|||
|
||||
@classmethod
|
||||
def get_all_users_for_perms(cls, perm_ids, flat=False):
|
||||
user_ids = cls.users.through.objects.filter(assetpermission_id__in=perm_ids)\
|
||||
user_ids = cls.users.through.objects.filter(assetpermission_id__in=perm_ids) \
|
||||
.values_list('user_id', flat=True).distinct()
|
||||
group_ids = cls.user_groups.through.objects.filter(assetpermission_id__in=perm_ids)\
|
||||
group_ids = cls.user_groups.through.objects.filter(assetpermission_id__in=perm_ids) \
|
||||
.values_list('usergroup_id', flat=True).distinct()
|
||||
group_user_ids = User.groups.through.objects.filter(usergroup_id__in=group_ids)\
|
||||
group_user_ids = User.groups.through.objects.filter(usergroup_id__in=group_ids) \
|
||||
.values_list('user_id', flat=True).distinct()
|
||||
user_ids = set(user_ids) | set(group_user_ids)
|
||||
if flat:
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.db import models
|
||||
from django.db.models import F, TextChoices
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from assets.models import Asset, Node, FamilyMixin, Account
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from common.utils import lazyproperty
|
||||
from common.db.models import BaseCreateUpdateModel
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
|
||||
|
||||
class NodeFrom(TextChoices):
|
||||
|
@ -15,7 +13,7 @@ class NodeFrom(TextChoices):
|
|||
asset = 'asset', 'Direct asset granted'
|
||||
|
||||
|
||||
class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpdateModel):
|
||||
class UserAssetGrantedTreeNodeRelation(FamilyMixin, JMSOrgBaseModel):
|
||||
NodeFrom = NodeFrom
|
||||
|
||||
user = models.ForeignKey('users.User', db_constraint=False, on_delete=models.CASCADE)
|
||||
|
@ -26,6 +24,7 @@ class UserAssetGrantedTreeNodeRelation(OrgModelMixin, FamilyMixin, BaseCreateUpd
|
|||
db_index=True)
|
||||
node_from = models.CharField(choices=NodeFrom.choices, max_length=16, db_index=True)
|
||||
node_assets_amount = models.IntegerField(default=0)
|
||||
comment = ''
|
||||
|
||||
@property
|
||||
def key(self):
|
||||
|
|
|
@ -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
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -24,7 +24,7 @@ class Migration(migrations.Migration):
|
|||
('type', models.CharField(choices=[('null', 'Null'), ('server', 'Server'), ('es', 'Elasticsearch')],
|
||||
default='server', max_length=16, verbose_name='Type')),
|
||||
('meta', common.db.fields.EncryptJsonDictTextField(default={})),
|
||||
('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
|
@ -43,7 +43,7 @@ class Migration(migrations.Migration):
|
|||
('oss', 'OSS'), ('azure', 'Azure')], default='server', max_length=16,
|
||||
verbose_name='Type')),
|
||||
('meta', common.db.fields.EncryptJsonDictTextField(default={})),
|
||||
('comment', models.TextField(blank=True, default='', max_length=128, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -1,22 +1,23 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import copy
|
||||
import os
|
||||
from importlib import import_module
|
||||
|
||||
import jms_storage
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.conf import settings
|
||||
|
||||
from common.mixins import CommonModelMixin
|
||||
from common.db.fields import EncryptJsonDictTextField
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.plugins.es import QuerySet as ESQuerySet
|
||||
from common.utils import get_logger
|
||||
from common.db.fields import EncryptJsonDictTextField
|
||||
from common.utils.timezone import local_now_date_display
|
||||
from terminal import const
|
||||
from terminal.backends import TYPE_ENGINE_MAPPING
|
||||
from .terminal import Terminal
|
||||
from ..session.command import Command
|
||||
from terminal import const
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
@ -25,7 +26,6 @@ class CommonStorageModelMixin(models.Model):
|
|||
name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True)
|
||||
meta = EncryptJsonDictTextField(default={})
|
||||
is_default = models.BooleanField(default=False, verbose_name=_('Default storage'))
|
||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
@ -51,7 +51,7 @@ class CommonStorageModelMixin(models.Model):
|
|||
return objs.first()
|
||||
|
||||
|
||||
class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
class CommandStorage(CommonStorageModelMixin, JMSBaseModel):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.CommandStorageType.choices,
|
||||
default=const.CommandStorageType.server.value, verbose_name=_('Type'),
|
||||
|
@ -140,7 +140,7 @@ class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
|
|||
verbose_name = _("Command storage")
|
||||
|
||||
|
||||
class ReplayStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
class ReplayStorage(CommonStorageModelMixin, JMSBaseModel):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.ReplayStorageType.choices,
|
||||
default=const.ReplayStorageType.server.value, verbose_name=_('Type')
|
||||
|
|
|
@ -1,27 +1,24 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from .terminal import Terminal
|
||||
|
||||
|
||||
class Task(models.Model):
|
||||
class Task(JMSBaseModel):
|
||||
NAME_CHOICES = (
|
||||
("kill_session", "Kill Session"),
|
||||
)
|
||||
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
name = models.CharField(max_length=128, choices=NAME_CHOICES, verbose_name=_("Name"))
|
||||
args = models.CharField(max_length=1024, verbose_name=_("Args"))
|
||||
kwargs = models.JSONField(default=dict, verbose_name=_("Kwargs"))
|
||||
terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL)
|
||||
is_finished = models.BooleanField(default=False)
|
||||
date_created = models.DateTimeField(auto_now_add=True)
|
||||
date_finished = models.DateTimeField(null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = "terminal_task"
|
||||
verbose_name = _("Task")
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import time
|
||||
import uuid
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.const.signals import SKIP_SIGNAL
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.utils import get_logger, lazyproperty
|
||||
from orgs.utils import tmp_to_root_org
|
||||
from terminal.const import TerminalType as TypeChoices
|
||||
|
@ -75,8 +75,7 @@ class StorageMixin:
|
|||
return {"TERMINAL_REPLAY_STORAGE": config}
|
||||
|
||||
|
||||
class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
type = models.CharField(
|
||||
choices=TypeChoices.choices, default=TypeChoices.koko,
|
||||
|
@ -88,8 +87,6 @@ class Terminal(StorageMixin, TerminalStatusMixin, models.Model):
|
|||
user = models.OneToOneField(User, related_name='terminal', verbose_name=_('Application User'), null=True,
|
||||
on_delete=models.CASCADE)
|
||||
is_deleted = models.BooleanField(default=False)
|
||||
date_created = models.DateTimeField(auto_now_add=True)
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
|
||||
@property
|
||||
def is_active(self):
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.mixins.models import CommonModelMixin
|
||||
from common.db.models import JMSBaseModel
|
||||
from .session import Session
|
||||
|
||||
|
||||
class SessionReplay(CommonModelMixin):
|
||||
class SessionReplay(JMSBaseModel):
|
||||
session = models.ForeignKey(Session, on_delete=models.CASCADE, verbose_name=_("Session"))
|
||||
|
||||
class Meta:
|
||||
|
@ -14,5 +14,3 @@ class SessionReplay(CommonModelMixin):
|
|||
('upload_sessionreplay', _("Can upload session replay")),
|
||||
('download_sessionreplay', _("Can download session replay")),
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -1,20 +1,19 @@
|
|||
import datetime
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from orgs.utils import tmp_to_root_org
|
||||
from users.models import User
|
||||
|
||||
from common.mixins import CommonModelMixin
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from .session import Session
|
||||
|
||||
|
||||
__all__ = ['SessionSharing', 'SessionJoinRecord']
|
||||
|
||||
|
||||
class SessionSharing(CommonModelMixin, OrgModelMixin):
|
||||
class SessionSharing(JMSBaseModel, OrgModelMixin):
|
||||
session = models.ForeignKey(
|
||||
'terminal.Session', on_delete=models.CASCADE, verbose_name=_('Session')
|
||||
)
|
||||
|
@ -33,7 +32,7 @@ class SessionSharing(CommonModelMixin, OrgModelMixin):
|
|||
users = models.TextField(blank=True, verbose_name=_("User"))
|
||||
|
||||
class Meta:
|
||||
ordering = ('-date_created', )
|
||||
ordering = ('-date_created',)
|
||||
verbose_name = _('Session sharing')
|
||||
permissions = [
|
||||
('add_supersessionsharing', _("Can add super session sharing"))
|
||||
|
@ -71,7 +70,7 @@ class SessionSharing(CommonModelMixin, OrgModelMixin):
|
|||
return True, ''
|
||||
|
||||
|
||||
class SessionJoinRecord(CommonModelMixin, OrgModelMixin):
|
||||
class SessionJoinRecord(JMSBaseModel, OrgModelMixin):
|
||||
LOGIN_FROM = Session.LOGIN_FROM
|
||||
|
||||
session = models.ForeignKey(
|
||||
|
@ -112,7 +111,7 @@ class SessionJoinRecord(CommonModelMixin, OrgModelMixin):
|
|||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ('-date_joined', )
|
||||
ordering = ('-date_joined',)
|
||||
verbose_name = _("Session join record")
|
||||
|
||||
def __str__(self):
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# Generated by Django 3.2.14 on 2022-08-17 05:46
|
||||
|
||||
import time
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
|
@ -15,7 +16,7 @@ def migrate_system_to_account(apps, schema_editor):
|
|||
(apply_login_asset_ticket_model, 'apply_login_system_user', 'apply_login_account', False),
|
||||
)
|
||||
|
||||
print("\n\tStart migrate system user to account")
|
||||
print("\n Start migrate system user to account")
|
||||
for model, old_field, new_field, m2m in model_system_user_account:
|
||||
print("\t - migrate '{}'".format(model.__name__))
|
||||
count = 0
|
||||
|
@ -40,12 +41,11 @@ def migrate_system_to_account(apps, schema_editor):
|
|||
updated.append(obj)
|
||||
model.objects.bulk_update(updated, [new_field])
|
||||
print(" Migrate account: {}-{} using: {:.2f}s".format(
|
||||
count - len(objects), count, time.time()-start
|
||||
count - len(objects), count, time.time() - start
|
||||
))
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tickets', '0019_delete_applyapplicationticket'),
|
||||
]
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
# Generated by Django 3.2.14 on 2022-12-06 10:20
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('acls', '0010_auto_20221205_1122'),
|
||||
('acls', '0008_commandgroup_comment'),
|
||||
('tickets', '0024_auto_20221121_1800'),
|
||||
]
|
||||
|
||||
|
@ -23,6 +22,7 @@ class Migration(migrations.Migration):
|
|||
migrations.AddField(
|
||||
model_name='applycommandticket',
|
||||
name='apply_from_cmd_filter_acl',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='acls.commandfilteracl', verbose_name='Command filter acl'),
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='acls.commandfilteracl',
|
||||
verbose_name='Command filter acl'),
|
||||
),
|
||||
]
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -3,12 +3,12 @@
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.mixins.models import CommonModelMixin
|
||||
from common.db.models import JMSBaseModel
|
||||
|
||||
__all__ = ['Comment']
|
||||
|
||||
|
||||
class Comment(CommonModelMixin):
|
||||
class Comment(JMSBaseModel):
|
||||
class Type(models.TextChoices):
|
||||
state = 'state', _('State')
|
||||
common = 'common', _('common')
|
||||
|
@ -28,7 +28,7 @@ class Comment(CommonModelMixin):
|
|||
state = models.CharField(max_length=16, null=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ('date_created', )
|
||||
ordering = ('date_created',)
|
||||
verbose_name = _("Comment")
|
||||
|
||||
def set_display_fields(self):
|
||||
|
|
|
@ -3,18 +3,17 @@
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from users.models import User
|
||||
from common.mixins.models import CommonModelMixin
|
||||
|
||||
from common.db.models import JMSBaseModel
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from orgs.models import Organization
|
||||
from orgs.utils import tmp_to_org, get_current_org_id
|
||||
from users.models import User
|
||||
from ..const import TicketType, TicketLevel, TicketApprovalStrategy
|
||||
|
||||
__all__ = ['TicketFlow', 'ApprovalRule']
|
||||
|
||||
|
||||
class ApprovalRule(CommonModelMixin):
|
||||
class ApprovalRule(JMSBaseModel):
|
||||
level = models.SmallIntegerField(
|
||||
default=TicketLevel.one, choices=TicketLevel.choices,
|
||||
verbose_name=_('Approve level')
|
||||
|
@ -51,7 +50,7 @@ class ApprovalRule(CommonModelMixin):
|
|||
return assignees
|
||||
|
||||
|
||||
class TicketFlow(CommonModelMixin, OrgModelMixin):
|
||||
class TicketFlow(JMSBaseModel, OrgModelMixin):
|
||||
type = models.CharField(
|
||||
max_length=64, choices=TicketType.choices,
|
||||
default=TicketType.general, verbose_name=_("Type")
|
||||
|
|
|
@ -5,17 +5,17 @@ from typing import Callable
|
|||
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.forms import model_to_dict
|
||||
from django.db.utils import IntegrityError
|
||||
from django.db.models.fields import related
|
||||
from django.db.utils import IntegrityError
|
||||
from django.forms import model_to_dict
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from orgs.utils import tmp_to_org
|
||||
from orgs.models import Organization
|
||||
from common.db.encoder import ModelJSONFieldEncoder
|
||||
from common.db.models import JMSBaseModel
|
||||
from common.exceptions import JMSException
|
||||
from common.utils.timezone import as_current_tz
|
||||
from common.mixins.models import CommonModelMixin
|
||||
from common.db.encoder import ModelJSONFieldEncoder
|
||||
from orgs.models import Organization
|
||||
from orgs.utils import tmp_to_org
|
||||
from tickets.const import (
|
||||
TicketType, TicketStatus, TicketState,
|
||||
TicketLevel, StepState, StepStatus
|
||||
|
@ -25,11 +25,12 @@ from tickets.handlers import get_ticket_handler
|
|||
from ..flow import TicketFlow
|
||||
|
||||
__all__ = [
|
||||
'Ticket', 'TicketStep', 'TicketAssignee', 'SuperTicket', 'SubTicketManager'
|
||||
'Ticket', 'TicketStep', 'TicketAssignee',
|
||||
'SuperTicket', 'SubTicketManager'
|
||||
]
|
||||
|
||||
|
||||
class TicketStep(CommonModelMixin):
|
||||
class TicketStep(JMSBaseModel):
|
||||
ticket = models.ForeignKey(
|
||||
'Ticket', related_name='ticket_steps',
|
||||
on_delete=models.CASCADE, verbose_name='Ticket'
|
||||
|
@ -74,7 +75,7 @@ class TicketStep(CommonModelMixin):
|
|||
verbose_name = _("Ticket step")
|
||||
|
||||
|
||||
class TicketAssignee(CommonModelMixin):
|
||||
class TicketAssignee(JMSBaseModel):
|
||||
assignee = models.ForeignKey(
|
||||
'users.User', related_name='ticket_assignees',
|
||||
on_delete=models.CASCADE, verbose_name='Assignee'
|
||||
|
@ -267,7 +268,7 @@ class StatusMixin:
|
|||
return get_ticket_handler(ticket=self)
|
||||
|
||||
|
||||
class Ticket(StatusMixin, CommonModelMixin):
|
||||
class Ticket(StatusMixin, JMSBaseModel):
|
||||
title = models.CharField(max_length=256, verbose_name=_('Title'))
|
||||
type = models.CharField(
|
||||
max_length=64, choices=TicketType.choices,
|
||||
|
|
|
@ -2,15 +2,16 @@
|
|||
# Generated by Django 1.11 on 2017-12-21 16:06
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import common.utils
|
||||
from django.contrib.auth.hashers import make_password
|
||||
from django.conf import settings
|
||||
import django.contrib.auth.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import uuid
|
||||
|
||||
import django.contrib.auth.models
|
||||
import django.utils.timezone
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.hashers import make_password
|
||||
from django.db import migrations, models
|
||||
|
||||
import common.utils
|
||||
|
||||
|
||||
def add_default_group(apps, schema_editor):
|
||||
group_model = apps.get_model("users", "UserGroup")
|
||||
|
@ -34,7 +35,6 @@ def add_default_admin(apps, schema_editor):
|
|||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
|
@ -49,13 +49,17 @@ class Migration(migrations.Migration):
|
|||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
||||
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
|
||||
('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
|
||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||
('is_active', models.BooleanField(default=True,
|
||||
help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.',
|
||||
verbose_name='active')),
|
||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('username', models.CharField(max_length=20, unique=True, verbose_name='Username')),
|
||||
('name', models.CharField(max_length=20, verbose_name='Name')),
|
||||
('email', models.EmailField(max_length=30, unique=True, verbose_name='Email')),
|
||||
('role', models.CharField(blank=True, choices=[('Admin', 'Administrator'), ('User', 'User'), ('App', 'Application')], default='User', max_length=10, verbose_name='Role')),
|
||||
('role', models.CharField(blank=True, choices=[('Admin', 'Administrator'), ('User', 'User'),
|
||||
('App', 'Application')], default='User', max_length=10,
|
||||
verbose_name='Role')),
|
||||
('avatar', models.ImageField(null=True, upload_to='avatar', verbose_name='Avatar')),
|
||||
('wechat', models.CharField(blank=True, max_length=30, verbose_name='Wechat')),
|
||||
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')),
|
||||
|
@ -63,9 +67,10 @@ class Migration(migrations.Migration):
|
|||
('secret_key_otp', models.CharField(blank=True, max_length=16)),
|
||||
('_private_key', models.CharField(blank=True, max_length=5000, verbose_name='Private key')),
|
||||
('_public_key', models.CharField(blank=True, max_length=5000, verbose_name='Public key')),
|
||||
('comment', models.TextField(blank=True, max_length=200, verbose_name='Comment')),
|
||||
('comment', models.TextField(blank=True, verbose_name='Comment')),
|
||||
('is_first_login', models.BooleanField(default=False)),
|
||||
('date_expired', models.DateTimeField(blank=True, default=common.utils.date_expired_default, null=True, verbose_name='Date expired')),
|
||||
('date_expired', models.DateTimeField(blank=True, default=common.utils.date_expired_default, null=True,
|
||||
verbose_name='Date expired')),
|
||||
('created_by', models.CharField(default='', max_length=30, verbose_name='Created by')),
|
||||
],
|
||||
options={
|
||||
|
@ -78,9 +83,11 @@ class Migration(migrations.Migration):
|
|||
migrations.CreateModel(
|
||||
name='AccessKey',
|
||||
fields=[
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='AccessKeyID')),
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False,
|
||||
verbose_name='AccessKeyID')),
|
||||
('secret', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='AccessKeySecret')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_key', to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_key',
|
||||
to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -88,7 +95,8 @@ class Migration(migrations.Migration):
|
|||
fields=[
|
||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||
('username', models.CharField(max_length=20, verbose_name='Username')),
|
||||
('type', models.CharField(choices=[('W', 'Web'), ('T', 'Terminal')], max_length=2, verbose_name='Login type')),
|
||||
('type',
|
||||
models.CharField(choices=[('W', 'Web'), ('T', 'Terminal')], max_length=2, verbose_name='Login type')),
|
||||
('ip', models.GenericIPAddressField(verbose_name='Login ip')),
|
||||
('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Login city')),
|
||||
('user_agent', models.CharField(blank=True, max_length=254, null=True, verbose_name='User agent')),
|
||||
|
@ -103,7 +111,8 @@ class Migration(migrations.Migration):
|
|||
fields=[
|
||||
('key', models.CharField(max_length=40, primary_key=True, serialize=False, verbose_name='Key')),
|
||||
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='auth_token', to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='auth_token',
|
||||
to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Private Token',
|
||||
|
@ -127,12 +136,15 @@ class Migration(migrations.Migration):
|
|||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, related_name='users', to='users.UserGroup', verbose_name='User group'),
|
||||
field=models.ManyToManyField(blank=True, related_name='users', to='users.UserGroup',
|
||||
verbose_name='User group'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='user_permissions',
|
||||
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
|
||||
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.',
|
||||
related_name='user_set', related_query_name='user', to='auth.Permission',
|
||||
verbose_name='user permissions'),
|
||||
),
|
||||
migrations.RunPython(add_default_group),
|
||||
migrations.RunPython(add_default_admin),
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -1,22 +1,16 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
from common.utils import lazyproperty
|
||||
from orgs.mixins.models import JMSOrgBaseModel
|
||||
|
||||
__all__ = ['UserGroup']
|
||||
|
||||
|
||||
class UserGroup(OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
class UserGroup(JMSOrgBaseModel):
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||
date_created = models.DateTimeField(auto_now_add=True, null=True,
|
||||
verbose_name=_('Date created'))
|
||||
created_by = models.CharField(max_length=100, null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
@ -27,7 +21,7 @@ class UserGroup(OrgModelMixin):
|
|||
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
unique_together = [('org_id', 'name'),]
|
||||
unique_together = [('org_id', 'name'), ]
|
||||
verbose_name = _("User group")
|
||||
|
||||
@classmethod
|
||||
|
|
Loading…
Reference in New Issue