Exemple #1
0
class StepicUserCourse(db.EmbeddedDocument):
    user = db.ReferenceField('StepicUser')
    course = db.ReferenceField('StepicCourse')
    score = db.IntField(default=0)
    steps = db.MapField(db.EmbeddedDocumentField('StepicUserStep'))

    def get_info(self):
        return self.to_json()

    def add_step(self, comment_info):
        step_id = str(comment_info.get('step_id'))
        user_step = self.steps.get(step_id)
        if not user_step:
            self.steps[step_id] = StepicUserStep()

        return self

    def update_step_grades(self, course_grades):
        self.score = course_grades.get('score')

        results = course_grades.get('results')
        for step_grades in results:
            step_id = str(results.get(step_grades).get('step_id'))
            if step_id in self.steps:
                self.steps[step_id].update_user_step(results.get(step_grades))

        return self
Exemple #2
0
class StepicReview(db.Document):
    serial_id = db.SequenceField()
    stepic_id = db.IntField(unique=True)
    user = db.ReferenceField('StepicUser')
    course = db.ReferenceField('StepicCourse')
    create_date = db.IntField(default=0)
    update_date = db.IntField(default=0)
    text = db.StringField(default='')
    score = db.IntField(default=0)
    progress = db.FloatField(required=True)
    user_reputation = db.IntField(required=True)

    def get_info(self):
        return self.to_json()

    def update_review(self, comment_info):
        self.stepic_id = comment_info.get('stepic_id')
        self.create_date = parse(comment_info.get('create_date')).timestamp()
        self.update_date = parse(comment_info.get('update_date')).timestamp()
        self.text = comment_info.get('text')
        self.score = comment_info.get('score')
        self.progress = 0
        self.user_reputation = 0

        print('Update stepic review #{}'.format(self.serial_id))

        return self

    def update_review_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
Exemple #3
0
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
Exemple #4
0
class MoodleForum(db.Document):
	serial_id = db.SequenceField()
	moodle_id = db.IntField(unique=True)
	course = db.ReferenceField('MoodleCourse')
	type = db.StringField(default='')
	name = db.StringField(default='')
	intro = db.StringField(default='')
	scale = db.IntField(default=0)
	discussion_list = db.ListField(db.ReferenceField('MoodleDiscussion'), default=[])

	def get_info(self):
		return self.to_json()

	def update_forum(self, forum_info):
		self.type = forum_info.get('type')
		self.name = forum_info.get('name')
		self.intro = forum_info.get('intro')
		self.scale = forum_info.get('scale')

		print('Update moodle forum #{}'.format(self.serial_id))

		return self
Exemple #5
0
class MoodleDiscussion(db.Document):
	serial_id = db.SequenceField()
	moodle_id = db.IntField(unique=True)
	discussion_id = db.IntField(unique=True)
	user = db.ReferenceField('MoodleUser')
	course = db.ReferenceField('MoodleCourse')
	forum = db.ReferenceField('MoodleForum')
	discussion_post = db.ReferenceField('MoodlePost')
	name = db.StringField(default='')
	subject = db.StringField(default='')
	message = db.StringField(default='')
	time_created = db.IntField(default=0)
	time_modified = db.IntField(default=0)
	user_modified = db.IntField(default=0) # ? ReferenceField
	num_replies = db.IntField(required=True)
	view_url = db.StringField(default='')
	tag_list = db.ListField(db.ReferenceField('MoodleTag'))
	post_list = db.ListField(db.ReferenceField('MoodlePost'), default=[])
	status = db.StringField(default='new')
	progress = db.FloatField(required=True)


	def get_info(self):
		return self.to_json()

	def update_discussion(self, discussion_info):
		self.user = MoodleUser.objects(moodle_id=discussion_info.get('user_id')).modify(
			full_name=discussion_info.get('user_full_name'),
			user_picture_url=discussion_info.get('user_picture_url'),
			upsert=True,
			new=True)
		self.name = discussion_info.get('name')
		self.subject = discussion_info.get('subject')
		self.message = discussion_info.get('message')
		self.time_created = discussion_info.get('time_created')
		self.time_modified = discussion_info.get('time_modified')
		self.user_modified = discussion_info.get('user_modified')
		self.num_replies = discussion_info.get('num_replies')
		self.progress = self.progress if self.progress else 0

		print('Update moodle discussion #{}'.format(self.serial_id))

		return self
