]> git.parisson.com Git - teleforma.git/commitdiff
fix various styles, add chat rooms, begin user import script
authoryomguy <yomguy@parisson.com>
Sat, 7 Apr 2012 22:37:55 +0000 (00:37 +0200)
committeryomguy <yomguy@parisson.com>
Sat, 7 Apr 2012 22:37:55 +0000 (00:37 +0200)
20 files changed:
example/manage.py
example/settings.py
setup.py
teleforma/htdocs/css/teleforma_black.css
teleforma/locale/fr/LC_MESSAGES/django.po
teleforma/management/__init__.py [new file with mode: 0644]
teleforma/management/commands/__init__.py [new file with mode: 0644]
teleforma/management/commands/teleforma-import-users.py [new file with mode: 0644]
teleforma/middleware.py [new file with mode: 0644]
teleforma/migrations/0003_auto__add_field_course_chat_room.py [new file with mode: 0644]
teleforma/models.py
teleforma/templates/postman/base.html
teleforma/templates/postman/view.html
teleforma/templates/teleforma/course_media.html
teleforma/templates/teleforma/courses.html
teleforma/templates/teleforma/inc/document_list.html
teleforma/templates/telemeta/base.html
teleforma/templates/telemeta/inc/user_list.html
teleforma/urls.py
teleforma/views.py

index bcdd55e27be9447bf6b224b8ba0cbc6802509862..c632a8a38923012b836655195baeadd5c2ffd930 100755 (executable)
@@ -1,11 +1,9 @@
-#!/usr/bin/python
-from django.core.management import execute_manager
-try:
-    import settings # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
-    sys.exit(1)
+#!/usr/bin/env python
+import os, sys
 
 if __name__ == "__main__":
-    execute_manager(settings)
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
index e169232cdbc4a30ad7498561cac1ad503ea73c30..a1d627d029056d0c8f0d58332d9d6131f67e9820 100644 (file)
@@ -111,7 +111,7 @@ MIDDLEWARE_CLASSES = (
     'pagination.middleware.PaginationMiddleware',
 )
 
