]> git.parisson.com Git - teleforma.git/commitdiff
Convert to python 3
authorYoan Le Clanche <yoanl@pilotsystems.net>
Thu, 16 Dec 2021 16:26:39 +0000 (17:26 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Thu, 16 Dec 2021 16:26:39 +0000 (17:26 +0100)
34 files changed:
teleforma/admin.py
teleforma/fields.py
teleforma/management/commands/teleforma-cleanup-testimonials.py
teleforma/management/commands/teleforma-copy-seminars.py
teleforma/management/commands/teleforma-export-avis.py
teleforma/management/commands/teleforma-export-professors.py
teleforma/management/commands/teleforma-export-users.py
teleforma/management/commands/teleforma-extract-kdenlive-markers.py
teleforma/management/commands/teleforma-import-courses-xls.py
teleforma/management/commands/teleforma-import-professors.py
teleforma/management/commands/teleforma-import-seminar-media-update.py
teleforma/management/commands/teleforma-import-seminar-media.py
teleforma/management/commands/teleforma-import-seminars-preview.py
teleforma/management/commands/teleforma-import-users-pb-debug.py
teleforma/management/commands/teleforma-import-users-pb.py
teleforma/management/commands/teleforma-import-users.py
teleforma/management/commands/teleforma-remove-seminars-from-csv.py
teleforma/management/commands/teleforma-reset-all-passwords-with-mail-ae.py
teleforma/management/commands/teleforma-reset-all-passwords-with-mail.py
teleforma/management/commands/teleforma-revisions-from-bbb.py
teleforma/migrations/0047_auto__del_payment__add_question__add_answer__add_seminar__add_field_do.py
teleforma/migrations/0049_auto__add_testimonialtemplate__add_testimonial.py
teleforma/migrations/0050_auto__add_field_testimonial_template.py
teleforma/migrations/0051_auto__add_documentsimple__del_field_testimonialtemplate_template_doc__.py
teleforma/models/__init__.py
teleforma/models/core.py
teleforma/models/pro.py
teleforma/templatetags/teleforma_tags.py
teleforma/utils/unicode.py
teleforma/views/__init__.py
teleforma/views/core.py
teleforma/views/crfpa.py
teleforma/views/home.py
teleforma/views/pro.py

index f1f9ea3eb1c3610f9a7920a0ba0e5ab103d34d9d..6bceda9975331f86eda85c0ad115f92d549b1c5d 100644 (file)
@@ -5,8 +5,7 @@ from teleforma.templatetags.teleforma_tags import fancy_duration_shop_like, fanc
 from django.contrib import admin
 from django.contrib.auth.models import User
 from django.contrib.auth.admin import UserAdmin
-from longerusername.forms import UserCreationForm, UserChangeForm
-from django.contrib.contenttypes.generic import GenericInlineModelAdmin
+# from longerusername.forms import UserCreationForm, UserChangeForm
 from django.http import HttpResponse
 import time
 from datetime import date
@@ -44,8 +43,8 @@ class ProfessorAdmin(admin.ModelAdmin):
 
 class UserProfileAdmin(UserAdmin):
     inlines = [ProfessorProfileInline, AuditorProfileInline]
-    add_form = UserCreationForm
-    form = UserChangeForm
+    add_form = UserCreationForm
+    form = UserChangeForm
     list_filter = ['is_staff', 'is_superuser', 'is_active', 'date_joined']
 
     actions = ['export_user_profiles']
@@ -198,11 +197,11 @@ class ConferenceAdmin(admin.ModelAdmin):
             title = conference.pretty_title
             
             if conference.webclass:
-                title = u"Webconférence - " + title
+                title = "Webconférence - " + title
             if conference.duration:
-                title += u" - Durée : %s" % (fancy_duration_shop_like(conference.duration))
+                title += " - Durée : %s" % (fancy_duration_shop_like(conference.duration))
             if conference.webclass:
-                title += u" (%s live + %s de validation des acquis)" % (fancy_seconds(conference.webclass_duration), fancy_seconds(conference.webclass_hours_complementary.as_seconds()))
+                title += " (%s live + %s de validation des acquis)" % (fancy_seconds(conference.webclass_duration), fancy_seconds(conference.webclass_hours_complementary.as_seconds()))
             row = (conference.id, title, conference.price, conference.product_code)
             writer.writerow(row)
         return response
@@ -342,10 +341,10 @@ class SeminarRevisionAdmin(admin.ModelAdmin):
 
         writer = UnicodeWriter(response, delimiter=";")
         writer.writerow(["seminaire", "email", "duree total", "date debut", "date fin", "duree"])
-        for seminar in data.keys():
+        for seminar in list(data.keys()):
             title = data[seminar]['title']
             users = data[seminar]['users']
-            for user in users.keys():
+            for user in list(users.keys()):
                 l = [title, user]
                 revs = users[user]
                 duration = datetime.timedelta()
index ba36db5d1c02dceaf50b7e908467061ad1f6e7af..06bc6921ac266f1f5e1009dd8ab9aee96a276eac 100644 (file)
@@ -50,7 +50,7 @@ class Duration(object):
     def __add__(self, other):
         return self.__decorate(self._delta.__add__, other)
 
-    def __nonzero__(self):
+    def __bool__(self):
         return self._delta.__nonzero__()
 
     def __str__(self):
@@ -79,7 +79,7 @@ class Duration(object):
 
                 return Duration(hours=hours, minutes=minutes, seconds=seconds)
             except TypeError:
-                print groups
+                print(groups)
                 raise
         else:
             raise ValueError("Malformed duration string: " + str)
@@ -97,14 +97,14 @@ def normalize_field(args, default_value=None):
        The default value can also be overriden with the default=value argument.
        """
     required = False
-    if args.has_key('required'):
+    if 'required' in args:
         required = args['required']
         args.pop('required')
 
     args['blank'] = not required
 
     if not required:
-        if not args.has_key('default'):
+        if 'default' not in args:
             if args.get('null'):
                 args['default'] = None
             elif default_value is not None:
@@ -114,7 +114,7 @@ def normalize_field(args, default_value=None):
 
 
 # The following is based on Django TimeField
-class DurationField(models.Field):
+class DurationField(models.Field, metaclass=models.SubfieldBase):
     """Duration Django model field. Essentially the same as a TimeField, but
     with values over 24h allowed.
 
@@ -123,8 +123,6 @@ class DurationField(models.Field):
 
     description = _("Duration")
 
-    __metaclass__ = models.SubfieldBase
-
     default_error_messages = {
         'invalid': _('Enter a valid duration in HH:MM[:ss] format.'),
     }
@@ -138,7 +136,7 @@ class DurationField(models.Field):
     def to_python(self, value):
         if value is None:
             return None
-        if isinstance(value, int) or isinstance(value, long):
+        if isinstance(value, int):
             return Duration(seconds=value)
         if isinstance(value, datetime.time):
             return Duration(hours=value.hour, minutes=value.minute, seconds=value.second)
@@ -169,7 +167,7 @@ class DurationField(models.Field):
         if val is None:
             data = ''
         else:
-            data = unicode(val)
+            data = str(val)
         return data
 
     def formfield(self, **kwargs):
index af0323cf19b2adbe6b1e3f4dbdcd59f164bd5231..9af710a79313ea9a7afdabc3e1b08ac71f0528a3 100644 (file)
@@ -36,7 +36,7 @@ class Command(BaseCommand):
                             for testimonial2 in testimonials:
                                 if testimonial2.date_added < testimonial1.date_added:
                                     testimonial2.delete()
-                                    print ('kept', testimonial1.title, testimonial1.date_added)
-                                    print ('deleted', testimonial2.title, testimonial2.date_added)
+                                    print(('kept', testimonial1.title, testimonial1.date_added))
+                                    print(('deleted', testimonial2.title, testimonial2.date_added))
 
 
index e4af466b43b5159069c7d9b7dc0de2059e91de74..a9ef94778681a6f82b5bf88de16c9cf26774de1e 100644 (file)
@@ -59,12 +59,12 @@ class Command(BaseCommand):
                     clone.status = 1
                     clone.quiz = seminar.quiz
                     clone.save()
-                    log = 'new seminar:' + unicode(clone)
+                    log = 'new seminar:' + str(clone)
                     logger.logger.info(log)
-                    print log
+                    print(log)
                     log = 'http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': clone.id})
                     logger.logger.info(log)
