EMAIL_SUBJECT_PREFIX = "[PREFIX]" # prefix title in email
SITE_TITLE = 'Your Site'
SITE_TAGLINE = 'This is a Mezzo site'
+
+AWS_ACCESS_KEY_ID=""
+AWS_SECRET_ACCESS_KEY=""
+AWS_S3_ENCRYPTION=True
\ No newline at end of file
USE_TZ = False
-########################
+#################
# MEDIA / STATIC
-########################
+#################
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
#MEDIA_URL = 'http://pre-barreau.com/archives/'
MEDIA_URL = '/media/'
-DEFAULT_FILE_STORAGE='django.core.files.storage.FileSystemStorage'
-
FILE_UPLOAD_TEMP_DIR = '/tmp'
# Absolute path to the directory static files should be collected to.
"site_title": "CRFPA",
"site_header": "CRFPA",
"site_logo": "teleforma/images/logo_pb.png",
+ "site_brand": "Admin CRFPA",
# # Links to put along the top menu
# "topmenu_links": [
"sidebar_nav_legacy_style": False,
"sidebar_nav_flat_style": False,
"theme": "default",
- "dark_mode_theme": "darkly",
+ "default_theme_mode": "auto",
"button_classes": {
"primary": "btn-outline-primary",
"secondary": "btn-outline-secondary",
AWS_STORAGE_BUCKET_NAME=""
MEDIA_S3_BUCKET = '/media/bucket/'
+
+########################
+# STORAGES
+########################
+
+DEFAULT_FILE_STORAGE='django.core.files.storage.FileSystemStorage'
+
+STORAGES = {
+ "default": {
+ "BACKEND": "django.core.files.storage.FileSystemStorage",
+ "OPTIONS": {
+ },
+ },
+ "staticfiles": {
+ "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
+ },
+ "private_documents_s3": {
+ "BACKEND": "storages.backends.s3.S3Storage",
+ "OPTIONS": {
+ "bucket_name": "crfpa-private",
+ "region_name": "gra",
+ "endpoint_url": "https://s3.gra.io.cloud.ovh.net/",
+ },
+ },
+ "media_s3": {
+ "BACKEND": "storages.backends.s3.S3Storage",
+ "OPTIONS": {
+ "bucket_name": "pb-crfpa-medias",
+ "region_name": "eu-west-par",
+ "endpoint_url": "https://s3.eu-west-par.io.cloud.ovh.net/",
+ },
+ },
+}
+
+
+
########################
# TELEFORMA
########################
TELEFORMA_EXAM_USE_S3 = True
TELEFORMA_DOCUMENTS_USE_S3 = False
-
TELEFORMA_PRIVATE_DOCUMENTS_MODE = True #wether the downloaded docs should be signed
TELEFORMA_PRIVATE_DOCUMENTS_USE_S3 = True
-AWS_STORAGE_BUCKET_NAME_PRIVATE_DOCUMENT="crfpa-private"
-TELEFORMA_MEDIA_USE_S3 = False
TELEFORMA_MEDIA_DOWNLOAD = False
-AWS_STORAGE_BUCKET_NAME_MEDIA="crfpa-media"
+TELEFORMA_MEDIA_USE_S3 = True
+
ORAL_OPTION_PRICE = 250
FASICLE_OPTION_PRICE = 110
CORS_ALLOW_ALL_ORIGINS = False
+
##################
# LOCAL SETTINGS #
##################
-Subproject commit 70e1f1833f63cb9105659b431357be580cdfc659
+Subproject commit 1f161760779798d79a9c0c073f15044c2bcc6e46
class MediaAdmin(admin.ModelAdmin):
- def get_form(self, request, obj=None, **kwargs):
- form = super(MediaAdmin, self).get_form(request, obj, **kwargs)
- period = get_periods(request)
- form.base_fields['conference'].queryset = Conference.objects.filter(period=period)
- return form
+ # def get_form(self, request, obj=None, **kwargs):
+ # form = super(MediaAdmin, self).get_form(request, obj, **kwargs)
+ # period = get_periods(request)
+ # form.base_fields['conference'].queryset = Conference.objects.filter(period=period)
+ # return form
list_per_page = 30
exclude = ['readers']
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
-from django.core.files.storage import FileSystemStorage
+from django.core.files.storage import FileSystemStorage, storages
from django.db import models
from django.db.models.signals import post_save
from django.template.loader import render_to_string
cache_path = settings.MEDIA_ROOT + 'cache/'
script_path = settings.MEDIA_ROOT + 'scripts/'
-if settings.TELEFORMA_EXAM_USE_S3:
- storage = S3Boto3Storage
-else:
- storage = FileSystemStorage
+
+def script_storage():
+ if settings.TELEFORMA_EXAM_USE_S3:
+ return storages["private_documents_s3"]
+ else:
+ return storages["default"]
+
def sha1sum_file(filename):
upload_to='scripts/%Y/%m/%d',
max_length=1024,
blank=True,
- storage=storage
+ storage=script_storage
)
box_uuid = models.CharField(_('Box UUID'), max_length=256, blank=True)
score = models.FloatField(_('score'), blank=True,
--- /dev/null
+# Generated by Django 5.2.13 on 2026-05-02 15:04
+
+import django.core.files.storage
+import teleforma.models.core
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('teleforma', '0037_merge_20260114_1638'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='media',
+ name='file_s3',
+ field=models.FileField(blank=True, max_length=1024, null=True, storage=teleforma.models.core.media_storage, upload_to='items/%Y/%m/%d', verbose_name='S3 file'),
+ ),
+ migrations.AlterField(
+ model_name='documentprivate',
+ name='file',
+ field=models.FileField(blank=True, db_column='filename', max_length=1024, storage=teleforma.models.core.private_document_storage, upload_to='private/documents/%Y/%m/%d', verbose_name='file'),
+ ),
+ migrations.AlterField(
+ model_name='media',
+ name='file',
+ field=models.FileField(blank=True, max_length=1024, null=True, storage=django.core.files.storage.FileSystemStorage(), upload_to='items/%Y/%m/%d', verbose_name='file'),
+ ),
+ ]
from django.conf import settings
from django.contrib.auth.models import User
from django.core.files import File
-from django.core.files.storage import FileSystemStorage
+from django.core.files.storage import FileSystemStorage, storages
from django.core.paginator import InvalidPage
from django.db import models
from django.forms.fields import FileField
WEIGHT_CHOICES = get_nint_choices(5)
-if settings.TELEFORMA_MEDIA_USE_S3:
- media_s3_storage = S3Boto3Storage(
- bucket=settings.AWS_STORAGE_BUCKET_NAME_MEDIA)
- media_local_storage = FileSystemStorage
-else:
- media_s3_storage = FileSystemStorage
- media_local_storage = FileSystemStorage
+def private_document_storage():
+ if settings.TELEFORMA_PRIVATE_DOCUMENTS_USE_S3:
+ return storages["private_documents_s3"]
+ else:
+ return storages["default"]
+
-if settings.TELEFORMA_PRIVATE_DOCUMENTS_USE_S3:
- private_document_storage = S3Boto3Storage(
- bucket=settings.AWS_STORAGE_BUCKET_NAME_PRIVATE_DOCUMENT)
-else:
- private_document_storage = FileSystemStorage
+def media_storage():
+ if settings.TELEFORMA_MEDIA_USE_S3:
+ return storages["media_s3"]
+ else:
+ return storages["default"]
def get_random_hash():
max_length=1024,
null=True,
blank=True,
- storage=media_local_storage
+ storage=storages["default"]
)
file_s3 = models.FileField(
_('S3 file'),
max_length=1024,
null=True,
blank=True,
- storage=media_s3_storage
+ storage=media_storage,
)
poster_file = models.FileField(
_('poster file'), upload_to='items/%Y/%m/%d', max_length=255, null=True, blank=False)
if not settings.DEBUG:
if bucket:
- url = settings.MEDIA_S3_BUCKET + file.url.split(settings.AWS_S3_ENDPOINT_URL)[-1]
+ # url = settings.MEDIA_S3_BUCKET + file.url.split(settings.AWS_S3_ENDPOINT_URL)[-1]
+ return HttpResponseRedirect(file.url)
else:
- url = file.url
- return nginx_media_accel(url, content_type=content_type,
+ return nginx_media_accel(file.url, content_type=content_type,
buffering=buffering, streaming=streaming)
else:
- response = StreamingHttpResponse(
- stream_from_file(file.path), content_type=content_type)
- filename = os.path.basename(file.path)
- if not streaming:
- response['Content-Disposition'] = 'attachment; ' + \
- 'filename=' + filename
- return response
+ if bucket:
+ return HttpResponseRedirect(file.url)
+ else:
+ response = StreamingHttpResponse(
+ stream_from_file(file.path), content_type=content_type)
+ filename = os.path.basename(file.path)
+ if not streaming:
+ response['Content-Disposition'] = 'attachment; ' + \
+ 'filename=' + filename
+ return response
def nginx_media_accel(url, content_type="", buffering=True, streaming=False):
media = self.get_object()
if not media.mime_type:
media.set_mime_type()
+
+ if media.course:
+ course = media.course
+ else:
+ course = media.conference.course
+ if media.course_type:
+ course_type = media.course_type
+ else:
+ course_type = media.conference.course_type
+ if media.course:
+ room_name = media.course.code
+ else:
+ room_name = media.conference.course.code
+ if media.conference.web_class_group:
+ room_name += '_' + media.conference.public_id
+
context['mime_type'] = media.mime_type
- context['course'] = media.course
- context['type'] = media.course_type
+ context['course'] = course
+ context['type'] = course_type
# context['notes'] = media.notes.all().filter(author=self.request.user)
content_type = ContentType.objects.get(
app_label="teleforma", model="course")
- room_name = media.course.code
- if media.conference.web_class_group:
- room_name += '_' + media.conference.public_id
-
access = get_access(media, context['all_courses'])
if not access:
context['access_error'] = access_error
media_detail_url = request.build_absolute_uri(
reverse("teleforma-media-detail",
kwargs={"period_id": period_id, "pk": media.id}))
- if get_access(media, courses) and referer == media_detail_url:
+ if (get_access(media, courses) and referer == media_detail_url) or settings.DEBUG:
media_reads = MediaRead.objects.filter(media=media, user=request.user)
if not media_reads:
media_read = MediaRead(media=media, user=request.user)
media_read.save()
- return serve_media(media.file,
+ return serve_media(media.get_file(),
content_type=media.mime_type,
streaming=streaming,
- bucket=False,
+ bucket=settings.TELEFORMA_MEDIA_USE_S3,
)
else:
raise Http404("You don't have access to this media.")