Esempio n. 1
0
class IncidentSerializer(serializers.Serializer):
    projects = ListField(child=serializers.CharField(), required=False, default=[])
    groups = ListField(child=serializers.CharField(), required=True, allow_null=False)
    title = serializers.CharField(required=True)
    query = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    aggregation = serializers.IntegerField(default=QueryAggregations.TOTAL.value)
    dateStarted = serializers.DateTimeField(required=False)
    dateDetected = serializers.DateTimeField(required=False, allow_null=True)

    def validate_projects(self, slugs):
        projects = Project.objects.filter(organization=self.context["organization"], slug__in=slugs)
        if len(projects) != len(slugs):
            raise serializers.ValidationError("Invalid project slug(s)")
        return list(projects)

    def validate_groups(self, group_ids):
        groups = Group.objects.filter(
            project__organization=self.context["organization"], id__in=group_ids
        ).select_related("project")
        if len(groups) != len(group_ids):
            raise serializers.ValidationError("Invalid group id(s)")
        return list(groups)

    def validate_aggregation(self, aggregation):
        try:
            return QueryAggregations(aggregation)
        except ValueError:
            raise serializers.ValidationError(
                "Invalid aggregation, valid values are %s"
                % [item.value for item in QueryAggregations]
            )
Esempio n. 2
0
class ApiApplicationSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=64)
    redirectUris = ListField(
        child=serializers.URLField(max_length=255),
        required=False,
    )
    allowedOrigins = ListField(
        # TODO(dcramer): make this validate origins
        child=serializers.CharField(max_length=255),
        required=False,
    )
    homepageUrl = serializers.URLField(
        max_length=255,
        required=False,
        allow_null=True,
        allow_blank=True,
    )
    termsUrl = serializers.URLField(
        max_length=255,
        required=False,
        allow_null=True,
        allow_blank=True,
    )
    privacyUrl = serializers.URLField(
        max_length=255,
        required=False,
        allow_null=True,
        allow_blank=True,
    )
class OrganizationReleaseSerializer(ReleaseSerializer):
    headCommits = ListField(child=ReleaseHeadCommitSerializerDeprecated(),
                            required=False,
                            allow_null=False)
    refs = ListField(child=ReleaseHeadCommitSerializer(),
                     required=False,
                     allow_null=False)
Esempio n. 4
0
class IncidentSerializer(serializers.Serializer):
    projects = ListField(
        child=serializers.CharField(),
        required=False,
        default=[],
    )
    groups = ListField(
        child=serializers.CharField(),
        required=True,
        allow_null=False,
    )
    title = serializers.CharField(required=True)
    query = serializers.CharField(required=False,
                                  allow_blank=True,
                                  allow_null=True)
    dateStarted = serializers.DateTimeField(required=True)
    dateDetected = serializers.DateTimeField(required=False, allow_null=True)

    def validate_projects(self, slugs):
        projects = Project.objects.filter(
            organization=self.context['organization'],
            slug__in=slugs,
        )
        if len(projects) != len(slugs):
            raise serializers.ValidationError('Invalid project slug(s)')
        return list(projects)

    def validate_groups(self, group_ids):
        groups = Group.objects.filter(
            project__organization=self.context['organization'],
            id__in=group_ids,
        ).select_related('project')
        if len(groups) != len(group_ids):
            raise serializers.ValidationError('Invalid group id(s)')
        return list(groups)
Esempio n. 5
0
class ReleaseSerializerWithProjects(ReleaseWithVersionSerializer):
    projects = ListField()
    headCommits = ListField(child=ReleaseHeadCommitSerializerDeprecated(),
                            required=False,
                            allow_null=False)
    refs = ListField(child=ReleaseHeadCommitSerializer(),
                     required=False,
                     allow_null=False)
class ReleaseSerializer(serializers.Serializer):
    ref = serializers.CharField(max_length=64, required=False)
    url = serializers.URLField(required=False)
    dateStarted = serializers.DateTimeField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False)
    head_commits = ListField(child=ReleaseHeadCommitSerializer(),
                             required=False)
Esempio n. 7
0
class SpansPerformanceSerializer(serializers.Serializer):  # type: ignore
    field = ListField(child=serializers.CharField(), required=False, allow_null=True)
    query = serializers.CharField(required=False, allow_null=True)
    spanOp = ListField(child=serializers.CharField(), required=False, allow_null=True, max_length=4)
    spanGroup = ListField(
        child=serializers.CharField(), required=False, allow_null=True, max_length=4
    )

    def validate_spanGroup(self, span_groups):
        for group in span_groups:
            if not is_span_id(group):
                raise serializers.ValidationError(INVALID_SPAN_ID.format("spanGroup"))
        return span_groups
