def test_getAllPhones_withBrands(self): phoneAdapter = phoneDBEngine(constants.dynamoDBTableName) data = phoneAdapter.getItemsWithBrandAndModel(brand="Samsung") phoneData = phoneDBEngine.convertAllDataToPhone(data) for item in phoneData: if "Samsung" not in item.getBrand(): self.fail("Phones not from correct brand." + str(item))
def new_search(request): if request.method == "POST": #If cancel then go back to main page if "cancel" in request.POST: return redirect('home', permanent=True) searchform = SearchForm(request.POST) if searchform.is_valid(): devType = str(searchform.cleaned_data.get('type')) brand = str(searchform.cleaned_data.get('brand')) model = str(searchform.cleaned_data.get('model')) lowPrice = searchform.cleaned_data.get('lowPrice') highPrice = searchform.cleaned_data.get('highPrice') phoneAdapter = phoneDBEngine(tableName=constants.dynamoDBTableName) phones = phoneAdapter.filterItemsWithConditions(brand, model.lower(), devType, lowPrice, highPrice) phones.sort(key=lambda phone: phone.price) collections = phoneDBEngine.orderPhonesToCollections(phones) return render(request, 'mobile/search_result.html', {'allData': collections}) else: render(request, 'mobile/search_result.html', { 'error_message': "Filter Conditions are wrong" }) else: searchform = SearchForm() return render(request, template_name='mobile/new_search.html', context={"form": searchform})
def test_getPhonesWithinPriceRange(self): lowerLim = 5000000 higherLim = 10000000 phoneAdapter = phoneDBEngine(constants.dynamoDBTableName) data = phoneAdapter.getPhonesInPriceRange(lowerLim, higherLim) self.assertGreater(len(data), 0) for item in data: if item.getPrice() < lowerLim or item.getPrice() > higherLim: self.fail("Price not within range. " + str(item))
def all_mobiles(request, page): # Retrieve all data from amazonDB phoneDB = phoneDBEngine(tableName=constants.dynamoDBTableName) data = phoneDB.getAllDevicesWithType('Mobile') phones = phoneDBEngine.convertAllDataToPhone(data) collections = phoneDBEngine.orderPhonesToCollections(phones) paginator = Paginator(collections, 12) allData = paginator.get_page(page) return render(request, 'mobile/all_mobiles.html', {'allData': allData})
def search_PriceRange(request, dev, low, high, page): phoneDB = phoneDBEngine(tableName=constants.dynamoDBTableName) phones = phoneDBEngine.convertAllDataToPhone(phoneDB.getItemWithBrandAndPriceAndType(devType=dev, lowerLim=low, higherLim=high)) phones.sort(key=lambda phone: phone.price) collections = phoneDBEngine.orderPhonesToCollections(phones) paginator = Paginator(collections, 12) allData = paginator.get_page(page) return render(request, 'mobile/all_mobiles.html', {'allData': allData, 'dev': dev, 'low': low, 'high': high})
def test_getPhonesWithinPriceRangeWithBrand(self): lowerLim = 3000000 higherLim = 10000000 brand = "Samsung" phoneAdapter = phoneDBEngine(constants.dynamoDBTableName) data = phoneAdapter.getItemWithBrandAndPriceAndType( devType='Mobile', brand=brand, lowerLim=lowerLim, higherLim=higherLim) self.assertGreater(len(data), 0) for item in data: phone = phoneDBEngine.convertDBDataToPhone(item) if phone.getPrice() < lowerLim or phone.getPrice( ) > higherLim or phone.getBrand() != brand: self.fail( "Price not within range or Item not from from correct brand. " + str(item))
def setUp(self) -> None: self.phone = PhoneData(brand="test", model="Megatron", price="500000 VND", vendor="unitTest") self.phone2 = PhoneData(brand="test", model="Megatron XL", price="1000000 VND", vendor="unitTest", info={"url": "https:/testURL.com"}) self.phone3 = PhoneData(brand="test 1", model="Decepticon", price="$SGD 300000", vendor="unitTest", info={"url": "https:/testURL.com"}) self.data = [self.phone, self.phone2, self.phone3] self.tableName = "test_table" self.pElements = constants.phonePrimaryElements self.sElements = constants.phoneSecondaryElements self.dynamoElements = [DynamoElement('DeviceName', 'HASH', 'S')] DatabaseEngine.createTable(self.tableName, self.pElements, self.sElements) self.db = phoneDBEngine(self.tableName)
def test_getAllPhones(self): phoneAdapter = phoneDBEngine(constants.dynamoDBTableName) data = phoneAdapter.getAllDevicesWithType('Mobile') self.assertGreater(len(data), 30)
def masterUpdate(): ChangesToNotify = {} phoneDBAdaper = phoneDBEngine(constant.dynamoDBTableName) all_brands = set() # Get all phones from DB dataFromDB = phoneDBAdaper.getAllDevicesWithType('Mobile') phonesFromDB = phoneDBEngine.convertAllDataToPhone(dataFromDB) # Loop through each source to update information for src in constant.scrapingSources: if src.name in scrap_parser: parser = scrap_parser[src.name](src.info.ignoreTerm, src.url, src.info.param) phonesFromScraper = parser.getAllPages() if phonesFromScraper is None or len(phonesFromScraper) == 0: continue # Update data for each source priceChange = [] infoChange = [] newItem = [] # Update data for item in phonesFromScraper: all_brands.add(item.getBrand()) existed = False for phone in phonesFromDB: if item == phone: if item.checkPriceChange(oldData=phone): priceChange.append((item, phone)) elif item.checkInfoChange(oldData=phone): infoChange.append((item, phone)) existed = True break if not existed: newItem.append(item) # Delete old items that not there anymore toDelete = [] for phone in phonesFromDB: existed = False for item in phonesFromScraper: if item == phone: existed = True break if not existed and phone.getVendor() == src.name: toDelete.append(phone) # push new data to database for item, _ in priceChange: phoneDBAdaper.updateItemToDB(item) for item, _ in infoChange: phoneDBAdaper.updateItemToDB(item) for item in toDelete: phoneDBAdaper.deleteItemFromDB(item) if len(newItem) > 0: phoneDBAdaper.pushAllDataToDB(newItem) # Add changes to notify list ChangesToNotify[src.name] = (newItem, priceChange, toDelete) else: print("Parser for " + src.name + " is not available. Skip") # Update all brands if len(all_brands) > 0: phoneDBAdaper.updateAllBrandData(list(all_brands)) fullpath = "{}/Core/brands.txt".format( os.path.dirname(os.path.realpath(__file__))) f = open(fullpath, "+w") f.write(', '.join(list(all_brands))) f.close() return ChangesToNotify