class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) my_permissions = serializers.SerializerMethodField("get_my_permissions") i_am_owner = serializers.SerializerMethodField("get_i_am_owner") tags_colors = TagsColorsField(required=False) total_closed_milestones = serializers.SerializerMethodField( "get_total_closed_milestones") notify_level = serializers.SerializerMethodField("get_notify_level") class Meta: model = models.Project read_only_fields = ("created_date", "modified_date", "owner", "slug") exclude = ("last_us_ref", "last_task_ref", "last_issue_ref", "issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid") def get_my_permissions(self, obj): if "request" in self.context: return get_user_project_permissions(self.context["request"].user, obj) return [] def get_i_am_owner(self, obj): if "request" in self.context: return is_project_owner(self.context["request"].user, obj) return False def get_total_closed_milestones(self, obj): return obj.milestones.filter(closed=True).count() def get_notify_level(self, obj): return getattr(obj, "notify_level", None)
class ProjectSerializer(serializers.ModelSerializer): tags = PgArrayField(required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) stars = serializers.SerializerMethodField("get_stars_number") my_permissions = serializers.SerializerMethodField("get_my_permissions") i_am_owner = serializers.SerializerMethodField("get_i_am_owner") tags_colors = TagsColorsField(required=False) users = serializers.SerializerMethodField("get_users") total_closed_milestones = serializers.SerializerMethodField( "get_total_closed_milestones") class Meta: model = models.Project read_only_fields = ("created_date", "modified_date", "owner") exclude = ("last_us_ref", "last_task_ref", "last_issue_ref", "issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid") def get_stars_number(self, obj): # The "stars_count" attribute is attached in the get_queryset of the viewset. return getattr(obj, "stars_count", 0) def get_my_permissions(self, obj): if "request" in self.context: return get_user_project_permissions(self.context["request"].user, obj) return [] def get_i_am_owner(self, obj): if "request" in self.context: return is_project_owner(self.context["request"].user, obj) return False def get_users(self, obj): return UserSerializer(obj.members.all(), many=True).data def get_total_closed_milestones(self, obj): return obj.milestones.filter(closed=True).count() def validate_total_milestones(self, attrs, source): """ Check that total_milestones is not null, it's an optional parameter but not nullable in the model. """ value = attrs[source] if value is None: raise serializers.ValidationError( _("Total milestones must be major or equal to zero")) return attrs
class ProjectSerializer(WatchersValidator, LikedResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) my_permissions = serializers.SerializerMethodField("get_my_permissions") i_am_owner = serializers.SerializerMethodField("get_i_am_owner") tags_colors = TagsColorsField(required=False) total_closed_milestones = serializers.SerializerMethodField("get_total_closed_milestones") notify_level = serializers.SerializerMethodField("get_notify_level") class Meta: model = models.Project read_only_fields = ("created_date", "modified_date", "owner", "slug") exclude = ("last_us_ref", "last_task_ref", "last_issue_ref", "issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid") def get_my_permissions(self, obj): if "request" in self.context: return get_user_project_permissions(self.context["request"].user, obj) return [] def get_i_am_owner(self, obj): if "request" in self.context: return is_project_owner(self.context["request"].user, obj) return False def get_total_closed_milestones(self, obj): return obj.milestones.filter(closed=True).count() def get_notify_level(self, obj): return getattr(obj, "notify_level", None) def validate_total_milestones(self, attrs, source): """ Check that total_milestones is not null, it's an optional parameter but not nullable in the model. """ value = attrs[source] if value is None: raise serializers.ValidationError(_("Total milestones must be major or equal to zero")) return attrs
class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) my_permissions = serializers.SerializerMethodField("get_my_permissions") owner = UserBasicInfoSerializer(read_only=True) i_am_owner = serializers.SerializerMethodField("get_i_am_owner") i_am_admin = serializers.SerializerMethodField("get_i_am_admin") i_am_member = serializers.SerializerMethodField("get_i_am_member") tags = TagsField(default=[], required=False) tags_colors = TagsColorsField(required=False) notify_level = serializers.SerializerMethodField("get_notify_level") total_closed_milestones = serializers.SerializerMethodField("get_total_closed_milestones") total_watchers = serializers.SerializerMethodField("get_total_watchers") logo_small_url = serializers.SerializerMethodField("get_logo_small_url") logo_big_url = serializers.SerializerMethodField("get_logo_big_url") class Meta: model = models.Project read_only_fields = ("created_date", "modified_date", "slug", "blocked_code") exclude = ("logo", "last_us_ref", "last_task_ref", "last_issue_ref", "issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid", "transfer_token") def get_my_permissions(self, obj): if "request" in self.context: return get_user_project_permissions(self.context["request"].user, obj) return [] def get_i_am_owner(self, obj): if "request" in self.context: return is_project_owner(self.context["request"].user, obj) return False def get_i_am_admin(self, obj): if "request" in self.context: return is_project_admin(self.context["request"].user, obj) return False def get_i_am_member(self, obj): if "request" in self.context: user = self.context["request"].user if not user.is_anonymous() and user.cached_membership_for_project(obj): return True return False def get_total_closed_milestones(self, obj): # The "closed_milestone" attribute can be attached in the get_queryset method of the viewset. qs_closed_milestones = getattr(obj, "closed_milestones", None) if qs_closed_milestones is not None: return len(qs_closed_milestones) return obj.milestones.filter(closed=True).count() def get_notify_level(self, obj): if "request" in self.context: user = self.context["request"].user return user.is_authenticated() and user.get_notify_level(obj) return None def get_total_watchers(self, obj): # The "valid_notify_policies" attribute can be attached in the get_queryset method of the viewset. qs_valid_notify_policies = getattr(obj, "valid_notify_policies", None) if qs_valid_notify_policies is not None: return len(qs_valid_notify_policies) return obj.notify_policies.exclude(notify_level=NotifyLevel.none).count() def get_logo_small_url(self, obj): return services.get_logo_small_thumbnail_url(obj) def get_logo_big_url(self, obj): return services.get_logo_big_thumbnail_url(obj)