Giter VIP home page Giter VIP logo

django-amazon-price-monitor's People

Contributors

darignac avatar mmrose avatar quantifiedcode-bot avatar waffle-iron avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-amazon-price-monitor's Issues

REST-API

We'll need a REST-API for the Frontend (as we'll cut it into a separate project) and for Third-Party-Apps.

Things, that the API should be able to do:

  • authenticate as pricemonitor user with username/password/token (whatever fits best)
  • get/search for products by barcodes (e.g. ISBN etc.)
    ** add products by barcodes, callback possibility once the product was synched)
  • get common product info (title, description etc.)
  • get the current price
  • add/remove a subscription
  • callback for subscriptions (if pricelimit was reached, call third party app)
  • get price development within time range
  • get product images

Additionally check, to which terms third-party apps should stick to (usage restrictions of Amazon product API).

Clear old products and prices

We do not currently remove the price instances, even if nobody subscribed to the product. In general prices could be deleted if no subscription is available. Even products that are not activly monitored shall be removed.
Having older prices would be nice, but is not relevant. If the last subscription was two months ago and somebody subscribes now, there would be a gap of 2 months in the price history. Furthermore the user is only interested in the price history since he added it.

Data reduction and clean up

The release cycle of python-amazon-simple-product-api is unclear, within the github repo you cannot find out what is contained in which release - also there is no release log.
We used python-amazon-simple-product-api at the beginning because it was easy to use and provided a lot of values we needed (and a lot we do not need). The python-amazon-simple-product-api would not cover the requirements for ticket #19 but bottlenose provides the relevant information.
I'd like to strip down our models to only the fields we need and query the Amazon API with only these values. Therefore using bottlenose is the tool of choice as it is a dumb and simple wrapper around the Amazon Product Advertising API and nothing more.

Price fetch after subscription update

If a subscription is updated and the target price has changed, reset the price fetch interval and directly fetch the price of the product to have the least actual price.

Adjust to Amazon usage requirements

Product Advertising API:

  1. Usage Requirements

(n) You will not store or cache Product Advertising Content consisting of an image, but you may store a link to Product Advertising Content consisting of an image for up to 24 hours. You may store other Product Advertising Content that does not consist of images for caching purposes for up to 24 hours, but if you do so you must immediately thereafter refresh and re-display the Product Advertising Content by making a call to the Product Advertising API or retrieving a new Data Feed and refreshing the Product Advertising Content on your application immediately thereafter. Unless otherwise notified by us, you may store individual Amazon Standard Identification Numbers (ASINs) for an indefinite period until the termination of this Licence Agreement. Notwithstanding the foregoing, if your application includes a client application, the client application may not store or cache Product Advertising Content. Upon our request you will, within three business days of our request, furnish us with a copy of any client application that includes or uses Product Advertising Content for the purpose of verifying your compliance with this Licence Agreement.

(o) You will include a date/time stamp adjacent to your display of pricing or availability information on your application if you obtain Product Advertising Content from a Data Feed, or if you call the Product Advertising API or refresh the Product Advertising Content displayed on your application less frequently than hourly. However, during the same day on which you requested and refreshed the pricing and availability information displayed on your application, you may omit the date portion of the stamp. Examples of acceptable messaging include:

[insert name of Amazon Site] Price: EUR/POUND 32.77 (as of 01/07/2012 14:11 [insert time zone] - Details)
[insert name of Amazon Site] Price: EUR/POUND 32.77 (as of 14:11 [insert time zone] - More info)

Additionally, you must either include the following disclaimer adjacent to the pricing or availability information or provide it via a hyperlink, popup box, scripted popup, or other similar method: "Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product." In the above examples, "Details" and "More info" would provide a method for the end user to read the disclaimer.

(q) If you display Product Advertising Content consisting of text on your application, you will include the following disclaimer in plain view to end users of your application: "CERTAIN CONTENT THAT APPEARS [IN THIS APPLICATION or ON THIS SITE, as applicable] COMES FROM AMAZON EU S.à r.l. THIS CONTENT IS PROVIDED 'AS IS' AND IS SUBJECT TO CHANGE OR REMOVAL AT ANY TIME."

  1. Modification

