class MilestoneExportSerializer(WatcheableObjectModelSerializer): owner = UserRelatedField(required=False) modified_date = serializers.DateTimeField(required=False) estimated_start = serializers.DateField(required=False) estimated_finish = serializers.DateField(required=False) def __init__(self, *args, **kwargs): project = kwargs.pop('project', None) super(MilestoneExportSerializer, self).__init__(*args, **kwargs) if project: self.project = project def validate_name(self, attrs, source): """ Check the milestone name is not duplicated in the project """ name = attrs[source] qs = self.project.milestones.filter(name=name) if qs.exists(): raise serializers.ValidationError( _("Name duplicated for the project")) return attrs class Meta: model = milestones_models.Milestone exclude = ('id', 'project')
class AttachmentExportValidator(validators.ModelValidator): owner = UserRelatedField(required=False) attached_file = FileField() modified_date = serializers.DateTimeField(required=False) class Meta: model = attachments_models.Attachment exclude = ("id", "content_type", "object_id", "project")
class TaskExportValidator(WatcheableObjectModelValidatorMixin): owner = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") user_story = ProjectRelatedField(slug_field="ref", required=False) milestone = ProjectRelatedField(slug_field="name", required=False) assigned_to = UserRelatedField(required=False) modified_date = serializers.DateTimeField(required=False) due_date = serializers.DateTimeField(required=False) class Meta: model = tasks_models.Task exclude = ('id', 'project') def custom_attributes_queryset(self, project): if project.id not in _custom_tasks_attributes_cache: _custom_tasks_attributes_cache[project.id] = list(project.taskcustomattributes.all().values('id', 'name')) return _custom_tasks_attributes_cache[project.id]
class WikiPageExportValidator(WatcheableObjectModelValidatorMixin): owner = UserRelatedField(required=False) last_modifier = UserRelatedField(required=False) modified_date = serializers.DateTimeField(required=False) class Meta: model = wiki_models.WikiPage exclude = ('id', 'project')
class AttachmentExportSerializer(serializers.ModelSerializer): owner = UserRelatedField(required=False) attached_file = FileField() modified_date = serializers.DateTimeField(required=False) class Meta: model = attachments_models.Attachment exclude = ('id', 'content_type', 'object_id', 'project')
class WikiPageExportSerializer(HistoryExportSerializerMixin, AttachmentExportSerializerMixin, WatcheableObjectModelSerializer): owner = UserRelatedField(required=False) last_modifier = UserRelatedField(required=False) modified_date = serializers.DateTimeField(required=False) class Meta: model = wiki_models.WikiPage exclude = ('id', 'project')
class IssueExportValidator(WatcheableObjectModelValidatorMixin): owner = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") assigned_to = UserRelatedField(required=False) priority = ProjectRelatedField(slug_field="name") severity = ProjectRelatedField(slug_field="name") type = ProjectRelatedField(slug_field="name") milestone = ProjectRelatedField(slug_field="name", required=False) modified_date = serializers.DateTimeField(required=False) due_date = serializers.DateTimeField(required=False) class Meta: model = issues_models.Issue exclude = ("id", "project") def custom_attributes_queryset(self, project): if project.id not in _custom_issues_attributes_cache: _custom_issues_attributes_cache[project.id] = list( project.issuecustomattributes.all().values("id", "name")) return _custom_issues_attributes_cache[project.id]
class UserStoryExportValidator(WatcheableObjectModelValidatorMixin): role_points = RolePointsExportValidator(many=True, required=False) owner = UserRelatedField(required=False) assigned_to = UserRelatedField(required=False) assigned_users = UserRelatedField(many=True, required=False) status = ProjectRelatedField(slug_field="name") milestone = ProjectRelatedField(slug_field="name", required=False) modified_date = serializers.DateTimeField(required=False) generated_from_issue = ProjectRelatedField(slug_field="ref", required=False) due_date = serializers.DateTimeField(required=False) class Meta: model = userstories_models.UserStory exclude = ('id', 'project', 'points', 'tasks') def custom_attributes_queryset(self, project): if project.id not in _custom_userstories_attributes_cache: _custom_userstories_attributes_cache[project.id] = list( project.userstorycustomattributes.all().values('id', 'name')) return _custom_userstories_attributes_cache[project.id]
class HistoryExportSerializer(serializers.ModelSerializer): user = HistoryUserField() diff = HistoryDiffField(required=False) snapshot = JsonField(required=False) values = HistoryValuesField(required=False) comment = CommentField(required=False) delete_comment_date = serializers.DateTimeField(required=False) delete_comment_user = HistoryUserField(required=False) class Meta: model = history_models.HistoryEntry exclude = ("id", "comment_html", "key")
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 TaskExportSerializer(CustomAttributesValuesExportSerializerMixin, HistoryExportSerializerMixin, AttachmentExportSerializerMixin, WatcheableObjectModelSerializer): owner = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") user_story = ProjectRelatedField(slug_field="ref", required=False) milestone = ProjectRelatedField(slug_field="name", required=False) assigned_to = UserRelatedField(required=False) modified_date = serializers.DateTimeField(required=False) class Meta: model = tasks_models.Task exclude = ('id', 'project') def custom_attributes_queryset(self, project): return project.taskcustomattributes.all()
class UserStoryExportSerializer(CustomAttributesValuesExportSerializerMixin, HistoryExportSerializerMixin, AttachmentExportSerializerMixin, WatcheableObjectModelSerializer): role_points = RolePointsExportSerializer(many=True, required=False) owner = UserRelatedField(required=False) assigned_to = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") milestone = ProjectRelatedField(slug_field="name", required=False) modified_date = serializers.DateTimeField(required=False) generated_from_issue = ProjectRelatedField(slug_field="ref", required=False) class Meta: model = userstories_models.UserStory exclude = ('id', 'project', 'points', 'tasks') def custom_attributes_queryset(self, project): return project.userstorycustomattributes.all()
class EpicExportValidator(WatcheableObjectModelValidatorMixin): owner = UserRelatedField(required=False) assigned_to = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") modified_date = serializers.DateTimeField(required=False) user_stories = EpicRelatedUserStoryExportValidator(many=True, required=False) class Meta: model = epics_models.Epic exclude = ('id', 'project') def custom_attributes_queryset(self, project): if project.id not in _custom_epics_attributes_cache: _custom_epics_attributes_cache[project.id] = list( project.epiccustomattributes.all().values('id', 'name')) return _custom_epics_attributes_cache[project.id]
class IssueExportSerializer(CustomAttributesValuesExportSerializerMixin, HistoryExportSerializerMixin, AttachmentExportSerializerMixin, WatcheableObjectModelSerializer): owner = UserRelatedField(required=False) status = ProjectRelatedField(slug_field="name") assigned_to = UserRelatedField(required=False) priority = ProjectRelatedField(slug_field="name") severity = ProjectRelatedField(slug_field="name") type = ProjectRelatedField(slug_field="name") milestone = ProjectRelatedField(slug_field="name", required=False) votes = serializers.SerializerMethodField("get_votes") modified_date = serializers.DateTimeField(required=False) class Meta: model = issues_models.Issue exclude = ('id', 'project') def get_votes(self, obj): return [x.email for x in votes_service.get_voters(obj)] def custom_attributes_queryset(self, project): return project.issuecustomattributes.all()
class HistoryExportValidator(validators.ModelValidator): user = HistoryUserField() diff = HistoryDiffField(required=False) snapshot = HistorySnapshotField(required=False) values = HistoryValuesField(required=False) comment = CommentField(required=False) delete_comment_date = serializers.DateTimeField(required=False) delete_comment_user = HistoryUserField(required=False) class Meta: model = history_models.HistoryEntry exclude = ("id", "comment_html", "key", "project") def restore_object(self, attrs, instance=None): snapshot = attrs["snapshot"] statuses = self.context.get("statuses", {}) if "status" in snapshot: status_id = statuses.get(snapshot["status"], None) attrs["snapshot"]["status"] = status_id instance = super(HistoryExportValidator, self).restore_object(attrs, instance) return instance
class IssueCustomAttributeExportSerializer(serializers.ModelSerializer): modified_date = serializers.DateTimeField(required=False) class Meta: model = custom_attributes_models.IssueCustomAttribute exclude = ('id', 'project')
class IssueCustomAttributeExportValidator(validators.ModelValidator): modified_date = serializers.DateTimeField(required=False) class Meta: model = custom_attributes_models.IssueCustomAttribute exclude = ("id", "project")
class HighLightedContentSerializer(serializers.Serializer): type = serializers.CharField() id = serializers.IntegerField() ref = serializers.IntegerField() slug = serializers.CharField() name = serializers.CharField() subject = serializers.CharField() description = serializers.SerializerMethodField("get_description") assigned_to = serializers.IntegerField() status = serializers.CharField() status_color = serializers.CharField() tags_colors = serializers.SerializerMethodField("get_tags_color") created_date = serializers.DateTimeField() is_private = serializers.SerializerMethodField("get_is_private") logo_small_url = serializers.SerializerMethodField("get_logo_small_url") project = serializers.SerializerMethodField("get_project") project_name = serializers.SerializerMethodField("get_project_name") project_slug = serializers.SerializerMethodField("get_project_slug") project_is_private = serializers.SerializerMethodField( "get_project_is_private") project_blocked_code = serializers.CharField() assigned_to_username = serializers.CharField() assigned_to_full_name = serializers.CharField() assigned_to_photo = serializers.SerializerMethodField("get_photo") is_watcher = serializers.SerializerMethodField("get_is_watcher") total_watchers = serializers.IntegerField() def __init__(self, *args, **kwargs): # Don't pass the extra ids args up to the superclass self.user_watching = kwargs.pop("user_watching", {}) # Instantiate the superclass normally super().__init__(*args, **kwargs) def _none_if_project(self, obj, property): type = obj.get("type", "") if type == "project": return None return obj.get(property) def _none_if_not_project(self, obj, property): type = obj.get("type", "") if type != "project": return None return obj.get(property) def get_project(self, obj): return self._none_if_project(obj, "project") def get_is_private(self, obj): return self._none_if_not_project(obj, "project_is_private") def get_project_name(self, obj): return self._none_if_project(obj, "project_name") def get_description(self, obj): return self._none_if_not_project(obj, "description") def get_project_slug(self, obj): return self._none_if_project(obj, "project_slug") def get_project_is_private(self, obj): return self._none_if_project(obj, "project_is_private") def get_logo_small_url(self, obj): logo = self._none_if_not_project(obj, "logo") if logo: return get_thumbnail_url(logo, settings.THN_LOGO_SMALL) return None def get_photo(self, obj): type = obj.get("type", "") if type == "project": return None UserData = namedtuple("UserData", ["photo", "email"]) user_data = UserData(photo=obj["assigned_to_photo"], email=obj.get("assigned_to_email") or "") return get_photo_or_gravatar_url(user_data) def get_tags_color(self, obj): tags = obj.get("tags", []) tags = tags if tags is not None else [] tags_colors = obj.get("tags_colors", []) tags_colors = tags_colors if tags_colors is not None else [] return [{ "name": tc[0], "color": tc[1] } for tc in tags_colors if tc[0] in tags] def get_is_watcher(self, obj): return obj["id"] in self.user_watching.get(obj["type"], [])
class TaskCustomAttributeExportValidator(validators.ModelValidator): modified_date = serializers.DateTimeField(required=False) class Meta: model = custom_attributes_models.TaskCustomAttribute exclude = ('id', 'project')