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] )
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)
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)
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)
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, )
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
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)
class DummySerializer(serializers.Serializer): list_field = ListField( required=False, child=DummyChildSerializer(required=False), allow_null=True, ) name = serializers.CharField()
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
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
class DummySerializer(serializers.Serializer): a_field = ListField( child=ChildSerializer(), required=False, allow_null=False, ) actor_field = ActorField(required=False)
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)
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 }
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)
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, }
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))
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
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)
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
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)
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
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)
class ReleaseSerializerWithProjects(ReleaseSerializer): projects = ListField() head_commits = ListField(child=ReleaseHeadCommitSerializer(), required=False)