We may modify any of the terms and conditions contained in this Licence Agreement at any time and in our sole discretion by, at least 7 days prior to the effective date of the modification, posting a change notice or revised agreement on an Amazon Site. Modifications may include, for example, changes to the usage requirements. You may during that 7-day period, as your sole recourse, notify us in writing of your objections to the modifications and, if you do so, your account will automatically terminate on the effective date of the modification to which you objected. We recommend that you frequently review this Licence Agreement for any modifications that may be applicable to you.

IF ANY MODIFICATION IS UNACCEPTABLE TO YOU, YOUR ONLY RECOURSE IS TO TERMINATE THIS LICENCE AGREEMENT IN WRITING. YOUR CONTINUED USAGE OF THE PRODUCT ADVERTISING API, DATA FEED, OR PRODUCT ADVERTISING CONTENT FOLLOWING THE EFFECTIVE DATE OF THE MODIFICATION WILL CONSTITUTE YOUR BINDING ACCEPTANCE OF THE CHANGE.

Trigger product fetching on product creation

Currently the product infos are fetched when the periodic celery task is triggered. It would be better to trigger it for a newly created product directly after the creation of it.

Endless synchronization queue

We have a funny endless queue phenomenom here: the sync all products task runs every 5 minutes. A taskrun queries 10 products and if there are more products, the task will be run again after 10 seconds. If there are more than 300 products to sync, the periodic task will run before the actual sync run is done. This stacks up a pile of queues.

Add more tests

Currently, there is only a dummy test and nothing more...

Don't be able to add a subscription for a product more than once

Currently you can add x subscriptions for the same product (and email notification).
With the subscription remove fix in e392107 this will throw an error in the frontend.
Generally one should only be able to create a subscription for a product and notification email once, this is currently not secured.

Add tagging

Add the possibility to tag products and show the products tagged with a specific tag.

Product history kind of a thing

Currently it only informs about the subscribed prices and you have to delete the subscription manually. There should be additionally a history with which one can see whcih products he already purchased and a hint when adding a subscription with a product already owned. Therefore the functionality to mark a subscribed product as bought is also needed.

Taking this further, we could also add a kind of "Movies I own" archive at once with functionality to add products one already owns.

That's just an idea, I have to think about it more deeply.

AWS.ExceededMaximumParameterValues

[2014-05-18 10:38:11,300: ERROR/Worker-1] Unable to communicate with Amazon, an unknown error occurred.
Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
    lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 102, in lookup
    "Amazon Product Lookup Error: '{0}', '{1}'".format(code, msg))
amazon.api.LookupException: Amazon Product Lookup Error: 'AWS.ExceededMaximumParameterValues', 'Your request contains too many values for ItemId. This parameter can have a maximum of 10 values.'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
    lookup = get_api().lookup(ItemId=asin)
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 96, in lookup
    response = self.api.ItemLookup(ResponseGroup=ResponseGroup, **kwargs)
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 241, in __call__
    {'api_url': api_url, 'cache_url': cache_url})
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 202, in _call_api
    return urllib2.urlopen(api_request, timeout=self.Timeout)
  File "/usr/local/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.3/urllib/request.py", line 475, in open
    response = meth(req, response)
  File "/usr/local/lib/python3.3/urllib/request.py", line 587, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python3.3/urllib/request.py", line 513, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.3/urllib/request.py", line 595, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable
[2014-05-18 10:38:11,389: ERROR/Worker-1] Unable to communicate with Amazon, an unknown error occurred.
Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
    lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 102, in lookup
    "Amazon Product Lookup Error: '{0}', '{1}'".format(code, msg))
amazon.api.LookupException: Amazon Product Lookup Error: 'AWS.ExceededMaximumParameterValues', 'Your request contains too many values for ItemId. This parameter can have a maximum of 10 values.'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
    lookup = get_api().lookup(ItemId=asin)
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 96, in lookup
    response = self.api.ItemLookup(ResponseGroup=ResponseGroup, **kwargs)
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 241, in __call__
    {'api_url': api_url, 'cache_url': cache_url})
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/bottlenose/api.py", line 202, in _call_api
    return urllib2.urlopen(api_request, timeout=self.Timeout)
  File "/usr/local/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.3/urllib/request.py", line 475, in open
    response = meth(req, response)
  File "/usr/local/lib/python3.3/urllib/request.py", line 587, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python3.3/urllib/request.py", line 513, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.3/urllib/request.py", line 595, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable

Group by FSK

In Germany the movies are rated by FSK and all titles having FSK 18 have additional postage (5€). So when your FSK 18 product hits the price limit you still have to add the postage. Therefore it would be great to filter all subscriptions by the FSK value to see other FSK 18 titles and then be able to deceide if you buy some of the others too to save postage.

Currently I've no idea how this applies to other countries and their postages fees. Have to check what the API offers for that.

Unique ASINs and ISBN and Interprets

ASINs should be unique.
We have to handle products that do not have ASINs (like books). They have ISBN-10 and/or ISBN-13 that probably map to ASIN.
Additionally we should not only store the title of the product but also the interpret (for music, books, etc.)

Limit graphs

AFAIK the graph shows all prices the product has. If the product is there for a very long time, then there is a huge amount of data to be loaded and displayed. We should think about limiting this graph to a certain time slice (e.g. the last month) and add the option to change the displayed time slice.

Graphs do not render correct values

The graphs may not render the correct values (I'm not 100% sure), but for sure the current value is not displayed. Additionally there is no legend for the x axis.

See the examples below and their current value, which is not displayed correctly:

pm1
pm2

Handle products becoming invalid

I once added a product that is not available on Amazon any more. The system tries to update its price, then the exception below occurs. As the user has a subscription for the product, mark both product and subscription as invalid and display an error? If there are no more subscriptions for an invalid product, delete it.

Syncing 1 products. No more products to sync there.
unable to lookup product with asin B00GK7MFXC
Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 153, in run
    lookup = get_api().lookup(ItemId=','.join(list(products.keys())))
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 105, in lookup
    etree.tostring(root, pretty_print=True)))
amazon.api.AsinNotFound: ASIN(s) not found: 'b'<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">\n  <OperationRequest>\n    <HTTPHeaders>\n      <Header Name="UserAgent" Value="Python-urllib/3.3"/>\n    </HTTPHeaders>\n    <RequestId>8f0799d1-1090-4878-a343-824373b349e9</RequestId>\n    <Arguments>\n      <Argument Name="Operation" Value="ItemLookup"/>\n      <Argument Name="Service" Value="AWSECommerceService"/>\n      <Argument Name="Signature" Value="EugbExkwNGTAPDowj5u5VrtejIENWdvoKe6JqCaxsvM="/>\n      <Argument Name="AssociateTag" Value="zoevc-21"/>\n      <Argument Name="Version" Value="2011-08-01"/>\n      <Argument Name="ItemId" Value="B00GK7MFXC"/>\n      <Argument Name="AWSAccessKeyId" Value="AKIAIFSTEZFTTSS6HAFA"/>\n      <Argument Name="Timestamp" Value="2014-06-10T15:44:06Z"/>\n      <Argument Name="ResponseGroup" Value="Large"/>\n    </Arguments>\n    <RequestProcessingTime>0.0189840000000000</RequestProcessingTime>\n  </OperationRequest>\n  <Items>\n    <Request>\n      <IsValid>True</IsValid>\n      <ItemLookupRequest>\n        <IdType>ASIN</IdType>\n        <ItemId>B00GK7MFXC</ItemId>\n        <ResponseGroup>Large</ResponseGroup>\n        <VariationPage>All</VariationPage>\n      </ItemLookupRequest>\n      <Errors>\n        <Error>\n          <Code>AWS.InvalidParameterValue</Code>\n          <Message>B00GK7MFXC is not a valid value for ItemId. Please change this value and retry your request.</Message>\n        </Error>\n      </Errors>\n    </Request>\n  </Items>\n</ItemLookupResponse>\n''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/var/www/pricemonitor.zoe.vc/django-amazon-price-monitor/price_monitor/tasks.py", line 158, in run
    lookup = get_api().lookup(ItemId=asin)
  File "/var/www/pricemonitor.zoe.vc/virtualenv/lib/python3.3/site-packages/amazon/api.py", line 105, in lookup
    etree.tostring(root, pretty_print=True)))