-ROOT_URLCONF = 'example.urls'
+ROOT_URLCONF = 'urls'
 
 TEMPLATE_DIRS = (
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
@@ -136,7 +136,12 @@ INSTALLED_APPS = (
     'django_extensions',
     'pagination',
     'postman',
-    'private_files',
+#    'private_files',
+    'markup_mixin',
+    'notes',
+#    'jquery',
+    'jqchat',
+#    'follow',
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = (
@@ -168,4 +173,4 @@ DEFAULT_FROM_EMAIL = 'webmaster@parisson.com'
 
 POSTMAN_AUTO_MODERATE_AS=True
 
-FILE_PROTECTION_METHOD = 'basic'
+FILE_PROTECTION_METHOD = 'xsendfile'
index e9c06a92d30d4011bfc23e949947c6eb9ec4b7bd..d6afafb4a946b14dcf65a8d2ab6c7065f34b6f76 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -22,6 +22,7 @@ setup(
         'django-pagination',
         'django-postman',
         'django-extensions',
+        'django-notes',
   ],
   platforms=['OS Independent'],
   license='CeCILL v2',
index a2aaeacb8df51803f1923d61037f278089143f0b..783da0d66ad6f263957e9884160885161e95586a 100644 (file)
@@ -464,7 +464,8 @@ form.login .submit {
 }
 
 #menu .darkblue { border-bottom-color: #0f3179; }
-#menu .blue { border-bottom-color:  #4f628a; }
+/* #menu .blue { border-bottom-color:  #357ae8; } */
+#menu .blue { border-bottom-color: #4f628a; }
 #menu .green { border-bottom-color:  #92b220; }
 #menu .yellow { border-bottom-color:  #f3ad17; }
 #menu .orange { border-bottom-color:  #e65911; }
@@ -924,7 +925,7 @@ img.align-left {
     border: 1px solid #000;
     background-image: url(../images/grid_bg_2.png);
     padding: 0.3em 0.4em 0.4em 0.4em;
-    margin: 3.5em 0em 1.5em 1.5em;
+    margin: 4em 1em 1em 0em;
     -moz-border-radius: 8px 0px 8px 8px;
     -webkit-border-radius: 8px 0px 8px 8px;
     border-radius: 8px 0px 8px 8px;
@@ -934,6 +935,8 @@ img.align-left {
     color: #FFF;
     font-size: 1.1em;
     font-weight: bold;
+    -webkit-margin-before: 0.2em;
+    -webkit-margin-after: 0.2em;
 }
 
 #module-set .module a:hover {
@@ -953,7 +956,7 @@ a.image-link {
 }
 
 .home-description {
-    padding-right: 15%;
+    padding-right: 33%;
     display: block;
 }
 
@@ -1141,19 +1144,21 @@ a.image-link {
     color: #000; /*#6A0307;*/
 }
 
-#button_action_blue {
-    background-color:  #4b8df8;
+#action_blue {
+    background-color: #357ae8;
     color: #FFF;
     padding:0.8em 0.8em 0.8em 0.8em;
     }
 
-#button_action_red {
-    background-color:  #d34836;
+
+#action_red {
+    background-color:  #dd4b39;
     color: #FFF;
     padding:0.8em 0.8em 0.8em 0.8em;
     }
-#button_action_green {
-    background-color:  #92b220;
+
+#action_green {
+    background-color:  #3c9200;
     color: #FFF;
     padding:0.8em 0.8em 0.8em 0.8em;
         }
@@ -1333,7 +1338,7 @@ input,textarea{
 
 .desk_center {
     float: left;
-    width:60%;
+    width:58%;
     padding: 0em 0em 0em 1em;
     }
 
@@ -1354,7 +1359,7 @@ input,textarea{
     -moz-border-radius: 8px 0px 0px 0px;
     -webkit-border-radius: 8px 0px 0px 0px;
     border-radius: 8px 0px 0px 0px;
-    padding: 0em 0.8em 0.8em 0em;
+    padding: 0em 0.8em 0.3em 0em;
     font-weight: bold;
     font-size: 1.2em;
     }
@@ -1383,10 +1388,10 @@ input,textarea{
 /*     border: 2px solid #CCC; */
     }
 
-.media_infos {
+#media_infos {
     background-color: #FFF;
     padding: 0.3em 0.8em 0.3em 0.8em;
-    width: 100%;
+    width: 620px;
     }
 
 .video {
@@ -1436,8 +1441,33 @@ input,textarea{
 
     }
 
-#pm_write {
+.module_action {
     text-align: center;
     margin: 0em 0em 3em 0em;
     padding: 1em;
-}
\ No newline at end of file
+}
+
+
+#chatwindow {
+    height: 340px;
+    width: 187px;
+    border-bottom: 1px solid;
+    padding: 0.8em 2em 0em 0em;
+    overflow: auto;
+    background-color: white;
+}
+
+#users {
+    padding: 0.8em 0em 0em 0em;
+    background-color: #FFF;
+    -moz-border-radius: 8px 0px 8px 8px;
+    -webkit-border-radius: 8px 0px 8px 8px;
+    border-radius: 8px 0px 8px 8px;
+    }
+
+#spacing td {
+    padding: 1em 1em 1em 0.3em;
+    font-size: 0.8em;
+    font-weight: normal;
+    }
+
index 2246d8a356fc9693b6f44c85f94361631289c484..04325eec64c5ed7cbc4540ce37110d4f92cbfb6c 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-04-04 22:38+0200\n"
+"POT-Creation-Date: 2012-04-05 11:53+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,200 +18,199 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 
-#: models.py:61 models.py:73 models.py:87 models.py:100 models.py:144
-#: models.py:257 models.py:272 models.py:289 models.py:302 models.py:315
+#: models.py:63 models.py:75 models.py:89 models.py:102 models.py:148
+#: models.py:261 models.py:276 models.py:293 models.py:306 models.py:319
 msgid "name"
 msgstr "nom"
 
-#: models.py:62 models.py:74 models.py:88 models.py:101 models.py:114
-#: models.py:145 models.py:202 models.py:258
+#: models.py:64 models.py:76 models.py:90 models.py:103 models.py:116
+#: models.py:149 models.py:206 models.py:262
 msgid "description"
 msgstr "description"
 
-#: models.py:69 models.py:75 models.py:143
+#: models.py:71 models.py:77 models.py:147
 msgid "organization"
 msgstr "organisation"
 
-#: models.py:82 models.py:112
+#: models.py:84 models.py:114
 msgid "department"
 msgstr "département"
 
-#: models.py:95 models.py:115 models.py:329
+#: models.py:97 models.py:117 models.py:333
 msgid "category"
 msgstr "catégorie"
 
-#: models.py:96
+#: models.py:98
 msgid "categories"
 msgstr "catégories"
 
-#: models.py:108
+#: models.py:110
 #, fuzzy
 msgid "type"
 msgstr "type mime"
 
-#: models.py:113 models.py:201
+#: models.py:115 models.py:205
 msgid "title"
 msgstr "titre"
 
