Beispiel #1
0
    def handle(self, url, **optz):
        # Check if subscriber sites and filters can be found
        if optz.get("subscribe"):
            try:
                subscribe = list(models.Site.get_by_string(name) for name in optz["subscribe"])
            except (ObjectDoesNotExist, MultipleObjectsReturned) as err:
                raise CommandError(err.message)
        else:
            subscribe = list()
        if optz.get("filter"):
            try:
                filters = list(models.Filter.objects.get(id=fid) for fid in optz["filter"])
            except ObjectDoesNotExist as err:
                raise CommandError(err.message)
        else:
            filters = list()

        # Fill in missing feed name fields
        if not optz.get("name"):
            fpf = feedparser.parse(url, agent=fjupdate.USER_AGENT)
            optz["name"] = fpf.feed.get("title", "")[:200]
            if not optz["name"]:
                raise CommandError("Failed to acquire name from the feed ({0})".format(url))
        if not optz.get("shortname"):
            optz["shortname"] = optz["name"][:50]

            # Add Feed / Subscriber objects
        with transaction.commit_on_success():
            feed = models.Feed(feed_url=url, name=optz["name"], shortname=optz["shortname"])
            if optz.get("field_data"):
                try:
                    import yaml as s
                except ImportError:
                    import json as s
                import io

                for k, v in s.load(io.BytesIO(optz["field_data"])).iteritems():
                    setattr(feed, k, v)
            feed.save()
            for f in filters:
                feed.filters.add(f)
            for site in subscribe:
                models.Subscriber.objects.create(feed=feed, site=site)

                # Perform the initial fetch, if requested
        if optz.get("initial_fetch"):
            fetch_optz, fetch_argz = OptionParser(option_list=fjupdate.make_cli_option_list()).parse_args(list())
            fetch_optz.feed = [feed.id]
            fetch_optz.hidden = optz.get("fetch_hidden", False)
            fjupdate.main(fetch_optz)