def get_cohorts(request, id=None): items = Cohort.objects.filter(private=False) if isinstance(request.user, AnonymousUser) == False: # filter only to the local academy items = localize_query(items, request) upcoming = request.GET.get('upcoming', None) if upcoming == 'true': now = timezone.now() items = items.filter(kickoff_date__gte=now) academy = request.GET.get('academy', None) if academy is not None: items = items.filter(academy__slug__in=academy.split(",")) location = request.GET.get('location', None) if location is not None: items = items.filter(academy__slug__in=location.split(",")) items = items.order_by('kickoff_date') serializer = GetCohortSerializer(items, many=True) return Response(serializer.data)
def get(self, request, academy_id, user_id=None): is_many = bool(not user_id) if user_id is not None: item = ProfileAcademy.objects.filter( user__id=user_id, academy_id=academy_id).first() if item is None: raise ValidationException( 'Profile not found for this user and academy', 404) serializer = GETProfileAcademy(item, many=False) return Response(serializer.data) items = ProfileAcademy.objects.filter(academy__id=academy_id) items = localize_query(items, request) # only form this academy roles = request.GET.get('roles', None) if is_many and roles is not None: items = items.filter(role__in=roles.split(",")) status = request.GET.get('status', None) if is_many and status is not None: items = items.filter(status__iexact=status) if not is_many: items = items.first() serializer = GETProfileAcademy(items, many=is_many) return Response(serializer.data)
def validations(self, request, cohort_id=None, user_id=None, matcher=None, disable_cohort_user_just_once=False, disable_certificate_validations=False): if user_id is None: user_id = request.data.get('user') if cohort_id is None or user_id is None: raise ValidationException("Missing cohort_id or user_id", code=400) if User.objects.filter(id=user_id).count() == 0: raise ValidationException("invalid user_id", code=400) cohort = Cohort.objects.filter(id=cohort_id) if not cohort: raise ValidationException("invalid cohort_id", code=400) cohort = localize_query(cohort, request).first() # only from this academy if cohort is None: logger.debug(f"Cohort not be found in related academies") raise ValidationException('Specified cohort not be found') if not disable_cohort_user_just_once and CohortUser.objects.filter(user_id=user_id, cohort_id=cohort_id).count(): raise ValidationException('That user already exists in this cohort') if not disable_certificate_validations and self.count_certificates_by_cohort( cohort, user_id) > 0: raise ValidationException('This student is already in another cohort for the same certificate, please mark him/her hi educational status on this prior cohort as POSTPONED before cotinuing') role = request.data.get('role') if role == 'TEACHER' and CohortUser.objects.filter(role=role, cohort_id=cohort_id).exclude(user__id__in=[user_id]).count(): raise ValidationException('There can only be one main instructor in a cohort') cohort_user = CohortUser.objects.filter(user__id=user_id, cohort__id=cohort_id).first() is_graduated = request.data.get('educational_status') == 'GRADUATED' is_late = (True if cohort_user and cohort_user.finantial_status == 'LATE' else request.data .get('finantial_status') == 'LATE') if is_graduated and is_late: raise ValidationException(('Cannot be marked as `GRADUATED` if its financial ' 'status is `LATE`')) has_tasks = Task.objects.filter(user_id=user_id, task_status='PENDING', task_type='PROJECT').count() if is_graduated and has_tasks: raise ValidationException('User has tasks with status pending the educational status cannot be GRADUATED') data = {} for key in request.data: data[key] = request.data.get(key) data['cohort'] = cohort_id return { 'data': data, 'cohort': cohort, 'cohort_user': cohort_user, }
def get_leads(request, id=None): items = FormEntry.objects.all() if isinstance(request.user, AnonymousUser) == False: # filter only to the local academy items = localize_query(items, request) academy = request.GET.get('academy', None) if academy is not None: items = items.filter(academy__slug__in=academy.split(",")) start = request.GET.get('start', None) if start is not None: start_date = datetime.datetime.strptime(start, "%Y-%m-%d").date() items = items.filter(created_at__gte=start_date) end = request.GET.get('end', None) if end is not None: end_date = datetime.datetime.strptime(end, "%Y-%m-%d").date() items = items.filter(created_at__lte=end_date) items = items.order_by('created_at') serializer = FormEntrySerializer(items, many=True) return Response(serializer.data)
def get_tasks(request, id=None): items = Task.objects.all() logger.debug(f"Found {items.count()} tasks") if isinstance(request.user, AnonymousUser) == False: # filter only to the local academy items = localize_query(items, request, "cohort__academy__id__in") academy = request.GET.get('academy', None) if academy is not None: items = items.filter(cohort__academy__slug__in=academy.split(",")) user = request.GET.get('user', None) if user is not None: items = items.filter(user__id__in=user.split(",")) # tasks these cohorts (not the users, but the tasts belong to the cohort) cohort = request.GET.get('cohort', None) if cohort is not None: items = items.filter( Q(cohort__slug__in=cohort.split(",")) | Q(cohort__id__in=cohort.split(","))) # tasks from users that belong to these cohort stu_cohort = request.GET.get('stu_cohort', None) if stu_cohort is not None: items = items.filter( user__cohortuser__cohort__id__in=stu_cohort.split(","), user__cohortuser__role="STUDENT") # tasks from users that belong to these cohort teacher = request.GET.get('teacher', None) if teacher is not None: teacher_cohorts = CohortUser.objects.filter( user__id__in=teacher.split(","), role="TEACHER").values_list('cohort__id', flat=True) items = items.filter(user__cohortuser__cohort__id__in=teacher_cohorts, user__cohortuser__role="STUDENT") task_status = request.GET.get('task_status', None) if task_status is not None: items = items.filter(task_status__in=task_status.split(",")) revision_status = request.GET.get('revision_status', None) if revision_status is not None: items = items.filter(revision_status__in=revision_status.split(",")) task_type = request.GET.get('task_type', None) if task_type is not None: items = items.filter(task_type__in=task_type.split(",")) items = items.order_by('created_at') serializer = TaskGETSerializer(items, many=True) return Response(serializer.data)
def put(self, request, cohort_id=None, academy_id=None): if cohort_id is None: raise ValidationException("Missing cohort_id", code=400) cohort = Cohort.objects.filter(id=cohort_id, academy__id=academy_id) cohort = localize_query(cohort, request).first() # only from this academy if cohort is None: logger.debug(f"Cohort not be found in related academies") raise ValidationException('Specified cohort not be found') serializer = CohortPUTSerializer(cohort, data=request.data, context={ "request": request, "cohort_id": cohort_id }) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def get_leads_report(request, id=None): items = FormEntry.objects.all() if isinstance(request.user, AnonymousUser) == False: # filter only to the local academy items = localize_query(items, request) group_by = request.GET.get('by', 'location,created_at__date,course') if group_by != '': group_by = group_by.split(",") else: group_by = ['location', 'created_at__date', 'course'] academy = request.GET.get('academy', None) if academy is not None: items = items.filter(location__in=academy.split(",")) start = request.GET.get('start', None) if start is not None: start_date = datetime.datetime.strptime(start, "%Y-%m-%d").date() items = items.filter(created_at__gte=start_date) end = request.GET.get('end', None) if end is not None: end_date = datetime.datetime.strptime(end, "%Y-%m-%d").date() items = items.filter(created_at__lte=end_date) items = items.values(*group_by).annotate(total_leads=Count('location')) if "created_at__date" in group_by: items = items.annotate( created_date=Func( F('created_at'), Value('YYYYMMDD'), function='to_char', output_field=CharField() ) ) # items = items.order_by('created_at') return Response(items)
def validate(self, data): self.index = self.index + 1 request = self.context['request'] is_many = isinstance(request.data, list) cohort_id = self.context['cohort_id'] user_id = self.context['user_id'] disable_cohort_user_just_once = True disable_certificate_validations = True body = request.data if is_many else [request.data] request_item = body[self.index] is_post_method = request.method == 'POST' id = None if is_many and 'id' in request_item: id = request_item['id'] if is_many and 'user' in request_item: user_id = request_item['user'] if is_many and 'cohort' in request_item: cohort_id = request_item['cohort'] if id and (not user_id or not cohort_id): ids = CohortUser.objects.filter(id=id).values_list( 'user_id', 'cohort_id').first() if not ids: raise ValidationException("Invalid id", code=400) user_id = ids[0] cohort_id = ids[1] if user_id is None: user_id = request_item.get('user') if not is_many and (cohort_id is None or user_id is None): raise ValidationException("Missing cohort_id or user_id", code=400) if User.objects.filter(id=user_id).count() == 0: raise ValidationException("invalid user_id", code=400) cohort = Cohort.objects.filter(id=cohort_id) if not cohort: raise ValidationException("invalid cohort_id", code=400) # only from this academy cohort = localize_query(cohort, request).first() if cohort is None: logger.debug(f"Cohort not be found in related academies") raise ValidationException('Specified cohort not be found') if not disable_cohort_user_just_once and CohortUser.objects.filter( user_id=user_id, cohort_id=cohort_id).count(): raise ValidationException( 'That user already exists in this cohort') if ('role' in request_item and request_item['role'] != 'STUDENT' and not ProfileAcademy.objects.filter( user_id=user_id, academy__id=cohort.academy.id).exclude( role__slug='student').exists()): raise ValidationException( 'The user must be staff member to this academy before it can be a teacher' ) if (is_post_method and cohort.syllabus and self.count_certificates_by_cohort(cohort, user_id) > 0): raise ValidationException( 'This student is already in another cohort for the same certificate, please mark him/her hi educational status on this prior cohort different than ACTIVE before cotinuing' ) role = request_item.get('role') if role == 'TEACHER' and CohortUser.objects.filter( role=role, cohort_id=cohort_id).exclude(user__id__in=[user_id]).count(): raise ValidationException( 'There can only be one main instructor in a cohort') cohort_user = CohortUser.objects.filter(user__id=user_id, cohort__id=cohort_id).first() if not is_post_method and not cohort_user: raise ValidationException('Cannot find CohortUser') if not id and cohort_user: id = cohort_user.id is_graduated = request_item.get('educational_status') == 'GRADUATED' is_late = (True if cohort_user and cohort_user.finantial_status == 'LATE' else request_item.get('finantial_status') == 'LATE') if is_graduated and is_late: raise ValidationException( ('Cannot be marked as `GRADUATED` if its financial ' 'status is `LATE`')) has_tasks = Task.objects.filter(user_id=user_id, task_status='PENDING', task_type='PROJECT').count() if is_graduated and has_tasks: raise ValidationException( 'User has tasks with status pending the educational status cannot be GRADUATED' ) data = {} for key in request_item: data[key] = request_item.get(key) data['cohort'] = cohort_id user = User.objects.filter(id=user_id).first() return {**data, 'id': id, 'cohort': cohort, 'user': user}