2018-07-24 14:27:37 +00:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
Author: freezed <freezed@users.noreply.github.com> 2018-07-24
|
|
|
|
|
Version: 0.1
|
|
|
|
|
Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
|
|
Call OpenFF API to populate a local MariaDB/MySQL database with product data
|
|
|
|
|
This DB will serve an CLI client which gives alternative products with better
|
|
|
|
|
nurition grade.
|
|
|
|
|
"""
|
|
|
|
|
import json
|
|
|
|
|
import requests
|
2018-07-27 20:27:42 +00:00
|
|
|
|
from config import FIELD_KEPT
|
2018-07-24 18:40:31 +00:00
|
|
|
|
|
|
|
|
|
|
2018-07-24 14:27:37 +00:00
|
|
|
|
def get_product(code):
|
|
|
|
|
"""
|
|
|
|
|
Call OpenFF API to get data of a single product
|
|
|
|
|
|
|
|
|
|
:Tests:
|
2018-07-25 17:22:01 +00:00
|
|
|
|
>>> prod_beurre = get_product('3017760000109')
|
|
|
|
|
>>> print(prod_beurre['product_name'])
|
2018-07-24 14:27:37 +00:00
|
|
|
|
Le Véritable Petit Beurre
|
|
|
|
|
|
2018-07-25 17:22:01 +00:00
|
|
|
|
>>> print(prod_beurre['stores'])
|
2018-07-24 14:27:37 +00:00
|
|
|
|
Super U
|
|
|
|
|
|
2018-07-25 17:22:01 +00:00
|
|
|
|
>>> print(prod_beurre['nutrition_grades'])
|
2018-07-24 14:27:37 +00:00
|
|
|
|
e
|
|
|
|
|
|
2018-07-25 17:22:01 +00:00
|
|
|
|
>>> print(prod_beurre['categories_tags'])
|
2018-07-24 14:27:37 +00:00
|
|
|
|
['en:sugary-snacks', 'en:biscuits-and-cakes', 'en:biscuits', 'fr:petits-beurres']
|
2018-07-25 17:22:01 +00:00
|
|
|
|
|
|
|
|
|
>>> prod_oreo = get_product('8410000810004')
|
2018-07-25 22:10:24 +00:00
|
|
|
|
>>> print(prod_oreo['code'])
|
|
|
|
|
8410000810004
|
|
|
|
|
|
2018-07-25 17:22:01 +00:00
|
|
|
|
>>> print(prod_oreo['product_name'])
|
|
|
|
|
Biscuit Oreo
|
|
|
|
|
|
|
|
|
|
>>> print(prod_oreo['stores'])
|
|
|
|
|
Cora,Irma.dk,Leader Price
|
|
|
|
|
|
|
|
|
|
>>> print(prod_oreo['nutrition_grades'])
|
|
|
|
|
e
|
|
|
|
|
|
|
|
|
|
>>> print(prod_oreo['categories_tags'])
|
|
|
|
|
['en:sugary-snacks', 'en:biscuits-and-cakes', 'en:biscuits', 'en:chocolate-biscuits', 'es:sandwich-cookies']
|
|
|
|
|
|
|
|
|
|
>>> prod_false = get_product('1664')
|
|
|
|
|
>>> prod_false is False
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
>>> prod_string = get_product('string')
|
|
|
|
|
>>> prod_string is False
|
|
|
|
|
True
|
2018-07-24 14:27:37 +00:00
|
|
|
|
"""
|
|
|
|
|
|
2018-07-25 21:24:35 +00:00
|
|
|
|
try:
|
|
|
|
|
int(code)
|
2018-07-25 17:22:01 +00:00
|
|
|
|
|
2018-07-25 22:10:24 +00:00
|
|
|
|
except ValueError: # as except_detail:
|
2018-07-25 21:24:35 +00:00
|
|
|
|
# print("Exception: «{}»".format(except_detail))
|
|
|
|
|
return False
|
2018-07-24 18:40:31 +00:00
|
|
|
|
|
2018-07-25 21:24:35 +00:00
|
|
|
|
else:
|
|
|
|
|
response = requests.get(
|
|
|
|
|
"https://fr.openfoodfacts.org/api/v0/product/{}.json".format(code)
|
|
|
|
|
)
|
2018-07-25 22:10:24 +00:00
|
|
|
|
product_json = json.loads(response.text)
|
2018-07-25 21:24:35 +00:00
|
|
|
|
|
2018-07-25 22:10:24 +00:00
|
|
|
|
if product_json['status'] and response.status_code == 200:
|
|
|
|
|
product_kept = {'code': code}
|
2018-07-25 21:24:35 +00:00
|
|
|
|
|
|
|
|
|
for field in FIELD_KEPT:
|
2018-07-25 22:10:24 +00:00
|
|
|
|
product_kept[field] = product_json['product'][field]
|
2018-07-25 21:24:35 +00:00
|
|
|
|
|
2018-07-25 22:10:24 +00:00
|
|
|
|
return product_kept
|
2018-07-25 21:24:35 +00:00
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
return False
|
2018-07-24 18:40:31 +00:00
|
|
|
|
|
|
|
|
|
|
2018-07-30 06:13:36 +00:00
|
|
|
|
def get_category(name, from_file=False):
|
2018-07-26 13:42:21 +00:00
|
|
|
|
"""
|
|
|
|
|
Call OpenFF API to get data of products in a single category
|
|
|
|
|
|
|
|
|
|
First try, TODO :
|
2018-07-30 06:13:36 +00:00
|
|
|
|
- work offline
|
2018-07-26 13:42:21 +00:00
|
|
|
|
- need to get all the products of a category
|
|
|
|
|
- need to keep more fields from a category than from a product, maybe
|
|
|
|
|
FIELD_KEPT should be turned into a dict like this :
|
|
|
|
|
{'category':[fields, …], 'products':[fields, …]}
|
|
|
|
|
|
|
|
|
|
:Tests:
|
2018-07-30 06:13:36 +00:00
|
|
|
|
# >>> prod_bisc = get_category('biscuits')
|
|
|
|
|
>>> prod_bisc = get_category('biscuits', True)
|
2018-07-26 13:42:21 +00:00
|
|
|
|
>>> 'count' in prod_bisc
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
>>> prod_false = get_category('1664')
|
|
|
|
|
>>> prod_false
|
|
|
|
|
False
|
|
|
|
|
|
|
|
|
|
>>> 'stores' in prod_bisc['products'][0]
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
>>> 'product_name' in prod_bisc['products'][0]
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
>>> 'nutrition_grades' in prod_bisc['products'][0]
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
>>> 'categories_tags' in prod_bisc['products'][0]
|
|
|
|
|
True
|
|
|
|
|
|
|
|
|
|
# >>> 'countries' in prod_bisc['products'][0]
|
|
|
|
|
# True
|
|
|
|
|
|
|
|
|
|
# >>> 'id' in prod_bisc['products'][0]
|
|
|
|
|
# True
|
2018-07-30 06:13:36 +00:00
|
|
|
|
|
|
|
|
|
>>> get_category('wrong_file', True)
|
|
|
|
|
File load error : sample-category-wrong_file.json
|
|
|
|
|
False
|
2018-07-26 13:42:21 +00:00
|
|
|
|
"""
|
|
|
|
|
|
2018-07-30 06:13:36 +00:00
|
|
|
|
if from_file:
|
|
|
|
|
from os import path
|
2018-07-26 13:42:21 +00:00
|
|
|
|
|
2018-07-30 06:13:36 +00:00
|
|
|
|
filename = 'sample-category-{}.json'.format(str(name))
|
|
|
|
|
# File did not exists
|
|
|
|
|
if path.isfile(filename) is False:
|
|
|
|
|
print("File load error : {}".format(filename))
|
|
|
|
|
status = False
|
|
|
|
|
category_json = {'count': 0}
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
with open(filename, "r") as json_file:
|
|
|
|
|
category_json = json.loads(json_file.read())
|
|
|
|
|
status = 200
|
|
|
|
|
else:
|
|
|
|
|
response = requests.get(
|
|
|
|
|
"https://fr.openfoodfacts.org/category/{}.json".format(str(name))
|
|
|
|
|
)
|
|
|
|
|
category_json = json.loads(response.text)
|
|
|
|
|
status = response.status_code
|
2018-07-26 13:42:21 +00:00
|
|
|
|
|
2018-07-30 06:13:36 +00:00
|
|
|
|
if category_json['count'] is not 0 and status == 200:
|
2018-07-26 13:42:21 +00:00
|
|
|
|
category_kept = {
|
|
|
|
|
'count': category_json['count'],
|
|
|
|
|
'products': [{}]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for field in FIELD_KEPT:
|
|
|
|
|
category_kept['products'][0][field] = category_json['products'][0][field]
|
|
|
|
|
|
|
|
|
|
return category_kept
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2018-07-24 14:27:37 +00:00
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
""" Starting doctests """
|
|
|
|
|
|
|
|
|
|
import doctest
|
|
|
|
|
doctest.testmod()
|