Story #2872
closedAs an authenticated user, I can create a Content unit from one or more artifacts
100%
Description
For an API user to create a Content unit, Pulp 3 needs to have the following:
- the ContentArtifact "through" model[0] for Content and Artifact. It contains a ForeignKey field pointing to Artifact and another one pointing to Content. It also contains a relative path char field. All three are required and can not be null. The combination of 3 is a uniqueness constraint.
- the Content model with an artifacts ManyToManyField pointing to Artifact through ContentArtifact.
- viewset that can handle CRD operations for Content.
- serializer for the viewset which will return all serialized fields of the Content model including the artifacts.
- API endpoint at /api/v3/content/units/
- POST request to the /api/v3/content/units/ endpoint creates Content. The body of the request contains a dictionary that looks like the following:
{
"artifacts": [{
"< artifact >": "< relative_path >"
}, {
"< artifact2 >": "< relative_path2 >"
}],
"notes": {}
}
First a new Content instance is created with notes from the payload. Then the 'artifacts' from the payload are used to create ContentArtifact instances that reference the new Content.
- GET request to the /api/v3/content/units/<content unit id> returns serialized Content
- DELETE request to the /api/v3/content/units/<content unit id>/ raises an exception if the Artifact is still associated with any Repository. The exception should provide a list of Repositories still associated with the Artifact. If an exception is not raised, Artifact is removed from the database.
- PUT/PATCH requests to the /api/v3/content/units/<content unit id>/ raises an exception (409 unsupported method)
[0] https://docs.djangoproject.com/en/1.9/topics/db/models/#intermediary-manytomany
Related issues
Problem: Content can not be created using REST API
Solution: Add viewset and serializers to serve Content creation API
This patch also introduces a DeferredArtifact that will be used by importers that want to support deferred download policies. This model replaces the DownloadCatalog model. However, DownloadCatalog was not removed as part of this patch because it is referenced by the changesets. The changesets will be updated in a separate commit and the DownloadCatalog will be removed then.
This patch also includes a fix for the artifact_pre_delete signal which should have been updated when the Artifact model changed.
This patch also introduces additional base viewsets for models that don't need update() implemented. REST API for both Artifact and Content resources does not support updates.
closes #2872 https://pulp.plan.io/issues/2872