diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index e50470dc1c..466bf2014f 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -8,9 +8,12 @@ from stock.urls import stock_urls, stock_loc_urls, stock_track_urls from project.urls import prj_urls, prj_part_urls, prj_cat_urls, prj_run_urls from supplier.urls import cust_urls, manu_urls, supplier_part_urls, price_break_urls, supplier_urls from track.urls import unique_urls, part_track_urls +from users.urls import user_urls admin.site.site_header = "InvenTree Admin" + + apipatterns = [ # Stock URLs @@ -40,6 +43,9 @@ apipatterns = [ url(r'^project-category/', include(prj_cat_urls)), url(r'^project-part/', include(prj_part_urls)), url(r'^project-run/', include(prj_run_urls)), + + # User URLs + url(r'^user/', include(user_urls)), ] urlpatterns = [ diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 77ff41d75a..c4be02eb63 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.utils.translation import ugettext as _ from django.db import models from django.core.validators import MinValueValidator +from django.contrib.auth.models import User from supplier.models import SupplierPart from part.models import Part @@ -29,6 +30,7 @@ class StockItem(models.Model): # last time the stock was checked / counted stocktake_date = models.DateField(blank=True, null=True) + stocktake_user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) review_needed = models.BooleanField(default=False) @@ -63,7 +65,7 @@ class StockItem(models.Model): infinite = models.BooleanField(default=False) - def stocktake(self, count): + def stocktake(self, count, user): """ Perform item stocktake. When the quantity of an item is counted, record the date of stocktake @@ -76,6 +78,7 @@ class StockItem(models.Model): self.quantity = count self.stocktake_date = datetime.now().date() + self.stocktake_user = user self.save() def add_stock(self, amount): diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index e73be8531b..fc0c6979fe 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -18,6 +18,7 @@ class StockItemSerializer(serializers.HyperlinkedModelSerializer): 'notes', 'updated', 'stocktake_date', + 'stocktake_user', 'review_needed', 'expected_arrival') diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 26d6aa1e74..4dab2f4546 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -62,7 +62,7 @@ class StockStocktakeEndpoint(generics.UpdateAPIView): def update(self, request, *args, **kwargs): object = self.get_object() - object.stocktake(request.data['quantity']) + object.stocktake(request.data['quantity'], request.user) serializer = self.get_serializer(object) diff --git a/InvenTree/users/__init__.py b/InvenTree/users/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py new file mode 100644 index 0000000000..13be29d96f --- /dev/null +++ b/InvenTree/users/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/InvenTree/users/apps.py b/InvenTree/users/apps.py new file mode 100644 index 0000000000..251989770b --- /dev/null +++ b/InvenTree/users/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py new file mode 100644 index 0000000000..1dfab76043 --- /dev/null +++ b/InvenTree/users/models.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/InvenTree/users/serializers.py b/InvenTree/users/serializers.py new file mode 100644 index 0000000000..2bbb8adcca --- /dev/null +++ b/InvenTree/users/serializers.py @@ -0,0 +1,15 @@ +from rest_framework import serializers +from django.contrib.auth.models import User + + +class UserSerializer(serializers.HyperlinkedModelSerializer): + """ Serializer for a User + """ + + class Meta: + model = User + fields = ('username', + 'first_name', + 'last_name', + 'email',) + diff --git a/InvenTree/users/tests.py b/InvenTree/users/tests.py new file mode 100644 index 0000000000..5982e6bcd2 --- /dev/null +++ b/InvenTree/users/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/InvenTree/users/urls.py b/InvenTree/users/urls.py new file mode 100644 index 0000000000..92e2726535 --- /dev/null +++ b/InvenTree/users/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url, include + +from . import views + +user_urls = [ + url(r'^(?P[0-9]+)/?$', views.UserDetail.as_view(), name='user-detail'), + + url(r'^$', views.UserList.as_view()), +] diff --git a/InvenTree/users/views.py b/InvenTree/users/views.py new file mode 100644 index 0000000000..ba7e910ddc --- /dev/null +++ b/InvenTree/users/views.py @@ -0,0 +1,17 @@ +from rest_framework import generics, permissions, response +from django.contrib.auth.models import User +from .serializers import UserSerializer + + +class UserDetail(generics.RetrieveAPIView): + + queryset = User.objects.all() + serializer_class = UserSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + + +class UserList(generics.ListAPIView): + + queryset = User.objects.all() + serializer_class = UserSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,)