diff --git a/backend/datastore/models.py b/backend/datastore/models.py index cb5a294..8edc57f 100644 --- a/backend/datastore/models.py +++ b/backend/datastore/models.py @@ -223,7 +223,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) @@ -238,6 +238,10 @@ class Employees(models.Model): pin = models.CharField(max_length=45, blank=True, unique=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 @@ -299,11 +303,6 @@ def employee_email_in_use(email): emp = Employees.objects.filter(email=email) return emp - 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): @@ -337,7 +336,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', @@ -378,7 +377,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) @@ -450,7 +448,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 737a2a7..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 @@ -162,7 +161,7 @@ def patch(self, request, *args, **kwargs): serializer.is_valid(raise_exception=True) new_instance = serializer.save() return JsonResponse(data=serializer.data, status=status.HTTP_202_ACCEPTED) - + class DropzoneList(LoginRequiredMixin, generics.ListCreateAPIView): queryset = Dropzones.objects.all() @@ -266,6 +265,7 @@ def post(self, request, *args, **kwargs): item = Items.objects.get(item_id=request.data.get('item_id')) item_id = item.item_id + # employee = Employees.objects.get(employee_id=request.data.get('employee')[0]) # employee_id = employee.employee_id @@ -327,7 +327,7 @@ class ReserveCanopyDetail(LoginRequiredMixin, mixin.RoleArrayCookieRequiredMixin queryset = ReserveCanopies.objects.all() serializer_class = ReserveCanopySerializer role = ['admin', 'loft_head', 'loft'] - + def patch(self, request, *args, **kwargs): item_id = self.kwargs.get('pk') item = Items.objects.get(item_id=item_id) @@ -611,19 +611,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 a3cc7f8..2a2cffe 100644 --- a/backend/dropZoneHQ/urls.py +++ b/backend/dropZoneHQ/urls.py @@ -76,6 +76,24 @@ url(r'^(?i)reset_employee/$', PasswordResetEmployee.as_view(), name='pin reset'), url(r'^(?i)auth_employee/$', AuthenticateEmployeePin.as_view(), name='authenticate_user_pin'), url(r'^(?i)auth_dropzone/$', CheckSession.as_view(), name='authenticate_user'), + 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"), + url(r'^(?i)reset/$', password_reset_dropzone, name='password_reset'), + url(r'^(?i)reset_employee/$', password_reset_employee, name='pin reset'), + 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)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')