Exemple #6
0
class MoodleFiltrationSet(FiltrationSet):
	course_list = db.ListField(db.ReferenceField('MoodleCourse'), default=[])
	tag_list = db.ListField(db.ReferenceField('MoodleTag'), default=[])
	author = db.ReferenceField('MoodleUser')
	# поле "Статус" поста
	post_status = db.StringField(default='all')

	def get_info(self):
		return self.to_json()

	def parse_url_args(self, args):
		filtration_set_info = {
			'date_from': args.get('date[from]'),
			'date_to': args.get('date[to]'),
			'date_order': args.get('date[order]'),
			'replies_from': args.get('replies[from]'),
			'replies_to': args.get('replies[to]'),
			'replies_order': args.get('replies[order]'),
			'progress_from': args.get('progress[from]'),
			'progress_to': args.get('progress[to]'),
			'progress_order': args.get('progress[order]'),
			'course_id_list': args.getlist('course_ids[]'),
			'tag_id_list': args.getlist('tag_ids[]'),
			'author_id': args.get('author_id'),
			'post_status': args.get('post_status')}

		return filtration_set_info

	def update_filtration_set(self, filtration_set_info):
		self.date_from = datetime.fromisoformat(filtration_set_info.get('date_from')).timestamp()
		self.date_to = datetime.fromisoformat(filtration_set_info.get('date_to')).timestamp()
		self.date_order = filtration_set_info.get('date_order')
		self.replies_from = filtration_set_info.get('replies_from')
		self.replies_to = filtration_set_info.get('replies_to')
		self.replies_order = filtration_set_info.get('replies_order')
		self.progress_from = filtration_set_info.get('progress_from')
		self.progress_to = filtration_set_info.get('progress_to')
		self.progress_order = filtration_set_info.get('progress_order')
		self.course_list = [MoodleCourse.objects(moodle_id=int(course_id)).first() for course_id in filtration_set_info.get('course_id_list')] if filtration_set_info.get('course_id_list') else []
		self.tag_list = [MoodleTag.objects(moodle_id=int(tag_id)).first() for tag_id in filtration_set_info.get('tag_id_list')] if filtration_set_info.get('tag_id_list') else []
		self.author = MoodleUser.objects(serial_id=filtration_set_info.get('author_id')).first() if filtration_set_info.get('author_id') else None
		self.post_status = filtration_set_info.get('post_status')

		print('Update moodle filtration set #{}'.format(self.serial_id))

		return self

	# copy filtration_set_2 data to filtration_set_1
	def copy_filtration_set(self, filtration_set_1, filtration_set_2):
		filtration_set_1.date_from = filtration_set_2.date_from
		filtration_set_1.date_to = filtration_set_2.date_to
		filtration_set_1.date_order = filtration_set_2.date_order
		filtration_set_1.replies_from = filtration_set_2.replies_from
		filtration_set_1.replies_to = filtration_set_2.replies_to
		filtration_set_1.replies_order = filtration_set_2.replies_order
		filtration_set_1.progress_from = filtration_set_2.progress_from
		filtration_set_1.progress_to = filtration_set_2.progress_to
		filtration_set_1.progress_order = filtration_set_2.progress_order
		filtration_set_1.course_list = filtration_set_2.course_list
		filtration_set_1.tag_list = filtration_set_2.tag_list
		filtration_set_1.author = filtration_set_2.author
		filtration_set_1.post_status = filtration_set_2.post_status

		print('Copy moodle filtration_set #{} <-- #{}'.format(filtration_set_1.serial_id, filtration_set_2.serial_id))

		return filtration_set_1

	# импорт фильтра для Moodle
	def import_filtration_set(self, filtration_set_id):
		old_filtration_set = MoodleFiltrationSet.objects(serial_id=filtration_set_id).first()
		self.copy_filtration_set(self, old_filtration_set).save()

		print('Import moodle filtration_set #{}'.format(old_filtration_set.serial_id))

		return self

	# экспорт фильтра для Moodle
	def export_filtration_set(self, title):
		new_filtration_set = MoodleFiltrationSet(title=title).save()
		self.copy_filtration_set(new_filtration_set, self).save()


		print('Export moodle filtration_set #{}'.format(new_filtration_set.serial_id))

		return self

	# url параметры
	def get_url(self):
		url = '?{}&{}&{}&{}&{}&{}&{}'.format(
			self.get_date_args_url(),
			self.get_replies_args_url(),
			self.get_progress_args_url(),
			self.get_courses_args_url(),
			self.get_tags_args_url(),
			self.get_author_args_url(),
			self.get_post_status_args_url())

		return url

	# url параметры поля "Курсы"
	def get_courses_args_url(self):
		return '&'.join('course_ids[]={}'.format(course.moodle_id) for course in self.course_list)

	# url параметры поля "Теги"
	def get_tags_args_url(self):
		return '&'.join('tag_ids[]={}'.format(tag.moodle_id) for tag in self.tag_list)

	# url параметры поля "Автор"
	def get_author_args_url(self):
		return 'author_id={}'.format(self.author.serial_id if self.author else 0)

	# url параметры поля "Статус"
	def get_post_status_args_url(self):
		return 'post_status={}'.format(self.post_status)

	# параметры сортировки по полям: "Дата", "Ответы", "Прогресс"
	def get_sort_args_list(self):
		sort_args_list = [
			'{}{}'.format(self.date_order, 'time_created'),
			'{}{}'.format(self.replies_order, 'num_replies'),
			'{}{}'.format(self.progress_order, 'progress')]

		return sort_args_list
