-Guillaume Pellerin <yomguy@altern.org>
+Guillaume Pellerin <yomguy@parisson.com>
Olivier Guilyardi <olivier@samalyse.com>
Riccardo Zaccarelli <riccardo.zaccarelli@gmail.com>
--- /dev/null
+
+from media import *
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2011 Parisson SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Guillaume Pellerin <yomguy@parisson.com>
+
+
+from django.forms import ModelForm
+from telemeta.models import *
+
+class MediaCorpusForm(ModelForm):
+ class Meta:
+ model = MediaCorpus
+
+class MediaCollectionForm(ModelForm):
+ class Meta:
+ model = MediaCollection
+ def clean_doctype_code(self):
+ return self.cleaned_data['doctype_code'] or 0
+
+class MediaCollectionRelatedForm(ModelForm):
+ class Meta:
+ model = MediaCollectionRelated
+
+class MediaItemForm(ModelForm):
+ class Meta:
+ model = MediaItem
+ def clean_code(self):
+ return self.cleaned_data['code'] or None
+
+class MediaItemRelatedForm(ModelForm):
+ class Meta:
+ model = MediaItemRelated
+
+class MediaItemKeywordForm(ModelForm):
+ class Meta:
+ model = MediaItemKeyword
+
+class MediaItemPerformanceForm(ModelForm):
+ class Meta:
+ model = MediaItemPerformance
+
+ def __init__(self, *args, **kwds):
+ super(MediaItemPerformanceForm, self).__init__(*args, **kwds)
+ self.fields['instrument'].queryset = Instrument.objects.order_by('name')
+ self.fields['alias'].queryset = InstrumentAlias.objects.order_by('name')
+
+class PlaylistForm(ModelForm):
+ class Meta:
+ model = Playlist
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-28 17:40+0100\n"
+"POT-Creation-Date: 2011-11-29 16:45+0100\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"
msgid "Enter a valid duration in HH:MM[:ss] format."
msgstr ""
-#: models/enum.py:41 models/enum.py:139 models/media.py:459
+#: models/enum.py:41 models/enum.py:139 models/media.py:485
msgid "value"
msgstr ""
-#: models/enum.py:57 models/media.py:183
+#: models/enum.py:57 models/media.py:198
msgid "archive format"
msgstr ""
-#: models/enum.py:64 models/media.py:166
+#: models/enum.py:64 models/media.py:181
msgid "secondary edition"
msgstr ""
-#: models/enum.py:71 models/media.py:160
+#: models/enum.py:71 models/media.py:175
msgid "mode of acquisition"
msgstr ""
-#: models/enum.py:78 models/media.py:163
+#: models/enum.py:78 models/media.py:178
msgid "record author"
msgstr ""
-#: models/enum.py:85 models/media.py:170
+#: models/enum.py:85 models/media.py:185
msgid "record writer"
msgstr ""
-#: models/enum.py:92 models/media.py:156
+#: models/enum.py:92 models/media.py:171
msgid "legal rights"
msgstr ""
-#: models/enum.py:99 models/media.py:133
+#: models/enum.py:99 models/media.py:150
msgid "recording context"
msgstr ""
msgid "A/D conversion"
msgstr ""
-#: models/enum.py:113 models/media.py:289
+#: models/enum.py:113 models/media.py:335
msgid "vernacular style"
msgstr ""
-#: models/enum.py:120 models/media.py:291
+#: models/enum.py:120 models/media.py:337
msgid "generic style"
msgstr ""
-#: models/enum.py:127 models/media.py:419
+#: models/enum.py:127 models/media.py:456
msgid "keyword"
msgstr ""
-#: models/enum.py:134 models/media.py:146
+#: models/enum.py:134 models/media.py:161
msgid "publisher / status"
msgstr ""
msgid "publisher"
msgstr ""
-#: models/enum.py:153 models/enum.py:157 models/media.py:282
+#: models/enum.py:153 models/enum.py:157 models/media.py:328
msgid "population / social group"
msgstr ""
#: models/enum.py:158 models/instrument.py:43 models/instrument.py:53
-#: models/location.py:51 models/location.py:158 models/media.py:458
+#: models/location.py:51 models/location.py:158 models/media.py:484
msgid "name"
msgstr ""
msgstr ""
#: models/location.py:112 models/location.py:169 models/location.py:184
-#: models/media.py:278
+#: models/media.py:324
msgid "location"
msgstr ""
msgid "ancestor location"
msgstr ""
-#: models/media.py:60
+#: models/media.py:70
msgid "Metadata only"
msgstr ""
-#: models/media.py:62
+#: models/media.py:72
msgid "Sound and metadata"
msgstr ""
-#: models/media.py:64
+#: models/media.py:74
msgid "Private data"
msgstr ""
-#: models/media.py:65 models/media.py:89 models/media.py:153
-#: models/media.py:306
+#: models/media.py:75 models/media.py:98 models/media.py:168
+#: models/media.py:352
msgid "public access"
msgstr ""
-#: models/media.py:85 models/media.py:128 models/media.py:303
+#: models/media.py:94 models/media.py:145 models/media.py:349
msgid "reference"
msgstr ""
-#: models/media.py:86 models/media.py:129 models/media.py:269
-#: models/media.py:378 models/media.py:477 models/media.py:492
-#: models/media.py:526
+#: models/media.py:95 models/media.py:146 models/media.py:274
+#: models/media.py:315 models/media.py:418 models/media.py:503
+#: models/media.py:518 models/media.py:549
msgid "title"
msgstr ""
-#: models/media.py:87 models/media.py:380 models/media.py:493
-#: models/media.py:528
+#: models/media.py:96 models/media.py:276 models/media.py:420
+#: models/media.py:519 models/media.py:551
msgid "description"
msgstr ""
-#: models/media.py:88 models/media.py:178 models/media.py:300
+#: models/media.py:97 models/media.py:193 models/media.py:346
msgid "code"
msgstr ""
-#: models/media.py:130 models/media.py:270
+#: models/media.py:120 models/media.py:273 models/media.py:319
+msgid "collection"
+msgstr ""
+
+#: models/media.py:122
+msgid "corpus"
+msgstr ""
+
+#: models/media.py:147 models/media.py:316
msgid "original title / translation"
msgstr ""
-#: models/media.py:131
+#: models/media.py:148
msgid "depositor / contributor"
msgstr ""
-#: models/media.py:134
+#: models/media.py:151
msgid "recording year (from)"
msgstr ""
-#: models/media.py:135
+#: models/media.py:152
msgid "recording year (until)"
msgstr ""
-#: models/media.py:136
+#: models/media.py:153
msgid "year published"
msgstr ""
-#: models/media.py:144 models/media.py:271
+#: models/media.py:159 models/media.py:317
msgid "recordist"
msgstr ""
-#: models/media.py:148
+#: models/media.py:163
msgid "publisher collection"
msgstr ""
-#: models/media.py:149
+#: models/media.py:164
msgid "publisher serial number"
msgstr ""
-#: models/media.py:150
+#: models/media.py:165
msgid "author of published notice"
msgstr ""
-#: models/media.py:151
+#: models/media.py:166
msgid "bibliographic references"
msgstr ""
-#: models/media.py:152
+#: models/media.py:167
msgid "document type"
msgstr ""
-#: models/media.py:161
+#: models/media.py:176
msgid "CNRS depositor"
msgstr ""
-#: models/media.py:164
+#: models/media.py:179
msgid "related documentation"
msgstr ""
-#: models/media.py:167
+#: models/media.py:182
msgid "copies"
msgstr ""
-#: models/media.py:168
+#: models/media.py:183
msgid "comment"
msgstr ""
-#: models/media.py:171
+#: models/media.py:186
msgid "archiver notes"
msgstr ""
-#: models/media.py:172
+#: models/media.py:187
msgid "items finished"
msgstr ""
-#: models/media.py:173
+#: models/media.py:188
msgid "recordist identical to depositor"
msgstr ""
-#: models/media.py:174
+#: models/media.py:189
msgid "published"
msgstr ""
-#: models/media.py:175
+#: models/media.py:190
msgid "conservation site"
msgstr ""
-#: models/media.py:179 models/media.py:301
+#: models/media.py:194 models/media.py:347
msgid "old code"
msgstr ""
-#: models/media.py:180 models/media.py:310
+#: models/media.py:195 models/media.py:356
msgid "approximative duration"
msgstr ""
-#: models/media.py:181
+#: models/media.py:196
msgid "number of components (medium / piece)"
msgstr ""
-#: models/media.py:185
+#: models/media.py:200
msgid "digitization"
msgstr ""
-#: models/media.py:186
+#: models/media.py:201
msgid "status"
msgstr ""
-#: models/media.py:187
+#: models/media.py:202
msgid "a_informer_07_03"
msgstr ""
-#: models/media.py:221
+#: models/media.py:236
msgid "states / nations"
msgstr ""
-#: models/media.py:235
+#: models/media.py:250
msgid "populations / social groups"
msgstr ""
-#: models/media.py:243 models/media.py:354
+#: models/media.py:258 models/media.py:400
msgid "computed duration"
msgstr ""
-#: models/media.py:273
-msgid "collection"
+#: models/media.py:275 models/media.py:419 models/media.py:550
+#: models/media.py:569 models/media.py:583
+msgid "date"
+msgstr ""
+
+#: models/media.py:277 models/media.py:421 models/media.py:568
+msgid "mime_type"
msgstr ""
-#: models/media.py:274
+#: models/media.py:278 models/media.py:422
+msgid "url"
+msgstr ""
+
+#: models/media.py:279 models/media.py:423
+msgid "credits"
+msgstr ""
+
+#: models/media.py:280 models/media.py:353 models/media.py:424
+msgid "file"
+msgstr ""
+
+#: models/media.py:320
msgid "recording date (from)"
msgstr ""
-#: models/media.py:275
+#: models/media.py:321
msgid "recording date (until)"
msgstr ""
-#: models/media.py:279
+#: models/media.py:325
msgid "location details"
msgstr ""
-#: models/media.py:280
+#: models/media.py:326
msgid "cultural area"
msgstr ""
-#: models/media.py:283
+#: models/media.py:329
msgid "language"
msgstr ""
-#: models/media.py:284
+#: models/media.py:330
msgid "comments / ethnographic context"
msgstr ""
-#: models/media.py:285
+#: models/media.py:331
msgid "moda_execut"
msgstr ""
-#: models/media.py:292
+#: models/media.py:338
msgid "author / compositor"
msgstr ""
-#: models/media.py:295
+#: models/media.py:341
msgid "remarks"
msgstr ""
-#: models/media.py:296
+#: models/media.py:342
msgid "recordist selection"
msgstr ""
-#: models/media.py:297
+#: models/media.py:343
msgid "recordist as in collection"
msgstr ""
-#: models/media.py:302
+#: models/media.py:348
msgid "item number"
msgstr ""
-#: models/media.py:304
+#: models/media.py:350
msgid "published references"
msgstr ""
-#: models/media.py:305
+#: models/media.py:351
msgid "copy of"
msgstr ""
-#: models/media.py:307 models/media.py:384
-msgid "file"
-msgstr ""
-
-#: models/media.py:317 models/media.py:559
+#: models/media.py:363 models/media.py:582
#: templates/telemeta_default/mediaitem_detail.html:192
#: templates/telemeta_default/mediaitem_detail_video.html:192
msgid "keywords"
msgstr ""
-#: models/media.py:377 models/media.py:418 models/media.py:432
-#: models/media.py:456 models/media.py:476 models/media.py:523
-#: models/media.py:544
+#: models/media.py:417 models/media.py:455 models/media.py:466
+#: models/media.py:482 models/media.py:502 models/media.py:546
+#: models/media.py:567
msgid "item"
msgstr ""
-#: models/media.py:379 models/media.py:527 models/media.py:546
-#: models/media.py:560
-msgid "date"
-msgstr ""
-
-#: models/media.py:381 models/media.py:545
-msgid "mime_type"
-msgstr ""
-
-#: models/media.py:382
-msgid "url"
-msgstr ""
-
-#: models/media.py:383
-msgid "credits"
-msgstr ""
-
-#: models/media.py:434
+#: models/media.py:468
msgid "composition"
msgstr ""
-#: models/media.py:436
+#: models/media.py:470
msgid "vernacular name"
msgstr ""
-#: models/media.py:437
+#: models/media.py:471
msgid "number"
msgstr ""
-#: models/media.py:438
+#: models/media.py:472
msgid "interprets"
msgstr ""
-#: models/media.py:457
+#: models/media.py:483
msgid "id"
msgstr ""
-#: models/media.py:460
+#: models/media.py:486
msgid "unit"
msgstr ""
-#: models/media.py:478
+#: models/media.py:504
msgid "start"
msgstr ""
-#: models/media.py:479
+#: models/media.py:505
msgid "end"
msgstr ""
-#: models/media.py:490 models/media.py:509 models/media.py:524
+#: models/media.py:516 models/media.py:532 models/media.py:547
msgid "public_id"
msgstr ""
-#: models/media.py:510
+#: models/media.py:533
msgid "playlist"
msgstr ""
-#: models/media.py:511
+#: models/media.py:534
msgid "resource_type"
msgstr ""
-#: models/media.py:512
+#: models/media.py:535
msgid "resource_id"
msgstr ""
-#: models/media.py:525 models/system.py:54
+#: models/media.py:548 models/system.py:54
msgid "time"
msgstr ""
-#: models/media.py:529
+#: models/media.py:552
msgid "author"
msgstr ""
-#: models/media.py:547
+#: models/media.py:570
msgid "transcoded"
msgstr ""
msgstr ""
#: templates/telemeta_default/collection_detail.html:5
-#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:351
+#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:352
msgid "Collection"
msgstr ""
#: templates/telemeta_default/mediaitem_add.html:5
#: templates/telemeta_default/mediaitem_copy.html:5
#: templates/telemeta_default/mediaitem_detail.html:5
-#: templates/telemeta_default/mediaitem_detail_video.html:5 web/base.py:489
+#: templates/telemeta_default/mediaitem_detail_video.html:5 web/base.py:490
msgid "Item"
msgstr ""
msgid "User Profile"
msgstr ""
-#: templates/telemeta_default/profile_detail.html:8 web/base.py:1254
+#: templates/telemeta_default/profile_detail.html:8 web/base.py:1255
msgid "User profile"
msgstr ""
msgid "No item"
msgstr ""
-#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1284
+#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1285
msgid "Last changes"
msgstr ""
msgstr[0] ""
msgstr[1] ""
-#: web/base.py:350 web/base.py:488 web/base.py:779 web/base.py:1253
+#: web/base.py:351 web/base.py:489 web/base.py:780 web/base.py:1254
msgid "Access not allowed"
msgstr ""
-#: web/base.py:352 web/base.py:490 web/base.py:781 web/base.py:1255
+#: web/base.py:353 web/base.py:491 web/base.py:782 web/base.py:1256
msgid ""
"Please login or contact the website administator to get a private access."
msgstr ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-28 17:40+0100\n"
+"POT-Creation-Date: 2011-11-29 16:45+0100\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"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-28 17:40+0100\n"
+"POT-Creation-Date: 2011-11-29 16:45+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Olivier Guilyardi <olivier samalyse com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "Enter a valid duration in HH:MM[:ss] format."
msgstr "Entrez une durée valide au format HH:MM[:ss]"
-#: models/enum.py:41 models/enum.py:139 models/media.py:459
+#: models/enum.py:41 models/enum.py:139 models/media.py:485
msgid "value"
msgstr "valeur"
-#: models/enum.py:57 models/media.py:183
+#: models/enum.py:57 models/media.py:198
msgid "archive format"
msgstr "format du support"
-#: models/enum.py:64 models/media.py:166
+#: models/enum.py:64 models/media.py:181
msgid "secondary edition"
msgstr "réédition"
-#: models/enum.py:71 models/media.py:160
+#: models/enum.py:71 models/media.py:175
msgid "mode of acquisition"
msgstr "mode d'acquisition"
-#: models/enum.py:78 models/media.py:163
+#: models/enum.py:78 models/media.py:178
msgid "record author"
msgstr "rédacteur fiche"
-#: models/enum.py:85 models/media.py:170
+#: models/enum.py:85 models/media.py:185
msgid "record writer"
msgstr "saisie fiche"
-#: models/enum.py:92 models/media.py:156
+#: models/enum.py:92 models/media.py:171
msgid "legal rights"
msgstr "droit d'utilisation"
-#: models/enum.py:99 models/media.py:133
+#: models/enum.py:99 models/media.py:150
msgid "recording context"
msgstr "contexte d'enregistrement"
msgid "A/D conversion"
msgstr ""
-#: models/enum.py:113 models/media.py:289
+#: models/enum.py:113 models/media.py:335
msgid "vernacular style"
msgstr "style vernaculaire"
-#: models/enum.py:120 models/media.py:291
+#: models/enum.py:120 models/media.py:337
msgid "generic style"
msgstr "style générique"
-#: models/enum.py:127 models/media.py:419
+#: models/enum.py:127 models/media.py:456
#, fuzzy
msgid "keyword"
msgstr "Mot-clé"
-#: models/enum.py:134 models/media.py:146
+#: models/enum.py:134 models/media.py:161
msgid "publisher / status"
msgstr "éditeur / statut"
msgid "publisher"
msgstr "éditeur"
-#: models/enum.py:153 models/enum.py:157 models/media.py:282
+#: models/enum.py:153 models/enum.py:157 models/media.py:328
msgid "population / social group"
msgstr "population / groupe social"
#: models/enum.py:158 models/instrument.py:43 models/instrument.py:53
-#: models/location.py:51 models/location.py:158 models/media.py:458
+#: models/location.py:51 models/location.py:158 models/media.py:484
msgid "name"
msgstr "nom"
msgstr "officiel"
#: models/location.py:112 models/location.py:169 models/location.py:184
-#: models/media.py:278
+#: models/media.py:324
msgid "location"
msgstr "lieu"
msgid "ancestor location"
msgstr "lieu ancêtre"
-#: models/media.py:60
+#: models/media.py:70
msgid "Metadata only"
msgstr "Métadonnées uniquement"
-#: models/media.py:62
+#: models/media.py:72
msgid "Sound and metadata"
msgstr "Son et métadonnées"
-#: models/media.py:64
+#: models/media.py:74
msgid "Private data"
msgstr "Données privées"
-#: models/media.py:65 models/media.py:89 models/media.py:153
-#: models/media.py:306
+#: models/media.py:75 models/media.py:98 models/media.py:168
+#: models/media.py:352
msgid "public access"
msgstr "accès public"
-#: models/media.py:85 models/media.py:128 models/media.py:303
+#: models/media.py:94 models/media.py:145 models/media.py:349
msgid "reference"
msgstr "référence"
-#: models/media.py:86 models/media.py:129 models/media.py:269
-#: models/media.py:378 models/media.py:477 models/media.py:492
-#: models/media.py:526
+#: models/media.py:95 models/media.py:146 models/media.py:274
+#: models/media.py:315 models/media.py:418 models/media.py:503
+#: models/media.py:518 models/media.py:549
msgid "title"
msgstr "titre"
-#: models/media.py:87 models/media.py:380 models/media.py:493
-#: models/media.py:528
+#: models/media.py:96 models/media.py:276 models/media.py:420
+#: models/media.py:519 models/media.py:551
msgid "description"
msgstr ""
-#: models/media.py:88 models/media.py:178 models/media.py:300
+#: models/media.py:97 models/media.py:193 models/media.py:346
msgid "code"
msgstr "cote"
-#: models/media.py:130 models/media.py:270
+#: models/media.py:120 models/media.py:273 models/media.py:319
+msgid "collection"
+msgstr "collection"
+
+#: models/media.py:122
+msgid "corpus"
+msgstr ""
+
+#: models/media.py:147 models/media.py:316
msgid "original title / translation"
msgstr "titre original / traduction"
-#: models/media.py:131
+#: models/media.py:148
msgid "depositor / contributor"
msgstr "déposant / contributeur"
-#: models/media.py:134
+#: models/media.py:151
msgid "recording year (from)"
msgstr "année d'enregistrement (depuis)"
-#: models/media.py:135
+#: models/media.py:152
msgid "recording year (until)"
msgstr "année d'enregistrement (jusqu'à)"
-#: models/media.py:136
+#: models/media.py:153
msgid "year published"
msgstr "année de parution"
-#: models/media.py:144 models/media.py:271
+#: models/media.py:159 models/media.py:317
msgid "recordist"
msgstr "collecteur"
-#: models/media.py:148
+#: models/media.py:163
msgid "publisher collection"
msgstr "collection éditeur"
-#: models/media.py:149
+#: models/media.py:164
msgid "publisher serial number"
msgstr "numéro dans la série"
-#: models/media.py:150
+#: models/media.py:165
msgid "author of published notice"
msgstr "auteur de la notice éditée"
-#: models/media.py:151
+#: models/media.py:166
msgid "bibliographic references"
msgstr "références bibliographiques"
-#: models/media.py:152
+#: models/media.py:167
msgid "document type"
msgstr "type de document"
-#: models/media.py:161
+#: models/media.py:176
msgid "CNRS depositor"
msgstr "déposant CNRS"
-#: models/media.py:164
+#: models/media.py:179
msgid "related documentation"
msgstr "documentation associée"
-#: models/media.py:167
+#: models/media.py:182
msgid "copies"
msgstr "autres exemplaires"
-#: models/media.py:168
+#: models/media.py:183
msgid "comment"
msgstr "commentaire"
-#: models/media.py:171
+#: models/media.py:186
msgid "archiver notes"
msgstr "notes de l'archiviste"
-#: models/media.py:172
+#: models/media.py:187
msgid "items finished"
msgstr "fiches items faîtes"
-#: models/media.py:173
+#: models/media.py:188
msgid "recordist identical to depositor"
msgstr "collecteur identique au déposant"
-#: models/media.py:174
+#: models/media.py:189
msgid "published"
msgstr "édité"
-#: models/media.py:175
+#: models/media.py:190
msgid "conservation site"
msgstr "lieu de conservation"
-#: models/media.py:179 models/media.py:301
+#: models/media.py:194 models/media.py:347
msgid "old code"
msgstr "ancienne cote"
-#: models/media.py:180 models/media.py:310
+#: models/media.py:195 models/media.py:356
msgid "approximative duration"
msgstr "durée approximative"
-#: models/media.py:181
+#: models/media.py:196
msgid "number of components (medium / piece)"
msgstr "nb de composants (support / pièce)"
-#: models/media.py:185
+#: models/media.py:200
msgid "digitization"
msgstr "numérisation"
-#: models/media.py:186
+#: models/media.py:201
msgid "status"
msgstr "etat"
-#: models/media.py:187
+#: models/media.py:202
msgid "a_informer_07_03"
msgstr "a_informer_07_03"
-#: models/media.py:221
+#: models/media.py:236
msgid "states / nations"
msgstr "états / nations"
-#: models/media.py:235
+#: models/media.py:250
msgid "populations / social groups"
msgstr "populations / groupes sociaux"
-#: models/media.py:243 models/media.py:354
+#: models/media.py:258 models/media.py:400
msgid "computed duration"
msgstr "durée calculée"
-#: models/media.py:273
-msgid "collection"
-msgstr "collection"
+#: models/media.py:275 models/media.py:419 models/media.py:550
+#: models/media.py:569 models/media.py:583
+msgid "date"
+msgstr ""
+
+#: models/media.py:277 models/media.py:421 models/media.py:568
+#, fuzzy
+msgid "mime_type"
+msgstr "type"
+
+#: models/media.py:278 models/media.py:422
+msgid "url"
+msgstr ""
+
+#: models/media.py:279 models/media.py:423
+msgid "credits"
+msgstr "crédits"
-#: models/media.py:274
+#: models/media.py:280 models/media.py:353 models/media.py:424
+msgid "file"
+msgstr "fichier"
+
+#: models/media.py:320
msgid "recording date (from)"
msgstr "date d'enregistrement (depuis)"
-#: models/media.py:275
+#: models/media.py:321
msgid "recording date (until)"
msgstr "date d'enregistrement (jusqu'à)"
-#: models/media.py:279
+#: models/media.py:325
msgid "location details"
msgstr "précisions lieu"
-#: models/media.py:280
+#: models/media.py:326
msgid "cultural area"
msgstr "aire culturelle"
-#: models/media.py:283
+#: models/media.py:329
msgid "language"
msgstr "langue"
-#: models/media.py:284
+#: models/media.py:330
msgid "comments / ethnographic context"
msgstr "commentaires / contexte ethnographique"
-#: models/media.py:285
+#: models/media.py:331
msgid "moda_execut"
msgstr "moda_execut"
-#: models/media.py:292
+#: models/media.py:338
msgid "author / compositor"
msgstr "auteur / compositeur"
-#: models/media.py:295
+#: models/media.py:341
msgid "remarks"
msgstr "remarques"
-#: models/media.py:296
+#: models/media.py:342
msgid "recordist selection"
msgstr "sélection collecteur"
-#: models/media.py:297
+#: models/media.py:343
msgid "recordist as in collection"
msgstr "collecteur identique à la collection"
-#: models/media.py:302
+#: models/media.py:348
msgid "item number"
msgstr "n° de l'item"
-#: models/media.py:304
+#: models/media.py:350
msgid "published references"
msgstr "références éditées"
-#: models/media.py:305
+#: models/media.py:351
msgid "copy of"
msgstr "copie de"
-#: models/media.py:307 models/media.py:384
-msgid "file"
-msgstr "fichier"
-
-#: models/media.py:317 models/media.py:559
+#: models/media.py:363 models/media.py:582
#: templates/telemeta_default/mediaitem_detail.html:192
#: templates/telemeta_default/mediaitem_detail_video.html:192
msgid "keywords"
msgstr "mots-clés"
-#: models/media.py:377 models/media.py:418 models/media.py:432
-#: models/media.py:456 models/media.py:476 models/media.py:523
-#: models/media.py:544
+#: models/media.py:417 models/media.py:455 models/media.py:466
+#: models/media.py:482 models/media.py:502 models/media.py:546
+#: models/media.py:567
msgid "item"
msgstr "item"
-#: models/media.py:379 models/media.py:527 models/media.py:546
-#: models/media.py:560
-msgid "date"
-msgstr ""
-
-#: models/media.py:381 models/media.py:545
-#, fuzzy
-msgid "mime_type"
-msgstr "type"
-
-#: models/media.py:382
-msgid "url"
-msgstr ""
-
-#: models/media.py:383
-msgid "credits"
-msgstr "crédits"
-
-#: models/media.py:434
+#: models/media.py:468
msgid "composition"
msgstr "Voix / Instruments"
-#: models/media.py:436
+#: models/media.py:470
msgid "vernacular name"
msgstr "nom vernaculaire"
-#: models/media.py:437
+#: models/media.py:471
msgid "number"
msgstr "nombre"
-#: models/media.py:438
+#: models/media.py:472
msgid "interprets"
msgstr "interprètes"
-#: models/media.py:457
+#: models/media.py:483
msgid "id"
msgstr ""
-#: models/media.py:460
+#: models/media.py:486
msgid "unit"
msgstr "unité"
-#: models/media.py:478
+#: models/media.py:504
msgid "start"
msgstr "début"
-#: models/media.py:479
+#: models/media.py:505
msgid "end"
msgstr "fin"
-#: models/media.py:490 models/media.py:509 models/media.py:524
+#: models/media.py:516 models/media.py:532 models/media.py:547
#, fuzzy
msgid "public_id"
msgstr "édité"
-#: models/media.py:510
+#: models/media.py:533
msgid "playlist"
msgstr "liste de lecture"
-#: models/media.py:511
+#: models/media.py:534
#, fuzzy
msgid "resource_type"
msgstr "type de ressource"
-#: models/media.py:512
+#: models/media.py:535
#, fuzzy
msgid "resource_id"
msgstr "ressource"
-#: models/media.py:525 models/system.py:54
+#: models/media.py:548 models/system.py:54
msgid "time"
msgstr "heure"
-#: models/media.py:529
+#: models/media.py:552
msgid "author"
msgstr "auteur"
-#: models/media.py:547
+#: models/media.py:570
msgid "transcoded"
msgstr ""
msgstr "Enregistrer"
#: templates/telemeta_default/collection_detail.html:5
-#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:351
+#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:352
msgid "Collection"
msgstr "Collection"
#: templates/telemeta_default/mediaitem_add.html:5
#: templates/telemeta_default/mediaitem_copy.html:5
#: templates/telemeta_default/mediaitem_detail.html:5
-#: templates/telemeta_default/mediaitem_detail_video.html:5 web/base.py:489
+#: templates/telemeta_default/mediaitem_detail_video.html:5 web/base.py:490
msgid "Item"
msgstr "Item"
msgid "User Profile"
msgstr "Profil utilisateur"
-#: templates/telemeta_default/profile_detail.html:8 web/base.py:1254
+#: templates/telemeta_default/profile_detail.html:8 web/base.py:1255
msgid "User profile"
msgstr "Profil utilisateur"
msgid "No item"
msgstr "Aucun item"
-#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1284
+#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1285
msgid "Last changes"
msgstr "Dernières modifications"
msgstr[0] "%(count)d collection"
msgstr[1] "%(count)d collections"
-#: web/base.py:350 web/base.py:488 web/base.py:779 web/base.py:1253
+#: web/base.py:351 web/base.py:489 web/base.py:780 web/base.py:1254
msgid "Access not allowed"
msgstr "Accès non autorisé"
-#: web/base.py:352 web/base.py:490 web/base.py:781 web/base.py:1255
+#: web/base.py:353 web/base.py:491 web/base.py:782 web/base.py:1256
msgid ""
"Please login or contact the website administator to get a private access."
msgstr ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-28 17:40+0100\n"
+"POT-Creation-Date: 2011-11-29 16:45+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
# Author: Olivier Guilyardi <olivier@samalyse.com>
# Guillaume Pellerin <yomguy@parisson.com>
-from telemeta.models.media import *
-from telemeta.models.location import *
-from telemeta.models.instrument import *
-from telemeta.models.enum import *
-from telemeta.models.system import *
-from telemeta.models.query import *
-from telemeta.models.dublincore import *
+from media import *
+from location import *
+from instrument import *
+from enum import *
+from system import *
+from query import *
+from dublincore import *
- # -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
# Copyright (C) 2007-2010 Samalyse SARL
# Copyright (C) 2010-2011 Parisson SARL
from telemeta.models.query import *
from telemeta.models.instrument import *
from telemeta.models.enum import *
-from django.forms import ModelForm
from django.db.models.fields import URLField
class Meta(MetaCore):
db_table = 'media_corpus'
ordering = ['code']
-
-class MediaCorpusForm(ModelForm):
- class Meta:
- model = MediaCorpus
class MediaCorpusCollectionRelation(ModelCore):
class Meta(MetaCore):
db_table = 'media_collections'
ordering = ['code']
+
+
+class MediaCollectionRelated(MediaResource):
+ "Collection related media"
-class MediaCollectionForm(ModelForm):
- class Meta:
- model = MediaCollection
- def clean_doctype_code(self):
- return self.cleaned_data['doctype_code'] or 0
+ element_type = 'media'
+
+ collection = ForeignKey('MediaCollection', related_name="related", verbose_name=_('collection'))
+ title = CharField(_('title'))
+ date = DateTimeField(_('date'), auto_now=True)
+ description = TextField(_('description'))
+ mime_type = CharField(_('mime_type'))
+ url = CharField(_('url'), max_length=500)
+ credits = CharField(_('credits'))
+ file = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename")
+
+ def is_image(self):
+ is_url_image = False
+ if self.url:
+ url_types = ['.png', '.jpg', '.gif', '.jpeg']
+ for type in url_types:
+ if type in self.url:
+ is_url_image = True
+ return 'image' in self.mime_type or is_url_image
+ def save(self, force_insert=False, force_update=False):
+ super(MediaCollectionRelated, self).save(force_insert, force_update)
+
+ def set_mime_type(self):
+ if self.file:
+ self.mime_type = mimetypes.guess_type(self.file.path)[0]
+
+ def __unicode__(self):
+ if self.title and not re.match('^ *N *$', self.title):
+ title = self.title
+ else:
+ title = unicode(self.item)
+ return title
+
+ class Meta(MetaCore):
+ db_table = 'media_collection_related'
+
class MediaItem(MediaResource):
"Describe an item"
title += ' ' + self.track
return title
-class MediaItemForm(ModelForm):
- class Meta:
- model = MediaItem
- def clean_code(self):
- return self.cleaned_data['code'] or None
-
class MediaItemRelated(MediaResource):
"Item related media"
class Meta(MetaCore):
db_table = 'media_item_related'
-class MediaItemRelatedForm(ModelForm):
- class Meta:
- model = MediaItemRelated
-
+
class MediaItemKeyword(ModelCore):
"Item keyword"
item = ForeignKey('MediaItem', verbose_name=_('item'), related_name="keyword_relations")
db_table = 'media_item_keywords'
unique_together = (('item', 'keyword'),)
-class MediaItemKeywordForm(ModelForm):
- class Meta:
- model = MediaItemKeyword
class MediaItemPerformance(ModelCore):
"Item performance"
class Meta(MetaCore):
db_table = 'media_item_performances'
-class MediaItemPerformanceForm(ModelForm):
- class Meta:
- model = MediaItemPerformance
-
- def __init__(self, *args, **kwds):
- super(MediaItemPerformanceForm, self).__init__(*args, **kwds)
- self.fields['instrument'].queryset = Instrument.objects.order_by('name')
- self.fields['alias'].queryset = InstrumentAlias.objects.order_by('name')
class MediaItemAnalysis(ModelCore):
"Item analysis result computed by TimeSide"
def __unicode__(self):
return self.title
-class PlaylistForm(ModelForm):
- class Meta:
- model = Playlist
class PlaylistResource(ModelCore):
"Playlist components"
{% endwith %}
</div>
+ <div class="extraInfos">
+ {% block related %}
+ {% include "telemeta/inc/collection_related.html" %}
+ {% endblock related %}
+ </div>
+
{% endblock infos %}
</div>
{% endblock %}
</div> <!-- with-rightcol -->
<div class="extraInfos">
- {% block related %}
- <div>
- <h4><a href="#">{% trans "Related media" %}</a></h4>
- {% if related_media %}
- <div>
- <table class="instruments" width="100%">
- <thead>
- <tr>
- <td>{% trans "Media" %}</td>
- <td>{% trans "Preview" %}</td>
- </tr>
- </thead>
- <tbody>
- {% for media in related_media %}
- <tr>
- <td style="font-size: 1em;">
- <dl class="listing">
- <dt>{% trans "Title" %}</dt>
- <dd>
- {% if media.url %}
- <a href="{{ media.url }}" target="_blank">
- {% if media.title %}
- {{ media.title }}</a>
- {% else %}
- {{ media.url|get_filename }}</a>
- {% endif %}
- {% else %}
- <a href="{% url telemeta-item-related item.public_id media.id %}" target="_blank">
- {% if media.title %}
- {{ media.title }}</a>
- {% else %}
- {{ media.file|get_filename }}</a>
- {% endif %}
- {% endif %}
- </dd>
- <dt>{% trans "Description" %}</dt>
- <dd>{{ media.description|html_line_break|safe }}</dd>
- <dt>{% trans "Credits" %}</dt>
- <dd>{{ media.credits }}</dd>
- {% dl_field media "mime_type" %}
- <dt>{% trans "URL" %}</dt>
- <dd>
- {% if media.url %}
- <a href="{{ media.url }}" target="_blank">{{ media.url }}</a>
- {% else %}
- <a href="{% url telemeta-item-related item.public_id media.id %}" target="_blank">
- {% url telemeta-item-related item.public_id media.id %}
- </a>
- {% endif %}
- </dd>
- </dl>
- </td>
-
- <td style="padding-bottom: 1em;">{% if media.is_image %}
- {% if media.url %}
- <a href="{{ media.url }}">
- <img src="{{ media.url }}" style="max-width: 420px; max-height: 200px;" /></a>
- {% else %}
- <a href="{% url telemeta-item-related item.public_id media.id %}">
- <img src="{% url telemeta-item-related item.public_id media.id %}" style="max-width: 420px; max-height: 200px;" /></a>
- {% endif %}
- {% else %}
- {% if media.url %}
- {% if "youtube" in media.url %}
- <iframe width="251" height="200" src="{{ media.url|get_youtube }}" frameborder="0" allowfullscreen></iframe>
- {% endif %}
- {% endif %}
- {% endif %}
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- {% endif %}
- {% if user.is_authenticated and perms.telemeta.change_mediaitem %}
- <br /><a href="{% url telemeta-item-related_edit item.public_id %}" class="component_icon button icon_edit">{% trans "Edit"%} {% trans "related media"%}</a>
- {% endif %}
- </div>
- {% endblock related %}
- </div>
+ {% block related %}
+ {% include "telemeta/inc/mediaitem_related.html" %}
+ {% endblock related %}
+</div>
{% endblock %}
<tr><td><b>{% trans "Keyword" %} :</b><td></td></tr>
{% for field in form %}
<tr>
- {% if not "media_item" in field.html_name %}
- {% if "id" in field.html_name %}
- <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
- {% else %}
- <td>{{ field.label_tag }}: </td><td>{{ field }}</td>
- {% endif %}
- {% else %}
+ {% if "item" in field.html_name or "id" in field.html_name %}
<td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+ {% else %}
+ <td>{{ field.label_tag }}: </td><td>{{ field }}</td>
{% endif %}
</tr>
{% endfor %}
@register.filter
def get_youtube(link):
link = link.split('&')
- ref = link[0].split('=')[1]
+ if "=" in link:
+ ref = link[0].split('=')[1]
+ else:
+ ref = link[0].split('/')[-1]
return 'http://www.youtube.com/embed/'+ref
url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/keywords/$', item_view.item_keywords_edit,
dict(template='telemeta/mediaitem_keywords_edit.html'), name="telemeta-item-keywords_edit"),
url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/delete/$', item_view.item_delete, name="telemeta-item-delete"),
- url(r'^items/(?P<item_public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)$', item_view.related_media_stream, name="telemeta-item-related"),
+ url(r'^items/(?P<item_public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)$', item_view.related_media_item_stream, name="telemeta-item-related"),
url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/related_edit/$', item_view.related_media_edit, dict(template='telemeta/mediaitem_related_edit.html'), name="telemeta-item-related_edit"),
# Markers
url(r'^markers/(?P<marker_id>[A-Za-z0-9]+)/$', item_view.item_detail, name="telemeta-item-detail-marker"),
url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/add_item/$', item_view.item_add,
dict(template='telemeta/mediaitem_add.html'), name="telemeta-collection-additem"),
url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/delete/$', collection_view.collection_delete, name="telemeta-collection-delete"),
+ url(r'^collections/(?P<collection_public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)$', collection_view.related_media_collection_stream, name="telemeta-collection-related"),
+ url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/related_edit/$', collection_view.related_media_edit, dict(template='telemeta/collection_related_edit.html'), name="telemeta-collection-related_edit"),
# search
url(r'^search/$', general_view.search, name="telemeta-search"),
from telemeta.util.unicode import UnicodeWriter
from telemeta.cache import TelemetaCache
import telemeta.web.pages as pages
+from telemeta.forms import *
def render(request, template, data = None, mimetype = None):
collection.recorded_to_year)
playlists = get_playlists(request)
- return render(request, template, {'collection': collection, 'playlists': playlists, 'public_access': public_access, 'items': items})
+ related_media = MediaCollectionRelated.objects.filter(collection=collection)
+ for media in related_media:
+ if not media.mime_type:
+ media.set_mime_type()
+ media.save()
+ if not media.title and media.url:
+ try:
+ from lxml import etree
+ parser = etree.HTMLParser()
+ tree = etree.parse(media.url, parser)
+ title = tree.find(".//title").text
+ title = title.replace('\n', '').strip()
+ media.title = title
+ except:
+ media.title = media.url
+ media.save()
+
+ return render(request, template, {'collection': collection, 'playlists': playlists, 'public_access': public_access, 'items': items, 'related_media': related_media})
@method_decorator(permission_required('telemeta.change_mediacollection'))
def collection_edit(self, request, public_id, template='telemeta/collection_edit.html'):
collection.delete()
return HttpResponseRedirect('/collections/')
+ def related_media_collection_stream(self, request, collection_public_id, media_id):
+ collection = MediaCollection.objects.get(public_id=collection_public_id)
+ media = MediaCollectionRelated.objects.get(collection=collection, id=media_id)
+ response = HttpResponse(stream_from_file(media.file.path), mimetype=media.mime_type)
+# response['Content-Disposition'] = 'attachment'
+ return response
+
+ @method_decorator(permission_required('telemeta.change_mediacollection'))
+ def related_media_edit(self, request, public_id, template):
+ collection = MediaCollection.objects.get(public_id=public_id)
+ MediaCollectionRelatedFormSet = inlineformset_factory(MediaCollection, MediaCollectionRelated, form=MediaCollectionRelatedForm)
+ if request.method == 'POST':
+ formset = MediaCollectionRelatedFormSet(data=request.POST, files=request.FILES, instance=collection)
+ if formset.is_valid():
+ formset.save()
+ collection.set_revision(request.user)
+ return HttpResponseRedirect('/collections/'+public_id)
+ else:
+ formset = MediaCollectionRelatedFormSet(instance=collection)
+
+ return render(request, template, {'collection': collection, 'formset': formset,})
class ItemView(object):
"""Provide Collections web UI methods"""
str(item.recorded_to_date).split('-')[0])
related_media = MediaItemRelated.objects.filter(item=item)
- for file in related_media:
- if not file.mime_type:
- file.set_mime_type()
- file.save()
- if not file.title and file.url:
+ for media in related_media:
+ if not media.mime_type:
+ media.set_mime_type()
+ media.save()
+ if not media.title and media.url:
try:
from lxml import etree
parser = etree.HTMLParser()
- tree = etree.parse(file.url, parser)
+ tree = etree.parse(media.url, parser)
title = tree.find(".//title").text
title = title.replace('\n', '').strip()
- file.title = title
+ media.title = title
except:
- file.title = file.url
- file.save()
+ media.title = media.url
+ media.save()
return render(request, template,
{'item': item, 'export_formats': formats,
'previous' : previous, 'next' : next,
})
- def related_media_stream(self, request, item_public_id, media_id):
+ def related_media_item_stream(self, request, item_public_id, media_id):
item = MediaItem.objects.get(public_id=item_public_id)
media = MediaItemRelated.objects.get(item=item, id=media_id)
response = HttpResponse(stream_from_file(media.file.path), mimetype=media.mime_type)