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 ProjectValidator(validators.ModelValidator): anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) tags = TagsField(default=[], required=False) class Meta: model = models.Project read_only_fields = ("created_date", "modified_date", "slug", "blocked_code", "owner")
class ProjectExportValidator(WatcheableObjectModelValidatorMixin): logo = FileField(required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) modified_date = serializers.DateTimeField(required=False) roles = RoleExportValidator(many=True, required=False) owner = UserRelatedField(required=False) memberships = MembershipExportValidator(many=True, required=False) points = PointsExportValidator(many=True, required=False) us_statuses = UserStoryStatusExportValidator(many=True, required=False) task_statuses = TaskStatusExportValidator(many=True, required=False) issue_types = IssueTypeExportValidator(many=True, required=False) issue_statuses = IssueStatusExportValidator(many=True, required=False) priorities = PriorityExportValidator(many=True, required=False) severities = SeverityExportValidator(many=True, required=False) swimlanes = SwimlaneExportValidator(many=True, required=False) tags_colors = JSONField(required=False) creation_template = serializers.SlugRelatedField(slug_field="slug", required=False) default_points = serializers.SlugRelatedField(slug_field="name", required=False) default_us_status = serializers.SlugRelatedField(slug_field="name", required=False) default_task_status = serializers.SlugRelatedField(slug_field="name", required=False) default_priority = serializers.SlugRelatedField(slug_field="name", required=False) default_severity = serializers.SlugRelatedField(slug_field="name", required=False) default_issue_status = serializers.SlugRelatedField(slug_field="name", required=False) default_issue_type = serializers.SlugRelatedField(slug_field="name", required=False) default_swimlane = serializers.SlugRelatedField(slug_field="name", required=False) userstorycustomattributes = UserStoryCustomAttributeExportValidator( many=True, required=False) taskcustomattributes = TaskCustomAttributeExportValidator(many=True, required=False) issuecustomattributes = IssueCustomAttributeExportValidator(many=True, required=False) user_stories = UserStoryExportValidator(many=True, required=False) tasks = TaskExportValidator(many=True, required=False) milestones = MilestoneExportValidator(many=True, required=False) issues = IssueExportValidator(many=True, required=False) wiki_links = WikiLinkExportValidator(many=True, required=False) wiki_pages = WikiPageExportValidator(many=True, required=False) class Meta: model = projects_models.Project exclude = ('id', 'members')
class ProjectExportSerializer(WatcheableObjectModelSerializer): logo = FileField(required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) modified_date = serializers.DateTimeField(required=False) roles = RoleExportSerializer(many=True, required=False) owner = UserRelatedField(required=False) memberships = MembershipExportSerializer(many=True, required=False) points = PointsExportSerializer(many=True, required=False) us_statuses = UserStoryStatusExportSerializer(many=True, required=False) task_statuses = TaskStatusExportSerializer(many=True, required=False) issue_types = IssueTypeExportSerializer(many=True, required=False) issue_statuses = IssueStatusExportSerializer(many=True, required=False) priorities = PriorityExportSerializer(many=True, required=False) severities = SeverityExportSerializer(many=True, required=False) tags_colors = JsonField(required=False) default_points = serializers.SlugRelatedField(slug_field="name", required=False) default_us_status = serializers.SlugRelatedField(slug_field="name", required=False) default_task_status = serializers.SlugRelatedField(slug_field="name", required=False) default_priority = serializers.SlugRelatedField(slug_field="name", required=False) default_severity = serializers.SlugRelatedField(slug_field="name", required=False) default_issue_status = serializers.SlugRelatedField(slug_field="name", required=False) default_issue_type = serializers.SlugRelatedField(slug_field="name", required=False) userstorycustomattributes = UserStoryCustomAttributeExportSerializer( many=True, required=False) taskcustomattributes = TaskCustomAttributeExportSerializer(many=True, required=False) issuecustomattributes = IssueCustomAttributeExportSerializer( many=True, required=False) user_stories = UserStoryExportSerializer(many=True, required=False) tasks = TaskExportSerializer(many=True, required=False) milestones = MilestoneExportSerializer(many=True, required=False) issues = IssueExportSerializer(many=True, required=False) wiki_links = WikiLinkExportSerializer(many=True, required=False) wiki_pages = WikiPageExportSerializer(many=True, required=False) timeline = serializers.SerializerMethodField("get_timeline") class Meta: model = projects_models.Project exclude = ('id', 'creation_template', 'members') def get_timeline(self, obj): timeline_qs = timeline_service.get_project_timeline(obj) return TimelineExportSerializer(timeline_qs, many=True).data
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 IssueSerializer(WatchersValidator, serializers.ModelSerializer): tags = TagsField(required=False) external_reference = PgArrayField(required=False) is_closed = serializers.Field(source="is_closed") comment = serializers.SerializerMethodField("get_comment") generated_user_stories = serializers.SerializerMethodField("get_generated_user_stories") blocked_note_html = serializers.SerializerMethodField("get_blocked_note_html") description_html = serializers.SerializerMethodField("get_description_html") votes = serializers.SerializerMethodField("get_votes_number") class Meta: model = models.Issue read_only_fields = ('id', 'ref', 'created_date', 'modified_date') def get_comment(self, obj): # NOTE: This method and field is necessary to historical comments work return "" def get_generated_user_stories(self, obj): return obj.generated_user_stories.values("id", "ref", "subject") def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) def get_description_html(self, obj): return mdrender(obj.project, obj.description) def get_votes_number(self, obj): # The "votes_count" attribute is attached in the get_queryset of the viewset. return getattr(obj, "votes_count", 0)
class IssueSerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(required=False) external_reference = PgArrayField(required=False) is_closed = serializers.Field(source="is_closed") comment = serializers.SerializerMethodField("get_comment") generated_user_stories = serializers.SerializerMethodField("get_generated_user_stories") blocked_note_html = serializers.SerializerMethodField("get_blocked_note_html") description_html = serializers.SerializerMethodField("get_description_html") status_extra_info = BasicIssueStatusSerializer(source="status", required=False, read_only=True) assigned_to_extra_info = UserBasicInfoSerializer(source="assigned_to", required=False, read_only=True) owner_extra_info = UserBasicInfoSerializer(source="owner", required=False, read_only=True) class Meta: model = models.Issue read_only_fields = ('id', 'ref', 'created_date', 'modified_date') def get_comment(self, obj): # NOTE: This method and field is necessary to historical comments work return "" def get_generated_user_stories(self, obj): return [{ "id": us.id, "ref": us.ref, "subject": us.subject, } for us in obj.generated_user_stories.all()] def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) def get_description_html(self, obj): return mdrender(obj.project, obj.description)
class TaskSerializer(WatchersValidator, serializers.ModelSerializer): tags = TagsField(required=False, default=[]) external_reference = PgArrayField(required=False) comment = serializers.SerializerMethodField("get_comment") milestone_slug = serializers.SerializerMethodField("get_milestone_slug") blocked_note_html = serializers.SerializerMethodField( "get_blocked_note_html") description_html = serializers.SerializerMethodField( "get_description_html") is_closed = serializers.SerializerMethodField("get_is_closed") class Meta: model = models.Task read_only_fields = ('id', 'ref', 'created_date', 'modified_date') def get_comment(self, obj): return "" def get_milestone_slug(self, obj): if obj.milestone: return obj.milestone.slug else: return None def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) def get_description_html(self, obj): return mdrender(obj.project, obj.description) def get_is_closed(self, obj): return obj.status.is_closed
class RoleValidator(validators.ModelValidator): permissions = PgArrayField(required=False) class Meta: model = Role fields = ('id', 'name', 'permissions', 'computable', 'project', 'order') i18n_fields = ("name",)
class TaskSerializer(WatchersValidator, VoteResourceSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsAndTagsColorsField(default=[], required=False) external_reference = PgArrayField(required=False) comment = serializers.SerializerMethodField("get_comment") milestone_slug = serializers.SerializerMethodField("get_milestone_slug") blocked_note_html = serializers.SerializerMethodField("get_blocked_note_html") description_html = serializers.SerializerMethodField("get_description_html") is_closed = serializers.SerializerMethodField("get_is_closed") status_extra_info = BasicTaskStatusSerializerSerializer(source="status", required=False, read_only=True) assigned_to_extra_info = UserBasicInfoSerializer(source="assigned_to", required=False, read_only=True) owner_extra_info = UserBasicInfoSerializer(source="owner", required=False, read_only=True) class Meta: model = models.Task read_only_fields = ('id', 'ref', 'created_date', 'modified_date', 'owner') def get_comment(self, obj): return "" def get_milestone_slug(self, obj): if obj.milestone: return obj.milestone.slug else: return None def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) def get_description_html(self, obj): return mdrender(obj.project, obj.description) def get_is_closed(self, obj): return obj.status is not None and obj.status.is_closed
class RoleValidator(validators.ModelValidator): permissions = PgArrayField(required=False) class Meta: model = Role fields = ("id", "name", "permissions", "computable", "project", "order") i18n_fields = ("name", )
class UserStorySerializer(WatchersValidator, serializers.ModelSerializer): tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) points = RolePointsField(source="role_points", required=False) total_points = serializers.SerializerMethodField("get_total_points") comment = serializers.SerializerMethodField("get_comment") milestone_slug = serializers.SerializerMethodField("get_milestone_slug") milestone_name = serializers.SerializerMethodField("get_milestone_name") origin_issue = serializers.SerializerMethodField("get_origin_issue") blocked_note_html = serializers.SerializerMethodField( "get_blocked_note_html") description_html = serializers.SerializerMethodField( "get_description_html") status_extra_info = BasicUserStoryStatusSerializer(source="status", required=False, read_only=True) assigned_to_extra_info = UserBasicInfoSerializer(source="assigned_to", required=False, read_only=True) class Meta: model = models.UserStory depth = 0 read_only_fields = ('created_date', 'modified_date') def get_total_points(self, obj): return obj.get_total_points() def get_comment(self, obj): # NOTE: This method and field is necessary to historical comments work return "" def get_milestone_slug(self, obj): if obj.milestone: return obj.milestone.slug else: return None def get_milestone_name(self, obj): if obj.milestone: return obj.milestone.name else: return None def get_origin_issue(self, obj): if obj.generated_from_issue: return { "id": obj.generated_from_issue.id, "ref": obj.generated_from_issue.ref, "subject": obj.generated_from_issue.subject, } return None def get_blocked_note_html(self, obj): return mdrender(obj.project, obj.blocked_note) def get_description_html(self, obj): return mdrender(obj.project, obj.description)
class TaskValidator(WatchersValidator, EditableWatchedResourceSerializer, validators.ModelValidator): tags = TagsAndTagsColorsField(default=[], required=False) external_reference = PgArrayField(required=False) class Meta: model = models.Task read_only_fields = ('id', 'ref', 'created_date', 'modified_date', 'owner')
class RoleSerializer(serializers.ModelSerializer): members_count = serializers.SerializerMethodField("get_members_count") permissions = PgArrayField(required=False) class Meta: model = Role fields = ('id', 'name', 'permissions', 'computable', 'project', 'order', 'members_count') i18n_fields = ("name",) def get_members_count(self, obj): return obj.memberships.count()
class RoleSerializer(serializers.LightSerializer): id = Field() name = Field() computable = Field() project = Field(attr="project_id") order = Field() members_count = MethodField() permissions = PgArrayField(required=False) def get_members_count(self, obj): return obj.memberships.count()
class UserStoryValidator(AssignedToValidator, WatchersValidator, EditableWatchedResourceSerializer, validators.ModelValidator): tags = TagsAndTagsColorsField(default=[], required=False) external_reference = PgArrayField(required=False) points = RolePointsField(source="role_points", required=False) tribe_gig = PickledObjectField(required=False) class Meta: model = models.UserStory depth = 0 read_only_fields = ('id', 'ref', 'created_date', 'modified_date', 'owner')
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 EpicValidator( AssignedToValidator, WatchersValidator, EditableWatchedResourceSerializer, validators.ModelValidator, ): tags = TagsAndTagsColorsField(default=[], required=False) external_reference = PgArrayField(required=False) class Meta: model = models.Epic read_only_fields = ("id", "ref", "created_date", "modified_date", "owner")
class UserStorySerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) owner = UserSerializer() assigned_to = UserSerializer() points = PointSerializer(many=True) class Meta: model = us_models.UserStory exclude = ("backlog_order", "sprint_order", "kanban_order", "version") def custom_attributes_queryset(self, project): return project.userstorycustomattributes.all()
class UserStorySerializer(CustomAttributesValuesWebhookSerializerMixin, EditableWatchedResourceModelSerializer, serializers.ModelSerializer): permalink = serializers.SerializerMethodField("get_permalink") tags = TagsField(default=[], required=False) external_reference = PgArrayField(required=False) project = ProjectSerializer() owner = UserSerializer() assigned_to = UserSerializer() points = RolePointsSerializer(source="role_points", many=True) status = UserStoryStatusSerializer() milestone = MilestoneSerializer() class Meta: model = us_models.UserStory exclude = ("backlog_order", "sprint_order", "kanban_order", "version", "total_watchers", "is_watcher") def get_permalink(self, obj): return resolve_front_url("userstory", obj.project.slug, obj.ref) def custom_attributes_queryset(self, project): return project.userstorycustomattributes.all()
class RoleExportSerializer(serializers.ModelSerializer): permissions = PgArrayField(required=False) class Meta: model = users_models.Role exclude = ('id', 'project')
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)
class RoleExportValidator(validators.ModelValidator): permissions = PgArrayField(required=False) class Meta: model = users_models.Role exclude = ('id', 'project')