-#: models.py:116
+#: models.py:118
 msgid "course type"
 msgstr "type de matière"
 
-#: models.py:117 models.py:203 models.py:271 models.py:290 models.py:303
-#: models.py:316
+#: models.py:119 models.py:207 models.py:275 models.py:294 models.py:307
+#: models.py:320
 msgid "code"
 msgstr "cote"
 
-#: models.py:124 models.py:157
+#: models.py:128 models.py:161
 msgid "course"
 msgstr "matière"
 
-#: models.py:129 models.py:328 models.py:355
+#: models.py:133 models.py:332 models.py:359
 msgid "user"
 msgstr "utilisateur"
 
-#: models.py:130 models.py:273
+#: models.py:134 models.py:277
 msgid "courses"
 msgstr "matières"
 
-#: models.py:138 models.py:158
+#: models.py:142 models.py:162
 msgid "professor"
 msgstr "professeur"
 
-#: models.py:152 models.py:161
+#: models.py:156 models.py:165
 msgid "room"
 msgstr "salle"
 
-#: models.py:159
+#: models.py:163
 msgid "session"
 msgstr "session"
 
-#: models.py:163
+#: models.py:167
 msgid "comment"
 msgstr ""
 
-#: models.py:164
+#: models.py:168
 msgid "begin date"
 msgstr "date de début"
 
-#: models.py:165
+#: models.py:169
 msgid "end date"
 msgstr "date de fin"
 
-#: models.py:178 models.py:205 models.py:236
+#: models.py:182 models.py:209 models.py:240
 msgid "conference"
 msgstr "conférence"
 
-#: models.py:184
+#: models.py:188
 msgid "credits"
 msgstr "crédits"
 
-#: models.py:185
+#: models.py:189
 msgid "published"
 msgstr "publié"
 
-#: models.py:186
+#: models.py:190
 msgid "date added"
 msgstr "date d'ajout"
 
-#: models.py:187
+#: models.py:191
 msgid "date modified"
 msgstr "date de modification"
 
-#: models.py:207
+#: models.py:211
 msgid "annal"
 msgstr "annale"
 
-#: models.py:208
+#: models.py:212
 msgid "file"
 msgstr "fichier"
 
-#: models.py:240
+#: models.py:244
 msgid "is live"
 msgstr "en direct"
 
-#: models.py:265 models.py:266
+#: models.py:269 models.py:270
 msgid "IEJ"
 msgstr "IEJ"
 
-#: models.py:275
+#: models.py:279
 msgid "synthesis note"
-msgstr ""
+msgstr "note de synthèse"
 
-#: models.py:276
-#, fuzzy
+#: models.py:280
 msgid "obligation"
-msgstr "organisation"
+msgstr "obligation"
 
-#: models.py:284 models.py:332
+#: models.py:288 models.py:336
 msgid "training"
 msgstr "formation"
 
-#: models.py:297 models.py:334
+#: models.py:301 models.py:338
 msgid "procedure"
 msgstr "procédure"
 
-#: models.py:310
+#: models.py:314
 msgid "speciality"
 msgstr "spécialité"
 
-#: models.py:323
+#: models.py:327
 msgid "oral"
 msgstr ""
 
-#: models.py:330
+#: models.py:334
 msgid "iej"
 msgstr "iej"
 
-#: models.py:336
+#: models.py:340
 msgid "oral speciality"
 msgstr "spécialité orale"
 
-#: models.py:338
+#: models.py:342
 msgid "written speciality"
 msgstr "spécialité écrit"
 
-#: models.py:340 models.py:342
+#: models.py:344 models.py:346
 msgid "oral 1"
 msgstr ""
 
-#: models.py:349
+#: models.py:353
 msgid "student"
 msgstr "étudiant"
 
-#: models.py:356
+#: models.py:360
 msgid "Address"
 msgstr ""
 
-#: models.py:357
+#: models.py:361
 msgid "Postal code"
 msgstr "Code postal"
 
-#: models.py:358
+#: models.py:362
 msgid "City"
 msgstr "Ville"
 
-#: models.py:359
+#: models.py:363
 msgid "Country"
 msgstr "Pays"
 
-#: models.py:360
+#: models.py:364
 msgid "Language"
 msgstr "Langue"
 
-#: models.py:361
+#: models.py:365
 msgid "Telephone"
 msgstr "Téléphone"
 
-#: models.py:362
+#: models.py:366
 msgid "Expiration_date"
 msgstr "Date d'expiration"
 
