add /matches endpoint ad return match information in tickets and /item endpoints
This commit is contained in:
parent
aaa11c3b60
commit
797ea3ae12
12 changed files with 339 additions and 61 deletions
|
@ -1,5 +1,6 @@
|
|||
from django.core.files.base import ContentFile
|
||||
from django.db import models, IntegrityError
|
||||
from itertools import groupby
|
||||
|
||||
from django.db import models
|
||||
from django_softdelete.models import SoftDeleteModel, SoftDeleteManager
|
||||
|
||||
|
||||
|
@ -26,6 +27,13 @@ class Item(SoftDeleteModel):
|
|||
created_at = models.DateTimeField(null=True, auto_now_add=True)
|
||||
updated_at = models.DateTimeField(blank=True, null=True)
|
||||
|
||||
@property
|
||||
def related_issues(self):
|
||||
groups = groupby(self.issue_relation_changes.all(), lambda rel: rel.issue_thread.id)
|
||||
return [sorted(v, key=lambda r: r.timestamp)[0].issue_thread for k, v in groups]
|
||||
|
||||
|
||||
|
||||
objects = ItemManager()
|
||||
all_objects = models.Manager()
|
||||
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
from django.utils import timezone
|
||||
from rest_framework import serializers
|
||||
from rest_framework.relations import SlugRelatedField
|
||||
|
||||
from files.models import File
|
||||
from inventory.models import Event, Container, Item
|
||||
from inventory.shared_serializers import BasicItemSerializer
|
||||
from mail.models import EventAddress
|
||||
from tickets.shared_serializers import BasicIssueSerializer
|
||||
|
||||
|
||||
class EventAdressSerializer(serializers.ModelSerializer):
|
||||
|
@ -33,34 +36,15 @@ class ContainerSerializer(serializers.ModelSerializer):
|
|||
return Item.objects.filter(container=instance.id).count()
|
||||
|
||||
|
||||
class ItemSerializer(serializers.ModelSerializer):
|
||||
class ItemSerializer(BasicItemSerializer):
|
||||
dataImage = serializers.CharField(write_only=True, required=False)
|
||||
cid = serializers.SerializerMethodField()
|
||||
box = serializers.SerializerMethodField()
|
||||
file = serializers.SerializerMethodField()
|
||||
returned = serializers.SerializerMethodField(required=False)
|
||||
event = serializers.SlugRelatedField(slug_field='slug', queryset=Event.objects.all(),
|
||||
allow_null=True, required=False)
|
||||
related_issues = BasicIssueSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Item
|
||||
fields = ['cid', 'box', 'id', 'description', 'file', 'dataImage', 'returned', 'event']
|
||||
fields = ['cid', 'box', 'id', 'description', 'file', 'dataImage', 'returned', 'event', 'related_issues']
|
||||
read_only_fields = ['id']
|
||||
|
||||
def get_cid(self, instance):
|
||||
return instance.container.id
|
||||
|
||||
def get_box(self, instance):
|
||||
return instance.container.name
|
||||
|
||||
def get_file(self, instance):
|
||||
if len(instance.files.all()) > 0:
|
||||
return instance.files.all().order_by('-created_at')[0].hash
|
||||
return None
|
||||
|
||||
def get_returned(self, instance):
|
||||
return instance.returned_at is not None
|
||||
|
||||
def to_internal_value(self, data):
|
||||
container = None
|
||||
returned = False
|
||||
|
|
31
core/inventory/shared_serializers.py
Normal file
31
core/inventory/shared_serializers.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
from rest_framework import serializers
|
||||
|
||||
from inventory.models import Event, Item
|
||||
|
||||
|
||||
class BasicItemSerializer(serializers.ModelSerializer):
|
||||
cid = serializers.SerializerMethodField()
|
||||
box = serializers.SerializerMethodField()
|
||||
file = serializers.SerializerMethodField()
|
||||
returned = serializers.SerializerMethodField(required=False)
|
||||
event = serializers.SlugRelatedField(slug_field='slug', queryset=Event.objects.all(),
|
||||
allow_null=True, required=False)
|
||||
|
||||
class Meta:
|
||||
model = Item
|
||||
fields = ['cid', 'box', 'id', 'description', 'file', 'returned', 'event']
|
||||
read_only_fields = ['id']
|
||||
|
||||
def get_cid(self, instance):
|
||||
return instance.container.id if instance.container else None
|
||||
|
||||
def get_box(self, instance):
|
||||
return instance.container.name if instance.container else None
|
||||
|
||||
def get_file(self, instance):
|
||||
if len(instance.files.all()) > 0:
|
||||
return instance.files.all().order_by('-created_at')[0].hash
|
||||
return None
|
||||
|
||||
def get_returned(self, instance):
|
||||
return instance.returned_at is not None
|
|
@ -28,9 +28,15 @@ class ItemTestCase(TestCase):
|
|||
item = Item.objects.create(container=self.box, event=self.event, description='1')
|
||||
response = self.client.get(f'/api/2/{self.event.slug}/item/')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.json(),
|
||||
[{'id': 1, 'description': '1', 'box': 'BOX', 'cid': self.box.id, 'file': None,
|
||||
'returned': False, 'event': self.event.slug}])
|
||||
self.assertEqual(len(response.json()), 1)
|
||||
self.assertEqual(response.json()[0]['id'], item.id)
|
||||
self.assertEqual(response.json()[0]['description'], '1')
|
||||
self.assertEqual(response.json()[0]['box'], 'BOX')
|
||||
self.assertEqual(response.json()[0]['cid'], self.box.id)
|
||||
self.assertEqual(response.json()[0]['file'], None)
|
||||
self.assertEqual(response.json()[0]['returned'], False)
|
||||
self.assertEqual(response.json()[0]['event'], self.event.slug)
|
||||
self.assertEqual(len(response.json()[0]['related_issues']), 0)
|
||||
|
||||
def test_members_with_file(self):
|
||||
import base64
|
||||
|
@ -38,9 +44,15 @@ class ItemTestCase(TestCase):
|
|||
file = File.objects.create(item=item, data="data:text/plain;base64," + base64.b64encode(b"foo").decode('utf-8'))
|
||||
response = self.client.get(f'/api/2/{self.event.slug}/item/')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.json(),
|
||||
[{'id': 1, 'description': '1', 'box': 'BOX', 'cid': self.box.id, 'file': file.hash,
|
||||
'returned': False, 'event': self.event.slug}])
|
||||
self.assertEqual(len(response.json()), 1)
|
||||
self.assertEqual(response.json()[0]['id'], item.id)
|
||||
self.assertEqual(response.json()[0]['description'], '1')
|
||||
self.assertEqual(response.json()[0]['box'], 'BOX')
|
||||
self.assertEqual(response.json()[0]['cid'], self.box.id)
|
||||
self.assertEqual(response.json()[0]['file'], file.hash)
|
||||
self.assertEqual(response.json()[0]['returned'], False)
|
||||
self.assertEqual(response.json()[0]['event'], self.event.slug)
|
||||
self.assertEqual(len(response.json()[0]['related_issues']), 0)
|
||||
|
||||
def test_multi_members(self):
|
||||
Item.objects.create(container=self.box, event=self.event, description='1')
|
||||
|
@ -53,9 +65,14 @@ class ItemTestCase(TestCase):
|
|||
def test_create_item(self):
|
||||
response = self.client.post(f'/api/2/{self.event.slug}/item/', {'cid': self.box.id, 'description': '1'})
|
||||
self.assertEqual(response.status_code, 201)
|
||||
self.assertEqual(response.json(),
|
||||
{'id': 1, 'description': '1', 'box': 'BOX', 'cid': self.box.id, 'file': None,
|
||||
'returned': False, 'event': self.event.slug})
|
||||
self.assertEqual(response.json()['id'], 1)
|
||||
self.assertEqual(response.json()['description'], '1')
|
||||
self.assertEqual(response.json()['box'], 'BOX')
|
||||
self.assertEqual(response.json()['cid'], self.box.id)
|
||||
self.assertEqual(response.json()['file'], None)
|
||||
self.assertEqual(response.json()['returned'], False)
|
||||
self.assertEqual(response.json()['event'], self.event.slug)
|
||||
self.assertEqual(len(response.json()['related_issues']), 0)
|
||||
self.assertEqual(len(Item.objects.all()), 1)
|
||||
self.assertEqual(Item.objects.all()[0].id, 1)
|
||||
self.assertEqual(Item.objects.all()[0].description, '1')
|
||||
|
@ -92,9 +109,14 @@ class ItemTestCase(TestCase):
|
|||
response = self.client.patch(f'/api/2/{self.event.slug}/item/{item.id}/', {'description': '2'},
|
||||
content_type='application/json')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.json(),
|
||||
{'id': 1, 'description': '2', 'box': 'BOX', 'cid': self.box.id, 'file': None,
|
||||
'returned': False, 'event': self.event.slug})
|
||||
self.assertEqual(response.json()['id'], item.id)
|
||||
self.assertEqual(response.json()['description'], '2')
|
||||
self.assertEqual(response.json()['box'], 'BOX')
|
||||
self.assertEqual(response.json()['cid'], self.box.id)
|
||||
self.assertEqual(response.json()['file'], None)
|
||||
self.assertEqual(response.json()['returned'], False)
|
||||
self.assertEqual(response.json()['event'], self.event.slug)
|
||||
self.assertEqual(len(response.json()['related_issues']), 0)
|
||||
self.assertEqual(len(Item.objects.all()), 1)
|
||||
self.assertEqual(Item.objects.all()[0].id, 1)
|
||||
self.assertEqual(Item.objects.all()[0].description, '2')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue