示例#1
0
    def setUp(self):
        self.user = User.objects.create(first_name = 'test', last_name = 'User', username='******', email='*****@*****.**')
        self.braintree_user = SubscriptionManager.create_new_customer(self.user)
        self.braintree_user.payment_method_token = "ValidPaymentToken"
        self.braintree_user.save()

        self.user_no_payment_method = User.objects.create(username="******", email="*****@*****.**")
        self.braintree_user_no_payment = SubscriptionManager.create_new_customer(self.user_no_payment_method)

        self.user_not_properly_initialised = User.objects.create(username="******", email="*****@*****.**")
        self.client = APIClient()
示例#2
0
    def get_object(self):
        """If the user doesnt have permission to access the provided question, they are given 403 response"""
        try:
            question = Question.objects.get(pk=self.kwargs[self.lookup_url_kwarg])
        except ObjectDoesNotExist:
            raise Http404

        if question.restricted and not SubscriptionManager.can_user_access_subscription_content(self.request.user):
            raise PermissionDenied
        return question
    def get_object(self):
        """If the user doesnt have permission to access the provided question, they are given 403 response"""
        try:
            question = Question.objects.get(pk=self.kwargs[self.lookup_url_kwarg])
        except ObjectDoesNotExist:
            raise Http404

        if question.restricted and not SubscriptionManager.can_user_access_subscription_content(self.request.user):
            raise PermissionDenied
        return question
示例#4
0
    def get_queryset(self):
        """
        Show restricted questions only to Silver+ users. Questions can be
        accessed individually by question number or filtered by subtopic
        :return:
        """

        # No filtering. Just display all questions user has permissions for
        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            return Question.objects.all()
        else:
            return Question.objects.filter(restricted=False)
    def get_queryset(self):
        """
        Show restricted questions only to Silver+ users. Questions can be
        accessed individually by question number or filtered by subtopic
        :return:
        """

        # No filtering. Just display all questions user has permissions for
        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            return Question.objects.all()
        else:
            return Question.objects.filter(restricted=False)
示例#6
0
    def setUp(self):
        self.user = User.objects.create(first_name='test',
                                        last_name='User',
                                        username='******',
                                        email='*****@*****.**')
        self.braintree_user = SubscriptionManager.create_new_customer(
            self.user)

        self.user_not_initialized_properly = User.objects.create(
            username="******", email="madeup.madeup.com")

        self.client = APIClient()
    def setUp(self):
        self.user = User.objects.create(first_name = 'test', last_name = 'User', username='******', email='*****@*****.**')
        self.braintree_user = SubscriptionManager.create_new_customer(self.user)

        self.user_not_initialized = User.objects.create(username = "******", email="*****@*****.**")

        self.valid_payment_nonce = "ValidPaymentNonce"
        self.invalid_payment_nonce = "InvalidPaymentNonce"

        self.client = APIClient()

        when(SubscriptionManager).change_payment_method(self.braintree_user,self.valid_payment_nonce).thenReturn(True)
        when(SubscriptionManager).change_payment_method(self.braintree_user,self.invalid_payment_nonce).thenRaise(BraintreeError())
    def get_queryset(self):
        search_terms = self.kwargs.get('search_terms', None)
        if search_terms is None:
            raise ValidationError("Must provide a search term")

        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            questions = Question.objects.all()
        else:
            questions = Question.objects.filter(restricted=False)
        relevant_questions = watson_filter(questions, search_terms)
        if relevant_questions.exists():
            return relevant_questions
        else:
            raise Http404
