def update(product_id): resp = helpers.get_response(request) product = helpers.get_by(glob.products, product_id) users.has_right_abort(resp, product['user_id']) resp = helpers.get_response(request) exclude_field = ['reservePrice', 'startPrice', 'id', 'user_id', 'user'] null_fields = ['title', 'description', 'buyoutPrice', 'dateLength', 'dateStart'] product = helpers.update_object(glob.products, product_id, resp, glob.products_path, null_fields=null_fields, exclude_fields=exclude_field) return show(product_id)
def _get_historical_data(start, end=None): if not end: end = start url = 'https://api.coindesk.com/v1/bpi/historical/close.json?start={}&end={}'.format( start, end ) return get_response(url)
def delete_category(cat_id): resp = helpers.get_response(request) loginmanager.verify_token(resp) ret = Models().delete('categories', 'id', id=cat_id) # Rajouter un paramètre pour vérifier le token de l'utilisateur et le droit qu'il a de delete. if ret == False : return 'KO', 401 return 'OK', 200
def get_current_price(cls, currency='USD'): url = 'https://api.coindesk.com/v1/bpi/currentprice/{}.json'.format( currency) data = get_response(url) price = Decimal(data['bpi'][currency]['rate_float']) return price.quantize( Decimal('.0001')) #onyl go up to 4 decimal points
def get_bid(bid_id): resp = helpers.get_response(request) getBid = Models().getBy('bids', 'id', bid_id) if getBid is None: return "Bid not found", 404 return jsonify({'bid' : getBid[0].json()})
def update(user_id): resp = helpers.get_response(request) has_right_abort(resp, user_id) user = helpers.update_object(glob.users, user_id, resp, users_path, null_fields=['password']) u = copy.deepcopy(user) del u['password'] return jsonify({"user": u}), 200
def get_current_price(currency='USD'): url = 'https://api.coindesk.com/v1/bpi/currentprice/{}.json'.format( currency ) data = get_response(url) price = data['bpi'][currency]['rate'] return Decimal(price)
def get_product(product_id): resp = helpers.get_response(request) product = Models().getBy("products", "id", product_id) # Retourne une liste if product is None: return "Product not found", 404 return jsonify({"product": product[0].json()})
def get_addr(addr_id): resp = helpers.get_response(request) addresses = Models().getBy('addresses', 'id', addr_id) if addresses is None: return "Addresse not found", 404 return jsonify({'addresse' : addresses[0].json()})
def testProductDetails(self): ''' Test spider extracts product details ''' url = ( 'http://www.visions.ca/Catalogue/Category/Details.' 'aspx?categoryId=498&productId=10168&sku=AGF310' ) response = get_response('page1', url=url) details = self.spider.get_product_details(response).next() self.assertEqual( details, { 'availability': True, 'breadcrumbs': 'Home/TV & Video/3D TV Glasses', 'category': 'Home/TV & Video/3D TV Glasses', 'image': ( 'http://www.visions.ca/Images/Catalogue/Product' '/English/AGF310_l_1.jpg' ), 'price': 9.99, 'product': 'LG Cinema 3D Glasses - Single Pair', 'url': url } )
def delete_bid(bid_id): resp = helpers.get_response(request) loginmanager.verify_token(resp) ret = Models().delete('bids', 'id', id=bid_id) if ret == False : return 'KO', 401 return 'OK', 200
def testPage1(self): ''' Test extracting data from a single xgroup ''' url = ( 'http://www.visions.ca/Catalogue/Category/Details' '.aspx?categoryId=2&productId=29446&sku=KT609' ) response = get_response('test_details_runner_page1', url=url) group = XGroup( name='title', path=( '//div[contains(@class, "contentright")]/h2/a/font/text()', 'div[contains(@class, "catalogueTitle")]/h3/text()', '//h1/span[contains(@id, "ProdTitle")]/text()' ), process=lambda x: x.upper() ) detail = detailsRunner(group, response=response) self.assertEqual( detail['title'], 'KT-609 3D-COMPATIBLE 1080P FULL HD ANDROID TV MEDIA BOX - ' 'HORIZONTAL BLACK' )
def get_category(cat_id): resp = helpers.get_response(request) categories = Models().getBy('categories', 'id', cat_id) # Retourne une liste if categories is None: return "Category not found", 404 return jsonify({'category' : categories[0].json()})
def get_pay(pay_id): resp = helpers.get_response(request) payments = Models().getBy('payments', 'id', pay_id) if payments is None: return "Payment not found", 404 return jsonify({'payment' : payments[0].json()})
def main(): try: movie_file = get_movie_file() except FileNotFoundError: print('File not selected, exiting') return -1 response = get_response(movie_file) if 'useragent is not valid' in response.text: print(response.text) return -1 parsed = json.loads(response.content) if not parsed: print('Could not find subtitle') return -1 print('Movie Found: %s' % parsed[0]['MovieName']) sub_response = requests.get(parsed[0]['SubDownloadLink']) print('Subtitle Found: %s' % parsed[0]['SubFileName']) movie_dir = os.path.dirname(movie_file) sub_name = parsed[0]['SubFileName'] with open(os.path.join(movie_dir, sub_name), 'wb') as fsub: fsub.write(gzip.decompress(sub_response.content)) print('Subtitle extracted to the movie folder') return 0
def destroy(product_id): resp = helpers.get_response(request) product = helpers.get_by(glob.products, product_id) if product is None: return 'No such product', 400 users.has_right_abort(resp, product['user_id']) helpers.delete_object(glob.products, product_id, products_path) return 'Delete ok', 200
def add_product(): resp = helpers.get_response(request) allowed_fields = ['title', 'description', 'dateStart', 'dateLength', 'startPrice', 'buyoutPrice', 'reservePrice', 'imgUrl'] mandatory_fields = ['title', 'description', 'dateStart', 'dateLength', 'startPrice'] user = helpers.get_by(glob.users, resp['user_id']) association_field = [{'association_name': 'user_id', 'association_value': user['id']}] product = helpers.new_object(glob.products, resp, products_path, allowed_fields, mandatory_fields, associations=association_field) return show(product['id'])
def delete_product(product_id): resp = helpers.get_response(request) loginmanager.verify_token(resp) ret = Models().delete( "products", "id", id=product_id ) # Rajouter un paramètre pour vérifier le token de l'utilisateur et le droit qu'il a de delete. if ret == False: return "KO", 401 return "OK", 200
def edit_product(product_id): resp = helpers.get_response(request) product = Models().getBy("products", "id", product_id) # Retourne une liste if product is None: return "Product not found", 404 loginmanager.has_right(product[0], resp=resp) product[0].edit(resp) product[0].save() return jsonify({"product": product[0].json()}), 200
def edit_bid(bid_id): resp = helpers.get_response(request) editBid = Models().getBy('bids', 'id', bid_id) loginmanager.has_right(editBid[0], resp = resp) if editBid is None: return "Bid not found", 404 editBid[0].edit(resp) editBid[0].save() return jsonify({'bid': editBid[0].json()}), 200
def edit_pay(pay_id): resp = helpers.get_response(request) payments = Models().getBy('payments', 'id', pay_id) loginmanager.has_right(payments[0], resp = resp) if payments is None: return "Payment not found", 404 payments[0].edit(resp) payments[0].save() return jsonify({'payment': payments[0].json()}), 200
def edit_addr(addr_id): resp = helpers.get_response(request) addresses = Models().getBy('addresses', 'id', addr_id) loginmanager.has_right(addresses[0], resp = resp) if addresses is None: return "Addresse not found", 404 addresses[0].edit(resp) addresses[0].save() return jsonify({'addresse': addresses[0].json()}), 200
def profil(user_id): resp = helpers.get_response(request) user = Models().getBy('users', 'id', user_id) # Retourne une liste d'utilisateurs. Vu qu'on demande une ID, et que l'id est unique, on peut sans problème faire user[0] pour accéder au premier élément if user is None: # Si la liste retournée est vide, c'est que aucun utilsiateur n'a cet id return 'User not found', 404 if 'token' in resp: if loginmanager.has_right(user[0], resp['token']): # On vérifie le token return jsonify({'status':'User connected', 'user':user[0].secured()}), 200 # On retourne le profil utilisateur en supprimant le champ "Mot de passe", c'est l'utilisateur qui consulte son propre profil return jsonify({'user' : user[0].public()}), 200 # On retourne le profil utilisateur, comme si l'utilisateur A voulait consulter le profil de l'utilisateur B else: return jsonify({'user' : user[0].public()}), 200
def login(): resp = helpers.get_response(request) if not 'username' in resp or not 'password' in resp: # Si username et / ou password ne sont pas dans la requête, erreur return "Bad request, missing username or password in request", 400 # Retourne au client le code d'erreur 400 user = loginmanager.check_credentials(resp['username'], resp['password']) # On vérifie les identifiants # print user.products if user != False: # Si identifiants OK token = loginmanager.generate_token(user) # On génère le token de l'utilisateur, et on stock en session l'id et le token return jsonify({'status': 'Logged in successfully', 'token':token}), 200 # On retourne au client le token else: return 'Bad credentials', 401
def testPage1(self): ''' Test extraction using a single path and index==one ''' url = ('http://www.visions.ca/catalogue/category/Details' '.aspx?categoryId=162&productId=4644&sku=KUBE2') paths = ('//div/span[contains(@id, "Shipping")]/text()') response = get_response('test_extract_helper_page1', url=url) shipping = extract_helper(response, paths) self.assertEqual(shipping, 'Free Shipping!')
def register(): resp = helpers.get_response(request) if len(resp['password']) < 6: return 'password too short', 406 usersMatch = filter(lambda u: u['username'] == resp['username'], glob.users) if len(usersMatch) != 0 : return 'Username already taken', 409 allowed_fields = ['username', 'password', 'email', 'address1', 'address2', 'city', 'firstname', 'lastname', 'postalcode', 'country', 'token'] mandatory_fields = ['username', 'password', 'email', 'address1', 'city', 'firstname', 'lastname', 'postalcode', 'country'] special_fields = ['password', 'token'] helpers.new_object(glob.users, resp, users_path, allowed_fields, mandatory_fields, special_fields) return 'Register successful', 201
def login(): resp = helpers.get_response(request) mandatory_fields = ["username", "password"] helpers.verify_mandatory_field_form(mandatory_fields, resp) username = resp['username'] password = resp['password'] user = filter(lambda u: u['username'] == username, glob.users) if len(user) == 0: return 'No such username', 401 if password != base64.b64decode(user[0]['password']): return 'Wrong password', 403 generate_token(user[0]) return jsonify({'user_id': user[0]["id"], 'token': user[0]['token']}), 200
def testPage1(self): ''' Test extraction using a single path and index==one ''' url = ( 'http://www.visions.ca/catalogue/category/Details' '.aspx?categoryId=162&productId=4644&sku=KUBE2' ) paths = ('//div/span[contains(@id, "Shipping")]/text()') response = get_response('test_extract_helper_page1', url=url) shipping = extract_helper(response, paths) self.assertEqual(shipping, 'Free Shipping!')
def testPage2(self): ''' Test extraction using a multiple paths and index==one ''' url = ('http://www.visions.ca/catalogue/category/Details' '.aspx?categoryId=162&productId=4644&sku=KUBE2') paths = ('//div/span[contains(@id, "price")]/a/text()' '//div/span[contains(@id, "price")]/text()', '//div[@class="productdetail-pricing"]/div/span[@id]/text()') response = get_response('test_extract_helper_page1', url=url) price = extract_helper(response, paths) self.assertEqual(price, '$398.00')
def search_products(): resp = helpers.get_response(request) if 'query' not in resp: return 'You need to send a query param :(', 400 regex = r"" + re.escape('seche') str = resp['query'] products = [] prods = glob.products for prod in prods: match = re.search(regex, prod['title']) match2 = re.search(regex, prod['description']) if match or match2: products.append(prod) return jsonify({'products' : products}), 200
def testProductLinks2(self): ''' Test spider extracts link to product page - bundles page ''' url = 'http://www.visions.ca/Catalogue/Bundles/Default.aspx' response = get_response('product_page2', url=url) products = list(self.spider.parse_product(response)) self.assertEqual(len(products), 1) self.assertEqual( products[0].url, 'http://www.visions.ca/Catalogue/Bundles/Details.' 'aspx?bundleId=2838' )
def show(user_id): resp = helpers.get_response(request) user = helpers.get_by(glob.users, user_id) if user is None: abort(make_response("User not found",400)) u = copy.deepcopy(user) del u['password'] if not 'user_id' in resp or int(resp['user_id']) != user_id or not 'token' in resp or u['token'] != resp['token']: # Public profil del u['address1'] del u['address2'] del u['email'] del u['firstname'] del u['lastname'] del u['token'] if (len(u) != 0): return jsonify({'user': u}) return 'User Not found', 401
def testProductLinks(self): ''' Test spider extracts link to product page ''' url = ( 'http://www.visions.ca/Catalogue/Category/Product' 'Results.aspx?categoryId=94&view=' ) response = get_response('product_page', url=url) products = list(self.spider.parse_product(response)) self.assertEqual(len(products), 1) self.assertEqual( products[0].url, 'http://www.visions.ca/Catalogue/Category/Details.' 'aspx?categoryId=94&productId=8027&sku=CR2360' )
def testSubCategories(self): ''' Test that spider extracts link to one subcategory ''' url = ( 'http://www.visions.ca/Catalogue/Category/Default.aspx' '?categoryId=368&menu=7' ) response = get_response('subcat_page', url=url) subcategories = list(self.spider.parse_category(response)) self.assertEqual(len(subcategories), 1) self.assertEqual( subcategories[0].url, 'http://www.visions.ca/Catalogue/Category/Product' 'Results.aspx?categoryId=144&view=' )
def testMainNav(self): ''' Test extraction from the front/main page ''' url = 'http://www.visions.ca/Default.aspx' response = get_response('front_page', url=url) subcategories = list(self.spider.parse(response)) self.assertEqual(len(subcategories), 14) self.assertEqual( subcategories[0].url, 'http://www.visions.ca/Catalogue/Category/' 'Default.aspx?categoryId=2&menu=2' ) self.assertEqual( subcategories[-1].url, 'http://www.visions.ca/Catalogue/Bundles/Default.aspx' )
def testPage1(self): ''' Test extracting data from a single xgroup ''' url = ('http://www.visions.ca/Catalogue/Category/Details' '.aspx?categoryId=2&productId=29446&sku=KT609') response = get_response('test_details_runner_page1', url=url) group = XGroup( name='title', path=('//div[contains(@class, "contentright")]/h2/a/font/text()', 'div[contains(@class, "catalogueTitle")]/h3/text()', '//h1/span[contains(@id, "ProdTitle")]/text()'), process=lambda x: x.upper()) detail = detailsRunner(group, response=response) self.assertEqual( detail['title'], 'KT-609 3D-COMPATIBLE 1080P FULL HD ANDROID TV MEDIA BOX - ' 'HORIZONTAL BLACK')
def get_current_price(cls): data = get_response(cls.TICKER_URL) price = cls._current_price_extractor(data) open = cls._current_open_extractor(data) return (Decimal(price), Decimal(open))
def get_current_price(): data = get_response(TICKER_URL) price = data['last'] return Decimal(price)
def get_current_ask(): data = get_response(TICKER_URL) price = data['ask'] return Decimal(price)
def get_current_bid(): data = get_response(TICKER_URL) price = data['bid'] return Decimal(price)
def get_current_ask(cls): data = get_response(cls.TICKER_URL) price = cls._current_ask_extractor(data) return Decimal(price)