-#: models.py:363
+#: models.py:367
 msgid "Password initialization"
 msgstr ""
 
-#: models.py:367
+#: models.py:371
 msgid "profile"
 msgstr "profil"
 
@@ -484,12 +483,21 @@ msgstr "Session"
 msgid "Professor"
 msgstr "Professeur"
 
+#: templates/teleforma/course_detail.html:12
+msgid "My notes"
+msgstr "Mes notes"
+
+#: templates/teleforma/course_detail.html:22
+#: templates/teleforma/courses.html:27
+msgid "New note"
+msgstr "Nouvelle note"
+
 #: templates/teleforma/course_media.html:48
 #, fuzzy
 msgid "Recording date"
 msgstr "date de début"
 
-#: templates/teleforma/courses.html:12
+    #: templates/teleforma/courses.html:13
 msgid "My courses"
 msgstr "Mes matières"
 
@@ -546,29 +554,33 @@ msgstr ""
 msgid "Profile"
 msgstr "profil"
 
-#: templates/telemeta/base.html:103
+#: templates/telemeta/base.html:104
+msgid "Lists"
+msgstr ""
+
+#: templates/telemeta/base.html:106
 msgid "Help"
 msgstr ""
 
-#: templates/telemeta/base.html:104
+#: templates/telemeta/base.html:107
 msgid "Sign out"
 msgstr ""
 
-#: templates/telemeta/base.html:145
+#: templates/telemeta/base.html:148
 msgid "Powered by"
 msgstr ""
 
-#: templates/telemeta/base.html:146
+#: templates/telemeta/base.html:149
 msgid "By"
 msgstr ""
 
-#: templates/telemeta/base.html:151
+#: templates/telemeta/base.html:154
 msgid ""
 "Usage of the archives in the respect of cultural heritage of the original "
 "communities."
 msgstr ""
 
-#: templates/telemeta/base.html:157
+#: templates/telemeta/base.html:160
 msgid "Legal notices"
 msgstr ""
 
@@ -589,9 +601,8 @@ msgid "Last Name"
 msgstr ""
 
 #: templates/telemeta/inc/user_list.html:11
-#, fuzzy
 msgid "Training"
-msgstr "formation"
+msgstr "Formation"
 
 #, fuzzy
 #~ msgid "Last modification"
