Coverage for jbank/management/commands/wsedi_import.py: 0%

49 statements  

« prev     ^ index     » next       coverage.py v7.2.2, created at 2023-03-27 13:36 +0700

1# pylint: disable=too-many-locals 

2import json 

3import logging 

4import os 

5import zipfile 

6from random import randint 

7from django.conf import settings 

8from django.core.management.base import CommandParser 

9from django.utils.timezone import now 

10from jutil.command import SafeCommand 

11from jbank.models import WsEdiConnection 

12 

13 

14logger = logging.getLogger(__name__) 

15 

16 

17class Command(SafeCommand): 

18 help = "Import WS-EDI connection" 

19 

20 def add_arguments(self, parser: CommandParser): 

21 parser.add_argument("file", type=str) 

22 parser.add_argument("--verbose", action="store_true") 

23 

24 def do(self, *args, **options): # pylint: disable=too-many-branches 

25 zf = zipfile.ZipFile(options["file"]) # noqa 

26 ws_data = {} 

27 today = now() 

28 

29 for filename in zf.namelist(): 

30 assert isinstance(filename, str) 

31 if options["verbose"]: 

32 print("Importing {}".format(filename)) 

33 if filename.endswith(".json"): 

34 content = zf.read(filename) 

35 ws_data = json.loads(content.decode()) 

36 

37 pem_suffix = "-import-{}-{}.pem".format(today.date().isoformat(), randint(100, 999)) 

38 for filename in zf.namelist(): 

39 assert isinstance(filename, str) 

40 if filename.endswith(".pem"): 

41 content = zf.read(filename) 

42 new_filename = filename[:-4] + pem_suffix 

43 new_path = "certs/{}".format(new_filename) 

44 with open(os.path.join(settings.MEDIA_ROOT, new_path), "wb") as fp: 

45 fp.write(content) # pytype: disable=not-callable 

46 repl = [] 

47 for k, v in ws_data.items(): 

48 if k.endswith("_file") and os.path.basename(v) == filename: 

49 repl.append((k, new_path)) 

50 for k, v in repl: 

51 ws_data[k] = v 

52 

53 if not ws_data: 

54 print("Nothing to import!") 

55 return 

56 if "created" in ws_data: 

57 del ws_data["created"] 

58 ws = WsEdiConnection.objects.create(**ws_data) 

59 logger.info("WsEdiConnection id=%s created", ws.id)