diff options
-rw-r--r-- | app/deals/admin.py | 10 | ||||
-rw-r--r-- | app/deals/migrations/0018_reideal_alter_mydeal_body.py | 34 | ||||
-rw-r--r-- | app/deals/migrations/0019_reideal_generate_deal.py | 18 | ||||
-rw-r--r-- | app/deals/migrations/0020_mydeal_added.py | 18 | ||||
-rw-r--r-- | app/deals/migrations/0021_deal_added_to_article.py | 18 | ||||
-rw-r--r-- | app/deals/migrations/0022_alter_deal_added_to_article.py | 18 | ||||
-rw-r--r-- | app/deals/migrations/0023_remove_deal_added_to_article_deal_deal_end_date_and_more.py | 27 | ||||
-rw-r--r-- | app/deals/models.py | 116 | ||||
-rw-r--r-- | app/deals/templates/deals/mydeal_list.html | 2 | ||||
-rw-r--r-- | app/deals/templates/deals/reideal_list.html | 60 | ||||
-rw-r--r-- | app/deals/urls.py | 5 | ||||
-rw-r--r-- | app/deals/views.py | 13 |
12 files changed, 324 insertions, 15 deletions
diff --git a/app/deals/admin.py b/app/deals/admin.py index 3686309..f4c6009 100644 --- a/app/deals/admin.py +++ b/app/deals/admin.py @@ -4,7 +4,7 @@ from django.contrib.gis.admin import OSMGeoAdmin from django.contrib.contenttypes.admin import GenericStackedInline from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter, ChoiceDropdownFilter -from .models import Deal, Brand, MyDeal +from .models import Deal, Brand, MyDeal, REIDeal @admin.register(Deal) @@ -42,3 +42,11 @@ class MyDealAdmin(OSMGeoAdmin): } ), ) + + +@admin.register(REIDeal) +class DealAdmin(OSMGeoAdmin): + list_display = ('title', 'rei_link', 'brand_str', 'category', 'deal_price', 'original_price', 'generate_deal' ) + search_fields = ['brand_str', 'title', ] + list_filter = ('category', 'brand_str',) + list_editable = ('generate_deal',) diff --git a/app/deals/migrations/0018_reideal_alter_mydeal_body.py b/app/deals/migrations/0018_reideal_alter_mydeal_body.py new file mode 100644 index 0000000..627e54f --- /dev/null +++ b/app/deals/migrations/0018_reideal_alter_mydeal_body.py @@ -0,0 +1,34 @@ +# Generated by Django 4.2.2 on 2023-08-22 14:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0017_mydeal_blurb'), + ] + + operations = [ + migrations.CreateModel( + name='REIDeal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('brand_str', models.CharField(max_length=200)), + ('category', models.CharField(max_length=200)), + ('title', models.CharField(blank=True, max_length=200, null=True)), + ('deal_price', models.CharField(max_length=20, null=True)), + ('original_price', models.CharField(max_length=20, null=True)), + ('discount_percent_str', models.CharField(max_length=20, null=True)), + ('url', models.CharField(max_length=200)), + ], + options={ + 'ordering': ('title',), + }, + ), + migrations.AlterField( + model_name='mydeal', + name='body', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/app/deals/migrations/0019_reideal_generate_deal.py b/app/deals/migrations/0019_reideal_generate_deal.py new file mode 100644 index 0000000..7c0e849 --- /dev/null +++ b/app/deals/migrations/0019_reideal_generate_deal.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-08-22 14:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0018_reideal_alter_mydeal_body'), + ] + + operations = [ + migrations.AddField( + model_name='reideal', + name='generate_deal', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/deals/migrations/0020_mydeal_added.py b/app/deals/migrations/0020_mydeal_added.py new file mode 100644 index 0000000..678c7db --- /dev/null +++ b/app/deals/migrations/0020_mydeal_added.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-10-06 13:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0019_reideal_generate_deal'), + ] + + operations = [ + migrations.AddField( + model_name='mydeal', + name='added', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/deals/migrations/0021_deal_added_to_article.py b/app/deals/migrations/0021_deal_added_to_article.py new file mode 100644 index 0000000..0c8d9ee --- /dev/null +++ b/app/deals/migrations/0021_deal_added_to_article.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-10-09 18:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0020_mydeal_added'), + ] + + operations = [ + migrations.AddField( + model_name='deal', + name='added_to_article', + field=models.BooleanField(default=True), + ), + ] diff --git a/app/deals/migrations/0022_alter_deal_added_to_article.py b/app/deals/migrations/0022_alter_deal_added_to_article.py new file mode 100644 index 0000000..0a66baa --- /dev/null +++ b/app/deals/migrations/0022_alter_deal_added_to_article.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-10-09 18:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0021_deal_added_to_article'), + ] + + operations = [ + migrations.AlterField( + model_name='deal', + name='added_to_article', + field=models.BooleanField(default=False), + ), + ] diff --git a/app/deals/migrations/0023_remove_deal_added_to_article_deal_deal_end_date_and_more.py b/app/deals/migrations/0023_remove_deal_added_to_article_deal_deal_end_date_and_more.py new file mode 100644 index 0000000..dadaebf --- /dev/null +++ b/app/deals/migrations/0023_remove_deal_added_to_article_deal_deal_end_date_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.7 on 2023-11-10 14:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('deals', '0022_alter_deal_added_to_article'), + ] + + operations = [ + migrations.RemoveField( + model_name='deal', + name='added_to_article', + ), + migrations.AddField( + model_name='deal', + name='deal_end_date', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='deal', + name='deal_start_date', + field=models.DateTimeField(null=True), + ), + ] diff --git a/app/deals/models.py b/app/deals/models.py index a4fd875..4f38cd1 100644 --- a/app/deals/models.py +++ b/app/deals/models.py @@ -30,6 +30,8 @@ class Deal(models.Model): discount_percent_str = models.CharField(max_length=20, null=True) discount_percent = models.FloatField(null=True) url = models.CharField(max_length=200) + deal_start_date = models.DateTimeField(null=True) + deal_end_date = models.DateTimeField(null=True) class Meta: ordering = ('title',) @@ -62,6 +64,39 @@ class Deal(models.Model): admin_link.short_description = 'Link' +class REIDeal(models.Model): + brand_str = models.CharField(max_length=200) + category = models.CharField(max_length=200) + title = models.CharField(max_length=200, blank=True, null=True) + deal_price = models.CharField(max_length=20, null=True) + original_price = models.CharField(max_length=20, null=True) + discount_percent_str = models.CharField(max_length=20, null=True) + url = models.CharField(max_length=200) + generate_deal = models.BooleanField(default=False) + + class Meta: + ordering = ('title',) + + + def get_deal_price_pretty(self): + try: + return "{:.0f}".format(Decimal(self.deal_price)) + except: + return None + + def dollars_off(self): + try: + return "{:.0f}".format(Decimal(self.original_price) - Decimal(self.deal_price)) + except: + return None + + def rei_link(self): + return format_html('<a target="_blank" href="https://%s">REI</a>' % (self.url)) + admin_link.short_description = 'Link' + + def __str__(self): + return self.title + class MyDeal(models.Model): title = models.CharField(max_length=200, blank=True, null=True) @@ -76,6 +111,7 @@ class MyDeal(models.Model): tertiary_url = models.CharField(max_length=200, blank=True, null=True) body = models.TextField(null=True, blank=True) blurb = models.TextField(null=True) + added = models.BooleanField(default=False) class Meta: ordering = ('title',) @@ -98,6 +134,9 @@ class MyDeal(models.Model): admin_link.short_description = 'Link' """ +for deal in Deal.objects.all(): + if deal.promo_type == "Lightning Deal": + deal.delete() with open(path) as f: reader = csv.reader(f) @@ -116,6 +155,7 @@ with open(path) as f: import csv +from datetime import datetime path = "pdelectronicsdata.csv" with open(path) as f: reader = csv.reader(f) @@ -123,21 +163,23 @@ with open(path) as f: for row in reader: if count > 0: print(row) - if row[4] == "Y": + if row[21] == "Y": prime = True else: prime = False _, created = Deal.objects.get_or_create( asin=row[0], - category=row[1], - brand_str=row[2], - title=row[3], + category=row[8], + brand_str=row[10], + title=row[1], prime_only=prime, - promo_type=row[5], - deal_price= row[9], - original_price = row[10], - discount_percent_str=row[12], - url=row[13], + promo_type=row[23], + deal_price= row[29], + original_price = row[30], + discount_percent_str=row[35], + url=row[42], + deal_start_date=datetime.strptime(row[24], "%m/%d/%Y") + deal_end_date=datetime.strptime(row[25], "%m/%d/%Y") ) count = count+1 @@ -254,11 +296,39 @@ with open(path) as f: lookup_title = stitle, asin = asin, retailer = retailer, - url = str(row[2].strip()) + url = str(row[2].strip()), + body = row[4] + ) + count = count+1 + + + +import csv +path = "rei.csv" +with open(path) as f: + reader = csv.reader(f) + count = 0 + for row in reader: + if count > 0: + print(row) + try: + + if row[4] == "Y": + prime = True + else: + prime = False + _, created = Deal.objects.get_or_create( + asin=row[0], + category=row[1], + brand_str=row[2], + title=row[3], + prime_only=prime, + promo_type=row[5], + deal_price= row[9], + original_price = row[10], + discount_percent_str=row[12], + url=row[13], ) - if not created: - d.body = row[4] - d.save() count = count+1 @@ -294,3 +364,23 @@ driver.get("http://www.python.org") """ + +""" + +REI Importer + + +with open(path) as f: + reader = csv.reader(f) + count = 0 + for row in reader: + _, created = REIDeal.objects.get_or_create( + category=row[3], + brand_str=row[5], + title=row[8], + deal_price= row[12], + original_price = row[11], + discount_percent_=row[13], + url=row[15], + ) +""" diff --git a/app/deals/templates/deals/mydeal_list.html b/app/deals/templates/deals/mydeal_list.html index 07a29eb..04a1a51 100644 --- a/app/deals/templates/deals/mydeal_list.html +++ b/app/deals/templates/deals/mydeal_list.html @@ -37,6 +37,7 @@ body { <a class="button" href="#" onclick="CopyToClipboard('markdown');return false;">Copy Markdown</a> <textarea id="markdown" style="min-width: 85rem; height: 45rem;"> {% for object in object_list %} + #### [{{object.title|title}}]({{object.url}}) +++button-group @@ -47,6 +48,7 @@ body { {{object.body}} + {%endfor%} </textarea> diff --git a/app/deals/templates/deals/reideal_list.html b/app/deals/templates/deals/reideal_list.html new file mode 100644 index 0000000..91f8722 --- /dev/null +++ b/app/deals/templates/deals/reideal_list.html @@ -0,0 +1,60 @@ +{% load humanize %} +<html> + <head> +<style> +body { + padding-top: 30px; +} +.button { + color: white; + padding: 1rem; + text-decoration: none; + background-color: #2ea44f; + border: 1px solid rgba(27, 31, 35, .15); + border-radius: 6px; + box-shadow: rgba(27, 31, 35, .1) 0 1px 0; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system,system-ui,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; + font-size: 14px; + font-weight: 600; + line-height: 20px; + padding: 6px 16px; + position: relative; + text-align: center; + text-decoration: none; + user-select: none; + -webkit-user-select: none; + touch-action: manipulation; + vertical-align: middle; + white-space: nowrap; +} +</style> +</head> +<body> + <p>number of deals: {{deals_count}}</p> +<textarea> +{% for object in object_list %} +#### [{{object.brand_str|title}} {{object.title|title}} for ${{object.get_deal_price_pretty|intcomma}} (${{object.dollars_off}} off)]({{object.url}}) + ++++button-group + +[REI]({{object.url}} "REI"){: target="_blank"} + ++++ +{% endfor %} +</textarea> + + {% for object in object_list %} + <h4><a href="{{object.url}}">{{object.brand_str|title}} {{object.title|title}} for ${{object.get_deal_price_pretty|intcomma}} (${{object.dollars_off}} off)</a></h4> + ++++button-group + +[REI]({{object.url}} "REI"){: target="_blank"} + ++++ + {% endfor %} +</body> +</html> diff --git a/app/deals/urls.py b/app/deals/urls.py index 277e1c4..1ff9495 100644 --- a/app/deals/urls.py +++ b/app/deals/urls.py @@ -5,6 +5,11 @@ from . import views app_name = "deals" urlpatterns = [ + #path( + #pathr'<reideals>', + #pathviews.REIDealListView.as_view(), + #pathname="detail" + #), path( r'deal', views.GenerateDealCodeView.as_view(), diff --git a/app/deals/views.py b/app/deals/views.py index bf0a4c8..8bd01e3 100644 --- a/app/deals/views.py +++ b/app/deals/views.py @@ -1,7 +1,7 @@ from django.views.generic import DetailView, ListView from django.views.generic.base import TemplateView -from .models import Deal, MyDeal +from .models import Deal, MyDeal, REIDeal class DealDetailView(DetailView): @@ -9,6 +9,7 @@ class DealDetailView(DetailView): class MyDealListView(ListView): model = MyDeal + queryset = MyDeal.objects.filter(added=False) class MyDealLapListView(ListView): model = MyDeal @@ -17,3 +18,13 @@ class MyDealLapListView(ListView): class GenerateDealCodeView(TemplateView): template_name = "deals/deal_code.html" + + +class REIDealListView(ListView): + model = REIDeal + queryset = REIDeal.objects.filter(generate_deal=True).order_by("category") + + def get_context_data(self, **kwargs): + context = super(REIDealListView, self).get_context_data(**kwargs) + context['deals_count'] = REIDeal.objects.filter(generate_deal=True).count() + return context |