class ReleaseSerializer(serializers.Serializer):
    ref = serializers.CharField(max_length=64, required=False)
    url = serializers.URLField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False, allow_null=False)
    headCommits = ListField(
        child=ReleaseHeadCommitSerializerDeprecated(), required=False, allow_null=False
    )
    refs = ListField(
        child=ReleaseHeadCommitSerializer(),
        required=False,
        allow_null=False,
    )
Esempio n. 9
0
class ProjectAdminSerializer(ProjectMemberSerializer):
    name = serializers.CharField(max_length=200)
    slug = serializers.RegexField(r'^[a-z0-9_\-]+$', max_length=50)
    team = serializers.RegexField(r'^[a-z0-9_\-]+$', max_length=50)
    digestsMinDelay = serializers.IntegerField(min_value=60, max_value=3600)
    digestsMaxDelay = serializers.IntegerField(min_value=60, max_value=3600)
    subjectPrefix = serializers.CharField(max_length=200)
    subjectTemplate = serializers.CharField(max_length=200)
    securityToken = serializers.RegexField(r'^[-a-zA-Z0-9+/=\s]+$',
                                           max_length=255)
    securityTokenHeader = serializers.RegexField(r'^[a-zA-Z0-9_\-]+$',
                                                 max_length=20)
    verifySSL = serializers.BooleanField(required=False)
    defaultEnvironment = serializers.CharField(required=False)
    dataScrubber = serializers.BooleanField(required=False)
    dataScrubberDefaults = serializers.BooleanField(required=False)
    sensitiveFields = ListField(child=serializers.CharField(), required=False)
    safeFields = ListField(child=serializers.CharField(), required=False)
    scrubIPAddresses = serializers.BooleanField(required=False)
    scrapeJavaScript = serializers.BooleanField(required=False)
    allowedDomains = ListField(child=OriginField(), required=False)
    resolveAge = serializers.IntegerField(required=False)
    platform = serializers.CharField(required=False)

    def validate_digestsMaxDelay(self, attrs, source):
        if attrs[source] < attrs['digestsMinDelay']:
            raise serializers.ValidationError(
                'The maximum delay on digests must be higher than the minimum.'
            )
        return attrs

    def validate_allowedDomains(self, attrs, source):
        allowed_domains = attrs[source]
        if len(allowed_domains) == 0:
            raise serializers.ValidationError(
                'Empty value will block all requests, use * to accept from all domains'
            )
        return attrs

    def validate_slug(self, attrs, source):
        slug = attrs[source]
        project = self.context['project']
        other = Project.objects.filter(
            slug=slug,
            organization=project.organization,
        ).exclude(id=project.id).first()
        if other is not None:
            raise serializers.ValidationError(
                'Another project (%s) is already using that slug' % other.name)
        return attrs
Esempio n. 10
0
class OrganizationMemberSerializer(serializers.Serializer):
    email = AllowedEmailField(max_length=75, required=True)
    role = serializers.ChoiceField(choices=roles.get_choices(), required=True)
    teams = ListField(required=False, allow_null=False)
    sendInvite = serializers.BooleanField(required=False,
                                          default=True,
                                          write_only=True)
Esempio n. 11
0
 class DummySerializer(serializers.Serializer):
     list_field = ListField(
         required=False,
         child=DummyChildSerializer(required=False),
         allow_null=True,
     )
     name = serializers.CharField()
Esempio n. 12
0
class ReleaseSerializer(serializers.Serializer):
    ref = serializers.CharField(max_length=VERSION_LENGTH, required=False)
    url = serializers.URLField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(),
                        required=False,
                        allow_null=False)
class DashboardWithWidgetsSerializer(serializers.Serializer):
    title = serializers.CharField(required=False,
                                  allow_blank=True,
                                  allow_null=True)
    widgets = ListField(child=WidgetSerializer(),
                        required=False,
                        allow_null=True)

    def validate_widgets(self, widgets):
        if len(widgets) != len(set([w["order"] for w in widgets])):
            raise ValidationError(
                "Widgets must not have duplicate order values.")

        widgets_count = Widget.objects.filter(
            id__in=[w["id"] for w in widgets],
            dashboard_id=self.context["dashboard_id"],
            status=ObjectStatus.VISIBLE,
        ).count()

        if len(widgets) != widgets_count:
            raise ValidationError(
                "All widgets must exist within this dashboard prior to reordering."
            )

        return widgets