Exemple #7
0
class MoodleTeacher(BaseTeacher):
	moodle_url = db.StringField(default='')
	moodle_id = db.IntField()
	token = db.StringField(default='')
	username = db.StringField(default='')
	full_name = db.StringField(default='')
	user_picture_url = db.StringField(default='')
	course_list = db.ListField(db.ReferenceField('MoodleCourse'), default=[])
	filtration_set = db.ReferenceField('MoodleFiltrationSet')

	def get_info(self):
		return self.to_json()

	def update_teacher(self, teacher_info):
		self.username = teacher_info.get('username')
		self.full_name = teacher_info.get('fullname')
		self.user_picture_url = teacher_info.get('userpictureurl')
		filtration_set_title = '{} (по умолчанию)'.format(teacher_info.get('username'))
		self.filtration_set = MoodleFiltrationSet.objects(title=filtration_set_title).modify(
				title=filtration_set_title,
				date_from=datetime.fromisoformat((date.today() - timedelta(30)).isoformat()).timestamp(),
				date_to=datetime.fromisoformat((date.today() + timedelta(1)).isoformat()).timestamp(),
				upsert=True,
				new=True)

		print('Update moodle teacher #{}: {}'.format(self.serial_id, self.full_name))

		return self

	def filter_and_sort_discussions(self):
		# filter
		filtration_set = self.filtration_set
		# 4. Курсы
		discussion_list = MoodleDiscussion.objects(course__in=filtration_set.course_list) if filtration_set.course_list else MoodleDiscussion.objects()
		# 1. Дата
		discussion_list = discussion_list.filter(Q(time_created__gte=filtration_set.date_from) & Q(time_created__lte=filtration_set.date_to))
		# 2. Ответы
		discussion_list = discussion_list.filter(Q(num_replies__gte=filtration_set.replies_from) & Q(num_replies__lte=filtration_set.replies_to))
		# 5. Теги
		discussion_list = discussion_list.filter(tag_list__in=[tag for tag in filtration_set.tag_list]) if filtration_set.tag_list else discussion_list
		# 6. Автор
		discussion_list = discussion_list.filter(user=filtration_set.author) if filtration_set.author else discussion_list
		# 7. Статус
		discussion_list = discussion_list.filter(status=filtration_set.post_status) if filtration_set.post_status != 'all' else discussion_list
		# 3. Прогресс
		for discussion in discussion_list:
			discussion.discussion_post.update_post_progress().save()
		discussion_list = discussion_list.filter(Q(progress__gte=filtration_set.progress_from) & Q(progress__lte=filtration_set.progress_to))
		# sort
		discussion_list = discussion_list.order_by(*filtration_set.get_sort_args_list())

		return discussion_list

	def filter_and_sort_posts(self):
		# filter
		filtration_set = self.filtration_set
		# 4. Курсы
		post_list = MoodlePost.objects(course__in=filtration_set.course_list) if filtration_set.course_list else MoodlePost.objects()
		# 1. Дата
		post_list = post_list.filter(Q(time_created__gte=filtration_set.date_from) & Q(time_created__lte=filtration_set.date_to))
		# 2. Ответы
		post_list = post_list.filter(Q(num_replies__gte=filtration_set.replies_from) & Q(num_replies__lte=filtration_set.replies_to))
		# 5. Теги
		post_list = post_list.filter(tag_list__in=[tag for tag in filtration_set.tag_list]) if filtration_set.tag_list else post_list
		# 6. Автор
		post_list = post_list.filter(user=filtration_set.author) if filtration_set.author else post_list
		# 7. Статус
		post_list = post_list.filter(status=filtration_set.post_status) if filtration_set.post_status != 'all' else post_list
		# 3. Прогресс
		for post in post_list:
			post.update_post_progress().save()
		post_list = post_list.filter(Q(progress__gte=filtration_set.progress_from) & Q(progress__lte=filtration_set.progress_to))
		# sort
		post_list = post_list.order_by(*filtration_set.get_sort_args_list())

		return post_list
