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)
import string
import datetime
import mimetypes
+import copy
from django.conf import settings
from django.db.models import *
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)
verbose_name = _('live stream')
-class MediaBase(Model):
+class MediaBase(ClonableMixin, Model):
"Base media resource"
title = CharField(_('title'), max_length=1024, blank=True)
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)
verbose_name = _('Seminar type')
-class Seminar(Displayable):
+class Seminar(ClonableMixin, Displayable):
# title, description, keywords and dates are given by Displayable
ordering = ['rank']
-class Question(models.Model):
+class Question(ClonableMixin, models.Model):
element_type = 'question'