From b0e6514b0f07b60ab96dbc41d339a3dd21489232 Mon Sep 17 00:00:00 2001 From: sprattj Date: Sun, 10 Dec 2017 20:10:57 -0500 Subject: [PATCH 1/2] Stats to views and urls. Styling changes in models and serializers --- backend/datastore/models.py | 17 +++-- backend/datastore/serializers.py | 5 +- backend/datastore/views.py | 116 +++++++++++++++++++++++++++---- backend/dropZoneHQ/urls.py | 12 +++- 4 files changed, 123 insertions(+), 27 deletions(-) diff --git a/backend/datastore/models.py b/backend/datastore/models.py index 5d2bb0c..d914ddb 100644 --- a/backend/datastore/models.py +++ b/backend/datastore/models.py @@ -204,7 +204,7 @@ class Meta: app_label = 'dropZoneHQ' -# Employees the work at the drop zone +# Employees working at the drop zone class Employees(models.Model): first_name = models.CharField(max_length=45) last_name = models.CharField(max_length=45) @@ -219,6 +219,11 @@ class Employees(models.Model): pin = models.CharField(max_length=45, blank=True) employment_date = models.DateTimeField(auto_now_add=True) + class Meta: + managed = True + db_table = 'employees' + app_label = 'dropZoneHQ' + # check is the pin of an employee matches the pin given @staticmethod def check_employee_pin(pin, employee): @@ -278,11 +283,6 @@ def employee_email_in_use(email): use = Employees.objects.filter(email=email) return use - class Meta: - managed = True - db_table = 'employees' - app_label = 'dropZoneHQ' - # Bridge between Employees and Roles. Many employees can perform many roles. class EmployeesEmployeeRoles(models.Model): @@ -316,7 +316,7 @@ class EmployeesSignouts(models.Model): (PACKED, 'packed'), (SIGNOUT, 'signout') ) - employee = models.ForeignKey('Employees', models.DO_NOTHING) + employee = models.ForeignKey('Employees', models.DO_NOTHING, primary_key=True) signout = models.ForeignKey('Signouts', models.DO_NOTHING) # What type of sign off occurred packed_signout = models.CharField(db_column='packed_or_signout', @@ -357,7 +357,6 @@ class Items(models.Model): brand = models.CharField(max_length=45, blank=True, null=True) description = models.CharField(max_length=45, blank=True, null=True) # Whether or not this item is rentable - # is_rentable = models.CharField(max_length=4) is_rentable = models.BooleanField(max_length=4) is_on_rig = models.BooleanField(max_length=4) is_available = models.BooleanField(max_length=4) @@ -429,7 +428,7 @@ class Rigs(models.Model): container = models.OneToOneField(Containers, models.DO_NOTHING) aad = models.OneToOneField(AutomaticActivationDevices, models.DO_NOTHING) # Whether or not this ris is built for a tandem jump - istandem = models.CharField(db_column='isTandem', max_length=4) + istandem = models.BooleanField(db_column='isTandem', max_length=4) # isrentable = models.BooleanField('Items') class Meta: diff --git a/backend/datastore/serializers.py b/backend/datastore/serializers.py index 4e64ad3..bfb497a 100644 --- a/backend/datastore/serializers.py +++ b/backend/datastore/serializers.py @@ -71,15 +71,16 @@ class Meta: class EmployeeSerializer(serializers.HyperlinkedModelSerializer): - #dropzones = DropZoneSerializer() - #dropzone = serializers.IntegerField(read_only=True) + roles = EmployeeEmployeeRoleSerializer(many=True, read_only=True) + class Meta: model = Employees fields = ('employee_id', 'first_name', 'last_name', 'email', 'dropzone_id', 'is_active', 'roles') class EmployeeVsSignoutSerializer(serializers.HyperlinkedModelSerializer): + class Meta: model = EmployeesVsSignouts fields = ('signout_id', 'jumpmaster', 'jumpmaster_id', 'load_number', diff --git a/backend/datastore/views.py b/backend/datastore/views.py index 9979646..18fddc2 100644 --- a/backend/datastore/views.py +++ b/backend/datastore/views.py @@ -154,7 +154,6 @@ def patch(self, request, *args, **kwargs): new_instance = serializer.save() return JsonResponse(data=serializer.data, status=status.HTTP_202_ACCEPTED) - class DropzoneList(generics.ListCreateAPIView, LoginRequiredMixin): queryset = Dropzones.objects.all() @@ -246,12 +245,15 @@ def post(self, request): recipient_list=[emp.email], fail_silently=False ) - return JsonResponse(data= serializer.data ,status=201) + return JsonResponse(data=serializer.data, status=status.HTTP_201_CREATED) else: return HttpResponse(status=status.HTTP_400_BAD_REQUEST) except: return HttpResponse(status=status.HTTP_204_NO_CONTENT) + + + class ItemList(generics.ListCreateAPIView, LoginRequiredMixin): queryset = Items.objects.all() serializer_class = ItemSerializer @@ -285,8 +287,13 @@ def post(self, request, *args, **kwargs): """ print(request.data.get('item')[0]) """ + item = Items.objects.get(item_id=request.data.get('item_id')) + item_id = item.item_id + ''' item = Items.objects.get(item_id=request.data.get('item')[0]) item_id = item.item_id + print(item_id) + ''' # employee = Employees.objects.get(employee_id=request.data.get('employee')[0]) # employee_id = employee.employee_id @@ -569,6 +576,7 @@ def post_emp_signout(employee_id, signout_id): timestamp=datetime.datetime.now()) return + def post_rental(request): renter_name = request.data.get('renter_name') @@ -580,16 +588,19 @@ def post_rental(request): rental_id = rental_id_dict.get("rental_id", "") return rental_id + def post_employee_rental(employee_id, rental_id): EmployeesRentals.objects.create(employee_id=employee_id, rental_id=rental_id) return + def post_item_rental(item_id, rental_id): ItemsRentals.objects.create(item_id=item_id, rental_id=rental_id) return + def patch_emp_signout(employee_id, signout_id): EmployeesSignouts.objects.create(signout_id=signout_id, employee_id=employee_id, @@ -597,19 +608,96 @@ def patch_emp_signout(employee_id, signout_id): timestamp=datetime.datetime.now()) return -''' -data = {'employee_id': employee_id, 'signout_id': signout_id, 'packed_signout': EmployeesSignouts.PACKED, - 'timestamp': datetime.datetime.now()} -print(data) -serializer = EmployeeSignoutSerializer(data=data) -print(serializer.get_fields()) -if serializer.is_valid(): - print(serializer.validated_data) - # serializer.save() - return -print(serializer.is_valid()) -''' +class EmpTandemCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + employee_id = self.kwargs.get('pk') + tjump_count = EmployeesVsSignoutsTandem.objects.filter(jumpmaster_id=employee_id).count() + return JsonResponse(data=tjump_count, status=status.HTTP_200_OK, safe=False) + + +class EmpStudentCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + sjump_count = EmployeesVsSignoutsStudent.objects.filter(jumpmaster_id=self.kwargs.get('pk')).count() + return JsonResponse(data=sjump_count, status=status.HTTP_200_OK, safe=False) + + +class EmpYearlyJumpCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + employee_id = self.kwargs.get('pk') + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=365) + jump_count = get_jump_count(employee_id=employee_id, start_date=start_date, end_date=end_date) + return JsonResponse(data=jump_count, status=status.HTTP_200_OK, safe=False) + + +class EmpMonthlyJumpCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + employee_id = self.kwargs.get('pk') + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=30) + jump_count = get_jump_count(employee_id, start_date, end_date) + return JsonResponse(data=jump_count, status=status.HTTP_200_OK, safe=False) + + +class EmpWeeklyJumpCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + employee_id = self.kwargs.get('pk') + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=7) + jump_count = get_jump_count(employee_id=employee_id, start_date=start_date, end_date=end_date) + return JsonResponse(data=jump_count, status=status.HTTP_200_OK, safe=False) + + +class EmpWeeklyPackCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + # TODO start_date needs to be gathered from request -- format? + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=7) + pack_count = get_pack_count(self.kwargs.get('pk'), start_date, end_date) + return JsonResponse(data=pack_count, status=status.HTTP_200_OK, safe=False) + + +class EmpMonthlyPackCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + # TODO start_date needs to be gathered from request -- format? + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=30) + pack_count = get_pack_count(self.kwargs.get('pk'), start_date, end_date) + return JsonResponse(data=pack_count, status=status.HTTP_200_OK, safe=False) + + +class EmpYearlyPackCount(generics.RetrieveAPIView): + + def get(self, request, *args, **kwargs): + start_date = datetime.datetime.now() + end_date = start_date - datetime.timedelta(days=365) + pack_count = get_pack_count(self.kwargs.get('pk'), start_date, end_date) + return JsonResponse(data=pack_count, status=status.HTTP_200_OK, safe=False) + + +def get_jump_count(employee_id, start_date, end_date): + + jump_count = EmployeesSignouts.objects.filter(employee_id=employee_id, + timestamp__lte=start_date, + timestamp__gte=end_date, + packed_signout=EmployeesSignouts.SIGNOUT).count() + return jump_count + + +def get_pack_count(employee_id, start_date, end_date): + pack_count = EmployeesSignouts.objects.filter(employee_id=employee_id, + timestamp__lte=start_date, + timestamp__gte=end_date, + packed_signout=EmployeesSignouts.PACKED).count() + return pack_count def get_emp_full_name(employee_id): diff --git a/backend/dropZoneHQ/urls.py b/backend/dropZoneHQ/urls.py index 8f8492c..f7b33eb 100644 --- a/backend/dropZoneHQ/urls.py +++ b/backend/dropZoneHQ/urls.py @@ -61,7 +61,7 @@ url(r'^(?i)claim[s]?/(?P[0-9]+)[/]?$', ClaimDetail.as_view()), url(r'^(?i)rental[s]?[/]?$', RentalList.as_view()), url(r'^(?i)rental[s]?[/]?$', RentalList.as_view()), - url(r'^(?i)dropzones-detail/$',DropzoneDetail.as_view()), + url(r'^(?i)dropzones-detail/$', DropzoneDetail.as_view()), url(r'^(?i)login/$', loginDropzone, name='login'), url(r'^(?i)logout/$', logoutDropzone, name='logout'), url(r'^(?i)temp_reset/(?P\w+)/$', reset_url_dropzone, name="password_reset_temp"), @@ -70,7 +70,15 @@ url(r'^(?i)create_dropzone/$', createDropzone, name='create_dropzone'), url(r'^(?i)dropzone/(?P[0-9]+)/create_employee/$', EmployeeView, name='create_employee'), url(r'^(?i)auth_employee/', authenticateUserPin, name='authenticate_user_pin'), - url(r'^(?i)auth_name_dropzone/', authenticateNameDropzone, name='authenticate_name_dropzone') + url(r'^(?i)auth_name_dropzone/', authenticateNameDropzone, name='authenticate_name_dropzone'), + url(r'^(?i)stat[s]?/total_tandem_count/(?P[0-9]+)[/]?S', EmpTandemCount.as_view()), + url(r'^(?i)stat[s]?/total_student_count/(?P[0-9]+)[/]?S', EmpStudentCount.as_view()), + url(r'^(?i)stat[s]?/yearly_jump_count/(?P[0-9]+)[/]?$', EmpYearlyJumpCount.as_view()), + url(r'^(?i)stat[s]?/monthly_jump_count/(?P[0-9]+)[/]?$', EmpMonthlyJumpCount.as_view()), + url(r'^(?i)stat[s]?/weekly_jump_count/(?P[0-9]+)[/]?$', EmpWeeklyJumpCount.as_view()), + url(r'^(?i)stat[s]?/yearly_pack_count/(?P[0-9]+[/]?$)', EmpYearlyPackCount.as_view()), + url(r'^(?i)stat[s]?/monthly_pack_count/(?P[0-9]+[/]?$)', EmpMonthlyPackCount.as_view()), + url(r'^(?i)stat[s]?/weekly_pack_count/(?P[0-9]+[/]?$)', EmpWeeklyPackCount.as_view()) ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += [ url(r'^.*/', TemplateView.as_view(template_name="index.html"), name='base') From 412fe390db908de5abbbf3f3bf628c49e01a0fbe Mon Sep 17 00:00:00 2001 From: sprattj Date: Sun, 10 Dec 2017 20:30:09 -0500 Subject: [PATCH 2/2] auth update --- backend/datastore/views.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/backend/datastore/views.py b/backend/datastore/views.py index b3c2c54..6c80806 100644 --- a/backend/datastore/views.py +++ b/backend/datastore/views.py @@ -12,7 +12,6 @@ import datetime - class AADList(LoginRequiredMixin, mixin.RoleArrayCookieRequiredMixin, generics.ListCreateAPIView): queryset = AutomaticActivationDevices.objects.all() serializer_class = AADSerializer @@ -230,40 +229,6 @@ class EmployeeDetail(LoginRequiredMixin, mixin.RoleArrayCookieRequiredMixin, gen role = ['admin'] - try: - dropzone = Dropzones.objects.get(request.POST['dropzone']) - first = request.POST['first_name'] - last = request.POST['last_name'] - email = request.POST['email'] - role = request.POST['role'] - dev = request.POST['dev'] - if Employees.employee_email_in_use(email) is not None: - emp = Employees.objects.create(first_name=first, last_name=last, email=email, dropzone=dropzone) - emp.dropzone = request.user - if dev is True or None: - emp.pin = pin = Employees.create_random_user_pin(emp.pk) - else: - emp.pin = Employees.pin_to_hash(Employees.create_random_user_pin(emp.pk)) - emp.roles = role - emp.save() - serializer = EmployeeSerializer(emp) - send_mail( - subject=util.employeePinTo(), - message=util.createPinResetMessage(pin), - from_email=util.fromEmailString(), - recipient_list=[emp.email], - fail_silently=False - ) - return JsonResponse(data=serializer.data, status=status.HTTP_201_CREATED) - else: - return HttpResponse(status=status.HTTP_400_BAD_REQUEST) - except: - return HttpResponse(status=status.HTTP_204_NO_CONTENT) - - - - -class ItemList(generics.ListCreateAPIView, LoginRequiredMixin): class ItemList(LoginRequiredMixin, generics.ListCreateAPIView): queryset = Items.objects.all() serializer_class = ItemSerializer