Example #1
0
class ProductSerializer(HyperlinkedModelSerializer):
    currency = ChoiceField(choices=CURRENCY_CHOICES,
                           initial="USD",
                           required=False)
    description = CharField(
        initial="not set",
        required=False,
        allow_blank=True,
        style={'base_template': 'textarea.html'},
    )
    list_price = DecimalField(initial="0.00",
                              required=False,
                              allow_null=True,
                              decimal_places=2,
                              max_digits=32,
                              help_text="list price of the element",
                              validators=[MinValueValidator(0)])

    lc_state_sync = BooleanField(
        required=False,
        initial=False,
        read_only=True,
        help_text="automatic synchronization of lifecycle states")

    product_group = PrimaryKeyRelatedField(many=False,
                                           queryset=ProductGroup.objects.all(),
                                           read_only=False,
                                           required=False,
                                           allow_null=True)

    vendor = PrimaryKeyRelatedField(many=False,
                                    queryset=Vendor.objects.all(),
                                    read_only=False,
                                    required=False)

    def validate_product_group(self, value):
        """
        verify that the product group is associated to the same vendor as the product
        """
        if value and self.instance:  # check for None type
            if value.vendor.name != self.instance.vendor.name:
                raise serializers.ValidationError(
                    "Invalid product group, group and product must be associated to the same vendor"
                )
        return value

    class Meta:
        model = Product
        fields = (
            'id',
            'product_id',
            'description',
            'list_price',
            'currency',
            'tags',
            'vendor',
            'product_group',
            'url',
            'eox_update_time_stamp',
            'end_of_sale_date',
            'end_of_support_date',
            'eol_ext_announcement_date',
            'end_of_sw_maintenance_date',
            'end_of_routine_failure_analysis',
            'end_of_service_contract_renewal',
            'end_of_new_service_attachment_date',
            'end_of_sec_vuln_supp_date',
            'eol_reference_number',
            'eol_reference_url',
            'lc_state_sync',
            'internal_product_id',
            'update_timestamp',
            'list_price_timestamp',
        )
        extra_kwargs = {
            'url': {
                'lookup_field': 'id',
                'view_name': 'productdb:products-detail'
            }
        }
        depth = 0
Example #2
0
class FingerprintSerializer(ModelSerializer):
    """Serializer for the Fingerprint model."""

    # Scan information
    report_id = PrimaryKeyRelatedField(queryset=FactCollection.objects.all())

    # Common facts
    name = CharField(required=False, max_length=256)

    os_name = CharField(required=False, max_length=64)
    os_release = CharField(required=False, max_length=128)
    os_version = CharField(required=False, max_length=64)

    infrastructure_type = ChoiceField(
        required=False, choices=SystemFingerprint.INFRASTRUCTURE_TYPE)

    mac_addresses = CustomJSONField(required=False)
    ip_addresses = CustomJSONField(required=False)

    cpu_count = IntegerField(required=False, min_value=0)

    architecture = CharField(required=False, max_length=64)

    # Network scan facts
    bios_uuid = CharField(required=False, max_length=36)
    subscription_manager_id = CharField(required=False, max_length=36)

    cpu_socket_count = IntegerField(required=False, min_value=0)
    cpu_core_count = FloatField(required=False, min_value=0)

    system_creation_date = DateField(required=False)

    virtualized_type = CharField(required=False, max_length=64)

    # VCenter scan facts
    vm_state = CharField(required=False, max_length=24)
    vm_uuid = CharField(required=False, max_length=36)
    vm_dns_name = CharField(required=False, max_length=128)

    vm_host = CharField(required=False, max_length=128)
    vm_host_socket_count = IntegerField(required=False, min_value=0)

    vm_cluster = CharField(required=False, max_length=128)
    vm_datacenter = CharField(required=False, max_length=128)

    products = ProductSerializer(many=True, allow_null=True, required=False)
    entitlements = EntitlementSerializer(many=True,
                                         allow_null=True,
                                         required=False)

    # Red Hat facts
    is_redhat = NullBooleanField(required=False)
    redhat_certs = CharField(required=False, max_length=128)
    # pylint: disable=invalid-name
    redhat_package_count = IntegerField(required=False, min_value=0)

    metadata = CustomJSONField(required=True)
    sources = CustomJSONField(required=True)

    class Meta:
        """Meta class for FingerprintSerializer."""

        model = SystemFingerprint
        fields = '__all__'

    def create(self, validated_data):
        """Create a system fingerprint."""
        products_data = validated_data.pop('products', [])
        entitlements_data = validated_data.pop('entitlements', [])
        fingerprint = SystemFingerprint.objects.create(**validated_data)
        for product_data in products_data:
            Product.objects.create(fingerprint=fingerprint, **product_data)
        for entitlement_data in entitlements_data:
            Entitlement.objects.create(fingerprint=fingerprint,
                                       **entitlement_data)
        return fingerprint
