Beispiel #1
0
    def form_valid(self, form):
        if self.stage != "init":
            return super().form_valid(form)

        create_component_from_doc(form.cleaned_data)

        # Move to discover phase
        self.stage = "discover"
        self.initial = form.cleaned_data
        self.initial["vcs"] = "local"
        self.initial["repo"] = "local:"
        self.initial.pop("docfile")
        self.request.method = "GET"
        return self.get(self, self.request)
Beispiel #2
0
 def to_internal_value(self, data):
     # Preprocess to inject params based on content
     if "docfile" in data:
         fake_data = data.copy()
         self.fixup_request_payload(fake_data)
         fake = create_component_from_doc(fake_data)
         data["project"] = self._context["project"]
         data["template"] = fake.template
         data["new_base"] = fake.template
         data["filemask"] = fake.filemask
         data["repo"] = "local:"
         data["vcs"] = "local"
         data.pop("docfile")
     if "zipfile" in data:
         fake_data = data.copy()
         self.fixup_request_payload(fake_data)
         try:
             create_component_from_zip(fake_data)
         except BadZipfile:
             raise serializers.ValidationError(
                 "Failed to parse uploaded ZIP file.")
         data["repo"] = "local:"
         data["vcs"] = "local"
         data.pop("zipfile")
     # DRF processing
     result = super().to_internal_value(data)
     # Postprocess to inject values
     self.fixup_request_payload(result)
     return result
Beispiel #3
0
 def to_internal_value(self, data):
     # Preprocess to inject params based on content
     data = data.copy()
     if "manage_units" not in data and data.get("template"):
         data["manage_units"] = "1"
     if "docfile" in data:
         if hasattr(data["docfile"], "name"):
             fake = create_component_from_doc(
                 self.fixup_request_payload(data))
             data["template"] = fake.template
             data["new_base"] = fake.template
             data["filemask"] = fake.filemask
             data.pop("docfile")
         else:
             # Provide a filemask so that it is not listed as an
             # error. The validation of docfile will fail later
             data["filemask"] = "fake.*"
         data["repo"] = "local:"
         data["vcs"] = "local"
         data["branch"] = "main"
     if "zipfile" in data:
         if hasattr(data["zipfile"], "name"):
             try:
                 create_component_from_zip(self.fixup_request_payload(data))
             except BadZipfile:
                 raise serializers.ValidationError(
                     "Failed to parse uploaded ZIP file.")
             data.pop("zipfile")
         data["repo"] = "local:"
         data["vcs"] = "local"
         data["branch"] = "main"
     # DRF processing
     result = super().to_internal_value(data)
     # Postprocess to inject values
     return self.fixup_request_payload(result)
Beispiel #4
0
    def validate(self, attrs):
        # Validate name/slug uniqueness, this has to be done prior docfile/zipfile
        # extracting
        for field in ("name", "slug"):
            # Skip optional fields on PATCH
            if field not in attrs:
                continue
            # Skip non changed fields
            if self.instance and getattr(self.instance, field) == attrs[field]:
                continue
            # Look for existing components
            if attrs["project"].component_set.filter(**{
                    field: attrs[field]
            }).exists():
                raise serializers.ValidationError(
                    {field: f"Component with this {field} already exists."})

        # Handle uploaded files
        if self.instance:
            for field in ("docfile", "zipfile"):
                if field in attrs:
                    raise serializers.ValidationError({
                        field:
                        "This field is for creation only, use /file/ instead."
                    })
        if "docfile" in attrs:
            fake = create_component_from_doc(attrs)
            attrs["template"] = fake.template
            attrs["new_base"] = fake.template
            attrs["filemask"] = fake.filemask
            attrs.pop("docfile")
        if "zipfile" in attrs:
            try:
                create_component_from_zip(attrs)
            except BadZipfile:
                raise serializers.ValidationError(
                    {"zipfile": "Failed to parse uploaded ZIP file."})
            attrs.pop("zipfile")
        # Handle non-component arg
        disable_autoshare = attrs.pop("disable_autoshare", False)

        # Call model validation here, DRF does not do that
        if self.instance:
            instance = copy(self.instance)
            for key, value in attrs.items():
                setattr(instance, key, value)
        else:
            instance = Component(**attrs)
        instance.clean()

        if not self.instance and not disable_autoshare:
            repo = instance.suggest_repo_link()
            if repo:
                attrs["repo"] = instance.repo = repo
                attrs["branch"] = instance.branch = ""
        return attrs