Implement basic call to brewfather to pull data.

This commit is contained in:
Chris Giacofei 2024-06-13 16:15:35 -04:00
parent 3d4bc5d2f5
commit b1332dede9
4 changed files with 116 additions and 13 deletions

View File

@ -3,7 +3,7 @@ from django.urls import reverse
from django.utils.html import format_html
from django.apps import apps
from beer.models import Batch, Recipe, BatchRecipe
from beer.models import Batch, BatchRecipe, BatchRecipe
from yeast.models import Yeast
from config.extras import BREWFATHER_APP_ROOT
@ -12,10 +12,6 @@ class SampleInline(admin.TabularInline):
model = Yeast
extra = 0
@admin.register(Recipe)
class RecipeAdmin(admin.ModelAdmin):
list_display = ['name']
@admin.register(BatchRecipe)
class BatchRecipeAdmin(admin.ModelAdmin):
list_display = ['name']

81
beer/extras.py Normal file
View File

@ -0,0 +1,81 @@
import base64
import json
from urllib.request import Request, urlopen
import logging
logger = logging.getLogger('django')
RECIPE_URL = 'https://api.brewfather.app/v2/recipes'
BATCH_URL = 'https://api.brewfather.app/v2/batches'
PULL_LIMIT = 50
def get_batches(api_user, api_key, batch=''):
auth_string = api_user + ':' + api_key
auth64 = base64.b64encode(auth_string.encode("utf-8"))
batch_array = []
if batch != '':
lastbatch = '&start_after=' + batch
else:
lastbatch = ''
query = '{batch_url}?limit={pull_limit}&complete=True&include=recipe,recipe.batchSize&status=Planning{last_batch}'.format(
batch_url=BATCH_URL,
pull_limit=PULL_LIMIT,
last_batch=lastbatch
)
req = Request(query)
req.add_header('authorization', 'Basic ' + auth64.decode())
content = urlopen(req)
data = json.load(content)
if len(data) == PULL_LIMIT:
last_id = data[-1]['_id']
data = data + get_batches(batch=last_id)
return data
def pull_recipes(api_user, api_key):
batch_list = get_batches(api_user, api_key);
for batch in batch_list:
batch_id = batch['_id']
brewDate = batch['brewDate']
recipe = batch['recipe']
batch_name = '{} {}'.format(batch['name'], batch['batchNo'])
name = recipe['name']
batchSize = recipe['batchSize'] * 0.264172
strike_water = recipe['data']['mashWaterAmount'] * 0.264172
sparge_water = recipe['data']['spargeWaterAmount'] * 0.264172
fermentables = recipe['data']['mashFermentables']
fermentable_text = ''
for num, ferm in enumerate(fermentables):
logger.critical(ferm)
# var this_ferm = recipe.data.mashFermentables[key];
# console.log(this_ferm);
# var malt_string = this_ferm.name + '@@@' + this_ferm.grainCategory + '@@@' + this_ferm.amount * 2.20462 + '@@@ @@@' + this_ferm.color;
# fermentable_text = fermentable_text + "%%%" + malt_string;
# }
# /*for (j=0;j<fermentables.length;j++){
# console.log(fermentables[j]);
# var malt_string = fermentables[j].name + '@@@' + fermentables[j].grainCategory + '@@@' + fermentables[j].amount * 2.20462 + '@@@ @@@' + fermentables[j].color;
# fermentable_text = fermentable_text + "%%%" + malt_string;
# }*/
# row_data.push([name, batch_name, fermentable_text, id, strike_water, sparge_water, batchSize, brewDate]);
# }
# sheet = SpreadsheetApp.getActive().getSheetByName('Recipes');
# clearrange = sheet.getRange("A2:H");
# clearrange.clear();
# range = sheet.getRange(1, 1, row_data.length, row_data[0].length);
# range.setValues(row_data);
# clearrange.sort(8);
# }

View File

@ -27,7 +27,7 @@ class Batch(CustomModel):
brewfather_id = models.CharField(max_length=50)
brewfather_num = models.IntegerField(default=1)
brewfather_name = models.CharField(max_length=500, default='name')
recipe = models.ForeignKey('BatchRecipe', on_delete=models.CASCADE, default=1)
recipe = models.OneToOneField('BatchRecipe', on_delete=models.CASCADE, default=1)
@property
def brewfather_url(self):
@ -40,8 +40,6 @@ class Batch(CustomModel):
class BatchRecipe(CustomModel):
""" Recipe to be stored with a batch."""
name = models.CharField(max_length=50)
batch_recipe = models.BooleanField(null=True)
recipe_json = models.TextField(null=True, blank=True)
class Recipe(CustomModel):
""" Recipes not attched to batches."""
name = models.CharField(max_length=50)

View File

@ -2,9 +2,37 @@ from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView
from django.http import HttpResponse
from .models import Recipe
from .models import UserProfile, BatchRecipe, Batch
from .extras import get_batches
import json
from config.extras import AveryLabel
import logging
logger = logging.getLogger('django')
def home(request):
return render(request, 'beer/home.html',{'beer':Recipe.objects.all()})
profile = get_object_or_404(UserProfile, user=request.user)
api_user = profile.brewfather_api_user
api_key = profile.brewfather_api_key
batch_list = get_batches(api_user, api_key)
for batch in batch_list:
if Batch.objects.filter(brewfather_id=batch['_id']).first() is None:
recipe_name = batch['recipe']['name']
recipe_obj = BatchRecipe(name=recipe_name, batch_recipe=True,recipe_json=json.dumps(batch['recipe']))
recipe_obj.save()
batch_obj = Batch(
brewfather_id = batch['_id'],
brewfather_num = batch['batchNo'],
brewfather_name = batch['recipe']['name'],
recipe = recipe_obj,
)
batch_obj.save()
return render(request, 'beer/home.html',{'batches':BatchRecipe.objects.all()})