Attention!
Après avoir lu l'article, vous aurez peut-être l'impression que j'adore le BDSM ou quelque chose du genre, mais cela ne vous semble que.
Problèmes de magasin
Je travaille dans un magasin de vélos régulier dans le centre de Varsovie. Nous faisons du commerce à la fois stationnaire et sur Internet. Nombre moyen de vélos achetés par jour ~ 2 pour toute l'année. Dans le même temps, le pic des ventes tombe sur l'été, et alors on peut avoir ~ 17 commandes en ligne par jour et le même nombre en magasin, et en hiver on ne peut rien vendre du tout.
En 2020. Dans le cadre de la pandémie COVID, la demande de vélos a augmenté à des taux incroyables, et nous, en tant que bureau décent, avons commencé à se développer.
Cela a conduit au fait qu'à la fin de la saison dernière, les commandes de vélos uniquement inexistants ont augmenté en moyenne jusqu'à 4 fois par semaine pendant les 4 mois les plus productifs. Et c'est ~ 16 incohérences sur le site par mois (sans compter les pannes dans le magasin).
Cette année, avec l'apparition d'un autre grand entrepôt, la situation s'est aggravée et maintenant, en plus des vélos inexistants, ceux qui n'étaient pas là se sont ajoutés et il était souvent impossible de les amener aux clients à temps.
, - EXEL, , . , . 2 2-3 .
. , , , – , . .
, , - . . , . :
, .
:
Python API PrestaShop;
, -, . ;
Chrome . , Chrome.
middle-, . .
API PrestaShop
API PrestaShop Python , , PS 5% ( 1.6 ). — prestapyt, . , , .
, , API, PS. , , .
, , ! , .
- , .
, , .
:
reference ;
— ;
, , stock_availables. ;
associations .
, , > 0 — . – , .
XML stock_availables, .
.
, - , .
API
https://domain.com/api. , . id – , «products» . , .
API XML, :
<prestashop>
<api shopName="myshop">
<addresses xlink:href="https://domain.com/api/addresses" get="true" put="false" post="false" delete="false" head="false"></addresses>
</api>
</prestashop>
- . https://domain.com/api/products:
<prestashop>
<products>
<product id="22" xlink:href="https://domain.com/api/products/22"/>
<product id="24" xlink:href="https://domain.com/api/products/24"/>
<product id="265" xlink:href="https://domain.com/api/products/265"/>
<product id="294" xlink:href="https://domain.com/api/products/294"/>
<products />
<prestashop />
.
requests. , Requests — , .
API PS Basic ( ). . requests:
request_url = «https://domain.com/api»
get_combination_xml = requests.get(request_url, auth=(self.api_secret_key, ''))
200, , XML. .
XML
– xml.etree. , , ( ), , Python.
:
# 2
from xml.etree import ElementTree as ET
from xml.etree.ElementTree import ElementTree
# xml.etree
def xml_data_extractor(data, tag):
# data – XML
# tag = products–
try:
xml_content = ET.fromstring(data.content) # ElementTree. . .
general_tag = xml_content[0] # –
tag = general_tag.find(tag) #
tag_inner_link = tag.get('{http://www.w3.org/1999/xlink}href') #
# href
#
product_meta = {'product_link': tag_inner_link}
return product_meta
except:
return None
: https://domain.com/api/products. , .
None except Try. , , , , .
PS
PS . , – SQL . XML , — , .
:
https://domain.com/api/combinations/?filter[reference]=reference
, reference — .
- -, : KRHE1Z26X14M200034.
, . ! Git:
«»
( , ). base64 , , , :
def __init__(self, api_secret_key, request_url=None, **kwargs):
try:
self.api_secret_key = str(api_secret_key) #!API key is necessary!
self.api_secret_key_64 = base64.b64encode((self.api_secret_key + ':').encode())
except:
raise TypeError('The secret_key must be a string!')
# Main path to working directory
self.base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
self.request_url = request_url
self.kwargs = kwargs.items()
#product meta to return
self.name = None
self.total_quantity = None
self.w_from = None
self.w_to = None
self.date = str(datetime.datetime.now().strftime("%d-%m-%Y, %H:%M"))
: _xml_data_extractor(), _wd() _logging(), . -.
— . 11. . , , .
middle-
c Python. , - . WSGI- , !
, , .
, . , Django, — middle-, .
, , - .
! https://palachintosh.com/xxx/xxx/
? ( ) , , . .
/?code=1122334455&token=IUFJ44KPQE342M3M109DNWI
( ):
success – , , , , - . .
, , , , . Django Django REST. Java Retrofit, .
– – . – - :
token = None
with open(‘token.txt’) as file_t:
token = file_t[0]
if token == str(request.GET.get(‘token’)):
//
return JsonResponse({‘Error’: ‘Invalid token’})
, , .
Chrome
, , ..
, . . XMLHttpRequest.
CORS. , Access-Control-Allow-Origin. , OPTIONS.
views.py def options(self, request). GET .
100 , .
- , . . :
, . «Kod roweru» , .
– PrestaRequest . , .
«sku» , ajax . , ajax . .
var interval;
function main_interval() {
clearInterval(interval);
interval = setInterval(function () {
href = window.location.href
if (href.indexOf('https://24.kross.pl/warranty/new') >= 0 ||
href.indexOf('id_product=') >= 0) {
if (href.indexOf('id_product=') >= 0) {
prestaCheck();
clearInterval(interval);
}
if (href.indexOf('https://24.kross.pl/warranty/new') >= 0) {
location.reload();
get_buttons();
}
}
if (href.indexOf('https://24.kross.pl/bike-overview/new') >= 0) {
clearInterval(interval);
check_all();
}
}, 1000);
}
:
// onclick or enter events
function getFormData() {
var getForm = document.forms[0];
if (getForm != null) {
if (getForm.hasChildNodes("sku") && getForm.sku != null){
var code = String(getForm.sku.value);
}
if (getForm.hasChildNodes("bike_model") && getForm.bike_model != null) {
edit_msg = document.querySelector(".message-container > span > h1");
edit_msg.innerText = "Rower " + String(getForm.bike_model.value) + " zostanie usunięty ze stanów!";
}
if (code != null && getForm.serial_number != null) {
sendRequest(code);
}
}
}
bike_model , , . :
var getBodyBlock = document.querySelector('body');
var alert_div = document.createElement('div');
alert_div.innerHTML = '<div class="alert-message"><div class="message-container">\
<span><h1></h1></span>\
<div class="inner-buttons">\
<button id="btnYes" class="ant-btn ant-btn-danger">Potwierdzam!</button>\
<button id="btnReserve" class="ant-btn ant-btn-danger">Zdjąć rezerwację</button>\
<button id="btnNo" class="ant-btn ant-btn-success">Nie teraz</button>\
</div></div></div>';
loader = document.createElement('div');
getBodyBlock.appendChild(alert_div);
: https://github.com/palachintosh/shop_extension
– Android-
, , . . , , , 50 ., .
. , . , .
( )
3 . , :
, .
, , , - , .
, . - . , - . Java .
Retrofit 2. , Python. , , , , , .
Main Activity 3 – onCreate, scanCode, enterCode , :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner fromSpinner = (Spinner) findViewById(R.id.fromSpinner);
Spinner toSpinner = (Spinner) findViewById(R.id.toSpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String> (
this, android.R.layout.simple_spinner_item, warehouses);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
fromSpinner.setAdapter(adapter);
toSpinner.setAdapter(adapter);
}
public void scanCode(View view) {
Intent intent = new Intent(MainActivity.this, Scan.class);
Spinner get_w_from = (Spinner) findViewById(R.id.fromSpinner);
Spinner get_w_to = (Spinner) findViewById(R.id.toSpinner);
EditText editText = (EditText) findViewById(R.id.prodctQuantity);
String quantity_tt = editText.getText().toString();
RequestData requestData = new RequestData(
get_w_from.getSelectedItem().toString(),
get_w_to.getSelectedItem().toString(),
quantity_tt);
intent.putExtra(RequestData.class.getSimpleName(), requestData);
startActivity(intent);
}
“Enter Code” . , . – .
Scan Code Activity co , Barcode Scanner Google.
Send Code – . , . Retrofit . , , – Java Android , .
github: https://github.com/palachintosh/product_control.git
:
– ;
– , , ;
- , .
:
– - , ;
– ;
– .
, 2- -.
, , 5:
.
( , PrestaShop).
"Enter code" .
"Scan code".
– "Send Code".
, , , .
, , , . - - .
: , , , .
, , , .
Les personnes qui ont consulté les référentiels ou qui ont généralement lu ceci seront reconnaissantes de leurs commentaires et critiques constructifs.