def generate_listing_model(): """Generate listing model after all addons are loaded""" global ListingEntry, Relations # XXX: For now we all parallel created apps have the same model, # this only affects testing. if ListingEntry is not None: return ListingEntry, Relations name = 'ListingEntry' bases = (db.Model,) class_dict = { '__bind_key__': 'cache', '__tablename__': 'listing_entry', 'id': db.Column(db.String, primary_key=True), # md5 'remote': db.Column(db.String), # url 'fileset_id': db.Column(db.Integer), 'storage_id': db.Column(db.Integer), 'type': db.Column(db.String), } relcols = [] for name, callback in LISTING_CALLBACKS.items(): for col in callback.columns: assert col.name not in class_dict if col.relation: assert col.name not in Relations relcols.append(col) else: class_dict[col.name] = db.Column(col.type) ListingEntry = model_metaclass(name, bases, class_dict) for col in relcols: Relations[col.name] = generate_relation_model(col) db.create_all(bind='cache') return ListingEntry, Relations
def decorator(cls): name = cls.__name__ package, jobname = cls.__module__.rsplit('.', 1) group = MODULE_NAME_MAP['job'][package] tablename = '__'.join([ group, jobname, re.sub('([A-Z])', lambda x: '_{}'.format(x.group(1).lower()), name)[1:] ]) bases = (db.Model,) class_dict = { '__doc__': cls.__doc__, '__module__': cls.__module__, '__tablename__': tablename, 'id': db.Column(db.Integer, primary_key=True), 'jobrun_id': db.Column(db.Integer, db.ForeignKey('jobrun.id')), 'jobrun': db.relationship( 'Jobrun', uselist=False, backref=db.backref(tablename, uselist=True) ), 'as_dict': property(_model_to_dict) } class_dict.update((k, v) for k, v in cls.__dict__.items() if k[0] != '_') Model = model_metaclass(name, bases, class_dict) MODELS.append(Model) return Model
def generate_relation_model(col): assert col.relation name = col.name bases = (db.Model,) class_dict = { '__bind_key__': 'cache', '__tablename__': col.name, 'id': db.Column(db.Integer, primary_key=True), 'listing_entry': db.relationship( ListingEntry, uselist=False, backref=db.backref(col.name, cascade='save-update, delete, delete-orphan, merge')), 'listing_entry_id': db.Column(db.Integer, db.ForeignKey('listing_entry.id')), 'value': db.Column(col.type), } Relation = model_metaclass(name, bases, class_dict) return Relation
def decorator(cls): name = cls.__name__ tablename = re.sub('([A-Z])', lambda x: '_{}'.format(x.group(1).lower()), name)[1:] bases = (db.Model,) class_dict = { '__doc__': cls.__doc__, '__module__': cls.__module__, '__tablename__': tablename, 'id': db.Column( db.Integer, db.ForeignKey('fileset.id'), primary_key=True ), 'fileset': db.relationship( 'Fileset', uselist=False, backref=db.backref(tablename, uselist=False) ), } class_dict.update((k, v) for k, v in cls.__dict__.items() if k[0] != '_') Model = model_metaclass(name, bases, class_dict) MODELS.append(Model) return Model