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)
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
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)
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