This repository has been archived on 2019-10-13. You can view files and clone it, but cannot push or open issues or pull requests.
basta-server/ofu_app/apps/food/utils/migrate_data.py
2018-06-05 01:40:49 +02:00

135 lines
5.9 KiB
Python

import json
from datetime import datetime
from pprint import pprint
from django.db.utils import IntegrityError
from apps.food.models import SingleFood, Menu, HappyHour, Allergene, HappyHourLocation
from apps.food.utils.parser import mensa_page_parser, fekide_happyhour_page_parser, cafete_page_parser
import logging
logger = logging.getLogger(__name__)
# CONFIG SERVICE LINKS
LINK_FEKI_MENSA = "https://www.studentenwerk-wuerzburg.de/bamberg/essen-trinken/speiseplaene.html?tx_thmensamenu_pi2%5Bmensen%5D=3&tx_thmensamenu_pi2%5Baction%5D=show&tx_thmensamenu_pi2%5Bcontroller%5D=Speiseplan&cHash=c3fe5ebb35e5fba3794f01878e798b7c"
LINK_AUSTR_MENSA = "https://www.studentenwerk-wuerzburg.de/bamberg/essen-trinken/speiseplaene.html?tx_thmensamenu_pi2%5Bmensen%5D=2&tx_thmensamenu_pi2%5Baction%5D=show&tx_thmensamenu_pi2%5Bcontroller%5D=Speiseplan&cHash=511e047953ee1370c3b82c11a04624bb"
LINK_ERBA_CAFETE = "https://www.studentenwerk-wuerzburg.de/bamberg/essen-trinken/sonderspeiseplaene/cafeteria-erba-insel.html"
LINK_MARKUS_CAFETE = "https://www.studentenwerk-wuerzburg.de/bamberg/essen-trinken/sonderspeiseplaene/cafeteria-markusplatz.html"
LINK_FEKIDE_GUIDE = "https://www.feki.de/happyhour"
LOCATION_NAMES = ('erba', 'markusplatz', 'feldkirchenstraße', 'austraße')
def getLocation(raw_loc):
for choice, name in zip(Menu.LOCATION_CHOICES, LOCATION_NAMES):
if name.upper() in str(raw_loc).upper():
return choice
logger.warning("{loc} unknown location".format(loc=raw_loc))
return None
def writeStudentenwerkDataInDB(data):
if not data:
logger.warning('no data')
return
logger.info("{location}".format(location=data['name']))
for menu in data['weekmenu']:
logger.info("{date}".format(date=menu['date']))
foodlist = []
for single_food in menu['menu']:
logger.info("{}".format(single_food['title']))
allergens = []
if 'allergens' in single_food:
for allergen in single_food['allergens']:
allergens.append(Allergene.objects.get_or_create(name=allergen)[0])
# TODO: Consider keyword arg for price
try:
db_single_food, created = SingleFood.objects.get_or_create(name=single_food['title'])
if 'prices' in single_food:
if 'price_student' in single_food['prices']:
db_single_food.price_student = single_food['prices']['price_student']
else:
db_single_food.price_student = "None"
if 'price_employee' in single_food['prices']:
db_single_food.price_employee = single_food['prices']['price_employee']
else:
db_single_food.price_employee = "None"
if 'price_guest' in single_food['prices']:
db_single_food.price_guest = single_food['prices']['price_guest']
else:
db_single_food.price_guest = "None"
if allergens:
db_single_food.allergens.set(allergens)
foodlist.append(db_single_food)
db_single_food.save()
except IntegrityError as e:
logger.exception(e)
try:
date = datetime.strptime(str(menu['date']), "%d.%m.").replace(year=datetime.today().year)
menu, _ = Menu.objects.get_or_create(location=getLocation(data['name']), date=date)
menu.menu.set(foodlist)
menu.save()
except IntegrityError as error:
logger.exception(error)
def writeFekideDataInDB(data):
for happyhour_data in data['happyhours']:
time = str(happyhour_data['time']).replace(" ", "").split("-")
try:
location, _ = HappyHourLocation.objects.get_or_create(name=happyhour_data['location'])
happyhour, _ = HappyHour.objects.get_or_create(location=location,
starttime=datetime.strptime(time[0], "%H:%M").time(),
endtime=datetime.strptime(time[1], "%H:%M").time())
happyhour.date = datetime.strptime(data['day'], "%A, %d.%m.%Y")
happyhour.description = happyhour_data['description']
happyhour.save()
logger.info("{date}: Happy Hour: Location: {location}, Description: {description}".format(
date=happyhour.date,
location=happyhour.location,
description=happyhour.description)
)
except Exception as e:
logger.exception(e)
def writeoutDBObjects():
return "\n\tSingleFood: {single_food}\n\tMenu: {menu}\n\tHappyHour: {happy_hour}".format(
single_food=SingleFood.objects.count(),
menu=Menu.objects.count(),
happy_hour=HappyHour.objects.count()
)
def delete():
happy_hours = HappyHour.objects.all()
logger.info("Deleted following Happy Hours:")
for happy_hour in happy_hours:
logger.info("{date}: Happy Hour: Location: {location}, Description: {description}".format(
date=happy_hour.date,
location=happy_hour.location,
description=happy_hour.description)
)
happy_hour.delete()
def main():
logger.info("Aktueller Stand:" + writeoutDBObjects())
# get food jsons
logger.info('AUSTRASSE')
writeStudentenwerkDataInDB(mensa_page_parser.parsePage(LINK_AUSTR_MENSA))
logger.info('FEKI')
writeStudentenwerkDataInDB(mensa_page_parser.parsePage(LINK_FEKI_MENSA))
logger.info('ERBA')
writeStudentenwerkDataInDB(cafete_page_parser.parse_page(LINK_ERBA_CAFETE))
logger.info('MARKUSHAUS')
writeStudentenwerkDataInDB(cafete_page_parser.parse_page(LINK_MARKUS_CAFETE))
writeFekideDataInDB(fekide_happyhour_page_parser.parse_page(LINK_FEKIDE_GUIDE))
logger.info("Neuer Stand:" + writeoutDBObjects())
if __name__ == '__main__':
main()