Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | from django.core.management.base import BaseCommand, CommandError |
Patrick Williams | d7e9631 | 2015-09-22 08:09:05 -0500 | [diff] [blame] | 2 | from django.core.exceptions import ObjectDoesNotExist |
Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 3 | from orm.models import Build |
| 4 | from django.db import OperationalError |
| 5 | import os |
| 6 | |
| 7 | |
| 8 | |
| 9 | class Command(BaseCommand): |
Patrick Williams | d7e9631 | 2015-09-22 08:09:05 -0500 | [diff] [blame] | 10 | args = '<buildID1 buildID2 .....>' |
Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 11 | help = "Deletes selected build(s)" |
| 12 | |
Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame^] | 13 | def add_arguments(self, parser): |
| 14 | parser.add_argument('buildids', metavar='N', type=int, nargs='+', |
| 15 | help="Build ID's to delete") |
| 16 | |
Patrick Williams | d7e9631 | 2015-09-22 08:09:05 -0500 | [diff] [blame] | 17 | def handle(self, *args, **options): |
Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame^] | 18 | for bid in options['buildids']: |
Patrick Williams | d7e9631 | 2015-09-22 08:09:05 -0500 | [diff] [blame] | 19 | try: |
| 20 | b = Build.objects.get(pk = bid) |
| 21 | except ObjectDoesNotExist: |
Patrick Williams | c0f7c04 | 2017-02-23 20:41:17 -0600 | [diff] [blame] | 22 | print('build %s does not exist, skipping...' %(bid)) |
Patrick Williams | d7e9631 | 2015-09-22 08:09:05 -0500 | [diff] [blame] | 23 | continue |
Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 24 | # theoretically, just b.delete() would suffice |
| 25 | # however SQLite runs into problems when you try to |
| 26 | # delete too many rows at once, so we delete some direct |
| 27 | # relationships from Build manually. |
| 28 | for t in b.target_set.all(): |
| 29 | t.delete() |
| 30 | for t in b.task_build.all(): |
| 31 | t.delete() |
| 32 | for p in b.package_set.all(): |
| 33 | p.delete() |
| 34 | for lv in b.layer_version_build.all(): |
| 35 | lv.delete() |
| 36 | for v in b.variable_build.all(): |
| 37 | v.delete() |
| 38 | for l in b.logmessage_set.all(): |
| 39 | l.delete() |
| 40 | |
| 41 | # delete the build; some databases might have had problem with migration of the bldcontrol app |
| 42 | retry_count = 0 |
| 43 | need_bldcontrol_migration = False |
| 44 | while True: |
| 45 | if retry_count >= 5: |
| 46 | break |
| 47 | retry_count += 1 |
| 48 | if need_bldcontrol_migration: |
| 49 | from django.core import management |
| 50 | management.call_command('migrate', 'bldcontrol', interactive=False) |
| 51 | |
| 52 | try: |
| 53 | b.delete() |
| 54 | break |
| 55 | except OperationalError as e: |
| 56 | # execute migrations |
| 57 | need_bldcontrol_migration = True |
| 58 | |