-                    print log
+                    print(log)
 
                     for field in seminar._meta.many_to_many:
 
index cff0e699497dd806c02252455b0a760d81a37993..d2d30e4c128ab64b364b7c694e908805c48a99e4 100644 (file)
@@ -9,7 +9,7 @@ from pbcart.models import Cart
 import logging
 from datetime import datetime, timedelta, date
 import csv
-import StringIO
+import io
 from ftplib import FTP
 
 from teleforma.context_processors import seminar_validated
@@ -41,7 +41,7 @@ class Command(BaseCommand):
         print(dry_run)
         logging.info('Generate csv file...')
 
-        output = StringIO.StringIO()
+        output = io.StringIO()
         writer = csv.writer(output, delimiter=';')
         
         writer.writerow([
index 4b7d620b0a441718f0d783cef940d77ff4d77d0f..bfbf8b433f751ec6e1c7a1010670c9bc729f8ccf 100644 (file)
@@ -24,7 +24,7 @@ class Command(BaseCommand):
                          'email': user.email,
                          'courses': courses,
                          })
-            print 'exported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username
+            print('exported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username)
         return json.dumps(list)
 
 
index 7ec6f204349b05947dbae1597d2411c28973632a..6b06c965dee3c3247a1484d646736a0c3109f274 100644 (file)
@@ -23,17 +23,17 @@ class Command(BaseCommand):
             row.write(0, user.last_name)
             row.write(1, user.first_name)
             row.write(9, user.email)
-            row.write(2, unicode(student.iej))
+            row.write(2, str(student.iej))
             code = student.training.code
             if student.platform_only:
                 code = 'I - ' + code
-            row.write(3, unicode(code))
-            row.write(4, unicode(student.procedure.code))
-            row.write(5, unicode(student.written_speciality.code))
-            row.write(6, unicode(student.oral_speciality.code))
-            row.write(7, unicode(student.oral_1.code))
-            row.write(8, unicode(student.oral_2.code))
-            row.write(15, unicode(student.period))
+            row.write(3, str(code))
+            row.write(4, str(student.procedure.code))
+            row.write(5, str(student.written_speciality.code))
+            row.write(6, str(student.oral_speciality.code))
+            row.write(7, str(student.oral_1.code))
+            row.write(8, str(student.oral_2.code))
+            row.write(15, str(student.period))
 
             profile = Profile.objects.filter(user=user)
             if profile:
@@ -44,7 +44,7 @@ class Command(BaseCommand):
                 row.write(13, profile.telephone)
                 row.write(14, profile.date_added.strftime("%d/%m/%Y"))
 
-            print 'exported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username
+            print('exported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username)
 
     def export(self):
         self.book = Workbook()
@@ -57,7 +57,7 @@ class Command(BaseCommand):
         row.write(3, 'FORMATION')
         row.write(4, 'PROC')
         row.write(5, 'Ecrit Spe')
-        row.write(6, unicode('Oral Spe'))
+        row.write(6, str('Oral Spe'))
         row.write(7, 'ORAL 1')
         row.write(8, 'ORAL 2')
         row.write(9, 'MAIL')
index c2a931df14304359e37f5965e5fefc3fbce376d2..8988fb1011f644b83bbc6cbc9956acd87e71780d 100644 (file)
@@ -12,5 +12,5 @@ class Command(BaseCommand):
         media_file = args[0]
         session = KDEnLiveSession(media_file)
         for mark in session.markers():
-            print mark['session_timecode'], mark['time'], mark['comment']
+            print(mark['session_timecode'], mark['time'], mark['comment'])
         
index 67b23b2a07280e55055b099b5b68697c7fadb384..a6e796438bce2e9dc81c63d11497b674c61d2abc 100644 (file)
@@ -39,5 +39,5 @@ class Command(BaseCommand):
                                                             )
 
             if created:
-                print 'imported: ' + course.title
+                print('imported: ' + course.title)
 
index c2e6a33b399261e70faff61c00957aa91851ee9e..b4060a518dc5c27c45a438b58a11377cbc7c023f 100644 (file)
@@ -30,7 +30,7 @@ class Command(BaseCommand):
                     course = Course.objects.filter(code=code)
                     if course:
                         p.courses.add(course[0])
-                print 'imported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username
+                print('imported: ' + user.first_name + ' ' + user.last_name + ' ' + user.username)
 
     def handle(self, *args, **options):
         file = args[0]
index 62087e6dd0336fc016d89130c258e00841d8df09..029d7f16d81141b410a785299c4d485f105c72f9 100644 (file)
@@ -136,7 +136,7 @@ class Command(BaseCommand):
                         and not 'preview' in filename and not 'Preview' in filename and filename[0] != '.' \
                         and statinfo.st_size > self.size_limit:
 
-                    print path
+                    print(path)
                     # seminar_rank <= 9
                     seminar_rank = int(root_list[-1][0])
 
@@ -265,4 +265,4 @@ class Command(BaseCommand):
                                 seminar.save()
 
         for s in seminars:
-            print 'http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id})
+            print('http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id}))
index a6d75cabb83e1a646eeb0852dcf9b3fb9e7a914a..1c229cc67352f69b62154335668107ee74d0a59e 100644 (file)
@@ -127,7 +127,7 @@ class Command(BaseCommand):
                 name = os.path.splitext(filename)[0]
                 ext = os.path.splitext(filename)[1][1:]
                 root_list = root.split(os.sep)
-                print root + os.sep + filename
+                print(root + os.sep + filename)
 
                 if ext in self.original_format and not 'preview' in root_list \
                             and not 'preview' in filename and not 'Preview' in filename and filename[0] != '.':
@@ -261,4 +261,4 @@ class Command(BaseCommand):
                                 seminar.save()
 
         for s in seminars:
-            print 'http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id})
+            print('http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id}))
index 9781d31158d4e9078012fcbe24959dfb3319f3f9..c91803530aefa2f5f13fe744c32a8e6c515060ff 100644 (file)
@@ -199,4 +199,4 @@ class Command(BaseCommand):
                             seminar.media_preview = media
                             seminar.save()
 
-        print 'Done!'
\ No newline at end of file
+        print('Done!')
\ No newline at end of file
index 10c5a3c7665904288de676a91d5813ba61b80857..352af544d707186e6ba0a88494e4450d59510860 100644 (file)
@@ -84,7 +84,7 @@ class Command(BaseCommand):
             profile.telephone = row[13].value
             profile.save()
             student.save()
-            print 'imported: ' + first_name + ' ' + last_name + ' ' + username
+            print('imported: ' + first_name + ' ' + last_name + ' ' + username)
 
     def handle(self, *args, **options):
         file = args[0]
index 44802192d3e85cc2c4726c55535b013fe655f6e5..2eb19b882067e96377a59018390325a7c0584e94 100644 (file)
@@ -88,7 +88,7 @@ class Command(BaseCommand):
             profile.telephone = row[13].value
             profile.save()
             student.save()
-            print 'imported: ' + first_name + ' ' + last_name + ' ' + username
+            print('imported: ' + first_name + ' ' + last_name + ' ' + username)
 
     def handle(self, *args, **options):
         file = args[0]
index 54aade8584e946815307e57cfd38eb825f9794a6..90beec0ba8930362e522f9a06f1a26d4d72bf98f 100644 (file)
@@ -63,7 +63,7 @@ class Command(BaseCommand):
             profile.telephone = row[13].value
             profile.save()
             student.save()
-            print 'imported: ' + first_name + ' ' + last_name + ' ' + username
+            print('imported: ' + first_name + ' ' + last_name + ' ' + username)
 
     def handle(self, *args, **options):
         file = args[0]
index 4f4454a1c6e424e9368aee418699d68fc7d882a4..b103ca645e758ce5f682e6dbfbf0c9570c31de77 100644 (file)
@@ -40,7 +40,7 @@ class Command(BaseCommand):
             elif key in ('commentaires', 'commentaire') and seminar:
                 if val == 'non':
                     if not '(' in seminar or not seminar.endswith(')'):
-                        print("WARNING: malformed seminar %s" % seminar)
+                        print(("WARNING: malformed seminar %s" % seminar))
                         continue
                     title, sid = seminar.rsplit('(', 1)
                     sid = sid[:-1]
@@ -48,10 +48,10 @@ class Command(BaseCommand):
                     seminar = list(Seminar.objects.filter(pk = sid)[:1])
                     seminar = seminar and seminar[0]
                     if not seminar:
-                        print('WARNING: Seminar %s not found' % sid)
+                        print(('WARNING: Seminar %s not found' % sid))
                     wanted_title = str(seminar).strip()
                     if title != wanted_title:
-                        print("WARNING: Seminar %s: mismatched title %r %r" % (sid, title, wanted_title))
+                        print(("WARNING: Seminar %s: mismatched title %r %r" % (sid, title, wanted_title)))
                     todel.append(seminar)
             else:
                 seminar = None
@@ -62,22 +62,22 @@ class Command(BaseCommand):
         user = list(User.objects.filter(email = email)[:1])
         user = user and user[0]
         if not user:
-            print("WARNING: user %s not found" % email)
+            print(("WARNING: user %s not found" % email))
             return
         auditor = list(user.auditor.all()[:1])
         auditor = auditor and auditor[0]
         if not auditor:
-            print("WARNING: auditor for user %s not found" % email)
+            print(("WARNING: auditor for user %s not found" % email))
             return
 
         existing = auditor.seminars.all().values('id')
         existing = set([ sem['id'] for sem in existing ])
         
-        print("===> ", email)
+        print(("===> ", email))
         for seminar in todel:
             if seminar.pk in existing:
-                print seminar
+                print(seminar)
                 auditor.seminars.remove(seminar)
             else:
-                print("WARNING: seminar %d for user %s not found" % (seminar.pk, email))
+                print(("WARNING: seminar %d for user %s not found" % (seminar.pk, email)))
                     
index 54bd7d8e4b75af4f4c0bde7c520db12bf8b2e946..2335b460d4933c5c319af2599b2bef8f22875dd2 100644 (file)
@@ -40,5 +40,5 @@ class Command(BaseCommand):
                         self.init_password_email(user)
                         profile.init_password = True
                         profile.save()
-                        print user.username
+                        print(user.username)
 
index 227955c5c5b8b8bddfae457ef30d8c0832ea1453..60dfd88a5e421faf24320a4d8b58bd5365faa9a3 100644 (file)
@@ -40,5 +40,5 @@ class Command(BaseCommand):
                         self.init_password_email(user)
                         profile.init_password = True
                         profile.save()
-                        print user.username
+                        print(user.username)
 
index 46fcc5b9fbeba47562462e8fe43fcf52fffa1a3f..bf546b17becffdabcafaf5f5897fe84cb7f20752 100644 (file)
@@ -21,14 +21,14 @@ class Command(BaseCommand):
 
     def handle(self, *args, **options):
         if len(args) != 1 or not args[0].isdigit():            
-            print("Syntax: %s %s <duration in seconds>" % (sys.argv[0],
-                                                           sys.argv[1]))
+            print(("Syntax: %s %s <duration in seconds>" % (sys.argv[0],
+                                                           sys.argv[1])))
             sys.exit(1)
 
         duration = int(args[0])
         end = datetime.datetime.now()
         start = end - datetime.timedelta(seconds = duration)
-        print("=== Starting at %s" % end.strftime('%Y-%m-%d %H:%M:%S'))
+        print(("=== Starting at %s" % end.strftime('%Y-%m-%d %H:%M:%S')))
         meetings = bbb.get_meetings()
         meetings = meetings.get_field("meetings")
         # no conference in BBB
@@ -37,7 +37,7 @@ class Command(BaseCommand):
             return
         meetings = as_list(meetings["meeting"])
 
-        print("=== Starting at %s" % end.strftime('%Y-%m-%d %H:%M:%S'))
+        print(("=== Starting at %s" % end.strftime('%Y-%m-%d %H:%M:%S')))
 
         done = set()
         
@@ -47,7 +47,7 @@ class Command(BaseCommand):
                 conf = Conference.objects.get(webclass_id = meeting_id)
                 seminar = Seminar.objects.get(conference = conf)
             except:
-                print("Warning, can't find Seminar for %s" % meeting_id)
+                print(("Warning, can't find Seminar for %s" % meeting_id))
                 continue
 
             sem_txt = "%s (%s)" % (seminar, seminar.pk)
@@ -56,23 +56,23 @@ class Command(BaseCommand):
                 user_id = str(attendee['userID'])
                 key = (meeting_id, user_id) 
                 if key in done:
-                    print("Warning, user %s duplicate for %s" % (user_id, sem_txt))
+                    print(("Warning, user %s duplicate for %s" % (user_id, sem_txt)))
                     continue
                 done.add(key)
                 
                 try:
                     user = User.objects.get(username = user_id)
                 except:
-                    print("Warning, can't find user %s for seminar %s" % (user_id, sem_txt))
+                    print(("Warning, can't find user %s for seminar %s" % (user_id, sem_txt)))
                     continue
                 user_txt = "%s (%s)" % (user, user.pk)
                 rev = SeminarRevision.objects.filter(seminar = seminar,
                                                      user = user,
                                                      date_modified = None)
                 if rev.count():
-                    print("User %s already has an open revision on %s" % (user_txt, sem_txt))
+                    print(("User %s already has an open revision on %s" % (user_txt, sem_txt)))
                 else:                    
-                    print("Crediting %d seconds to %s on %s" % (duration, user_txt, sem_txt))
+                    print(("Crediting %d seconds to %s on %s" % (duration, user_txt, sem_txt)))
                     sr = SeminarRevision(seminar = seminar,
                                          user = user,
                                          date = start,
index a034859ef685f64db2fa84fa4fc4db1d4b383325..df63d0eedf074945d03b093efb5b454897170fef 100644 (file)
@@ -27,8 +27,8 @@ class Migration(SchemaMigration):
         # Adding model 'Answer'
         db.create_table('teleforma_answer', (
             ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name=u'answer', to=orm['auth.User'])),
-            ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name=u'answer', to=orm['teleforma.Question'])),
+            ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answer', to=orm['auth.User'])),
+            ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answer', to=orm['teleforma.Question'])),
             ('answer', self.gf('django.db.models.fields.TextField')()),
             ('status', self.gf('django.db.models.fields.IntegerField')(default=1)),
             ('validated', self.gf('django.db.models.fields.BooleanField')(default=False)),
index d7195cb82c62289fcfb50cf9084d2eab58200531..55cd2fbd422d36eaf42eb2fa7ad7a75f1f19cbb6 100644 (file)
@@ -13,7 +13,7 @@ class Migration(SchemaMigration):
             ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
             ('organization', self.gf('django.db.models.fields.related.ForeignKey')(related_name='testimonial_template', to=orm['teleforma.Organization'])),
             ('text', self.gf('django.db.models.fields.TextField')()),
-            ('template_doc', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name=u'testimonial_template', null=True, to=orm['teleforma.Document'])),
+            ('template_doc', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='testimonial_template', null=True, to=orm['teleforma.Document'])),
         ))
         db.send_create_signal('teleforma', ['TestimonialTemplate'])
 
