Add pinball scores table and API route

master
Tanner Collin 2 years ago
parent e40383c0fd
commit 832a29f0c5
  1. 12
      apiserver/apiserver/api/models.py
  2. 48
      apiserver/apiserver/api/views.py
  3. 6
      apiserver/apiserver/secrets.py.example
  4. 1
      apiserver/apiserver/urls.py

@ -188,6 +188,18 @@ class Usage(models.Model):
history = HistoricalRecords(excluded_fields=['num_reports'])
class PinballScore(models.Model):
user = models.ForeignKey(User, related_name='scores', blank=True, null=True, on_delete=models.SET_NULL)
started_at = models.DateTimeField(auto_now_add=True)
finished_at = models.DateTimeField(null=True)
game_id = models.IntegerField()
player = models.IntegerField()
score = models.IntegerField()
# no history
class HistoryIndex(models.Model):
content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL)
object_id = models.PositiveIntegerField()

@ -1250,6 +1250,54 @@ class ProtocoinViewSet(Base):
return Response(res)
class PinballViewSet(Base):
@action(detail=False, methods=['post'])
def score(self, request):
auth_token = request.META.get('HTTP_AUTHORIZATION', '')
if secrets.PINBALL_API_TOKEN and auth_token != 'Bearer ' + secrets.PINBALL_API_TOKEN:
raise exceptions.PermissionDenied()
card_number = request.data.get('card_number', None)
if card_number:
card = get_object_or_404(models.Card, card_number=card_number)
user = card.user
else:
user = None
try:
game_id = int(request.data['game_id'])
except KeyError:
raise exceptions.ValidationError(dict(game_id='This field is required.'))
except ValueError:
raise exceptions.ValidationError(dict(game_id='Invalid number.'))
try:
player = int(request.data['player'])
except KeyError:
raise exceptions.ValidationError(dict(player='This field is required.'))
except ValueError:
raise exceptions.ValidationError(dict(player='Invalid number.'))
try:
score = int(request.data['score'])
except KeyError:
raise exceptions.ValidationError(dict(score='This field is required.'))
except ValueError:
raise exceptions.ValidationError(dict(score='Invalid number.'))
_ = models.PinballScore.objects.update_or_create(
game_id=game_id,
player=player,
defaults=dict(
user=user,
score=score,
finished_at=now(),
),
)
return Response(200)
class RegistrationView(RegisterView):
serializer_class = serializers.MyRegisterSerializer

@ -62,6 +62,12 @@ DOOR_API_TOKEN = ''
# head /dev/urandom | base32 | head -c 40
VEND_API_TOKEN = ''
# Pinball machine score API token
# Set this to random characters
# For example, use the output of this:
# head /dev/urandom | base32 | head -c 40
PINBALL_API_TOKEN = ''
# Protospace general info
DOOR_CODE = ''
WIFI_PASS = ''

@ -19,6 +19,7 @@ router.register(r'members', views.MemberViewSet, basename='members')
router.register(r'courses', views.CourseViewSet, basename='course')
router.register(r'history', views.HistoryViewSet, basename='history')
router.register(r'vetting', views.VettingViewSet, basename='vetting')
router.register(r'pinball', views.PinballViewSet, basename='pinball')
router.register(r'sessions', views.SessionViewSet, basename='session')
router.register(r'training', views.TrainingViewSet, basename='training')
router.register(r'interest', views.InterestViewSet, basename='interest')

Loading…
Cancel
Save