summaryrefslogtreecommitdiff
path: root/app/gtd/management/commands
diff options
context:
space:
mode:
Diffstat (limited to 'app/gtd/management/commands')
-rw-r--r--app/gtd/management/commands/__init__.py0
-rw-r--r--app/gtd/management/commands/rss_updater.py67
2 files changed, 67 insertions, 0 deletions
diff --git a/app/gtd/management/commands/__init__.py b/app/gtd/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/gtd/management/commands/__init__.py
diff --git a/app/gtd/management/commands/rss_updater.py b/app/gtd/management/commands/rss_updater.py
new file mode 100644
index 0000000..41ffa99
--- /dev/null
+++ b/app/gtd/management/commands/rss_updater.py
@@ -0,0 +1,67 @@
+from django.core.management.base import BaseCommand, CommandError
+
+import datetime
+import feedparser
+from urllib.parse import urlparse
+
+from django.contrib.auth import get_user_model
+
+from posts.models import PostStatus, Post
+User = get_user_model()
+"""
+run from a cronscript that looks line this:
+
+*/1 * * * * cd /home/lxf/sites/wired.luxagraf.net && source /home/lxf/sites/wired.luxagraf.net/venv/bin/activate && /home/lxf/sites/wired.luxagraf.net/venv/bin/python /home/lxf/sites/wired.luxagraf.net/manage.py rss_updater --settings=config.settings
+"""
+
+class Command(BaseCommand):
+ help = "Update all published posts"
+
+ def is_deal(self, tags):
+ for tag in tags:
+ if tag['term'] == "Deals":
+ return True
+ return False
+
+ def handle(self, *args, **options):
+ feed = feedparser.parse("https://www.wired.com/feed/tag/commerce/latest/rss")
+ for item in feed.entries:
+ url = urlparse(item.link)
+ story_type = url.path.split('/')[1]
+ if story_type == "story" or "gallery":
+ if not self.is_deal(item.tags):
+ try:
+ post = Post.objects.get(url=item.link)
+ post.date_last_pub = datetime.datetime.strptime(item.published, '%a, %d %b %Y %H:%M:%S %z').date()
+ post.post_status = PostStatus.PUBLISHED
+ post.save()
+ self.stdout.write(
+ self.style.SUCCESS('Successfully updated post "%s"' % post.title)
+ )
+ except:
+ continue
+ if story_type == "review":
+ """
+ TODO: add first and last names so I have everyone in the DB
+ Then parse and add reviews, but change views so we don't see them
+ in views where we just want a list of guides to update
+ """
+ user = User.objects.get(firstname=item.author.split(" ")[0],lastname=item.author.split(" ")[1])
+ dt = datetime.datetime.strptime(item.published, '%a, %d %b %Y %H:%M:%S %z').date()
+
+ post = Post.objects.get(url=item.link)
+
+ user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)
+ title = models.CharField(max_length=512, blank=True, null=True)
+ body = models.TextField(blank=True, null=True)
+ url = models.CharField(max_length=512, blank=True, null=True)
+ date_last_pub = models.DateField()
+ guid = models.CharField(max_length=512, blank=True, null=True, db_index=True)
+ author = models.CharField(max_length=255, blank=True, null=True)
+ post_type = models.IntegerField(choices=PostType.choices, default=PostType.GUIDE)
+ template_type = models.IntegerField(choices=TemplateType.choices, default=TemplateType.STORY)
+ update_frequency = models.BigIntegerField(help_text="In days")
+ products = models.ManyToManyField(ProductLink, blank=True, null=True)
+ needs_update = models.BooleanField(default=False)
+ is_live = models.BooleanField(default=True)
+ post_status = models.IntegerField(choices=PostStatus.choices, default=PostStatus.PUBLISHED)