switched to mapping model, lookup in the api does not yet work
This commit is contained in:
parent
54f89e8b5b
commit
66e012f994
|
@ -1,14 +1,35 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.admin import ModelAdmin
|
from django.contrib.admin import ModelAdmin
|
||||||
|
from django.forms.models import ModelChoiceField
|
||||||
|
|
||||||
from mhackspace.rfid.models import Device, Rfid
|
from mhackspace.rfid.models import Device, Rfid, DeviceAuth
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Device)
|
@admin.register(Device)
|
||||||
class DeviceAdmin(ModelAdmin):
|
class DeviceAdmin(ModelAdmin):
|
||||||
list_display = ('name', 'identifier')
|
list_display = ('name', 'identifier')
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Rfid)
|
@admin.register(Rfid)
|
||||||
class RfidAdmin(ModelAdmin):
|
class RfidAdmin(ModelAdmin):
|
||||||
list_display = ('code',)
|
list_display = ('code', 'description')
|
||||||
|
|
||||||
|
|
||||||
|
# Probably need to look at this again
|
||||||
|
@admin.register(DeviceAuth)
|
||||||
|
class DeviceAuthAdmin(ModelAdmin):
|
||||||
|
list_display = ('rfid', 'device')
|
||||||
|
|
||||||
|
class CustomModelChoiceField(ModelChoiceField):
|
||||||
|
def label_from_instance(self, obj):
|
||||||
|
return obj.description + ' - ' + str(obj.user)
|
||||||
|
|
||||||
|
def formfield_for_foreignkey(self, db_field, request, **kwargs):
|
||||||
|
if db_field.name == "rfid":
|
||||||
|
return self.CustomModelChoiceField(
|
||||||
|
Rfid.objects.all(),
|
||||||
|
initial=request.user)
|
||||||
|
|
||||||
|
return super(DeviceAuthAdmin, self).formfield_for_foreignkey(
|
||||||
|
db_field, request, **kwargs)
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11 on 2017-04-27 07:43
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('rfid', '0002_auto_20170420_0730'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='DeviceAuth',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rfid.Device')),
|
||||||
|
('rfid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rfid.Rfid')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='device',
|
||||||
|
name='members',
|
||||||
|
field=models.ManyToManyField(through='rfid.DeviceAuth', to='rfid.Rfid'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -13,25 +13,23 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
# users rfid card to user mapping, user can have more than one card
|
# users rfid card to user mapping, user can have more than one card
|
||||||
class Rfid(models.Model):
|
class Rfid(models.Model):
|
||||||
|
code = models.PositiveIntegerField()
|
||||||
|
description = models.CharField(_('Short rfid description'), blank=True, max_length=255)
|
||||||
user = models.ForeignKey(
|
user = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
null=True, blank=True,
|
null=True, blank=True,
|
||||||
# related_name='rfid_user'
|
# related_name='rfid_user'
|
||||||
)
|
)
|
||||||
code = models.PositiveIntegerField()
|
|
||||||
description = models.CharField(_('Short rfid description'), blank=True, max_length=255)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.description
|
return self.description
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
return self.user.name
|
||||||
|
|
||||||
|
|
||||||
# description of a device like door, print, laser cutter
|
# description of a device like door, print, laser cutter
|
||||||
class Device(models.Model):
|
class Device(models.Model):
|
||||||
user = models.ForeignKey(
|
|
||||||
settings.AUTH_USER_MODEL,
|
|
||||||
null=True, blank=True,
|
|
||||||
# related_name='rfid_user'
|
|
||||||
)
|
|
||||||
# user = models.ManyToMany(settings.AUTH_USER_MODEL)
|
# user = models.ManyToMany(settings.AUTH_USER_MODEL)
|
||||||
identifier = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
identifier = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
|
|
||||||
|
@ -39,22 +37,25 @@ class Device(models.Model):
|
||||||
description = models.CharField(_('Short description of what the device does'), blank=True, max_length=255)
|
description = models.CharField(_('Short description of what the device does'), blank=True, max_length=255)
|
||||||
added_date = models.DateTimeField(default=timezone.now, editable=False)
|
added_date = models.DateTimeField(default=timezone.now, editable=False)
|
||||||
|
|
||||||
|
members = models.ManyToManyField(Rfid, through='DeviceAuth')
|
||||||
|
|
||||||
|
user = models.ForeignKey(
|
||||||
|
settings.AUTH_USER_MODEL,
|
||||||
|
null=True, blank=True,
|
||||||
|
# related_name='rfid_user'
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
# http://stackoverflow.com/questions/4443190/djangos-manytomany-relationship-with-additional-fields
|
||||||
# many to many, lookup user from rfid model then get there user_id and the device to check if auth allowed
|
# many to many, lookup user from rfid model then get there user_id and the device to check if auth allowed
|
||||||
# class DeviceAuth(models.Model):
|
class DeviceAuth(models.Model):
|
||||||
# user = models.ForeignKey(
|
rfid = models.ForeignKey(
|
||||||
# settings.AUTH_USER_MODEL,
|
Rfid,
|
||||||
# null=True, blank=True,
|
)
|
||||||
# default=None,
|
|
||||||
# related_name='user_auth'
|
|
||||||
# )
|
|
||||||
|
|
||||||
# device = models.ForeignKey(
|
device = models.ForeignKey(
|
||||||
# Device,
|
Device,
|
||||||
# null=True, blank=True,
|
)
|
||||||
# default=None,
|
|
||||||
# related_name='device'
|
|
||||||
# )
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from mhackspace.rfid.models import Device
|
from mhackspace.rfid.models import Device, DeviceAuth
|
||||||
|
|
||||||
|
|
||||||
class Task(object):
|
class Task(object):
|
||||||
|
@ -8,10 +8,11 @@ class Task(object):
|
||||||
for field in ('id', 'name', 'owner', 'status'):
|
for field in ('id', 'name', 'owner', 'status'):
|
||||||
setattr(self, field, kwargs.get(field, None))
|
setattr(self, field, kwargs.get(field, None))
|
||||||
|
|
||||||
|
|
||||||
class DeviceSerializer(serializers.ModelSerializer):
|
class DeviceSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Device
|
model = DeviceAuth
|
||||||
fields = ('name', )
|
fields = ('__all__')
|
||||||
|
|
||||||
|
|
||||||
class AuthSerializer(serializers.Serializer):
|
class AuthSerializer(serializers.Serializer):
|
||||||
|
|
|
@ -7,7 +7,7 @@ from test_plus.test import TestCase
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.test import RequestsClient
|
from rest_framework.test import RequestsClient
|
||||||
|
|
||||||
from mhackspace.rfid.models import Device, Rfid
|
from mhackspace.rfid.models import Device, Rfid, DeviceAuth
|
||||||
from mhackspace.users.models import User
|
from mhackspace.users.models import User
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ class ApiTests(TestCase):
|
||||||
self.device.save()
|
self.device.save()
|
||||||
self.rfid = Rfid(code='1', user=self.user)
|
self.rfid = Rfid(code='1', user=self.user)
|
||||||
self.rfid.save()
|
self.rfid.save()
|
||||||
|
self.auth = DeviceAuth(rfid=self.rfid, device=self.device)
|
||||||
|
self.save()
|
||||||
|
|
||||||
def testAuth(self):
|
def testAuth(self):
|
||||||
factory = APIRequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
|
@ -2,9 +2,9 @@ import logging
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from mhackspace.rfid.models import Device, Rfid
|
from mhackspace.rfid.models import Device, Rfid, DeviceAuth
|
||||||
from mhackspace.rfid.serializers import DeviceSerializer, AuthSerializer
|
from mhackspace.rfid.serializers import DeviceSerializer, AuthSerializer
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -20,18 +20,20 @@ class AuthUserWithDeviceViewSet(viewsets.ViewSet):
|
||||||
serializer_class = AuthSerializer
|
serializer_class = AuthSerializer
|
||||||
|
|
||||||
def list(self, request):
|
def list(self, request):
|
||||||
serializer = AuthSerializer(
|
serializer = DeviceSerializer(
|
||||||
instance={'name': '1', 'rfid': '1', 'device': '1'})
|
DeviceAuth.objects.all(), many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
def post(self, request, format=None):
|
def post(self, request, format=None):
|
||||||
try:
|
try:
|
||||||
rfid = Rfid.objects.get(code=request.data.get('rfid'))
|
rfid = Rfid.objects.get(code=request.data.get('rfid'))
|
||||||
device = Device.objects.get(user=rfid.user, identifier=request.data.get('device'))
|
device = Device.objects.get(identifier=request.data.get('device'))
|
||||||
|
deviceAuth = DeviceAuth.objects.get(device=device.identifier, rfid=rfid.id)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
return Response(status=status.HTTP_404_NOT_FOUND)
|
return Response(status=status.HTTP_404_NOT_FOUND)
|
||||||
except:
|
except ValidationError:
|
||||||
logger.exception("An error occurred")
|
# except:
|
||||||
|
# logger.exception("An error occurred")
|
||||||
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||||
serializer = AuthSerializer(
|
serializer = AuthSerializer(
|
||||||
instance={'name': device.name, 'rfid': rfid.code, 'device': device.identifier})
|
instance={'name': device.name, 'rfid': rfid.code, 'device': device.identifier})
|
||||||
|
|
Loading…
Reference in New Issue