[Backport] Fix a bug that create non-ouner memberships where the importer user is a member of the importer project.

remotes/origin/enhancement/email-actions
David Barragán Merino 2015-05-22 16:00:02 +02:00
parent ce67686eb4
commit 71a8096221
3 changed files with 67 additions and 23 deletions

View File

@ -88,11 +88,38 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
data = request.DATA.copy()
data['owner'] = data.get('owner', request.user.email)
# Create Project
project_serialized = service.store_project(data)
if project_serialized is None:
if not project_serialized:
raise exc.BadRequest(service.get_errors())
# Create roles
roles_serialized = None
if "roles" in data:
roles_serialized = service.store_roles(project_serialized.object, data)
if not roles_serialized:
raise exc.BadRequest(_("We needed at least one role"))
# Create memberships
if "memberships" in data:
service.store_memberships(project_serialized.object, data)
try:
owner_membership = project_serialized.object.memberships.get(user=project_serialized.object.owner)
owner_membership.is_owner = True
owner_membership.save()
except Membership.DoesNotExist:
Membership.objects.create(
project=project_serialized.object,
email=project_serialized.object.owner.email,
user=project_serialized.object.owner,
role=project_serialized.object.roles.all().first(),
is_owner=True
)
# Create project values choicess
if "points" in data:
service.store_choices(project_serialized.object, data,
"points", serializers.PointsExportSerializer)
@ -127,6 +154,7 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
"severities" in data):
service.store_default_choices(project_serialized.object, data)
# Created custom attributes
if "userstorycustomattributes" in data:
service.store_custom_attributes(project_serialized.object, data,
"userstorycustomattributes",
@ -142,26 +170,12 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi
"issuecustomattributes",
serializers.IssueCustomAttributeExportSerializer)
if "roles" in data:
service.store_roles(project_serialized.object, data)
if "memberships" in data:
service.store_memberships(project_serialized.object, data)
if project_serialized.object.memberships.filter(user=project_serialized.object.owner).count() == 0:
if project_serialized.object.roles.all().count() > 0:
Membership.objects.create(
project=project_serialized.object,
email=project_serialized.object.owner.email,
user=project_serialized.object.owner,
role=project_serialized.object.roles.all().first(),
is_owner=True
)
# Is there any error?
errors = service.get_errors()
if errors:
raise exc.BadRequest(errors)
# Importer process is OK
response_data = project_serialized.data
response_data['id'] = project_serialized.object.id
headers = self.get_success_headers(response_data)

View File

@ -155,7 +155,10 @@ def store_role(project, role):
def store_roles(project, data):
results = []
for role in data.get("roles", []):
results.append(store_role(project, role))
serialized = store_role(project, role)
if serialized:
results.append(serialized)
return results

View File

@ -53,17 +53,17 @@ def test_valid_project_import_without_extra_data(client):
data = {
"name": "Imported project",
"description": "Imported project",
"roles": [{"name": "Role"}]
}
response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 201
response_data = json.loads(response.content.decode("utf-8"))
must_empty_children = [
"issues", "user_stories", "roles", "us_statuses", "wiki_pages", "priorities",
"issues", "user_stories", "us_statuses", "wiki_pages", "priorities",
"severities", "milestones", "points", "issue_types", "task_statuses",
"memberships", "issue_statuses", "wiki_links",
"issue_statuses", "wiki_links",
]
assert all(map(lambda x: len(response_data[x]) == 0, must_empty_children))
assert response_data["owner"] == user.email
@ -166,6 +166,22 @@ def test_valid_project_import_with_extra_data(client):
assert response_data["owner"] == user.email
def test_invalid_project_import_without_roles(client):
user = f.UserFactory.create()
client.login(user)
url = reverse("importer-list")
data = {
"name": "Imported project",
"description": "Imported project",
}
response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400
response_data = json.loads(response.content.decode("utf-8"))
assert len(response_data) == 2
assert Project.objects.filter(slug="imported-project").count() == 0
def test_invalid_project_import_with_extra_data(client):
user = f.UserFactory.create()
client.login(user)
@ -174,7 +190,10 @@ def test_invalid_project_import_with_extra_data(client):
data = {
"name": "Imported project",
"description": "Imported project",
"roles": [{}],
"roles": [{
"permissions": [],
"name": "Test"
}],
"us_statuses": [{}],
"severities": [{}],
"priorities": [{}],
@ -187,7 +206,7 @@ def test_invalid_project_import_with_extra_data(client):
response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400
response_data = json.loads(response.content.decode("utf-8"))
assert len(response_data) == 8
assert len(response_data) == 7
assert Project.objects.filter(slug="imported-project").count() == 0
@ -198,6 +217,10 @@ def test_valid_project_import_with_custom_attributes(client):
data = {
"name": "Imported project",
"description": "Imported project",
"roles": [{
"permissions": [],
"name": "Test"
}],
"userstorycustomattributes": [{
"name": "custom attribute example 1",
"description": "short description 1",
@ -234,6 +257,10 @@ def test_invalid_project_import_with_custom_attributes(client):
data = {
"name": "Imported project",
"description": "Imported project",
"roles": [{
"permissions": [],
"name": "Test"
}],
"userstorycustomattributes": [{ }],
"taskcustomattributes": [{ }],
"issuecustomattributes": [{ }]