amazon.api.AsinNotFound: ASIN(s) not found: 'b'<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">\n  <OperationRequest>\n    <HTTPHeaders>\n      <Header Name="UserAgent" Value="Python-urllib/3.3"/>\n    </HTTPHeaders>\n    <RequestId>aa1994fa-552a-4623-b448-1d15bca6e57e</RequestId>\n    <Arguments>\n      <Argument Name="Operation" Value="ItemLookup"/>\n      <Argument Name="Service" Value="AWSECommerceService"/>\n      <Argument Name="Signature" Value="EugbExkwNGTAPDowj5u5VrtejIENWdvoKe6JqCaxsvM="/>\n      <Argument Name="AssociateTag" Value="zoevc-21"/>\n      <Argument Name="Version" Value="2011-08-01"/>\n      <Argument Name="ItemId" Value="B00GK7MFXC"/>\n      <Argument Name="AWSAccessKeyId" Value="AKIAIFSTEZFTTSS6HAFA"/>\n      <Argument Name="Timestamp" Value="2014-06-10T15:44:06Z"/>\n      <Argument Name="ResponseGroup" Value="Large"/>\n    </Arguments>\n    <RequestProcessingTime>0.0218340000000000</RequestProcessingTime>\n  </OperationRequest>\n  <Items>\n    <Request>\n      <IsValid>True</IsValid>\n      <ItemLookupRequest>\n        <IdType>ASIN</IdType>\n        <ItemId>B00GK7MFXC</ItemId>\n        <ResponseGroup>Large</ResponseGroup>\n        <VariationPage>All</VariationPage>\n      </ItemLookupRequest>\n      <Errors>\n        <Error>\n          <Code>AWS.InvalidParameterValue</Code>\n          <Message>B00GK7MFXC is not a valid value for ItemId. Please change this value and retry your request.</Message>\n        </Error>\n      </Errors>\n    </Request>\n  </Items>\n</ItemLookupResponse>\n''

Inform about further price reductions

If the price limit hit the email to the subscribers is sent and then again after 7 days if the price is still under the limit. (the 7 days are a setting)
We should instead inform the subscriber about future price reductions as they happen and if they hit a certain price deviation (maybe at least 50 cent difference to the last price).

Notification of music albums

If you have an album called "The Title" of the artist "The Artist" the notification mail just says

The price limit of 10.00 EUR has been reached for the article "The Title" - the current price is 9.21 EUR.

So there is the artist missing that should be displayed, too.

FindProductsToSynchronizeTask is not always rescheduled

Sometimes the FindProductsToSynchronizeTask is not rescheduled. It's currently unclear, why this happens, there are no outputs in the logs indicating an error or something else. The last product is synchronized (at least the synchronization is started) and then there is emptyness.

Sync on product creation not working

Products created via Angular and normal view are not synced immediately after creation.

The syncronization is trigger via a post_save signal handler. This handler triggers SynchronizeSingleProductTask wih the ASIN of the new created product.
It is a very common problem, that the post_save signal handler also runs inside the transaction, that creates the product at the end, so the task is triggered just before the product is actually is created in the database.

Unpin beautifulsoup4==4.3.2

Because the tests fail with the most current beautifulsoup4, the package was pinned.
We should fix this in code and unpin.

./home/travis/virtualenv/python3.3.5/lib/python3.3/site-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

https://travis-ci.org/ponyriders/django-amazon-price-monitor/jobs/69645569

Product characteristics

If there is e.g. a movie, one might want to monitor the prices for the DVD as well as the BluRay version without having to monitor 2 separate products. This would be really nifty but it would also change the approach that everything is based on an ASIN which then will not be the case.
Have to check, what the best structure would be here. Also keep in mind that we probably will provide an API to fetch prices or product related information for authorized webapps.

Localized dates

Currently all time information displayed is UTC, but it should be the timezone of the user.

Make notifications user based

Currently e.g. the renotification interval is a global setting. Specify the settings the user can set for himself and implement.

Make mail content templatable

The mail content of subscriptions is currently created from 2 settings variables and some variable replacements.
This should really be a template to allow customization.

Products with the same price over graph timespae have an empty graph

