You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
12 KiB
374 lines
12 KiB
import os, sys, django
|
|
|
|
sys.path.append("../")
|
|
os.environ['PG_PORT_5432_TCP_ADDR'] = '127.0.0.1'
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
|
|
django.setup()
|
|
|
|
from management.models import Comment
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from courses.models import Vertex, Lesson
|
|
from access.models import ActiveObject
|
|
from journals.models import Thread, HomeworkTry, ExamTry, Journal, Action, \
|
|
LessonJ, CourseThemeJ, TeacherJ, HomeworkJ, ExamJ
|
|
from library.models import Article
|
|
from django.contrib.auth import get_user_model
|
|
from django.db import transaction
|
|
|
|
|
|
def transaction_decorator(function_to_decorate):
|
|
def wrap(*args, **kwargs):
|
|
transaction.set_autocommit(False)
|
|
try:
|
|
result = function_to_decorate(*args, **kwargs)
|
|
except Exception as ex:
|
|
transaction.rollback()
|
|
raise ex
|
|
else:
|
|
transaction.commit()
|
|
return result
|
|
finally:
|
|
transaction.set_autocommit(True)
|
|
|
|
return wrap
|
|
|
|
|
|
@transaction_decorator
|
|
def start_end_object(instance, pref, student, course, start_th_user, end_th_user):
|
|
for thj in instance.objects.filter(date__isnull=False, student=student, material__course__in=course):
|
|
obj_id = pref + str(thj.material.id)
|
|
vertex = Vertex.manager.get(old_id=obj_id)
|
|
|
|
Journal.objects.get_or_create(
|
|
thread=start_th_user,
|
|
user=student,
|
|
content_type=vertex_type,
|
|
date=thj.date,
|
|
object_id=vertex.id,
|
|
action_type=start_action,
|
|
)
|
|
|
|
if thj.f_date:
|
|
Journal.objects.get_or_create(
|
|
thread=end_th_user,
|
|
user=student,
|
|
content_type=vertex_type,
|
|
date=thj.f_date,
|
|
object_id=vertex.id,
|
|
action_type=end_action,
|
|
)
|
|
|
|
|
|
def task_obj_try(instance, pref, teacher, task_thread):
|
|
for obj_try in instance.objects.filter(teacher=teacher):
|
|
vt_id = Vertex.manager.get(old_id=pref + str(obj_try.material.id)).id
|
|
s_t_thread, _is_create = Thread.objects.get_or_create(
|
|
key='task_%d__student_%d__teacher_%d' % (vt_id, obj_try.student.id, obj_try.teacher.id),
|
|
is_staff=False,
|
|
)
|
|
|
|
s_t_thread.parent.add(task_thread)
|
|
s_t_thread.subscribers.add(obj_try.student)
|
|
s_t_thread.subscribers.add(obj_try.teacher)
|
|
|
|
user = obj_try.teacher
|
|
action = Action.objects.get(name='no')
|
|
|
|
if obj_try.success:
|
|
action = Action.objects.get(name='yes')
|
|
|
|
if obj_try.f_date is None:
|
|
user = obj_try.student
|
|
action = Action.objects.get(name='try')
|
|
|
|
Journal.objects.get_or_create(
|
|
thread=s_t_thread,
|
|
user=user,
|
|
content_type=vertex_type,
|
|
date=obj_try.date,
|
|
object_id=vt_id,
|
|
action_type=action
|
|
)
|
|
|
|
#
|
|
# Выше - хелперы, ниже - основная часть программы
|
|
#
|
|
|
|
|
|
@transaction_decorator
|
|
def main_threads():
|
|
print("Инициализация основных тредов")
|
|
res = {}
|
|
|
|
support_list = [
|
|
'kate.gazukina@skillbox.ru',
|
|
'katerina.ragozina@skillbox.ru',
|
|
]
|
|
|
|
admin_list = [
|
|
'andrey.korolev@skillbox.ru',
|
|
'pavel.matveev@skillbox.ru',
|
|
'anton.kopylov@skillbox.ru',
|
|
]
|
|
|
|
admin_thread, _is_create = Thread.objects.get_or_create(
|
|
key='Admin',
|
|
text='Тред для админов, сюда падают все журналируемые сообщения в системе',
|
|
is_staff=True,
|
|
)
|
|
|
|
for i in get_user_model().objects.filter(email__in=admin_list):
|
|
admin_thread.subscribers.add(i)
|
|
|
|
management_thread, _is_create = Thread.objects.get_or_create(
|
|
key='Project_management',
|
|
text='Тред для проджект-менеджеров, сюда падает статистика разного рода',
|
|
is_staff=True,
|
|
)
|
|
|
|
management_thread.parent.add(admin_thread)
|
|
|
|
res['library_thread'], _is_create = Thread.objects.get_or_create(
|
|
key='Library',
|
|
text='Тред <<Библиотека>> сюда прилетает вся инфа по статьям',
|
|
is_staff=True,
|
|
)
|
|
|
|
res['library_thread'].parent.add(management_thread)
|
|
|
|
start_and_end_thread, _is_create = Thread.objects.get_or_create(
|
|
key='Start_and_end',
|
|
text='Тред начала и завершения прохождения какого-либо этапа обучения',
|
|
is_staff=True,
|
|
)
|
|
|
|
start_and_end_thread.parent.add(management_thread)
|
|
|
|
res['start_thread'], _is_create = Thread.objects.get_or_create(
|
|
key='Start',
|
|
text='Тред начала прохождения какого-либо этапа обучения',
|
|
is_staff=True,
|
|
)
|
|
|
|
res['start_thread'].parent.add(start_and_end_thread)
|
|
|
|
res['end_thread'], _is_create = Thread.objects.get_or_create(
|
|
key='End',
|
|
text='Тред окончания прохождения какого-либо этапа обучения',
|
|
is_staff=True,
|
|
)
|
|
|
|
res['end_thread'].parent.add(start_and_end_thread)
|
|
|
|
support_thread, _is_create = Thread.objects.get_or_create(
|
|
key='Support',
|
|
text='Тред сапортов, занимаются поддержкой клиента',
|
|
is_staff=True,
|
|
)
|
|
|
|
support_thread.parent.add(admin_thread)
|
|
|
|
for i in get_user_model().objects.filter(email__in=support_list):
|
|
support_thread.subscribers.add(i)
|
|
|
|
res['task_thread'], _is_create = Thread.objects.get_or_create(
|
|
key='Tasks',
|
|
text='Сюда пободают все переписки студентов и преподов',
|
|
is_staff=True,
|
|
)
|
|
|
|
res['task_thread'].parent.add(support_thread)
|
|
|
|
res['comment_thread'], _is_create = Thread.objects.get_or_create(
|
|
key='Comments',
|
|
text='Сюда пободают все лайки дизлайки и так далее по коментам',
|
|
is_staff=True,
|
|
)
|
|
|
|
res['comment_thread'].parent.add(support_thread)
|
|
|
|
return res
|
|
|
|
|
|
@transaction_decorator
|
|
def create_article_journals(library_thread):
|
|
print("Создание журналов для статей")
|
|
for article in Article.objects.all():
|
|
article_kwarg = {
|
|
'content_type': article_type,
|
|
'object_id': article.id,
|
|
'thread': library_thread,
|
|
}
|
|
|
|
for author in article.favorite.all():
|
|
Journal.objects.get_or_create(
|
|
user=author,
|
|
action_type=Action.objects.get(name='favorite'),
|
|
**article_kwarg,
|
|
)
|
|
|
|
for author in article.likes.all():
|
|
Journal.objects.get_or_create(
|
|
user=author,
|
|
action_type=Action.objects.get(name='like'),
|
|
**article_kwarg,
|
|
)
|
|
|
|
for author in article.views.all():
|
|
Journal.objects.get_or_create(
|
|
user=author,
|
|
action_type=Action.objects.get(name='watch'),
|
|
**article_kwarg,
|
|
)
|
|
|
|
|
|
def start_end_journals(start_thread, end_thread):
|
|
print("Создание журналов начала и завершения какого-либо этапа")
|
|
for ao in ActiveObject.objects.all():
|
|
try:
|
|
start_th_user, _is_create = Thread.objects.get_or_create(
|
|
is_staff=False,
|
|
key='start_thread_course_%d__user_%d' % (ao.course.id, ao.user.id),
|
|
)
|
|
|
|
end_th_user, _is_create = Thread.objects.get_or_create(
|
|
is_staff=False,
|
|
key='end_thread_course_%d__user_%d' % (ao.course.id, ao.user.id),
|
|
)
|
|
|
|
tj = TeacherJ.objects.get(course=ao.course, student=ao.user)
|
|
Journal.objects.get_or_create(
|
|
thread=start_th_user,
|
|
user=ao.user,
|
|
content_type=course_type,
|
|
date=tj.start_date,
|
|
object_id=ao.course.id,
|
|
action_type=start_action,
|
|
)
|
|
|
|
start_th_user.parent.add(start_thread)
|
|
end_th_user.parent.add(end_thread)
|
|
|
|
kwarg = {
|
|
'student': ao.user,
|
|
'course': ao.course,
|
|
'start_th_user': start_th_user,
|
|
'end_th_user': end_th_user,
|
|
}
|
|
|
|
start_end_object(
|
|
instance=CourseThemeJ,
|
|
pref='t_',
|
|
**kwarg,
|
|
)
|
|
|
|
start_end_object(
|
|
instance=LessonJ,
|
|
pref='l_',
|
|
**kwarg,
|
|
)
|
|
|
|
start_end_object(
|
|
instance=HomeworkJ,
|
|
pref='h_',
|
|
**kwarg,
|
|
)
|
|
|
|
start_end_object(
|
|
instance=ExamJ,
|
|
pref='e_',
|
|
**kwarg,
|
|
)
|
|
|
|
except TeacherJ.DoesNotExist:
|
|
pass
|
|
|
|
|
|
@transaction_decorator
|
|
def task_try(task_tread):
|
|
print("Журналы попыток домашек")
|
|
for teacher in get_user_model().objects.filter(in_role='T'):
|
|
task_obj_try(
|
|
instance=HomeworkTry,
|
|
pref='h_',
|
|
teacher=teacher,
|
|
task_thread=task_tread
|
|
)
|
|
|
|
task_obj_try(
|
|
instance=ExamTry,
|
|
pref='e_',
|
|
teacher=teacher,
|
|
task_thread=task_tread
|
|
)
|
|
|
|
|
|
@transaction_decorator
|
|
def init_comment(comment_thread):
|
|
comment_type = ContentType.objects.get(app_label='management', model='comment')
|
|
for comment in Comment.objects.all():
|
|
comment_kwarg = {
|
|
"content_type": course_type,
|
|
"thread": comment_thread,
|
|
"object_id": comment.id,
|
|
}
|
|
|
|
for user in comment.minus_rating.all():
|
|
Journal.objects.get_or_create(
|
|
user=user,
|
|
action_type=Action.objects.get(name="dislike"),
|
|
**comment_kwarg,
|
|
)
|
|
|
|
for user in comment.plus_rating.all():
|
|
Journal.objects.get_or_create(
|
|
user=user,
|
|
action_type=Action.objects.get(name="like"),
|
|
**comment_kwarg,
|
|
)
|
|
|
|
for user in comment.saw.all():
|
|
Journal.objects.get_or_create(
|
|
user=user,
|
|
action_type=Action.objects.get(name="watch"),
|
|
**comment_kwarg,
|
|
)
|
|
|
|
if __name__ == '__main__':
|
|
|
|
if not "help" in sys.argv:
|
|
vertex_type = ContentType.objects.get(app_label='courses', model='vertex')
|
|
article_type = ContentType.objects.get(app_label='library', model='article')
|
|
course_type = ContentType.objects.get(app_label='courses', model='course')
|
|
start_action = Action.objects.get(name='start')
|
|
end_action = Action.objects.get(name='end')
|
|
|
|
boot_list = ['article', 'start_end', 'task_try', 'comment'] if len(sys.argv) == 1 else sys.argv[1:]
|
|
|
|
main_threads_info = main_threads()
|
|
|
|
if 'article' in boot_list:
|
|
create_article_journals(main_threads_info['library_thread'])
|
|
|
|
if 'start_end' in boot_list:
|
|
start_end_journals(main_threads_info['start_thread'], main_threads_info['end_thread'])
|
|
|
|
if 'task_try' in boot_list:
|
|
task_try(main_threads_info['task_thread'])
|
|
|
|
if 'comment' in boot_list:
|
|
init_comment(main_threads_info['lesson_thread'])
|
|
|
|
else:
|
|
print("""
|
|
Это скрипт миграции в новую систему данных условно его
|
|
можно разделить на несколько частей:\n
|
|
1 Инициализация основных тредов,\n
|
|
2 Создание журналов для статей,\n
|
|
3 Создание журналов начала и завершения какого-либо этапа,\n
|
|
4 Журналы попыток домашек,\n
|
|
5 Создание журналов для коментов,\n
|
|
|
|
При запуске без флагов выполняются все этапы, но можно указать какой-то конкретный или несколько,
|
|
article, start_end, task_try, comment (инициализация является обязательной)
|
|
""")
|
|
|