diff --git a/mhackspace/base/management/commands/generate_test_data.py b/mhackspace/base/management/commands/generate_test_data.py index a3b8a8d..52d33ba 100644 --- a/mhackspace/base/management/commands/generate_test_data.py +++ b/mhackspace/base/management/commands/generate_test_data.py @@ -7,6 +7,7 @@ from mhackspace.base.models import BannerImage from mhackspace.feeds.models import Article, Feed from mhackspace.users.models import User from mhackspace.blog.models import Category, Post +from mhackspace.rfid.models import Device class ImageFixture(AutoFixture): @@ -38,6 +39,18 @@ class Command(BaseCommand): }) users.create(10) + rfid = AutoFixture(Rfid) + rfid.create(20) + + device = AutoFixture(Device) + device.create(5) + + feed = AutoFixture(Feed) + feed.create(10) + + feeds = AutoFixture(Article) + feeds.create(10) + banners = ImageFixture(BannerImage) banners.create(10) self.stdout.write( diff --git a/mhackspace/rfid/admin.py b/mhackspace/rfid/admin.py index bd6db72..0567154 100644 --- a/mhackspace/rfid/admin.py +++ b/mhackspace/rfid/admin.py @@ -3,7 +3,7 @@ from django.contrib import admin from django.contrib.admin import ModelAdmin from django.forms.models import ModelChoiceField -from mhackspace.rfid.models import Device, Rfid, DeviceAuth +from mhackspace.rfid.models import Device, DeviceAuth @admin.register(Device) @@ -11,11 +11,6 @@ class DeviceAdmin(ModelAdmin): list_display = ('name', 'identifier') -@admin.register(Rfid) -class RfidAdmin(ModelAdmin): - list_display = ('code', 'description') - - # Probably need to look at this again @admin.register(DeviceAuth) class DeviceAuthAdmin(ModelAdmin): diff --git a/mhackspace/rfid/migrations/0001_initial.py b/mhackspace/rfid/migrations/0001_initial.py index fb37b39..e00b2b9 100644 --- a/mhackspace/rfid/migrations/0001_initial.py +++ b/mhackspace/rfid/migrations/0001_initial.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-14 21:15 +# Generated by Django 1.11 on 2017-04-27 18:29 from __future__ import unicode_literals -from django.conf import settings from django.db import migrations, models import django.db.models.deletion import django.utils.timezone @@ -14,7 +13,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0004_rfid'), ] operations = [ @@ -31,17 +30,13 @@ class Migration(migrations.Migration): name='DeviceAuth', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('device', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='device', to='rfid.Device')), - ('user', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_auth', to=settings.AUTH_USER_MODEL)), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rfid.Device')), + ('rfid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Rfid')), ], ), - migrations.CreateModel( - name='Rfid', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.PositiveIntegerField()), - ('description', models.CharField(blank=True, max_length=255, verbose_name='Short rfid description')), - ('user', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rfid_user', to=settings.AUTH_USER_MODEL)), - ], + migrations.AddField( + model_name='device', + name='members', + field=models.ManyToManyField(through='rfid.DeviceAuth', to='users.Rfid'), ), ] diff --git a/mhackspace/rfid/migrations/0002_auto_20170420_0730.py b/mhackspace/rfid/migrations/0002_auto_20170420_0730.py deleted file mode 100644 index da8ec64..0000000 --- a/mhackspace/rfid/migrations/0002_auto_20170420_0730.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-20 07:30 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('rfid', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='deviceauth', - name='device', - ), - migrations.RemoveField( - model_name='deviceauth', - name='user', - ), - migrations.AddField( - model_name='device', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='rfid', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.DeleteModel( - name='DeviceAuth', - ), - ] diff --git a/mhackspace/rfid/migrations/0003_auto_20170427_0743.py b/mhackspace/rfid/migrations/0003_auto_20170427_0743.py deleted file mode 100644 index 510a7f8..0000000 --- a/mhackspace/rfid/migrations/0003_auto_20170427_0743.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- 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'), - ), - ] diff --git a/mhackspace/rfid/models.py b/mhackspace/rfid/models.py index fdb7435..deedb82 100644 --- a/mhackspace/rfid/models.py +++ b/mhackspace/rfid/models.py @@ -7,25 +7,11 @@ from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ +from mhackspace.users.models import Rfid # just brainstorming so we can start playing with this, # be nice to make this a 3rd party django installable app ? -# users rfid card to user mapping, user can have more than one card -class Rfid(models.Model): - code = models.PositiveIntegerField() - description = models.CharField(_('Short rfid description'), blank=True, max_length=255) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - null=True, blank=True, - # related_name='rfid_user' - ) - - def __str__(self): - return self.description - - def name(self): - return self.user.name # description of a device like door, print, laser cutter @@ -39,11 +25,11 @@ class Device(models.Model): members = models.ManyToManyField(Rfid, through='DeviceAuth') - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - null=True, blank=True, - # related_name='rfid_user' - ) + # user = models.ForeignKey( + # settings.AUTH_USER_MODEL, + # null=True, blank=True, + # # related_name='rfid_user' + # ) def __str__(self): return self.name diff --git a/mhackspace/rfid/tests/tests.py b/mhackspace/rfid/tests/tests.py index f8bab6b..69254be 100644 --- a/mhackspace/rfid/tests/tests.py +++ b/mhackspace/rfid/tests/tests.py @@ -7,8 +7,8 @@ from test_plus.test import TestCase from rest_framework.test import APIRequestFactory from rest_framework.test import RequestsClient -from mhackspace.rfid.models import Device, Rfid, DeviceAuth -from mhackspace.users.models import User +from mhackspace.rfid.models import Device, DeviceAuth +from mhackspace.users.models import User, Rfid # http://www.django-rest-framework.org/api-guide/testing/ diff --git a/mhackspace/rfid/views.py b/mhackspace/rfid/views.py index 21103ed..5b68b1a 100644 --- a/mhackspace/rfid/views.py +++ b/mhackspace/rfid/views.py @@ -2,7 +2,8 @@ import logging from rest_framework.response import Response from rest_framework import viewsets from rest_framework import status -from mhackspace.rfid.models import Device, Rfid, DeviceAuth +from mhackspace.users.models import Rfid +from mhackspace.rfid.models import Device, DeviceAuth from mhackspace.rfid.serializers import DeviceSerializer, AuthSerializer from django.core.exceptions import ObjectDoesNotExist, ValidationError diff --git a/mhackspace/templates/users/rfid_form.html b/mhackspace/templates/users/rfid_form.html new file mode 100644 index 0000000..4e1762d --- /dev/null +++ b/mhackspace/templates/users/rfid_form.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% load crispy_forms_tags %} + +{% block title %}{{ user.username }}{% endblock %} + +{% block content %} +

{{ user.username }}

+
+ {% csrf_token %} + {{ form|crispy }} + {{ form_blurb|crispy }} +
+
+ +
+
+
+{% endblock %} diff --git a/mhackspace/templates/users/user_detail.html b/mhackspace/templates/users/user_detail.html index 9e354ea..a5a19ca 100644 --- a/mhackspace/templates/users/user_detail.html +++ b/mhackspace/templates/users/user_detail.html @@ -74,6 +74,7 @@

My Info + My Rfid Cards E-Mail

diff --git a/mhackspace/users/admin.py b/mhackspace/users/admin.py index ba7ca58..a183241 100644 --- a/mhackspace/users/admin.py +++ b/mhackspace/users/admin.py @@ -9,7 +9,7 @@ from django.contrib.auth.forms import UserChangeForm, UserCreationForm from django.http import HttpResponseRedirect from django.urls import reverse from django.conf.urls import url -from .models import User, Membership, MEMBERSHIP_STATUS_CHOICES +from .models import User, Rfid, Membership, MEMBERSHIP_STATUS_CHOICES from mhackspace.subscriptions.management.commands.update_membership_status import update_subscriptions @@ -64,3 +64,9 @@ class MyUserAdmin(AuthUserAdmin): class MembershipAdmin(ModelAdmin): list_display = ('user', 'payment', 'date', 'status') list_filter = ('status',) + + +@admin.register(Rfid) +class RfidAdmin(ModelAdmin): + list_display = ('code', 'description') + diff --git a/mhackspace/users/migrations/0004_rfid.py b/mhackspace/users/migrations/0004_rfid.py new file mode 100644 index 0000000..ae8ea00 --- /dev/null +++ b/mhackspace/users/migrations/0004_rfid.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-04-27 18:25 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_merge_20170226_0844'), + ] + + operations = [ + migrations.CreateModel( + name='Rfid', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.PositiveIntegerField()), + ('description', models.CharField(blank=True, max_length=255, verbose_name='Short rfid description')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/mhackspace/users/models.py b/mhackspace/users/models.py index 1f0808a..68b393d 100644 --- a/mhackspace/users/models.py +++ b/mhackspace/users/models.py @@ -90,3 +90,20 @@ class Membership(models.Model): def __str__(self): return self.reference + + +# users rfid card to user mapping, user can have more than one card +class Rfid(models.Model): + code = models.PositiveIntegerField() + description = models.CharField(_('Short rfid description'), blank=True, max_length=255) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + null=True, blank=True, + # related_name='rfid_user' + ) + + def __str__(self): + return self.description + + def name(self): + return self.user.name diff --git a/mhackspace/users/urls.py b/mhackspace/users/urls.py index 6ae4b6f..530b556 100644 --- a/mhackspace/users/urls.py +++ b/mhackspace/users/urls.py @@ -26,4 +26,9 @@ urlpatterns = [ view=views.UserUpdateView.as_view(), name='update' ), + url( + regex=r'^-access-cards$', + view=views.RfidCardsUpdateView.as_view(), + name='access_cards' + ), ] diff --git a/mhackspace/users/views.py b/mhackspace/users/views.py index c124721..43f5b2f 100644 --- a/mhackspace/users/views.py +++ b/mhackspace/users/views.py @@ -2,10 +2,11 @@ from __future__ import absolute_import, unicode_literals from django.core.urlresolvers import reverse -from django.views.generic import DetailView, ListView, RedirectView, UpdateView +from django.views.generic import DetailView, ListView, RedirectView, UpdateView, CreateView from django.contrib.auth.mixins import LoginRequiredMixin +from .models import Rfid from .models import User from .models import Blurb from .models import Membership @@ -65,6 +66,18 @@ class UserUpdateView(LoginRequiredMixin, UpdateView): return super(UserUpdateView, self).form_valid(form) + +class RfidCardsUpdateView(LoginRequiredMixin, CreateView): + fields = ['user', 'code', 'description', ] + model = Rfid + + def form_valid(self, form): + user = self.request.user + form.instance.user = user + return super(RfidCardsUpdateView, self).form_valid(form) + + + class UserListView(LoginRequiredMixin, ListView): model = User # These next two lines tell the view to index lookups by username