]> git.parisson.com Git - teleforma.git/commitdiff
Migration to Django 3 in progress
authorYoan Le Clanche <yoanl@pilotsystems.net>
Wed, 22 Dec 2021 13:38:29 +0000 (14:38 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Wed, 22 Dec 2021 13:38:29 +0000 (14:38 +0100)
22 files changed:
app/settings.py
app/urls.py
app/wsgi.sh
example/settings.py
requirements.txt
teleforma/admin.py
teleforma/bbb_utils.py
teleforma/fields.py
teleforma/forms.py
teleforma/management/commands/teleforma-copy-seminars.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/models/ae.py
teleforma/models/core.py
teleforma/models/crfpa.py
teleforma/models/pro.py
teleforma/models/profile.py
teleforma/templatetags/teleforma_tags.py
teleforma/urls.py
teleforma/views/core.py
teleforma/views/pro.py

index 5f7092e525baf09f52d0f16a7c279c3ff2adb519..97cd91f58c8dfa9d53a86f6c8aa82365c36b23a9 100644 (file)
@@ -12,6 +12,7 @@ sys.dont_write_bytecode = True
 
 DEBUG_ENV = os.environ.get('DEBUG') == 'True'
 DEBUG = DEBUG_ENV
+TESTING = False # mezzanine 
 TEMPLATE_DEBUG = DEBUG
 
 RECOVERY = True
@@ -169,8 +170,8 @@ MIDDLEWARE = (('debug_toolbar.middleware.DebugToolbarMiddleware',) if DEBUG_TOOL
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.locale.LocaleMiddleware',
     'dj_pagination.middleware.PaginationMiddleware',
-    'teleforma.middleware.XsSharing',
     'django_user_agents.middleware.UserAgentMiddleware',
+    'mezzanine.core.middleware.SitePermissionMiddleware'
 )
 
 ROOT_URLCONF = 'urls'
@@ -185,6 +186,7 @@ INSTALLED_APPS = (
     'django.contrib.sites',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'django.contrib.redirects',
     'django_comments',
     "mezzanine.boot",
     "mezzanine.conf",
@@ -194,17 +196,17 @@ INSTALLED_APPS = (
 #    "mezzanine.forms",
     "mezzanine.pages",
     "mezzanine.galleries",
-    "mezzanine.twitter",
+    "mezzanine.twitter",
     'teleforma',
     'jazzmin',
     'django.contrib.admin',
     'jsonrpc',
     'sorl.thumbnail',
-    'django_extensions',
+    'django_extensions',
     'dj_pagination',
     'postman',
     # 'markup_mixin',
-    'notes',
+    'notes',
     # 'timezones',
     # 'googletools',
     # 'jqchat',
@@ -212,7 +214,7 @@ INSTALLED_APPS = (
     'pbcart',
     # 'telemeta',
     # 'telecaster',
-    'forms_builder.forms',
+    'forms_builder.forms',
     'quiz',
     'multichoice',
     'true_false',
@@ -238,8 +240,8 @@ TEMPLATES = [
                 'django.template.context_processors.i18n',
                 'django.template.context_processors.media',
                 'django.template.context_processors.static',
+                'mezzanine.pages.context_processors.page',
                 'teleforma.context_processors.periods',
-
             ],
         },
     },
@@ -300,9 +302,9 @@ SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
 UNIQUE_SESSION_WHITELIST = (1, 2042)
 SESSION_EXPIRE_AT_BROWSER_CLOSE = False
 
-RECAPTCHA_PUBLIC_KEY = '6Ldq5DgbAAAAADkKg19JXlhx6F1XUQDsrXfXqSP6'
-RECAPTCHA_PRIVATE_KEY = '6Ldq5DgbAAAAAOVDOeF2kH8i2e2VSNHpqlinbpAJ'
-RECAPTCHA_REQUIRED_SCORE = 0.85
+RECAPTCHA_PUBLIC_KEY = '6Ldq5DgbAAAAADkKg19JXlhx6F1XUQDsrXfXqSP6'
+RECAPTCHA_PRIVATE_KEY = '6Ldq5DgbAAAAAOVDOeF2kH8i2e2VSNHpqlinbpAJ'
+RECAPTCHA_REQUIRED_SCORE = 0.85
 
 # Cache backend is optional, but recommended to speed up user agent parsing
 CACHES = {
@@ -422,7 +424,7 @@ JAZZMIN_SETTINGS = {
 
     "hide_apps": [],
     "hide_models": [],
-    "order_with_respect_to": ["auth", "teleforma", "teleforma.webclass", "teleforma.exam", "pdfannotator"],
+    "order_with_respect_to": ["auth", "teleforma", "teleforma.webclass"],
 
     # Custom links to append to app groups, keyed on app name
     # "custom_links": {
@@ -519,12 +521,22 @@ if DEBUG_TOOLBAR:
     DEBUG_TOOLBAR_CONFIG = {
         "SHOW_TOOLBAR_CALLBACK" : show_toolbar,
     }
+DEBUG_TOOLBAR_PATCH_SETTINGS = False
+
+
+FORMS_LABEL_MAX_LENGTH = 1024
+FORMS_FIELD_MAX_LENGTH = 255
+FORMS_BUILDER_USE_SITES = False
 
 
+BBB_SERVER = "https://bbb2.parisson.com/bigbluebutton/"
+# BBB_SECRET = "uOzkrTnWly1jusr0PYcrlwhvKhZG1ZYDOrSvxgP70" # bbb1
+BBB_SECRET = "3q3t6GCsv4wZmQlaT1pPX5ijysxeXOn8Vtn9svZEyU" # bbb2
+BBB_USE_WEBHOOKS = False
+
 USE_WEBPACK_DEV_SERVER = False
 WEBPACK_DEV_SERVER_URL = "http://172.24.104.152:3000/"
 
-
 ##################
 # LOCAL SETTINGS #
 ##################
index e601f98dd207734c4f089f131212beb70f39c44a..41da7905e52e58a53dd74b2028b759d727d6f06f 100644 (file)
@@ -4,7 +4,6 @@ import os
 from django.conf.urls import include, url
 # Uncomment the next two lines to enable the admin:
 from django.contrib import admin
-from django.http import HttpResponse
 from django.views.i18n import JavaScriptCatalog
 
 admin.autodiscover()
@@ -23,20 +22,15 @@ urlpatterns = [
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
     # to INSTALLED_APPS to enable admin documentation:
     # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-    url(r'^admin/', admin.site.urls),
+    url(r'^admin/', include(admin.site.urls)),
+
+    url("^mezzanine/", include("mezzanine.urls")),
 
     # TeleForma
     url(r'^', include('teleforma.urls')),
 
     # Languages
     url(r'^i18n/', include('django.conf.urls.i18n')),
-    url(r'^jsi18n/$', JavaScriptCatalog.as_view(packages=js_info_dict), name="js_catalog"),
-    url(r'^robots\.txt$', lambda r: HttpResponse(
-        "User-agent: *\nDisallow: /", mimetype="text/plain")),
-
-    url(r'^tinymce/', include('tinymce.urls')),
-    #url(r'^pdfviewer/', include('webviewer.urls')),
-    url(r'^pdfannotator/', include('pdfannotator.urls')),
-    url(r'^messages/', include('postman.urls', namespace='postman')),
+    url(r'^jsi18n/$', JavaScriptCatalog, js_info_dict),
 ] + ([url(r'^__debug__/', include(debug_toolbar.urls)),] if DEBUG_ENV else [])
 
index 43859828ee8bd9c3311a702747adca4fdf39e796..ca4238f8ece85b05cc518c02220f20a703b2e803 100755 (executable)
@@ -35,7 +35,7 @@ sh $app/wait.sh
 
 # app start
 if [ "$1" = "--runserver" ]; then
-    python $manage runserver 0.0.0.0:8000 --noasgi
+    python $manage runserver 0.0.0.0:8000
 else
     # static files auto update
     # watchmedo shell-command --patterns="$patterns" --recursive \
index a89173e2a7225cac04969658ed8bef6400b8b231..1161d1f0768195077004077213f0cf003f5f1004 100644 (file)
@@ -194,7 +194,7 @@ DATABASES = {
 #########
 
 import os, sys
-from django.core.urlresolvers import reverse_lazy
+from django.urls import reverse_lazy
 sys.dont_write_bytecode = True
 
 
index 31728b4b03cc3c637df0c6734a3600b32c6539c2..ee71213c0442faf87a85c53a724e23714f8ba1bb 100644 (file)
@@ -3,13 +3,19 @@ docutils==0.17.1
 Django==3.2.3
 # south
 dj_pagination==2.5.0 # used by postman
+-e git+https://github.com/pilot-systems/django-forms-builder.git@master#egg=django-forms-builder       
+django-forms-builder==0.14.0
 django-jazzmin==2.4.7
 django-json-rpc==0.7.1
 django-nvd3==0.8.2
 django-postman==4.2
+django-utils-six==2.0 # for Django 3 forward compatibility
 django-tinymce==3.3.0
 -e git+https://git.parisson.com/git/django-unique-session.git@master#egg=django-unique-session
 django-user-agents==0.4.0
+django-extensions==2.1.3
+-e git+https://github.com/pilot-systems/django-notes.git@master#egg=notes     
+# -e git+https://github.com/powellc/django-notes.git@master#egg=django-notes
 django-recaptcha==2.0.6
 dj_pagination==2.5.0 
 -e git+https://github.com/pilot-systems/Django-Quiz.git@master#egg=django-quiz-app
@@ -25,3 +31,4 @@ uwsgi==2.0.19
 pymemcache==3.4.4
 ipython
 Mezzanine==5.0.0
+# south
index 6bceda9975331f86eda85c0ad115f92d549b1c5d..4e6715550af830fde039cabac623aedacabaaa2a 100644 (file)
@@ -10,9 +10,6 @@ from django.http import HttpResponse
 import time
 from datetime import date
 
-class ProfileInline(admin.StackedInline):
-    model = Profile
-
 class CRFPAStudentProfileInline(admin.StackedInline):
     model = Student
     filter_horizontal = ['period']
index 68d4e9f96e0c2d9411d7593f5ca040c0289d6260..af8e2046fbe2d0adc29b53bb31c00c4fe3e28ae8 100644 (file)
@@ -1,6 +1,6 @@
 from django.conf import settings
 from bigbluebutton_api_python import BigBlueButton
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 bbb = BigBlueButton(settings.BBB_SERVER, settings.BBB_SECRET)
 
index eacf681363797ef98a95b977ad2338ad85bd1747..30ca81b8b68cc97ca307655542216e6f984454dd 100644 (file)
@@ -1,20 +1,12 @@
 
 import django.db.models as models
-from django.forms import ModelForm, TextInput, Textarea
-from south.modelsinspector import add_introspection_rules
-from django.core.exceptions import ValidationError
+from django.forms import Textarea
 from django.core import exceptions
 from django import forms
 import datetime
 from django.utils.translation import gettext_lazy as _
 import re
 
-try:
-    from django.contrib.auth import get_user_model  # Django 1.5
-except ImportError:
-    from postman.future_1_5 import get_user_model
-
-
 class ShortTextField(models.TextField):
 
     def formfield(self, **kwargs):
@@ -23,7 +15,7 @@ class ShortTextField(models.TextField):
          )
          return super(ShortTextField, self).formfield(**kwargs)
 
-add_introspection_rules([], ["^teleforma\.fields\.ShortTextField"])
+add_introspection_rules([], ["^teleforma\.fields\.ShortTextField"])
 
 
 
@@ -114,7 +106,7 @@ def normalize_field(args, default_value=None):
 
 
 # The following is based on Django TimeField
-class DurationField(models.Field, metaclass=models.SubfieldBase):
+class DurationField(models.Field):
     """Duration Django model field. Essentially the same as a TimeField, but
     with values over 24h allowed.
 
@@ -128,7 +120,7 @@ class DurationField(models.Field, metaclass=models.SubfieldBase):
     }
 
     def __init__(self, *args, **kwargs):
-        super(DurationField, self).__init__(*args, **normalize_field(kwargs, '0'))
+        super().__init__(*args, **normalize_field(kwargs, '0'))
 
     def db_type(self):
         return 'int'
@@ -170,11 +162,14 @@ class DurationField(models.Field, metaclass=models.SubfieldBase):
             data = str(val)
         return data
 
+    def from_db_value(self, value, expression, connection):
+        return self.to_python(value)
+
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.CharField}
         defaults.update(kwargs)
         return super(DurationField, self).formfield(**defaults)
 
 
-from south.modelsinspector import add_introspection_rules
-add_introspection_rules([], ["^teleforma\.fields\.DurationField"])
\ No newline at end of file
+from south.modelsinspector import add_introspection_rules
+add_introspection_rules([], ["^teleforma\.fields\.DurationField"])
\ No newline at end of file
index 6936c714421fd63b5b2e6b092b5a3bb9636bb6f9..fe75147e23dbbb642dcca3de524e80457a977275 100644 (file)
@@ -9,15 +9,19 @@ from teleforma.models.profile import UserProfile
 class ConferenceForm(ModelForm):
     class Meta:
         model = Conference
+        fields = "__all__"
+
 
 class QuestionForm(ModelForm):
     class Meta:
         model = Question
+        fields = "__all__"
         # exclude = ['user', 'question', 'status', 'validated', 'date_submitted']
 
 class UserProfileForm(ModelForm):
     class Meta:
         model = UserProfile
+        fields = "__all__"
 
 class AnswerForm(ModelForm):
 
index a9ef94778681a6f82b5bf88de16c9cf26774de1e..8a44391dd37045350989bc97245f45ff4fd6ac1c 100644 (file)
@@ -8,7 +8,7 @@ from django.template.defaultfilters import slugify
 from django.template.loader import render_to_string
 from django.core.mail import send_mail, mail_admins
 from django.utils import translation
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from teleforma.models import *
 import logging
 import datetime
index 029d7f16d81141b410a785299c4d485f105c72f9..0693e86df674af7d764de2a714a6415fc4f94b7c 100644 (file)
@@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand, CommandError
 from django.contrib.auth.models import User
 from django.template.defaultfilters import slugify
 from teleforma.models import *
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 import logging
 import os, sys, time, datetime
index 1c229cc67352f69b62154335668107ee74d0a59e..02660c14b876ecf1d18c7373f299c002d6702352 100644 (file)
@@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand, CommandError
 from django.contrib.auth.models import User
 from django.template.defaultfilters import slugify
 from teleforma.models import *
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 import logging
 import os, sys, time, datetime
index c91803530aefa2f5f13fe744c32a8e6c515060ff..d516cea973e81fd35db0ee09f4a5fe8d126c2a88 100644 (file)
@@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand, CommandError
 from django.contrib.auth.models import User
 from django.template.defaultfilters import slugify
 from teleforma.models import *
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 import logging
 import os, sys, time, datetime
index c824c067e5d2bd5bf5b0199d882fdd0b2e2f5ee9..eb97b8799f33cb2ecf4b0ca3cf44a7f8c31db7e7 100644 (file)
@@ -42,13 +42,13 @@ from teleforma.models.core import *
 
 class AEStudent(Model):
 
-    user            = ForeignKey(User, related_name='ae_student', verbose_name=_('user'), unique=True )
+    user            = ForeignKey(User, related_name='ae_student', verbose_name=_('user'), unique=True, on_delete=models.CASCADE)
     period          = ManyToManyField('Period', related_name='ae_student', verbose_name=_('period'),
-                                  blank=True, null=True)
+                                  blank=True)
     platform_only   = BooleanField(_('platform only'))
     courses            = ManyToManyField('Course', related_name="ae_student",
                                         verbose_name=_('courses'),
-                                        blank=True, null=True)
+                                        blank=True)
     
     def __unicode__(self):
         try:
index 84d29d775f2adcb1e1ef34f8f9a0d678f4b76c90..5ef858af6946436a8483626ea08178858b389b03 100755 (executable)
@@ -49,16 +49,15 @@ from django.utils.translation import gettext_lazy as _
 from django.utils.functional import cached_property
 from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
-from django.contrib.contenttypes import generic
+from django.contrib.contenttypes.fields import GenericRelation
 from django.contrib.sites.models import Site
 from notes.models import Note
-import jqchat.models
 from django.core.paginator import InvalidPage, EmptyPage
 from django.template.defaultfilters import slugify
 import tinymce.models
 from mezzanine.core.models import Displayable
 from mezzanine.core.managers import DisplayableManager
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.template.defaultfilters import date
 from bigbluebutton_api_python.exception import BBBException
 from django.db.models.signals import pre_save
@@ -146,7 +145,7 @@ class Department(Model):
     name            = CharField(_('name'), max_length=255)
     description     = CharField(_('description'), max_length=255, blank=True)
     organization    = ForeignKey('Organization', related_name='department',
-                                 verbose_name=_('organization'))
+                                 verbose_name=_('organization'), on_delete=models.CASCADE)
     domain          = CharField(_('Master domain'), max_length=255, blank=True)
     address         = tinymce.models.HTMLField(_('address'), blank=True)
     signature       = models.ImageField(_('Signature image'), upload_to='images/%Y/%m/%d',
@@ -174,9 +173,9 @@ class Location(Model):
 
     name             = models.CharField(_('name'), unique=True, max_length=150)
     type             = models.IntegerField(_('type'), choices=TYPE_CHOICES, default=OTHER_TYPE, db_index=True, null=True, blank=True)
-    complete_type    = models.ForeignKey('LocationType', related_name="locations", verbose_name=_('complete type'))
+    complete_type    = models.ForeignKey('LocationType', related_name="locations", verbose_name=_('complete type'), on_delete=models.CASCADE)
     current_location = models.ForeignKey('self', related_name="past_names",
-                                      verbose_name=_('current location'), null=True, blank=True)
+                                      verbose_name=_('current location'), null=True, blank=True, on_delete=models.SET_NULL)
     latitude         = models.FloatField(null=True)
     longitude        = models.FloatField(null=True)
     is_authoritative = models.BooleanField(_('authoritative'), default=False)
@@ -233,7 +232,7 @@ class CourseType(Model):
 class Course(Model):
 
     department      = ForeignKey('Department', related_name='course',
-                                 verbose_name=_('department'))
+                                 verbose_name=_('department'), on_delete=models.CASCADE)
     title           = CharField(_('title'), max_length=255)
     description     = CharField(_('description'), max_length=255, blank=True)
     code            = CharField(_('code'), max_length=255)
@@ -244,11 +243,11 @@ class Course(Model):
     magistral       = BooleanField(_('magistral'))
     types           = ManyToManyField('CourseType', related_name="course",
                                         verbose_name=_('types'),
-                                        blank=True, null=True)
+                                        blank=True)
     private         = models.BooleanField(_('private'), help_text="Hide in shop", default=False)
     
 
-    notes = generic.GenericRelation(Note)
+    notes = GenericRelation(Note)
 
     def __unicode__(self):
         return self.title
@@ -290,7 +289,7 @@ class CourseDomain(Model):
     name            = CharField(_('name'), max_length=255)
     courses         = ManyToManyField('Course', related_name="domain",
                                         verbose_name=_('courses'),
-                                        blank=True, null=True)
+                                        blank=True)
 
     def __unicode__(self):
         return self.name
@@ -303,10 +302,10 @@ class CourseDomain(Model):
 class Professor(Model):
 
     user            = ForeignKey(User, related_name='professor',
-                                 verbose_name=_('user'), unique=True)
+                                 verbose_name=_('user'), unique=True, on_delete=models.CASCADE)
     courses         = ManyToManyField('Course', related_name="professor",
                                         verbose_name=_('courses'),
-                                        blank=True, null=True)
+                                        blank=True)
     title           = CharField(_('title'), max_length=255)
     portrait = models.ImageField(verbose_name=_("portrait"),
                                     upload_to="professors",
@@ -336,7 +335,7 @@ class Professor(Model):
 
 class Room(Model):
 
-    organization    = ForeignKey('Organization', related_name='room', verbose_name=_('organization'))
+    organization    = ForeignKey('Organization', related_name='room', verbose_name=_('organization'), on_delete=models.CASCADE)
     name            = CharField(_('name'), max_length=255)
     description     = CharField(_('description'), max_length=255, blank=True)
 
@@ -376,7 +375,7 @@ class LiveStream(Model):
                                 verbose_name=_('conference'),
                                 blank=True, null=True, on_delete=models.SET_NULL)
     server       = ForeignKey('StreamingServer', related_name='livestream',
-                                verbose_name=_('streaming server'))
+                                verbose_name=_('streaming server'), on_delete=models.CASCADE)
     stream_type  = CharField(_('Streaming type'),
                             choices=streaming_choices, max_length=32)
     streaming    = BooleanField(_('streaming'))
@@ -431,7 +430,7 @@ class MediaBase(ClonableMixin, Model):
     is_published    = BooleanField(_('published'))
     mime_type       = CharField(_('mime type'), max_length=255, blank=True)
     weight          = models.IntegerField(_('weight'), choices=WEIGHT_CHOICES, default=1, null=True, blank=True)
-    notes = generic.GenericRelation(Note)
+    notes = GenericRelation(Note)
 
     def get_fields(self):
         return self._meta.fields
@@ -462,19 +461,19 @@ class Document(MediaBase):
     course          = ForeignKey('Course', related_name='document', verbose_name=_('course'),
                                       blank=True, null=True, on_delete=models.SET_NULL)
     course_type     = ManyToManyField('CourseType', related_name='document',
-                                      verbose_name=_('course type'), blank=True, null=True)
+                                      verbose_name=_('course type'), blank=True)
     conference      = ForeignKey('Conference', related_name='document', verbose_name=_('conference'),
                                  blank=True, null=True, on_delete=models.SET_NULL)
     period          = ForeignKey('Period', related_name='document', verbose_name=_('period'),
                                  null=True, blank=True, on_delete=models.SET_NULL)
     type            = ForeignKey('DocumentType', related_name='document', verbose_name=_('type'),
-                                 blank=True, null=True)
+                                 blank=True, null=True, on_delete=models.SET_NULL)
     is_annal        = BooleanField(_('annal'))
     rank            = models.IntegerField(_('rank'), blank=True, null=True)
     file            = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename",
                                  blank=True, max_length=1024)
     readers         = ManyToManyField(User, related_name="document", verbose_name=_('readers'),
-                                        blank=True, null=True)
+                                        blank=True)
 
     def is_image(self):
         is_url_image = False
@@ -527,7 +526,7 @@ class MediaTranscoded(Model):
 
     element_type = 'transcoded item'
 
-    item            = models.ForeignKey('Media', related_name="transcoded", verbose_name=_('item'))
+    item            = models.ForeignKey('Media', related_name="transcoded", verbose_name=_('item'), on_delete=models.CASCADE)
     mimetype        = models.CharField(_('mime_type'), max_length=255, blank=True)
     date_added      = DateTimeField(_('date'), auto_now_add=True)
     status          = models.IntegerField(_('status'), choices=ITEM_TRANSODING_STATUS, default=1)
@@ -566,18 +565,18 @@ class Media(MediaBase):
     conference      = ForeignKey('Conference', related_name='media', verbose_name=_('conference'),
                                  blank=True, null=True, on_delete=models.SET_NULL)
     course          = ForeignKey('Course', related_name='media', verbose_name=_('course'),
-                                 blank=True, null=True)
+                                 blank=True, null=True, on_delete=models.SET_NULL)
     course_type     = ForeignKey('CourseType', related_name='media', verbose_name=_('course type'),
-                                 blank=True, null=True)
+                                 blank=True, null=True, on_delete=models.SET_NULL)
     period          = ForeignKey('Period', related_name='media', verbose_name=_('period'),
                                  null=True, blank=True, on_delete=models.SET_NULL)
     if HAS_TELEMETA:
         item            = models.ForeignKey(MediaItem, related_name='media',
-                                    verbose_name='item', blank=True, null=True)                                 
+                                    verbose_name='item', blank=True, null=True, on_delete=models.SET_NULL)                                 
     type            = CharField(_('type'), choices=streaming_choices, max_length=32)
     rank            = IntegerField(_('rank'), blank=True, null=True)
     readers         = ManyToManyField(User, related_name="media", verbose_name=_('readers'),
-                                        blank=True, null=True)
+                                        blank=True)
     file            = models.FileField(_('file'), upload_to='items/%Y/%m/%d', max_length=1024, null=True, blank=False)
     poster_file     = models.FileField(_('poster file'), upload_to='items/%Y/%m/%d', max_length=255, null=True, blank=False)
 
@@ -633,10 +632,10 @@ class Media(MediaBase):
 class SuggestionsMixin(Model):
     suggested_seminars = models.ManyToManyField('Seminar', related_name="%(class)ss_related",
                                                 verbose_name=_('suggested seminars'),
-                                                blank=True, null=True)
+                                                blank=True)
     suggested_conferences = models.ManyToManyField('Conference', related_name="%(class)ss_related",
                                                    verbose_name=_('suggested conferences'),
-                                                   blank=True, null=True)
+                                                   blank=True)
                                                    
     class Meta(MetaCore):
         abstract = True
@@ -841,9 +840,9 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin)
                                  null=True, blank=True, on_delete=models.SET_NULL)
     period          = models.ForeignKey('Period', related_name='conference', verbose_name=_('period'),
                                  null=True, blank=True, on_delete=models.SET_NULL)
-    course          = models.ForeignKey('Course', related_name='conference', verbose_name=_('course'))
+    course          = models.ForeignKey('Course', related_name='conference', verbose_name=_('course'), on_delete=models.CASCADE)
     course_type     = models.ForeignKey('CourseType', related_name='conference', verbose_name=_('course type'),
-                                 null=True, blank=True)
+                                 null=True, blank=True, on_delete=models.SET_NULL)
     professor       = models.ForeignKey('Professor', related_name='conference', verbose_name=_('professor'),
                                  blank=True, null=True, on_delete=models.SET_NULL)
     session         = models.CharField(_('session'), choices=session_choices,
@@ -854,7 +853,7 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin)
     location        = models.ForeignKey(Location, related_name='location', verbose_name=_('location'), on_delete=models.SET_NULL, blank=True, null=True)
     city            = models.ForeignKey(Location, related_name='city', verbose_name=_('city'), on_delete=models.SET_NULL, blank=True, null=True)
     room            = models.ForeignKey('Room', related_name='conference', verbose_name=_('room'),
-                                 null=True, blank=True)
+                                 null=True, blank=True, on_delete=models.SET_NULL)
     comment         = ShortTextField(_('comment'), max_length=255, blank=True)
     date_begin      = models.DateTimeField(_('begin date'), null=True, blank=True)
     date_end        = models.DateTimeField(_('end date'), null=True, blank=True)
@@ -862,12 +861,12 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin)
     price           = models.FloatField(_('price'), blank=True, null=True)
     approved        = models.BooleanField(_('approved'), default=True)
     readers         = models.ManyToManyField(User, related_name="conference", verbose_name=_('readers'),
-                                        blank=True, null=True)
+                                        blank=True)
     docs_description = models.ManyToManyField(Document, related_name="conference_docs_description",
                                         verbose_name=_('description documents'),
-                                        blank=True, null=True)
+                                        blank=True)
 
-    notes           = generic.GenericRelation(Note)
+    notes           = GenericRelation(Note)
 
     additional_info         = tinymce.models.HTMLField(
                                     "Informations complémentaires", 
index 41d823f444cabaad9e3c11cf1eb6d66e6302ffa0..994e6212eac3b0ef9d3e28158fe291a4940036a4 100644 (file)
@@ -61,34 +61,34 @@ class Training(Model):
     code            = CharField(_('code'), max_length=255)
     name            = CharField(_('name'), max_length=255, blank=True)
     period          = ForeignKey('Period', related_name='training', verbose_name=_('period'),
-                                 blank=True, null=True)
+                                 blank=True, null=True, on_delete=models.SET_NULL)
     synthesis_note  = ManyToManyField('CourseType', related_name="training_synthesis_note",
                                         verbose_name=_('synthesis note'),
-                                        blank=True, null=True)
+                                        blank=True)
     obligation      = ManyToManyField('CourseType', related_name="training_obligation",
                                         verbose_name=_('obligations'),
-                                        blank=True, null=True)
+                                        blank=True)
     procedure       = ManyToManyField('CourseType', related_name="training_procedure",
                                         verbose_name=_('procedure'),
-                                        blank=True, null=True)
+                                        blank=True)
     written_speciality = ManyToManyField('CourseType', related_name="training_written_speciality",
                                         verbose_name=_('written speciality'),
-                                        blank=True, null=True)
+                                        blank=True)
     oral_speciality = ManyToManyField('CourseType', related_name="training_oral_speciality",
                                         verbose_name=_('oral speciality'),
-                                        blank=True, null=True)
+                                        blank=True)
     oral_1          = ManyToManyField('CourseType', related_name="training_oral_1",
                                         verbose_name=_('oral 1'),
-                                        blank=True, null=True)
+                                        blank=True)
     oral_2          = ManyToManyField('CourseType', related_name="training_oral_2",
                                         verbose_name=_('oral 2'),
-                                        blank=True, null=True)
+                                        blank=True)
     options         = ManyToManyField('CourseType', related_name="training_options",
                                         verbose_name=_('options'),
-                                        blank=True, null=True)
+                                        blank=True)
     magistral       = ManyToManyField('CourseType', related_name="training_magistral",
                                         verbose_name=_('magistral'),
-                                        blank=True, null=True)
+                                        blank=True)
     cost            = FloatField(_('cost'), blank=True, null=True)
 
     def __unicode__(self):
@@ -104,28 +104,28 @@ class Training(Model):
 
 class Student(Model):
 
-    user            = ForeignKey(User, related_name='student', verbose_name=_('user'), unique=True )
+    user            = ForeignKey(User, related_name='student', verbose_name=_('user'), unique=True, on_delete=models.CASCADE)
     period          = ManyToManyField('Period', related_name='student', verbose_name=_('period'),
-                                  blank=True, null=True)
+                                  blank=True)
     iej             = ForeignKey('IEJ', related_name='student', verbose_name=_('iej'),
                                  blank=True, null=True, on_delete=models.SET_NULL)
-    training        = ForeignKey('Training', related_name='student', verbose_name=_('training'))
+    training        = ForeignKey('Training', related_name='student', verbose_name=_('training'), on_delete=models.CASCADE)
     platform_only   = BooleanField(_('platform only'))
     procedure       = ForeignKey('Course', related_name="procedure",
                                         verbose_name=_('procedure'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     written_speciality = ForeignKey('Course', related_name="written_speciality",
                                         verbose_name=_('written speciality'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     oral_speciality = ForeignKey('Course', related_name="oral_speciality",
                                         verbose_name=_('oral speciality'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     oral_1          = ForeignKey('Course', related_name="oral_1", verbose_name=_('oral 1'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     oral_2          = ForeignKey('Course', related_name="oral_2", verbose_name=_('oral 2'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     options         = ForeignKey('Course', related_name="options", verbose_name=_('options'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
 
     def __unicode__(self):
         try:
@@ -139,21 +139,21 @@ class Student(Model):
         ordering = ['user__last_name']
 
 
-class Profile(models.Model):
-    "User profile extension"
+class Profile(models.Model):
+    "User profile extension"
 
-    user            = ForeignKey(User, related_name='profile', verbose_name=_('user'), unique=True)
-    address         = TextField(_('Address'), blank=True)
-    postal_code     = CharField(_('Postal code'), max_length=255, blank=True)
-    city            = CharField(_('City'), max_length=255, blank=True)
-    country         = CharField(_('Country'), max_length=255, blank=True)
-    language        = CharField(_('Language'), max_length=255, blank=True)
-    telephone       = CharField(_('Telephone'), max_length=255, blank=True)
-    expiration_date = DateField(_('Expiration_date'), blank=True, null=True)
-    init_password   = BooleanField(_('Password initialized'))
+#     user            = ForeignKey(User, related_name='profile', verbose_name=_('user'), unique=True, on_delete=models.CASCADE)
+    address         = TextField(_('Address'), blank=True)
+    postal_code     = CharField(_('Postal code'), max_length=255, blank=True)
+    city            = CharField(_('City'), max_length=255, blank=True)
+    country         = CharField(_('Country'), max_length=255, blank=True)
+    language        = CharField(_('Language'), max_length=255, blank=True)
+    telephone       = CharField(_('Telephone'), max_length=255, blank=True)
+    expiration_date = DateField(_('Expiration_date'), blank=True, null=True)
+    init_password   = BooleanField(_('Password initialized'))
 
-    class Meta(MetaCore):
-        db_table = app_label + '_' + 'profiles'
-        verbose_name = _('profile')
+    class Meta(MetaCore):
+        db_table = app_label + '_' + 'profiles'
+        verbose_name = _('profile')
 
 
index 0d647cb90eb28587f42b66f11e222b350e11644a..27db37ea9046c6dcb1cfbb208c838df81dfac6fc 100644 (file)
@@ -63,10 +63,10 @@ class Seminar(ClonableMixin, Displayable, ProductCodeMixin, SuggestionsMixin):
     private         = models.BooleanField(_('private'), default=False)
     upcoming        = models.BooleanField("A venir (shop)", default=False)
     type            = models.ForeignKey(SeminarType, related_name='seminar', verbose_name=_('type'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     period          = ForeignKey('Period', related_name='seminar', verbose_name=_('period'),
                                  null=True, blank=True, on_delete=models.SET_NULL)
-    course          = models.ForeignKey(Course, related_name='seminar', verbose_name=_('course'))
+    course          = models.ForeignKey(Course, related_name='seminar', verbose_name=_('course'), on_delete=models.CASCADE)
     rank            = models.IntegerField(_('rank'), blank=True, null=True)
     sub_title       = models.CharField(_('sub title'), max_length=1024, blank=True)
     concerned       = models.CharField(_('public concerned'), max_length=1024, blank=True)
@@ -77,27 +77,27 @@ class Seminar(ClonableMixin, Displayable, ProductCodeMixin, SuggestionsMixin):
     index           = tinymce.models.HTMLField(_('index'), blank=True)
     duration        = DurationField(_('approximative duration'))
     professor       = models.ManyToManyField('Professor', related_name='seminar',
-                                            verbose_name=_('professor'), blank=True, null=True)
+                                            verbose_name=_('professor'), blank=True)
     docs_description = models.ManyToManyField(Document, related_name="seminar_docs_description",
                                         verbose_name=_('description documents'),
-                                        blank=True, null=True)
+                                        blank=True)
     docs_1          = models.ManyToManyField(Document, related_name="seminar_docs_1",
                                         verbose_name=_('documents 1'),
-                                        blank=True, null=True)
+                                        blank=True)
     medias          = models.ManyToManyField(Media, related_name="seminar",
                                         verbose_name=_('media'),
-                                        blank=True, null=True)
+                                        blank=True)
     media_preview  = models.ForeignKey(Media, related_name="seminar_preview",
                                         verbose_name=_('media_preview'),
                                         blank=True, null=True, on_delete=models.SET_NULL)
     docs_2          = models.ManyToManyField(Document, related_name="seminar_docs_2",
                                         verbose_name=_('documents 2'),
-                                        blank=True, null=True)
+                                        blank=True)
     docs_correct    = models.ManyToManyField(Document, related_name="seminar_docs_correct",
                                         verbose_name=_('corrected documents'),
-                                        blank=True, null=True)
+                                        blank=True)
     form            = models.ForeignKey(Form, related_name='seminar', verbose_name=_('form'),
-                                        blank=True, null=True)
+                                        blank=True, null=True, on_delete=models.SET_NULL)
     conference      = models.ForeignKey('Conference', related_name='seminar',
                                         verbose_name=_('conference'),
                                         blank=True, null=True, on_delete=models.SET_NULL)
@@ -234,7 +234,7 @@ class Question(ClonableMixin, models.Model):
 
     element_type = 'question'
 
-    seminar     = models.ForeignKey(Seminar, related_name="question", verbose_name=_('seminar'))
+    seminar     = models.ForeignKey(Seminar, related_name="question", verbose_name=_('seminar'), on_delete=models.CASCADE)
     title       = models.CharField(_('title'), max_length=255, blank=True)
     description = models.CharField(_('description'), max_length=1024, blank=True)
     question    = tinymce.models.HTMLField(_('question'), blank=True)
@@ -254,8 +254,8 @@ class Question(ClonableMixin, models.Model):
 
 class Answer(models.Model):
 
-    user        = models.ForeignKey(User, related_name="answer", verbose_name=_('user'))
-    question    = models.ForeignKey(Question, related_name="answer", verbose_name=_('question'))
+    user        = models.ForeignKey(User, related_name="answer", verbose_name=_('user'), on_delete=models.CASCADE)
+    question    = models.ForeignKey(Question, related_name="answer", verbose_name=_('question'), on_delete=models.CASCADE)
     answer      = models.TextField(_('answer'))
     status      = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=2)
     treated     = models.BooleanField(_('treated'))
@@ -288,11 +288,11 @@ class Answer(models.Model):
 class TestimonialTemplate(models.Model):
 
     organization = models.ForeignKey(Organization, related_name='testimonial_template',
-                                 verbose_name=_('organization'))
+                                 verbose_name=_('organization'), on_delete=models.CASCADE)
     description  = models.TextField(_('description'), blank=True)
     comments     = models.TextField(_('comments'), blank=True)
     document     = models.ForeignKey(Document, related_name="testimonial_template",
-                                verbose_name=_('template'))
+                                verbose_name=_('template'), on_delete=models.CASCADE)
 
     def __unicode__(self):
         return ' - '.join([self.organization.name, self.description])
@@ -309,7 +309,7 @@ class Testimonial(models.Model):
     user        = models.ForeignKey(User, related_name="testimonial", verbose_name=_('user'),
                                     blank=True, null=True, on_delete=models.SET_NULL)
     template    = models.ForeignKey(TestimonialTemplate, related_name="testimonial",
-                                    verbose_name=_('template'), blank=True, null=True)
+                                    verbose_name=_('template'), blank=True, null=True, on_delete=models.SET_NULL)
     file        = models.FileField(_('file'), upload_to='testimonials/%Y/%m',
                                  blank=True, max_length=1024)
     date_added  = models.DateTimeField(_('date added'), auto_now_add=True, null=True)
@@ -350,13 +350,13 @@ class Testimonial(models.Model):
 
 class Auditor(models.Model):
 
-    user            = models.ForeignKey(User, related_name='auditor', verbose_name=_('user'), unique=True)
+    user            = models.ForeignKey(User, related_name='auditor', verbose_name=_('user'), unique=True, on_delete=models.CASCADE)
     seminars        = models.ManyToManyField('Seminar', related_name="auditor",
                                         verbose_name=_('seminars'),
-                                        blank=True, null=True)
+                                        blank=True)
     conferences     = models.ManyToManyField(Conference, related_name="auditor",
                                         verbose_name=_('conferences'),
-                                        blank=True, null=True)
+                                        blank=True)
 
     platform_only   = models.BooleanField(_('platform only'))
     status          = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=2)
@@ -398,8 +398,8 @@ class Auditor(models.Model):
 
 class SeminarRevision(models.Model):
 
-    seminar     = models.ForeignKey(Seminar, related_name="revision", verbose_name=_('seminar'))
-    user        = models.ForeignKey(User, related_name="revision", verbose_name=_('user'))
+    seminar     = models.ForeignKey(Seminar, related_name="revision", verbose_name=_('seminar'), on_delete=models.CASCADE)
+    user        = models.ForeignKey(User, related_name="revision", verbose_name=_('user'), on_delete=models.CASCADE)
     date        = models.DateTimeField(_('date added'), auto_now_add=True, null=True)
     date_modified  = models.DateTimeField(_('date modified'), blank=True, null=True)
 
@@ -421,7 +421,7 @@ class SeminarRevision(models.Model):
 
 class QuizValidation(models.Model):
 
-    user        = models.ForeignKey(User, related_name="quiz_validation", verbose_name=_('user'))
+    user        = models.ForeignKey(User, related_name="quiz_validation", verbose_name=_('user'), on_delete=models.CASCADE)
     quiz        = models.ForeignKey(Quiz, related_name="quiz_validation", verbose_name=_('quiz'),
                     blank=True, null=True, on_delete=models.SET_NULL)
     validated   = models.BooleanField(_('validated'))
@@ -443,5 +443,3 @@ class QuizValidation(models.Model):
         verbose_name = _('Quiz validation')
         ordering = ['-date_validated']
 
-from south.modelsinspector import add_introspection_rules
-add_introspection_rules([], ["^tinymce\.models\.HTMLField"])
index 48b7b8dfe9a1fcbebd332576188a8ef789938026..67f5ef6fe04d0645fea3c1304067c1f3c5171573 100644 (file)
@@ -7,12 +7,12 @@ class UserProfile(models.Model):
     "User profile extension"
 
     user            = models.ForeignKey(User, on_delete=models.CASCADE,  unique=True, related_name="profile")
-    institution     = models.CharField(_('Institution'))
-    department      = models.CharField(_('Department'))
-    attachment      = models.CharField(_('Attachment'))
-    function        = models.CharField(_('Function'))
+    institution     = models.CharField(_('Institution'), max_length=255)
+    department      = models.CharField(_('Department'), max_length=255)
+    attachment      = models.CharField(_('Attachment'), max_length=255)
+    function        = models.CharField(_('Function'), max_length=255)
     address         = models.TextField(_('Address'))
-    telephone       = models.CharField(_('Telephone'))
+    telephone       = models.CharField(_('Telephone'), max_length=255)
     expiration_date = models.DateField(_('Expiration_date'))
 
     class Meta(MetaCore):
index eef23a3bb120cf9adb2b1ebfff9ce7216632105c..1bbb91cd4b114f9549c7f532931808a30400f0da 100644 (file)
 # Authors: Guillaume Pellerin <yomguy@parisson.com>
 
 from django import template
-from urllib.parse import quote
 from teleforma.models import *
-from django.core.urlresolvers import reverse
-from django.utils import html
+from django.urls import reverse
 from django import template
-from django.utils.text import capfirst
-from django.utils.translation import ngettext
 from docutils.core import publish_parts
-from django.utils.encoding import smart_str, force_unicode
+from django.utils.encoding import smart_str, force_text
 from django.utils.safestring import mark_safe
-from django import db
 import re
 import os
 import datetime
 from django.conf import settings
-from django.template.defaultfilters import stringfilter
-import django.utils.timezone as timezone
 from django.utils.translation import gettext_lazy as _
 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
-
 from teleforma.models.crfpa import Course
 from teleforma.views import get_courses
 from teleforma.context_processors import *
@@ -155,31 +144,31 @@ def from_periods(contents, periods):
     if contents:
         return contents.filter(period__in=periods)
 
-@register.assignment_tag
+@register.simple_tag
 def get_all_professors():
     return Professor.objects.all().order_by('user__first_name')
 
-@register.assignment_tag
+@register.simple_tag
 def get_all_admins():
     return User.objects.filter(is_superuser=True).order_by('first_name')
 
-@register.assignment_tag
+@register.simple_tag
 def get_all_trainings():
     return Training.objects.all()
 
-@register.assignment_tag
+@register.simple_tag
 def get_all_iejs():
     return IEJ.objects.all()
 
-@register.assignment_tag
+@register.simple_tag
 def get_all_courses():
     return Course.objects.all()
 
-@register.assignment_tag
+@register.simple_tag
 def get_telecaster():
     return 'telecaster' in settings.INSTALLED_APPS
 
-@register.assignment_tag
+@register.simple_tag
 def get_googletools():
     return 'googletools' in settings.INSTALLED_APPS
 
@@ -422,5 +411,5 @@ def render_flatpage(content):
         parsed += line + "\n"
 
     parts = publish_parts(source=smart_str(parsed), writer_name="html4css1", settings_overrides={})
-    return mark_safe('<div class="rst-content">\n' + force_unicode(parts["html_body"]) + '</div>')
+    return mark_safe('<div class="rst-content">\n' + force_text(parts["html_body"]) + '</div>')
 render_flatpage.is_safe = True
\ No newline at end of file
index 7613127fb0946a1d21b56094237e7a07594d5af4..5d9cb8bd2f54b9c4a9d59af20799e218e93fd026 100644 (file)
 # Authors: Guillaume Pellerin <yomguy@parisson.com>
 
 import os.path
-from django.conf.urls.defaults import patterns, url, include
+from django.conf.urls import url, include
 from jsonrpc import jsonrpc_site
+from django.contrib.auth.views import (LoginView, LogoutView,
+                                       PasswordChangeDoneView,
+                                       PasswordChangeView,
+                                       PasswordContextMixin,
+                                       PasswordResetCompleteView,
+                                       PasswordResetConfirmView,
+                                       PasswordResetDoneView,
+                                       PasswordResetView)
+from django.views import static
 from teleforma.views.core import ConferenceRecordView, ConferenceView, CourseView, HelpView, MediaTranscodedView, MediaView, join_webclass
 from teleforma.views.crfpa import UserLoginView, UsersCourseView, UsersIejView, UsersTrainingView, UsersView, UsersXLSExport
 from teleforma.views.pro import AnswerDetailView, AnswerDetailViewTest, AnswerView, AnswersPendingView, AnswersTreatedView, QuizQuestionView, SeminarDocumentDownloadView, SeminarDocumentView, SeminarMediaView, SeminarView, SeminarsView, TestimonialDownloadView, TestimonialKnowledgeView, TestimonialListView, TestimonialPaybackView, TestimonialView, evaluation_form_detail, webclass_bbb_webhook
@@ -48,15 +57,15 @@ media = MediaView()
 home_view = HomeView()
 media_transcoded = MediaTranscodedView
 
-urlpatterns = patterns('',
-
+urlpatterns = [
     url(r'^$', SeminarsView.as_view(), name="home"),
     # login / logout
-    url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'teleforma/login.html'},
+    url(r'^login/$', LoginView.as_view(template_name='registration/login.html'),
         name="teleforma-login"),
-    url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'registration/login.html'},
+    url(r'^accounts/login/$', LoginView.as_view(template_name='registration/login.html'),
         name="teleforma-login"),
-    url(r'^logout/$', 'django.contrib.auth.views.logout', name="teleforma-logout"),
+    url(r'^logout/$', LogoutView.as_view(),
+        name="teleforma-logout"),
 
     url(r'^users/(?P<username>[A-Za-z0-9+@._-]+)/profile/$', profile_view.profile_detail,
                                name="teleforma-profile-detail"),
@@ -64,17 +73,23 @@ urlpatterns = patterns('',
     url(r'^accounts/(?P<username>[A-Za-z0-9+@._-]+)/profile/edit/$', profile_view.profile_edit, name="teleforma-profile-edit"),
     
     # Registration
-    url(r'^accounts/password_change/$', 'django.contrib.auth.views.password_change', {'template_name': 'registration/password_change_form.html'}, name="teleforma-password-change"),
-    url(r'^accounts/password_change_done/$', 'django.contrib.auth.views.password_change_done', {'template_name': 'registration/password_change_done.html'}, name="teleforma-password-change-done"),
-
-    url(r'^accounts/password_reset/$', 'django.contrib.auth.views.password_reset', {'template_name': 'registration/password_reset_form.html', 'email_template_name': 'registration/password_reset_email.html'}, name="teleforma-password-reset"),
-    url(r'^accounts/password_reset_done/$', 'django.contrib.auth.views.password_reset_done', {'template_name': 'registration/password_reset_done.html'}, name="teleforma-password-reset-done"),
-    url(r'^accounts/password_reset_confirm/(?P<uidb36>[A-Za-z0-9._-]+)/(?P<token>[A-Za-z0-9._-]+)/$', 'django.contrib.auth.views.password_reset_confirm', {'template_name': 'registration/password_reset_confirm.html'}, name="teleforma-password-reset-confirm"),
-    url(r'^accounts/password_reset_complete/$', 'django.contrib.auth.views.password_reset_complete', {'template_name': 'registration/password_reset_complete.html'}, name="teleforma-password-reset-complete"),
-    url(r'^accounts/password_reset_complete/$', 'django.contrib.auth.views.password_reset_complete', {'template_name': 'registration/password_reset_complete.html'}, name="teleforma-password-reset-complete"),
 
-
-    url(r'^captcha/', include('captcha.urls')),
+    # Registration
+    url(r'^accounts/password_change/$', PasswordChangeView.as_view(template_name='registration/password_change_form.html'),
+        name="teleforma-password-change"),
+    url(r'^accounts/password_change_done/$', PasswordChangeDoneView.as_view(
+        template_name='registration/password_change_done.html'), name="password_change_done"),
+
+    url(r'^accounts/password_reset/$', PasswordResetView.as_view(template_name='registration/password_reset_form.html',
+                                                                 email_template_name='registration/password_reset_email.html'), name="teleforma-password-reset"),
+    url(r'^accounts/password_reset_done/$', PasswordResetDoneView.as_view(
+        template_name='registration/password_reset_done.html'), name="password_reset_done"),
+    url(r'accounts/password_reset_confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(
+        template_name='registration/password_reset_confirm.html'), name="teleforma-password-reset-confirm"),
+    url(r'^accounts/password_reset_complete/$', PasswordResetCompleteView.as_view(template_name='registration/password_reset_complete.html'),
+        name="password_reset_complete"),
+
+    # url(r'^captcha/', include('captcha.urls')),
 
     # Help
     url(r'^help/$', HelpView.as_view(), name="teleforma-help"),
@@ -165,13 +180,13 @@ urlpatterns = patterns('',
 
 
 # CSS+Images (FIXME: for developement only)
-    url(r'^teleforma/css/(?P<path>.*)$', 'django.views.static.serve',
+    url(r'^teleforma/css/(?P<path>.*)$', static.serve,
         {'document_root': htdocs_forma+'css'},
         name="teleforma-css"),
-    url(r'images/(?P<path>.*)$', 'django.views.static.serve',
+    url(r'images/(?P<path>.*)$', static.serve,
         {'document_root': htdocs_forma+'images'},
         name="teleforma-images"),
-    url(r'^js/(?P<path>.*)$', 'django.views.static.serve',
+    url(r'^js/(?P<path>.*)$', static.serve,
         {'document_root': htdocs_forma+'js'},
         name="teleforma-js"),
 
@@ -181,7 +196,7 @@ urlpatterns = patterns('',
 #    url(r'^private_files/', include('private_files.urls')),
 
     # JQCHAT
-    url(r'^', include('jqchat.urls')),
+    url(r'^', include('jqchat.urls')),
 
     url(r'^tinymce/', include('tinymce.urls')),
 
@@ -190,4 +205,4 @@ urlpatterns = patterns('',
     # Webclass hook
     url(r'^webclass_bbb_webhook/', webclass_bbb_webhook,
         name="webclass_bbb_webhook"),
-)
+]
index 229032f884fdd46b90ccffb99d52bca71b0c5298..8f0ca2f52d09f45dc2e67f2a499a88264177305c 100644 (file)
 #
 # Authors: Guillaume Pellerin <yomguy@parisson.com>
 
-import mimetypes
 import datetime
-from datetime import timedelta
-import random
-import urllib.request, urllib.parse, urllib.error
-import urllib.request, urllib.error, urllib.parse
+import io
 import json
+import mimetypes
 import os
-import io
-import datetime
-
-from jsonrpc import jsonrpc_method
+import random
+import urllib.error
+import urllib.parse
+import urllib.request
+from datetime import timedelta
 
-from django.utils.decorators import method_decorator
-from django.contrib.auth import authenticate, login, get_backends
-from django.template import RequestContext, loader
-from django import template
-from django.http import HttpResponse, HttpResponseRedirect
-from django.http import Http404
-from django.shortcuts import render_to_response, redirect, get_object_or_404, render
-from django.views.generic import *
-from django.views.generic.base import *
 from django.conf import settings
-from django.contrib import auth
 from django.contrib import messages
 from django.contrib.auth.decorators import login_required, permission_required
-from django.core.context_processors import csrf
-from django.forms.models import modelformset_factory, inlineformset_factory
 from django.contrib.auth.models import User
-from django.utils.translation import gettext
-from django.utils.translation import gettext_lazy as _
-from django.contrib.auth.forms import UserChangeForm
-from django.core.exceptions import ObjectDoesNotExist
-from django.contrib.syndication.views import Feed
-from django.core.paginator import Paginator
-from django.core.urlresolvers import resolve
-from django.contrib.auth.decorators import login_required
 from django.contrib.contenttypes.models import ContentType
+from django.http import Http404, HttpResponse
+from django.shortcuts import redirect
+from django.urls import resolve, reverse
+from django.utils.decorators import method_decorator
+from django.utils.translation import gettext_lazy as _
+from django.views.generic import *
+from django.views.generic.base import *
 from django.views.generic.edit import FormView
-from django.core.urlresolvers import reverse, reverse_lazy
-from django.template.loader import get_template
-from django.template.context import Context
-from django.utils.html import escape
-
+from jsonrpc import jsonrpc_method
 from jsonrpc.proxy import ServiceProxy
-
-from teleforma.models import *
-from teleforma.forms import *
 from teleforma.context_processors import *
+from teleforma.forms import *
+from teleforma.models import *
+
 from . import pages
-import jqchat.models
-from xlwt import Workbook
 
 try:
     from telecaster.models import *
@@ -223,7 +202,7 @@ class CourseListView(ListView):
 
     @jsonrpc_method('teleforma.get_course_list')
     def get_course_list(request, organization_name, department_name):
-        from teleforma.models import Organization, Department
+        from teleforma.models import Department, Organization
         organization = Organization.objects.get(name=organization_name)
         department = Department.objects.get(organization=organization, name=department_name)
         return [course.to_dict() for course in Course.objects.filter(department=department)]
index 36c7024d7f436d5d2fed336d6d09509306276521..abf2f4370233b4b2f692719135f49bcd9db7f95e 100644 (file)
@@ -43,22 +43,16 @@ from django.views.generic.base import TemplateResponseMixin
 from django.http import HttpResponse
 from django.conf import settings
 from django.shortcuts import render
-from django.template.loader import get_template
 from django.template.context import Context
 from django.utils.html import escape
-from django.views.generic.detail import SingleObjectMixin
-from django.core.mail import EmailMessage
 from django.template.loader import render_to_string
 
 import os, datetime
-from cgi import escape
 from io import StringIO
 
 import weasyprint
 
-import time
 import json
-import csv
 
 from forms_builder.forms.forms import FormForForm
 from forms_builder.forms.models import Form
@@ -78,7 +72,7 @@ def content_to_pdf(content, dest, encoding='utf-8', **kwargs):
     print("Write PDF 2")
     src = StringIO(content.encode(encoding))
     src = weasyprint.HTML(string=content.encode(encoding), encoding=encoding)
-    dest.write_pdf(result)
+    dest.write_pdf(src)
     return True
 
 def content_to_response(content, filename=None):