diff --git a/sysom_server/sysom_hotfix/apps/hotfix/serializer.py b/sysom_server/sysom_hotfix/apps/hotfix/serializer.py index 72bbbc4d174e13a23084f38760911abf73946e1f..0e78bb20b16d0b5d952de23c5f9a6be553660ed3 100644 --- a/sysom_server/sysom_hotfix/apps/hotfix/serializer.py +++ b/sysom_server/sysom_hotfix/apps/hotfix/serializer.py @@ -1,8 +1,11 @@ import os +import re import tempfile import pandas as pd +from typing import List from datetime import datetime from pandas.core.frame import DataFrame +from pandas._libs.tslibs.timestamps import Timestamp from clogger import logger from django.utils import timezone from django.core.files.uploadedfile import InMemoryUploadedFile @@ -186,31 +189,76 @@ class BulkImportHotfixReleasedSerializer(serializers.Serializer): ) return context + def _kernel_version_or_download_link_map( + self, + kernel_versions: List[str], + urls: List[str] + ) -> List[dict]: + _version_download_link_list = list() + reg_compile = re.compile("(\d+)\.(\d+)\.(\d+)-(\d+)") + + def _filter(marks, url): + flag = True + for mark in marks: + if mark not in url: + flag = False + break + return flag + + for kernel_version in kernel_versions: + _version_map_download_link = {} + version_s = re.sub(reg_compile, "", kernel_version) + marks = version_s.split(".")[1:] + _version_map_download_link['released_kernel_version'] = kernel_version + + for url in filter(lambda x: _filter(marks, x), urls): + _version_map_download_link["download_link"] = url + _version_download_link_list.append(_version_map_download_link) + return _version_download_link_list + def create(self, validated_data): """Save the data to the database""" - def _structure_released_hotfix(data_rows) -> list[ReleasedHotfixListModule]: + def _released_time(released_time): + if isinstance(released_time, str) and released_time != "": + released_time = datetime.strptime( + released_time.split(".")[0], "%Y-%m-%d %H:%M:%S" + ) + released_time = timezone.get_current_timezone().localize(released_time) + elif isinstance(released_time, Timestamp): + released_time = timezone.get_current_timezone().localize(released_time) + else: + released_time = timezone.now() + return released_time + + def _structure_released_hotfix(data_rows: dict) -> List[ReleasedHotfixListModule]: """ initizaer released hotfix model """ - released_hotfix_list = [] - for kernel_version in data_rows['kernel_version'].split(","): - kwargs = dict() - kwargs["hotfix_id"] = data_rows.get("hotfix_id") - kwargs["download_link"] = data_rows.get("download_link", "") - kwargs["released_kernel_version"] = kernel_version - - released_time = data_rows['modified_time'] - if isinstance(released_time, str): - released_time = datetime.strptime( - released_time.split(".")[0], "%Y-%m-%d %H:%M:%S" - ) - kwargs['released_time'] = timezone.get_current_timezone().localize(released_time) - - try: - ReleasedHotfixListModule.objects.get(**kwargs) - except ReleasedHotfixListModule.DoesNotExist: - released_hotfix_list.append(ReleasedHotfixListModule(**kwargs)) + released_hotfix_list = list() + kwargs = dict() + kwargs["hotfix_id"] = data_rows.get("hotfix_id") + kernel_versions = data_rows.get("kernel_version").split(",") + download_links = re.split(" ", data_rows.get("download_link")) + + if len(kernel_versions) == 1: + kwargs['released_kernel_version'] = kernel_versions[0] + if len(download_links) == 1: + kwargs['download_link'] = download_links[0] + else: + for item in self._kernel_version_or_download_link_map( + kernel_versions, download_links + ): kwargs.update(item) + + kwargs['released_time'] = _released_time(data_rows.get("modified_time", "")) + + try: + ReleasedHotfixListModule.objects.get( + released_kernel_version=kwargs['released_kernel_version'], + hotfix_id=kwargs["hotfix_id"] + ) + except ReleasedHotfixListModule.DoesNotExist: + released_hotfix_list.append(ReleasedHotfixListModule(**kwargs)) return released_hotfix_list excel_file_content: DataFrame = validated_data.get("file")