Exemple #8
0
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
Exemple #9
0
class StepicTeacher(BaseTeacher):
    stepic_id = db.IntField()
    token = db.StringField(default='')
    full_name = db.StringField(default='')
    avatar_url = db.StringField(default='')
    course_list = db.ListField(db.ReferenceField('StepicCourse'), default=[])
    filtration_set = db.ReferenceField('StepicFiltrationSet')

    def get_info(self):
        return self.to_json()

    def update_teacher(self, teacher_info):
        self.full_name = teacher_info.get('full_name')
        self.avatar_url = teacher_info.get('avatar')
        filtration_set_title = '{} (по умолчанию)'.format(
            teacher_info.get('full_name'))
        self.filtration_set = StepicFiltrationSet.objects(
            title=filtration_set_title).modify(
                title=filtration_set_title,
                date_from=datetime.fromisoformat(
                    (date.today() - timedelta(30)).isoformat()).timestamp(),
                date_to=datetime.fromisoformat(
                    (date.today() + timedelta(1)).isoformat()).timestamp(),
                upsert=True,
                new=True)

        print('Update stepic teacher #{}: {}'.format(self.serial_id,
                                                     self.full_name))

        return self

    def filter_and_sort_comments(self):
        # filter
        filtration_set = self.filtration_set
        # 5. Курсы
        comment_list = StepicComment.objects(
            course__in=filtration_set.course_list
        ) if filtration_set.course_list else StepicComment.objects()
        # 1. Дата
        comment_list = comment_list.filter(
            Q(time__gte=filtration_set.date_from)
            & Q(time__lte=filtration_set.date_to))
        # 2. Ответы
        comment_list = comment_list.filter(
            Q(reply_count__gte=filtration_set.replies_from)
            & Q(reply_count__lte=filtration_set.replies_to))
        # 4. Репутация
        comment_list = comment_list.filter(
            Q(user_reputation__gte=filtration_set.reputation_from)
            & Q(user_reputation__lte=filtration_set.reputation_to))
        # 6. Автор
        comment_list = comment_list.filter(
            user=filtration_set.author
        ) if filtration_set.author else comment_list
        # 7. Статус
        comment_list = comment_list.filter(
            status=filtration_set.comment_status
        ) if filtration_set.comment_status != 'all' else comment_list
        # 3. Прогресс
        for comment in comment_list:
            comment.update_comment_progress().save()
        comment_list = comment_list.filter(
            Q(progress__gte=filtration_set.progress_from)
            & Q(progress__lte=filtration_set.progress_to))
        # sort
        comment_list = comment_list.order_by(
            *filtration_set.get_sort_args_list())

        return comment_list

    def filter_and_sort_reviews(self):
        # filter
        filtration_set = self.filtration_set
        # 4. Курсы
        review_list = StepicReview.objects(
            course__in=filtration_set.course_list
        ) if filtration_set.course_list else StepicReview.objects()
        # 1. Дата
        review_list = review_list.filter(
            Q(create_date__gte=filtration_set.date_from)
            & Q(create_date__lte=filtration_set.date_to))
        # 3. Репутация
        review_list = review_list.filter(
            Q(user_reputation__gte=filtration_set.reputation_from)
            & Q(user_reputation__lte=filtration_set.reputation_to))
        # 2. Прогресс
        for review in review_list:
            review.update_review_progress().save()
        review_list = review_list.filter(
            Q(progress__gte=filtration_set.progress_from)
            & Q(progress__lte=filtration_set.progress_to))
        # sort
        review_list = review_list.order_by(
            *filtration_set.get_sort_args_list())

        return review_list
