def get_queryset(self): user_id = self.request.GET.get('user_id') tag_id = self.request.GET.get('tag_id') if self.request.user.is_authenticated: if user_id: if not can_be_integer(user_id): return [] if tag_id: if not can_be_integer(tag_id): return [] try: profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get( department_member=profile, removed=False) tag = Tag.objects.get(id=tag_id, user=member, removed=False) return Task.objects.filter( user=member, tag=tag, removed=False).order_by('-created_at') except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return [] return []
def get_queryset(self): profile_id = self.kwargs['profile_id'] year_request = self.kwargs['year_request'] month_request = self.kwargs['month_request'] if month_request and year_request: if not can_be_integer(month_request): return [] if not can_be_integer(year_request): return [] if int(month_request) < 1 or int(month_request) > 12: return [] if int(year_request) < 1990 or int( year_request) > arrow.now().year: return [] try: start = arrow.now(). \ replace(month=int(month_request), year=int(year_request)). \ to(settings.TIME_ZONE).floor('month').datetime end = arrow.now(). \ replace(month=int(month_request), year=int(year_request)). \ to(settings.TIME_ZONE).ceil('month').datetime my_profile = Profile.objects.get(user__id=self.request.user.id) profile = Profile.objects.get(id=profile_id, removed=False) member = DepartmentMember.objects.get( department_member=profile) if my_profile.get_role() == 'Director': tag = Tag.objects.filter( user=member, created_at__range=(start, end), removed=False).order_by('-updated_at') return tag elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get( department_member=my_profile, removed=False) if int(me.department.id) == int(member.department.id): tag = Tag.objects.filter( user=member, created_at__range=(start, end), removed=False).order_by('-updated_at') return tag else: return [] else: return [] except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return [] else: return []
def get_queryset(self): user_id = self.request.user.id month_request = self.request.GET.get('month_request') year_request = self.request.GET.get('year_request') if self.request.user.is_authenticated: if user_id: if not can_be_integer(user_id): return [] if month_request and year_request: if not can_be_integer(month_request): return [] if not can_be_integer(year_request): return [] if int(month_request) < 1 or int(month_request) > 12: return [] if int(year_request) < 1990 or int(year_request) > arrow.now().year: return [] try: start = arrow.now().\ replace(month=int(month_request), year=int(year_request)).\ to(settings.TIME_ZONE).floor('month').datetime end = arrow.now().\ replace(month=int(month_request), year=int(year_request)).\ to(settings.TIME_ZONE).ceil('month').datetime profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get(department_member=profile, removed=False) return WorkTime.objects.filter(user=member, date__range=(start, end), removed=False) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist): return [] else: try: profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get(department_member=profile, removed=False) return WorkTime.objects.filter(user=member, removed=False) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, WorkTime.DoesNotExist): return [] return []
def add_comment_for_my_task_api_view(request): """ API thêm bình luận vào task của tôi :param request: :return: """ user_id = request.user.id task_id = request.data.get('task_id') cmt_content = request.data.get('cmt_content') if request.user.is_authenticated: if not task_id: return Response({ 'ok': False, 'msg': 'Không tồn tại Task!', }) if not can_be_integer(task_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy Task của bạn!', }) if not cmt_content: return Response({ 'ok': False, 'msg': 'Bạn chưa nhập gì cả!', }) try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) task = Task.objects.get(id=task_id, user=dpm, removed=False) comment = Comment(task=task, user=p, content=cmt_content) comment.save() return Response({ 'ok': True, 'msg': 'Gửi bình luận thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def get_one_tag_of_member_detail_api_view(request): """ API lấy thông tin chi tiết của một tag của một nhân viên :param request: user_id, tag_id :return: """ user_id = request.GET.get('user_id') tag_id = request.GET.get('tag_id') if request.user.is_authenticated: if user_id and tag_id: if not can_be_integer(user_id): return Response({}) if not can_be_integer(tag_id): return Response({}) try: profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get(department_member=profile, removed=False) my_profile = Profile.objects.get(user__id=request.user.id, removed=False) if my_profile.get_role() == 'Director': tag = Tag.objects.get(id=tag_id, user=member, removed=False) serializer = serializer_api.GetTagOfMemberSerializer(tag) return Response(serializer.data) elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get(department_member=my_profile, removed=False) if int(me.department.id) == int(member.department.id): tag = Tag.objects.get(id=tag_id, user=member, removed=False) serializer = serializer_api.GetTagOfMemberSerializer(tag) return Response(serializer.data) else: return Response({}) else: return Response({}) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({}) return Response({})
def get_queryset(self): user_id = self.request.user.id year_request = self.kwargs['year_request'] month_request = self.kwargs['month_request'] if month_request and year_request: if not can_be_integer(month_request): return [] if not can_be_integer(year_request): return [] if int(month_request) < 1 or int(month_request) > 12: return [] if int(year_request) < 1990 or int( year_request) > arrow.now().year: return [] try: start = arrow.now(). \ replace(month=int(month_request), year=int(year_request)). \ to(settings.TIME_ZONE).floor('month').datetime end = arrow.now(). \ replace(month=int(month_request), year=int(year_request)). \ to(settings.TIME_ZONE).ceil('month').datetime profile = Profile.objects.get(user__id=user_id) dpm = DepartmentMember.objects.get(department_member=profile) tag = Tag.objects.filter(user=dpm, created_at__range=(start, end), removed=False).order_by('-updated_at') return tag except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return [] else: return []
def get_queryset(self): task_id = self.request.GET.get('task_id') if self.request.user.is_authenticated: if task_id: if not can_be_integer(task_id): return [] try: task = Task.objects.get(id=task_id, removed=False) return Comment.objects.filter( task=task, removed=False).order_by('-created_at') except Task.DoesNotExist: return [] return []
def get_queryset(self): if self.request.user.is_authenticated: department_id = self.request.GET.get('department_id') try: my_profile = Profile.objects.get(user__id=self.request.user.id, removed=False) if not department_id: if my_profile.get_role() == 'Director': return DepartmentMember.objects.filter(removed=False) elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get( department_member=my_profile, removed=False) d_id = me.department.id department = Department.objects.get(pk=d_id) return DepartmentMember.objects.filter( department=department, removed=False) else: return [] if department_id: if not can_be_integer(department_id): return [] if my_profile.get_role() == 'Director': department = Department.objects.get(pk=department_id) return DepartmentMember.objects.filter( department=department, removed=False) elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get( department_member=my_profile, removed=False) d_id = me.department.id if int(d_id) == int(department_id): department = Department.objects.get( pk=department_id) return DepartmentMember.objects.filter( department=department, removed=False) else: return [] else: return [] except (Profile.DoesNotExist, Department.DoesNotExist, Department.DoesNotExist): return [] return []
def get_one_tag_detail_of_me_api_view(request): """ API lấy thông tin chi tiết của một tag của tôi :param request: tag_id :return: """ if request.user.is_authenticated: user_id = request.user.id tag_id = request.GET.get('tag_id') if tag_id: if not can_be_integer(tag_id): return Response({}) try: profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get(department_member=profile, removed=False) tag = Tag.objects.get(id=tag_id, user=member, removed=False) serializer = serializer_api.GetTagOfMemberSerializer(tag) return Response(serializer.data) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({}) return Response({})
def my_tag_computation_api_view(request): """ API cộng tất cả kết quả đạt được của Task rồi cập nhật cho Tag của tôi :param request: profile_id, tag_id :return: tạo mới một tag """ user_id = request.user.id profile_id = request.data.get('profile_id') tag_id = request.data.get('tag_id') if request.user.is_authenticated: if profile_id: if not can_be_integer(profile_id): return Response({ 'ok': False, 'msg': 'Nhân viên không tồn tại!', }) if not tag_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy KPI!', }) if not can_be_integer(tag_id): return Response({ 'ok': False, 'msg': 'Không tồn tại KPI!', }) try: tp = Profile.objects.get(user__id=user_id, id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) task = Task.objects.filter(tag=tag, removed=False) count = 0 for item in task: if item.state == 'CO': count += int(item.result_value) tag.finished = count percent = float(count) / float(tag.quantity) * 100.0 percent = round(percent, 2) tag.progress = percent tag.save() return Response({ 'ok': True, 'msg': 'Đồng bộ dữ liệu thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist, Task.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Chỉnh sửa KPI thất bại!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def get_profile_list_no_pagination_api_view(request): """ API lấy danh sách tag của tôi và không phân trang :param request: department_id :return: """ if request.user.is_authenticated: pern = request.user.profile.get_role() department_id = request.GET.get('department_id') data = [] if not department_id: if pern != 'Director' and pern != 'Manager': return Response([]) try: if pern == 'Director': profile = Profile.objects.filter(removed=False) for item in profile: data.append({ 'userId': item.user.id, 'profileId': item.id, 'fullName': item.full_name, }) return Response(data) if pern == 'Manager': dpm = DepartmentMember.objects.get( department_member=request.user.profile, removed=False) profile = DepartmentMember.objects.filter( department__id=dpm.department.id, removed=False) for item in profile: data.append({ 'userId': item.department_member.user.id, 'profileId': item.department_member.id, 'fullName': item.department_member.full_name, }) return Response(data) except (Profile.DoesNotExist, ): return Response([]) elif department_id: if not can_be_integer(department_id): return Response([]) if pern != 'Director' and pern != 'Manager': return Response([]) dpm = DepartmentMember.objects.get( department_member=request.user.profile, removed=False) if pern != 'Director' and dpm.department.id != int(department_id): return Response([]) try: profile = DepartmentMember.objects.filter( department__id=department_id, removed=False) for item in profile: data.append({ 'userId': item.department_member.user.id, 'profileId': item.department_member.id, 'fullName': item.department_member.full_name, }) return Response(data) except (DepartmentMember.DoesNotExist, ): return Response([]) return Response([])
def get_queryset(self): user_id = self.request.GET.get('user_id') query = self.request.GET.get('query') if self.request.user.is_authenticated: if user_id: if not can_be_integer(user_id): return [] try: profile = Profile.objects.get(user__id=user_id, removed=False) my_profile = Profile.objects.get(user__id=self.request.user.id, removed=False) if my_profile.get_role() == 'Director': member = DepartmentMember.objects.get(department_member=profile, removed=False) if not query: # lấy theo query=current return Tag.objects.filter(user=member, period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') elif query == 'all': return Tag.objects.filter(user=member, removed=False).order_by('-created_at') elif query == 'current': # kpi chưa hết hạn return Tag.objects.filter(user=member, period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') elif query == 'tmonth': # kpi được tạo trong tháng này, bắt đầu trong tháng này, kết thúc sau hôm nay start = arrow.now().to(settings.TIME_ZONE).floor('month').datetime end = arrow.now().to(settings.TIME_ZONE).ceil('month').datetime return Tag.objects.filter(user=member, period_start__range=(start, end), period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, created_at__range=(start, end), removed=False).order_by('-created_at') elif query == 'outdated': return Tag.objects.filter(user=member, period_end__lt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') else: return [] elif my_profile.get_role() == 'Manager': member = DepartmentMember.objects.get(department_member=profile, removed=False) me = DepartmentMember.objects.get(department_member=my_profile, removed=False) d_id = me.department.id if not query: return Tag.objects.filter(user=member, user__department__id=d_id, period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') elif query == 'all': return Tag.objects.filter(user=member, user__department__id=d_id, removed=False).order_by('-created_at') elif query == 'current': # kpi chưa hết hạn return Tag.objects.filter(user=member, user__department__id=d_id, period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') elif query == 'tmonth': # kpi được tạo trong tháng này, bắt đầu trong tháng này, kết thúc sau hôm nay start = arrow.now().to(settings.TIME_ZONE).floor('month').datetime end = arrow.now().to(settings.TIME_ZONE).ceil('month').datetime return Tag.objects.filter(user=member, user__department__id=d_id, period_start__range=(start, end), period_end__gt=arrow.now().to(settings.TIME_ZONE).datetime, created_at__range=(start, end), removed=False).order_by('-created_at') elif query == 'outdated': return Tag.objects.filter(user=member, user__department__id=d_id, period_end__lt=arrow.now().to(settings.TIME_ZONE).datetime, removed=False).order_by('-created_at') else: return [] except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return [] return []
def get_member_tag_statistics_api_view(request): """ API lấy số liệu thông kê của Tag của một nhân viên :param request: :return: """ if request.user.is_authenticated: user_id = request.GET.get('user_id') if not user_id: return Response({}) if not can_be_integer(user_id): return Response({}) try: my_profile = Profile.objects.get(user__id=request.user.id, removed=False) profile = Profile.objects.get(user__id=user_id, removed=False) if my_profile.get_role() == 'Director': member = DepartmentMember.objects.get(department_member=profile, removed=False) start = arrow.now().to(settings.TIME_ZONE).floor('month').datetime end = arrow.now().to(settings.TIME_ZONE).ceil('month').datetime wt = WorkTime.objects.filter(user=member, removed=False, date__range=(start, end)).aggregate(totalTime=Sum('time_total'))['totalTime'] tag = Tag.objects.filter(user=member, removed=False, created_at__range=(start, end)) total = 0 count_finished = 0 count_progress = 0 count_un_finished = 0 for item in tag: total += 1 if item.state == 'CO': count_finished += 1 elif item.state == 'PR': count_progress += 1 elif item.state == 'NF': count_un_finished += 1 return Response({ 'total_time': wt, 'total_tag': total, 'count_finished': count_finished, 'count_progress': count_progress, 'count_un_finished': count_un_finished, }) elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get(department_member=my_profile, removed=False) dpm = DepartmentMember.objects.get(department_member=profile, removed=False) if int(me.department.id) == int(dpm.department.id): member = DepartmentMember.objects.get(department_member=profile, removed=False) start = arrow.now().to(settings.TIME_ZONE).floor('month').datetime end = arrow.now().to(settings.TIME_ZONE).ceil('month').datetime wt = WorkTime.objects.filter(user=member, removed=False, date__range=(start, end)).aggregate(totalTime=Sum('time_total'))['totalTime'] tag = Tag.objects.filter(user=member, removed=False, created_at__range=(start, end)) total = 0 count_finished = 0 count_progress = 0 count_un_finished = 0 for item in tag: total += 1 if item.state == 'CO': count_finished += 1 elif item.state == 'PR': count_progress += 1 elif item.state == 'NF': count_un_finished += 1 return Response({ 'total_time': wt, 'total_tag': total, 'count_finished': count_finished, 'count_progress': count_progress, 'count_un_finished': count_un_finished, }) else: return Response({}) else: return Response({}) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({}) return Response({})
def edit_my_work_time_api_view(request): """ API chỉnh sửa hoặc xóa giờ làm việc của tôi :param request: :return: """ user_id = request.user.id work_time_id = request.data.get('work_time_id') work_date = request.data.get('date') start_in_day = request.data.get('start_in_day') end_in_day = request.data.get('end_in_day') rest_time = request.data.get('rest_time') work_time_request = request.data.get('work_time_request') if request.user.is_authenticated: if not work_time_id: return Response({ 'ok': False, 'msg': 'Không tồn tại giờ làm việc này!', }) if not can_be_integer(work_time_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy giờ làm việc của bạn!', }) if not work_time_request: return Response({ 'ok': False, 'msg': 'Không xác định được yêu cầu!', }) if work_time_request != 'edit' and work_time_request != 'remove': return Response({ 'ok': False, 'msg': 'Yêu cầu không hợp lệ!', }) if work_time_request == 'remove': try: profile = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=profile, removed=False) wt = WorkTime.objects.get(id=work_time_id, user=dpm, removed=False) wt.removed = True wt.save() return Response({ 'ok': True, 'msg': 'Xoá thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, WorkTime.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if work_time_request == 'edit': if not work_date: return Response({ 'ok': False, 'msg': 'Ngày làm việc không được để trống!', }) if not start_in_day: return Response({ 'ok': False, 'msg': 'Thời gian bắt đầu không được để trống!', }) if work_date: work_date = arrow.get(work_date).to(settings.TIME_ZONE).date() if start_in_day: start_in_day = arrow.get(start_in_day).to(settings.TIME_ZONE).time() if end_in_day: end_in_day = arrow.get(end_in_day).to(settings.TIME_ZONE).time() if start_in_day and end_in_day and end_in_day < start_in_day: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được trước thời gian bắt đầu!', }) try: profile = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=profile, removed=False) wt = WorkTime.objects.get(id=work_time_id, user=dpm, removed=False) total = 0 if start_in_day and end_in_day: start = datetime.combine(date.today(), start_in_day) end = datetime.combine(date.today(), end_in_day) total = end - start total = total.total_seconds() total = float(total) / 3600.0 if rest_time: total = float(total) - float(rest_time) wt.date = work_date wt.start_in_day = start_in_day wt.end_in_day = end_in_day wt.rest_time = rest_time wt.time_total = total wt.save() return Response({ 'ok': True, 'msg': 'Cập nhật thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, WorkTime.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def get_one_task_detail_of_me_api_view(request): """ API lấy thông tin chi tiết một task của tôi :param request: task_id :return: """ if request.user.is_authenticated: user_id = request.user.id task_id = request.GET.get('task_id') if task_id: if not can_be_integer(task_id): return Response({}) try: profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get( department_member=profile, removed=False) task = Task.objects.get(id=task_id, user=member, removed=False) # taskDesc = markdown2.markdown(task.task_description, # extras=["tables", # "fenced-code-blocks", # 'code-friendly']) if task.task_description else None return Response({ 'userId': task.user.department_member.user.id, 'fullName': task.user.department_member.full_name, 'avatarUrl': build_absolute_url( task.user.department_member.get_avatar_url()), 'sex': task.user.department_member.get_sex(), 'position': task.user.position, 'department': task.user.department.department_name, 'tagId': task.tag.id, 'taskId': task.pk, 'taskName': task.task_name, 'taskDescription': task.task_description, # 'taskDescEdit': task.task_description, 'periodStart': task.period_start, 'periodEnd': task.period_end, 'unitOfMeasure': task.unit_of_measure, 'targetValue': task.target_value, 'resultValue': task.result_value, 'progress': task.progress, 'weight': task.weight, 'taskState': task.get_state(), 'isFinished': task.is_finished, 'createdAt': task.created_at, 'updatedAt': task.updated_at, }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist): return Response({}) return Response({})
def add_new_tag_api_view(request): """ API tạo một kpi mới :param request: profile_id, tag_name, tag_description, period_start, period_end, quantity, weight :return: tạo mới một tag """ user_id = request.user.id profile_id = request.data.get('profile_id') tag_name = request.data.get('tag_name') tag_description = request.data.get('tag_description') period_start = request.data.get('period_start') period_end = request.data.get('period_end') quantity = request.data.get('quantity') weight = request.data.get('weight') if request.user.is_authenticated: try: my_profile = Profile.objects.get(user__id=user_id, removed=False) if my_profile.get_role() != 'Director' and my_profile.get_role() != 'Manager': return Response({ 'ok': False, 'msg': 'Bạn không có quyền tạo KPI!', }) except (Profile.DoesNotExist,): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if not profile_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy nhân viên!', }) if not can_be_integer(profile_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy nhân viên này!', }) if not tag_name: return Response({ 'ok': False, 'msg': 'Tiêu đề không được để trống!', }) if not tag_description: tag_description = None if not quantity: return Response({ 'ok': False, 'msg': 'Chỉ tiêu không được để trống!', }) if not can_be_integer(quantity): return Response({ 'ok': False, 'msg': 'Chỉ tiêu phải nhập số!', }) if not weight: weight = 1 if not can_be_integer(weight): return Response({ 'ok': False, 'msg': 'Trọng số phải nhập số!', }) if int(weight) < 1 or int(weight) > 10: return Response({ 'ok': False, 'msg': 'Trọng số phải có giá trị từ 1 đến 10!', }) if not period_start: return Response({ 'ok': False, 'msg': 'Thời gian bắt đầu không được để trống!' }) if not period_end: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được để trống!' }) period_start = arrow.get(period_start).to(settings.TIME_ZONE).datetime period_end = arrow.get(period_end).to(settings.TIME_ZONE).datetime if period_end < period_start: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được trước thời gian bắt đầu!' }) if my_profile.get_role() == 'Director': try: fp = Profile.objects.get(user__id=user_id, removed=False) tp = Profile.objects.get(id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) tag = Tag( user=dpm, tag_name=tag_name, tag_description=tag_description, period_start=period_start, period_end=period_end, weight=weight, quantity=quantity, finished=0, progress=0, state='PR', created_by=fp, ) tag.save() return Response({ 'ok': True, 'msg': 'Tạo KPI thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist): return Response({ 'ok': False, 'msg': 'Không tồn tại nhân viên này!', }) if my_profile.get_role() == 'Manager': try: me = DepartmentMember.objects.get(department_member=my_profile, removed=False) tp = Profile.objects.get(id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) if int(me.department.id) != int(dpm.department.id): return Response({ 'ok': False, 'msg': 'Nhân viên này không thuộc phòng ban của bạn!', }) else: tag = Tag( user=dpm, tag_name=tag_name, tag_description=tag_description, period_start=period_start, period_end=period_end, weight=weight, quantity=quantity, finished=0, progress=0, state='PR', created_by=my_profile, ) tag.save() return Response({ 'ok': True, 'msg': 'Tạo KPI thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist): return Response({ 'ok': False, 'msg': 'Không tồn tại nhân viên này!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def add_new_task_api_view(request): """ API tạo một task mới :param request: :return: """ user_id = request.user.id tag_id = request.data.get('tag_id') task_name = request.data.get('task_name') task_description = request.data.get('task_description') period_start = request.data.get('period_start') period_end = request.data.get('period_end') unit_of_measure = request.data.get('unit_of_measure') target_value = request.data.get('target_value') weight = request.data.get('weight') if request.user.is_authenticated: if not tag_id: return Response({ 'ok': False, 'msg': 'Không tồn tại KPI!', }) if not can_be_integer(tag_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy KPI bạn lựa chọn!', }) if not task_name: return Response({ 'ok': False, 'msg': 'Tiêu đề không được để trống!', }) if not task_description: task_description = None if not target_value: return Response({ 'ok': False, 'msg': 'Chỉ tiêu không được để trống!', }) if not unit_of_measure: unit_of_measure = None if not can_be_integer(target_value): return Response({ 'ok': False, 'msg': 'Chỉ tiêu phải nhập số!', }) if not weight: weight = 1 if not can_be_integer(weight): return Response({ 'ok': False, 'msg': 'Trọng số phải nhập số!', }) if int(weight) < 1 or int(weight) > 10: return Response({ 'ok': False, 'msg': 'Trọng số phải có giá trị từ 1 đến 10!', }) if period_start: period_start = arrow.get(period_start).to( settings.TIME_ZONE).datetime if period_end: period_end = arrow.get(period_end).to(settings.TIME_ZONE).datetime if period_start and period_end and period_end < period_start: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được trước thời gian bắt đầu!', }) if period_start and not period_end: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được để trống!', }) if not period_start and period_end: return Response({ 'ok': False, 'msg': 'Thời gian bắt đầu không được để trống!', }) if not period_start: period_start = None if not period_end: period_end = None try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) t = Tag.objects.get(id=tag_id) if dpm.department_member.user.id != t.user.department_member.user.id: return Response({ 'ok': False, 'msg': 'Không tồn tại KPI này!', }) if t.state == 'CO': return Response({ 'ok': False, 'msg': 'KPI này đã hoàn thành nên không thể tạo Task!', }) task = Task( user=dpm, task_name=task_name, task_description=task_description, period_start=period_start, period_end=period_end, unit_of_measure=unit_of_measure, target_value=target_value, progress=0, weight=weight, state='PR', tag=t, ) task.save() return Response({ 'ok': True, 'msg': 'Tạo Task thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Không tồn tại nhân viên hoặc KPI!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def edit_tag_member_api_view(request): """ API chỉnh sửa một Tag :param request: user_id, tag_id, tag_name, tag_description, period_start, period_end, quantity, weight :return: tạo mới một tag """ profile_id = request.data.get('profile_id') tag_id = request.data.get('tag_id') tag_request = request.data.get('tag_request') tag_name = request.data.get('tag_name') tag_description = request.data.get('tag_description') period_start = request.data.get('period_start') period_end = request.data.get('period_end') quantity = request.data.get('quantity') weight = request.data.get('weight') if request.user.is_authenticated: if not profile_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy nhân viên!', }) if not can_be_integer(profile_id): return Response({ 'ok': False, 'msg': 'Không tồn tại nhân viên!', }) if not tag_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy KPI!', }) if not can_be_integer(tag_id): return Response({ 'ok': False, 'msg': 'Không tồn tại KPI!', }) if not tag_request: return Response({ 'ok': False, 'msg': 'Không xác định được yêu cầu!', }) if tag_request != 'edit' and tag_request != 'remove': return Response({ 'ok': False, 'msg': 'Yêu cầu không hợp lệ!', }) if tag_request == 'remove': try: my_profile = Profile.objects.get(user__id=request.user.id, removed=False) if my_profile.get_role() == 'Director': tp = Profile.objects.get(id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) tag.removed = True tag.save() return Response({ 'ok': True, 'msg': 'Xóa KPI Thành Công!', }) elif my_profile.get_role() == 'Manager': me = DepartmentMember.objects.get(department_member=my_profile, removed=False) tp = Profile.objects.get(id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) if int(me.department.id) == int(dpm.department.id): tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) tag.removed = True tag.save() return Response({ 'ok': True, 'msg': 'Xóa KPI Thành Công!', }) else: return Response({ 'ok': False, 'msg': 'Bạn không có quyền xóa KPI này!', }) else: return Response({ 'ok': False, 'msg': 'Bạn không có quyền xóa KPI này!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if tag_request == 'edit': if not tag_name: return Response({ 'ok': False, 'msg': 'Tiêu đề không được để trống!', }) if not tag_description: tag_description = None if not quantity: return Response({ 'ok': False, 'msg': 'Chỉ tiêu không được để trống!', }) if not can_be_integer(quantity): return Response({ 'ok': False, 'msg': 'Chỉ tiêu phải nhập số!', }) if not weight: weight = 1 if not can_be_integer(weight): return Response({ 'ok': False, 'msg': 'Trọng số phải nhập số!', }) if int(weight) < 1 or int(weight) > 10: return Response({ 'ok': False, 'msg': 'Trọng số phải có giá trị từ 1 đến 10!', }) if not period_start: return Response({ 'ok': False, 'msg': 'Thời gian bắt đầu không được để trống!' }) if not period_end: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được để trống!' }) period_start = arrow.get(period_start).to(settings.TIME_ZONE).datetime period_end = arrow.get(period_end).to(settings.TIME_ZONE).datetime if period_end < period_start: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được trước thời gian bắt đầu!' }) try: fp = Profile.objects.get(user__id=request.user.id, removed=False) tp = Profile.objects.get(id=profile_id, removed=False) me = DepartmentMember.objects.get(department_member=fp, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) if fp.get_role() == 'Director': tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) tag.tag_name = tag_name tag.tag_description = tag_description tag.period_start = period_start tag.period_end = period_end tag.weight = weight tag.quantity = quantity tag.created_by = fp percent = float(tag.finished) / float(quantity) * 100.0 percent = round(percent, 2) tag.progress = percent tag.save() return Response({ 'ok': True, 'msg': 'Cập nhật KPI thành công!', }) elif fp.get_role() == 'Manager': if int(me.department.id) == int(dpm.department.id): tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) tag.tag_name = tag_name tag.tag_description = tag_description tag.period_start = period_start tag.period_end = period_end tag.weight = weight tag.quantity = quantity tag.created_by = fp percent = float(tag.finished) / float(quantity) * 100.0 percent = round(percent, 2) tag.progress = percent tag.save() return Response({ 'ok': True, 'msg': 'Cập nhật KPI thành công!', }) else: return Response({ 'ok': False, 'msg': 'Bạn không có quyền chỉnh sửa KPI này!', }) else: return Response({ 'ok': False, 'msg': 'Bạn không có quyền chỉnh sửa KPI này!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def edit_my_task_api_view(request): """ API chỉnh sửa task của tôi :param request: :return: """ user_id = request.user.id tag_id = request.data.get('tag_id') task_id = request.data.get('task_id') edit_task = request.data.get('edit_task') task_name = request.data.get('task_name') task_description = request.data.get('task_description') period_start = request.data.get('period_start') period_end = request.data.get('period_end') unit_of_measure = request.data.get('unit_of_measure') result_value = request.data.get('result_value') weight = request.data.get('weight') task_state = request.data.get('task_state') if request.user.is_authenticated: if not task_id: return Response({ 'ok': False, 'msg': 'Không tồn tại Task!', }) if not can_be_integer(task_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy Task của bạn!', }) if not edit_task: return Response({ 'ok': False, 'msg': 'Không xác định được yêu cầu chỉnh sửa task!', }) if not tag_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy KPI!', }) if not can_be_integer(tag_id): return Response({ 'ok': False, 'msg': 'Không tồn tại KPI!', }) if edit_task == 'remove': try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) task = Task.objects.get(id=task_id, user=dpm, removed=False) task.removed = True task.save() if task.state == 'CO': tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) task_list = Task.objects.filter(tag=tag, removed=False) count = 0 for item in task_list: if item.state == 'CO': count += int(item.result_value) tag.finished = count tag.save() return Response({ 'ok': True, 'msg': 'Xóa Task thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if edit_task == 'title': if not task_name: return Response({ 'ok': False, 'msg': 'Tiêu đề không được để trống!', }) if not task_description: task_description = None try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) task = Task.objects.get(id=task_id, user=dpm, removed=False) task.task_name = task_name task.task_description = task_description task.save() return Response({ 'ok': True, 'msg': 'Cập nhật Task thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if edit_task == 'compact': if not result_value: return Response({ 'ok': False, 'msg': 'Chỉ tiêu đã đạt không được để trống!', }) if not can_be_integer(result_value): return Response({ 'ok': False, 'msg': 'Chỉ tiêu phải nhập số!', }) if not task_state: return Response({ 'ok': False, 'msg': 'Trạng thái task không được để trống!', }) if task_state != 'Chưa Hoàn Thành' and task_state != 'Đang Thực Hiện' and task_state != 'Hoàn Thành': return Response({ 'ok': False, 'msg': 'Trạng thái task không hợp lệ!', }) if task_state == 'Chưa Hoàn Thành': task_state = 'NF' if task_state == 'Đang Thực Hiện': task_state = 'PR' if task_state == 'Hoàn Thành': task_state = 'CO' try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) task = Task.objects.get(id=task_id, user=dpm, removed=False) if task.is_finished: return Response({ 'ok': False, 'msg': 'Task này đã hoàn thành nên không thể chỉnh sửa!', }) task.result_value = result_value task.state = task_state percent = float(result_value) / float( task.target_value) * 100.0 percent = round(percent, 2) task.progress = percent if task_state == 'CO': task.is_finished = True task.save() if task.state == 'CO': tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) task_list = Task.objects.filter(tag=tag, removed=False) count = 0 for item in task_list: if item.state == 'CO': count += int(item.result_value) tag.finished = count tag.save() return Response({ 'ok': True, 'msg': 'Cập nhật Task thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) if edit_task == 'total': if not result_value: return Response({ 'ok': False, 'msg': 'Chỉ tiêu đã đạt không được để trống!', }) if not unit_of_measure: unit_of_measure = None if not can_be_integer(result_value): return Response({ 'ok': False, 'msg': 'Chỉ tiêu đã đạt phải nhập số!', }) if not weight: weight = 1 if not can_be_integer(weight): return Response({ 'ok': False, 'msg': 'Trọng số phải nhập số!', }) if int(weight) < 1 or int(weight) > 10: return Response({ 'ok': False, 'msg': 'Trọng số phải có giá trị từ 1 đến 10!', }) if not task_state: return Response({ 'ok': False, 'msg': 'Trạng thái task không được để trống!', }) if task_state != 'Chưa Hoàn Thành' and task_state != 'Đang Thực Hiện' and task_state != 'Hoàn Thành': return Response({ 'ok': False, 'msg': 'Trạng thái task không hợp lệ!', }) if task_state == 'Chưa Hoàn Thành': task_state = 'NF' if task_state == 'Đang Thực Hiện': task_state = 'PR' if task_state == 'Hoàn Thành': task_state = 'CO' if period_start: period_start = arrow.get(period_start).to( settings.TIME_ZONE).datetime if period_end: period_end = arrow.get(period_end).to( settings.TIME_ZONE).datetime if period_start and period_end and period_end < period_start: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được trước thời gian bắt đầu!', }) if period_start and not period_end: return Response({ 'ok': False, 'msg': 'Thời gian kết thúc không được để trống!', }) if not period_start and period_end: return Response({ 'ok': False, 'msg': 'Thời gian bắt đầu không được để trống!', }) if not period_start: period_start = None if not period_end: period_end = None try: p = Profile.objects.get(user__id=user_id, removed=False) dpm = DepartmentMember.objects.get(department_member=p, removed=False) task = Task.objects.get(id=task_id, user=dpm, removed=False) if task.is_finished: return Response({ 'ok': False, 'msg': 'Task này đã hoàn thành nên không thể chỉnh sửa!', }) task.period_start = period_start task.period_end = period_end task.unit_of_measure = unit_of_measure task.result_value = result_value percent = float(result_value) / float( task.target_value) * 100.0 percent = round(percent, 2) task.progress = percent task.weight = weight task.state = task_state if task_state == 'CO': task.is_finished = True task.save() if task.state == 'CO': tag = Tag.objects.get(id=tag_id, user=dpm, removed=False) task_list = Task.objects.filter(tag=tag, removed=False) count = 0 for item in task_list: if item.state == 'CO': count += int(item.result_value) tag.finished = count tag.save() return Response({ 'ok': True, 'msg': 'Cập nhật Task thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Task.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Chỉnh sửa task thất bại!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def edit_my_tag_api_view(request): """ API cập nhật KPI của tôi :param request: profile_id, tag_id, finished, tag_state :return: tạo mới một tag """ user_id = request.user.id profile_id = request.data.get('profile_id') tag_id = request.data.get('tag_id') finished = request.data.get('finished') tag_state = request.data.get('tag_state') if request.user.is_authenticated: if profile_id: if not can_be_integer(profile_id): return Response({ 'ok': False, 'msg': 'Nhân viên không tồn tại!', }) if not tag_id: return Response({ 'ok': False, 'msg': 'Không tìm thấy KPI!', }) if not can_be_integer(tag_id): return Response({ 'ok': False, 'msg': 'Không tồn tại KPI!', }) if not tag_state: return Response({ 'ok': False, 'msg': 'Trạng thái KPI không được để trống!', }) if tag_state != 'Chưa Hoàn Thành' and tag_state != 'Đang Thực Hiện' and tag_state != 'Hoàn Thành': return Response({ 'ok': False, 'msg': 'Trạng thái KPI không hợp lệ!', }) if tag_state == 'Chưa Hoàn Thành': tag_state = 'NF' if tag_state == 'Đang Thực Hiện': tag_state = 'PR' if tag_state == 'Hoàn Thành': tag_state = 'CO' if not finished: return Response({ 'ok': False, 'msg': 'Kết quả đạt được không được để trống!', }) if not can_be_integer(finished): return Response({ 'ok': False, 'msg': 'Kết quả đạt được phải nhập số!', }) try: tp = Profile.objects.get(user__id=user_id, id=profile_id, removed=False) dpm = DepartmentMember.objects.get(department_member=tp, removed=False) tag = Tag.objects.get(id=tag_id, user=dpm) if tag.state == 'CO': return Response({ 'ok': False, 'msg': 'KPI này đã hoàn thành nên không thể chỉnh sửa!', }) percent = float(finished) / float(tag.quantity) * 100.0 percent = round(percent, 2) tag.finished = finished tag.progress = percent tag.state = tag_state tag.save() return Response({ 'ok': True, 'msg': 'Cập nhật KPI thành công!', }) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist, Tag.DoesNotExist): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Chỉnh sửa KPI thất bại!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def edit_comment_for_my_task_api_view(request): """ API chỉnh sửa hoặc xóa bình luận trong task của tôi :param request: :return: """ comment_id = request.data.get('comment_id') cmt_content = request.data.get('cmt_content') cmt_request = request.data.get('cmt_request') if request.user.is_authenticated: if not comment_id: return Response({ 'ok': False, 'msg': 'Không tồn tại bình luận!', }) if not can_be_integer(comment_id): return Response({ 'ok': False, 'msg': 'Không tìm thấy bình luận của bạn!', }) if not cmt_request: return Response({ 'ok': False, 'msg': 'Không xác định được yêu cầu của bạn!', }) if cmt_request != 'edit' and cmt_request != 'remove': return Response({ 'ok': False, 'msg': 'Yêu cầu không hợp lệ!', }) if cmt_request == 'remove': try: comment = Comment.objects.get(id=comment_id, user=request.user.profile, removed=False) comment.removed = True comment.save() return Response({ 'ok': True, 'msg': 'Xóa bình luận thành công!', }) except (Comment.DoesNotExist, ): return Response({ 'ok': True, 'msg': 'Lỗi dữ liệu!', }) if cmt_request == 'edit': if not cmt_content: return Response({ 'ok': False, 'msg': 'Bạn chưa nhập gì cả!', }) try: comment = Comment.objects.get(id=comment_id, user=request.user.profile, removed=False) comment.content = cmt_content comment.save() return Response({ 'ok': True, 'msg': 'Cập nhật bình luận thành công!', }) except (Comment.DoesNotExist, ): return Response({ 'ok': False, 'msg': 'Lỗi dữ liệu!', }) return Response({ 'ok': False, 'msg': 'Bạn chưa đăng nhập!', })
def get_profile_info_specific_in_department(request): """ API lấy thông tin cơ bản của một nhân viên :param request: :return: """ if request.user.is_authenticated: pern = request.user.profile.get_role() user_id = request.GET.get('user_id') if not user_id: return Response({}) if not can_be_integer(user_id): return Response({}) try: if pern == 'Director': profile = Profile.objects.get(user__id=user_id, removed=False) member = DepartmentMember.objects.get( department_member=profile, removed=False) return Response({ 'userId': member.department_member.user.id, 'profileId': member.department_member.id, 'fullName': member.department_member.full_name, 'sex': member.department_member.get_sex(), 'avatarUrl': build_absolute_url( member.department_member.get_avatar_url()), 'position': member.position, 'departmentId': member.department.id, 'department': member.department.department_name, }) elif pern == 'Manager': profile = Profile.objects.get(user__id=user_id, removed=False) my_profile = Profile.objects.get(user__id=request.user.id, removed=False) me = DepartmentMember.objects.get(department_member=my_profile, removed=False) member = DepartmentMember.objects.get( department_member=profile, removed=False) if int(me.department.id) == int(member.department.id): return Response({ 'userId': member.department_member.user.id, 'profileId': member.department_member.id, 'fullName': member.department_member.full_name, 'sex': member.department_member.get_sex(), 'avatarUrl': build_absolute_url( member.department_member.get_avatar_url()), 'position': member.position, 'departmentId': member.department.id, 'department': member.department.department_name, }) else: return Response({}) else: return Response({}) except (Profile.DoesNotExist, DepartmentMember.DoesNotExist): return Response({}) return Response({})