# Generated by Django 3.1.6 on 2021-06-05 16:10
import common . fields . model
from django . conf import settings
import django . core . validators
from django . db import migrations , models
import django . db . models . deletion
import simple_history . models
import uuid
from django . utils import timezone
from django . db import migrations , transaction
def migrate_old_authbook_to_history ( apps , schema_editor ) :
authbook_model = apps . get_model ( " assets " , " AuthBook " )
history_model = apps . get_model ( " assets " , " HistoricalAuthBook " )
db_alias = schema_editor . connection . alias
print ( )
while True :
authbooks = authbook_model . objects . using ( db_alias ) . filter ( is_latest = False ) [ : 1000 ]
if not authbooks :
break
historys = [ ]
authbook_ids = [ ]
# Todo: 或许能优化成更新那样
for authbook in authbooks :
authbook_ids . append ( authbook . id )
history = history_model ( )
for attr in [
' id ' , ' username ' , ' password ' , ' private_key ' , ' public_key ' , ' version ' ,
' comment ' , ' created_by ' , ' asset ' , ' date_created ' , ' date_updated '
] :
setattr ( history , attr , getattr ( authbook , attr ) )
history . history_type = ' - '
history . history_date = timezone . now ( )
historys . append ( history )
with transaction . atomic ( ) :
print ( " Migrate old auth book to history table: {} items " . format ( len ( authbook_ids ) ) )
history_model . objects . bulk_create ( historys , ignore_conflicts = True )
authbook_model . objects . filter ( id__in = authbook_ids ) . delete ( )
class Migration ( migrations . Migration ) :
dependencies = [
migrations . swappable_dependency ( settings . AUTH_USER_MODEL ) ,
( ' assets ' , ' 0071_systemuser_type ' ) ,
]
operations = [
migrations . CreateModel (
name = ' HistoricalAuthBook ' ,
fields = [
( ' 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 . fields . model . EncryptCharField ( blank = True , max_length = 256 , null = True , verbose_name = ' Password ' ) ) ,
( ' private_key ' , common . fields . model . EncryptTextField ( blank = True , null = True , verbose_name = ' SSH private key ' ) ) ,
( ' public_key ' , common . fields . model . EncryptTextField ( blank = True , null = True , verbose_name = ' SSH public key ' ) ) ,
( ' comment ' , models . TextField ( blank = True , 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 ' ) ) ,
( ' version ' , models . IntegerField ( default = 1 , verbose_name = ' Version ' ) ) ,
( ' is_latest ' , models . BooleanField ( default = False , verbose_name = ' Latest version ' ) ) ,
( ' 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 ) ) ,
( ' asset ' , models . ForeignKey ( blank = True , db_constraint = False , null = True , on_delete = django . db . models . deletion . DO_NOTHING , related_name = ' + ' , to = ' assets.asset ' , verbose_name = ' Asset ' ) ) ,
( ' 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 AuthBook ' ,
' ordering ' : ( ' -history_date ' , ' -history_id ' ) ,
' get_latest_by ' : ' history_date ' ,
} ,
bases = ( simple_history . models . HistoricalChanges , models . Model ) ,
) ,
migrations . RunPython ( migrate_old_authbook_to_history )
]