]> git.parisson.com Git - teleforma.git/commitdiff
add news module
authorYoan Le Clanche <yoan@ellington.pilotsystems.net>
Fri, 1 Jun 2018 14:53:45 +0000 (16:53 +0200)
committerYoan Le Clanche <yoan@ellington.pilotsystems.net>
Fri, 1 Jun 2018 14:53:45 +0000 (16:53 +0200)
16 files changed:
teleforma/admin.py
teleforma/forms.py
teleforma/migrations/0096_auto__add_newsitem.py [new file with mode: 0644]
teleforma/models/crfpa.py
teleforma/static/teleforma/css/teleforma.css
teleforma/static/teleforma/images/actus.png [new file with mode: 0644]
teleforma/static/teleforma/js/application.js
teleforma/templates/teleforma/course_detail.html
teleforma/templates/teleforma/inc/newsitem.html [new file with mode: 0644]
teleforma/templates/teleforma/inc/newsitems_portlet.html [new file with mode: 0644]
teleforma/templates/teleforma/newsitem_confirm_delete.html [new file with mode: 0644]
teleforma/templates/teleforma/newsitem_form.html [new file with mode: 0644]
teleforma/templates/teleforma/newsitem_list.html [new file with mode: 0644]
teleforma/templatetags/teleforma_tags.py
teleforma/urls.py
teleforma/views/crfpa.py