Esempio n. 14
0
class DashboardWithWidgetsSerializer(serializers.Serializer):
    title = serializers.CharField(required=False)
    widgets = ListField(
        child=WidgetSerializer(),
        required=False,
        allow_null=True,
    )

    def validate_widgets(self, attrs, source):
        try:
            widgets = attrs[source]
        except KeyError:
            return attrs

        if len(widgets) != len(set([w['order'] for w in widgets])):
            raise ValidationError(
                'Widgets must not have duplicate order values.')

        widgets_count = Widget.objects.filter(
            id__in=[w['id'] for w in widgets],
            dashboard_id=self.context['dashboard_id'],
            status=ObjectStatus.VISIBLE,
        ).count()

        if len(widgets) != widgets_count:
            raise ValidationError(
                'All widgets must exist within this dashboard prior to reordering.'
            )

        return attrs
Esempio n. 15
0
class DummySerializer(serializers.Serializer):
    a_field = ListField(
        child=ChildSerializer(),
        required=False,
        allow_null=False,
    )
    actor_field = ActorField(required=False)
Esempio n. 16
0
class AssociateDsymSerializer(serializers.Serializer):
    checksums = ListField(child=serializers.CharField(max_length=40))
    platform = serializers.ChoiceField(choices=zip(
        DSYM_PLATFORMS.keys(), DSYM_PLATFORMS.keys(),
    ))
    name = serializers.CharField(max_length=250)
    appId = serializers.CharField(max_length=250)
    version = serializers.CharField(max_length=40)
    build = serializers.CharField(max_length=40)
Esempio n. 17
0
class DiscoverSavedQuerySerializer(serializers.Serializer):
    name = serializers.CharField(required=True)
    projects = ListField(child=serializers.IntegerField(),
                         required=False,
                         default=[])
    start = serializers.DateTimeField(required=False, allow_null=True)
    end = serializers.DateTimeField(required=False, allow_null=True)
    range = serializers.CharField(required=False, allow_null=True)
    fields = ListField(child=serializers.CharField(),
                       required=False,
                       allow_null=True)
    limit = serializers.IntegerField(min_value=0,
                                     max_value=1000,
                                     required=False,
                                     allow_null=True)
    rollup = serializers.IntegerField(required=False, allow_null=True)
    orderby = serializers.CharField(required=False, allow_null=True)
    conditions = ListField(child=ListField(), required=False, allow_null=True)
    aggregations = ListField(child=ListField(), required=False, default=[])
    groupby = ListField(child=serializers.CharField(),
                        required=False,
                        allow_null=True)

    def validate_projects(self, projects):
        organization = self.context["organization"]

        org_projects = set(
            Project.objects.filter(organization=organization,
                                   id__in=projects,
                                   status=ProjectStatus.VISIBLE).values_list(
                                       "id", flat=True))

        if set(projects) != org_projects:
            raise PermissionDenied

        return projects

    def validate(self, data):
        query = {}
        query_keys = [
            "fields",
            "conditions",
            "aggregations",
            "range",
            "start",
            "end",
            "orderby",
            "limit",
        ]

        for key in query_keys:
            if data.get(key) is not None:
                query[key] = data[key]

        return {
            "name": data["name"],
            "project_ids": data["projects"],
            "query": query
        }
Esempio n. 18
0
class ReleaseSerializer(serializers.Serializer):
    version = serializers.RegexField(r'^[a-zA-Z0-9\-_\. \(\)]+\Z',
                                     max_length=64,
                                     required=True)
    ref = serializers.CharField(max_length=64, required=False)
    url = serializers.URLField(required=False)
    owner = UserField(required=False)
    dateStarted = serializers.DateTimeField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False)
Esempio n. 19
0
class DiscoverSavedQueriesSerializer(serializers.Serializer):
    name = serializers.CharField(required=True)
    projects = ListField(
        child=serializers.IntegerField(),
        required=False,
        allow_null=True,
        default=[]
    )
    start = serializers.DateTimeField(required=False)
    end = serializers.DateTimeField(required=False)
    range = serializers.CharField(required=False)
    fields = ListField(
        child=serializers.CharField(),
        required=False,
        allow_null=True,
    )
    limit = serializers.IntegerField(min_value=0, max_value=1000, required=False)
    rollup = serializers.IntegerField(required=False)
    orderby = serializers.CharField(required=False)
    conditions = ListField(
        child=ListField(),
        required=False,
        allow_null=True,
    )
    aggregations = ListField(
        child=ListField(),
        required=False,
        allow_null=True,
        default=[]
    )
    groupby = ListField(
        child=serializers.CharField(),
        required=False,
        allow_null=True,
    )

    def validate(self, data):
        query = {}
        query_keys = [
            'fields',
            'conditions',
            'aggregations',
            'range',
            'start',
            'end',
            'orderby',
            'limit'
        ]

        for key in query_keys:
            if data.get(key) is not None:
                query[key] = data[key]

        return {
            'name': data['name'],
            'project_ids': data['projects'],
            'query': query,
        }
