Пример #1
0
 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))
Пример #2
0
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})
Пример #3
0
 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))
Пример #4
0
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})
Пример #5
0
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})
Пример #6
0
 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))
Пример #7
0
    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)
Пример #8
0
 def test_getAllPhones(self):
     phoneAdapter = phoneDBEngine(constants.dynamoDBTableName)
     data = phoneAdapter.getAllDevicesWithType('Mobile')
     self.assertGreater(len(data), 30)
Пример #9
0
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