]> git.parisson.com Git - teleforma.git/commitdiff
clone all docs and media
authorGuillaume Pellerin <yomguy@parisson.com>
Thu, 19 Dec 2013 16:32:09 +0000 (17:32 +0100)
committerGuillaume Pellerin <yomguy@parisson.com>
Thu, 19 Dec 2013 16:32:09 +0000 (17:32 +0100)
teleforma/management/commands/teleforma-copy-seminars.py
teleforma/models/core.py
teleforma/models/pro.py

index 03d0f83b812fac4920e697eecc386aa40dbe18b2..cef1b19b53abf469b4725f6b51d7000f48da4c6b 100644 (file)
@@ -27,17 +27,28 @@ class Command(BaseCommand):
         for seminar in Seminar.objects.all():
             if seminar.expiry_date:
                 if seminar.expiry_date.year == from_year:
-                    questions = seminar.question.all()
-                    seminar.pk = None
-                    seminar.save()
-                    seminar.publish_date = seminar.publish_date.replace(year=to_year)
-                    seminar.expiry_date = seminar.expiry_date.replace(year=to_year)
-                    seminar.save()
-                    print ("updated:", seminar)
+                    print ("cloning:", seminar)
+                    clone = seminar.clone()
+                    clone.publish_date = clone.publish_date.replace(year=to_year)
+                    clone.expiry_date = clone.expiry_date.replace(year=to_year)
+                    clone.save()
+                    print ('dates updated', clone)
+
+                    for field in seminar._meta.many_to_many:
+                        if type(field) == Document or type(field) == Media:
+                            source = getattr(seminar, field.attname)
+                            destination = getattr(clone, field.attname)
+                            for item in source.all():
+                                item_clone = item.clone()
+                                item_clone.readers = []
+                                item_clone.save()
+                                destination.remove(item)
+                                destination.add(item_clone)
+                    print ("documents and medias cloned and assigned:", clone)
 
+                    questions = seminar.question.all()
                     for question in questions:
-                        question.pk = None
-                        question.save()
-                        question.seminar = seminar
+                        question_clone = question.clone()
+                        question_clone.seminar = clone
                         question.save()
                         print ("updated:", question)
index 9f9cdee1c5ef63fecb9c3810d26cc4ee5767f7c4..3878dbecd320b03db8ef41b61b5d4103655ea663 100755 (executable)
@@ -42,6 +42,7 @@ import urllib
 import string
 import datetime
 import mimetypes
+import copy
 
 from django.conf import settings
 from django.db.models import *
@@ -92,6 +93,25 @@ class MetaCore:
     app_label = app_label
 
 
+class ClonableMixin(object):
+    
+    def clone(self):
+        """Return an identical copy of the instance with a new ID."""
+        if not self.pk:
+            raise ValueError('Instance must be saved before it can be cloned.')
+        duplicate = copy.copy(self)
+        # Setting pk to None tricks Django into thinking this is a new object.
+        duplicate.pk = None
+        duplicate.save()
+        # ... but the trick loses all ManyToMany relations.
+        for field in self._meta.many_to_many:
+            source = getattr(self, field.attname)
+            destination = getattr(duplicate, field.attname)
+            for item in source.all():
+                destination.add(item)
+        return duplicate
+
+
 class Organization(Model):
 
     name            = CharField(_('name'), max_length=255)
@@ -304,7 +324,7 @@ class LiveStream(Model):
         verbose_name = _('live stream')
 
 
-class MediaBase(Model):
+class MediaBase(ClonableMixin, Model):
     "Base media resource"
 
     title           = CharField(_('title'), max_length=1024, blank=True)
index bd2de5b0d832e0f69ddeed5ec65362d17e406f88..62a70a7755c9b8e3ce0f8907d7c126efcda55cca 100755 (executable)
@@ -43,6 +43,7 @@ from teleforma.models.core import *
 from forms_builder.forms.models import Form
 from mezzanine.core.managers import DisplayableManager
 
+
 class SeminarType(models.Model):
 
     name            = models.CharField(_('name'), max_length=255, blank=True)
@@ -55,7 +56,7 @@ class SeminarType(models.Model):
         verbose_name = _('Seminar type')
 
 
-class Seminar(Displayable):
+class Seminar(ClonableMixin, Displayable):
 
     # title, description, keywords and dates are given by Displayable
 
@@ -131,7 +132,7 @@ class Seminar(Displayable):
         ordering = ['rank']
 
 
-class Question(models.Model):
+class Question(ClonableMixin, models.Model):
 
     element_type = 'question'