class CarbonFormAnswersModel(db.Document): meta = { "collection": "carbonFormAnswers", "indexes": [{"fields": ["workshop", "participant"], "unique": True}], } carbonFormAnswersId = db.StringField(primary_key=True, default=generate_id) workshop = db.LazyReferenceField( WorkshopModel, required=True, db_field="workshopId" ) participant = db.LazyReferenceField( UserModel, required=True, db_field="participantId" ) answers = db.DictField(required=True) createdAt = db.DateTimeField(default=datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.utcnow) @classmethod def find_by_workshop_id_and_participant_id( cls, workshop_id: str, participant_id: str ) -> CarbonFormAnswersModel: try: carbon_form_answers = cls.objects.get( workshop=workshop_id, participant=participant_id ) except db.DoesNotExist: carbon_form_answers = None return carbon_form_answers @classmethod def find_all_by_workshop_id(cls, workshop_id: str) -> QuerySet: return cls.objects(workshop=workshop_id).all()
class WorkshopModel(db.Document): """ This is an abstract class. Please inherit from it if you want to create a new type of workshop """ meta = {"collection": "workshops"} workshopId = db.StringField(primary_key=True, default=generate_id) name = db.StringField(required=True, max_length=128, min_length=1, default="Atelier CAPLC") createdAt = db.DateTimeField(default=datetime.datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.datetime.utcnow) startAt = db.DateTimeField(required=True) creatorId = db.StringField(required=True) coachId = db.StringField(required=True) eventUrl = db.StringField(default="caplc.com") city = db.StringField(max_length=128, min_length=1) address = db.StringField(max_length=512) participants = db.ListField( db.EmbeddedDocumentField(WorkshopParticipantModel), default=[]) model = db.ReferenceField(Model, db_field="modelId") def __repr__(self): return ( f"<Workshop {self.workshopId} | {self.name} " f"- animated by {self.coachId} at {self.city} on {self.startAt} " f"- with {len(self.participants)} participants>") @classmethod def find_by_id(cls, workshop_id: str) -> WorkshopModel: try: workshop = cls.objects.get(workshopId=workshop_id) except db.DoesNotExist: workshop = None return workshop @classmethod def find_by_coach_id(cls, coach_id: str) -> WorkshopModel: try: workshops = cls.objects(coachId=coach_id) except db.DoesNotExist: workshops = [] return workshops def get_participant_ids(self) -> list: return [p.user.id for p in self.participants] def get_workshop_participant(self, participant_id: str): for workshop_participant in self.participants: if workshop_participant.user.id == participant_id: return workshop_participant return None
class ActionCardModel(db.Document): meta = {"collection": "actionCards"} actionCardId = db.StringField(primary_key=True, default=generate_id) cardNumber = db.IntField(required=True, min_value=0) name = db.StringField(required=True) category = db.StringField(required=True) type = db.StringField(required=True) key = db.StringField(required=True) sector = db.StringField(required=True) cost = db.IntField(required=True, min_value=0) createdAt = db.DateTimeField(default=datetime.datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.datetime.utcnow) @classmethod def find_all(cls): return cls.objects().order_by("number")
class BlacklistTokenModel(db.Document): meta = {"collection": "blacklistedTokens"} token = db.StringField(required=True) blacklistedOn = db.DateTimeField(default=datetime.datetime.utcnow) @classmethod def is_jti_blacklisted(cls, jti: str) -> bool: try: query = cls.objects.get(token=jti) except db.DoesNotExist: query = None return query is not None
class ColumnZone(Base): meta = { 'increase_key': False, 'collection': 'column_zone', 'ordering': ['-created_at'], 'strict': True, 'id_field': '_id' } _id = db.StringField() name = db.StringField(min_value=2, max_value=50, required=True, unique=True) # 空间标识 title = db.StringField(min_value=2, max_value=50) # 空间名称 user_id = db.IntField(default=0) width = db.IntField(default=0) # 图片宽 height = db.IntField(default=0) # 图片高 kind = db.IntField(default=1) # 类型:1.PC;2.备选;3.-- status = db.IntField(default=1) deleted = db.IntField(default=0) remark = db.StringField() # 备注 created_at = db.DateTimeField() updated_at = db.DateTimeField(default=datetime.datetime.now) # 标记删除 def mark_delete(self): ok = super(ColumnZone, self).update(deleted=1) return ok # 标记恢复 def mark_recovery(self): ok = super(ColumnZone, self).update(deleted=0) return ok def __unicode__(self): return self.name
class ActionCardBatchModel(db.Document): meta = {"collection": "actionCardBatches"} actionCardBatchId = db.StringField(primary_key=True, default=generate_id) coachId = db.StringField() name = db.StringField(required=True) actionCardIds = db.ListField(db.StringField(), required=True) type = db.StringField(required=True) default = db.BooleanField() createdAt = db.DateTimeField(default=datetime.datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.datetime.utcnow) @classmethod def get_default_batches(cls): return cls.objects(default=True).all() @classmethod def find_default_batches(cls): return cls.objects(default=True).all() @classmethod def find_action_card_batches_by_coach(cls, coach_id): return cls.objects(coachId=coach_id).all()
class Model(db.Document): meta = {"collection": "models"} modelId = db.StringField(primary_key=True, default=generate_id) footprintStructure = db.DictField(required=True) globalCarbonVariables = db.DictField(required=True) variableFormulas = db.DictField(required=True) createdAt = db.DateTimeField(default=datetime.datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.datetime.utcnow) @classmethod def find_last_created_model(cls) -> Model: model = cls.objects.order_by("-createdAt").first() if model is None: raise DoesNotExist("No model in DB") return model @classmethod def find_by_id(cls, model_id: str) -> Model: try: model = cls.objects.get(modelId=model_id) except db.DoesNotExist: model = None return model
class Picture(db.Document): openid = db.StringField(max_length=255, verbose_name='小程序使用者的id') url = db.StringField(max_length=512, required=True, verbose_name='图url', unique=True) # 本地也保存的时候用,我们这里姑且保存一下吧 image = db.ImageField(verbose_name='图片') origin_image_id = db.StringField(max_length=64, verbose_name='如果这张图是双眼皮,那这就保存双眼皮的原图') img_md5 = db.StringField(max_length=128, verbose_name='图片的md5唯一码,不要重复上传') img_type = db.StringField(max_length=64, verbose_name='图片type') create_time = db.DateTimeField(default=datetime.datetime.now, verbose_name='创建时间') def __unicode__(self): return self.img_name
class User(db.Document): username = db.StringField(max_length=255, verbose_name='用户名称', required=True, unique=True) _password = db.StringField(max_length=255, verbose_name='用户密码') active = db.BooleanField(default=True, verbose_name='当前账户是否激活') create_time = db.DateTimeField(default=datetime.datetime.now, verbose_name='创建时间') roles = db.ListField(db.ReferenceField(Role), default=[]) # 给这个用户增加角色 def add_role(self, role_names: list): for role_name in role_names: role = Role.objects(name=role_name).first() if not role: role = Role(name=role_name) role.save() self.roles.append(role) self.roles = list(set(self.roles)) @staticmethod def register(username, password): new_user = User(username=username, _password=generate_password_hash(password)) new_user.save() return new_user @property def password(self): return self._password @password.setter def password(self, passwd): self._password = generate_password_hash(passwd) def check_password(self, raw): return check_password_hash(self._password, raw) def __unicode__(self): return str(self.username)
class ShareModel(db.Document): adminId = db.ReferenceField(AdminModel, required=True) created_at = db.DateTimeField(default=datetime.datetime.utcnow, required=True) title = db.StringField(required=True) content = db.StringField(required=True) meta = { 'collection': 'share', 'indexes': ['-created_at'], 'ordering': ['-created_at'] } # 添加一个资源 @staticmethod def add_share(data): adminId = ObjectId(data['adminId']) title = data['title'] content = data['content'] share = ShareModel(adminId=adminId, title=title, content=content) share.save() # 修改一个资源 @staticmethod def put_share(id, data): id = ObjectId(id) adminId = ObjectId(data['adminId']) title = data['title'] content = data['content'] share = ShareModel.objects(id=id) share.update(adminId=adminId, title=title, content=content) # 删除一个资源 @staticmethod def delete_share(id): id = ObjectId(id) share = ShareModel.objects(id=id) share.delete()
class UserModel(db.Document): meta = {"collection": "users"} # User specific fields userId = db.StringField(primary_key=True, default=generate_id) firstName = db.StringField(required=True, max_length=64, min_length=1) lastName = db.StringField(required=True, max_length=64, min_length=1) email = db.StringField(required=True, max_length=256, unique=True) password = db.StringField() role = db.ListField(db.StringField(max_length=32), required=True) createdAt = db.DateTimeField(default=datetime.datetime.utcnow) updatedAt = db.DateTimeField(default=datetime.datetime.utcnow) # Coach specific fields city = db.StringField(max_length=256) workshopsCount = db.IntField() awarenessRaisedCount = db.IntField() # Participant specific fields workshopParticipations = db.ListField(db.StringField(), default=[]) def __str__(self): return f"User {self.userId} - {self.firstName} {self.lastName}" def __repr__(self): return f"<User {self.userId} - {self.firstName} {self.lastName}>" def allowed(self, access_level: Roles) -> bool: return (max([ACCESS_LEVEL[r] for r in self.role]) >= ACCESS_LEVEL[access_level.value]) def send_reset_password_mail(self) -> str: # Genereate temporary access token for password resetting token = create_access_token(identity=self.id) reset_url = "{url}/reset_password?access_token={token}".format( url=current_app.config["PREFERRED_URL_SCHEME"], token=token) print(token) send_reset_password_mail(self.email, reset_url=reset_url) return token @classmethod def find_by_id(cls, user_id: str) -> UserModel: try: user = cls.objects.get(userId=user_id) except db.DoesNotExist: user = None return user @classmethod def find_by_email(cls, email: str) -> UserModel: try: user = cls.objects.get(email=email) except db.DoesNotExist: user = None return user @classmethod def find_coach_by_id(cls, user_id: str) -> UserModel: try: user = cls.objects.get( userId=user_id, role__in=[Roles.ADMIN.value, Roles.COACH.value]) except db.DoesNotExist: user = None return user @classmethod def find_coach_by_email(cls, email: str) -> UserModel: try: user = cls.objects.get( email=email, role__in=[Roles.ADMIN.value, Roles.COACH.value]) except db.DoesNotExist: user = None return user @classmethod def find_participant_by_email(cls, email: str) -> UserModel: try: user = cls.objects.get(email=email, role__in=[Roles.PARTICIPANT.value]) except db.DoesNotExist: user = None return user @classmethod def find_all_coaches(cls) -> QuerySet: return cls.objects( role__in=[Roles.ADMIN.value, Roles.COACH.value]).all() def add_participant_role(self) -> None: """ To use when we want to update the role of the user to participant. Init data specific to the participant :return: """ self.role.append(Roles.PARTICIPANT.value) self.workshopParticipations = [] return
class Column(Base): meta = { 'increase_key': False, 'collection': 'column', 'ordering': ['-created_at'], 'strict': True, 'id_field': '_id' } _id = db.StringField() title = db.StringField(max_length=30) # 标题 sub_title = db.StringField(max_length=30) # 副标题 description = db.StringField() # 简述 target = db.StringField(max_length=1000) # 标记,用于链接跳转或其它 column_zone_id = db.StringField(default='') # 空间ID user_id = db.IntField(default=0) sort = db.IntField(default=0) # 排序 kind = db.IntField(default=1) # 类型:1.--;2.--;3.-- cover_id = db.StringField(default='') # 封面ID status = db.IntField(default=0) # 是否发布:0.否;1.是; deleted = db.IntField(default=0) remark = db.StringField() # 备注 created_at = db.DateTimeField() updated_at = db.DateTimeField(default=datetime.datetime.now) # 封面 def cover(self): if self.cover_id and len(self.cover_id) == 24: asset = Asset.objects(_id=ObjectId(self.cover_id)).first() if asset and asset.deleted == 0: return asset asset = Asset.objects(target_id=str(self._id), asset_type=7, deleted=0).first() if asset and asset.deleted == 0: return asset return None # 标记删除 def mark_delete(self): ok = super(Column, self).update(deleted=1) if ok: # 删除附件 assets = Asset.objects(target_id=str(self._id), asset_type=7, deleted=0) for item in assets: item.mark_delete() # 标记恢复 def mark_recovery(self): ok = super(Column, self).update(deleted=0) if ok: # 恢复附件 assets = Asset.objects(target_id=str(self._id), asset_type=7, deleted=1) for item in assets: item.update(deleted=0) def __unicode__(self): return self.title
class CommentModel(db.Document): userId = db.ReferenceField(UserModel, required=True) topicId = db.ReferenceField(TopicModel, required=True) created_at = db.DateTimeField(default=datetime.datetime.utcnow, required=True) content = db.StringField(required=True) meta = { 'collection': 'comment', 'indexes': ['-created_at'], 'ordering': ['-created_at'] } # 创建评论 @staticmethod def add_comment(data): userId = ObjectId(data['userId']) topicId = ObjectId(data['topicId']) content = data['content'] comment = CommentModel(userId=userId, topicId=topicId, content=content) comment.save() # 修改评论 @staticmethod def put_comment(data): id = ObjectId(data['id']) content = data['content'] comment = CommentModel.objects(id=id) comment.update(content=content) # 删除评论 @staticmethod def delete_comment(id): id = ObjectId(id) comment = CommentModel.objects(id=id) comment.delete() # 获取评论 @staticmethod def get_comment_list(data): topicId = ObjectId(data['topicId']) page = int(data['page']) size = int(data['size']) count = CommentModel.objects(topicId=topicId).count() comments = CommentModel.objects( topicId=topicId).order_by('-created_at').skip( (page - 1) * size).limit(size) list = [] for comment in comments: list.append({ 'id': str(comment['id']), 'created_at': comment['created_at'], 'userId': str(comment['userId']['id']), 'userName': str(comment['userId']['name']), 'schoolId': str(comment['userId']['schoolId']), 'avatar': str(comment['userId']['avatar']), 'className': str(comment['userId']['classId']['name']), 'content': comment['content'] }) res = { 'list': list, 'pagination': { 'count': count, 'size': size, 'page': page } } return res
class Client(db.Document): meta = {'collection': 'Client'} firstName = db.StringField(required=True) lastName = db.StringField(required=True) email = db.EmailField(required=True) creation = db.DateTimeField(required=True, default=datetime.now()) @staticmethod def findAll(): try: clients = Client.objects.all() results = [] for client in clients: data = {} data['id'] = str(client.id) data['firstName'] = client.firstName data['lastName'] = client.lastName data['email'] = client.email data['creation'] = client.creation.strftime('%d/%m/%Y') results.append(data) except Exception as error: client = None return results @staticmethod def findById(id): try: client = Client.objects.get(id=id) data = {} data['id'] = str(client.id) data['firstName'] = client.firstName data['lastName'] = client.lastName data['email'] = client.email data['creation'] = client.creation.strftime('%d/%m/%Y') except Exception as error: client = None return data @staticmethod def create(body): try: client = Client.from_json(json.dumps(body), True) client.save() except Exception as error: print(error) client = None return client @staticmethod def update(id, body): try: updated = {"count": 0} client = Client.objects().get(id=id) if body["firstName"]: client.firstName = body["firstName"] updated["firstName"] = "updated" updated["count"] += 1 if body["lastName"]: client.lastName = body["lastName"] updated["lastName"] = "lastName" updated["count"] += 1 if body["email"]: client.email = body["email"] updated["email"] = "email" updated["count"] += 1 client.save() except Exception as error: print(error) return updated @staticmethod def deleteClient(id): try: client = Client.objects().get(id=id) except Exception as error: client = None return client
class SignModel(db.Document): name = db.StringField(required=True) adminId = db.ReferenceField(AdminModel) classroomIds = db.ListField(db.ReferenceField(ClassModel)) signUsers = db.ListField(db.ReferenceField('UserModel'), default=[]) token = db.StringField(required=True) created_at = db.DateTimeField(default=datetime.datetime.utcnow, required=True) meta = { 'collection': 'sign', 'indexes': ['-created_at'], 'ordering': ['-created_at'], 'strict': False } # 保存签到表到数据库 @staticmethod def add_sign(data): name = data['name'] adminId = ObjectId(data['adminId']) classroomIds = [] for cls in data['classroomIds'].split('|'): classroomIds.append(ObjectId(cls)) token = data['token'] sign = SignModel(name=name, adminId=adminId, classroomIds=classroomIds, token=token) sign.save() return str(sign['id']) # 学生签到 @staticmethod def user_sign(token, userId): userId = ObjectId(userId) sign = SignModel.objects(token=token) sign.update_one(add_to_set__signUsers=userId) # 老师帮学生签到 @staticmethod def super_user_sign(signId, signUsers): signId = ObjectId(signId) sign = SignModel.objects(id=signId) sign.update_one(add_to_set__signUsers=signUsers) # 老师手动删除签到 @staticmethod def super_delete_user_sign(signId, signUsers): signId = ObjectId(signId) sign = SignModel.objects(id=signId) sign.update_one(pull_all__signUsers=signUsers) # 获取签到表列表 @staticmethod def get_sign_list(page, size, classId): if classId is not None: classId = ObjectId(classId) cls = ClassModel.objects(id=classId).first() if cls: clss = SignModel.objects( classroomIds__in=[classId]).order_by('-created_at').skip( (page - 1) * size).limit(size) count = SignModel.objects(classroomIds__in=[classId]).count() else: clss = [] count = 0 else: clss = SignModel.objects().order_by('-created_at').skip( (page - 1) * size).limit(size) count = SignModel.objects().count() data = [] for cls in clss: classrooms = [] for room in cls['classroomIds']: classrooms.append({ 'id': str(room['id']), 'name': room['name'], 'stuNum': room['stuNum'] }) data.append({ 'id': str(cls['id']), 'name': cls['name'], 'adminName': cls['adminId']['name'], 'classrooms': classrooms, 'created_at': cls['created_at'] }) res = { 'pagination': { 'count': count, 'size': size, 'page': page }, 'list': data } return res # 删除签到表 @staticmethod def delete_sign(signId): signId = ObjectId(signId) sign = SignModel.objects(id=signId) sign.delete()
class Brand(Base): meta = { 'increase_key': True, 'collection': 'brand', 'ordering': ['-created_at'], 'strict': True, 'id_field': '_id' } _id = db.IntField(primary_key=True, required=True) name = db.StringField(min_value=2, max_value=30, required=True, unique=True) # 品牌名称 description = db.StringField() user_id = db.IntField(default=0) kind = db.IntField(default=1) # 类型:1.--;2.--;3.-- cover_id = db.StringField() # 封面ID status = db.IntField(default=1) deleted = db.IntField(default=0) remark = db.StringField() created_at = db.DateTimeField() updated_at = db.DateTimeField(default=datetime.datetime.now) # 封面 def cover(self): if self.cover_id and len(self.cover_id) == 12: asset = Asset.objects(_id=ObjectId(self.cover_id)).first() if asset and asset.deleted == 0: return asset asset = Asset.objects(target_id=str(self._id), asset_type=5, deleted=0).first() if asset and asset.deleted == 0: return asset return None # 标记删除 def mark_delete(self): ok = super(Brand, self).update(deleted=1) if ok: # 删除附件 assets = Asset.objects(target_id=str(self._id), asset_type=5, deleted=0) for item in assets: item.mark_delete() # 标记恢复 def mark_recovery(self): ok = super(Brand, self).update(deleted=0) if ok: # 恢复附件 assets = Asset.objects(target_id=str(self._id), asset_type=5, deleted=1) for item in assets: item.update(deleted=0) def __unicode__(self): return self.name
class Category(Base): meta = { 'increase_key': True, 'collection': 'category', 'ordering': ['-created_at'], 'strict': True, 'id_field': '_id' } _id = db.IntField(primary_key=True, required=True) mark = db.StringField(max_length=20) name = db.StringField(max_length=30, required=True, unique=True) user_id = db.IntField(required=True) kind = db.IntField(default=1) # 类型:1.文档;2.素材;3.-- pid = db.IntField(default=0) cid = db.IntField(default=0) sort = db.IntField(default=0) # 排序 status = db.IntField(default=0) deleted = db.IntField(default=0) remark = db.StringField() created_at = db.DateTimeField() updated_at = db.DateTimeField(default=datetime.datetime.now) def mark_delete(self): return super(Category, self).update(deleted=1) def __unicode__(self): return self.name @classmethod def category_kind_options(self, kind=0): data = [{ 'id': 1, 'name': '文档' }, { 'id': 2, 'name': '素材' }, { 'id': 3, 'name': '未定义2' }] if kind == 0: return data else: for d in data: if d['id'] == kind: return d return {'id': 0, 'name': ''} # 获取父级 @classmethod def fetch_parent_options(self, kind=0): query = {} if kind != 0: query['kind'] = int(kind) query['pid'] = 0 data = Category.objects( **query).order_by('-created_at').order_by('-sort').limit(50) # 过滤数据 for i, d in enumerate(data): kind_label = '--' if d.kind == 1: kind_label = '文档' if d.kind == 2: kind_label = '备用' data[i].kind_label = kind_label return data def list(self, kind=0, **kwargs): query = {} if kind != 0: query['kind'] = int(kind) catetories = Category.objects(**query) return catetories