class User(Model): __tablename__ = "users" __database__ = db __metadata__ = metadata id = Integer(primary_key=True) name = String(max_length=100) email = String(max_length=100)
class Feedback(Table): _name = 'seat' _schema = [ Column('id', Integer, primary_key=True), Column('row', String(255)), Column('number', String(10000)), Column('users', ForeignKey('users')), ]
class Seat(Table): _name = 'seat' _schema = [ Column('id', Integer, primary_key=True), Column('row', String(255)), Column('number', String(10000)), Column('users', ForeignKey('users')), Column('i_need_help', Boolean(), default=False), ]
class AbsenceMeta(Table): _name = 'absence_meta' _schema = [ Column('id', Integer, primary_key=True), Column('row', String(255)), Column('code', String(10)), Column('active', Boolean(), default=True), Column('users', ForeignKey('users')), ]
class Feedback(Table): _name = 'feedback' _schema = [ Column('lesson_review', String(10000)), Column('teacher_review', String(10000)), Column('material', Integer()), Column('teacher', ForeignKey('users')), Column('users', ForeignKey('users')), ]
class Item(Model): """Representation of an Item, this is a Database Object.""" __tablename__ = "item" __database__ = Database.database __metadata__ = Database.metadata __table_args__ = (UniqueConstraint('owner', 'item_id'),) id: int = Integer(primary_key=True, index=True) item_id: str = String(max_length=4) name: str = String(max_length=50) owner: Player = ForeignKey(Player) value: int = Integer() _rarity: int = Integer() _item_type: int = Integer() @property def embed_field(self) -> dict[str, str]: """Get a embed field that represents the Item""" return { "name": f"`{self.item_id}` | {self.rarity.emoji} {self.name}", "value": f"Value: {self.value} - Type: {self.item_type.name}" } @property async def embed(self) -> Embed: """Get a Embed that represents the Item""" embed = Embed(title=f"{self.rarity.emoji} {self.name}", colour=self.rarity.colour) embed.add_field(name="Item ID", value=f"`{self.item_id}`") embed.add_field(name="Value", value=str(self.value)) bot = ArenaBot.instance owner = bot.get_user(self.owner.id) if owner is None: owner = await bot.fetch_user(self.owner.id) embed.set_author(name=owner.display_name, icon_url=owner.avatar_url) return embed @property def rarity(self) -> Rarity: """Get the rarity of the item.""" return Rarity(self._rarity) @rarity.setter def rarity(self, value: Rarity) -> None: self._rarity = value.value @property def item_type(self) -> ItemType: """Get the type of the item.""" return ItemType(self._item_type) @item_type.setter def item_type(self, value: ItemType) -> None: self._item_type = value.value
class Comment(Model): __table__ = 'comments' id = String(primary_key=True, default=next_id) blog_id = String() user_id = String() user_name = String() user_image = String(column_type='varchar(500)') content = Text() created_at = Float(default=time.time)
class Question(Table): _name = 'question' _schema = [ Column('id', Integer, primary_key=True), Column('question', String(1000)), Column('answares', CodeString(2000), default=''), Column('possible_answare', String(1000), default=''), Column('qtype', String(50), default='plain'), Column('img', String(255), required=False, default=''), Column('users', ForeignKey('users'), default=DEFAULT_USER), Column('time_created', DateTime(), default=datetime.utcnow), ]
class Lesson(Table): _name = 'lesson' _schema = [ Column('id', Integer, primary_key=True), Column('title', String(255)), Column('description', String(10000)), Column('author', ForeignKey('users'), default=1), Column('file', String(255), required=False), Column('time_created', DateTime(), default=datetime.utcnow), Column('active', Boolean(), default=False), Column('quiz', ForeignKey('quiz'), required=False), Column('live_quiz', ForeignKey('live_quiz'), required=False), ]
class User(Model): def __init__(self, **kw): super(User, self).__init__(**kw) __table__ = 'users' id = String(primary_key=True, default=next_id) email = String() password = String() admin = Bool(default=False) name = String() image = String(column_type='varchar(500)') created_at = Float(default=time.time)
class EventUsers(Table): _name = 'event_users' _soft_restricted_keys = ['score', 'notes'] _schema = [ Column('event', ForeignKey('event')), Column('users', ForeignKey('users')), Column('confirmation', String(10), default='noans'), Column('accepted', Boolean(), default=False), Column('bring_power_cord', Boolean(), default=False), Column('attend_weekly', Boolean(), default=False), Column('notes', String(5000), default=''), Column('score', Float(), default=0, required=False), Column('i_helped', Boolean(), default=False), Column('helped', String(5000), required=False), ]
class LessonFeedbackQuestion(Table): _name = 'lesson_feedback_question' _schema = [ Column('id', Integer, primary_key=True), Column('author', ForeignKey('users'), default=DEFAULT_USER), Column('type', String(50)), Column('description', String(5000)), Column('answers', CodeString(10000)) ] @classmethod async def get_by_lesson_id(cls, lid): return await cls.get_by_join("lesson_feedback_meta", lesson=lid, id=StringLiteral("question"))
class Feedback(Table): _name = 'feedback' _schema = [ Column('lesson_review', String(10000)), Column('teacher_review', String(10000)), Column('material', Integer()), Column('teacher', ForeignKey('users')), Column('users', ForeignKey('users')), # O tym czy dobrze było zorganizowane # Czy polecilbys nasze warsztaty znajomym # Czy moglibyśmy lepiej się reklamować # Czy jakieś zagadnienia były za mało poruszone Albo za dużo # Czego brakowało # https://docs.google.com/forms/d/e/1FAIpQLSctlgSwoKQoB_3Hc5bfu3RYLbz0TNKQmg23jnc8MJ3wwRJn7g/viewform ]
class LessonFeedback(Table): _name = 'lesson_feedback' _schema = [ Column('users', ForeignKey('users')), Column('lesson', ForeignKey('lesson')), Column('feedback', String(5000)), ]
class LessonStatus(Table): _name = 'lesson_status' _schema = [ Column('lesson', ForeignKey('lesson')), Column('users', ForeignKey('users')), Column('status', String(20)), ]
class ExerciseStatus(Table): _name = 'exercise_status' _schema = [ Column('exercise', ForeignKey('exercise')), Column('users', ForeignKey('users')), Column('status', String(20)), ]
class EventSponsor(Table): _name = 'event_sponsor' _schema = [ Column('order_number', Integer()), Column('event', ForeignKey('event')), Column('sponsor', ForeignKey('sponsor')), Column('rank', String(255)), ]
class ExerciseAnsware(Table): _name = 'lesson_status' _schema = [ Column('exercise', ForeignKey('exercise')), Column('users', ForeignKey('users')), Column('answare', CodeString(5000)), Column('status', String(20)), ]
class Sponsor(Table): _name = 'sponsor' _schema = [ Column('id', Integer(), primary_key=True), Column('name', String(255)), Column('description', String(5000)), Column('logo', String(255), required=False, default=''), Column('webpage', String(255), required=False, default=''), Column('linkedin', String(255), required=False), Column('twitter', String(255), required=False), Column('facebook', String(255), required=False), Column('city', String(255), required=False), Column('country', String(255), required=False), ]
class ExerciseAnsware(Table): _name = 'exercise_answare' _schema = [ Column('exercise', ForeignKey('exercise')), Column('users', ForeignKey('users')), Column('answare', CodeString(5000)), Column('first_answare', CodeString(5000), default=""), Column('status', String(20)), ]
def _schema(cls): return [ Column('users', ForeignKey('users')), Column(cls._fk_col, ForeignKey(cls._fk_col)), Column('progress', Integer(), default=0), Column('score', Integer(), default=-1), Column('comment', CodeString(1000), required=False, default=''), Column('status', String(50), default='NotStarted'), ]
class Quiz(Table): _name = 'quiz' _schema = [ Column('id', Integer, primary_key=True), Column('title', String(255)), Column('description', String(10000)), Column('users', ForeignKey('users'), default=1), Column('time_created', DateTime(), default=datetime.utcnow), ] async def get_question(self, question_order=0): if question_order + 1 >= await self.get_question_amount(): return {'last': True, 'msg': 'That was last question in the quiz.'} qq = await QuizQuestions.get_first_by_many_field_value( quiz=self.id, question_order=question_order) return await Question.get_by_id(qq.question) async def get_question_amount(self): return len(await QuizQuestions.get_by_field_value('quiz', self.id))
class AbsenceMeta(Table): _name = 'absence_meta' _schema = [ Column('id', Integer, primary_key=True), Column('lesson', ForeignKey('lesson')), Column('code', String(10)), Column('active', Boolean(), default=True), Column('users', ForeignKey('users')), Column('time_created', DateTime(), default=datetime.utcnow), Column('time_ended', DateTime()), ]
class Exercise(Table): _name = 'exercise' _schema = [ Column('id', Integer, primary_key=True), Column('title', String(255)), Column('task', CodeString(10000)), Column('possible_answare', CodeString(1000), required=False), Column('author', ForeignKey('users'), default=1), Column('time_created', DateTime(), default=datetime.utcnow), Column('lesson', ForeignKey('lesson')), ]
class Blog(Model): __table__ = 'blog' id = String(primary_key=True, default=next_id) user_id = String() user_name = String() user_image = String(column_type='varchar(500)') name = String() summary = String(column_type='varchar(200)') content = Text() created_at = Float(default=time.time)
class Event(Table): _name = 'event' _schema = [ Column('id', Integer(), primary_key=True), Column('title', String(500), unique=True), Column('description', String(1000)), Column('country', String(255)), Column('city', String(255)), Column('geo_location_lang', Float()), Column('geo_location_long', Float()), Column('address', String(500)), Column('address_picture', String(500)), Column('address_desc', String(500)), Column('create_date', DateTime(), default=datetime.utcnow), Column('start_date', DateTime(), default=datetime.utcnow), Column('end_date', DateTime(), default=datetime.utcnow), Column('registration_start_date', DateTime(), default=datetime.utcnow), Column('registration_end_date', DateTime(), default=datetime.utcnow), Column('reg_active', Boolean(), default=True), Column('event_active', Boolean(), default=True), ]
class User(Model): __table__ = 'users' name = String(primary_key=True, length=20) password = String(length=20)
class Friend(Model): __table__ = 'friends' # userA and userB store user's name userA = String(length=20, primary_key=True) userB = String(length=20)
class Users(Table): _restricted_keys = ['session_uuid', 'password'] _soft_restricted_keys = ['score', 'notes'] _name = 'users' _schema = [ Column('id', Integer(), primary_key=True), Column('email', String(255), unique=True), Column('name', String(255)), Column('surname', String(255)), Column('password', String(1000)), Column('create_date', DateTime(), default=datetime.utcnow), Column('last_login', DateTime(), default=datetime.utcnow), Column('mentor', Boolean(), default=False), Column('organiser', Boolean(), default=False), Column('admin', Boolean(), default=False), Column('session_uuid', String(255), required=False), Column('img', String(255), required=False, default=''), Column('linkedin', String(255), required=False), Column('twitter', String(255), required=False), Column('facebook', String(255), required=False), Column('city', String(255), required=False), Column('education', String(255), required=False), Column('university', String(255), required=False), Column('t_shirt', String(10), required=False), Column('lang', String(20), required=False, default='pl'), Column('age', Integer(), required=False, default=99), Column('python', Boolean(), default=False), Column('operating_system', String(10), required=False), Column('description', String(5000), required=False), Column('motivation', String(5000), required=False), Column('what_can_you_bring', String(5000), required=False), Column('experience', String(5000), required=False), Column('app_idea', String(5000), required=False), Column('pyfunction', String(255), required=False), Column('confirmation', String(10), default='noans'), Column('active', Boolean(), default=False), Column('accepted_rules', Boolean(), default=False), Column('accepted', Boolean(), default=False), Column('bring_power_cord', Boolean(), default=False), Column('attend_weekly', Boolean(), default=False), Column('i_needed_help', Integer(), default=0), Column('notes', String(5000), default=''), Column('score', Float(), default=0, required=False), Column('i_helped', Boolean(), default=False), Column('helped', String(5000), required=False), ] _banned_user_keys = [ 'i_needed_help', 'accepted_rules', ] _public_keys = _banned_user_keys + [ 'education', 'university', 't_shirt', 'operating_system', 'motivation', 'experience', 'app_idea', 'accepted', 'confirmation', 'i_helped', 'helped', ] async def create(self): self.password = hash_string(self.password) return await super().create() async def set_password(self, password): self.password = hash_string(password) @classmethod async def get_user_by_session_uuid(cls, session_uuid): try: return await cls.get_first('session_uuid', session_uuid) except DoesNotExist: return None async def get_public_data(self): data = await self.to_dict() data = safe_del_key(data, self._public_keys) return data async def get_my_user_data(self): data = await self.to_dict() data = safe_del_key(data, self._banned_user_keys) return data
class Users(Table): _restricted_keys = ['session_uuid', 'password', 'magic_string', 'magic_string_date'] _soft_restricted_keys = ['score', 'notes'] _name = 'users' _schema = [ Column('id', Integer(), primary_key=True), Column('email', String(255), unique=True), Column('name', String(255)), Column('surname', String(255)), Column('password', String(1000)), Column('magic_string', String(50), default='', required=False), Column('create_date', DateTime(), default=datetime.utcnow), Column('last_login', DateTime(), default=datetime.utcnow), Column('magic_string_date', DateTime(), default=datetime.utcnow), Column('mentor', Boolean(), default=False), Column('organiser', Boolean(), default=False), Column('admin', Boolean(), default=False), Column('session_uuid', String(255), required=False), Column('img', String(255), required=False, default=''), Column('linkedin', String(255), required=False), Column('twitter', String(255), required=False), Column('facebook', String(255), required=False), Column('city', String(255), required=False), Column('education', String(255), required=False), Column('university', String(255), required=False), Column('t_shirt', String(10), required=False), Column('lang', String(20), required=False, default='pl'), Column('age', Integer(), required=False, default=99), Column('python', Boolean(), default=False), Column('operating_system', String(10), required=False), Column('description', String(5000), required=False), Column('motivation', String(5000), required=False), Column('what_can_you_bring', String(5000), required=False), Column('experience', String(5000), required=False), Column('app_idea', String(5000), required=False), Column('pyfunction', String(255), required=False), Column('confirmation', String(10), default='noans'), Column('active', Boolean(), default=False), Column('accepted_rules', Boolean(), default=False), Column('accepted', Boolean(), default=False), Column('bring_power_cord', Boolean(), default=False), Column('attend_weekly', Boolean(), default=False), Column('i_needed_help', Integer(), default=0), Column('notes', String(5000), default=''), Column('score', Float(), default=0, required=False), Column('i_helped', Boolean(), default=False), Column('helped', String(5000), required=False), Column('gdpr', Boolean(), default=False), ] _banned_user_keys = [ 'i_needed_help', 'accepted_rules', ] _public_keys = _banned_user_keys + [ 'education', 'university', 't_shirt', 'operating_system', 'motivation', 'experience', 'app_idea', 'accepted', 'confirmation', 'i_helped', 'helped', ] async def create(self): self.password = hash_string(self.password) return await super().create() @staticmethod async def validate_password(new_password): if len(new_password) < 8: return {"success": False, "msg": "Password needs to be at least 8 characters long"} if new_password == new_password.lower() or new_password == new_password.upper(): return { "success": False, "msg": "Password needs to contain at least one small and one capital letter" } if not any([a for a in new_password if a.isnumeric()]): return { "success": False, "msg": "Password needs to contain at least one number" } if not any([a for a in new_password if not a.isalnum()]): return { "success": False, "msg": "Password needs to contain at least one small non alpha-numeric character like !, ? or *" } return {"success": True} async def set_password(self, password): self.password = hash_string(password) async def set_magic_string(self): self.magic_string = create_uuid() self.magic_string_date = datetime.utcnow() @classmethod async def get_user_by_session_uuid(cls, session_uuid): try: return await cls.get_first('session_uuid', session_uuid) except DoesNotExist: return None async def get_public_data(self): data = await self.to_dict() data = safe_del_key(data, self._public_keys) return data async def get_my_user_data(self): data = await self.to_dict() data = safe_del_key(data, self._banned_user_keys) return data async def update(self, **kwargs): if not self.magic_string_date: self.magic_string_date = datetime.utcnow() return await super().update(**kwargs) def is_only_attendee(self): return not (self.admin or self.mentor or self.organiser)