@@ -21,8 +21,8 @@ class Migration(SchemaMigration):
         db.create_table('teleforma_testimonial', (
             ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
             ('seminar', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['teleforma.Seminar'])),
-            ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name=u'testimonial', to=orm['auth.User'])),
-            ('document', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name=u'testimonial', null=True, to=orm['teleforma.Document'])),
+            ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='testimonial', to=orm['auth.User'])),
+            ('document', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='testimonial', null=True, to=orm['teleforma.Document'])),
         ))
         db.send_create_signal('teleforma', ['Testimonial'])
 
index 6fd625b7628958c2d8d6f487bf4148244a040bb9..53eb17b0781bd8f368509f11b31d4f4b54f9bc44 100644 (file)
@@ -10,7 +10,7 @@ class Migration(SchemaMigration):
     def forwards(self, orm):
         # Adding field 'Testimonial.template'
         db.add_column('teleforma_testimonial', 'template',
-                      self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name=u'testimonial', to=orm['teleforma.TestimonialTemplate']),
+                      self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='testimonial', to=orm['teleforma.TestimonialTemplate']),
                       keep_default=False)
 
     def backwards(self, orm):
index 9145bbeb3d0c4c414e184c6d883c575f221b9737..b7cd4b13ef5fd8613878d6bc801cacc2063959f9 100644 (file)
@@ -29,7 +29,7 @@ class Migration(SchemaMigration):
 
         # Adding field 'TestimonialTemplate.document'
         db.add_column('teleforma_testimonial_template', 'document',
-                      self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name=u'testimonial_template', null=True, to=orm['teleforma.DocumentSimple']),
+                      self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='testimonial_template', null=True, to=orm['teleforma.DocumentSimple']),
                       keep_default=False)
 
 
