Fix image hack

This commit is contained in:
Michael Götz 2018-01-13 02:09:00 +01:00
parent fed22f53a1
commit b87f6ac56b
9 changed files with 94 additions and 40 deletions

View File

@ -2,15 +2,11 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import os
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from django.shortcuts import render from django.shortcuts import render
from pprint import pprint
from apps.food.models import Menu, SingleFood, UserFoodImage from apps.food.models import SingleFood, UserFoodImage
def food_picture_management(request): def food_picture_management(request):
@ -31,7 +27,7 @@ def food_picture_save(request, id):
if (request.user.is_superuser): if (request.user.is_superuser):
chosen_pic = UserFoodImage.objects.get(id=id) chosen_pic = UserFoodImage.objects.get(id=id)
food = SingleFood.objects.get(id=chosen_pic.food.id) food = SingleFood.objects.get(id=chosen_pic.food.id)
food.image.set([chosen_pic, ]) food.image = chosen_pic.image
food.save() food.save()
return food_picture_management(request) return food_picture_management(request)

View File

@ -1,8 +1,8 @@
from django import forms from django import forms
from apps.food.models import UserFoodImage from apps.food.models import FoodImage
class UploadImageForm(forms.ModelForm): class UploadImageForm(forms.ModelForm):
class Meta: class Meta:
model = UserFoodImage model = FoodImage
fields = ['image'] fields = ['image']

View File

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2018-01-12 23:23
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('food', '0004_auto_20180111_1246'),
]
operations = [
migrations.CreateModel(
name='FoodImage',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('image', models.ImageField(blank=True, upload_to='food/originals/%Y/%m/%W')),
('thumb', models.ImageField(blank=True, upload_to='food/thumbs/%Y/%m/%W')),
],
),
migrations.RemoveField(
model_name='userfoodimage',
name='thumb',
),
migrations.RemoveField(
model_name='singlefood',
name='image',
),
migrations.AlterField(
model_name='userfoodimage',
name='image',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='food.FoodImage'),
),
migrations.AddField(
model_name='singlefood',
name='image',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='food.FoodImage'),
),
]

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2018-01-13 00:21
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('food', '0005_auto_20180113_0023'),
]
operations = [
migrations.AlterField(
model_name='foodimage',
name='image',
field=models.ImageField(blank=True, null=True, upload_to='food/originals/%Y/%m/%W'),
),
migrations.AlterField(
model_name='foodimage',
name='thumb',
field=models.ImageField(blank=True, null=True, upload_to='food/thumbs/%Y/%m/%W'),
),
]

View File

@ -10,7 +10,6 @@ from django.contrib.auth.models import User
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import smart_str
MAX_LENGTH = 256 MAX_LENGTH = 256
@ -42,7 +41,7 @@ class SingleFood(models.Model):
price_student = models.CharField(max_length=10, blank=True, null=True) price_student = models.CharField(max_length=10, blank=True, null=True)
price_employee = models.CharField(max_length=10, blank=True, null=True) price_employee = models.CharField(max_length=10, blank=True, null=True)
price_guest = models.CharField(max_length=10, blank=True, null=True) price_guest = models.CharField(max_length=10, blank=True, null=True)
image = models.ManyToManyField("UserFoodImage", blank=True, null=True) image = models.ForeignKey('FoodImage', on_delete=models.PROTECT, blank=True, null=True)
rating = models.FloatField(default=0) rating = models.FloatField(default=0)
allergens = models.ManyToManyField("Allergene", blank=True) allergens = models.ManyToManyField("Allergene", blank=True)
@ -88,8 +87,7 @@ class UserFoodImage(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.PROTECT, unique=False) user = models.ForeignKey(User, on_delete=models.PROTECT, unique=False)
food = models.ForeignKey(SingleFood, on_delete=models.PROTECT) food = models.ForeignKey(SingleFood, on_delete=models.PROTECT)
image = models.ImageField(upload_to='food/originals/%Y/%m/%W', blank=True) image = models.ForeignKey('FoodImage', on_delete=models.PROTECT)
thumb = models.ImageField(upload_to='food/thumbs/%Y/%m/%W', blank=True)
class Meta: class Meta:
unique_together = ('user', 'food') unique_together = ('user', 'food')
@ -97,6 +95,12 @@ class UserFoodImage(models.Model):
def __str__(self): def __str__(self):
return "User: %s - Image: %s" % (self.user.username, str(self.image)) return "User: %s - Image: %s" % (self.user.username, str(self.image))
class FoodImage(models.Model):
id = models.AutoField(primary_key=True)
image = models.ImageField(upload_to='food/originals/%Y/%m/%W', blank=True, null=True)
thumb = models.ImageField(upload_to='food/thumbs/%Y/%m/%W', blank=True, null=True)
def save(self, force_update=False, force_insert=False, thumb_size=(640, 480)): def save(self, force_update=False, force_insert=False, thumb_size=(640, 480)):
image = Image.open(self.image) image = Image.open(self.image)
@ -114,13 +118,12 @@ class UserFoodImage(models.Model):
temp_handle.read(), temp_handle.read(),
content_type='image/jpg') content_type='image/jpg')
str_food = smart_str(self.food.name, encoding='utf-8') self.thumb.save('%s_thumbnail.%s' % (self.id, 'jpg'), suf, save=False)
self.thumb.save('%s_%s_thumbnail.%s' % (self.food.id, self.user.id, 'jpg'), suf, save=False)
# save the image object # save the image object
self.image.name = "%s_%s_original.%s" % (self.food.id, self.user.id, 'jpg') self.image.name = "%s_original.%s" % (self.id, 'jpg')
super(UserFoodImage, self).save(force_update, force_insert) super(FoodImage, self).save(force_update, force_insert)
def delete(self, using=None, keep_parents=False): def delete(self, using=None, keep_parents=False):
os.remove(os.path.join(settings.MEDIA_ROOT, self.image.name)) os.remove(os.path.join(settings.MEDIA_ROOT, self.image.name))
os.remove(os.path.join(settings.MEDIA_ROOT, self.thumb.name)) os.remove(os.path.join(settings.MEDIA_ROOT, self.thumb.name))
super(UserFoodImage, self).delete() super(FoodImage, self).delete()