示例#9
0
    def get_queryset(self):
        search_terms = self.kwargs.get('search_terms', None)
        if search_terms is None:
            raise ValidationError("Must provide a search term")

        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            questions = Question.objects.all()
        else:
            questions = Question.objects.filter(restricted=False)
        relevant_questions = watsonfilter(questions, search_terms)
        if relevant_questions.exists():
            return relevant_questions
        else:
            raise Http404
    def create(self, validated_data):
        """Register a new user. Also create a Braintree account for them."""
        username = validated_data.get('username', None)
        email = validated_data.get('email', None)
        password = validated_data.get('password1', None)
        first_name = validated_data.get('first_name', None)
        last_name = validated_data.get('last_name', None)

        try:
            with transaction.atomic():
                user = User.objects.create_user(username,
                                                email=email,
                                                password=password,
                                                first_name=first_name,
                                                last_name=last_name)
                emailaddress = EmailAddress(user=user, email=email)
                user.save()
                emailaddress.save()
                emailaddress.send_confirmation()
                SubscriptionManager.create_new_customer(user)
        except Exception as e:
            logging.exception("Could not register new user.")
            raise serializers.ValidationError(e.message)
        return user
示例#11
0
    def get_queryset(self):
        try:
            subtopics = Subtopic.objects.filter(topic=self.kwargs[self.lookup_url_kwarg])
        except:
            raise Http404
        questions_r = Question.objects.filter(subtopic__in=subtopics)
        if not questions_r.exists():
            raise Http404  # Topic is empty (contains no questions)

        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            return questions_r  # Give privileged user all questions

        questions = Question.objects.filter(subtopic__in=subtopics, restricted=False)
        if not questions.exists():
            # Catch case where subtopic exists,
            # but all questions in it are restricted
            raise PermissionDenied
        return questions
    def get_queryset(self):
        try:
            subtopics = Subtopic.objects.filter(topic=self.kwargs[self.lookup_url_kwarg])
        except:
            raise Http404
        questions_r = Question.objects.filter(subtopic__in=subtopics)
        if not questions_r.exists():
            raise Http404  # Topic is empty (contains no questions)

        if SubscriptionManager.can_user_access_subscription_content(self.request.user):
            return questions_r  # Give privileged user all questions

        questions = Question.objects.filter(subtopic__in=subtopics, restricted=False)
        if not questions.exists():
            # Catch case where subtopic exists,
            # but all questions in it are restricted
            raise PermissionDenied
        return questions
示例#13
0
    def get_queryset(self):
        topic = self.kwargs.get('topic', None)
        subtopic = self.kwargs.get('subtopic', None)
        if topic is not None and subtopic is not None:
            try:
                subtopic_pk = Subtopic.objects.get(topic=topic, name=subtopic)
            except:
                raise Http404
            questions_r = Question.objects.filter(subtopic=subtopic_pk)
            if not questions_r.exists():
                # User picked an empty topic
                raise Http404
            if SubscriptionManager.can_user_access_subscription_content(self.request.user):
                return questions_r
            questions = Question.objects.filter(subtopic=subtopic_pk, restricted=False)

            if not questions.exists():
                # Catch case where subtopic exists,
                # but all questions in it are restricted
                raise PermissionDenied
            return questions
    def get_queryset(self):
        topic = self.kwargs.get('topic', None)
        subtopic = self.kwargs.get('subtopic', None)
        if topic is not None and subtopic is not None:
            try:
                subtopic_pk = Subtopic.objects.get(topic=topic, name=subtopic)
            except:
                raise Http404
            questions_r = Question.objects.filter(subtopic=subtopic_pk)
            if not questions_r.exists():
                # User picked an empty topic
                raise Http404
            if SubscriptionManager.can_user_access_subscription_content(self.request.user):
                return questions_r
            questions = Question.objects.filter(subtopic=subtopic_pk, restricted=False)

            if not questions.exists():
                # Catch case where subtopic exists,
                # but all questions in it are restricted
                raise PermissionDenied
            return questions
示例#15
0
    def setUp(self):
        self.user = User.objects.create(first_name='test',
                                        last_name='User',
                                        username='******',
                                        email='*****@*****.**')
        self.braintree_user = SubscriptionManager.create_new_customer(
            self.user)

        self.user_not_initialized = User.objects.create(
            username="******", email="*****@*****.**")

        self.valid_payment_nonce = "ValidPaymentNonce"
        self.invalid_payment_nonce = "InvalidPaymentNonce"

        self.client = APIClient()

        when(SubscriptionManager).change_payment_method(
            self.braintree_user, self.valid_payment_nonce).thenReturn(True)
        when(SubscriptionManager).change_payment_method(
            self.braintree_user,
            self.invalid_payment_nonce).thenRaise(BraintreeError())
 def setUp(self):
     self.user = User.objects.create(first_name = 'test', last_name = 'User', username='******', email='*****@*****.**')
     SubscriptionManager.create_new_customer(self.user)
     self.client = APIClient()
示例#17
0
    def setUp(self):

        self.client = APIClient()

        self.user = User.objects.create(first_name='test',
                                        last_name='User',
                                        username='******',
                                        email='*****@*****.**')
        self.braintree_user = SubscriptionManager.create_new_customer(
            self.user)
        self.braintree_user.subscription_id = "ValidSubscriptionID"
        self.braintree_user.save()

        self.user_pending_cancel = User.objects.create(
            username='******', email='*****@*****.**')
        self.braintree_user_pending_cancel = SubscriptionManager.create_new_customer(
            self.user_pending_cancel)
        self.braintree_user_pending_cancel.subscription_id = "ValidSubscriptionID"
        self.braintree_user_pending_cancel.pending_cancel = True
        self.braintree_user_pending_cancel.save()

        self.user_not_subscribed = User.objects.create(
            username="******", email="*****@*****.**")
        self.braintree_user_not_subscribed = SubscriptionManager.create_new_customer(
            self.user_not_subscribed)

        self.user_not_subscribed_return = mock()

        self.user_subscribed_active_return = mock()
        self.user_subscribed_active_return.status = braintree.Subscription.Status.Active
        self.user_subscribed_active_return.billing_period_start_date = datetime.datetime(
            2016, 8, 7)
        self.user_subscribed_active_return.billing_period_end_date = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_active_return.created_at = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_active_return.price = 30

        self.user_subscribed_pending_return = mock()
        self.user_subscribed_pending_return.status = braintree.Subscription.Status.Pending
        self.user_subscribed_pending_return.billing_period_start_date = datetime.datetime(
            2016, 8, 7)
        self.user_subscribed_pending_return.billing_period_end_date = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_pending_return.created_at = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_pending_return.price = 30

        self.user_subscribed_past_due_return = mock()
        self.user_subscribed_past_due_return.status = braintree.Subscription.Status.PastDue
        self.user_subscribed_past_due_return.billing_period_start_date = datetime.datetime(
            2016, 8, 7)
        self.user_subscribed_past_due_return.billing_period_end_date = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_past_due_return.created_at = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_past_due_return.price = 30

        self.user_subscribed_cancelled_return = mock()
        self.user_subscribed_cancelled_return.status = braintree.Subscription.Status.Canceled
        self.user_subscribed_cancelled_return.billing_period_start_date = datetime.datetime(
            2016, 8, 7)
        self.user_subscribed_cancelled_return.billing_period_end_date = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_cancelled_return.created_at = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_cancelled_return.price = 30

        self.user_subscribed_expired_return = mock()
        self.user_subscribed_expired_return.status = braintree.Subscription.Status.Expired
        self.user_subscribed_expired_return.billing_period_start_date = datetime.datetime(
            2016, 8, 7)
        self.user_subscribed_expired_return.billing_period_end_date = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_expired_return.created_at = datetime.datetime(
            2017, 8, 7)
        self.user_subscribed_expired_return.price = 30