Example #3
0
class FilterSerializer(Serializer):
    activity = ListField(child=ChoiceField(choices=Notebook.ACTIVITY_STATUS),
                         required=False)
    important = BooleanField(required=False)
    public = BooleanField(required=False)
class GitSerializer(Serializer):

    time = IntegerField(min_value=0,
                        required=True,
                        label='Time',
                        help_text='Point of time to run report.')

    url = ChoiceField(
        [],
        label='Git URL',
        default='https://git.openstack.org/openstack/openstack-ansible',
        help_text='Please select a git url.')

    def __init__(self, *args, **kwargs):
        """Init the serializer with updated list of git urls."""
        self.fields['url'].choices = self.git_urls()
        super(GitSerializer, self).__init__(*args, **kwargs)

    def git_urls(self):
        """Build list of selectable git urls.

        :returns: All git urls
        :rtype: list
        """
        q = ColumnQuery('GitUrl')
        q.add_column('GitUrl', 'url', 'url')
        q.orderby('url', 'ASC', label='GitUrl')
        urls = []

        page = 1
        pagesize = 1000
        page_rows = q.page(page, pagesize)
        while (page_rows):
            for row in page_rows:
                urls.append(row['url'])
            page += 1
            page_rows = q.page(page, pagesize)
        return urls

    def form_data(self):
        """Describes web client form associated with this serializer.

        :returns: List of dict objects
        :rtype: list
        """
        return [
            {
                'name': 'time',
                'label': self.fields['time'].label,
                'help_text': self.fields['time'].help_text,
                'required': self.fields['time'].required,
                'component': 'Time',
                'many': False
            },
            {
                'name': 'url',
                'label': self.fields['url'].label,
                'help_text': self.fields['url'].help_text,
                'required': self.fields['url'].required,
                'default': self.fields['url'].default,
                'component': 'Select',
                'choices': self.fields['url'].choices
            },
        ]
Example #5
0
class SystemFingerprintSerializer(ModelSerializer):
    """Serializer for the Fingerprint model."""

    # Common facts
    name = CharField(max_length=256, **default_args)

    os_name = CharField(max_length=64, **default_args)
    os_release = CharField(max_length=128, **default_args)
    os_version = CharField(max_length=64, **default_args)

    infrastructure_type = ChoiceField(
        required=False, choices=SystemFingerprint.INFRASTRUCTURE_TYPE)

    cloud_provider = CharField(max_length=16, **default_args)

    mac_addresses = CustomJSONField(**default_args)
    ip_addresses = CustomJSONField(**default_args)

    cpu_count = IntegerField(min_value=0, **default_args)

    architecture = CharField(max_length=64, **default_args)

    # Network scan facts
    bios_uuid = CharField(max_length=36, **default_args)
    subscription_manager_id = CharField(max_length=36, **default_args)

    cpu_socket_count = IntegerField(min_value=0, **default_args)
    cpu_core_count = FloatField(min_value=0, **default_args)
    cpu_core_per_socket = IntegerField(min_value=0, **default_args)
    cpu_hyperthreading = BooleanField(**default_args)

    system_creation_date = DateField(**default_args)
    system_last_checkin_date = DateField(**default_args)

    system_purpose = JSONField(**default_args)
    system_role = CharField(max_length=128, **default_args)
    system_addons = JSONField(**default_args)
    system_service_level_agreement = CharField(max_length=128, **default_args)
    system_usage_type = CharField(max_length=128, **default_args)

    insights_client_id = CharField(max_length=128, **default_args)

    virtualized_type = CharField(max_length=64, **default_args)
    system_user_count = IntegerField(min_value=0, **default_args)
    user_login_history = CustomJSONField(**default_args)

    # VCenter scan facts
    vm_state = CharField(max_length=24, **default_args)
    vm_uuid = CharField(max_length=36, **default_args)
    vm_dns_name = CharField(max_length=256, **default_args)

    virtual_host_name = CharField(max_length=128, **default_args)
    virtual_host_uuid = CharField(max_length=36, **default_args)
    vm_host_socket_count = IntegerField(min_value=0, **default_args)
    vm_host_core_count = IntegerField(min_value=0, **default_args)

    vm_cluster = CharField(max_length=128, **default_args)
    vm_datacenter = CharField(max_length=128, **default_args)

    products = ProductSerializer(many=True, **default_args)
    entitlements = EntitlementSerializer(many=True, **default_args)

    # Red Hat facts
    is_redhat = BooleanField(**default_args)
    redhat_certs = CharField(**default_args)
    # pylint: disable=invalid-name
    redhat_package_count = IntegerField(min_value=0, **default_args)

    metadata = CustomJSONField(required=True)
    sources = CustomJSONField(required=True)
    etc_machine_id = CharField(max_length=48, **default_args)

    class Meta:
        """Meta class for SystemFingerprintSerializer."""

        model = SystemFingerprint
        fields = '__all__'

    def create(self, validated_data):
        """Create a system fingerprint."""
        products_data = validated_data.pop('products', [])
        entitlements_data = validated_data.pop('entitlements', [])
        fingerprint = SystemFingerprint.objects.create(**validated_data)
        for product_data in products_data:
            Product.objects.create(fingerprint=fingerprint,
                                   **product_data)
        for entitlement_data in entitlements_data:
            Entitlement.objects.create(fingerprint=fingerprint,
                                       **entitlement_data)
        return fingerprint
