DEBUG_ENV = os.environ.get('DEBUG') == 'True'
DEBUG = DEBUG_ENV
+TESTING = False # mezzanine
TEMPLATE_DEBUG = DEBUG
RECOVERY = True
'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'
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'django.contrib.redirects',
'django_comments',
"mezzanine.boot",
"mezzanine.conf",
# "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',
'pbcart',
# 'telemeta',
# 'telecaster',
- # 'forms_builder.forms',
+ 'forms_builder.forms',
'quiz',
'multichoice',
'true_false',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
+ 'mezzanine.pages.context_processors.page',
'teleforma.context_processors.periods',
-
],
},
},
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 = {
"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": {
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 #
##################
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()
# 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 [])
# 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 \
#########
import os, sys
-from django.core.urlresolvers import reverse_lazy
+from django.urls import reverse_lazy
sys.dont_write_bytecode = True
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
pymemcache==3.4.4
ipython
Mezzanine==5.0.0
+# south
import time
from datetime import date
-class ProfileInline(admin.StackedInline):
- model = Profile
-
class CRFPAStudentProfileInline(admin.StackedInline):
model = Student
filter_horizontal = ['period']
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)
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):
)
return super(ShortTextField, self).formfield(**kwargs)
-add_introspection_rules([], ["^teleforma\.fields\.ShortTextField"])
+# add_introspection_rules([], ["^teleforma\.fields\.ShortTextField"])
# 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.
}
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'
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
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):
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
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
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
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
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:
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
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',
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)
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)
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
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
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",
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)
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'))
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
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
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)
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)
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
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,
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)
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",
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):
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:
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')
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)
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)
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)
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'))
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])
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)
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)
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)
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'))
verbose_name = _('Quiz validation')
ordering = ['-date_validated']
-from south.modelsinspector import add_introspection_rules
-add_introspection_rules([], ["^tinymce\.models\.HTMLField"])
"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):
# 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 *
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
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
# 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
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"),
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"),
# 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"),
# 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')),
# Webclass hook
url(r'^webclass_bbb_webhook/', webclass_bbb_webhook,
name="webclass_bbb_webhook"),
-)
+]
#
# 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 *
@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)]
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
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):