View File

@ -2,15 +2,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import os
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render from django.shortcuts import render
from pprint import pprint
from apps.food.forms import UploadImageForm from apps.food.forms import UploadImageForm
from apps.food.models import Menu, HappyHour, SingleFood, UserRating, UserFoodImage from apps.food.models import Menu, HappyHour, SingleFood, UserRating, UserFoodImage, FoodImage
# Create your views here. # Create your views here.
@ -134,17 +131,10 @@ def food_image(request):
def pic_upload(request, id): def pic_upload(request, id):
form = UploadImageForm(request.POST, request.FILES) form = UploadImageForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():
try: pic = form.save(commit=True)
food = SingleFood.objects.get(id=id) userPic, success = UserFoodImage.objects.get_or_create(user_id=request.user)
food.image.clear userPic.image = pic
old_user_pic = UserFoodImage.objects.get(user=request.user, food=id)
old_user_pic.delete()
except ObjectDoesNotExist:
pass
userPic = form.save(commit=False)
userPic.food = SingleFood.objects.get(id=id) userPic.food = SingleFood.objects.get(id=id)
userPic.user = request.user
userPic.save() userPic.save()
return True return True
else: else:

View File

@ -11,7 +11,7 @@
<div class="col-6"> <div class="col-6">
<a href="{{ url('foodpicture-save', kwargs={'id':picture.id}) }}"> <a href="{{ url('foodpicture-save', kwargs={'id':picture.id}) }}">
<h3>{{ picture.food.name }}</h3> <h3>{{ picture.food.name }}</h3>
<img src="{{ picture.image.url }}" style="width: 50%"> <img src="{{ picture.image.image.url }}" style="width: 50%">
</a> </a>
</div> </div>
{% endfor %} {% endfor %}

View File

@ -46,7 +46,7 @@
{% for image in images %} {% for image in images %}
<div class="col-12 mt-2"> <div class="col-12 mt-2">
<p>{{ image.food.name }}</p> <p>{{ image.food.name }}</p>
<img src="{{ image.image.url }}" style="width:50%"> <img src="{{ image.image.image.url }}" style="width:50%">
</div> </div>
{% endfor %} {% endfor %}
</div> </div>

View File

@ -60,13 +60,11 @@
<li data-food="{{ single_food.id }}" data-rating="{{ single_food.rating }}" class="food-item media mb-2"> <li data-food="{{ single_food.id }}" data-rating="{{ single_food.rating }}" class="food-item media mb-2">
<div class="mr-2 media-left media-middle"> <div class="mr-2 media-left media-middle">
{# TODO: without many to many #} {# TODO: without many to many #}
{% if single_food.image.all() %} {% if single_food.image %}
{% for image in single_food.image.all() %} <a href="{{ single_food.image.image.url }}" data-lightbox="{{ title }}"
<a href="{{ image.image.url }}" data-lightbox="{{ title }}"
data-title="{{ single_food.name }}"> data-title="{{ single_food.name }}">
<img src="{{ image.image.url }}" class="media-object" alt="Bild" width="80px"> <img src="{{ single_food.image.image.url }}" class="media-object" alt="Bild" width="80px">
</a> </a>
{% endfor %}
{% else %} {% else %}
<a href="/media/food/default/default.jpg" data-lightbox="{{ title }}" <a href="/media/food/default/default.jpg" data-lightbox="{{ title }}"
data-title="{{ single_food.name }}"> data-title="{{ single_food.name }}">