class ResultORM(BaseResultORM): """ Hold the result of an atomic single calculation """ # uniquely identifying a result program = db.StringField(required=True) # example "rdkit", is it the same as program in keywords? driver = db.StringField(required=True) # example "gradient" method = db.StringField(required=True) # example "uff" basis = db.StringField() molecule = db.LazyReferenceField(MoleculeORM, required=True) # This is a special case where KeywordsORM are denormalized intentionally as they are part of the # lookup for a single result and querying a result will not often request the keywords (LazyReference) keywords = db.LazyReferenceField(KeywordsORM) # output related properties = db.DynamicField() # accept any, no validation return_result = db.DynamicField() # better performance than db.ListField(db.FloatField()) provenance = db.DynamicField() # or an Embedded Documents with a structure? schema_name = db.StringField() # default="qc_ret_data_output"?? schema_version = db.IntField() # or String? meta = { 'collection': 'result', 'indexes': [ { 'fields': ('program', 'driver', 'method', 'basis', 'molecule', 'keywords'), 'unique': True }, ] }
class OptimizationProcedureORM(ProcedureORM): """ An Optimization procedure. """ procedure = db.StringField(default='optimization', required=True) initial_molecule = db.LazyReferenceField(MoleculeORM) final_molecule = db.LazyReferenceField(MoleculeORM)
class Training(me.Document): meta = { 'indexes': [[('text_id', 1), ('user_id', 1)]], 'cascade': True } text_id = me.LazyReferenceField('Text', required=True) user_id = me.LazyReferenceField('User', required=True) created_at = me.DateTimeField(default=datetime.now(), required=True) document = me.EmbeddedDocumentField(SpacyDocument, required=True)
class SampleGoat(SampleSpecies): # try to model relationship between samples father_id = mongoengine.LazyReferenceField( 'SampleGoat', passthrough=True, reverse_delete_rule=mongoengine.NULLIFY) mother_id = mongoengine.LazyReferenceField( 'SampleGoat', passthrough=True, reverse_delete_rule=mongoengine.NULLIFY) meta = {'db_alias': DB_ALIAS, 'collection': 'sampleGoat'}
class Order(mongoengine.Document): """ 订单类数据库模型: amount: 订单总金额 - float goods: 购买商品列表 - List[CacheedRef] status: 当前状态JSON字串 - str instance: 订单状态管理器的 pickle 对象 - bytes """ amount = mongoengine.FloatField(min_value=0, required=True) goods = mongoengine.ListField(mongoengine.LazyReferenceField(stock.Stock)) status = mongoengine.StringField(default=str) instance = mongoengine.BinaryField(default=bytes)
class Editor(mongoengine.Document): """ An Editor of a publication. """ meta = {'collection': 'test_editor'} id = mongoengine.StringField(primary_key=True) first_name = mongoengine.StringField(required=True, help_text="Editor's first name.", db_field='fname') last_name = mongoengine.StringField(required=True, help_text="Editor's last name.") metadata = mongoengine.MapField(field=mongoengine.StringField(), help_text="Arbitrary metadata.") company = mongoengine.LazyReferenceField(Publisher) avatar = mongoengine.FileField() seq = mongoengine.SequenceField()
class AccessPoint(mongoengine.Document): """ 权限访问点的数据库模型: pointname: 权限点名称(e.g. leaf.plugins.wxtoken.get) required: 需求的最小权限值 strict: 是否要求仅仅指定权限值的用户可访问 description: 当前权限点的描述 exceptions: 针对某些用户的特例 """ pointname = mongoengine.StringField(primary_key=True) required = mongoengine.IntField(required=True) strict = mongoengine.BooleanField(default=False) description = mongoengine.StringField(default=str) exceptions = mongoengine.ListField( field=mongoengine.LazyReferenceField(User), default=list)
class User(me.Document): email = me.EmailField(unique=True, required=True) name = me.StringField(required=True) password = me.StringField(required=True) roles = me.ListField(me.StringField(), required=True, default=[Role.USER.value]) plain_password = me.StringField(default=None) trainings = me.ListField(me.LazyReferenceField(Training)) @classmethod def pre_save(cls, sender, document, **kwargs): if document.plain_password is not None: document.password = generate_password_hash(document.plain_password) document.plain_password = None def password_matches(self, plain_password): return check_password_hash(self.password, plain_password)
class Authentication(mongoengine.Document): """ 身份验证文档模型: user: 被建立登陆方式的用户id index: 用户索引(账户名-主键) salt: 用户密码盐 token: 用户密码加盐之后的哈希值 status: 验证方式是否可用 description: 身份验证方式描述 """ index = mongoengine.StringField(primary_key=True) user = mongoengine.LazyReferenceField( User, reverse_delete_rule=mongoengine.CASCADE) salt = mongoengine.StringField(required=True) token = mongoengine.StringField(required=True) status = mongoengine.BooleanField(default=True) description = mongoengine.StringField(default=str)
class ServiceQueueORM(CustomDynamicDocument): status = db.StringField(default='WAITING', choices=['RUNNING', 'WAITING', 'ERROR', 'COMPLETE']) tag = db.StringField(default=None) hash_index = db.StringField(required=True) procedure_id = db.LazyReferenceField(ProcedureORM) # created_on = db.DateTimeField(required=True) # modified_on = db.DateTimeField(required=True) meta = { 'collection': 'service_queue', 'indexes': [ 'status', { 'fields': ("status", "tag", "hash_index"), 'unique': False }, # {'fields': ('procedure',), 'unique': True} ] }
class Doc(me.Document): id = me.StringField(primary_key=True, default='main') ref = me.LazyReferenceField(ReferenceDoc)
class Text(me.Document): value = me.StringField(unique=True, required=True) created_at = me.DateTimeField(default=datetime.now(), required=True) # This is a mapping between user_id and document trainings = me.ListField(me.LazyReferenceField('Training'))