index 226dd59ee6a7547b8a5f6a3b5df88321080d8ecd..2d639f8bb1610f5afdefb95d95393c5c43c0d8f0 100644 (file)
@@ -30,6 +30,7 @@ class PeriodListFilter(SimpleListFilter):
         human-readable name for the option that will appear
         in the right sidebar.
         """
+
         return ( (period.name, period.name) for period in Period.objects.all() )
 
     def queryset(self, request, queryset):
@@ -165,6 +166,11 @@ class HomeAdmin(admin.ModelAdmin):
         form.base_fields['video'].queryset = Media.objects.filter(type='webm')
         return form
 
+class NewsItemAdmin(admin.ModelAdmin):
+    list_filter = ('deleted', 'course', 'creator')
+    list_display = ('title', 'course', 'creator', 'deleted')
+    search_fields = ['title', 'text']
+
 admin.site.unregister(User)
 admin.site.register(Organization)
 admin.site.register(Department)
@@ -187,3 +193,4 @@ admin.site.register(Professor, ProfessorAdmin)
 admin.site.register(StudentGroup, StudentGroupAdmin)
 admin.site.register(GroupedMessage)
 admin.site.register(Home, HomeAdmin)
+admin.site.register(NewsItem, NewsItemAdmin)
index 9c9ef21611c26164b746d7d208c273e05f87043e..caba072bf1dc0eb24e06d1b59490f437a8605ee9 100644 (file)
@@ -4,7 +4,7 @@ from registration.forms import RegistrationForm
 from django.utils.translation import ugettext_lazy as _
 from extra_views import CreateWithInlinesView, UpdateWithInlinesView, InlineFormSet
 from captcha.fields import CaptchaField
-
+from tinymce.widgets import TinyMCE
 
 class ConferenceForm(ModelForm):
 
@@ -80,4 +80,14 @@ class StudentInline(InlineFormSet):
         kwargs.update({
             'formfield_callback': get_field_qs
         })
-        return kwargs
\ No newline at end of file
+        return kwargs
+
+
+class NewsItemForm(ModelForm):
+    class Meta:
+        model = NewsItem
+        exclude = ['created', 'creator', 'deleted']
+        widgets = {
+            'description': TinyMCE({'cols':80, 'rows':30}),
+        }
+
diff --git a/teleforma/migrations/0096_auto__add_newsitem.py b/teleforma/migrations/0096_auto__add_newsitem.py
new file mode 100644 (file)
index 0000000..c99f376
--- /dev/null
@@ -0,0 +1,616 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'NewsItem'
+        db.create_table('teleforma_newsitem', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('course', self.gf('django.db.models.fields.related.ForeignKey')(related_name='newsitems', to=orm['teleforma.Course'])),
+            ('text', self.gf('tinymce.models.HTMLField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('creator', self.gf('django.db.models.fields.related.ForeignKey')(related_name='newsitems', to=orm['auth.User'])),
+            ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False)),
+        ))
+        db.send_create_signal('teleforma', ['NewsItem'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'NewsItem'
+        db.delete_table('teleforma_newsitem')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'quiz.category': {
+            'Meta': {'object_name': 'Category'},
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'quiz.quiz': {
+            'Meta': {'object_name': 'Quiz'},
+            'answers_at_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['quiz.Category']", 'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'draft': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'exam_paper': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'fail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'max_questions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'pass_mark': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'blank': 'True'}),
+            'random_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'single_attempt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'success_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '60'}),
+            'url': ('django.db.models.fields.SlugField', [], {'max_length': '60'})
+        },
+        'teleforma.aestudent': {
+            'Meta': {'ordering': "['user__last_name']", 'object_name': 'AEStudent', 'db_table': "'teleforma_ae_student'"},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'period': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
+            'platform_only': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'user': ('telemeta.models.core.ForeignKey', [], {'related_name': "'ae_student'", 'unique': 'True', 'to': "orm['auth.User']"})
+        },
+        'teleforma.conference': {
+            'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'},
+            'comment': ('teleforma.fields.ShortTextField', [], {'max_length': '255', 'blank': 'True'}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
+            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}),
+            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}),
+            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}),
+            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
+            'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+            'web_class_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conferences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.WebClassGroup']"})
+        },
+        'teleforma.course': {
+            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'has_exam_scripts': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'oral_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'oral_2': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'oral_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'procedure': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'quiz': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['quiz.Quiz']", 'null': 'True', 'blank': 'True'}),
+            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'title_tweeter': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'written_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'teleforma.coursegroup': {
+            'Meta': {'object_name': 'CourseGroup', 'db_table': "'teleforma_course_group'"},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.coursetype': {
+            'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.department': {
+            'Meta': {'object_name': 'Department'},
+            'default_period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'departments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.discount': {
+            'Meta': {'object_name': 'Discount', 'db_table': "'teleforma_discounts'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': "orm['teleforma.Student']"}),
+            'value': ('django.db.models.fields.FloatField', [], {})
+        },
+        'teleforma.document': {
+            'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
+            'annal_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}),
+            'course_type': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'document'", 'blank': 'True', 'to': "orm['teleforma.CourseType']"}),
+            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
+            'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'to': "orm['teleforma.DocumentType']"}),
+            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
+        },
+        'teleforma.documentsimple': {
+            'Meta': {'ordering': "['-date_added']", 'object_name': 'DocumentSimple', 'db_table': "'teleforma_document_simple'"},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
+        },
+        'teleforma.documenttype': {
+            'Meta': {'ordering': "['number']", 'object_name': 'DocumentType', 'db_table': "'teleforma_document_type'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'teleforma.groupedmessage': {
+            'Meta': {'object_name': 'GroupedMessage', 'db_table': "'teleforma_grouped_messages'"},
+            'date_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.StudentGroup']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'sender': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+            'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'subject': ('django.db.models.fields.CharField', [], {'max_length': '119'}),
+            'to_send': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'teleforma.home': {
+            'Meta': {'object_name': 'Home'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'text': ('tinymce.models.HTMLField', [], {'blank': 'True'}),
+            'video': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Media']", 'null': 'True', 'blank': 'True'})
+        },
+        'teleforma.iej': {
+            'Meta': {'ordering': "['name']", 'object_name': 'IEJ'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.livestream': {
+            'Meta': {'object_name': 'LiveStream', 'db_table': "'teleforma_live_stream'"},
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'livestream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'server': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'livestream'", 'to': "orm['teleforma.StreamingServer']"}),
+            'stream_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'streaming': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'teleforma.media': {
+            'Meta': {'ordering': "['-date_modified', '-conference__session']", 'object_name': 'Media'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.CourseType']"}),
+            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['telemeta.MediaItem']"}),
+            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
+        },
+        'teleforma.newsitem': {
+            'Meta': {'object_name': 'NewsItem'},
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['teleforma.Course']"}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['auth.User']"}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'text': ('tinymce.models.HTMLField', [], {}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.optionalfee': {
+            'Meta': {'object_name': 'OptionalFee', 'db_table': "'teleforma_optional_fees'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'optional_fees'", 'to': "orm['teleforma.Student']"}),
+            'value': ('django.db.models.fields.FloatField', [], {})
+        },
+        'teleforma.organization': {
+            'Meta': {'object_name': 'Organization'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.payback': {
+            'Meta': {'object_name': 'Payback', 'db_table': "'teleforma_paybacks'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paybacks'", 'to': "orm['teleforma.Student']"}),
+            'value': ('django.db.models.fields.FloatField', [], {})
+        },
+        'teleforma.payment': {
+            'Meta': {'ordering': "['month']", 'object_name': 'Payment', 'db_table': "'teleforma_payments'"},
+            'collected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'month': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payments'", 'to': "orm['teleforma.Student']"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'value': ('django.db.models.fields.FloatField', [], {})
+        },
+        'teleforma.period': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Period'},
+            'date_begin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_end': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_exam_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_password_init': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'department': ('telemeta.models.core.ForeignKey', [], {'default': 'None', 'related_name': "'period'", 'null': 'True', 'blank': 'True', 'to': "orm['teleforma.Department']"}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'message_local': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'message_platform': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Period']"})
+        },
+        'teleforma.professor': {
+            'Meta': {'ordering': "['user__last_name']", 'object_name': 'Professor'},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"})
+        },
+        'teleforma.profile': {
+            'Meta': {'object_name': 'Profile', 'db_table': "'teleforma_profiles'"},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'address_detail': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'birthday': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'init_password': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'language': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
+            'wifi_login': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'wifi_pass': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.room': {
+            'Meta': {'object_name': 'Room'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.streamingserver': {
+            'Meta': {'object_name': 'StreamingServer', 'db_table': "'teleforma_streaming_server'"},
+            'admin_password': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'port': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'source_password': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'})
+        },
+        'teleforma.student': {
+            'Meta': {'ordering': "['user__last_name', '-date_subscribed']", 'object_name': 'Student'},
+            'application_fees': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'confirmation_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'date_registered': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
+            'date_subscribed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
+            'is_subscribed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'level': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'options': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'options_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_speciality_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'platform_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'procedure_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'promo_code': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+            'subscription_fees': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+            'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_training'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
+            'trainings': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'student_trainings'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Training']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'unique': 'True', 'to': "orm['auth.User']"}),
+            'written_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'written_speciality_2students'", 'null': 'True', 'to': "orm['teleforma.Course']"})
+        },
+        'teleforma.studentgroup': {
+            'Meta': {'object_name': 'StudentGroup', 'db_table': "'teleforma_student_groups'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'students': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Student']"})
+        },
+        'teleforma.training': {
+            'Meta': {'object_name': 'Training'},
+            'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'cost': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'magistral': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_magistral'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'obligation': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_obligation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'options': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_options'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'oral_1': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_1'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'oral_2': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_2'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'oral_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'training'", 'null': 'True', 'to': "orm['teleforma.Period']"}),
+            'procedure': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_procedure'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'synthesis_note': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_synthesis_note'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
+            'written_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_written_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"})
+        },
+        'teleforma.webclassgroup': {
+            'Meta': {'ordering': "['name']", 'object_name': 'WebClassGroup'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iejs': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'web_class_group'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.IEJ']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'telemeta.acquisitionmode': {
+            'Meta': {'ordering': "['value']", 'object_name': 'AcquisitionMode', 'db_table': "'acquisition_modes'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.adconversion': {
+            'Meta': {'ordering': "['value']", 'object_name': 'AdConversion', 'db_table': "'ad_conversions'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.ethnicgroup': {
+            'Meta': {'ordering': "['value']", 'object_name': 'EthnicGroup', 'db_table': "'ethnic_groups'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.genericstyle': {
+            'Meta': {'ordering': "['value']", 'object_name': 'GenericStyle', 'db_table': "'generic_styles'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.language': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Language', 'db_table': "'languages'"},
+            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'identifier': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'part1': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
+            'part2B': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
+            'part2T': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
+            'scope': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
+            'type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'})
+        },
+        'telemeta.legalright': {
+            'Meta': {'ordering': "['value']", 'object_name': 'LegalRight', 'db_table': "'legal_rights'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.location': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Location', 'db_table': "'locations'"},
+            'complete_type': ('telemeta.models.core.ForeignKey', [], {'related_name': "'locations'", 'to': "orm['telemeta.LocationType']"}),
+            'current_location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'past_names'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Location']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_authoritative': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'latitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'longitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '150'}),
+            'type': ('telemeta.models.core.IntegerField', [], {'default': '0', 'db_index': 'True', 'blank': 'True'})
+        },
+        'telemeta.locationtype': {
+            'Meta': {'ordering': "['name']", 'object_name': 'LocationType', 'db_table': "'location_types'"},
+            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '64'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'max_length': '150'})
+        },
+        'telemeta.mediacollection': {
+            'Meta': {'ordering': "['code']", 'object_name': 'MediaCollection', 'db_table': "'media_collections'"},
+            'a_informer_07_03': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'acquisition_mode': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AcquisitionMode']"}),
+            'ad_conversion': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AdConversion']"}),
+            'alt_ids': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
+            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
+            'booklet_author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'booklet_description': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'cnrs_contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}),
+            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'collector_is_creator': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'conservation_site': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'creator': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'doctype_code': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_published': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'items_done': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'legal_rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.LegalRight']"}),
+            'metadata_author': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataAuthor']"}),
+            'metadata_writer': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataWriter']"}),
+            'old_code': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'blank': 'True'}),
+            'physical_format': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PhysicalFormat']"}),
+            'physical_items_num': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
+            'publisher': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Publisher']"}),
+            'publisher_collection': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublisherCollection']"}),
+            'publisher_serial': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'publishing_status': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublishingStatus']"}),
+            'recorded_from_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'recorded_to_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'recording_context': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.RecordingContext']"}),
+            'reference': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'state': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'title': ('telemeta.models.core.CharField', [], {'max_length': '250'}),
+            'travail': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'year_published': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'})
+        },
+        'telemeta.mediaitem': {
+            'Meta': {'object_name': 'MediaItem', 'db_table': "'media_items'"},
+            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
+            'author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
+            'code': ('telemeta.models.core.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '250', 'blank': 'True'}),
+            'collection': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'to': "orm['telemeta.MediaCollection']"}),
+            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'collector_from_collection': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'collector_selection': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'context_comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'copied_from_item': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'copies'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MediaItem']"}),
+            'creator_reference': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'cultural_area': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'depositor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'digitalist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'digitization_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'ethnic_group': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.EthnicGroup']"}),
+            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
+            'generic_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.GenericStyle']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'language': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'language_iso': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['telemeta.Language']", 'blank': 'True', 'null': 'True'}),
+            'location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Location']", 'null': 'True', 'blank': 'True'}),
+            'location_comment': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'mimetype': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'organization': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Organization']", 'null': 'True', 'blank': 'True'}),
+            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
+            'publishing_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'recorded_from_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'recorded_to_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'recordist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Rights']", 'null': 'True', 'blank': 'True'}),
+            'scientist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'summary': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
+            'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'topic': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Topic']", 'null': 'True', 'blank': 'True'}),
+            'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'}),
+            'vernacular_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.VernacularStyle']"})
+        },
+        'telemeta.metadataauthor': {
+            'Meta': {'ordering': "['value']", 'object_name': 'MetadataAuthor', 'db_table': "'metadata_authors'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.metadatawriter': {
+            'Meta': {'ordering': "['value']", 'object_name': 'MetadataWriter', 'db_table': "'metadata_writers'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.organization': {
+            'Meta': {'ordering': "['value']", 'object_name': 'Organization', 'db_table': "'organization'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.physicalformat': {
+            'Meta': {'ordering': "['value']", 'object_name': 'PhysicalFormat', 'db_table': "'physical_formats'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.publisher': {
+            'Meta': {'ordering': "['value']", 'object_name': 'Publisher', 'db_table': "'publishers'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.publishercollection': {
+            'Meta': {'ordering': "['value']", 'object_name': 'PublisherCollection', 'db_table': "'publisher_collections'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'publisher': ('telemeta.models.core.ForeignKey', [], {'related_name': "'publisher_collections'", 'to': "orm['telemeta.Publisher']"}),
+            'value': ('telemeta.models.core.CharField', [], {'max_length': '250'})
+        },
+        'telemeta.publishingstatus': {
+            'Meta': {'ordering': "['value']", 'object_name': 'PublishingStatus', 'db_table': "'publishing_status'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.recordingcontext': {
+            'Meta': {'ordering': "['value']", 'object_name': 'RecordingContext', 'db_table': "'recording_contexts'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.rights': {
+            'Meta': {'ordering': "['value']", 'object_name': 'Rights', 'db_table': "'rights'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.topic': {
+            'Meta': {'ordering': "['value']", 'object_name': 'Topic', 'db_table': "'topic'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        },
+        'telemeta.vernacularstyle': {
+            'Meta': {'ordering': "['value']", 'object_name': 'VernacularStyle', 'db_table': "'vernacular_styles'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
+        }
+    }
+
+    complete_apps = ['teleforma']
\ No newline at end of file
index 103b1521ac76ccf42e40683bee24bfe0686fdace..69869ba26748692d83ac26d7d9caf3222f91cf81 100644 (file)
@@ -326,4 +326,34 @@ class Home(models.Model):
             # if you'll not check for self.pk
             # then error will also raised in update of exists model
             raise ValidationError('There is can be only one Home instance')
-        return super(Home, self).save(*args, **kwargs)
\ No newline at end of file
+        return super(Home, self).save(*args, **kwargs)
+
+
+class NewsItem(models.Model):
+
+    title = models.CharField(_('Title'), max_length=255)
+    course = models.ForeignKey(Course, related_name='newsitems', verbose_name=_('course'))
+    text = HTMLField('Texte')
+
+    created = models.DateTimeField(_('date created'), auto_now_add=True)
+    creator = models.ForeignKey(User, related_name='newsitems', verbose_name="Créateur")
+    deleted = models.BooleanField('Supprimé')
+
+    class Meta(MetaCore):
+        verbose_name = "Actualité"
+        verbose_name_plural = "Actualités"
+
+    def __unicode__(self):
+        return "NewsItem %s" % str(self.id)
+
+
+    def can_edit(self, request):
+        return request.user.is_staff or request.user.id == self.creator.id
+
+    def can_delete(self, request):
+        return request.user.is_staff or request.user.id == self.creator.id
+
+
+
+
+
index 90ba5285c74967bb376c91c47ee46bca4a7e7dfe..7d9257ccfacfb7ee8e25c9194b697e679e7f414b 100644 (file)
@@ -1343,6 +1343,34 @@ input,textarea{
     border-top: 1px dotted #000000;
 }
 
+#content #actus_list .newsitem{
+       margin-top: 2em;
+}
+#content #actus_list .newsitem header h3{
+       color: #355ea2;
+       font-weight: bold;
+       font-size: 1.2em;
+       margin-bottom: 5px;
+}
+#content #actus_list .newsitem header p{
+       font-size: 0.8em;
+       margin-top: 5px;
+       margin-bottom: 5px;
+}
+#content #actus_list .newsitem section{
+       background-color: #FFF;
+       -moz-border-radius: 8px 0px 8px 8px;
+       -webkit-border-radius: 8px 0px 8px 8px;
+       border-radius: 8px 0px 8px 8px;
+       margin-top: 0em;
+       border: 1px solid #dfdfdf;
+       padding: 1.3em 0.8em;
+}
+
+#content #actus_list .pagination{
+       margin: 2em 0;
+}
+
 #module-set {
     float: right;
     clear: right;
@@ -1426,6 +1454,176 @@ input,textarea{
     }
 
 
+#module-set .ui-tabs.ui-widget-content{
+       margin-top: 15px;
+}
+#module-set .ui-tabs.ui-widget-content h3{
+       vertical-align: middle;
+       display: inline-block;
+}
+#module-set .ui-tabs.ui-widget-content h3 img{
+       vertical-align: middle;
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav{
+       padding: 0;
+       margin: 0;
+}
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav:after {
+       content: ""; 
+       display: table;
+       clear: both;
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li{
+       display: inline-block;
+       width: 50%;
+       text-align: center;
+       padding: 0;
+       box-sizing: border-box;
+       margin-top: 3px;
+       float:left;
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li a{
+       font-size:1.1em;
+       color: #FFF;
+       padding: 1em 0;
+       display: block;
+       box-sizing: border-box;
+       float:left;
+       width: 80%;
+       background-color: rgba(255, 255, 255, .2);
+       border-left: 1px solid #000;
+       border-right: 1px solid #666;
+       opacity: 0.5;
+}
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li a:hover{
+       background-color: rgba(255, 255, 255, .1);
+       opacity: 1;
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li.ui-tabs-active a{
+       background-color: rgba(255, 255, 255, 0);
+       opacity: 1;
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li.ui-tabs-active a+a:hover{
+       background-color: rgba(255, 255, 255, 0.2);
+}
+
+#module-set .ui-tabs.ui-widget-content ul.ui-tabs-nav li a+a{
+       width: 20%;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content{
+       background-color: #FFF;
+       color: #000;
+}
+
+
+
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem{
+       padding: 10px 5px;
+       border-bottom: 1px solid #CCC;
+       margin-bottom: 10px;
+       border-radius: 0;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem:first-child{
+       padding-top: 20px;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem:last-child{
+       border-bottom: 0;
+       margin-bottom: 0;
+       padding-bottom: 20px;
+}
+
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header p{
+       font-size: 0.8125em;
+       margin: 5px 0;
+       line-height: 1.3em;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header h3{
+       color: #355ea2;
+       display: block;
+       font-size: 1.05em;
+       display: inline-block;
+       width: 85%;
+       margin: 0;
+}
+
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header ul.actions{
+       padding: 0;
+       text-align: right;
+       display: inline-block;
+       width: 15%;
+       margin: 0;
+       float: right;
+       position: relative;
+       top: 2px;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header ul.actions li{
+       list-style-type: none;
+       display: inline-block;
+       padding: 0;
+       font-size: 1.3em;
+       margin-right: 5px;
+}
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header ul.actions li+li{
+       margin-right: 0px;
+}
+
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem header ul.actions li img{
+       border-radius: 0;
+       width: 12px;
+       height: 12px;
+}
+
+#module-set .ui-tabs.ui-widget-content .ui-widget-content .newsitem section{
+       font-size: 1.1em;
+       font-size: 0.9em;
+}
+
+#module-set .ui-tabs.ui-widget-content footer{
+       text-align: center;
+       padding: 10px 0;
+       background: repeat url(/static/telemeta/images/tw_hd.png) 0 0;
+}
+
+#module-set .ui-tabs.ui-widget-content footer a{
+       display: inline-block;
+       width: 100%;
+       color: #FFF;
+}
+
+#module-set .ui-tabs.ui-widget-content footer a:hover{
+       text-decoration: underline;
+}
+
+form.add_actus p:after{
+       content: ""; 
+       display: table;
+       clear: both;
+}
+
+form.add_actus label{
+       display: inline-block;
+       font: 1em Verdana, sans-serif;
+    line-height: 1.3em;
+    color: #333;
+       font-weight: bold;
+       min-width: 105px;
+}
+
+form.add_actus label[for="id_text"]{
+       float: left;
+}
+form.add_actus #id_text_parent{
+       float: left;
+       margin-left: 7px;
+}
+
+
+
 .desk_center {
     float: left;
     width: 50%;
@@ -1590,7 +1788,7 @@ input,textarea{
 
 #chatwindow {
     min-height: 10em;
-    max-height: 42em;
+    max-height: 21em;
     border-bottom: 1px solid;
     padding: 0.8em;
     overflow: auto;
diff --git a/teleforma/static/teleforma/images/actus.png b/teleforma/static/teleforma/images/actus.png
new file mode 100644 (file)
index 0000000..4559cc1
Binary files /dev/null and b/teleforma/static/teleforma/images/actus.png differ
index 8fafed8274307ecf1c2426793d0c49c61b87995f..c4e7867803ea7a02cef8a9adaf732d2ae211efe3 100644 (file)
@@ -39,4 +39,5 @@ $(document).ready(function(){
              });
          })
      }
+     $('.tabs').tabs();
 });
\ No newline at end of file
index d7883a0996ef37ab6896a647db934b07d497c321..56cccda4bf4c7ab152dab2a42d05486f14ef64d7 100644 (file)
@@ -1,5 +1,6 @@
 {% extends "teleforma/courses.html" %}
 {% load i18n %}
+{% load teleforma_tags %}
 
 {% block extra_javascript %}
 <script type="text/javascript">
@@ -32,17 +33,21 @@ $(document).ready(function(){
         <div class="course_title">{{ course.title }} - {{ type }}{% if course.description %} - {{ course.description }}{% endif %}
         </div>
 
-        {% if type.name == 'Quiz' %}
+          {% if type.name == 'Quiz' %}
           <div class="course_content">
-           <table class="listing" width="100%">
-            <tbody>
-               {% for quiz in course.quiz.all %}
-               <td class="border-top"><a href="{% url quiz_start_page slug=quiz.url %}">{{quiz.title}}</a></td>
-               <td class="border-top">{{quiz.description}}</td>
-               {% endfor %}
-            </tbody>
-          </table>
-         </div>
+              {% if course.quiz.all %}
+              <table class="listing" width="100%">
+                  <tbody>
+                  {% for quiz in course.quiz.all %}
+                  <td class="border-top"><a href="{% url quiz_start_page slug=quiz.url %}">{{quiz.title}}</a></td>
+                  <td class="border-top">{{quiz.description}}</td>
+                  {% endfor %}
+                  </tbody>
+              </table>
+              {% else %}
+              <p>Aucun quiz</p>
+              {% endif %}
+          </div>
 
         {% else %}
           {% if not user.correctors.all or user.is_staff %}
@@ -83,4 +88,7 @@ $(document).ready(function(){
  {% endif %}
 {% endif %}
 {% endif %}
+
+{% newsitems_portlet course_id=course.id period_id=period.id %}
 {% endblock chat %}
+
diff --git a/teleforma/templates/teleforma/inc/newsitem.html b/teleforma/templates/teleforma/inc/newsitem.html
new file mode 100644 (file)
index 0000000..289399b
--- /dev/null
@@ -0,0 +1,26 @@
+<div class="newsitem">
+    <header>
+        <h3>{{ newsitem.title }}</h3>
+        {% if newsitem.can_edit or newsitem.can_delete %}
+        <ul class="actions">
+               {% if newsitem.can_edit %}
+               <li>
+                       <a href="{% url newsitem-update pk=newsitem.id %}?period_id={{ period_id }}"><img src="/static/telemeta/images/pencil-edit-button.png" alt="éditer"/></a>
+               </li>
+               {% endif %}
+               {% if newsitem.can_delete %}
+               <li>
+                       <a href="{% url newsitem-delete pk=newsitem.id %}?period_id={{ period_id }}"><img src="/static/telemeta/images/rubbish-bin-delete-button.png" alt="supprimer"/></a>
+               </li>
+               {% endif %}
+        </ul>          
+        {% endif %}
+        <br /><p>par {{ newsitem.creator }} le {{ newsitem.created }}</p>
+        
+    </header>
+    <section>
+       {% autoescape off %}
+       {{ newsitem.text }}
+       {% endautoescape %}
+    </section>
+</div>
\ No newline at end of file
diff --git a/teleforma/templates/teleforma/inc/newsitems_portlet.html b/teleforma/templates/teleforma/inc/newsitems_portlet.html
new file mode 100644 (file)
index 0000000..f3aaac7
--- /dev/null
@@ -0,0 +1,34 @@
+{% load i18n %}
+{% load telemeta_utils %} 
+{% load teleforma_tags %}
+<div class="tabs module">
+    <h3><img src="/static/telemeta/images/actus.png" alt="actualités"/>Actualités</h3>
+    <ul>
+        <li><a href="#news_local">{{ course.title_tweeter }}</a>
+            {% if can_add %}<a href="{% url newsitem-create %}?course_id={{course.id}}&period_id={{period_id}}">+</a>{% endif %}
+        </li>
+        <li><a href="#news_global">Générales</a>
+            {% if can_add %}<a href="{% url newsitem-create %}?period_id={{period_id}}">+</a>{% endif %}
+        </li>
+    </ul>
+    <div id="news_local">
+        <section>
+            {% for newsitem in course_newsitems %} {% include "teleforma/inc/newsitem.html" %} {% endfor %}
+        </section>
+        {% if course_newsitems|length >= 5 %}
+        <footer>
+            <a href="{% url newsitem-list %}?course_id={{ course.id }}">Voir plus</a>
+        </footer>
+        {% endif %}
+    </div>
+    <div id="news_global">
+        <section>
+            {% for newsitem in all_newsitems %} {% include "teleforma/inc/newsitem.html" %} {% endfor %}
+        </section>
+        {% if all_newsitems|length >= 5 %}
+        <footer>
+            <a href="{% url newsitem-list %}">Voir plus</a>
+        </footer>
+        {% endif %}
+    </div>
+</div>
\ No newline at end of file
diff --git a/teleforma/templates/teleforma/newsitem_confirm_delete.html b/teleforma/templates/teleforma/newsitem_confirm_delete.html
new file mode 100644 (file)
index 0000000..d1cfa56
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "telemeta/base.html" %}
+
+{% block content %}
+<form method="post">{% csrf_token %}
+    <p>Etes-vous sûr de vouloir supprimer "{{ object.title }}"?</p>
+    <input type="submit" value="Confirmer" />
+</form>
+{% endblock %}
\ No newline at end of file
diff --git a/teleforma/templates/teleforma/newsitem_form.html b/teleforma/templates/teleforma/newsitem_form.html
new file mode 100644 (file)
index 0000000..c13573a
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "telemeta/base.html" %}
+
+{% block extra_javascript %}
+{{ form.media }}
+{% endblock %}
+
+{% block content %}
+<h1>Ajouter une actualité</h1>
+<form method="post" class="add_actus">{% csrf_token %}
+    {{ form.as_p }}
+    <input type="submit" value="Enregistrer" />
+</form>
+{% endblock %}
\ No newline at end of file
diff --git a/teleforma/templates/teleforma/newsitem_list.html b/teleforma/templates/teleforma/newsitem_list.html
new file mode 100644 (file)
index 0000000..b2179c5
--- /dev/null
@@ -0,0 +1,29 @@
+{% extends "telemeta/base.html" %}
+
+{% block content %}
+<div id="actus_list">
+<h1>Actualités</h1>
+{% if object_list %}
+       {% for newsitem in object_list %}
+           {% include "teleforma/inc/newsitem.html" %} 
+       {% endfor %}
+       {% if is_paginated %}
+        <div class="pagination">
+            <span class="page-links">
+                {% if page_obj.has_previous %}
+                    <a href="{% url newsitem-list %}?page={{ page_obj.previous_page_number }}&course_id={{ course_id }}">Précédent</a>
+                {% endif %}
+                <span class="page-current">
+                    Page {{ page_obj.number }} sur {{ page_obj.paginator.num_pages }}
+                </span>
+                {% if page_obj.has_next %}
+                    <a href="{% url newsitem-list %}?page={{ page_obj.next_page_number }}&course_id={{ course_id }}">Suivant</a>
+                {% endif %}
+            </span>
+        </div>
+    {% endif %}
+{% else %}
+    <p>Aucune actualité.</p>
+    </div>
+{% endif %}
+{% endblock %}
\ No newline at end of file
index 33d02a396e2b43991b30b0a0677440902c4fa508..445b0dce607bfaa771bf3d80b255e3e2f9b8d09e 100644 (file)
@@ -43,6 +43,7 @@ from docutils.core import publish_parts
 from django.utils.encoding import smart_str, force_unicode
 from django.utils.safestring import mark_safe
 from django import db
+from django.shortcuts import get_object_or_404
 import re
 import os
 import datetime
@@ -54,6 +55,7 @@ from django.utils.translation import ugettext_lazy as _
 from urlparse import urlparse
 
 from teleforma.models.core import Document
+from teleforma.models.crfpa import Course, NewsItem
 from teleforma.views import get_courses
 from teleforma.models import *
 from teleforma.exam.models import *
@@ -249,3 +251,31 @@ def get_training_profile(user):
                 text += unicode(training) + ' '
     return text
 
+@register.inclusion_tag('teleforma/inc/newsitems_portlet.html', takes_context=True)
+def newsitems_portlet(context, course_id, period_id):
+    request = context['request']
+    user = request.user
+    def get_data(newsitem):
+        return {
+        'id':newsitem.id,
+        'title':newsitem.title,
+        'text':newsitem.text,
+        'creator':newsitem.creator,
+        'created':newsitem.created,
+        'can_edit':newsitem.can_edit(request),
+        'can_delete':newsitem.can_delete(request),
+        }
+    
+    course = get_object_or_404(Course, id=course_id) 
+    course_newsitems = [get_data(news) for news in NewsItem.objects.filter(deleted=False, course__id=course_id).order_by('-created')[:5]]
+    all_newsitems = [get_data(news) for news in NewsItem.objects.filter(deleted=False).order_by('-created')[:5]]
+    can_add = False 
+    if user.is_staff or user.professor.count():
+        can_add = True
+    return {
+            'can_add':can_add,
+            'course':course,
+            'period_id':period_id,
+            'course_newsitems':course_newsitems, 
+            'all_newsitems':all_newsitems
+           }
index c56f6d2b90202f02cc321a62fde7eb2bb221115c..f31fec1b2c151dca50b2f8a69ad3f55d5b5d1b75 100644 (file)
@@ -121,6 +121,13 @@ urlpatterns = patterns('',
     # Ajax update training
     url(r'^update-training/(?P<id>.*)/$', update_training, name="update-training"),
 
+    # News Item
+    url(r'^desk/periods/(?P<period_id>.*)/medias/(?P<pk>.*)/detail/$', MediaView.as_view(), name="teleforma-media-detail"),
+    url(r'^newsitems/create', NewsItemCreate.as_view(), name='newsitem-create'),
+    url(r'^newsitems/update/(?P<pk>.*)', NewsItemUpdate.as_view(), name='newsitem-update'),
+    url(r'^newsitems/delete/(?P<pk>.*)', NewsItemDelete.as_view(), name='newsitem-delete'),
+    url(r'^newsitems/list', NewsItemList.as_view(), name='newsitem-list'),
+
     # JSON RPC
     url(r'json/$', jsonrpc_site.dispatch, name='jsonrpc_mountpoint'),
     url(r'jsonrpc/$', jsonrpc_site.dispatch, name='jsonrpc_mountpoint'),
index abf247fd2643a4a0062553e572b1898bdd4af860..7b1502bbf32bb31595c9402eb09b5a08cda98802 100644 (file)
@@ -38,6 +38,7 @@ from extra_views import CreateWithInlinesView, UpdateWithInlinesView, InlineForm
 from django.utils.translation import ugettext_lazy as _
 from django.views.decorators.csrf import csrf_exempt
 from django.db.models import Q
+from django.http import HttpResponseForbidden
 
 
 def get_course_code(obj):
@@ -513,3 +514,76 @@ def update_training(request, id):
         else:
             html+='<option value="%s">%s</option>' % (training.pk, training)
     return HttpResponse(html)
+
+
+class NewsItemMixin:
+    model = NewsItem
+    form_class = NewsItemForm
+    def get_success_url(self):
+        return reverse('teleforma-desk-period-course', 
+            kwargs={
+            'pk': self.object.course.id, 
+            'period_id': self.request.GET.get('period_id')
+            })
+
+class NewsItemCreate(NewsItemMixin, CreateView):
+    def dispatch(self, request, *args, **kwargs):
+        if not request.user.is_staff and not request.user.professor.count():
+            return HttpResponseForbidden()
+        return super(NewsItemCreate, self).dispatch(request, *args, **kwargs)
+
+    def get_initial(self):
+        course_id = self.request.GET.get('course_id')
+        course = None
+        if course_id:
+            course = get_object_or_404(Course, id=course_id)
+
+        return {
+            'course':course
+        }
+
+    def form_valid(self, form):
+        form.instance.creator = self.request.user
+        return super(NewsItemCreate, self).form_valid(form)
+
+    def get_success_url(self):
+        return reverse('teleforma-desk-period-course', 
+            kwargs={
+            'pk': self.object.course.id, 
+            'period_id': self.request.GET.get('period_id')
+            })
+
+class NewsItemUpdate(NewsItemMixin, UpdateView):
+
+    def form_valid(self, form):
+        if not self.get_object().can_edit(self.request):
+            return HttpResponseForbidden()
+        return super(NewsItemUpdate, self).form_valid(form)
+
+class NewsItemDelete(NewsItemMixin, DeleteView):
+    def delete(self, request, *args, **kwargs):
+        """
+        """
+        self.object = self.get_object()
+        if not self.object.can_delete(request):
+            return HttpResponseForbidden()
+        self.object.deleted = True
+        self.object.save()
+        return HttpResponseRedirect(self.get_success_url())
+
+class NewsItemList(ListView):
+
+    model = NewsItem
+    paginate_by = 10
+
+    def get_context_data(self, **kwargs):
+        context = super(NewsItemList, self).get_context_data(**kwargs)
+        context['course_id'] = self.request.GET.get('course_id')
+        return context
+
+    def get_queryset(self):
+        query = NewsItem.objects.filter(deleted=False)
+        course_id = self.request.GET.get('course_id')
+        if course_id:
+            query = query.filter(course__id=self.request.GET.get('course_id'))
+        return query