@@ -50,7 +50,7 @@ class Migration(SchemaMigration):
 
         # Adding field 'TestimonialTemplate.template_doc'
         db.add_column('teleforma_testimonial_template', 'template_doc',
-                      self.gf('django.db.models.fields.related.ForeignKey')(related_name=u'testimonial_template', null=True, to=orm['teleforma.Document'], blank=True),
+                      self.gf('django.db.models.fields.related.ForeignKey')(related_name='testimonial_template', null=True, to=orm['teleforma.Document'], blank=True),
                       keep_default=False)
 
         # Deleting field 'TestimonialTemplate.document'
index da0b4b3ecff1663672a10dd64331b9a4894d9a4e..f4b925e3ae9ae59657ce4f9190b86d09e823f831 100644 (file)
@@ -1,4 +1,4 @@
-from core import *
-from crfpa import *
-from pro import *
-from ae import *
\ No newline at end of file
+from .core import *
+from .crfpa import *
+from .pro import *
+from .ae import *
\ No newline at end of file
index b3c5a4914a9d53e556fd717a7a4f65a964460fba..a70118de0df05803b4208222c337f4c5afba14e0 100755 (executable)
@@ -499,8 +499,8 @@ class Document(MediaBase):
         if self.course:
             strings.append(self.course.code)
         if self.course_type.all():
