def save_subtitle(video, language, parser, user=None, update_video=True, forks=True, as_forked=True, translated_from=None): from videos.models import SubtitleVersion, Subtitle, SubtitleMetadata from videos.tasks import video_changed_tasks key = str(uuid4()).replace('-', '') if language.is_original: as_forked = True video._make_writelock(user, key) video.save() try: old_version = language.subtitleversion_set.all()[:1].get() version_no = old_version.version_no + 1 except ObjectDoesNotExist: old_version = None version_no = 0 version = None if not is_version_same(old_version, parser): forked_from = as_forked and translated_from and translated_from.version( ) title = old_version.title if old_version and old_version.title else video.get_title_display( ) description = old_version.description if old_version and old_version.description else video.get_description_display( ) version = SubtitleVersion(language=language, version_no=version_no, datetime_started=datetime.now(), user=user, note=u'Uploaded', is_forked=as_forked, time_change=1, text_change=1, forked_from=forked_from, title=title, description=description) if len(parser) > 0: version.has_version = True version.save() ids = [] for i, item in enumerate(parser): id = int(random.random() * 10e12) while id in ids: id = int(random.random() * 10e12) ids.append(id) metadata = item.pop('metadata', None) caption = Subtitle(**item) caption.version = version caption.datetime_started = datetime.now() caption.subtitle_id = str(id) caption.subtitle_order = i + 1 caption.save() if metadata: for name, value in metadata.items(): SubtitleMetadata(subtitle=caption, key=name, data=value).save() version = version or old_version if version.is_forked != as_forked: version.is_forked = as_forked version.save() if version.user != user: # we might be only uptading the user , as in per bulk imports version.user = user version.save() language.video.release_writelock() language.video.save() if forks: translations = video.subtitlelanguage_set.filter( standard_language=language) [t.fork(from_version=old_version, user=user) for t in translations] if update_video: video_changed_tasks.delay(video.id, None if version is None else version.id) return language