class ReportTypeSerializer(Serializer):
    type = ChoiceField(choices=Report.REPORT_TYPE)
    def _get_fields_from_survey(self):
        fields = {}
        for survey_filed in self.survey["spec"]:
            if survey_filed["type"] == "text":
                fields[survey_filed['variable']] = CharField(
                    label=survey_filed['question_name'],
                    initial=survey_filed['default'],
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    min_length=survey_filed['min'],
                    max_length=survey_filed['max']
                )

            elif survey_filed["type"] == "textarea":
                fields[survey_filed['variable']] = CharField(
                    label=survey_filed['question_name'],
                    initial=survey_filed['default'],
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    min_length=survey_filed['min'],
                    max_length=survey_filed['max']
                )

            elif survey_filed["type"] == "password":
                fields[survey_filed['variable']] = CharField(
                    label=survey_filed['question_name'],
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    min_length=survey_filed['min'],
                    max_length=survey_filed['max'],
                )

            elif survey_filed["type"] == "multiplechoice":
                fields[survey_filed['variable']] = ChoiceField(
                    label=survey_filed['question_name'],
                    initial=survey_filed['default'],
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    choices=get_choices_from_string(survey_filed["choices"]),
                    error_messages={'required': 'At least you must select one choice'}
                )

            elif survey_filed["type"] == "multiselect":
                fields[survey_filed['variable']] = MultipleChoiceField(
                    label=survey_filed['question_name'],
                    initial=survey_filed['default'].split("\n"),
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    choices=get_choices_from_string(survey_filed["choices"]),
                )

            elif survey_filed["type"] == "integer":
                fields[survey_filed['variable']] = IntegerField(
                    label=survey_filed['question_name'],
                    initial=0 if not survey_filed['default'] else int(survey_filed['default']),
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    min_value=survey_filed['min'],
                    max_value=survey_filed['max'],
                )

            elif survey_filed["type"] == "float":
                fields[survey_filed['variable']] = FloatField(
                    label=survey_filed['question_name'],
                    initial=0 if not survey_filed['default'] else float(survey_filed['default']),
                    required=False if self.read_only_form else survey_filed['required'],
                    help_text=survey_filed['question_description'],
                    min_value=survey_filed['min'],
                    max_value=survey_filed['max'],
                )
            if self.read_only_form:
                fields[survey_filed['variable']].default = survey_filed['default']
        return fields
Example #8
0
class BookRoomSerializer(Serializer):
    room_type = ChoiceField(choices=ROOM_CHOICES, required=True)
    date = DateField(required=True)
    rooms_required = IntegerField(min_value=0, required=True)
Example #9
0
class SuggestedCompanySerializer(ModelSerializer):
    type = ChoiceField(choices=company_type.TYPE_CHOICES)

    class Meta:
        model = SuggestedCompany
        exclude = ('id', )
