From bbbcdcb88719d666ef718b7b22ccd51ee498fa69 Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Wed, 22 Dec 2021 14:38:29 +0100 Subject: [PATCH] Migration to Django 3 in progress --- app/settings.py | 34 ++++++---- app/urls.py | 14 ++-- app/wsgi.sh | 2 +- example/settings.py | 2 +- requirements.txt | 7 ++ teleforma/admin.py | 3 - teleforma/bbb_utils.py | 2 +- teleforma/fields.py | 23 +++---- teleforma/forms.py | 4 ++ .../commands/teleforma-copy-seminars.py | 2 +- .../teleforma-import-seminar-media-update.py | 2 +- .../teleforma-import-seminar-media.py | 2 +- .../teleforma-import-seminars-preview.py | 2 +- teleforma/models/ae.py | 6 +- teleforma/models/core.py | 61 +++++++++-------- teleforma/models/crfpa.py | 66 +++++++++---------- teleforma/models/pro.py | 44 ++++++------- teleforma/models/profile.py | 10 +-- teleforma/templatetags/teleforma_tags.py | 31 +++------ teleforma/urls.py | 57 ++++++++++------ teleforma/views/core.py | 59 ++++++----------- teleforma/views/pro.py | 8 +-- 22 files changed, 212 insertions(+), 229 deletions(-) diff --git a/app/settings.py b/app/settings.py index 5f7092e5..97cd91f5 100644 --- a/app/settings.py +++ b/app/settings.py @@ -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 # ################## diff --git a/app/urls.py b/app/urls.py index e601f98d..41da7905 100644 --- a/app/urls.py +++ b/app/urls.py @@ -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 []) diff --git a/app/wsgi.sh b/app/wsgi.sh index 43859828..ca4238f8 100755 --- a/app/wsgi.sh +++ b/app/wsgi.sh @@ -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 \ diff --git a/example/settings.py b/example/settings.py index a89173e2..1161d1f0 100644 --- a/example/settings.py +++ b/example/settings.py @@ -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 diff --git a/requirements.txt b/requirements.txt index 31728b4b..ee71213c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/teleforma/admin.py b/teleforma/admin.py index 6bceda99..4e671555 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -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'] diff --git a/teleforma/bbb_utils.py b/teleforma/bbb_utils.py index 68d4e9f9..af8e2046 100644 --- a/teleforma/bbb_utils.py +++ b/teleforma/bbb_utils.py @@ -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) diff --git a/teleforma/fields.py b/teleforma/fields.py index eacf6813..30ca81b8 100644 --- a/teleforma/fields.py +++ b/teleforma/fields.py @@ -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 diff --git a/teleforma/forms.py b/teleforma/forms.py index 6936c714..fe75147e 100644 --- a/teleforma/forms.py +++ b/teleforma/forms.py @@ -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): diff --git a/teleforma/management/commands/teleforma-copy-seminars.py b/teleforma/management/commands/teleforma-copy-seminars.py index a9ef9477..8a44391d 100644 --- a/teleforma/management/commands/teleforma-copy-seminars.py +++ b/teleforma/management/commands/teleforma-copy-seminars.py @@ -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 diff --git a/teleforma/management/commands/teleforma-import-seminar-media-update.py b/teleforma/management/commands/teleforma-import-seminar-media-update.py index 029d7f16..0693e86d 100644 --- a/teleforma/management/commands/teleforma-import-seminar-media-update.py +++ b/teleforma/management/commands/teleforma-import-seminar-media-update.py @@ -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 diff --git a/teleforma/management/commands/teleforma-import-seminar-media.py b/teleforma/management/commands/teleforma-import-seminar-media.py index 1c229cc6..02660c14 100644 --- a/teleforma/management/commands/teleforma-import-seminar-media.py +++ b/teleforma/management/commands/teleforma-import-seminar-media.py @@ -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 diff --git a/teleforma/management/commands/teleforma-import-seminars-preview.py b/teleforma/management/commands/teleforma-import-seminars-preview.py index c9180353..d516cea9 100644 --- a/teleforma/management/commands/teleforma-import-seminars-preview.py +++ b/teleforma/management/commands/teleforma-import-seminars-preview.py @@ -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 diff --git a/teleforma/models/ae.py b/teleforma/models/ae.py index c824c067..eb97b879 100644 --- a/teleforma/models/ae.py +++ b/teleforma/models/ae.py @@ -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: diff --git a/teleforma/models/core.py b/teleforma/models/core.py index 84d29d77..5ef858af 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -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", diff --git a/teleforma/models/crfpa.py b/teleforma/models/crfpa.py index 41d823f4..994e6212 100644 --- a/teleforma/models/crfpa.py +++ b/teleforma/models/crfpa.py @@ -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') diff --git a/teleforma/models/pro.py b/teleforma/models/pro.py index 0d647cb9..27db37ea 100644 --- a/teleforma/models/pro.py +++ b/teleforma/models/pro.py @@ -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"]) diff --git a/teleforma/models/profile.py b/teleforma/models/profile.py index 48b7b8df..67f5ef6f 100644 --- a/teleforma/models/profile.py +++ b/teleforma/models/profile.py @@ -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): diff --git a/teleforma/templatetags/teleforma_tags.py b/teleforma/templatetags/teleforma_tags.py index eef23a3b..1bbb91cd 100644 --- a/teleforma/templatetags/teleforma_tags.py +++ b/teleforma/templatetags/teleforma_tags.py @@ -33,29 +33,18 @@ # Authors: Guillaume Pellerin 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('
\n' + force_unicode(parts["html_body"]) + '
') + return mark_safe('
\n' + force_text(parts["html_body"]) + '
') render_flatpage.is_safe = True \ No newline at end of file diff --git a/teleforma/urls.py b/teleforma/urls.py index 7613127f..5d9cb8bd 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -33,8 +33,17 @@ # Authors: Guillaume Pellerin 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[A-Za-z0-9+@._-]+)/profile/$', profile_view.profile_detail, name="teleforma-profile-detail"), @@ -64,17 +73,23 @@ urlpatterns = patterns('', url(r'^accounts/(?P[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[A-Za-z0-9._-]+)/(?P[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///', 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.*)$', 'django.views.static.serve', + url(r'^teleforma/css/(?P.*)$', static.serve, {'document_root': htdocs_forma+'css'}, name="teleforma-css"), - url(r'images/(?P.*)$', 'django.views.static.serve', + url(r'images/(?P.*)$', static.serve, {'document_root': htdocs_forma+'images'}, name="teleforma-images"), - url(r'^js/(?P.*)$', 'django.views.static.serve', + url(r'^js/(?P.*)$', 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"), -) +] diff --git a/teleforma/views/core.py b/teleforma/views/core.py index 229032f8..8f0ca2f5 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -32,58 +32,37 @@ # # Authors: Guillaume Pellerin -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)] diff --git a/teleforma/views/pro.py b/teleforma/views/pro.py index 36c7024d..abf2f437 100644 --- a/teleforma/views/pro.py +++ b/teleforma/views/pro.py @@ -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): -- 2.39.5