|
| 1 | +from django_filters import BooleanFilter, CharFilter, NumberFilter, OrderingFilter |
| 2 | +from django_filters.rest_framework import FilterSet |
| 3 | +from drf_spectacular.types import OpenApiTypes |
| 4 | +from drf_spectacular.utils import extend_schema_field |
| 5 | + |
| 6 | +from dojo.filters import ( |
| 7 | + CharFieldFilterANDExpression, |
| 8 | + CharFieldInFilter, |
| 9 | + DateRangeFilter, |
| 10 | + DojoFilter, |
| 11 | + NumberInFilter, |
| 12 | + ProductSLAFilter, |
| 13 | + custom_filter, |
| 14 | +) |
| 15 | +from dojo.labels import get_labels |
| 16 | +from dojo.models import ( |
| 17 | + Product_API_Scan_Configuration, |
| 18 | + Product_Group, |
| 19 | + Product_Member, |
| 20 | +) |
| 21 | + |
| 22 | +labels = get_labels() |
| 23 | + |
| 24 | + |
| 25 | +class AssetAPIScanConfigurationFilterSet(FilterSet): |
| 26 | + asset = NumberFilter(field_name="product") |
| 27 | + |
| 28 | + class Meta: |
| 29 | + model = Product_API_Scan_Configuration |
| 30 | + fields = ("id", "tool_configuration", "service_key_1", "service_key_2", "service_key_3") |
| 31 | + |
| 32 | + |
| 33 | +class ApiAssetFilter(DojoFilter): |
| 34 | + # BooleanFilter |
| 35 | + external_audience = BooleanFilter(field_name="external_audience") |
| 36 | + internet_accessible = BooleanFilter(field_name="internet_accessible") |
| 37 | + # CharFilter |
| 38 | + name = CharFilter(lookup_expr="icontains") |
| 39 | + name_exact = CharFilter(field_name="name", lookup_expr="iexact") |
| 40 | + description = CharFilter(lookup_expr="icontains") |
| 41 | + business_criticality = CharFilter(method=custom_filter, field_name="business_criticality") |
| 42 | + platform = CharFilter(method=custom_filter, field_name="platform") |
| 43 | + lifecycle = CharFilter(method=custom_filter, field_name="lifecycle") |
| 44 | + origin = CharFilter(method=custom_filter, field_name="origin") |
| 45 | + # NumberInFilter |
| 46 | + id = NumberInFilter(field_name="id", lookup_expr="in") |
| 47 | + asset_manager = NumberInFilter(field_name="product_manager", lookup_expr="in") |
| 48 | + technical_contact = NumberInFilter(field_name="technical_contact", lookup_expr="in") |
| 49 | + team_manager = NumberInFilter(field_name="team_manager", lookup_expr="in") |
| 50 | + prod_type = NumberInFilter(field_name="prod_type", lookup_expr="in") |
| 51 | + tid = NumberInFilter(field_name="tid", lookup_expr="in") |
| 52 | + prod_numeric_grade = NumberInFilter(field_name="prod_numeric_grade", lookup_expr="in") |
| 53 | + user_records = NumberInFilter(field_name="user_records", lookup_expr="in") |
| 54 | + regulations = NumberInFilter(field_name="regulations", lookup_expr="in") |
| 55 | + |
| 56 | + tag = CharFilter(field_name="tags__name", lookup_expr="icontains", label="Tag name contains") |
| 57 | + tags = CharFieldInFilter( |
| 58 | + field_name="tags__name", |
| 59 | + lookup_expr="in", |
| 60 | + help_text="Comma separated list of exact tags (uses OR for multiple values)") |
| 61 | + tags__and = CharFieldFilterANDExpression( |
| 62 | + field_name="tags__name", |
| 63 | + help_text="Comma separated list of exact tags to match with an AND expression") |
| 64 | + not_tag = CharFilter(field_name="tags__name", lookup_expr="icontains", help_text="Not Tag name contains", exclude="True") |
| 65 | + not_tags = CharFieldInFilter(field_name="tags__name", lookup_expr="in", |
| 66 | + help_text=labels.ASSET_FILTERS_CSV_TAGS_NOT_HELP, exclude="True") |
| 67 | + has_tags = BooleanFilter(field_name="tags", lookup_expr="isnull", exclude=True, label="Has tags") |
| 68 | + outside_of_sla = extend_schema_field(OpenApiTypes.NUMBER)(ProductSLAFilter()) |
| 69 | + |
| 70 | + # DateRangeFilter |
| 71 | + created = DateRangeFilter() |
| 72 | + updated = DateRangeFilter() |
| 73 | + # NumberFilter |
| 74 | + revenue = NumberFilter() |
| 75 | + |
| 76 | + o = OrderingFilter( |
| 77 | + # tuple-mapping retains order |
| 78 | + fields=( |
| 79 | + ("id", "id"), |
| 80 | + ("tid", "tid"), |
| 81 | + ("name", "name"), |
| 82 | + ("created", "created"), |
| 83 | + ("prod_numeric_grade", "prod_numeric_grade"), |
| 84 | + ("business_criticality", "business_criticality"), |
| 85 | + ("platform", "platform"), |
| 86 | + ("lifecycle", "lifecycle"), |
| 87 | + ("origin", "origin"), |
| 88 | + ("revenue", "revenue"), |
| 89 | + ("external_audience", "external_audience"), |
| 90 | + ("internet_accessible", "internet_accessible"), |
| 91 | + ("product_manager", "asset_manager"), |
| 92 | + ("product_manager__first_name", "asset_manager__first_name"), |
| 93 | + ("product_manager__last_name", "asset_manager__last_name"), |
| 94 | + ("technical_contact", "technical_contact"), |
| 95 | + ("technical_contact__first_name", "technical_contact__first_name"), |
| 96 | + ("technical_contact__last_name", "technical_contact__last_name"), |
| 97 | + ("team_manager", "team_manager"), |
| 98 | + ("team_manager__first_name", "team_manager__first_name"), |
| 99 | + ("team_manager__last_name", "team_manager__last_name"), |
| 100 | + ("prod_type", "prod_type"), |
| 101 | + ("prod_type__name", "prod_type__name"), |
| 102 | + ("updated", "updated"), |
| 103 | + ("user_records", "user_records"), |
| 104 | + ), |
| 105 | + ) |
| 106 | + |
| 107 | + |
| 108 | +class AssetMemberFilterSet(FilterSet): |
| 109 | + asset_id = NumberFilter(field_name="product_id") |
| 110 | + |
| 111 | + class Meta: |
| 112 | + model = Product_Member |
| 113 | + fields = ("id", "user_id") |
| 114 | + |
| 115 | + |
| 116 | +class AssetGroupFilterSet(FilterSet): |
| 117 | + asset_id = NumberFilter(field_name="product_id") |
| 118 | + |
| 119 | + class Meta: |
| 120 | + model = Product_Group |
| 121 | + fields = ("id", "group_id") |
0 commit comments