jbell730
jbell730

Reputation: 21

Get field value within Flask-MongoAlchemy Document

I've looked at documentation, and have searched Google extensively, and haven't found a solution to my problem.
This is my readRSS function (note that 'get' is a method of Kenneth Reitz's requests module):

def readRSS(name, loc):
    linkList = []
    linkTitles = list(ElementTree.fromstring(get(loc).content).iter('title'))
    linkLocs = list(ElementTree.fromstring(get(loc).content).iter('link'))
    for title, loc in zip(linkTitles, linkLocs):
        linkList.append((title.text, loc.text))
    return {name: linkList}

This is one of my MongoAlchemy classes:

class Feed(db.Document):
    feedname = db.StringField(max_length=80)
    location = db.StringField(max_length=240)
    lastupdated = datetime.utcnow()

    def __dict__(self):
        return readRSS(self.feedname, self.location)

As you can see, I had to call the readRSS function within a function of the class, so I could pass self, because it's dependent on the fields feedname and location.
I want to know if there's a different way of doing this, so I can save the readRSS return value to a field in the Feed document. I've tried assigning the readRSS function's return value to a variable within the function __dict__ -- that didn't work either.

I have the functionality working in my app, but I want to save the results to the Document to lessen the load on the server (the one I am getting my RSS feed from).

Is there a way of doing what I intend to do or am I going about this all wrong?

Upvotes: 1

Views: 744

Answers (1)

jbell730
jbell730

Reputation: 21

I found out the answer. I needed to make use of a computed_field decorator, where the first argument was the structure of my return value and deps was a set which contained the fields that this field was dependent on. I then passed the dependent fields into a function's arguments and there you have it.

@fields.computed_field(db.KVField(db.StringField(), db.ListField(db.TupleField(db.StringField()))), deps=[feedname, location])
def getFeedContent(a=[feedname, location]):
    return readRSS(a['feedname'], a['location'])

Thanks anyway, everyone.

Upvotes: 1

Related Questions