Skip to content

Commit a12ca72

Browse files
authored
Merge pull request #77 from intelowlproject/develop
Added Tag model | custom fields in admin view + updated travis config
2 parents e71f93d + 1c6bb0e commit a12ca72

File tree

5 files changed

+86
-15
lines changed

5 files changed

+86
-15
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ test_files
55
env_file_app
66
env_file_postgres
77
env_file_integrations
8-
.env
8+
.env
9+
venv/

.travis.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
branches:
2+
only:
3+
- master
4+
- develop
15
sudo: required
26
language: python
37
dist: bionic

api_app/admin.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
from django.contrib import admin
2-
from .models import Job
2+
from .models import Job, Tag
33

4-
admin.site.register(Job)
4+
5+
class JobAdminView(admin.ModelAdmin):
6+
list_display = (
7+
"id",
8+
"source",
9+
"observable_name",
10+
"status",
11+
"observable_classification",
12+
"file_mimetype",
13+
"received_request_time",
14+
)
15+
list_display_link = ("id", "status")
16+
search_fields = ("source", "md5", "observable_name")
17+
18+
19+
class TagAdminView(admin.ModelAdmin):
20+
list_display = ("id", "label", "color")
21+
search_fields = ("label", "color")
22+
23+
24+
admin.site.register(Job, JobAdminView)
25+
admin.site.register(Tag, TagAdminView)

api_app/models.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,54 @@
33

44
from api_app import utilities
55

6-
STATUS = [("pending", "pending"),
7-
("running", "running"),
8-
("reported_without_fails", "reported_without_fails"),
9-
("reported_with_fails", "reported_with_fails"),
10-
("failed", "failed")]
6+
STATUS = [
7+
("pending", "pending"),
8+
("running", "running"),
9+
("reported_without_fails", "reported_without_fails"),
10+
("reported_with_fails", "reported_with_fails"),
11+
("failed", "failed"),
12+
]
13+
14+
15+
class Tag(models.Model):
16+
label = models.CharField(max_length=50, blank=False, default="none")
17+
color = models.CharField(max_length=7, blank=False, default="#222222")
18+
19+
def __str__(self):
20+
return f'Tag(label="{self.label}")'
1121

1222

1323
class Job(models.Model):
1424
source = models.CharField(max_length=50, blank=False, default="none")
15-
is_sample = models.BooleanField(blank=False)
25+
is_sample = models.BooleanField(blank=False, default=False)
1626
md5 = models.CharField(max_length=50, blank=False)
1727
observable_name = models.CharField(max_length=50, blank=True)
1828
observable_classification = models.CharField(max_length=50, blank=True)
1929
file_name = models.CharField(max_length=50, blank=True)
2030
file_mimetype = models.CharField(max_length=50, blank=True)
21-
status = models.CharField(max_length=50, blank=False, choices=STATUS, default="pending")
22-
analyzers_requested = postgres_fields.ArrayField(models.CharField(max_length=900), blank=True, default=list)
31+
status = models.CharField(
32+
max_length=50, blank=False, choices=STATUS, default="pending"
33+
)
34+
analyzers_requested = postgres_fields.ArrayField(
35+
models.CharField(max_length=900), blank=True, default=list
36+
)
2337
run_all_available_analyzers = models.BooleanField(blank=False, default=False)
24-
analyzers_to_execute = postgres_fields.ArrayField(models.CharField(max_length=900), blank=True, default=list)
38+
analyzers_to_execute = postgres_fields.ArrayField(
39+
models.CharField(max_length=900), blank=True, default=list
40+
)
2541
analysis_reports = postgres_fields.JSONField(default=list, null=True, blank=True)
2642
received_request_time = models.DateTimeField(auto_now_add=True)
2743
finished_analysis_time = models.DateTimeField(blank=True, null=True)
2844
force_privacy = models.BooleanField(blank=False, default=False)
2945
disable_external_analyzers = models.BooleanField(blank=False, default=False)
30-
errors = postgres_fields.ArrayField(models.CharField(max_length=900), blank=True, default=list, null=True)
46+
errors = postgres_fields.ArrayField(
47+
models.CharField(max_length=900), blank=True, default=list, null=True
48+
)
3149
file = models.FileField(blank=True, upload_to=utilities.file_directory_path)
50+
tags = models.ManyToManyField(Tag, related_name="jobs", blank=True)
51+
52+
def __str__(self):
53+
if self.observable_name:
54+
return f'Job("{self.observable_name}")'
55+
else:
56+
return f'Job("{self.file_name}")'

api_app/serializers.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
from rest_framework import serializers
2-
from api_app.models import Job
2+
from api_app.models import Job, Tag
3+
4+
5+
class TagSerializer(serializers.ModelSerializer):
6+
class Meta:
7+
model = Tag
8+
fields = "__all__"
39

410

511
class JobSerializer(serializers.ModelSerializer):
12+
tags = TagSerializer(many=True, read_only=True)
13+
tags_id = serializers.PrimaryKeyRelatedField(
14+
many=True, write_only=True, queryset=Tag.objects.all()
15+
)
16+
617
class Meta:
718
model = Job
8-
fields = '__all__'
19+
fields = "__all__"
20+
extra_kwargs = {"tags": {"required": False}}
21+
22+
def create(self, validated_data):
23+
tags = validated_data.pop("tags_id", None)
24+
job = Job.objects.create(**validated_data)
25+
if tags:
26+
job.tags.set(tags)
27+
28+
return job

0 commit comments

Comments
 (0)