diff --git a/teleforma/management/__init__.py b/teleforma/management/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/teleforma/management/commands/__init__.py b/teleforma/management/commands/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/teleforma/management/commands/teleforma-import-users.py b/teleforma/management/commands/teleforma-import-users.py
new file mode 100644 (file)
index 0000000..aac7ae9
--- /dev/null
@@ -0,0 +1,33 @@
+from optparse import make_option
+from django.conf import settings
+from django.core.management.base import BaseCommand, CommandError
+from telemeta.models import *
+from telemeta.util.unaccent import unaccent
+from teleforma.models import *
+import logging
+import codecs
+import xlrd
+
+
+class Command(BaseCommand):
+    help = "Import users from a XLS file (see an example in example/data/"
+    args = "path"
+    first_row = 2
+
+    def import_user(self, row):
+        last_name = row[0].value
+        first_name = row[1].value
+        print first_name, last_name
+
+    def handle(self, *args, **options):
+        file = args[0]
+        book = xlrd.open_workbook(file)
+        sheet = book.sheet_by_index(0)
+        col = sheet.col(0)
+        for i in range(self.first_row, len(col)):
+            self.import_user(sheet.row(i))
+
+        print "Done, imported %s users" % str(i)
+
+
+
diff --git a/teleforma/middleware.py b/teleforma/middleware.py
new file mode 100644 (file)
index 0000000..2dd2e6e
--- /dev/null
@@ -0,0 +1,25 @@
+from telemeta.models.system import *
+from teleforma.models import *
+
+
+class OnlyOneUserMiddleware(object):
+
+    def process_request(self, request):
+        if not request.user.is_anonymous():
+            profile = UserProfile.objects.get(user=request.user)
+            cur_session_key = profile.last_session_key
+            if cur_session_key and cur_session_key != request.session.session_key:
+                sessions = Session.objects.filter(session_key=cur_session_key)
+                if sessions:
+                    for session in sessions:
+                        Session.objects.get(session_key=cur_session_key).delete()
+            #the following can be optimized(do not save each time if value not changed)
+            profile.session_key = request.session.session_key
+            profile.save()
+
+
+class ExportSecurity(object):
+
+    def process_view(self, item_export):
+        pass
+        
diff --git a/teleforma/migrations/0003_auto__add_field_course_chat_room.py b/teleforma/migrations/0003_auto__add_field_course_chat_room.py
new file mode 100644 (file)
index 0000000..d13202e
--- /dev/null
@@ -0,0 +1,410 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Course.chat_room'
+        db.add_column('teleforma_course', 'chat_room',
+                      self.gf('django.db.models.fields.related.OneToOneField')(to=orm['jqchat.Room'], unique=True, null=True, blank=True),
+                      keep_default=False)
+
+    def backwards(self, orm):
+        # Deleting field 'Course.chat_room'
+        db.delete_column('teleforma_course', 'chat_room_id')
+
+    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'})
+        },
+        'jqchat.room': {
+            'Meta': {'ordering': "['created']", 'object_name': 'Room'},
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'description_modified': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_activity': ('django.db.models.fields.IntegerField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'notes.note': {
+            'Meta': {'object_name': 'Note'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 4, 5, 0, 0)'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'m'", 'max_length': '1'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'rendered_content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['notes.Topic']"})
+        },
+        'notes.topic': {
+            'Meta': {'object_name': 'Topic'},
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'slug': ('django_extensions.db.fields.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '50', 'separator': "u'-'", 'blank': 'True', 'populate_from': "'title'", 'overwrite': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.category': {
+            'Meta': {'object_name': 'Category'},
+            '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.conference': {
+            'Meta': {'object_name': 'Conference'},
+            'comment': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
+            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'professor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Professor']"}),
+            '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'})
+        },
+        'teleforma.course': {
+            'Meta': {'object_name': 'Course'},
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Category']"}),
+            'chat_room': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['jqchat.Room']", 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            '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'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.CourseType']"})
+        },
+        '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'},
+            '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': "'department'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.document': {
+            'Meta': {'object_name': 'Document'},
+            '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', 'to': "orm['teleforma.Conference']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}),
+            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'db_column': "'filename'", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.iej': {
+            'Meta': {'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.media': {
+            'Meta': {'object_name': 'Media'},
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Conference']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'media'", 'to': "orm['teleforma.Course']"}),
+            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'date_added': ('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'}),
+            'is_live': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            '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']"})
+        },
+        'teleforma.oral': {
+            'Meta': {'object_name': 'Oral'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        '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.procedure': {
+            'Meta': {'object_name': 'Procedure'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.professor': {
+            'Meta': {'object_name': 'Professor'},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            '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.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            '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'}),
+            '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']"})
+        },
+        '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.speciality': {
+            'Meta': {'object_name': 'Speciality'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.student': {
+            'Meta': {'object_name': 'Student'},
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'to': "orm['teleforma.Category']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iej': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'to': "orm['teleforma.IEJ']"}),
+            'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1'", 'null': 'True', 'to': "orm['teleforma.Oral']"}),
+            'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2'", 'null': 'True', 'to': "orm['teleforma.Oral']"}),
+            'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_oral_spe'", 'null': 'True', 'to': "orm['teleforma.Speciality']"}),
+            'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'to': "orm['teleforma.Procedure']"}),
+            'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', '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': "'student_written_spe'", 'null': 'True', 'to': "orm['teleforma.Speciality']"})
+        },
+        'teleforma.training': {
+            'Meta': {'object_name': 'Training'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training'", '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', 'blank': 'True'}),
+            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        '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'}),
+            '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'}),
+            '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'}),
+            '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'}),
+            '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': '100', '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'}),
+            'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', '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'}),
+            'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
+            'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', '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.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.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 7ca8f2dc45766a2c84874c7d22fff6d868bdc2de..e8832803e926f9dcbe683a2955b7d770b40ec176 100755 (executable)
@@ -49,6 +49,9 @@ from django.utils.translation import ugettext_lazy as _
 from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 from teleforma.fields import *
+from django.contrib.contenttypes import generic
+from notes.models import Note
+import jqchat.models
 
 app_label = 'teleforma'
 
@@ -115,6 +118,10 @@ class Course(Model):
     category        = ForeignKey('Category', related_name='course', verbose_name=_('category'))
     type            = ForeignKey('CourseType', related_name='course', verbose_name=_('course type'))
     code            = CharField(_('code'), max_length=255)
+    chat_room       = OneToOneField(jqchat.models.Room, help_text='Chat room to be used for this lobby.',
+                                    blank=True, null=True)
+
+    notes = generic.GenericRelation(Note)
 
     def __unicode__(self):
         return ' - '.join([self.department.name, self.category.name, self.title, self.type.name])