-            types = ' - '.join([unicode(t) for t in self.course_type.all()])
-            strings.append(unicode(types))
+            types = ' - '.join([str(t) for t in self.course_type.all()])
+            strings.append(str(types))
         if self.type:
             strings.append(self.type.name)
         strings.append(self.title)
index c1860252e5c68590d4a12e094eabcd5881248aa5..6e68ee72138881d37064a958a76ade6ebc08cddd 100644 (file)
@@ -154,7 +154,7 @@ class Seminar(ClonableMixin, Displayable, ProductCodeMixin, SuggestionsMixin):
         pretty_title = self.pretty_title
         if self.duration:
             from teleforma.templatetags.teleforma_tags import fancy_duration_shop_like
-            pretty_title += u" - Durée : %s" % (fancy_duration_shop_like(self.duration))
+            pretty_title += " - Durée : %s" % (fancy_duration_shop_like(self.duration))
         return pretty_title
 
     def public_url(self):
@@ -244,7 +244,7 @@ class Question(ClonableMixin, models.Model):
     status      = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=3)
 
     def __unicode__(self):
-        return ' - '.join([unicode(self.seminar), self.title, str(self.rank)])
+        return ' - '.join([str(self.seminar), self.title, str(self.rank)])
 
     class Meta(MetaCore):
         db_table = app_label + '_' + 'question'
