diff --git a/recipify/recipify/admin.py b/recipify/recipify/admin.py index f7b3bfb..d6f0956 100644 --- a/recipify/recipify/admin.py +++ b/recipify/recipify/admin.py @@ -1,6 +1,8 @@ from django.contrib import admin from .models import FoodImage from .models import Recipe +from .models import DishImage admin.site.register(FoodImage) -admin.site.register(Recipe) \ No newline at end of file +admin.site.register(Recipe) +admin.site.register(DishImage) \ No newline at end of file diff --git a/recipify/recipify/migrations/0006_dishimage.py b/recipify/recipify/migrations/0006_dishimage.py new file mode 100644 index 0000000..2897b11 --- /dev/null +++ b/recipify/recipify/migrations/0006_dishimage.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.11 on 2024-06-22 20:59 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('recipify', '0005_recipe_image'), + ] + + operations = [ + migrations.CreateModel( + name='DishImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='images/')), + ('recipe', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='recipify.recipe')), + ], + ), + ] diff --git a/recipify/recipify/migrations/0007_alter_dishimage_image.py b/recipify/recipify/migrations/0007_alter_dishimage_image.py new file mode 100644 index 0000000..9698595 --- /dev/null +++ b/recipify/recipify/migrations/0007_alter_dishimage_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.11 on 2024-06-23 11:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recipify', '0006_dishimage'), + ] + + operations = [ + migrations.AlterField( + model_name='dishimage', + name='image', + field=models.URLField(), + ), + ] diff --git a/recipify/recipify/models.py b/recipify/recipify/models.py index 03d7b3e..4bc9858 100644 --- a/recipify/recipify/models.py +++ b/recipify/recipify/models.py @@ -16,3 +16,7 @@ class Recipe(models.Model): nutrients_present = models.TextField(null=True) nutrients_absent = models.TextField(null=True) image = models.ForeignKey(FoodImage, null=True, on_delete=models.CASCADE) + +class DishImage(models.Model): + image = models.URLField() + recipe = models.OneToOneField(Recipe, null=True, on_delete=models.CASCADE) diff --git a/recipify/recipify/templates/show.html b/recipify/recipify/templates/show.html index d9bcde4..4f055b9 100644 --- a/recipify/recipify/templates/show.html +++ b/recipify/recipify/templates/show.html @@ -121,7 +121,9 @@

- food image + + food image + diff --git a/recipify/recipify/util_functions/image_generation.py b/recipify/recipify/util_functions/image_generation.py index 85622b5..2daa948 100644 --- a/recipify/recipify/util_functions/image_generation.py +++ b/recipify/recipify/util_functions/image_generation.py @@ -1,38 +1,45 @@ import requests import json -from PIL import Image -import base64 -from io import BytesIO +# def add_base64_padding(base64_string): +# missing_padding = len(base64_string) % 4 +# if missing_padding: +# base64_string += '=' * (4 - missing_padding) +# return base64_string -def add_base64_padding(base64_string): - missing_padding = len(base64_string) % 4 - if missing_padding: - base64_string += '=' * (4 - missing_padding) - return base64_string - -def decode_base64_to_image(base64_string): - base64_string = add_base64_padding(base64_string) - image_data = base64.b64decode(base64_string) - image = Image.open(BytesIO(image_data)) - return image +# def decode_base64_to_image(base64_string): +# base64_string = add_base64_padding(base64_string) +# image_data = base64.b64decode(base64_string) +# image = Image.open(BytesIO(image_data)) +# return image def getDishImage(dishname): - url = "https://api.serphouse.com/serp/live?q=" + dishname + " image&engine=google_images&lang=en&device=desktop&serp_type=web&loc=Alba,Texas,United States&loc_id=1026201&verbatim=0&gfilter=0&page=1&num_result=10" + client_ID = "94XalRwyaaUtAh8AuRoE_gp3QmvntuuFI_otx2Wsvso" + url = "https://api.unsplash.com/search/photos/?client_id=" + client_ID + "&query=" + dishname + - payload = {} - headers = { - 'Authorization': 'Bearer nddeuNFHxu2hxN0wzW8euCXbUOawG25WLnpNFdiggt8q4wPKiWTx8AS9T1Iw' - } + try: + response = requests.request("GET", url) + response.raise_for_status() # Raises an HTTPError if the HTTP request returned an unsuccessful status code + ans = json.loads(response.text) + image_url = ans['results'][0]['urls']['regular'] + return image_url + except requests.exceptions.RequestException as e: + # Handle any requests exceptions (e.g., network issues, invalid responses) + print(f"An error occurred with the request: {e}") + except json.JSONDecodeError as e: + # Handle JSON decoding errors + print(f"An error occurred while decoding the JSON response: {e}") + except (KeyError, IndexError) as e: + # Handle errors related to accessing specific elements in the JSON response + print(f"An error occurred while accessing the JSON data: {e}") + except Exception as e: + # Handle any other unforeseen exceptions + print(f"An unexpected error occurred: {e}") - response = requests.request("GET", url, headers=headers, data=payload) - ans = json.loads(response.text) - image_base_64 = ans['results']['results']['inline_images'][0]['image'] - return image_base_64 + return None -# Example usage -# dish_image_base64 = getDishImage("Kiwi Salsa") -# print(dish_image_base64) -# image = decode_base64_to_image(dish_image_base64) -# image.show() +# Test +# img = getDishImage("Kiwi Grill ") +# print(img) diff --git a/recipify/recipify/views.py b/recipify/recipify/views.py index 15f6a3f..f93a06f 100644 --- a/recipify/recipify/views.py +++ b/recipify/recipify/views.py @@ -5,6 +5,7 @@ from .forms import SignupForm, LoginForm from .models import FoodImage from .models import Recipe +from .models import DishImage from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from inference_sdk import InferenceHTTPClient @@ -108,8 +109,18 @@ def image_upload_view(request): nutrients_absent=nutrients_absent[i], image=food_image, ) + recipes.append(recipe) recipe.save() + dish_img = getDishImage(dishNames[i]) + + if dish_img: # Ensure dish_img is not None or empty + dimg = DishImage(image=dish_img, recipe=recipe) + dimg.save() + else: + dimg = DishImage(image="https://static.vecteezy.com/system/resources/previews/000/542/269/original/healthy-food-vector.jpg", recipe=recipe) + dimg.save() + # Load parsed text into context dictionary to display on page context = { @@ -136,10 +147,11 @@ def show_recipe(request, id): nutri_present = [clean(nutri) for nutri in nutri_present] nutri_absent = recipe.nutrients_absent.split("',") nutri_absent = [clean(nutri) for nutri in nutri_absent] - try: - img = getDishImage(recipeName) - except: - img = recipe.image + img = get_object_or_404(DishImage, recipe=recipe) + # try: + # img = getDishImage(recipeName) + # except: + # img = recipe.image context = { "ingredients": ingredients, diff --git a/recipify/static/img/default.jpg b/recipify/static/img/default.jpg new file mode 100644 index 0000000..f182077 Binary files /dev/null and b/recipify/static/img/default.jpg differ