Exemple #10
0
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
Exemple #11
0
class StepicFiltrationSet(FiltrationSet):
    course_list = db.ListField(db.ReferenceField('StepicCourse'), default=[])
    # поле "Репутация"
    reputation_from = db.IntField(default=0)
    reputation_to = db.IntField(default=100000)
    reputation_order = db.StringField(default='-')
    # поле "Автор"
    author = db.ReferenceField('StepicUser')
    # поле "Статус" комментария
    comment_status = db.StringField(default='all')

    def get_info(self):
        return self.to_json()

    def parse_url_args(self, args):
        filtration_set_info = {
            'date_from': args.get('date[from]'),
            'date_to': args.get('date[to]'),
            'date_order': args.get('date[order]'),
            'replies_from': args.get('replies[from]'),
            'replies_to': args.get('replies[to]'),
            'replies_order': args.get('replies[order]'),
            'progress_from': args.get('progress[from]'),
            'progress_to': args.get('progress[to]'),
            'progress_order': args.get('progress[order]'),
            'reputation_from': args.get('reputation[from]'),
            'reputation_to': args.get('reputation[to]'),
            'reputation_order': args.get('reputation[order]'),
            'course_id_list': args.getlist('course_ids[]'),
            'author_id': args.get('author_id'),
            'comment_status': args.get('comment_status')
        }

        return filtration_set_info

    def update_filtration_set(self, filtration_set_info):
        self.date_from = datetime.fromisoformat(
            filtration_set_info.get('date_from')).timestamp()
        self.date_to = datetime.fromisoformat(
            filtration_set_info.get('date_to')).timestamp()
        self.date_order = filtration_set_info.get('date_order')
        self.replies_from = filtration_set_info.get('replies_from')
        self.replies_to = filtration_set_info.get('replies_to')
        self.replies_order = filtration_set_info.get('replies_order')
        self.progress_from = filtration_set_info.get('progress_from')
        self.progress_to = filtration_set_info.get('progress_to')
        self.progress_order = filtration_set_info.get('progress_order')
        self.reputation_from = filtration_set_info.get('reputation_from')
        self.reputation_to = filtration_set_info.get('reputation_to')
        self.reputation_order = filtration_set_info.get('reputation_order')
        self.course_list = [
            StepicCourse.objects(stepic_id=int(course_id)).first()
            for course_id in filtration_set_info.get('course_id_list')
        ] if filtration_set_info.get('course_id_list') else []
        self.author = StepicUser.objects(
            serial_id=filtration_set_info.get('author_id')).first(
            ) if filtration_set_info.get('author_id') else None
        self.comment_status = filtration_set_info.get('comment_status')

        print('Update stepic filtration set #{}'.format(self.serial_id))

        return self

    # copy filtration_set_2 data to filtration_set_1
    def copy_filtration_set(self, filtration_set_1, filtration_set_2):
        filtration_set_1.date_from = filtration_set_2.date_from
        filtration_set_1.date_to = filtration_set_2.date_to
        filtration_set_1.date_order = filtration_set_2.date_order
        filtration_set_1.replies_from = filtration_set_2.replies_from
        filtration_set_1.replies_to = filtration_set_2.replies_to
        filtration_set_1.replies_order = filtration_set_2.replies_order
        filtration_set_1.progress_from = filtration_set_2.progress_from
        filtration_set_1.progress_to = filtration_set_2.progress_to
        filtration_set_1.progress_order = filtration_set_2.progress_order
        filtration_set_1.reputation_from = filtration_set_2.reputation_from
        filtration_set_1.reputation_to = filtration_set_2.reputation_to
        filtration_set_1.reputation_order = filtration_set_2.reputation_order
        filtration_set_1.course_list = filtration_set_2.course_list
        filtration_set_1.author = filtration_set_2.author
        filtration_set_1.comment_status = filtration_set_2.comment_status

        print('Copy stepic filtration_set #{} <-- #{}'.format(
            filtration_set_1.serial_id, filtration_set_2.serial_id))

        return filtration_set_1

    # импорт фильтра для Stepic
    def import_filtration_set(self, filtration_set_id):
        old_filtration_set = StepicFiltrationSet.objects(
            serial_id=filtration_set_id).first()
        self.copy_filtration_set(self, old_filtration_set).save()

        print('Import stepic filtration_set #{}'.format(
            old_filtration_set.serial_id))

        return self

    # экспорт фильтра для Stepic
    def export_filtration_set(self, title):
        new_filtration_set = StepicFiltrationSet(title=title).save()
        self.copy_filtration_set(new_filtration_set, self).save()

        print('Export stepic filtration_set #{}'.format(
            new_filtration_set.serial_id))

        return self

    # url параметры
    def get_url(self):
        url = '?{}&{}&{}&{}&{}&{}&{}'.format(
            self.get_date_args_url(), self.get_replies_args_url(),
            self.get_progress_args_url(), self.get_reputation_args_url(),
            self.get_courses_args_url(), self.get_author_args_url(),
            self.get_comment_status_args_url())

        return url

    # url параметры поля "Репутация"
    def get_reputation_args_url(self):
        reputation_args_url = 'reputation[from]={}&reputation[to]={}&reputation[order]={}'.format(
            self.reputation_from, self.reputation_to, self.reputation_order)

        return reputation_args_url

    # url параметры поля "Курсы"
    def get_courses_args_url(self):
        return '&'.join('course_ids[]={}'.format(course.stepic_id)
                        for course in self.course_list)

    # url параметры поля "Автор"
    def get_author_args_url(self):
        return 'author_id={}'.format(
            self.author.serial_id if self.author else 0)

    # url параметры поля "Статус"
    def get_comment_status_args_url(self):
        return 'comment_status={}'.format(self.comment_status)

    # параметры сортировки по полям: "Дата", "Ответы", "Прогресс", "Репутация"
    def get_sort_args_list(self):
        sort_args_list = [
            '{}{}'.format(self.date_order, 'time_created'),
            '{}{}'.format(self.date_order, 'create_date'),
            '{}{}'.format(self.replies_order, 'num_replies'),
            '{}{}'.format(self.progress_order,
                          'progress'), '{}{}'.format(self.reputation_order,
                                                     'user_reputation')
        ]

        return sort_args_list
