1313from django .core .exceptions import MultipleObjectsReturned
1414from django .core .exceptions import ValidationError
1515from django .core .validators import EMPTY_VALUES
16+ from django .db import IntegrityError
1617from django .db import transaction
1718from django .db .models import ObjectDoesNotExist
1819from django .db .models import Q
2627from component_catalog .models import Component
2728from component_catalog .models import Package
2829from dejacode_toolkit .scancodeio import ScanCodeIO
30+ from dje .copier import copy_object
2931from dje .importers import BaseImporter
3032from dje .importers import BaseImportModelForm
3133from dje .importers import BaseImportModelFormSet
3234from dje .importers import ComponentRelatedFieldImportMixin
3335from dje .importers import ModelChoiceFieldForImport
36+ from dje .models import Dataspace
3437from dje .utils import get_help_text
3538from dje .utils import is_uuid4
3639from product_portfolio .forms import ProductComponentLicenseExpressionFormMixin
@@ -667,12 +670,26 @@ def import_package(self, package_data):
667670 if (value := package_data .get (field ))
668671 }
669672
673+ # Check if the Package already exists in the local Dataspace
670674 try :
671675 package = Package .objects .scope (self .user .dataspace ).get (** unique_together_lookups )
672676 self .existing .append (package )
673677 except (ObjectDoesNotExist , MultipleObjectsReturned ):
674678 package = None
675679
680+ # Check if the Package already exists in the reference Dataspace
681+ reference_dataspace = Dataspace .objects .get_reference ()
682+ user_dataspace = self .user .dataspace
683+ if not package and user_dataspace != reference_dataspace :
684+ qs = Package .objects .scope (reference_dataspace ).filter (** unique_together_lookups )
685+ if qs .exists ():
686+ reference_object = qs .first ()
687+ try :
688+ package = copy_object (reference_object , user_dataspace , self .user , update = False )
689+ self .created .append (package )
690+ except IntegrityError as error :
691+ self .errors .append (error )
692+
676693 if license_expression := package_data .get ("declared_license_expression" ):
677694 license_expression = str (self .licensing .dedup (license_expression ))
678695 package_data ["license_expression" ] = license_expression
@@ -683,8 +700,8 @@ def import_package(self, package_data):
683700 if not package :
684701 try :
685702 package = Package .create_from_data (self .user , package_data , validate = True )
686- except ValidationError as e :
687- self .errors .append (e )
703+ except ValidationError as errors :
704+ self .errors .append (errors )
688705 return
689706 self .created .append (package )
690707
0 commit comments