from django.contrib.auth.models import User
from django.template.defaultfilters import slugify
from django.urls import reverse
-from teleforma.models.core import Conference, Period
+from teleforma.models.core import Conference, ConferencePublication, Period
from teleforma.models.crfpa import Student
from teleforma.models.notification import notify
from teleforma.views.core import get_courses
def __init__(self, file):
self.logger = logging.getLogger('myapp')
- self.hdlr = logging.FileHandler(file)
+ if file:
+ self.hdlr = logging.FileHandler(file)
+ else:
+ self.hdlr = None
self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
- self.hdlr.setFormatter(self.formatter)
- self.logger.addHandler(self.hdlr)
+ if self.hdlr:
+ self.hdlr.setFormatter(self.formatter)
+ self.logger.addHandler(self.hdlr)
self.logger.setLevel(logging.INFO)
than current date """
def add_arguments(self, parser):
- parser.add_argument('--logfile', type=str, required=True,
+ parser.add_argument('--logfile', type=str, required=False,
help='log file to use')
parser.add_argument('--period', type=str, required=True,
logpath = options['logfile']
logger = Logger(logpath)
+
period_name = options['period']
period = Period.objects.get(name=period_name)
now_minus = datetime.datetime.now() - datetime.timedelta(minutes=minute_low_range)
now_plus = datetime.datetime.now() + datetime.timedelta(minutes=minute_high_range)
- conferences = Conference.objects.filter(
+ publications = list(Conference.objects.filter(
period=period,
status=2,
notified=False,
date_publish__lte=now_plus,
date_publish__gte=now_minus,
- )
-
+ )) + list(ConferencePublication.objects.filter(
+ period=period,
+ status=2,
+ notified=False,
+ date_publish__lte=now_plus,
+ date_publish__gte=now_minus,
+ ))
+ print(publications)
+
logger.logger.info("Starting conference publication process")
- for conference in conferences:
- conference.status = 3
- conference.save()
+ for publication in publications:
+ publication.status = 3
+
+ if type(publication) == ConferencePublication:
+ conference = publication.conference
+ else:
+ conference = publication
medias = conference.media.all()
for media in medias:
media.is_published = True
media.save()
- if "video/mp4" in media.mime_type:
- linked_media = media
logger.logger.info("Conference published: " + conference.public_id)
- for conference in conferences:
- medias = conference.media.all()
for media in medias:
if "video/mp4" in media.mime_type:
linked_media = media
url = reverse('teleforma-media-detail', args=[conference.period.id, linked_media.id])
message = "Nouvelle conférence publiée : " + str(conference)
- students = Student.objects.filter(period=conference.period, platform_only=True)
+ students = Student.objects.filter(period=publication.period, platform_only=True)
for student in students:
try:
if student.user:
- courses = get_courses(student.user, period=conference.period)
+ courses = get_courses(student.user, period=publication.period)
for course in courses:
if conference.course == course['course'] and \
conference.course_type in course['types']:
notify(student.user, message, url)
logger.logger.info("Student notified: " + student.user.username)
+ print("notify", student)
except:
#logger.logger.info("Student NOT notified: " + str(student.id))
+ print("can't notify", student)
continue
- conference.notified = True
- conference.save()
+ publication.notified = True
+ publication.save()
--- /dev/null
+# Generated by Django 3.2.13 on 2023-01-03 14:54
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('teleforma', '0020_chatmessage_reply_to'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ConferencePublication',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('date_publish', models.DateTimeField(blank=True, null=True, verbose_name='publishing date')),
+ ('status', models.IntegerField(choices=[(0, 'Hidden'), (1, 'Private'), (2, 'Draft'), (3, 'Public')], default=2, verbose_name='status')),
+ ('notified', models.BooleanField(default=False, verbose_name='notified')),
+ ('conference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='publications', to='teleforma.conference', verbose_name='conference')),
+ ('period', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='teleforma.period', verbose_name='period')),
+ ],
+ ),
+ ]
+++ /dev/null
-# Generated by Django 3.2.13 on 2022-12-22 14:27
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('teleforma', '0021_auto_20221208_1214'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='ConferencePublication',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('date_publish', models.DateTimeField(blank=True, null=True, verbose_name='publishing date')),
- ('status', models.IntegerField(choices=[(0, 'Hidden'), (1, 'Private'), (2, 'Draft'), (3, 'Public')], default=2, verbose_name='status')),
- ('notified', models.BooleanField(default=False, verbose_name='notified')),
- ('conference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='publications', to='teleforma.conference', verbose_name='conference')),
- ('trainings', models.ManyToManyField(related_name='conference_publications', to='teleforma.Training', verbose_name='trainings')),
- ],
- ),
- ]
class ConferencePublication(models.Model):
conference = models.ForeignKey('Conference', related_name='publications', verbose_name=_('conference'),
on_delete=models.CASCADE)
- trainings = models.ManyToManyField('Training', related_name='conference_publications', verbose_name=_('trainings'))
+ period = models.ForeignKey('Period', verbose_name=_('period'),
+ on_delete=models.CASCADE)
date_publish = models.DateTimeField(_('publishing date'), null=True, blank=True)
status = models.IntegerField(
_('status'), choices=STATUS_CHOICES, default=2)
def description(self):
return str(self)
+ @property
+ def session_as_int(self):
+ try:
+ return int(self.session)
+ except ValueError:
+ return 0
+
@property
def duration(self):
if self.date_end:
except Media.DoesNotExist:
pass
return None
+
+ def publication_info(self, period):
+ """
+ Get publication info according to period.
+ """
+ publication = self.publications.filter(period=period).first()
+ if not publication and self.period == period:
+ publication = self
+ elif not publication:
+ return None
+
+ return {
+ 'status': publication.status,
+ 'published': publication.status == 3,
+ 'publication_date': publication.date_publish,
+ 'notified': publication.notified
+ }
class Meta(MetaCore):
</p>
</div>
+ {% if home_video %}
<div class="block">
<div class="course_subtitle">
<h3>{% if home_video.title %}{{ home_video.title }}{% else %}{{ home_video.course.title }}{% endif %}</h3>
</a>
</div>
</div>
+ {% endif %}
{% if webclass_slots or webclass_to_subscribe and not restricted %}
<div class="course_title">
</dl>
</div>
</td>
+
+ {% conference_publication conference as publication %}
<td {% if forloop.first %}class="border-top"{% endif %} width="10%" align="center">
- {% if media.is_published and user.is_staff %}
+ {% if publication.published and user.is_staff %}
<img src="/static/teleforma/images/ok.png" style="vertical-align:middle" alt="" title="{% trans ' published' %}" />
- {% elif not media.is_published and user.is_staff %}
+ {% elif not publication.published and user.is_staff %}
<img src="/static/teleforma/images/delete.png" style="vertical-align:middle" alt="" title="{% trans ' rejected' %}" />
{% endif %}
- {% if conference.video.file and conference.video.is_published or user.is_superuser or user.is_staff %}
+ {% if conference.video.file %}
{% if not "video" in conference.video.mime_type or request.user_agent.os.family == 'iOS' %}
<a href="{% url 'teleforma-media-download' period.id conference.video.id %}">
<img src="/static/teleforma/images/download_media.png" style="vertical-align:middle" alt="" title="{% trans "Download" %}" />
period = context['period']
course_type = context['type']
- return get_course_conferences(user, period, course, course_type)
+ return get_course_conferences(period, course, course_type)
+
+@register.simple_tag(takes_context=True)
+def conference_publication(context, conference):
+ period = context['period']
+ return conference.publication_info(period)
+
# @register.simple_tag(takes_context=True)
# def course_media(context):
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from django.core.cache import cache
-from django.db.models import Q
-from django.contrib.sites import Site
-
from jsonrpc import jsonrpc_method
from jsonrpc.proxy import ServiceProxy
return trainings
-def get_course_conferences(user, period, course, course_type):
- trainings = get_trainings(user)
+def get_course_conferences(period, course, course_type):
conferences = []
+ already_added = set()
# get conference publications
publications = ConferencePublication.objects.filter(
- trainings__in=trainings, status=3, conference__course=course, conference__course_type=course_type).distinct()
+ period=period, conference__course=course, conference__course_type=course_type).distinct()
for publication in publications:
conferences.append(publication.conference)
+ already_added.add(publication.conference.id)
- for conference in Conference.objects.filter(period=period, status=3, course=course, course_type=course_type):
+ for conference in Conference.objects.filter(period=period, course=course, course_type=course_type):
# do not include conferences with publication rules
- if conference.publications.filter(trainings__in=trainings).count():
- continue
- conferences.append(conference)
+ if conference.id not in already_added:
+ conferences.append(conference)
+ conferences = sorted(conferences, key=lambda c:-c.session_as_int)
return conferences
student = user.student.all()[0]
slots = []
to_subscribe = []
- student_trainings = get_trainings(user)
student_courses = [course['course']
for course in get_courses(user)]
- for webclass in Webclass.published.filter(trainings__in=student_trainings, iej=student.iej, course__in=student_courses):
+ for webclass in Webclass.published.filter(period=self.period, iej=student.iej, course__in=student_courses):
# if webclass.course not in student_courses:
# continue
if student.platform_only and not webclass.allow_elearning:
if student:
student = student[0]
- trainings = get_trainings(self.request.user)
if student:
try:
webclass = Webclass.published.filter(
- trainings__in=trainings, course=course, iej=student.iej)[0]
+ period=self.period, course=course, iej=student.iej)[0]
except IndexError:
pass
if webclass:
records = {}
try:
- records = WebclassRecord.get_records(trainings, course)
+ records = WebclassRecord.get_records(context['period'], course)
except Exception as e:
print(e)
context['webclass_error'] = True
context['webclass_records'] = records.get(WebclassRecord.WEBCLASS)
- context['webclass_corrections_records'] = records.get(
- WebclassRecord.CORRECTION)
+ context['webclass_corrections_records'] = records.get(WebclassRecord.CORRECTION)
+
return context
@method_decorator(access_required)
context[self.pdf_url_varname] = self.get_pdf_url()
return super(PDFTemplateResponseMixin, self).render_to_response(
context, **response_kwargs)
-
-