@@ -186,6 +193,8 @@ class MediaBase(Model):
     date_added      = DateTimeField(_('date added'), auto_now_add=True)
     date_modified   = DateTimeField(_('date modified'), auto_now=True)
 
+    notes = generic.GenericRelation(Note)
+
     def get_fields(self):
         return self._meta.fields
 
@@ -239,6 +248,7 @@ class Media(MediaBase):
                                  verbose_name='item', blank=True, null=True)
     is_live         = BooleanField(_('is live'))
 
+
     def __unicode__(self):
         description = self.course.title
         if self.item:
index d34d2fba5d34f002c3fe3873523b169a1fb896f7..54e88b8030ce4892f84dd3e6d41b440f386094d7 100644 (file)
@@ -19,8 +19,8 @@
 </ul>
 </div>
 </div>
-<div id="pm_write">
-<a href="{% url postman_write %}" class="component_icon button" id="button_action_red">{% trans "New message" %}</a>
+<div class="module_action">
+<a href="{% url postman_write %}" class="component_icon button" id="action_green">{% trans "New message" %}</a>
 </div>
 </div>
 
index 56a1fd08bd3643ec16ac5dda34ef00f742ffea17..4e4899c1ec69022981d21a177b134310a1ba92c8 100644 (file)
@@ -17,7 +17,7 @@
 {% if message.is_rejected %}  <div class="pm_status">{% trans "Rejected" %}{% if message.moderation_reason %}{% trans ":" %} {{ message.moderation_reason }}{% endif %}</div>{% endif %}
  </div>
  <hr />
- <div class="pm_body">{{ message.body|linebreaksbr }}</div>
+ <div class="pm_body">{{ message.body|urlize|linebreaksbr }}</div>
 </div>
 <br />
 {% if forloop.last %}
index 2ff34b49cf164a597fed55c8379e33b43c32ef1d..0efe8449c537f7f6d1898db5e14c684448c8351d 100644 (file)
@@ -4,10 +4,19 @@
 
 
 {% block extra_javascript %}
+
 {% if "video" in mime_type %}
-<link href="http://vjs.zencdn.net/c/video-js.css" rel="stylesheet">
-<script src="http://vjs.zencdn.net/c/video.js"></script>
+<script src="{% url telemeta-video-js "video.js" %}"></script>
+<link href="{% url telemeta-video-js "video-js.css" %}" rel="stylesheet">
 {% endif %}
+
+<script type="text/javascript" src="/static/jqchat/jqchat.js"></script>
+<script type="text/javascript">
+$(document).ready(function(){
+    InitChatWindow("{% url jqchat_ajax room.id %}", null);
+    });
+</script>
+
 {% endblock extra_javascript %}
 
 {% block course %}
 
 {% if "video" in mime_type %}
 <div class="video">
-<video id="my_video_1" class="video-js vjs-default-skin" width="640" height="360" controls preload="auto" data-setup="{}">
+<video id="my_video_1" class="video-js vjs-default-skin" width="640" height="360" controls preload="auto" data-setup='{}'>
 <!-- Hello Chrome and Firefox (and Opera?) -->
 <source src="{% url telemeta-item-export media.item.public_id mime_type|mime_to_ext %}" type="{{ mime_type }}" />
 </video>
 </div>
 
-
 {% elif "audio" in mime_type %}
-
 <div class="audio">
 <iframe width='640' height='200' frameborder='0' scrolling='no' marginheight='0' marginwidth='0' src="{% url telemeta-item-player-simple  media.item.public_id 640 130 %}"></iframe>
 </div>
-
 {% endif %}
 
 </div>
 
-<div class="media_infos">
-
 {% block general_info %}
+<div class="course_content" id="media_infos">
 <dl class="listing">
 {% dl_field item "title" placeholder %}
-<dt>{% field_label item "collection" %}</dt>
-<dd><a href="{% url telemeta-collection-detail item.collection.public_id %}">{{ item.collection }}</a></dd>
+<dt>{% field_label item "approx_duration" %}</dt>
+<dd>{{ item.approx_duration }}</a></dd>
 <dt>{% trans "Recording date" %}</dt>
-
 <dd>{% if item.recorded_from_date %}{{ item.recorded_from_date }}{% endif %}{% if item.recorded_from_date and item.recorded_to_date%} - {% endif %}{% if item.recorded_to_date %}{{ item.recorded_to_date}}{% endif %}</dd>
-
 </dl>
+</div>
 {% endblock general_info %}
 
 </div>
+{% endblock course %}
 