@@ -265,7 +265,7 @@ class Answer(models.Model):
     date_added     = models.DateTimeField(_('date added'), auto_now_add=True, null=True)
 
     def __unicode__(self):
-        return ' - '.join([unicode(self.question), self.user.username, unicode(self.date_submitted)])
+        return ' - '.join([str(self.question), self.user.username, str(self.date_submitted)])
 
     def validate(self):
         self.validated = True
@@ -428,7 +428,7 @@ class QuizValidation(models.Model):
     date_validated = models.DateTimeField(_('date validated'), auto_now_add=True, null=True)
 
     def __unicode__(self):
-        return ' - '.join([unicode(self.quiz), self.user.username, unicode(self.date_validated)])
+        return ' - '.join([str(self.quiz), self.user.username, str(self.date_validated)])
 
     def validate(self):
         self.validated = True
index e9b040250fa1a8ad9288d3afc135decbf0749fdb..978c642ab8c0416ac749d16862d90ae82742f6b8 100644 (file)
@@ -51,7 +51,7 @@ from django.conf import settings
 from django.template.defaultfilters import stringfilter
 import django.utils.timezone as timezone
 from django.utils.translation import ugettext_lazy as _
-from urlparse import urlparse
+from urllib.parse import urlparse
 from docutils.core import publish_parts
 from django.utils.encoding import smart_str, force_unicode
 from django.utils.safestring import mark_safe
@@ -59,7 +59,7 @@ from django.utils.safestring import mark_safe
 from teleforma.models.crfpa import Course
 from teleforma.views import get_courses
 from teleforma.context_processors import *
-from urlparse import urlparse
+from urllib.parse import urlparse
 
 register = template.Library()
 
@@ -94,7 +94,7 @@ def value_from_settings(parser, token):
         # split_contents() knows not to split quoted strings.
         tag_name, var = token.split_contents()
     except ValueError:
-        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
+        raise template.TemplateSyntaxError("%r tag requires a single argument" % token.contents.split()[0])
     return ValueFromSettings(var)
 
 class ValueFromSettings(template.Node):
