class MoodleCourse(db.Document): serial_id = db.SequenceField() moodle_id = db.IntField(unique=True) short_name = db.StringField(default='') full_name = db.StringField(default='') display_name = db.StringField(default='') summary = db.StringField(default='') enrolled_user_count = db.IntField(default=0) visible = db.BooleanField(default=False) format = db.StringField(default='') grade_max = db.IntField() show_grades = db.BooleanField(default=False) start_date = db.IntField(default=0) cover = db.StringField(default='') forum_list = db.ListField(db.ReferenceField('MoodleForum'), default=[]) forum_count = db.IntField(default=0) def get_info(self): return self.to_json() def update_course(self, course_info): self.short_name = course_info.get('short_name') self.full_name = course_info.get('full_name') self.display_name = course_info.get('display_name') self.summary = course_info.get('summary') self.enrolled_user_count = course_info.get('enrolled_user_count') self.visible = course_info.get('visible') self.format = course_info.get('format') self.show_grades = course_info.get('show_grades') self.start_date = course_info.get('start_date') self.cover = course_info.get('cover') print('Update moodle course #{}: {}'.format(self.serial_id, self.short_name)) return self
class StepicUserStep(db.EmbeddedDocument): score = db.IntField(default=0) is_passed = db.BooleanField(default=False) is_passed_on_comment = db.BooleanField(default=False) total_submissions = db.IntField(default=0) submissions_on_comment = db.IntField(default=0) def get_info(self): return self.to_json() def update_user_step(self, step_grades): self.score = step_grades.get('score') self.is_passed = step_grades.get('is_passed') self.total_submissions = step_grades.get('total_submissions') return self
class MoodleTag(db.Document): serial_id = db.SequenceField() moodle_id = db.IntField(unique=True) tag_id = db.IntField() is_standard = db.BooleanField(default=False) display_name = db.StringField(default='') def get_info(self): return self.to_json()
class Clan(db.Document): serial_id = db.SequenceField() clan_id = db.IntField(unique=True) accepts_join_requests = db.BooleanField() color = db.StringField() created_at = db.IntField() description = db.StringField() description_html = db.StringField() members_count = db.IntField() motto = db.StringField() name = db.StringField() tag = db.StringField() updated_at = db.IntField() # emblem = db.StringField() - много ссылок на эмблемы разных размеров # online_members = db.ListField(db.IntField()) - вообще не приходит это поле # clan_treasury - казна клана (credits, crystal, gold) - приходит только gold, а в crystal - null def get_info(self): return self.to_json()
class AccountPrivate(db.Document): serial_id = db.SequenceField() account_id = db.IntField(unique=True) ban_info = db.StringField() ban_time = db.IntField() bonds = db.IntField() gold = db.IntField() credits = db.IntField() free_xp = db.IntField() is_premium = db.BooleanField() premium_expires_at = db.IntField() # значение берется из account и показывает последнее обновление "приватных" полей (на случай прекращения действия токена) updated_at = db.IntField() def get_info(self): return self.to_json() def update_account_private(self, account_private_info): self.ban_info = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_BAN_INFO) self.ban_time = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_BAN_TIME) self.bonds = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_BONDS) self.gold = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_GOLD) self.credits = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_CREDITS) self.free_xp = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_FREE_XP) self.is_premium = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_IS_PREMIUM) self.premium_expires_at = account_private_info.get( WG_API_CONST().ACCOUNT_PRIVATE_PREMIUM_EXPIRES_AT) return self
class MoodlePost(db.Document): serial_id = db.SequenceField() moodle_id = db.IntField(unique=True) user = db.ReferenceField('MoodleUser') course = db.ReferenceField('MoodleCourse') forum = db.ReferenceField('MoodleForum') discussion = db.ReferenceField('MoodleDiscussion') subject = db.StringField(default='') reply_subject = db.StringField(default='') message = db.StringField(default='') has_parent = db.BooleanField(default=False) parent_post = db.ReferenceField('MoodlePost') time_created = db.IntField(default=0) view_url = db.StringField(default='') rating = db.IntField(default=0) rating_count = db.IntField(default=0) rating_label = db.StringField(default='') tag_list = db.ListField(db.ReferenceField('MoodleTag')) post_list = db.ListField(db.ReferenceField('MoodlePost'), default=[]) num_replies = db.IntField(required=True) status = db.StringField(required=True) progress = db.FloatField(required=True) def get_info(self): return self.to_json() def update_post(self, post_info): self.subject = post_info.get('subject') self.reply_subject = post_info.get('reply_subject') self.message = post_info.get('message') self.has_parent = post_info.get('has_parent') self.time_created = post_info.get('time_created') self.view_url = post_info.get('view_url') self.tag_list = [ MoodleTag.objects(moodle_id=tag_info.get('id')).modify( moodle_id=tag_info.get('id'), tag_id=tag_info.get('tagid'), is_standard=tag_info.get('isstandard'), display_name=tag_info.get('displayname'), upsert=True, new=True) for tag_info in post_info.get('tags')] self.status = self.status if self.status else 'new' # Иначе не работает фильтрация по дефолтному значению self.progress = 0 if not self.has_parent: self.discussion.modify( discussion_post=self, view_url=self.view_url, tag_list=self.tag_list, status=self.status, progress=self.progress) else: parent_post = MoodlePost.objects(moodle_id=post_info.get('parent_id')).first() if parent_post: if not self in parent_post.post_list: parent_post.post_list.append(self) else: parent_post = MoodlePost.objects(moodle_id=post_info.get('parent_id')).modify( post_list=[self], status='new', progress=0, upsert=True, new=True) self.parent_post = parent_post parent_post.num_replies = len(parent_post.post_list) parent_post.save() if post_info.get('rating'): self.rating = post_info.get('rating').get('rating') self.rating_count = post_info.get('rating').get('count') self.rating_label = post_info.get('rating').get('aggregatelabel') self.num_replies = self.num_replies if self.num_replies else 0 # Иначе не работает фильтрация по дефолтному значению print('Update moodle post #{}'.format(self.serial_id)) return self def update_post_status(self, status_info): self.status = status_info.get('post_status') if not self.has_parent: self.discussion.modify(status=self.status) return self def update_post_progress(self): self.progress = round((self.user.course_grade_dict[str(self.course.moodle_id)] / self.course.grade_max * 100), 2) if self.course.grade_max else 0 if not self.has_parent: self.discussion.modify(progress=self.progress) return self
class StepicComment(db.Document): serial_id = db.SequenceField() stepic_id = db.IntField(unique=True) parent_id = db.IntField() step_id = db.IntField() user = db.ReferenceField('StepicUser') course = db.ReferenceField('StepicCourse') user_role = db.StringField(default='') time = db.IntField(default=0) last_time = db.IntField(default=0) text = db.StringField(default='') # replies = db.ListField(db.ReferenceField('self')) reply_count = db.IntField(required=True) is_deleted = db.BooleanField(required=True) is_pinned = db.BooleanField(default=False) is_staff_replied = db.BooleanField(default=False) is_reported = db.BooleanField(default=False) # attachments = db.ListField(default=[]) epic_count = db.IntField(default=0) abuse_count = db.IntField(default=0) status = db.StringField(required=True) progress = db.FloatField(required=True) user_reputation = db.IntField(required=True) def get_info(self): return self.to_json() def update_comment(self, comment_info): self.stepic_id = comment_info.get('stepic_id') self.parent_id = comment_info.get('parent_id') self.step_id = comment_info.get('step_id') self.user_role = comment_info.get('user_role') self.time = parse(comment_info.get('time')).timestamp() self.last_time = parse(comment_info.get('last_time')).timestamp() self.text = comment_info.get('text') # self.replies = comment_info.get('replies') self.reply_count = comment_info.get('reply_count') if comment_info.get( 'reply_count' ) else 0 # Иначе не работает фильтрация по дефолтному значению self.is_deleted = comment_info.get('is_deleted') if comment_info.get( 'is_deleted') else False self.is_pinned = comment_info.get('is_pinned') self.is_staff_replied = comment_info.get('is_staff_replied') self.is_reported = comment_info.get('is_reported') self.attachments = comment_info.get('attachments') self.epic_count = comment_info.get('epic_count') self.abuse_count = comment_info.get('abuse_count') self.status = self.status if self.status else 'new' # Иначе не работает фильтрация по дефолтному значению self.progress = 0 self.user_reputation = 0 print('Update stepic comment #{}'.format(self.serial_id)) return self def update_comment_status(self, status_info): self.status = status_info.get('comment_status') return self def update_comment_progress(self): self.progress = round( (self.user.courses[str(self.course.stepic_id)].score / self.course.score * 100), 2) if self.course.score else 0 self.user_reputation = self.user.reputation if self.user.reputation else 0 return self