-
+{% block chat %}
+{% if room %}
+
+<div id="module-set" style="width: 240px">
+
+<div class="module">
+<h3><img src="{% url telemeta-images "search_wh2.png" %}" alt="rss" style="vertical-align:middle" />{% trans "Questions" %}</h3>
+<div style="background: white;">
+<div id="chatwindow"><span id="loading">Loading...</span></div>
+<form id="chatform">{% csrf_token %}
+<label for="msg"></label>
+<input type="text" id="msg" /><br />
+<input type="submit" value="Ask" /><br />
+</form>
+<!--<script type="text/javascript">document.getElementById("msg").focus();</script>-->
 </div>
-{% endblock course %}
+</div>
+</div>
+</div>
+
+
+{% endif %}
+{% endblock chat %}
index 5144f3c0ddad488f208d4646951c91ad4139b709..1fc6c6c08de3d0531b4a403442566cb87634a41f 100644 (file)
@@ -8,9 +8,9 @@
 {% block content %}
 
 <div id="module-set-left" style="width: 20%">
+
 <div class="module">
 <h3><img src="{% url telemeta-images "module_playlist.png" %}" alt="playlists" style="vertical-align:middle" />{% trans "My courses" %}</h3>
-
 <div style="background: white;">
 <ul>
 {% block courses %}
 </ul>
 </div>
 </div>
+
+{% block notes %}
+<div class="module">
+<h3><img src="{% url telemeta-images "module_playlist.png" %}" alt="playlists" style="vertical-align:middle" />{% trans "My notes" %}</h3>
+<div style="background: white;">
+<ul>
+{% for note in notes %}
+<li>{{ note.content }}</li>
+{% endfor %}
+</ul>
+</div>
+</div>
+<div class="module_action">
+<a href="#" class="component_icon button" id="action_blue">{% trans "New note" %}</a>
 </div>
+{% endblock notes %}
 
+</div>
 
 
-    <div class="desk_center">
-    {% block course %}
 
+<div class="desk_center">
+    {% block course %}
     {% for course in object_list %}
       <div class="course">
         <div class="course_title">{{ course.title }}{% if course.description %} - {{ course.description }}{% endif %}
         {% endblock %}
 
       </div>
-
     {% endfor %}
     {% endblock course %}
-
     </div>
+</div>
 
+{% block chat %}
+{% endblock chat %}
 
-
-</div>
-{% endblock %}
+{% endblock content %}
 
 
index f5d010d816492bb13b30f199a04cc6fc07eeba6c..79ccc43cbe3d39082269fa7df1df313b369acce2 100644 (file)
@@ -13,7 +13,7 @@
     <tbody>
         {% for document in course.document.all %}
         <tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
-        <td><a href="{% url teleforma-document-view document.id %}">{{ document.title }}</a></td>
+        <td><a href="{% url teleforma-document-view document.id %}" target="_blank">{{ document.title }}</a></td>
         <td>{{ document.description }}</td>
         <td>{{ document.date_added }}</td>
         </tr>
index 0214d9f3fcd8dc87d3b927657a5704dd22b75d97..edf7fc28678145f00c67644f5747a5a58a7187d6 100644 (file)
@@ -120,21 +120,23 @@ alt="Telemeta Powered"/>-->
 {% endblock header %}
 
 <div id="content">
-    <table id="content_header"><tr>
-            <td class="leftcol"><h1>{% block title %}{% endblock %}</h1></td>
-            <td class="rightcol">{% block title_buttons %}{% endblock %}</td>
-    </tr></table>
 
-{% block postman_menu %}
-{% endblock postman_menu %}
+        <table id="content_header"><tr>
+                <td class="leftcol"><h1>{% block title %}{% endblock %}</h1></td>
+                <td class="rightcol">{% block title_buttons %}{% endblock %}</td>
+        </tr></table>
 
-{% block content %}{% endblock %}
-<div class="nett"></div>
-{% block delete %}{% endblock %}
-</div>
+    {% block postman_menu %}
+    {% endblock postman_menu %}
+
+    {% block content %}
+    {% endblock %}
 
-{% block body %}
-{% endblock body %}
+    <div class="nett"></div>
+    {% block delete %}
+    {% endblock %}
+
+</div>
 
 {% block footer %}
 <div id="footer">
index db336020355a31b74efa570dabe855c7f846083b..7a4ca94947306b68ac6361dda09acb2d81219e86 100644 (file)
@@ -2,23 +2,54 @@
 {% load telemeta_utils %}
 {% load teleforma_tags %}
 
+<div id="users">
   <table class="listing" width="100%">
    <thead>
     <tr><th>{% trans "User"%}</th>
     <th>{% trans "First Name"%}</th>
     <th>{% trans "Last Name"%}</th>
