Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • arkindex/backend
1 result
Show changes
Commits on Source (5)
......@@ -11,7 +11,7 @@ include:
# For jobs that run backend scripts directly
.backend-setup:
image: registry.gitlab.com/arkindex/backend/base:rq
image: registry.gitlab.com/arkindex/backend/base:django-3.1.4
cache:
paths:
......
FROM registry.gitlab.com/arkindex/backend/base:rq as build
FROM registry.gitlab.com/arkindex/backend/base:django-3.1.4 as build
RUN mkdir build
ADD . build
RUN cd build && python3 setup.py sdist
FROM registry.gitlab.com/arkindex/backend/base:rq
FROM registry.gitlab.com/arkindex/backend/base:django-3.1.4
ARG COMMON_BRANCH=master
ARG COMMON_ID=9855787
ARG PONOS_BRANCH=master
......
This diff is collapsed.
# Generated by Django 3.1.3 on 2020-11-24 13:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0007_user_display_name'),
]
operations = [
migrations.AlterField(
model_name='membership',
name='level',
field=models.PositiveIntegerField(help_text='User privilege level.'),
),
migrations.AlterUniqueTogether(
name='membership',
unique_together={('user', 'group')},
),
]
# Generated by Django 3.1.3 on 2020-11-24 13:30
import uuid
import django
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0007_user_display_name'),
]
operations = [
# Drop membership table and re-create it
migrations.DeleteModel(
name='Membership',
),
migrations.RemoveField(
model_name='group',
name='users',
),
migrations.CreateModel(
name='Membership',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('level', models.PositiveIntegerField(help_text='User privilege level.', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)])),
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to='users.group')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('user', 'group')},
},
),
migrations.AddField(
model_name='group',
name='users',
field=models.ManyToManyField(related_name='groups', through='users.Membership', to=settings.AUTH_USER_MODEL),
),
]
import uuid
from django.contrib.auth.models import AbstractBaseUser
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django_rq.queues import get_queue
from django_rq.settings import QUEUES
......@@ -97,9 +98,16 @@ class Group(models.Model):
class Membership(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='memberships')
group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='memberships')
level = models.PositiveIntegerField(help_text='User privilege level.')
level = models.PositiveIntegerField(
help_text='User privilege level.',
validators=[
MinValueValidator(1),
MaxValueValidator(100)
]
)
class Meta:
unique_together = (
......
......@@ -288,9 +288,9 @@ class MemberSerializer(MembershipSerializer):
"""
Serialize the user of a group with its member privilege level
"""
id = serializers.IntegerField(read_only=True)
email = serializers.EmailField(source='user.email')
display_name = serializers.StringRelatedField(source='user.display_name', read_only=True)
level = serializers.IntegerField(min_value=0, max_value=100)
class Meta(MembershipSerializer.Meta):
fields = (
......
......@@ -140,17 +140,17 @@ class TestMembership(FixtureAPITestCase):
{
'display_name': 'Test user',
'email': admin_member.user.email,
'id': admin_member.id,
'id': str(admin_member.id),
'level': Group.ADMIN_LEVEL
}, {
'display_name': 'Test user read',
'email': read_member.user.email,
'id': read_member.id,
'id': str(read_member.id),
'level': read_member.level
}, {
'display_name': 'Test user write',
'email': write_member.user.email,
'id': write_member.id,
'id': str(write_member.id),
'level': write_member.level
}
]
......@@ -196,7 +196,7 @@ class TestMembership(FixtureAPITestCase):
payload = {
'name': 'Renamed group',
'public': True,
'id': 1337,
'id': uuid.uuid4(),
'members_count': 42
}
self.client.force_login(self.user)
......@@ -274,7 +274,7 @@ class TestMembership(FixtureAPITestCase):
'name': 'Another group',
'public': False
},
'id': new_group_member.id,
'id': str(new_group_member.id),
'level': new_group_member.level
},
{
......@@ -285,7 +285,7 @@ class TestMembership(FixtureAPITestCase):
'name': self.group.name,
'public': self.group.public
},
'id': member.id,
'id': str(member.id),
'level': member.level
}
]
......@@ -374,6 +374,24 @@ class TestMembership(FixtureAPITestCase):
'level': ['This field is required.']
})
def test_add_member_level_validation(self):
"""
Level should be an integer between 0 and 100 (included)
"""
checks = (
({'level': 101}, {'level': ['Ensure this value is less than or equal to 100.']}),
({'level': -1}, {'level': ['Ensure this value is greater than or equal to 0.']})
)
self.client.force_login(self.user)
for payload, error in checks:
with self.assertNumQueries(4):
response = self.client.post(
reverse('api:group-members', kwargs={'pk': str(self.group.id)}),
{'email': self.admin.email, **payload}
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(response.json(), error)
def test_add_member_by_email(self):
"""
Adds a new member referenced by its email
......@@ -390,6 +408,6 @@ class TestMembership(FixtureAPITestCase):
self.assertDictEqual(response.json(), {
'display_name': user.display_name,
'email': user.email,
'id': membership.id,
'id': str(membership.id),
'level': 10
})
boto3==1.15.16
cryptography>=3.1
Django==3.1.3
Django==3.1.4
elasticsearch==6.8.1
lxml==4.5.2
psycopg2-binary==2.8.6