@@ -127,10 +127,10 @@ def or_me(value, arg):
     Typical usage: sender|or_me:user
 
     """
-    if not isinstance(value, (unicode, str)):
-        value = unicode(value)
-    if not isinstance(arg, (unicode, str)):
-        arg = unicode(arg)
+    if not isinstance(value, str):
+        value = str(value)
+    if not isinstance(arg, str):
+        arg = str(arg)
     return _('me') if value == arg else value
 
 @register.filter
@@ -312,7 +312,7 @@ def preview(related):
 @register.filter
 def fancy_duration(duration):
     time = ''
-    d = unicode(duration).split(':')
+    d = str(duration).split(':')
     hours = int(d[0])
     minutes = int(d[1])
     if hours:
@@ -329,7 +329,7 @@ def fancy_duration_shop_like(duration):
     if not duration:
         return ""
     time = ''
-    d = unicode(duration).split(':')
+    d = str(duration).split(':')
     hours = int(d[0])
     minutes = int(d[1])
     if hours:
@@ -400,7 +400,7 @@ def current_year():
 def render_flatpage(content):
     parsed = ""
     path = getattr(content, 'path', '')
-    if isinstance(content, basestring):
+    if isinstance(content, str):
         content = content.split("\n")
 
     for line in content:
index f935f740b63fc5fa7d7fdc3710e4a33a1b188c2c..fb21d14f3c3d7c2ece89b15b7fe65fe180f16992 100644 (file)
 # Author: jdunck
 # taken from https://github.com/jdunck/python-unicodecsv.git
 
-import csv, codecs, cStringIO
+import csv, codecs, io
 
 def _stringify(s, encoding):
-    if type(s)==unicode:
+    if type(s)==str:
         return s.encode(encoding)
     elif isinstance(s, (int , float)):
         pass #let csv.QUOTE_NONNUMERIC do its thing.
index 1727a72857295721aa841bc6b5f154ed9cc3709c..62d1035d448fbbb560046e4f43165f01754039b2 100644 (file)
@@ -1,5 +1,5 @@
-from core import *
-from crfpa import *
-from ae import *
-from pro import *
-from profile import *
+from .core import *
+from .crfpa import *
+from .ae import *
+from .pro import *
+from .profile import *
index 48b93d5606debdd7eadfc499816f51c16af93c91..45ab8845f3701141ebccb5e2d57c65a86d93915e 100644 (file)
@@ -36,11 +36,11 @@ import mimetypes
 import datetime
 from datetime import timedelta
 import random
-import urllib
-import urllib2
+import urllib.request, urllib.parse, urllib.error
+import urllib.request, urllib.error, urllib.parse
 import json
 import os
-import StringIO
+import io
 import datetime
 
 from jsonrpc import jsonrpc_method
@@ -81,7 +81,7 @@ from jsonrpc.proxy import ServiceProxy
 from teleforma.models import *
 from teleforma.forms import *
 from teleforma.context_processors import *
-import pages
+from . import pages
 import jqchat.models
 from xlwt import Workbook
 
@@ -246,12 +246,12 @@ class CourseListView(ListView):
     @jsonrpc_method('teleforma.get_dep_courses')
     def get_dep_courses(request, id):
         department = Department.objects.get(id=id)
-        return [{'id': str(c.id), 'name': unicode(c)} for c in department.course.all()]
+        return [{'id': str(c.id), 'name': str(c)} for c in department.course.all()]
 
     @jsonrpc_method('teleforma.get_dep_periods')
     def get_dep_periods(request, id):
         department = Department.objects.get(id=id)
-        return [{'id': str(c.id), 'name': unicode(c)} for c in department.period.all()]
+        return [{'id': str(c.id), 'name': str(c)} for c in department.period.all()]
 
 
 class CourseView(DetailView):
@@ -289,9 +289,9 @@ class CourseView(DetailView):
         media_list = []
         for media in course.media.all():
             if media.is_published and media.file and media.conference and 'video' in media.mime_type:
-                urls = [ {'url': settings.MEDIA_URL + unicode(media.file), 'mime_type': media.mime_type} ]
+                urls = [ {'url': settings.MEDIA_URL + str(media.file), 'mime_type': media.mime_type} ]
                 for transcoded in media.transcoded.all():
-                    urls.append({'url':settings.MEDIA_URL + unicode(transcoded.file), 'mime_type': transcoded.mime_type})
+                    urls.append({'url':settings.MEDIA_URL + str(transcoded.file), 'mime_type': transcoded.mime_type})
                 media_list.append({'session': media.conference.session, 'urls': urls, 'poster': media.poster_url()})
         return media_list
 
@@ -548,7 +548,7 @@ class ConferenceView(DetailView):
                 context['seminar'] = None
             context['record'] = None
             # debug -> test links
-            context['range'] = range(0,15)
+            context['range'] = list(range(0,15))
             webclass_status = ""
 
             now = datetime.datetime.now()
@@ -718,7 +718,7 @@ class ConferenceRecordView(FormView):
     def snapshot(self, url, dir):
         width = 160
         height = 90
-        img = urllib.urlopen(url)
+        img = urllib.request.urlopen(url)
         path = dir + os.sep + 'preview.webp'
         f = open(path, 'w')
         f.write(img.read())
@@ -778,7 +778,7 @@ class ConferenceRecordView(FormView):
                                         stream_type=stream_type, streaming=True)
                     stream.save()
         else:
-            raise 'Error : Bad Conference dictionnary'
+            raise Exception('Error : Bad Conference dictionnary')
 
     def push(self, conference):
         url = 'http://' + conference.department.domain + '/json/'
index 5e57d9cf6d5c45c31091b0a8dd3114fb11e77c65..6e8ac78e15ed695acac42d3e006804259c57b7a8 100644 (file)
@@ -203,7 +203,7 @@ class UsersCourseView(UsersView):
 
 def get_course_code(obj):
     if obj:
-        return unicode(obj.code)
+        return str(obj.code)
     else:
         return ''
 
@@ -219,11 +219,11 @@ class UsersXLSExport(object):
             row.write(0, user.last_name)
             row.write(1, user.first_name)
             row.write(9, user.email)
-            row.write(2, unicode(student.iej))
+            row.write(2, str(student.iej))
             code = student.training.code
             if student.platform_only:
                 code = 'I - ' + code
-            row.write(3, unicode(code))
+            row.write(3, str(code))
             row.write(4, get_course_code(student.procedure))
             row.write(5, get_course_code(student.written_speciality))
             row.write(6, get_course_code(student.oral_speciality))
index b549b43c2a4f5444feceb595235e67f4c25316ab..806ec41c84557a5c2875d944760ee350a351409d 100644 (file)
@@ -34,7 +34,7 @@
 # Authors: Olivier Guilyardi <olivier@samalyse.com>
 #          Guillaume Pellerin <yomguy@parisson.com>
 
-import pages
+from . import pages
 from django.shortcuts import render, redirect
 from django.contrib import auth
 from django.http import HttpResponse
index 75f74b62d6b90b65a309bf67eef76e38d06ad076..f011e7bdcaaf1faa5b16f204339fcef76298453e 100644 (file)
@@ -37,8 +37,6 @@ from teleforma.views.core import *
 from teleforma.context_processors import *
 from django.core.exceptions import PermissionDenied
 
-from teleforma.utils.unicode import UnicodeWriter
-
 from django.utils.translation import ugettext_lazy as _
 from django.template import loader, Context, RequestContext
 from django.views.generic.base import TemplateResponseMixin
@@ -54,7 +52,7 @@ from django.template.loader import render_to_string
 
 import os, datetime
 from cgi import escape
-from cStringIO import StringIO
+from io import StringIO
 
 import weasyprint
 
@@ -481,7 +479,7 @@ class AnswersView(ListView):
             testimonial.save()
             # url = reverse('teleforma-seminar-testimonial-download', kwargs={'pk':seminar.id}) + '?format=pdf'
             text = render_to_string('teleforma/messages/seminar_validated.txt', context)
-            subject = seminar.title + ' : ' + unicode(_('all your answers has been validated'))
+            subject = seminar.title + ' : ' + str(_('all your answers has been validated'))
 
         else:
             text = render_to_string('teleforma/messages/answer_validated.txt', context)
@@ -537,7 +535,7 @@ class AnswersView(ListView):
 
         sender = request.user
         text = render_to_string('teleforma/messages/answer_rejected.txt', context)
-        subject = seminar.title + ' : ' + unicode(_('validation conditions for an answer'))
+        subject = seminar.title + ' : ' + str(_('validation conditions for an answer'))
         mess = Message(sender=sender, recipient=user, subject=subject, body=text)
         mess.moderation_status = 'a'
         mess.save()
@@ -728,7 +726,7 @@ class PDFTemplateResponseMixin(TemplateResponseMixin):
         """
         if self.pdf_template_name is None:
             names = super(PDFTemplateResponseMixin, self).get_template_names()