-    <th>{% trans "Messages"%}</th>
     <th>{% trans "Training"%}</th>
+    <th>{% trans "IEJ"%}</th>
+    <th>{% trans "Procedure"%}</th>
+    <th>{% trans "Oral spe"%}</th>
+    <th>{% trans "Written spe"%}</th>
+    <th>{% trans "Oral 1"%}</th>
+    <th>{% trans "Oral 2"%}</th>
+    <th>{% trans "Synthesis note"%}</th>
+    <th>{% trans "Messages"%}</th>
     </tr>
-   </thead><tbody>
+    </thead>
+    <tbody id="spacing">
     {% for user in users %}
     <tr>
      <td><a href="{% url telemeta-profile-detail user.username %}">{{user.username}}</a></td>
      <td>{{ user.first_name }}</td>
      <td>{{ user.last_name }}</td>
-     <td><a href="{% url postman_write user.username %}" class="component_icon button icon_edit">Write</a></td>
-     <td>{% for training in user__student.training %}{{ training }} {% endfor %}</td>
+     {% if user.student.get %}
+      {% with user.student.get as student %}
+        <td>{{ student.training }}</td>
+        <td>{{ student.iej }}</td>
+        <td>{{ student.procedure }}</td>
+        <td>{{ student.oral_speciality }}</td>
+        <td>{{ student.written_speciality }}</td>
+        <td>{{ student.oral_1 }}</td>
+        <td>{{ student.oral_2 }}</td>
+        <td></td>
+     {% endwith %}
+    {% elif user.professor.get %}
+        <td>{% trans "Professor" %}</td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+
+    {% endif %}
+    <td><a href="{% url postman_write user.username %}" class="component_icon button" id="action_green">{% trans "Write" %}</a></td>
     </tr>
     {% endfor %}
     </tbody>
-  </table>
\ No newline at end of file
+  </table>
+</div>
\ No newline at end of file
index ce887552cc34a0e2786d621df930ddb5c605d8aa..2f028eb61cdc2a0172ecff6262001f7bf2bbb4ce 100644 (file)
@@ -39,6 +39,7 @@ from django.views.generic.base import *
 from teleforma.models import *
 from teleforma.views import *
 from jsonrpc import jsonrpc_site
+import jqchat.views
 
 htdocs_forma = os.path.dirname(__file__) + '/htdocs'
 
@@ -71,7 +72,7 @@ urlpatterns = patterns('',
 # JSON RPC
     url(r'json/$', jsonrpc_site.dispatch, name='jsonrpc_mountpoint'),
 
-    url(r'^private_files/', include('private_files.urls')),
-
+#    url(r'^private_files/', include('private_files.urls')),
+    url(r'^room/(?P<id>\d+)/ajax/$', jqchat.views.BasicAjaxHandler, name="jqchat_ajax"),
 
 )
index eb0c2f97f3025aaf517b035bf2267245f926fab9..da0a5c35ceb3fc4122561fed1a193bafd4a46994 100755 (executable)
@@ -26,8 +26,9 @@ from django.core.exceptions import ObjectDoesNotExist
 from django.contrib.syndication.views import Feed
 
 from teleforma.models import *
-
 from telemeta.views.base import *
+from jqchat.models import *
+
 
 
 def render(request, template, data = None, mimetype = None):
@@ -83,6 +84,8 @@ class CourseView(DetailView):
     def get_context_data(self, **kwargs):
         context = super(CourseView, self).get_context_data(**kwargs)
         context['courses'] = get_courses(self.request.user)
+        course = self.get_object()
+        context['notes'] = course.notes.all().filter(author=self.request.user)
         return context
 
 class CoursesView(ListView):
@@ -93,6 +96,7 @@ class CoursesView(ListView):
     def get_context_data(self, **kwargs):
         context = super(CoursesView, self).get_context_data(**kwargs)
         context['object_list'] = get_courses(self.request.user)
+        context['notes'] = Note.objects.filter(author=self.request.user)
         return context
 
 class MediaView(DetailView):
@@ -105,10 +109,10 @@ class MediaView(DetailView):
         context['courses'] = get_courses(self.request.user)
         media = self.get_object()
         view = ItemView()
-        print media.item.file
-        print view.item_analyze(media.item)
         context['mime_type'] = view.item_analyze(media.item)
         context['course'] = media.course
         context['item'] = media.item
+        context['notes'] = media.notes.all().filter(author=self.request.user)
+        context['room'] = media.course.chat_room
         return context