Example #10
0
class ShipmentSerializer(ShipmentData):
    status = ChoiceField(required=False, choices=SHIPMENT_STATUS)
    selected_rate_id = CharField(required=False)
    rates = Rate(many=True, required=False)
    label = CharField(required=False, allow_blank=True, allow_null=True)
    tracking_number = CharField(required=False,
                                allow_blank=True,
                                allow_null=True)
    shipment_identifier = CharField(required=False,
                                    allow_blank=True,
                                    allow_null=True)
    selected_rate = Rate(required=False, allow_null=True)
    tracking_url = CharField(required=False, allow_blank=True, allow_null=True)
    test_mode = BooleanField(required=False)

    def __init__(self, instance: models.Shipment = None, **kwargs):
        if kwargs.get('data') is not None:
            if isinstance(kwargs['data'], str):
                payload = ShipmentData(
                    models.Shipment.objects.get(pk=kwargs['data'])).data

            else:
                payload = kwargs['data'].copy()
                if payload.get('shipper') is not None:
                    payload.update(
                        shipper=SerializerDecorator[AddressSerializer]
                        ((instance.shipper if instance is not None else None),
                         data=payload['shipper']).data)

                if payload.get('recipient') is not None:
                    payload.update(
                        recipient=SerializerDecorator[AddressSerializer]
                        ((instance.recipient if instance is not None else None
                          ),
                         data=payload['recipient']).data)

                if payload.get('parcels') is not None:
                    payload.update(parcels=[
                        SerializerDecorator[ParcelSerializer](data=parcel).data
                        for parcel in payload.get('parcels', [])
                    ])

                if payload.get('customs') is not None:
                    payload.update(
                        customs=SerializerDecorator[CustomsSerializer]
                        ((instance.customs if instance is not None else None),
                         data=payload['customs']).data)

                if payload.get('payment') is not None:
                    payload.update(
                        payment=SerializerDecorator[PaymentSerializer]
                        ((instance.payment if instance is not None else None),
                         data=payload['payment']).data)

            kwargs.update(data=payload)

        super().__init__(instance, **kwargs)

    @transaction.atomic
    def create(self, validated_data: dict) -> models.Shipment:
        user = validated_data['user']
        carriers = Carrier.objects.filter(
            carrier_id__in=validated_data.get('carrier_ids', []))
        rate_response: datatypes.RateResponse = SerializerDecorator[
            RateSerializer](data=validated_data).save(user=user).instance
        test_mode = all([r.test_mode for r in rate_response.rates])

        shipment_data = {
            key: value
            for key, value in validated_data.items()
            if key in models.Shipment.DIRECT_PROPS and value is not None
        }

        related_data = dict(
            shipper=SerializerDecorator[AddressSerializer](
                data=validated_data.get('shipper')).save(user=user).instance,
            recipient=SerializerDecorator[AddressSerializer](
                data=validated_data.get('recipient')).save(user=user).instance,
            customs=SerializerDecorator[CustomsSerializer](
                data=validated_data.get('customs')).save(user=user).instance,
            payment=SerializerDecorator[PaymentSerializer](
                data=validated_data.get('payment')).save(user=user).instance,
        )

        shipment = models.Shipment.objects.create(
            **{
                **shipment_data,
                **{k: v
                   for k, v in related_data.items() if v is not None}, 'user':
                user,
                'test_mode': test_mode,
                'shipment_rates': DP.to_dict(rate_response.rates),
                'messages': DP.to_dict(rate_response.messages)
            })
        shipment.carriers.set(carriers)

        if validated_data.get('parcels') is not None:
            shipment_parcels = [
                SerializerDecorator[ParcelSerializer](data=data).save(
                    user=user).instance
                for data in validated_data.get('parcels', [])
            ]
            shipment.shipment_parcels.set(shipment_parcels)

        return shipment

    @transaction.atomic
    def update(self, instance: models.Shipment,
               validated_data: dict) -> models.Shipment:
        data = validated_data.copy()
        carrier_ids = validated_data.get('carrier_ids', [])

        for key, val in data.items():
            if key in models.Shipment.DIRECT_PROPS:
                setattr(instance, key, val)
                validated_data.pop(key)

            if key in models.Shipment.RELATIONAL_PROPS and val is None:
                prop = getattr(instance, key)
                # Delete related data from database if payload set to null
                if hasattr(prop, 'delete'):
                    prop.delete()
                    setattr(instance, key, None)
                    validated_data.pop(key)

        if validated_data.get('payment') is not None:
            instance.payment = SerializerDecorator[PaymentSerializer](
                instance.payment, data=validated_data['payment']).save(
                    user=instance.user).instance

        if validated_data.get('customs') is not None:
            instance.customs = SerializerDecorator[CustomsSerializer](
                data=validated_data.get('customs')).save(
                    user=instance.user).instance

        if validated_data.get('rates') is not None:
            instance.shipment_rates = DP.to_dict(
                validated_data.get('rates', []))

        if 'selected_rate' in validated_data:
            selected_rate = validated_data.get('selected_rate', {})
            carrier = Carrier.objects.filter(
                carrier_id=selected_rate.get('carrier_id'),
                user=instance.user).first()

            instance.selected_rate = {
                **selected_rate,
                **({
                    'carrier_ref': carrier.id
                } if carrier is not None else {})
            }
            instance.selected_rate_carrier = carrier

        instance.save()
        instance.carriers.set(
            Carrier.objects.filter(carrier_id__in=carrier_ids,
                                   user=instance.user))
        return instance
Example #11
0
class MediaSerializer(Serializer):
    type = ChoiceField(choices=MEDIA_CHOICES)