-            return map(self._get_pdf_template_name, names)
+            return list(map(self._get_pdf_template_name, names))
         return [self.pdf_template_name]
 
     def get_pdf_filename(self):
@@ -805,7 +803,7 @@ class TestimonialDownloadView(TestimonialView):
     def get_pdf_filename(self):
         super(TestimonialDownloadView, self).get_pdf_filename()
         seminar = self.get_object()
-        prefix = unicode(_('Testimonial'))
+        prefix = str(_('Testimonial'))
         filename = '_'.join([prefix, seminar.title.replace(',', ' '),
                             self.request.user.first_name, self.request.user.last_name,])
         filename += '.pdf'
@@ -966,13 +964,13 @@ def process_webclass_bbb_webhook(request, event):
     mixin = SeminarRevisionMixin()
 
     if event["id"] == "user-joined":
-        print("JOIN", seminar, conf, user)
+        print(("JOIN", seminar, conf, user))
         mixin.seminar_do_load(request, seminar.pk, user.username)
-        print("JOIN DONE", seminar, conf, user)
+        print(("JOIN DONE", seminar, conf, user))
     else:
-        print("LEAVE", seminar, conf, user)            
+        print(("LEAVE", seminar, conf, user))            
         mixin.seminar_do_unload(request, seminar.pk, user.username)
-        print("LEAVE DONE", seminar, conf, user)            
+        print(("LEAVE DONE", seminar, conf, user))            
     
 @csrf_exempt
 def webclass_bbb_webhook(request):
@@ -989,7 +987,7 @@ def webclass_bbb_webhook(request):
     event = event[0]["data"]
     if event["type"] != "event":
         raise PermissionDenied
-    print(event["id"])
+    print((event["id"]))
     if event["id"] not in ('user-joined', 'user-left'):
         return HttpResponse("ok")