Esempio n. 20
0
class SpansSerializer(serializers.Serializer):  # type: ignore
    query = serializers.CharField(required=False, allow_null=True)
    span = ListField(child=serializers.CharField(),
                     required=True,
                     allow_null=False,
                     max_length=10)

    def validate_span(self, spans: List[str]) -> List[Span]:
        try:
            return [Span.from_str(span) for span in spans]
        except ValueError as e:
            raise serializers.ValidationError(str(e))
Esempio n. 21
0
class ReleaseSerializer(serializers.Serializer):
    version = serializers.CharField(max_length=VERSION_LENGTH, required=True)
    ref = serializers.CharField(max_length=VERSION_LENGTH, required=False)
    url = serializers.URLField(required=False)
    owner = UserField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False, allow_null=False)

    def validate_version(self, attrs, source):
        value = attrs[source]
        if not Release.is_valid_version(value):
            raise serializers.ValidationError('Invalid value for release')
        return attrs
Esempio n. 22
0
class WidgetSerializer(serializers.Serializer):
    displayType = serializers.CharField(required=True)
    displayOptions = JSONField(required=False)
    title = serializers.CharField(required=True)
    dataSources = ListField(
        child=WidgetDataSourceSerializer(required=False), required=False, allow_null=True
    )

    def validate_displayType(self, display_type):
        if display_type not in WidgetDisplayTypes.TYPE_NAMES:
            raise ValidationError("Widget displayType %s not recognized." % display_type)

        return WidgetDisplayTypes.get_id_for_type_name(display_type)
Esempio n. 23
0
class ReleaseSerializer(serializers.Serializer):
    version = serializers.CharField(max_length=64, required=True)
    ref = serializers.CharField(max_length=64, required=False)
    url = serializers.URLField(required=False)
    owner = UserField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False)

    def validate_version(self, attrs, source):
        value = attrs[source]
        if any(c in value for c in BAD_RELEASE_CHARS) or value in ('.', '..'):
            raise serializers.ValidationError('Invalid value for release')
        return attrs
Esempio n. 24
0
class ReleaseSerializer(serializers.Serializer):
    ref = serializers.CharField(
        max_length=MAX_VERSION_LENGTH, required=False, allow_null=True, allow_blank=True
    )
    url = serializers.URLField(required=False, allow_null=True, allow_blank=True)
    dateReleased = serializers.DateTimeField(required=False, allow_null=True)
    commits = ListField(child=CommitSerializer(), required=False, allow_null=False)

    status = serializers.CharField(required=False, allow_null=False)

    def validate_status(self, value):
        try:
            return ReleaseStatus.from_string(value)
        except ValueError:
            raise serializers.ValidationError("Invalid status %s" % value)
Esempio n. 25
0
class ReleaseSerializer(serializers.Serializer):
    version = serializers.RegexField(r'[a-zA-Z0-9\-_\.]',
                                     max_length=64,
                                     required=True)
    ref = serializers.CharField(max_length=64, required=False)
    url = serializers.URLField(required=False)
    owner = UserField(required=False)
    dateStarted = serializers.DateTimeField(required=False)
    dateReleased = serializers.DateTimeField(required=False)
    commits = ListField(child=CommitSerializer(), required=False)

    def validate_version(self, attrs, source):
        value = attrs[source]
        if not set(value).isdisjoint(set(string.whitespace)):
            raise serializers.ValidationError('Enter a valid value')
        return attrs
