added user rating

This commit is contained in:
Götz 2017-10-30 00:23:32 +01:00
parent 249517a58b
commit b23062965c
8 changed files with 157 additions and 29 deletions

View File

@ -2,10 +2,11 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.contrib import admin from django.contrib import admin
from apps.food.models import SingleFood, Menu, HappyHour from apps.food.models import SingleFood, Menu, HappyHour, UserRating
# Register your models here. # Register your models here.
admin.site.register(SingleFood) admin.site.register(SingleFood)
admin.site.register(Menu) admin.site.register(Menu)
admin.site.register(HappyHour) admin.site.register(HappyHour)
admin.site.register(UserRating)

View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 22:35
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('food', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='UserRating',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rating', models.FloatField(default=0)),
('food', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='food.SingleFood')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 22:41
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('food', '0002_userrating'),
]
operations = [
migrations.AlterField(
model_name='userrating',
name='id',
field=models.AutoField(primary_key=True, serialize=False),
),
]

View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 22:43
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('food', '0003_auto_20171029_2341'),
]
operations = [
migrations.AlterField(
model_name='userrating',
name='food',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='food.SingleFood'),
),
migrations.AlterField(
model_name='userrating',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-10-29 23:23
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('food', '0004_auto_20171029_2343'),
]
operations = [
migrations.RemoveField(
model_name='singlefood',
name='fifth_star',
),
migrations.RemoveField(
model_name='singlefood',
name='first_star',
),
migrations.RemoveField(
model_name='singlefood',
name='fourth_star',
),
migrations.RemoveField(
model_name='singlefood',
name='second_star',
),
migrations.RemoveField(
model_name='singlefood',
name='third_star',
),
]

View File

@ -2,6 +2,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils import timezone from django.utils import timezone
from django.db import models from django.db import models
from django.contrib.auth.models import User
MAX_LENGTH = 60 MAX_LENGTH = 60
@ -28,11 +29,6 @@ class SingleFood(models.Model):
price_guest = models.CharField(max_length=10, blank=True, null=True) price_guest = models.CharField(max_length=10, blank=True, null=True)
image = models.ImageField(upload_to='food/%Y/%m/', blank=True) image = models.ImageField(upload_to='food/%Y/%m/', blank=True)
rating = models.FloatField(default=0) rating = models.FloatField(default=0)
first_star = models.SmallIntegerField(default=0)
second_star = models.SmallIntegerField(default=0)
third_star = models.SmallIntegerField(default=0)
fourth_star = models.SmallIntegerField(default=0)
fifth_star = models.SmallIntegerField(default=0)
allergens = models.ManyToManyField("Allergene", blank=True) allergens = models.ManyToManyField("Allergene", blank=True)
def __str__(self): def __str__(self):
@ -60,3 +56,13 @@ class HappyHour(models.Model):
def __str__(self): def __str__(self):
return "Date: %s, Location: %s" % (self.date.strftime("%Y.%m.%d"), self.location) return "Date: %s, Location: %s" % (self.date.strftime("%Y.%m.%d"), self.location)
class UserRating(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False)
food = models.ForeignKey(SingleFood)
rating = models.FloatField(default=0)
def __str__(self):
return "User: %s - Rating: %s" % (self.user.username, self.rating)

View File

@ -5,7 +5,7 @@ import datetime
from django.shortcuts import render from django.shortcuts import render
from apps.food.models import Menu, HappyHour, SingleFood from apps.food.models import Menu, HappyHour, SingleFood, UserRating
from django.http import HttpResponse from django.http import HttpResponse
from rest_framework import viewsets, generics from rest_framework import viewsets, generics
from rest_framework import status from rest_framework import status
@ -80,29 +80,27 @@ def food(request):
def food_rating(request): def food_rating(request):
food_id = request.GET.get('food_id', None) if (request.user.is_authenticated):
rating = request.GET.get('rating', None) food_id = request.GET.get('food_id', None)
if food_id and rating: rating = request.GET.get('rating', None)
print("ID: %s, RATING: %s" % (food_id, rating)) if food_id and rating:
food = SingleFood.objects.get(id=food_id) food = SingleFood.objects.get(id=food_id)
if rating == str(1): user_rating, created = UserRating.objects.get_or_create(user=request.user,
food.first_star = food.first_star + 1 food=food)
if rating == str(2): user_rating.rating = rating
food.second_star += 1 user_rating.save()
if rating == str(3):
food.third_star += 1
if rating == str(4):
food.fourth_star += 1
if rating == str(5):
food.fifth_star += 1
global_count = food.first_star + food.second_star + food.third_star + food.fourth_star + food.fifth_star
sum = food.first_star * 1 + food.second_star * 2 + food.third_star * 3 + food.fourth_star * 4 + food.fifth_star * 5
food.rating = sum / global_count
print("SUMME: " + str(sum / global_count))
food.save()
return HttpResponse(status=200)
return HttpResponse(status=404) food_user_ratings = UserRating.objects.all().filter(food=food)
sum = 0
for food_user_rating in food_user_ratings:
sum += food_user_rating.rating
food.rating = sum / food_user_ratings.count()
food.save()
return HttpResponse(status=200)
return HttpResponse(status=404)
return HttpResponse(status=403)
def food_image(request): def food_image(request):

View File

@ -25,6 +25,7 @@ function add_Stars() {
var rating = $(this).data('rating'); var rating = $(this).data('rating');
console.log("ITEM: " + $(this) + " FOOD-ID: " + food + " FOOD-RATING: " + rating); console.log("ITEM: " + $(this) + " FOOD-ID: " + food + " FOOD-RATING: " + rating);
for (var i = 0; i < 5; i++) { for (var i = 0; i < 5; i++) {
$(this).find('.rating-wrapper').addClass('food-' + food);
$(this).find('.rating-wrapper').append('<i class="star-' + (i + 1) + '-' + food + ' fa fa-star-o star" aria-hidden="true"></i>'); $(this).find('.rating-wrapper').append('<i class="star-' + (i + 1) + '-' + food + ' fa fa-star-o star" aria-hidden="true"></i>');
} }
buildRating(food, rating); buildRating(food, rating);
@ -78,9 +79,22 @@ function sendRating(obj) {
var xhttp = new XMLHttpRequest(); var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () { xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && this.status == 200) {
console.log("sent");
}
if (this.readyState == 4 && this.status == 403) {
console.log("ERROR");
ratingError('food-' + food_id);
} }
}; };
console.log(url + "?rating=" + rating + "&food_id=" + food_id); console.log(url + "?rating=" + rating + "&food_id=" + food_id);
xhttp.open("GET", url + "?rating=" + rating + "&food_id=" + food_id, true); xhttp.open("GET", url + "?rating=" + rating + "&food_id=" + food_id, true);
xhttp.send(); xhttp.send();
} }
function ratingError(obj) {
console.log("Show in " + obj);
$('.' + obj).append('<p class="rating-error">Please Log in to use the Rating function</p>');
setTimeout(function () {
$('.rating-error').remove();
}, 1500);
}