Merge pull request #363 from taigaio/us/2911/mixin_users_with_memberships_in_project_detail_serializer
US #2911: Mixin 'users', 'members' and 'memberships' in ProjectDetailSerializerremotes/origin/enhancement/email-actions
commit
109d3e19f4
|
@ -2,11 +2,13 @@
|
||||||
|
|
||||||
|
|
||||||
## 1.9.0 ??? (unreleased)
|
## 1.9.0 ??? (unreleased)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
- Add a "field type" property for custom fields: 'text' and 'multiline text' right now (thanks to [@artlepool](https://github.com/artlepool))
|
- Add a "field type" property for custom fields: 'text' and 'multiline text' right now (thanks to [@artlepool](https://github.com/artlepool))
|
||||||
|
- Allow multiple actions in the commit messages.
|
||||||
|
|
||||||
### Misc
|
### Misc
|
||||||
- Allow multiple actions in the commit messages.
|
- API: Mixin fields 'users', 'members' and 'memberships' in ProjectDetailSerializer
|
||||||
- Lots of small and not so small bugfixes.
|
- Lots of small and not so small bugfixes.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -272,21 +272,6 @@ class MembershipAdminSerializer(MembershipSerializer):
|
||||||
exclude = ("token",)
|
exclude = ("token",)
|
||||||
|
|
||||||
|
|
||||||
class ProjectMembershipSerializer(serializers.ModelSerializer):
|
|
||||||
role_name = serializers.CharField(source='role.name', required=False, i18n=True)
|
|
||||||
full_name = serializers.CharField(source='user.get_full_name', required=False)
|
|
||||||
username = serializers.CharField(source='user.username', required=False)
|
|
||||||
color = serializers.CharField(source='user.color', required=False)
|
|
||||||
is_active = serializers.BooleanField(source='user.is_active', required=False)
|
|
||||||
photo = serializers.SerializerMethodField("get_photo")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = models.Membership
|
|
||||||
|
|
||||||
def get_photo(self, project):
|
|
||||||
return get_photo_or_gravatar_url(project.user)
|
|
||||||
|
|
||||||
|
|
||||||
class MemberBulkSerializer(RoleExistsValidator, serializers.Serializer):
|
class MemberBulkSerializer(RoleExistsValidator, serializers.Serializer):
|
||||||
email = serializers.EmailField()
|
email = serializers.EmailField()
|
||||||
role_id = serializers.IntegerField()
|
role_id = serializers.IntegerField()
|
||||||
|
@ -298,6 +283,23 @@ class MembersBulkSerializer(ProjectExistsValidator, serializers.Serializer):
|
||||||
invitation_extra_text = serializers.CharField(required=False, max_length=255)
|
invitation_extra_text = serializers.CharField(required=False, max_length=255)
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectMemberSerializer(serializers.ModelSerializer):
|
||||||
|
id = serializers.IntegerField(source="user.id", read_only=True)
|
||||||
|
username = serializers.CharField(source='user.username', read_only=True)
|
||||||
|
full_name = serializers.CharField(source='user.full_name', read_only=True)
|
||||||
|
full_name_display = serializers.CharField(source='user.get_full_name', read_only=True)
|
||||||
|
color = serializers.CharField(source='user.color', read_only=True)
|
||||||
|
photo = serializers.SerializerMethodField("get_photo")
|
||||||
|
is_active = serializers.BooleanField(source='user.is_active', read_only=True)
|
||||||
|
role_name = serializers.CharField(source='role.name', read_only=True, i18n=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Membership
|
||||||
|
|
||||||
|
def get_photo(self, membership):
|
||||||
|
return get_photo_or_gravatar_url(membership.user)
|
||||||
|
|
||||||
|
|
||||||
######################################################
|
######################################################
|
||||||
## Projects
|
## Projects
|
||||||
######################################################
|
######################################################
|
||||||
|
@ -365,15 +367,14 @@ class ProjectDetailSerializer(ProjectSerializer):
|
||||||
many=True, required=False)
|
many=True, required=False)
|
||||||
|
|
||||||
roles = ProjectRoleSerializer(source="roles", many=True, read_only=True)
|
roles = ProjectRoleSerializer(source="roles", many=True, read_only=True)
|
||||||
users = UserSerializer(source="members", many=True, read_only=True)
|
members = serializers.SerializerMethodField(method_name="get_members")
|
||||||
memberships = serializers.SerializerMethodField(method_name="get_memberships")
|
|
||||||
|
|
||||||
def get_memberships(self, obj):
|
def get_members(self, obj):
|
||||||
qs = obj.memberships.filter(user__isnull=False)
|
qs = obj.memberships.filter(user__isnull=False)
|
||||||
qs = qs.extra(select={"complete_user_name":"concat(full_name, username)"})
|
qs = qs.extra(select={"complete_user_name":"concat(full_name, username)"})
|
||||||
qs = qs.order_by("complete_user_name")
|
qs = qs.order_by("complete_user_name")
|
||||||
qs = qs.select_related("role", "user")
|
qs = qs.select_related("role", "user")
|
||||||
serializer = ProjectMembershipSerializer(qs, many=True)
|
serializer = ProjectMemberSerializer(qs, many=True)
|
||||||
return serializer.data
|
return serializer.data
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue