コード例 #1
0
 def post(self, request, *args, **kwargs):
     if "get_answer" in request.POST.keys():
         entry = Entry.objects.get(pk=request.POST['get_answer'])
         entry.last_view_date = timezone.now()
         entry.amount_of_views += 1
         entry.save()
         return TemplateResponse(
             request,
             'frequently/partials/answer.html',
             {
                 'entry': entry,
                 'rated_entries': self.request.session.get(
                     'rated_entries', False),
             },
         )
     self.feedback = Feedback()
     if "user_id" in request.POST.keys():
         try:
             user_id = int(request.POST.get('user_id'))
             try:
                 self.feedback.user = User.objects.get(pk=user_id)
             except User.DoesNotExist:
                 pass
         except ValueError:
             pass
     if 'ratingID' in request.POST.keys() and request.is_ajax():
         try:
             entry_id = int(request.POST.get('ratingID').replace(
                 'ratingID', ''))
             try:
                 entry = Entry.objects.get(pk=entry_id)
                 return HttpResponse(entry.rating())
             except Entry.DoesNotExist:
                 return HttpResponseNotFound()
         except ValueError:
             return HttpResponseNotFound()
     for key in request.POST.keys():
         if key.startswith('up') or key.startswith('down'):
             try:
                 entry_id = int(key.replace('up', '').replace('down', ''))
                 try:
                     entry = Entry.objects.get(pk=entry_id)
                 except Entry.DoesNotExist:
                     return HttpResponseNotFound()
             except ValueError:
                 return HttpResponseNotFound()
             if not request.session.get('rated_entries', False):
                 request.session['rated_entries'] = []
             if not entry.pk in request.session['rated_entries']:
                 request.session['rated_entries'].append(entry.pk)
                 request.session.modified = True
                 self.feedback.entry = entry
                 if key.startswith('up'):
                     entry.upvotes += 1
                     self.feedback.validation = "P"
                 if key.startswith('down'):
                     entry.downvotes += 1
                     self.feedback.validation = "N"
                 entry.save()
                 self.feedback.save()
                 if request.is_ajax():
                     return TemplateResponse(
                         request,
                         'frequently/partials/feedback_form.html',
                         {
                             'feedback_entry': entry.pk,
                             'feedback': self.feedback,
                         },
                     )
         elif key.startswith('feedback'):
             try:
                 feedback_id = int(key.replace('feedback', ''))
                 try:
                     self.feedback = Feedback.objects.get(pk=feedback_id)
                 except Feedback.DoesNotExist:
                     return HttpResponseNotFound()
             except ValueError:
                 return HttpResponseNotFound()
             self.feedback.remark = request.POST.get("remark")
             self.feedback.save()
             if request.is_ajax():
                 return TemplateResponse(
                     request,
                     'frequently/partials/feedback_form.html',
                     {'feedback_send': True},
                 )
     return self.get(self, request, *args, **kwargs)
コード例 #2
0
class EntryMixin(object):
    """
    Mixin to handle and arrange the entry list.

    """

    def get_ordered_entries(self, queryset=False):
        """
        Custom ordering. First we get the average views and rating for
        the categories's entries. Second we created a rank by multiplying
        both. Last, we sort categories by this rank from top to bottom.

        Example:
        - Cat_1
            - Entry_1 (500 Views, Rating 2)
            - Entry_2 (200 Views, Rating -4)
            - Entry_3 (100 Views, Rating 3)
        - Cat_2
            - Entry_1 (200 Views, Rating 7)
            - Entry_2 (50 Views, Rating 2)

        Result:
        Cat_1 has a rank by: 88.88 (avg. views: 266.66, avg. rating: 0.33)
        Cat_2 has a rank by: 562.5 (avg. views: 125, avg. rating: 4.5)

        Cat_2 will be displayed at the top. The algorithm is quality-oriented,
        as you can see.

        """
        if queryset:
            self.queryset = queryset
        else:
            self.queryset = EntryCategory.objects.all()
        if self.queryset:
            for category in self.queryset:
                entries = category.get_entries()
                if entries:
                    amount_list = [e.amount_of_views for e in entries]
                    rating_list = [e.rating() for e in entries]
                    views_per_entry = fsum(amount_list) / len(amount_list)
                    rating_per_entry = fsum(rating_list) / len(rating_list)
                    category.last_rank = views_per_entry * rating_per_entry
                    category.save()
                else:
                    self.queryset = self.queryset.exclude(pk=category.pk)
            self.queryset = sorted(self.queryset, key=lambda c: c.last_rank,
                                   reverse=True)
        return self.queryset

    def post(self, request, *args, **kwargs):
        if "get_answer" in request.POST.keys():
            entry = Entry.objects.get(pk=request.POST['get_answer'])
            entry.last_view_date = timezone.now()
            entry.amount_of_views += 1
            entry.save()
            return TemplateResponse(
                request,
                'frequently/partials/answer.html',
                {
                    'entry': entry,
                    'rated_entries': self.request.session.get(
                        'rated_entries', False),
                },
            )
        self.feedback = Feedback()
        if "user_id" in request.POST.keys():
            try:
                user_id = int(request.POST.get('user_id'))
                try:
                    self.feedback.user = User.objects.get(pk=user_id)
                except User.DoesNotExist:
                    pass
            except ValueError:
                pass
        if 'ratingID' in request.POST.keys() and request.is_ajax():
            try:
                entry_id = int(request.POST.get('ratingID').replace(
                    'ratingID', ''))
                try:
                    entry = Entry.objects.get(pk=entry_id)
                    return HttpResponse(entry.rating())
                except Entry.DoesNotExist:
                    return HttpResponseNotFound()
            except ValueError:
                return HttpResponseNotFound()
        for key in request.POST.keys():
            if key.startswith('up') or key.startswith('down'):
                try:
                    entry_id = int(key.replace('up', '').replace('down', ''))
                    try:
                        entry = Entry.objects.get(pk=entry_id)
                    except Entry.DoesNotExist:
                        return HttpResponseNotFound()
                except ValueError:
                    return HttpResponseNotFound()
                if not request.session.get('rated_entries', False):
                    request.session['rated_entries'] = []
                if not entry.pk in request.session['rated_entries']:
                    request.session['rated_entries'].append(entry.pk)
                    request.session.modified = True
                    self.feedback.entry = entry
                    if key.startswith('up'):
                        entry.upvotes += 1
                        self.feedback.validation = "P"
                    if key.startswith('down'):
                        entry.downvotes += 1
                        self.feedback.validation = "N"
                    entry.save()
                    self.feedback.save()
                    if request.is_ajax():
                        return TemplateResponse(
                            request,
                            'frequently/partials/feedback_form.html',
                            {
                                'feedback_entry': entry.pk,
                                'feedback': self.feedback,
                            },
                        )
            elif key.startswith('feedback'):
                try:
                    feedback_id = int(key.replace('feedback', ''))
                    try:
                        self.feedback = Feedback.objects.get(pk=feedback_id)
                    except Feedback.DoesNotExist:
                        return HttpResponseNotFound()
                except ValueError:
                    return HttpResponseNotFound()
                self.feedback.remark = request.POST.get("remark")
                self.feedback.save()
                if request.is_ajax():
                    return TemplateResponse(
                        request,
                        'frequently/partials/feedback_form.html',
                        {'feedback_send': True},
                    )
        return self.get(self, request, *args, **kwargs)