def get_or_create(cls, id, name): from sqlalchemy.orm.exc import NoResultFound try: p = DBSession.query(cls).filter_by(id=id).one() return p except NoResultFound, e: p = cls(id=id, name=name) DBSession.add(p) return p
def setup(self): try: new_attrs = {} new_attrs.update(self.attrs) new_attrs.update(self.do_get_dependencies()) self.obj = self.klass(**new_attrs) DBSession.add(self.obj) DBSession.flush() return self.obj except: DBSession.rollback() raise
def add(self, id): import urllib2 movie = DBSession.query(Movie).filter_by(id=id).first() if movie is None: lw = Movie.lightweight_instance_for(IMDb(), id) # Construct Movie object movie = Movie(id=lw['id'], title=lw['title'], year=lw['year']) for at in lw['attributes']: movie.attributes.append(at) for d in lw['directors']: movie.people.append(MovieRole(person=Person.get_or_create(d['id'], d['name']), role_type=u'director')) for w in lw['writers']: movie.people.append(MovieRole(person=Person.get_or_create(w['id'], w['name']), role_type=u'writer')) for c in lw['cast']: movie.people.append(MovieRole(person=Person.get_or_create(c['id'], c['person']), role_type=u'cast', character=c['character'])) # Fetch cover image if lw['cover_url'] is not None: cover = urllib2.urlopen(lw['cover_url']) movie.cover = cover.read() cover.close() DBSession.add(movie) flash(u'%s has been added to the list.' % movie.title) redirect(url('/movies'))