class DueDateSerializerMixin(serializers.LightSerializer): due_date = Field() due_date_reason = Field() due_date_status = MethodField() THRESHOLD = 14 def get_due_date_status(self, obj): if obj.due_date is None: return 'not_set' elif obj.status and obj.status.is_closed: return 'no_longer_applicable' elif timezone.now().date() > obj.due_date: return 'past_due' elif (timezone.now().date() + dt.timedelta(days=self.THRESHOLD)) >= obj.due_date: return 'due_soon' else: return 'set'
class UserStorySearchResultsSerializer(serializers.LightSerializer): id = Field() ref = Field() subject = Field() status = Field(attr="status_id") total_points = MethodField() milestone_name = MethodField() milestone_slug = MethodField() def get_milestone_name(self, obj): return obj.milestone.name if obj.milestone else None def get_milestone_slug(self, obj): return obj.milestone.slug if obj.milestone else None def get_total_points(self, obj): assert hasattr(obj, "total_points_attr"), \ "instance must have a total_points_attr attribute" return obj.total_points_attr
class IssueExportSerializer(CustomAttributesValuesExportSerializerMixin, HistoryExportSerializerMixin, AttachmentExportSerializerMixin, WatcheableObjectLightSerializerMixin, RelatedExportSerializer): owner = UserRelatedField() status = SlugRelatedField(slug_field="name") assigned_to = UserRelatedField() priority = SlugRelatedField(slug_field="name") severity = SlugRelatedField(slug_field="name") type = SlugRelatedField(slug_field="name") milestone = SlugRelatedField(slug_field="name") votes = MethodField("get_votes") modified_date = DateTimeField() created_date = DateTimeField() finished_date = DateTimeField() ref = Field() subject = Field() description = Field() external_reference = Field() version = Field() blocked_note = Field() is_blocked = Field() tags = Field() due_date = DateTimeField() due_date_reason = Field() def get_votes(self, obj): return [x.email for x in votes_service.get_voters(obj)] 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] def statuses_queryset(self, project): if project.id not in _issues_statuses_cache: _issues_statuses_cache[project.id] = { s.id: s.name for s in project.issue_statuses.all() } return _issues_statuses_cache[project.id]
class UserAdminSerializer(UserSerializer): total_private_projects = MethodField() total_public_projects = MethodField() email = Field() uuid = Field() date_joined = Field() read_new_terms = Field() accepted_terms = Field() max_private_projects = Field() max_public_projects = Field() max_memberships_private_projects = Field() max_memberships_public_projects = Field() def get_total_private_projects(self, user): return user.owned_projects.filter(is_private=True).count() def get_total_public_projects(self, user): return user.owned_projects.filter(is_private=False).count()
class VotedObjectSerializer(HighLightedContentSerializer): is_voter = MethodField() total_voters = Field() def __init__(self, *args, **kwargs): # Don't pass the extra ids args up to the superclass self.user_votes = kwargs.pop("user_votes", {}) # Instantiate the superclass normally super().__init__(*args, **kwargs) def get_is_voter(self, obj): return obj.id in self.user_votes.get(obj.type, [])
class BaseDueDateSerializer(serializers.LightSerializer): id = Field() name = I18NField() order = Field() by_default = Field() days_to_due = Field() color = Field() project = Field(attr="project_id")
class IssueStatusSerializer(serializers.LightSerializer): id = Field() name = I18NField() slug = Field() order = Field() is_closed = Field() color = Field() project = Field(attr="project_id")
class RoleSerializer(serializers.LightSerializer): id = Field() name = Field() slug = Field() project = Field(attr="project_id") order = Field() computable = Field() permissions = Field() members_count = MethodField() def get_members_count(self, obj): return obj.memberships.count()
class MilestoneExportSerializer(WatcheableObjectLightSerializerMixin, RelatedExportSerializer): name = Field() owner = UserRelatedField() created_date = DateTimeField() modified_date = DateTimeField() estimated_start = Field() estimated_finish = Field() slug = Field() closed = Field() disponibility = Field() order = Field()
class ProjectSerializer(serializers.LightSerializer): id = Field(attr="pk") permalink = MethodField() name = MethodField() logo_big_url = MethodField() def get_permalink(self, obj): return resolve_front_url("project", obj.slug) def get_name(self, obj): return obj.name def get_logo_big_url(self, obj): return get_logo_big_thumbnail_url(obj)
class EpicSerializer(EpicListSerializer): comment = MethodField() blocked_note_html = MethodField() description = Field() description_html = MethodField() def get_comment(self, obj): return "" 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 UserStorySerializer(UserStoryListSerializer): comment = MethodField() blocked_note_html = MethodField() description = Field() description_html = MethodField() def get_comment(self, obj): # NOTE: This method and field is necessary to historical comments work return "" 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 ObjectSerializer(serializers.LightSerializer): id = Field() ref = MethodField() subject = MethodField() content_type = MethodField() def get_ref(self, obj): return obj.ref if hasattr(obj, 'ref') else None def get_subject(self, obj): return obj.subject if hasattr(obj, 'subject') else None def get_content_type(self, obj): content_type = ContentType.objects.get_for_model(obj) return content_type.model if content_type else None
class UserSerializer(serializers.LightSerializer): id = Field() name = MethodField() photo = MethodField() big_photo = MethodField() gravatar_id = MethodField() username = Field() is_profile_visible = MethodField() date_joined = DateTimeField() def get_name(self, obj): return obj.get_full_name() def get_photo(self, obj): return get_user_photo_url(obj) def get_big_photo(self, obj): return get_user_big_photo_url(obj) def get_gravatar_id(self, obj): return get_user_gravatar_id(obj) def get_is_profile_visible(self, obj): return obj.is_active and not obj.is_system
class TaskSerializer(TaskListSerializer): comment = MethodField() generated_user_stories = MethodField() blocked_note_html = MethodField() description = Field() description_html = MethodField() def get_comment(self, obj): return "" 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 MilestoneSerializer(serializers.LightSerializer): id = Field() name = Field() slug = Field() estimated_start = Field() estimated_finish = Field() created_date = Field() modified_date = Field() closed = Field() disponibility = Field() permalink = serializers.SerializerMethodField("get_permalink") project = ProjectSerializer() owner = UserSerializer() def get_permalink(self, obj): return resolve_front_url("taskboard", obj.project.slug, obj.slug) def to_value(self, instance): if instance is None: return None return super().to_value(instance)
class AttachmentExportSerializer(serializers.LightSerializer): owner = UserRelatedField() attached_file = FileField() created_date = DateTimeField() modified_date = DateTimeField() description = Field() is_deprecated = Field() name = Field() order = Field() sha1 = Field() size = Field()
class WikiPageSerializer(WatchedResourceSerializer, ProjectExtraInfoSerializerMixin, serializers.LightSerializer): id = Field() project = Field(attr="project_id") slug = Field() content = Field() owner = Field(attr="owner_id") last_modifier = Field(attr="last_modifier_id") created_date = Field() modified_date = Field() html = MethodField() editions = MethodField() version = Field() def get_html(self, obj): return mdrender(obj.project, obj.content) def get_editions(self, obj): return history_service.get_history_queryset_by_model_instance( obj).count() + 1 # +1 for creation
class IssueStatusSerializer(serializers.LightSerializer): id = Field(attr="pk") name = MethodField() slug = MethodField() color = MethodField() is_closed = MethodField() def get_name(self, obj): return obj.name def get_slug(self, obj): return obj.slug def get_color(self, obj): return obj.color def get_is_closed(self, obj): return obj.is_closed
class IssueSerializer(IssueListSerializer): comment = MethodField() generated_user_stories = MethodField() blocked_note_html = MethodField() description = Field() description_html = MethodField() def get_comment(self, obj): # NOTE: This method and field is necessary to historical comments work return "" def get_generated_user_stories(self, obj): assert hasattr(obj, "generated_user_stories_attr"),\ "instance must have a generated_user_stories_attr attribute" return obj.generated_user_stories_attr 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 MembershipDictSerializer(serializers.LightDictSerializer): role = Field() role_name = Field() full_name = Field() full_name_display = MethodField() is_active = Field() id = Field() color = Field() username = Field() photo = MethodField() gravatar_id = MethodField() def get_full_name_display(self, obj): return obj["full_name"] or obj["username"] or obj["email"] def get_photo(self, obj): return get_photo_url(obj['photo']) def get_gravatar_id(self, obj): return get_gravatar_id(obj['email'])
class StatusExtraInfoSerializerMixin(serializers.LightSerializer): status = Field(attr="status_id") status_extra_info = MethodField() def to_value(self, instance): self._serialized_status = {} return super().to_value(instance) def get_status_extra_info(self, obj): if obj.status_id is None: return None serialized_status = self._serialized_status.get(obj.status_id, None) if serialized_status is None: serialized_status = { "name": _(obj.status.name), "color": obj.status.color, "is_closed": obj.status.is_closed } self._serialized_status[obj.status_id] = serialized_status return serialized_status
class StorageEntrySerializer(serializers.LightSerializer): key = Field() value = Field() created_date = Field() modified_date = Field()
class TaskListSerializer( VoteResourceSerializerMixin, WatchedResourceSerializer, OwnerExtraInfoSerializerMixin, AssignedToExtraInfoSerializerMixin, StatusExtraInfoSerializerMixin, ProjectExtraInfoSerializerMixin, BasicAttachmentsInfoSerializerMixin, TaggedInProjectResourceSerializer, TotalCommentsSerializerMixin, DueDateSerializerMixin, serializers.LightSerializer): id = Field() user_story = Field(attr="user_story_id") ref = Field() project = Field(attr="project_id") milestone = Field(attr="milestone_id") milestone_slug = MethodField() created_date = Field() modified_date = Field() finished_date = Field() subject = Field() us_order = Field() taskboard_order = Field() is_iocaine = Field() external_reference = Field() version = Field() watchers = Field() is_blocked = Field() blocked_note = Field() is_closed = MethodField() user_story_extra_info = Field() def get_generated_user_stories(self, obj): assert hasattr(obj, "generated_user_stories_attr"),\ "instance must have a generated_user_stories_attr attribute" return obj.generated_user_stories_attr def get_milestone_slug(self, obj): return obj.milestone.slug if obj.milestone else None def get_is_closed(self, obj): return obj.status is not None and obj.status.is_closed
class AccessTokenSerializer(serializers.LightSerializer): token = Field()
class AuthorizationCodeSerializer(serializers.LightSerializer): state = Field() auth_code = Field() next_url = Field()
class ApplicationTokenSerializer(serializers.LightSerializer): id = Field() user = Field(attr="user_id") application = ApplicationSerializer() auth_code = Field() next_url = Field()
class ApplicationSerializer(serializers.LightSerializer): id = Field() name = Field() web = Field() description = Field() icon_url = Field()
class TimelineSerializer(serializers.LightSerializer): data = serializers.SerializerMethodField("get_data") id = Field() content_type = Field(attr="content_type_id") object_id = Field() namespace = Field() event_type = Field() project = Field(attr="project_id") data = MethodField() data_content_type = Field(attr="data_content_type_id") created = Field() class Meta: model = models.Timeline def get_data(self, obj): # Updates the data user info saved if the user exists if hasattr(obj, "_prefetched_user"): user = obj._prefetched_user else: User = get_user_model() userData = obj.data.get("user", None) try: user = User.objects.get(id=userData["id"]) except User.DoesNotExist: user = None if user is not None: obj.data["user"] = { "id": user.pk, "name": user.get_full_name(), "photo": get_user_photo_url(user), "big_photo": get_user_big_photo_url(user), "gravatar_id": get_user_gravatar_id(user), "username": user.username, "is_profile_visible": user.is_active and not user.is_system, "date_joined": user.date_joined } if "values_diff" in obj.data and "attachments" in obj.data["values_diff"]: [[self.parse_url(item) for item in value] for key, value in obj.data["values_diff"]["attachments"].items() if value] return obj.data def parse_url(self, item): if 'attached_file' in item: attached_file = item['attached_file'] else: # This is the case for old timeline entries file_path = urlparse(item['url']).path index = file_path.find('/attachments') attached_file = file_path[index+1:] item['url'] = default_storage.url(attached_file) if 'thumbnail_file' in item: thumb_file = item['thumbnail_file'] thumb_url = default_storage.url(thumb_file) if thumb_file else None else: thumb_url = get_thumbnail_url(attached_file, settings.THN_ATTACHMENT_TIMELINE) item['thumb_url'] = thumb_url
class IssueListSerializer(VoteResourceSerializerMixin, WatchedResourceSerializer, OwnerExtraInfoSerializerMixin, AssignedToExtraInfoSerializerMixin, StatusExtraInfoSerializerMixin, ProjectExtraInfoSerializerMixin, BasicAttachmentsInfoSerializerMixin, DueDateSerializerMixin, TaggedInProjectResourceSerializer, serializers.LightSerializer): id = Field() ref = Field() severity = Field(attr="severity_id") priority = Field(attr="priority_id") type = Field(attr="type_id") milestone = Field(attr="milestone_id") project = Field(attr="project_id") created_date = Field() modified_date = Field() finished_date = Field() subject = Field() external_reference = Field() version = Field() watchers = Field() is_blocked = Field() blocked_note = Field() is_closed = Field()