53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
from django.core.management.base import BaseCommand, CommandError
|
|
from products.models import *
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Update batch binding with tenant'
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('--batch', '-b', type=int)
|
|
parser.add_argument('--job', '-j', type=int)
|
|
|
|
def handle(self, *args, **options):
|
|
if options.get('job'):
|
|
job = Job.objects.get(pk=options['job'])
|
|
else:
|
|
job = Job.objects.create(name='bind-batch.%d' % options.get('batch'))
|
|
try:
|
|
job.update('running', 0.0)
|
|
b = CodeBatch.objects.get(pk=options['batch'])
|
|
t = b.tenant
|
|
q = SerialCode.objects.filter(batch=b)
|
|
total = q.count()
|
|
done = 0
|
|
batchsize = 1000
|
|
for objs in self.batch_iter(q, batchsize):
|
|
if t:
|
|
seq_num = t.alloc_seq_nums(batchsize)
|
|
for x in objs:
|
|
x.tenant = t
|
|
x.seq_num = seq_num
|
|
seq_num += 1
|
|
else:
|
|
for x in objs:
|
|
x.tenant = None
|
|
x.seq_num = None
|
|
SerialCode.objects.bulk_update(objs, ['tenant', 'seq_num'])
|
|
done += len(objs)
|
|
perc = done * 100.0 / total
|
|
job.update('running', perc)
|
|
print(f"bound {done} codes, total {total}")
|
|
job.update('done', 100.0)
|
|
except Exception as e:
|
|
job.update('error', message=str(e))
|
|
|
|
def batch_iter(self, q, batchsize=1000):
|
|
this_batch = []
|
|
for x in q.iterator():
|
|
this_batch.append(x)
|
|
if len(this_batch) >= batchsize:
|
|
yield this_batch
|
|
this_batch = []
|
|
if this_batch:
|
|
yield this_batch
|