Exemple #12
0
class Account(UserMixin, db.Document):
    serial_id = db.SequenceField()
    clan = db.ReferenceField('Clan')
    private = db.ReferenceField('AccountPrivate')
    statistics = db.ReferenceField('AccountStatistics')
    member = db.ReferenceField('AccountMember')
    token = db.ReferenceField('AccountToken')
    account_id = db.IntField(unique=True)
    created_at = db.IntField()
    global_rating = db.IntField()
    last_battle_time = db.IntField()
    logout_at = db.IntField()
    nickname = db.StringField()
    updated_at = db.IntField()

    # avatar = db.ImageField() - или лучше хранить url ?
    # name = db.StringField() - настоящее имя игрока

    def __set_public_info(self, account_info):
        self.created_at = account_info.get(WG_API_CONST().ACCOUNT_CREATED_AT)
        self.global_rating = account_info.get(
            WG_API_CONST().ACCOUNT_GLOBAL_RATING)
        self.last_battle_time = account_info.get(
            WG_API_CONST().ACCOUNT_LAST_BATTLE_TIME)
        self.logout_at = account_info.get(WG_API_CONST().ACCOUNT_LOGOUT_AT)
        self.nickname = account_info.get(WG_API_CONST().ACCOUNT_NICKNAME)
        self.updated_at = account_info.get(WG_API_CONST().ACCOUNT_UPDATED_AT)

        return self

    # **************************************************************************
    # Public methods
    # **************************************************************************
    def get_id(self):
        return str(self.id)

    def get_info(self):
        return self.to_json()

    def update_account_info(self):
        account_info = WG_API().get_account_info(
            self.account_id, self.token.access_token).get(
                WG_API_CONST().RESPONSE_DATA).get(str(self.account_id))
        self.__set_public_info(account_info)
        # private
        if (account_info.get(WG_API_CONST().ACCOUNT_PRIVATE)):
            AccountPrivate.objects(account_id=self.account_id).update_one(
                account_id=self.account_id,
                updated_at=self.updated_at,
                upsert=True)
            self.private = AccountPrivate.objects(
                account_id=self.account_id).first().update_account_private(
                    account_info.get(WG_API_CONST().ACCOUNT_PRIVATE)).save()
        # statistics
        AccountStatistics.objects(account_id=self.account_id).update_one(
            account_id=self.account_id, upsert=True)
        self.statistics = AccountStatistics.objects(
            account_id=self.account_id).first().update_account_statistics(
                account_info.get(WG_API_CONST().ACCOUNT_STATISTICS).get(
                    WG_API_CONST().ACCOUNT_STATISTICS_ALL)).save()

        return self.save()