class OrganizationMemberSerializer(serializers.Serializer):
    email = AllowedEmailField(max_length=75, required=True)
    role = serializers.ChoiceField(choices=roles.get_choices(), required=True)
    teams = ListField(required=False, allow_null=False, default=[])
    sendInvite = serializers.BooleanField(required=False,
                                          default=True,
                                          write_only=True)

    def validate_email(self, email):
        queryset = OrganizationMember.objects.filter(
            Q(email=email)
            | Q(user__email__iexact=email, user__is_active=True),
            organization=self.context["organization"],
        )

        if queryset.filter(invite_status=InviteStatus.APPROVED.value).exists():
            raise serializers.ValidationError(
                "The user %s is already a member" % email)

        if not self.context.get("allow_existing_invite_request"):
            if queryset.filter(
                    Q(invite_status=InviteStatus.REQUESTED_TO_BE_INVITED.value)
                    | Q(invite_status=InviteStatus.REQUESTED_TO_JOIN.value)
            ).exists():
                raise serializers.ValidationError(
                    "There is an existing invite request for %s" % email)
        return email

    def validate_teams(self, teams):
        valid_teams = list(
            Team.objects.filter(organization=self.context["organization"],
                                status=TeamStatus.VISIBLE,
                                slug__in=teams))

        if len(valid_teams) != len(teams):
            raise serializers.ValidationError("Invalid teams")

        return valid_teams

    def validate_role(self, role):
        if role not in {r.id for r in self.context["allowed_roles"]}:
            raise serializers.ValidationError(
                "You do not have permission to invite that role.")

        return role
class DashboardWithWidgetsSerializer(serializers.Serializer):
    title = serializers.CharField(required=False,
                                  allow_blank=True,
                                  allow_null=True)
    widgets = ListField(child=DashboardWidgetSerializer(),
                        required=False,
                        allow_null=True)

    def validate_widgets(self, widgets):
        widgets_count = DashboardWidget.objects.filter(
            id__in=[w["id"] for w in widgets],
            dashboard_id=self.context["dashboard_id"],
        ).count()

        if len(widgets) != widgets_count:
            raise ValidationError(
                "All widgets must exist within this dashboard prior to reordering."
            )

        return widgets
Esempio n. 28
0
class DiscoverSerializer(serializers.Serializer):
    projects = ListField(
        child=serializers.IntegerField(),
        required=True,
        allow_null=False,
    )
    start = serializers.DateTimeField(required=True)
    end = serializers.DateTimeField(required=True)
    fields = ListField(
        child=serializers.CharField(),
        required=False,
        allow_null=True,
    )
    limit = serializers.IntegerField(min_value=0,
                                     max_value=1000,
                                     required=False)
    rollup = serializers.IntegerField(required=False)
    orderby = serializers.CharField(required=False)
    conditions = ListField(
        child=ListField(),
        required=False,
        allow_null=True,
    )
    aggregations = ListField(child=ListField(),
                             required=False,
                             allow_null=True,
                             default=[])
    groupby = ListField(
        child=serializers.CharField(),
        required=False,
        allow_null=True,
    )

    def __init__(self, *args, **kwargs):
        super(DiscoverSerializer, self).__init__(*args, **kwargs)
        self.member = OrganizationMember.objects.get(
            user=self.context['user'],
            organization=self.context['organization'])

    def validate_projects(self, attrs, source):
        organization = self.context['organization']
        member = self.member
        projects = attrs[source]

        org_projects = set(
            Project.objects.filter(
                organization=organization,
                status=ProjectStatus.VISIBLE,
            ).values_list('id', flat=True))

        if not set(projects).issubset(
                org_projects) or not self.has_projects_access(
                    member, organization, projects):
            raise PermissionDenied

        return attrs

    def validate_fields(self, attrs, source):
        # If we're including exception_stacks.* or exception_frames.* fields
        # then add arrayjoin value so this gets returned as strings
        pattern = r"^(exception_stacks|exception_frames)\..+"
        match = next(
            (re.search(pattern, field).group(1)
             for field in attrs.get(source, []) if re.match(pattern, field)),
            None)

        if match:
            attrs['arrayjoin'] = match

        return attrs

    def has_projects_access(self, member, organization, requested_projects):
        has_global_access = roles.get(member.role).is_global
        if has_global_access:
            return True

        member_project_list = Project.objects.filter(
            organization=organization,
            teams__in=OrganizationMemberTeam.objects.filter(
                organizationmember=member, ).values('team'),
        ).values_list('id', flat=True)

        return set(requested_projects).issubset(set(member_project_list))
class OrganizationMemberSerializer(serializers.Serializer):
    email = AllowedEmailField(max_length=75, required=True)
    role = serializers.ChoiceField(choices=roles.get_choices(), required=True)
    teams = ListField(required=False, allow_null=False)
Esempio n. 30
0
class ReleaseSerializerWithProjects(ReleaseSerializer):
    projects = ListField()
    head_commits = ListField(child=ReleaseHeadCommitSerializer(),
                             required=False)