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
Exemple #3
0
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, [])
Exemple #6
0
class BaseDueDateSerializer(serializers.LightSerializer):
    id = Field()
    name = I18NField()
    order = Field()
    by_default = Field()
    days_to_due = Field()
    color = Field()
    project = Field(attr="project_id")
Exemple #7
0
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()
Exemple #9
0
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()
Exemple #10
0
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)
Exemple #11
0
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
Exemple #15
0
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)
Exemple #16
0
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
Exemple #19
0
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
Exemple #20
0
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)
Exemple #21
0
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()
Exemple #24
0
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
Exemple #30
0
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()