If there is a product which price hasn't changed for the timespan being displayed in the graph, then the graph is empty. It should instead draw a single line at the price value.

auswahl_004

The price values for this item are:

{
  "count": 50,
  "next": null,
  "previous": null,
  "results": [
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T07:52:30.393212Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T08:52:31.259789Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T08:52:33.132879Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T09:52:33.567063Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T09:52:35.363439Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T10:52:35.661678Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T10:52:37.299173Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T11:52:38.346373Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T11:52:39.193436Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T12:52:39.664503Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T12:52:41.064781Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T13:52:41.684590Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T13:52:43.171169Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T14:52:43.634879Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T14:52:44.730469Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T15:52:45.965490Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T15:52:47.219004Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T16:52:47.937923Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T16:52:49.817696Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T17:52:50.132232Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T17:52:51.369144Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T18:52:52.455237Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T18:52:55.142894Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T19:52:56.469450Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T19:52:57.625116Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T20:52:58.359876Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T20:53:00.234466Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T21:53:01.268994Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T21:53:02.945412Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T22:53:03.644877Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T22:53:05.088830Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T23:53:05.544245Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-16T23:53:07.489745Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T00:53:08.060176Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T00:53:09.025517Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T01:53:09.893997Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T01:53:10.946594Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T02:53:11.470668Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T02:53:12.444995Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T03:53:12.828628Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T03:53:14.277582Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T04:53:14.838663Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T04:53:16.163076Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T05:53:16.436199Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T05:53:18.281304Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T06:53:18.635791Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T06:53:20.417171Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T07:53:21.001458Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T07:53:22.791741Z"
    },
    {
      "value": 14.99,
      "currency": "EUR",
      "date_seen": "2015-06-17T08:53:23.510070Z"
    }
  ]
}

Monitoring keywords/search

It would be nice (like all the other suggested enhancements) to have a kind of interest or monitoring list for products. One should be able to add search terms (not an ASIN!) and then be informed via email if there is found something new.

Why? A little example: I bought Continuum (the series) season 1 in German as bluray on Amazon (Region 2). Continuum season 2 was not broadcasted in Germany, but in the UK which is also region 2. So I bought season 2 as UK import. Now I want season 3, but currently the only season 3 search hit is an US import (Region 1) which I cannot play on my region 2 bluray player. Additionally, I don't know when and if season 3 is released in UK, so I have to search for it periodically on Amazon by hand. For my use case there are plenty of other products I want to monitor in this way.

I've not thought deeper about implementation, but sending an email with the results (one email for all search terms that have updated) and a listing on the platform itself with the ability to directly add a product to the price monitor, should be the minimum.

'NoneType' object has no attribute 'url'

[2015-08-17 20:20:41,161: ERROR/Worker-1] Chord 'f43bb10c-bffd-40d2-be25-2a79cd052691' raised: 'Dependency 061b0871-0fc5-43a4-9719-934ca8f286cc raised AttributeError("\'NoneType\' object has no attribute \'url\'",)'
Traceback (most recent call last):
  File "/somewhere/lib/python3/site-packages/celery/backends/base.py", line 565, in on_chord_part_return
    ret = j(timeout=3.0, propagate=propagate)
  File "/somewhere/lib/python3/site-packages/celery/result.py", line 691, in join_native
    raise value
AttributeError: 'NoneType' object has no attribute 'url'
[2015-08-17 20:20:41,166: ERROR/MainProcess] Task price_monitor.product_advertising_api.tasks.SynchronizeSingleProductTask[061b0871-0fc5-43a4-9719-934ca8f286cc] raised unexpected: AttributeError("'NoneType' object has no attribute 'url'",)
Traceback (most recent call last):
  File "/somewhere/lib/python3/site-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/somewhere/lib/python3/site-packages/celery/app/trace.py", line 438, in __protected_call__
    return self.run(*args, **kwargs)
  File "/somewhere/django-amazon-price-monitor/price_monitor/product_advertising_api/tasks.py", line 165, in run
    for asin, amazon_data in ProductAdvertisingAPI().item_lookup(item_ids=list(products.keys())).items():
  File "/somewhere/django-amazon-price-monitor/price_monitor/product_advertising_api/api.py", line 139, in item_lookup
    'large_image_url': item_node.largeimage.url.string,
AttributeError: 'NoneType' object has no attribute 'url'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.