示例#18
0
    def post(self, request, format=None):
        # Restrict access to paid users
        if not SubscriptionManager.can_user_access_subscription_content(
                request.user):
            raise PermissionDenied

        # Get raw questions
        topic_list = request.data['topic_list']
        max_questions = int(request.data['max_questions'])

        # Catch empty topic list
        if len(topic_list) < 1:
            raise ValidationError("Topic list provided was empty")
        # Catch zero or negative max questions
        if max_questions < 1:
            raise ValidationError("Must have at least 1 question in a quiz")

        # Work out the max number of questions available in database per topic
        total_questions_available = 0
        questions_available_per_topic = []
        for topic in topic_list:
            subtopic = Subtopic.objects.get(topic=topic['topic'],
                                            name=topic['subtopic'])
            questions = Question.objects.filter(subtopic=subtopic)
            count = questions.count()
            total_questions_available += count
            questions_available_per_topic.append(count)

        # Now work out target number of questions per topic
        if total_questions_available < max_questions:
            max_questions = total_questions_available
            enough_questions_available = False

        target_questions_per_topic = max_questions / len(topic_list)

        # Redistribute based on limits
        # Reduce questions required for topics with too few questions
        questions_per_topic = [target_questions_per_topic] * len(topic_list)
        questions_left_to_assign = max_questions
        for index, questions_for_topic in enumerate(questions_per_topic):
            if questions_per_topic[index] > questions_available_per_topic[
                    index]:
                questions_per_topic[index] = questions_available_per_topic[
                    index]
            questions_left_to_assign -= questions_per_topic[index]

        # Now try to add questions for other topics
        while questions_left_to_assign > 0:
            for index, qNo in enumerate(questions_per_topic):
                if qNo < questions_available_per_topic[index]:
                    questions_per_topic[index] += 1
                    questions_left_to_assign -= 1
                    if questions_left_to_assign == 0:
                        break

        # Now combine topic list with questions for each
        topics_and_question_numbers = zip(topic_list, questions_per_topic)

        # build queryset
        queryset = []
        for topic, number_of_questions in topics_and_question_numbers:
            subtopic = Subtopic.objects.get(topic=topic['topic'],
                                            name=topic['subtopic'])
            questions = Question.objects.filter(
                subtopic=subtopic).order_by('?')
            queryset = list(chain(queryset, questions[0:number_of_questions]))

        serializer = QuestionSerializer(queryset, many=True)
        return Response(serializer.data)
示例#19
0
    def post(self,request,format=None):
        # Restrict access to paid users
        if not SubscriptionManager.can_user_access_subscription_content(request.user):
            raise PermissionDenied

        # Get raw questions
        topic_list = request.data['topic_list']
        max_questions = int(request.data['max_questions'])

        # Catch empty topic list
        if len(topic_list) < 1:
            raise ValidationError("Topic list provided was empty")
        # Catch zero or negative max questions
        if max_questions < 1:
            raise ValidationError("Must have at least 1 question in a quiz")

        # Work out the max number of questions available in database per topic
        total_questions_available = 0
        questions_available_per_topic = []
        for topic in topic_list:
            subtopic = Subtopic.objects.get(topic=topic['topic'],name=topic['subtopic'])
            questions = Question.objects.filter(subtopic=subtopic)
            count = questions.count()
            total_questions_available += count
            questions_available_per_topic.append(count)

        # Now work out target number of questions per topic
        if total_questions_available < max_questions:
            max_questions = total_questions_available
            enough_questions_available = False

        target_questions_per_topic = max_questions / len(topic_list)

        # Redistribute based on limits
        # Reduce questions required for topics with too few questions
        questions_per_topic = [target_questions_per_topic] * len(topic_list)
        questions_left_to_assign = max_questions
        for index,questions_for_topic in enumerate(questions_per_topic):
            if questions_per_topic[index] > questions_available_per_topic[index]:
                questions_per_topic[index] = questions_available_per_topic[index]
            questions_left_to_assign -=  questions_per_topic[index]

        # Now try to add questions for other topics
        while questions_left_to_assign > 0:
            for index, qNo in enumerate(questions_per_topic):
                if qNo < questions_available_per_topic[index]:
                    questions_per_topic[index] += 1
                    questions_left_to_assign -= 1
                    if questions_left_to_assign == 0:
                        break;

        # Now combine topic list with questions for each
        topics_and_question_numbers = zip(topic_list,questions_per_topic)

        # build queryset
        queryset = []
        for topic,number_of_questions in topics_and_question_numbers:
            subtopic = Subtopic.objects.get(topic=topic['topic'],name=topic['subtopic'])
            questions = Question.objects.filter(subtopic=subtopic).order_by('?')
            queryset = list(chain(queryset, questions[0:number_of_questions]))

        serializer = QuestionSerializer(queryset, many=True)
        return Response(serializer.data)