From 5f5367eb91101652afa8ab8ed406786e21a4fac2 Mon Sep 17 00:00:00 2001 From: yomguy Date: Tue, 29 Jan 2013 16:09:06 +0100 Subject: [PATCH] add conference sync, cleanup --- .../commands/teleforma-import-users-pb.py | 17 ++-- .../commands/teleforma-import-users.py | 12 +-- teleforma/models/core.py | 40 +++++++-- teleforma/views/core.py | 82 ++++++++++--------- 4 files changed, 95 insertions(+), 56 deletions(-) diff --git a/teleforma/management/commands/teleforma-import-users-pb.py b/teleforma/management/commands/teleforma-import-users-pb.py index 93100089..08968ae3 100644 --- a/teleforma/management/commands/teleforma-import-users-pb.py +++ b/teleforma/management/commands/teleforma-import-users-pb.py @@ -13,7 +13,7 @@ import datetime class Command(BaseCommand): help = "Import users from a XLS file (see an example in example/data/" - args = "path" + args = "path period_name" first_row = 2 admin_email = 'webmaster@parisson.com' @@ -25,13 +25,14 @@ class Command(BaseCommand): return None def get_training(self, code): + period, c = Period.objects.get_or_create(name=self.period_name) platform_only = False if 'I' in code[0:2]: platform_only = True code = code[4:] - training, c = Training.objects.get_or_create(code=code) + training, c = Training.objects.get_or_create(code=code, period=period) else: - training, c = Training.objects.get_or_create(code=code) + training, c = Training.objects.get_or_create(code=code, period=period) return platform_only, training def get_iej(self, name): @@ -44,7 +45,8 @@ class Command(BaseCommand): iej, c = IEJ.objects.get_or_create(name=name) return iej - def import_user(self, row): + def import_user(self, row, period_name): + self.period_name = period_name last_name = row[0].value first_name = row[1].value email = row[9].value @@ -76,7 +78,7 @@ class Command(BaseCommand): student.iej = self.get_iej(row[2].value) student.save() - student.period = Period.objects.filter(name='Estivale') + student.period = Period.objects.filter(name=self.period_name) student.procedure = self.get_courses(row[4].value) student.written_speciality = self.get_courses(row[5].value) student.oral_speciality = self.get_courses(row[6].value) @@ -85,7 +87,7 @@ class Command(BaseCommand): profile, created = Profile.objects.get_or_create(user=user) profile.address = row[10].value - profile.postal_code = int(row[11].value) + profile.postal_code = row[11].value profile.city = row[12].value profile.telephone = row[13].value profile.save() @@ -94,9 +96,10 @@ class Command(BaseCommand): def handle(self, *args, **options): file = args[0] + period_name = args[1] self.book = xlrd.open_workbook(file) sheet = self.book.sheet_by_index(0) col = sheet.col(0) for i in range(self.first_row, len(col)): - self.import_user(sheet.row(i)) + self.import_user(sheet.row(i), period_name) diff --git a/teleforma/management/commands/teleforma-import-users.py b/teleforma/management/commands/teleforma-import-users.py index b207d8f0..cda4d217 100644 --- a/teleforma/management/commands/teleforma-import-users.py +++ b/teleforma/management/commands/teleforma-import-users.py @@ -13,7 +13,7 @@ import datetime class Command(BaseCommand): help = "Import users from a XLS file (see an example in example/data/" - args = "path" + args = "path period_name" first_row = 2 admin_email = 'webmaster@parisson.com' @@ -24,7 +24,7 @@ class Command(BaseCommand): else: raise BaseException('You should first create a course with this code: ' + code) - def import_user(self, row): + def import_user(self, row, period): last_name = row[0].value first_name = row[1].value email = row[9].value @@ -47,9 +47,10 @@ class Command(BaseCommand): student = Student.objects.filter(user=user) if not student: student = Student(user=user) - student.period, c = Period.objects.get_or_create(name='Estivale') + student.period, c = Period.objects.get_or_create(name=period) student.iej, c = IEJ.objects.get_or_create(name=row[2].value) - student.training, c = Training.objects.get_or_create(code=row[3].value) + student.training, c = Training.objects.get_or_create(code=row[3].value, + period=student.period) student.save() student.procedure = self.get_first_course(row[4].value) @@ -69,11 +70,12 @@ class Command(BaseCommand): def handle(self, *args, **options): file = args[0] + period = args[1] self.book = xlrd.open_workbook(file) sheet = self.book.sheet_by_index(0) col = sheet.col(0) for i in range(self.first_row, len(col)): - self.import_user(sheet.row(i)) + self.import_user(sheet.row(i), period) diff --git a/teleforma/models/core.py b/teleforma/models/core.py index 0bbfef15..52350c0f 100644 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -78,6 +78,9 @@ STATUS_CHOICES = ( WEIGHT_CHOICES = get_nint_choices(5) +def get_random_hash(): + hash = random.getrandbits(128) + return "%032x" % hash class MetaCore: app_label = app_label @@ -245,6 +248,8 @@ class Conference(Model): return self.description def save(self, **kwargs): + if not self.public_id: + self.public_id = get_random_hash() self.course.save() super(Conference, self).save(**kwargs) @@ -261,11 +266,16 @@ class Conference(Model): return dict def to_json_dict(self): - data = {'id': self.public_id, 'course_code': self.course.code, - 'course_type': self.course_type.name, 'professor_id': self.professor.user.username, - 'period': self.period, + data = {'id': self.public_id, + 'course_code': self.course.code, + 'course_type': self.course_type.name, + 'professor_id': self.professor.user.username, + 'period': self.period.name, 'session': self.session, - 'streams':[] } + 'streams': [], + 'date_begin': self.date_begin.strftime('%Y %m %d %H %M %S'), + 'date_end': self.date_end.strftime('%Y %m %d %H %M %S'), + } if self.room: data['room'] = self.room.name @@ -280,6 +290,26 @@ class Conference(Model): 'stream_type': stream.stream_type }) return data + def from_json_dict(self, data): + self.public_id = data['id'] + self.course, c = Course.objects.get_or_create(code=data['course_code']) + self.course_type, c = CourseType.objects.get_or_create(name=data['course_type']) + user, c = User.objects.get_or_create(username=data['professor_id']) + self.professor, c = Professor.objects.get_or_create(user=user) + self.period, c = Period.objects.get_or_create(name=data['period']) + self.session = data['session'] + dl = data['date_begin'].split(' ') + self.date_begin = datetime.datetime(int(dl[0]), int(dl[1]), int(dl[2]), + int(dl[3]), int(dl[4]), int(dl[5])) + dl = data['date_end'].split(' ') + self.date_end = datetime.datetime(int(dl[0]), int(dl[1]), int(dl[2]), + int(dl[3]), int(dl[4]), int(dl[5])) + if 'room' in data.keys(): + organization = Organization.objects.get(name=data['organization']) + self.room, c = Room.objects.get_or_create(name=data['room'], + organization=organization) + self.save() + class Meta(MetaCore): db_table = app_label + '_' + 'conference' verbose_name = _('conference') @@ -465,7 +495,7 @@ class DocumentSimple(MediaBase): def save(self, **kwargs): super(DocumentSimple, self).save(**kwargs) self.set_mime_type() - + class Meta(MetaCore): db_table = app_label + '_' + 'document_simple' diff --git a/teleforma/views/core.py b/teleforma/views/core.py index fde57215..36241e3d 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -103,11 +103,11 @@ def get_courses(user, date_order=False, num_order=False): if settings.TELEFORMA_E_LEARNING_TYPE == 'CRFPA': from teleforma.views.crfpa import get_crfpa_courses return get_crfpa_courses(user, date_order=False, num_order=False) - + elif settings.TELEFORMA_E_LEARNING_TYPE == 'AE': from teleforma.views.ae import get_ae_courses return get_ae_courses(user, date_order=False, num_order=False) - + def stream_from_file(__file): chunk_size = 0x10000 @@ -121,15 +121,19 @@ def stream_from_file(__file): def get_room(content_type=None, id=None, name=None): - rooms = jqchat.models.Room.objects.filter(content_type=content_type, - object_id=id) - if not rooms: - room = jqchat.models.Room.objects.create(content_type=content_type, - object_id=id, - name=name[:20]) + if settings.TELEFORMA_GLOBAL_TWEETER: + return jqchat.models.Room.objects.create(name='site') + else: - room = rooms[0] - return room + rooms = jqchat.models.Room.objects.filter(content_type=content_type, + object_id=id) + if not rooms: + room = jqchat.models.Room.objects.create(content_type=content_type, + object_id=id, + name=name[:20]) + else: + room = rooms[0] + return room def get_access(obj, courses): @@ -148,11 +152,6 @@ def get_host(request): host = host.split(':')[0] return host - -def get_random_hash(): - hash = random.getrandbits(128) - return "%032x" % hash - def get_periods(user): if settings.TELEFORMA_E_LEARNING_TYPE == 'CRFPA': student = user.crfpa_student.all() @@ -175,7 +174,7 @@ def get_periods(user): periods = Period.objects.all() return periods - + class CourseView(DetailView): @@ -193,10 +192,7 @@ class CourseView(DetailView): context['all_courses'] = all_courses context['notes'] = course.notes.all().filter(author=self.request.user) content_type = ContentType.objects.get(app_label="teleforma", model="course") - if settings.TELEFORMA_GLOBAL_TWEETER: - context['room'] = get_room(name='site') - else: - context['room'] = get_room(name=course.title, content_type=content_type, + context['room'] = get_room(name=course.title, content_type=content_type, id=course.id) context['doc_types'] = DocumentType.objects.all() context['periods'] = get_periods(self.request.user) @@ -247,12 +243,10 @@ class MediaView(DetailView): context['item'] = media.item context['type'] = media.course_type context['notes'] = media.notes.all().filter(author=self.request.user) - content_type = ContentType.objects.get(app_label="teleforma", model="media") - if settings.TELEFORMA_GLOBAL_TWEETER: - context['room'] = get_room(name='site') - else: - context['room'] = get_room(name=media.item.title, content_type=content_type, - id=media.id) + content_type = ContentType.objects.get(app_label="teleforma", model="course") + context['room'] = get_room(name=media.course.title, content_type=content_type, + id=media.course.id) + access = get_access(media, all_courses) if not access: context['access_error'] = access_error @@ -311,12 +305,9 @@ class DocumentView(DetailView): document = self.get_object() context['course'] = document.course context['notes'] = document.notes.all().filter(author=self.request.user) - content_type = ContentType.objects.get(app_label="teleforma", model="document") - if settings.TELEFORMA_GLOBAL_TWEETER: - context['room'] = get_room(name='site') - else: - context['room'] = get_room(name=document.title, content_type=content_type, - id=document.id) + content_type = ContentType.objects.get(app_label="teleforma", model="course") + context['room'] = get_room(name=document.course, content_type=content_type, + id=document.course.id) access = get_access(document, all_courses) if not access: context['access_error'] = access_error @@ -368,12 +359,9 @@ class ConferenceView(DetailView): context['course'] = conference.course context['type'] = conference.course_type context['notes'] = conference.notes.all().filter(author=self.request.user) - content_type = ContentType.objects.get(app_label="teleforma", model="conference") - if settings.TELEFORMA_GLOBAL_TWEETER: - context['room'] = get_room(name='site') - else: - context['room'] = get_room(name=conference.course.title, content_type=content_type, - id=conference.id) + content_type = ContentType.objects.get(app_label="teleforma", model="course") + context['room'] = get_room(name=conference.course.title, content_type=content_type, + id=conference.course.id) context['livestreams'] = conference.livestream.all() context['host'] = get_host(self.request) access = get_access(conference, all_courses) @@ -407,6 +395,22 @@ class ConferenceView(DetailView): return super(ConferenceView, self).dispatch(*args, **kwargs) +class ConferenceListView(ListView): + + model = Conference + + @jsonrpc_method('teleforma.get_conference_list') + def get_conference_list(request): + return [c.to_json_dict() for c in self.get_queryset()] + + def pull(self, conference): + url = 'http://' + settings.TELECASTER_MASTER_SERVER + '/json/' + s = ServiceProxy(url) + list = s.teleforma.get_conference_list() + for conf_dict in list: + conference.from_json_dict(conf_dict) + + class ConferenceRecordView(FormView): "Conference record form : TeleCaster module required" @@ -512,7 +516,7 @@ class ConferenceRecordView(FormView): stream_type=stream_type, streaming=True) stream.save() else: - raise 'Error : Bad Conference dictionnary' + raise 'Error : input must be a conference dictionnary' def push(self, conference): url = 'http://' + settings.TELECASTER_MASTER_SERVER + '/json/' -- 2.39.5