Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def _product_configuration_ids_to_objects(
- self, product_configuration: List[InputAreaConfigurationDTO]
- ) -> List[AreaConfigurationDTO]:
- """
- Takes list of areas configurations (area_id, material_id, material_group_id, color_id).
- Returns list of DTOs consist of objects (PaletteColor etc.) instead of ids.
- """
- area_ids = []
- material_ids = []
- material_groups_ids = []
- color_ids = []
- for area_configuration in product_configuration:
- area_ids.append(area_configuration.area_id)
- material_ids.append(area_configuration.material_id)
- material_groups_ids.append(area_configuration.material_group_id)
- if area_configuration.color_id: # Color id is not required parameter
- color_ids.append(area_configuration.color_id)
- # The main idea of such long code is to get objects from db not in loop but using filter()
- # and 'id__in' to reduce db hits.
- areas = AreaName.objects.filter(id__in=area_ids)
- materials = ProductMaterialImage.objects.filter(id__in=material_ids).select_related('default_color__palette')
- material_groups = ProductMaterial.objects.filter(id__in=material_groups_ids)
- colors = PaletteColor.objects.filter(id__in=color_ids).select_related('palette')
- areas_dict = {area.id: area for area in areas}
- materials_dict = {material.id: material for material in materials}
- material_groups_dict = {material_group.id: material_group for material_group in material_groups}
- colors_dict = {color.id: color for color in colors}
- configurations: List[AreaConfigurationDTO] = []
- for area_configuration in product_configuration:
- area = areas_dict.get(area_configuration.area_id)
- if not area:
- raise ConfigurationDatabaseError('Wrong area_id.')
- material = materials_dict.get(area_configuration.material_id)
- if not material:
- raise ConfigurationDatabaseError('Wrong material_id.')
- material_group = material_groups_dict.get(area_configuration.material_group_id)
- if not material_group:
- raise ConfigurationDatabaseError('Wrong material_group_id.')
- if area_configuration.color_id:
- color = colors_dict.get(area_configuration.color_id)
- if not color:
- raise ConfigurationDatabaseError('Wrong color_id.')
- else:
- color = material.default_color
- configurations.append(
- AreaConfigurationDTO(
- area=area,
- material=material,
- material_group=material_group,
- color=color,
- )
- )
- return configurations
Add Comment
Please, Sign In to add comment